隊(duì)同步指南:將本地 AI 用量遙測(cè)安全推送到共享 OTLP 后端)
【免費(fèi)下載鏈接】codeburnFree, local tool to track AI coding token usage and cost across 37 tools and agents (Claude Code, Cursor, Codex, Gemini and more), by model, project, and task. npx codeburn項(xiàng)目地址https://gitcode.com/gh_mirrors/co/codeburn點(diǎn)擊查看免費(fèi)下載codeburn sync 是 codeburn 的可選團(tuán)隊(duì)功能把本地解析出的 AI 編碼用量與費(fèi)用遙測(cè)token 數(shù)、成本、模型、工具調(diào)用等推送到團(tuán)隊(duì)自建的共享后端讓團(tuán)隊(duì)能夠跟蹤 adoption、預(yù)算與 ROI。它堅(jiān)持 local-first 原則——不會(huì)主動(dòng)發(fā)送任何數(shù)據(jù)且提示詞prompt與代碼內(nèi)容永遠(yuǎn)不會(huì)出現(xiàn)在載荷中。讀完本文你將掌握codeburn sync的完整命令用法、OTLP 載荷字段語(yǔ)義、OIDC 認(rèn)證流程、去重與重試機(jī)制以及如何用--attribution在零 git hook 的前提下把 AI 用量關(guān)聯(lián)到 git 提交??焖匍_始sync 只需要三個(gè)命令即可完成從配置到推送的完整閉環(huán)# 一次性配置會(huì)打開瀏覽器完成登錄 codeburn sync setup https://metrics.your-team.com # 推送最近未發(fā)送的用量 codeburn sync push # 查看同步狀態(tài) codeburn sync status第一次配置只需做一次此后每次push都會(huì)靜默地用 refresh token 換取新的訪問令牌。停止同步也很簡(jiǎn)單——執(zhí)行codeburn sync logout即清除憑證并吊銷令牌或者干脆不再運(yùn)行push。命令詳解codeburn sync setup url用遠(yuǎn)程端點(diǎn)配置同步并打開瀏覽器完成一次性的 OIDC 登錄。其完整流程見 src/sync/cli.ts 的 setup 實(shí)現(xiàn)從url/.well-known/codeburn-export.json獲取服務(wù)器配置發(fā)現(xiàn)文檔打開瀏覽器跳轉(zhuǎn)到身份提供方IdP的登錄頁(yè)登錄成功后將 refresh token 安全存入操作系統(tǒng)鑰匙串把不含任何秘密的端點(diǎn)配置寫入~/.config/codeburn/sync.json。codeburn sync setup https://metrics.your-team.com客戶端在拿回 code 后調(diào)用 token 端點(diǎn)換取access_token與refresh_token若 IdP 未返回 refresh tokenCLI 會(huì)給出可能需要頻繁重新認(rèn)證的警告隨后才落盤配置。整個(gè)交互過程的錯(cuò)誤登錄超時(shí)、端口被占用、發(fā)現(xiàn)文檔失敗會(huì)被收斂為一行清晰報(bào)錯(cuò)而不是 Node 崩潰堆棧。codeburn sync push把窗口內(nèi)未發(fā)送的 AI 用量數(shù)據(jù)推送到已配置端點(diǎn)# 推送最近 7 天默認(rèn)窗口的未發(fā)送調(diào)用 codeburn sync push # 擴(kuò)大窗口推送最近 30 天 codeburn sync push --since 30d # 預(yù)演只展示將要發(fā)送什么實(shí)際不發(fā)送 codeburn sync push --dry-run # 額外推送 git 歸屬opt-in見下文 Git attribution codeburn sync push --attribution--since的合法取值src/sync/cli.ts 中的映射表為today、7d/week、30d/30days、month、all最多 6 個(gè)月受解析器保留期限限制。未知值會(huì)直接報(bào)錯(cuò)退出。--dry-run是強(qiáng)大的審計(jì)工具它會(huì)在不發(fā)送任何數(shù)據(jù)的前提下報(bào)告窗口內(nèi)調(diào)用總數(shù)、已同步數(shù)量、被 hold 的調(diào)用數(shù)會(huì)話仍在 reconcile見 FAQ、被 frozen 的 Copilot 調(diào)用數(shù)、本次將推送的調(diào)用數(shù)與預(yù)估成本以及各字段的攜帶情況lineage 字段、緩存 token、ai.subscription_covered與codeburn.coverage_through。啟用插件時(shí)還會(huì)列出已加載/被拒絕的插件及其聲明的同步屬性確保插件不能靜默拓寬線上數(shù)據(jù)。推送成功后 CLI 會(huì)更新lastSync時(shí)間戳并輸出匯總Synced N calls ($X.XX) to url。若推送未完成如被限流或服務(wù)端錯(cuò)誤進(jìn)程以非零退出碼結(jié)束方便 cron/腳本檢測(cè)。codeburn sync status展示當(dāng)前同步配置與認(rèn)證狀態(tài)Endpoint: https://metrics.your-team.com Traces path: /v1/traces Issuer: https://auth.your-team.com Auth: configured Token storage: keychain Last sync: 2h ago實(shí)現(xiàn)見 src/sync/cli.ts未配置時(shí)提示先運(yùn)行setupToken storage一行會(huì)如實(shí)報(bào)告當(dāng)前使用的是 keychain、secret-tool、DPAPI 還是文件回退。codeburn sync logout刪除本地存儲(chǔ)的憑證并在身份提供方吊銷令牌吊銷端點(diǎn)不可用時(shí)為 best-effortcodeburn sync logoutcodeburn sync reset --confirm清空 sent-ledger使下一次 push 重新發(fā)送窗口內(nèi)全部數(shù)據(jù)。適用于后端遷移后或懷疑數(shù)據(jù)丟失的場(chǎng)景codeburn sync reset --confirm注意重置前必須先清空接收端副本否則會(huì)產(chǎn)生恰好是你想避免的雙重計(jì)數(shù)詳見下文 Copilot 凍結(jié)形狀與 FAQ。自動(dòng)同步codeburn sync auto除手動(dòng) push 外倉(cāng)庫(kù)還實(shí)現(xiàn)了可選的定時(shí)自動(dòng)同步src/sync/cli.ts 與 src/sync/schedule-installer.ts# 以 daily 頻率啟用自動(dòng)推送需 --accept 同意披露內(nèi)容 codeburn sync auto enable --cadence daily --accept # 附帶工作匹配session→commit 關(guān)聯(lián) codeburn sync auto enable --cadence hourly --attribution --accept # 關(guān)閉 codeburn sync auto disable # 查看狀態(tài)含最近 5 條運(yùn)行回執(zhí) codeburn sync auto status codeburn sync auto status --json # 機(jī)器可讀 # 由調(diào)度器調(diào)用的內(nèi)部入口 codeburn sync auto run自動(dòng)同步引入接受指紋acceptance fingerprint機(jī)制啟用時(shí)計(jì)算并保存一份覆蓋目標(biāo)端點(diǎn)、出站字段集合、工作匹配開關(guān)與節(jié)奏的指紋之后每次auto run都會(huì)重算當(dāng)前指紋并與之比對(duì)一旦字段集如新增插件屬性發(fā)生變化就停止推送并寫入acceptance-required回執(zhí)直到用戶重新確認(rèn)。每次運(yùn)行結(jié)果以 JSONL 追加到~/.config/codeburn/receipts.jsonl見 src/sync/config.ts。線上數(shù)據(jù)格式每次交互對(duì)應(yīng)一條 OTLP span每次 AI 交互被編碼為一條 OTLP span嚴(yán)格按 protobuf-JSON 映射ExportTraceServiceRequestlowerCamelCase 字段、hex 編碼 ID、整數(shù)枚舉實(shí)現(xiàn)見 src/sync/otlp.ts。span 屬性如下字段示例說(shuō)明ai.providerkiro,cursor,claude使用的 AI 工具ai.modelclaude-sonnet-4-6使用的模型ai.input_tokens12500提示詞 tokenai.output_tokens3200可計(jì)費(fèi)輸出 token適用時(shí)包含單獨(dú)計(jì)費(fèi)的 reasoningai.cost_usd0.085估算成本ai.projectmy-app項(xiàng)目 basename僅當(dāng)有 provider 記錄的精確工作目錄為背書時(shí)攜帶否則省略ai.tools[Edit, Bash]調(diào)用的工具ai.speedstandardprovider 記錄的速度檔位ai.cost_estimatedtrue成本是估算而非 provider 上報(bào)ai.cache_read_tokens800緩存讀取 token僅當(dāng) provider 記錄非零值時(shí)攜帶ai.cache_write_tokens200緩存寫入 token僅當(dāng) provider 記錄非零值時(shí)攜帶ai.call_count3該 span 所屬會(huì)話在同步窗口內(nèi)貢獻(xiàn)的用量 span 數(shù)ai.session_duration_ms61000provider 記錄事件的首末時(shí)間差任一端缺失或亂序時(shí)省略ai.subscription_coveredtrue成本是否被已配置套餐或代理路徑覆蓋無(wú)法判定時(shí)省略ai.work_unit_id9f2c…偽匿名工作單元 id根會(huì)話的 trace id把會(huì)話與其委派子會(huì)話歸組ai.session_roleroot,child會(huì)話與其工作單元的關(guān)系ai.lineage_evidenceprovider-recorded歸組所依據(jù)的證據(jù)類別每批導(dǎo)出還攜帶一個(gè)偽匿名device_id資源屬性SHA-256(hostnameusername)前 16 位 hex見 src/sync/otlp.ts用于區(qū)分不同機(jī)器而不暴露主機(jī)名。另有codeburn.coverage_through資源屬性本地歷史完整覆蓋到的 ISO 日期取自 daily-cache 的水位線僅當(dāng)一次完整本地解析最終確定了該水位線時(shí)才蓋章complete與watermarkTrusted同時(shí)成立見 src/sync/cli.ts接收端應(yīng)把缺失視為覆蓋未知而不是無(wú)歷史??蛇x字段的證明語(yǔ)義從ai.work_unit_id往下的每個(gè)字段都是可選的只在值被證明時(shí)才發(fā)送舊接收端忽略未知屬性不會(huì)丟失任何東西src/sync/otlp.ts 的注釋詳細(xì)說(shuō)明了判定規(guī)則ai.work_unit_id/ai.session_role/ai.lineage_evidence三者要么一起發(fā)、要么都不發(fā)且只針對(duì) provider 在磁盤上持久記錄了血緣lineage的會(huì)話對(duì)應(yīng) issue #1140。ai.work_unit_id是根會(huì)話 id 經(jīng) work-unit 解析器#1145推導(dǎo)出的deriveTraceId——與線上 trace id 使用同一套 SHA-256 推導(dǎo)保證一個(gè)工作單元的標(biāo)識(shí)與已上線根 trace 一致。血緣從不推斷沒有記錄血緣的會(huì)話不攜帶這三字段父會(huì)話超出窗口、鏈接歧義或成環(huán)的 child 會(huì)話也 fail-closed 不攜帶。ai.cache_read_tokens/ai.cache_write_tokens是 provider 記錄的緩存 token 數(shù)與ai.input_tokens的計(jì)費(fèi)口徑一致緩存讀取采用展示層跨 Anthropic 與 OpenAI 詞匯的max(cacheReadInputTokens, cachedInputTokens)約定。每個(gè)字段僅當(dāng)非零時(shí)發(fā)送。ai.call_count是該會(huì)話在同步窗口內(nèi)貢獻(xiàn)的用量 span 數(shù)ai.session_duration_ms為會(huì)話 provider 記錄事件時(shí)間末減首任一端缺失或亂序時(shí)省略。ai.subscription_covered由套餐/代理路徑機(jī)制判定配置的套餐覆蓋該調(diào)用的 provider、或會(huì)話的 provider 記錄 cwd 位于配置的代理路徑下時(shí)為 true兩者都被排除時(shí)為 false無(wú)法判定無(wú)套餐匹配且無(wú) cwd 可查時(shí)省略。ai.output_tokens是可計(jì)費(fèi)輸出總量。對(duì)于單獨(dú)計(jì)量 reasoning 的 providercodeburn 會(huì)把 reasoning 計(jì)入此字段response 計(jì)數(shù)已含 reasoning 的 provider 則保持不變。ai.project是可選字段usage span 只在 codeburn 能從一個(gè) provider 記錄的絕對(duì)工作目錄中推導(dǎo)出唯一安全 basename 時(shí)攜帶它attribution span 則只從規(guī)范化的git.repo推導(dǎo)純 PR 證據(jù)省略之。接收端必須把缺失項(xiàng)目歸為 unattributed且不得強(qiáng)制要求該字段。確定性 span/trace idspan_id 與 trace_id 是確定性推導(dǎo)src/sync/otlp.tsspan_id SHA-256(deduplicationKey) 的前 8 字節(jié) → hex16 字符 trace_id SHA-256(sessionId) 的前 16 字節(jié) → hex32 字符這意味著重發(fā)在字節(jié)級(jí)別完全相同服務(wù)端去重只是縱深防御同時(shí)也使按 span id 存儲(chǔ)的服務(wù)端天然具備冪等 upsert 能力。Git attributionopt-in--attributioncodeburn sync push --attribution會(huì)額外發(fā)送codeburn yield在本地計(jì)算的 會(huì)話→提交 關(guān)聯(lián)讓后端無(wú)需任何 git hook 就能把 AI 用量關(guān)聯(lián)到 git 活動(dòng)。啟用后會(huì)額外發(fā)射兩種 spancodeburn.session.attribution—— 每個(gè)有可連接證據(jù)的會(huì)話一條字段示例說(shuō)明ai.projectmy-app由規(guī)范化git.repo推導(dǎo)的倉(cāng)庫(kù) basename純 PR 證據(jù)時(shí)省略git.repogithub.com/acme/widget規(guī)范化的origin遠(yuǎn)端剝離憑證與端口git.pr_links[…/pull/12]會(huì)話捕獲的 PR URLgit.commit_count2歸因的提交數(shù)如果同一 trace 的 usage span 與 attribution span 攜帶了不同的安全項(xiàng)目 basenameattribution 中的倉(cāng)庫(kù) basename 對(duì)項(xiàng)目聚合具有權(quán)威性。usage span 上的 provider 記錄 cwd basename 只是臨時(shí)標(biāo)簽不得據(jù)此創(chuàng)建第二個(gè)項(xiàng)目桶。codeburn.commit—— 每個(gè)被歸因到會(huì)話的提交一條字段示例說(shuō)明git.sha4f2a…提交 SHAgit.in_maintrue提交是否進(jìn)入 main 分支git.was_revertedfalse是否有后續(xù)提交將其回滾歸因是推斷的時(shí)間戳窗口關(guān)聯(lián)與codeburn yield同一啟發(fā)式資源屬性codeburn.attribution_methodology: timestamp-window如實(shí)標(biāo)注了這一點(diǎn)。狀態(tài)遷移提交合入 main、或被回滾會(huì)在后續(xù) push 中自動(dòng)重發(fā)——接收端應(yīng)按(git.repo, git.sha)upsert 提交、按traceIdupsert 會(huì)話 span與 usage span 同 id后者狀態(tài)為準(zhǔn)。當(dāng)提交遷移到窗口更緊的后解析會(huì)話時(shí)失利的會(huì)話會(huì)以git.commit_count: 0重發(fā)即撤回 retraction因此對(duì) upsert 后的會(huì)話行求和git.commit_count不會(huì)重復(fù)計(jì)數(shù)。撤回只在提交被另一會(huì)話贏得時(shí)觸發(fā)——僅僅因超出--since窗口而老化的提交不會(huì)撤回已同步計(jì)數(shù)保持正確。進(jìn)行中會(huì)話的窗口增長(zhǎng)時(shí)會(huì)話 span 也會(huì)重發(fā)以保持 end time 最新。啟用 attribution 后究竟會(huì)發(fā)送什么啟用--attribution后以下內(nèi)容會(huì)離開你的機(jī)器規(guī)范化的倉(cāng)庫(kù)遠(yuǎn)端 URL、提交 SHA、提交時(shí)間戳span 開始時(shí)間、PR URL、merged/reverted 布爾值以及 usage span 同樣攜帶的偽匿名codeburn.device_id。PR 鏈接在客戶端由 scheme host path 重建丟棄 userinfo、查詢串與 fragment要求 https、/org/repo/pull/N路徑、長(zhǎng)度受限、每會(huì)話最多 20 條倉(cāng)庫(kù)身份本身在發(fā)送前必須通過嚴(yán)格的主機(jī)名/路徑白名單——畸形或 transport-helper 遠(yuǎn)端ext::…、codecommit::…會(huì)被直接拒絕而不是解析。精確邊界如下提交只來(lái)自具有網(wǎng)絡(luò)origin遠(yuǎn)端的倉(cāng)庫(kù)且只針對(duì)其受信任的 provider 記錄工作目錄解析到該倉(cāng)庫(kù)的會(huì)話。本地分組標(biāo)簽、provider 存儲(chǔ)路徑、提示詞文本、純本地倉(cāng)庫(kù)、file://遠(yuǎn)端、Windows 文件系統(tǒng)路徑永不作為倉(cāng)庫(kù)身份發(fā)出。沒有可信 cwd 來(lái)源的會(huì)話永遠(yuǎn)不會(huì)繼承你恰好從哪個(gè)目錄 push 的倉(cāng)庫(kù)。PR 鏈接只要會(huì)話捕獲了就發(fā)送即使會(huì)話所屬倉(cāng)庫(kù)無(wú)法識(shí)別——PR URL 本身就點(diǎn)名了倉(cāng)庫(kù)所以這不比會(huì)話已記錄鏈接多出任何信息。不加該標(biāo)志以上內(nèi)容一律不發(fā)送。什么絕不會(huì)被發(fā)送提示詞Prompts—— 你發(fā)給 AI 的實(shí)際消息永不包含代碼Code—— 文件內(nèi)容、diff、路徑都留在本地Bash 命令—— 可能包含機(jī)密永不發(fā)送姓名/郵箱—— 身份由服務(wù)端從登錄 token 的sub聲明推導(dǎo)主目錄形、郵箱形、憑證形的項(xiàng)目標(biāo)簽都會(huì)被省略。沒有開關(guān)可以覆蓋這些限制。隱私是結(jié)構(gòu)性的不是可配置的。唯一額外的 opt-in 是--attribution倉(cāng)庫(kù)遠(yuǎn)端、提交 SHA、PR URL——絕無(wú)代碼或提示詞。另外遺留 Hermes 消息中含有的文本Current working directory:行含 Windows 路徑仍可能提供本地分組標(biāo)簽但提示詞文本永遠(yuǎn)不會(huì)成為受信任的projectPath/workingDirectory來(lái)源也永遠(yuǎn)不會(huì)產(chǎn)生出站ai.project。認(rèn)證標(biāo)準(zhǔn) OIDC PKCEsync 使用標(biāo)準(zhǔn) OIDC與Sign in with Google同協(xié)議。團(tuán)隊(duì)管理員配置身份提供方開發(fā)者只需點(diǎn)一次瀏覽器登錄。完整流程src/sync/auth.ts為 Authorization Code PKCE客戶端生成code_verifier32 隨機(jī)字節(jié)base64url與code_challengeverifier 的 SHA-256base64url——見generatePkce()客戶端在127.0.0.1:19876啟動(dòng)回調(diào)服務(wù)器端口占用時(shí)依次回退 19877、19878——CALLBACK_PORTS定義于 src/sync/auth.ts瀏覽器打開{authorization_endpoint}?response_typecodeclient_id...redirect_urihttp://127.0.0.1:{port}/callbackcode_challenge...code_challenge_methodS256state...scope...用戶在 IdP 登錄IdP 重定向回http://127.0.0.1:{port}/callback?code...state...回調(diào)服務(wù)器校驗(yàn)state并提取codestate 不匹配、缺少 code、IdP 返回 error 都會(huì)得到明確的錯(cuò)誤頁(yè)或錯(cuò)誤信息客戶端向{token_endpoint}POSTgrant_typeauthorization_code、code、code_verifier、redirect_uri、client_idIdP 返回access_tokenrefresh_token。固定端口的原因Cognito及 Okta對(duì)回調(diào) URL 做精確字符串比較臨時(shí)端口無(wú)法滿足因此注冊(cè)三個(gè)固定端口依次嘗試。RFC 8252 推薦127.0.0.1IP 字面量而非localhost以規(guī)避 IPv6::1解析問題。令牌刷新每次sync push時(shí)客戶端從系統(tǒng)存儲(chǔ)讀取 refresh tokenPOST{token_endpoint}攜帶grant_typerefresh_token并把服務(wù)器返回的新 refresh token 存回透明處理輪換若收到invalid_grant則停止并提示用戶重新運(yùn)行sync setup。scope 解析請(qǐng)求codeburn-export.json中的 scopes僅當(dāng) OIDC 發(fā)現(xiàn)文檔的scopes_supported包含offline_access時(shí)才追加它——Cognito 會(huì)以invalid_scope拒絕offline_access它無(wú)需該 scope 就簽發(fā) refresh token。憑證存儲(chǔ)平臺(tái)方法實(shí)現(xiàn)macOSKeychainsecurity add-generic-password/find-generic-passwordLinuxlibsecretsecret-tool store/secret-tool lookupWindowsDPAPIPowerShellConvertTo-SecureString/ConvertFrom-SecureString回退文件~/.config/codeburn/.sync-token權(quán)限0600不引入原生模塊keytar已歸檔改為調(diào)用操作系統(tǒng) CLIsrc/sync/credentials.ts。測(cè)試/CI 可用CODEBURN_SYNC_TOKEN_STOREfile強(qiáng)制使用文件存儲(chǔ)以隔離環(huán)境?;赝说轿募那闆r會(huì)在sync status中如實(shí)報(bào)告。Token 生命周期通常 30–90 天由管理員設(shè)定過期后會(huì)被提示重新登錄重新登錄再次運(yùn)行codeburn sync setup url。發(fā)現(xiàn)協(xié)議與服務(wù)器契約服務(wù)器發(fā)現(xiàn)文檔GET {baseUrl}/.well-known/codeburn-export.json{ version: 1, issuer: https://cognito-idp.us-west-2.amazonaws.com/us-west-2_XXXX, client_id: 70e6sgst2ju6ff9dnrmv4l1tcb, scopes: [openid, email], traces_path: /v1/traces, max_batch_size: 1000 }字段必填默認(rèn)說(shuō)明version否1客戶端拒絕version 1issuer是—OIDC issuer URL客戶端拉取{issuer}/.well-known/openid-configurationclient_id是—該部署的 OAuth client IDscopes否[openid]請(qǐng)求的 scopes若 IdP 支持則動(dòng)態(tài)追加offline_accesstraces_path否/v1/tracesOTLP POST 路徑max_batch_size否1000單次 HTTP 請(qǐng)求的最大 span 數(shù)解析與校驗(yàn)邏輯在 src/sync/discovery.ts必須提供issuer與client_idissuer必須 https發(fā)現(xiàn)文檔缺失字段、返回 404、或版本超前都會(huì)給出可讀的DiscoveryError。為什么不用.well-known/openid-configuration代理OIDC 要求發(fā)現(xiàn)文檔內(nèi)的issuer聲明與獲取它的 URL 一致。從不同域名提供 Cognito 的文檔違反此約束。codeburn-export.json文檔把指標(biāo)端點(diǎn)與身份提供方解耦。客戶端安全校驗(yàn)所有攜帶令牌的遠(yuǎn)程端點(diǎn)強(qiáng)制 httpsRFC 8252 §8.3僅回環(huán)地址127.0.0.1、[::1]、localhost允許明文 httpassertHttpssrc/sync/discovery.ts。OIDC 發(fā)現(xiàn)文檔還執(zhí)行 issuer mix-up 防御元數(shù)據(jù)中的issuer聲明必須與獲取來(lái)源一致否則報(bào)OIDC issuer mismatch。服務(wù)器契約后端必須實(shí)現(xiàn)GET {baseUrl}/.well-known/codeburn-export.json—— 返回發(fā)現(xiàn)文檔公開無(wú)需認(rèn)證POST {baseUrl}{traces_path}—— 接受帶 Bearer token 的 OTLP/HTTP JSON校驗(yàn) JWT由配置的 IdP 簽發(fā)從 token 的sub聲明推導(dǎo)開發(fā)者身份接受最早 6 個(gè)月前的startTimeUnixNano返回標(biāo)準(zhǔn) OTLP 響應(yīng)體。載荷中不含任何 PII服務(wù)端僅憑認(rèn)證 token 推導(dǎo)身份。代碼中的測(cè)試 CDK 棧Cognito User Pool JWT authorizer Discovery Lambda Ingest Lambda僅為測(cè)試夾具而非生產(chǎn)參考——任何 OIDC 提供方 接受 OTLP 的端點(diǎn)都能滿足契約。去重、部分成功與限流sent-ledger 機(jī)制客戶端去重來(lái)源sent-ledger 位于~/.cache/codeburn/sync-ledger.json格式為{ key: string, ts: string }對(duì)象數(shù)組。推送邏輯收集窗口內(nèi)全部調(diào)用 → 減去 ledger 中已有的條目 → 發(fā)送剩余 → 成功后追加到 ledger。每次 push 時(shí)清理 6 個(gè)月前的舊條目。為什么不用水位線watermark時(shí)間戳水位線會(huì)靜默跳過遲到調(diào)用長(zhǎng)會(huì)話、provider 后補(bǔ)行。ledger 是精確的。部分成功partial successOTLP 會(huì)在響應(yīng)體中返回partial_success.rejected_spans。由于 OTLP 不指明哪些span 被拒絕客戶端對(duì)部分拒絕的批次不記賬——整個(gè)批次在下一次 push 時(shí)重試。這是安全的span id 由去重鍵確定性派生按 span id 存儲(chǔ)的服務(wù)器會(huì)把重發(fā) span 視為冪等 upsert。限流429一次 push 會(huì)運(yùn)行到完成——沒有常規(guī)的每推上限僅有 50,000 調(diào)用的安全閥。服務(wù)器限流才是預(yù)期中的剎車收到 HTTP 429 時(shí)客戶端遵守Retry-Afterdelta-seconds 或 HTTP-date單次等待上限 120 秒頭部缺失時(shí)默認(rèn) 5 秒parseRetryAfterMs與默認(rèn)值見 src/sync/push.ts同一批次最多連續(xù)重試 3 次若服務(wù)器仍限流推送停止剩余未記賬的調(diào)用在下次 push 發(fā)送401 或 5xx 立即停止同樣在下一次 push 續(xù)傳。安全閥MAX_PER_PUSH 50_000usage與MAX_ATTRIBUTION_PER_PUSH 10_000attribution只是病理情況如 ledger 損壞導(dǎo)致全量重發(fā)數(shù)年數(shù)據(jù)下的安全閥不是常規(guī)上限超出的部分會(huì)在下一次 push 繼續(xù)。FAQQ: sync 會(huì)自動(dòng)運(yùn)行嗎A: 不會(huì)。需要時(shí)運(yùn)行codeburn sync push。未來(lái)版本可能提供機(jī)會(huì)式推送如每次codeburn report之后但始終是顯式行為。注倉(cāng)庫(kù)已實(shí)現(xiàn)需顯式同意的sync auto定時(shí)推送。Q: 同一數(shù)據(jù)推兩次會(huì)怎樣A: 安全。本地 sent-ledger 記錄已發(fā)送內(nèi)容重推同一窗口不會(huì)產(chǎn)生重復(fù)。Q: 為什么我的 dashboard 缺少今天的 Copilot 用量A: Copilot 的 input/cache 用量在本地于按請(qǐng)求的session-store.db行與session.shutdown匯總之間 reconcile且該調(diào)和在會(huì)話存活期間持續(xù)變化——匯總殘差會(huì)隨著覆蓋它的行落地而縮小看似僅崩潰請(qǐng)求的行在 journal 條目出現(xiàn)后會(huì)變?yōu)檠a(bǔ)充。ledger 是 append-once 的調(diào)和中途發(fā)送的值將永遠(yuǎn)無(wú)法在接收端修正。因此 Copilot 會(huì)話會(huì)被保留held直到靜默滿 24 小時(shí)然后一次性最終推送。沒有任何數(shù)據(jù)被丟棄--dry-run會(huì)報(bào)告被保留的調(diào)用數(shù)。實(shí)現(xiàn)常量RECONCILE_SETTLE_MS 24h與完整論證見 src/sync/push.ts。Q: 為什么我舊的 Copilot 會(huì)話沒有用新的按請(qǐng)求分解重新同步A: 這是有意的。一個(gè) Copilot 會(huì)話的 input/cache 可以以兩種形狀之一離開你的機(jī)器——每個(gè) (session, model) 一條session.shutdownrollupspan或reconciled成每個(gè) API 請(qǐng)求一條 span 外加殘差。它們描述相同的 token接收端絕不能同時(shí)持有兩者而 usage span 一旦被 append-once ledger 發(fā)送就無(wú)法撤回。會(huì)話首次同步成哪種形狀就保持哪種另一種對(duì)該會(huì)話永久凍結(jié)。兩個(gè)方向都生效pre-store 版本同步的會(huì)話保持 rollup 永不發(fā)送行按行同步的會(huì)話之后也絕不發(fā)送 rollup——這很重要因?yàn)樵?90 天 durable age-out 時(shí)緩存行被修剪rollup 會(huì)在一個(gè)從未發(fā)送過的鍵下重新服務(wù)。會(huì)話已用形狀內(nèi)的增長(zhǎng)不受影響按輪輸出 span 永不凍結(jié)。--dry-run報(bào)告凍結(jié)數(shù)量。codeburn sync reset --confirm清空本地 ledger 并以新分解重推一切——只有當(dāng)接收端副本也清空時(shí)才應(yīng)這樣做否則你得到的正是它要避免的雙重計(jì)數(shù)。Q: 離線一周怎么辦A: 下次 push 會(huì)補(bǔ)齊。默認(rèn)窗口 7 天長(zhǎng)間隔用--since 30d或--since all最多 6 個(gè)月。推送無(wú)論多大都會(huì)運(yùn)行到完成——服務(wù)器限流429會(huì)自動(dòng)等待。Q: 管理員能看到我的提示詞嗎A: 不能。提示詞永不進(jìn)入載荷。服務(wù)器只能看到 token 數(shù)、成本、保守凈化的 provider/model/tool 標(biāo)識(shí)以及僅在 codeburn 有可信 cwd 來(lái)源時(shí)的可選項(xiàng)目 basename。Q: 如何停止同步A:codeburn sync logout刪除一切?;蛘吒纱嗤V惯\(yùn)行push。深入閱讀用戶文檔docs/sync/README.md本文原始依據(jù)開發(fā)者文檔docs/sync/DEVELOPER.md架構(gòu)圖、協(xié)議細(xì)節(jié)、測(cè)試策略命令注冊(cè)與編排src/sync/cli.ts、src/sync/push.tsOIDC 認(rèn)證與發(fā)現(xiàn)src/sync/auth.ts、src/sync/discovery.tsOTLP 載荷構(gòu)建src/sync/otlp.ts配置與憑證src/sync/config.ts、src/sync/credentials.ts測(cè)試單測(cè) tests/sync.test.ts發(fā)現(xiàn)解析、PKCE、scope 解析、回調(diào)服務(wù)器、配置讀寫等純函數(shù)、Mock IdP e2e tests/sync-e2e.test.ts完整 auth 往返、令牌刷新/輪換/吊銷全離線可入 CI、Playwright 無(wú)頭瀏覽器 e2e tests/sync-headless-e2e.test.ts僅開發(fā)者運(yùn)行需真實(shí) Cognito 測(cè)試后端以及線上協(xié)議相關(guān)測(cè)試 tests/sync-cb3-wire.test.ts、tests/sync-attribution.test.ts、tests/sync-consent.test.ts贊分享【免費(fèi)下載鏈接】codeburnFree, local tool to track AI coding token usage and cost across 37 tools and agents (Claude Code, Cursor, Codex, Gemini and more), by model, project, and task. npx codeburn項(xiàng)目地址https://gitcode.com/gh_mirrors/co/codeburn點(diǎn)擊查看免費(fèi)下載相關(guān)推薦Phoenix LDAP 后臺(tái)同步Background LDAP Sync設(shè)計(jì)與落地推演從登錄時(shí)同步到定時(shí)全量同步Phoenix LDAP 后臺(tái)同步Background LDAP Sync設(shè)計(jì)與落地推演從登錄時(shí)同步到定時(shí)全量同步 導(dǎo)讀 本文基于 internal_do可觀測(cè)性AI 評(píng)測(cè)LLMOpsAI 應(yīng)用人工智能數(shù)據(jù)煉金術(shù)用Awesome Claude Skills重塑Excel到AI的工作流數(shù)據(jù)煉金術(shù)用Awesome Claude Skills重塑Excel到AI的工作流 想象一下這樣的場(chǎng)景你面對(duì)著一份包含數(shù)千行數(shù)據(jù)的Excel報(bào)表需要從中提AI 技能AI 插件人工智能工作流自動(dòng)化團(tuán)隊(duì)協(xié)作利器如何使用Settings Sync共享VSCode配置團(tuán)隊(duì)協(xié)作利器如何使用Settings Sync共享VSCode配置 Visual Studio Code Settings Sync插件是開發(fā)者必備的團(tuán)隊(duì)協(xié)作創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考