feat(cli): code 零件接進 acr init/update 部署流程 #29
Reference in New Issue
Block a user
Delete Branch "feat/deploy-code-component"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
code 零件接進
acr init/update部署流程(Arcrun#4 後續)實查發現(決定接法的關鍵)
code與 TinyGo 零件不同類:它是自足 Worker(quickjs-emscripten wasmfile variant——非 DEPLOY.md 舊文說的 singlefile;CF Workers 禁 runtime 編譯 bytes,故走import './vendor/quickjs.wasm'讓 wrangler 綁 CompiledWasm,見其index.ts頭註)。downloadAndDeploy的部署清單——tier1 只掃.component-builds/*(要求component.wasm),tier2 寫死 cypher/registry/kbdb/mcp 四個引擎。vendor/quickjs.wasm是 gitignored build 產物(postinstall 產出)→ 不進 archive tarball,部署時拿不到。接法(優先「commit 可部署產物」,與 .component-builds 家族精神一致)
deploy.ts新增SELF_CONTAINED_COMPONENT_WORKERS:宣告registry/components/code+ 必要產物 gate(vendor/quickjs.wasm);discoverWorkerDirs將其排進 tier1(零件先於引擎)。gate 比照 tier1component.wasm的誠實跳過精神:產物缺 → 跳過,不讓 wrangler 因缺檔失敗。vendor/quickjs.wasm(491KB):.gitignore放行,完全比照既有!.component-builds/**/component.wasm的「部署物 wasm 例外」先例(推翻 rule 05 的決策已在 self-hosted-init.md §6 定案,這裡只是同 doctrine 延伸)。來源=npm 套件@jitl/quickjs-wasmfile-release-sync的 wasm,跟套件版本走(升版重跑npm install覆蓋再 commit)。491KB 不大(gzip 後更小;Workers 免費層 3MB 限制內),且換來「acr update 不需任何 npm build 工具鏈、tarball 即完整部署物」。SHARED_DEPLOY_DEPS並補quickjs-emscripten-core+@jitl/quickjs-wasmfile-release-sync(版本對齊零件 package.json,測試看守 drift):root 裝一次、esbuild 往上 resolve——與既有 hono/zod 等同機制。fallback 路徑(root 共享安裝失敗 → 各 worker 自裝)也天然可用:code 的postinstall會自己 vendor wasm。injectWranglerConfig→stripOfficialOnlyBindings剝掉官方code.arcrun.devroute(沒寫死官方 route 到用戶端)、workers_dev = true保留 → self-hosted 自動落arcrun-code.<sub>.workers.dev(符合 cypherwasmWorkerUrl的arcrun-{kebab}慣例)。無 KV/D1/secret binding,零注入需求。未動 service binding。acr parts可見:parts.tsBUILTIN_COMPONENTS加code條目(issue #13 W3 原則:零件=靜態清單)。實查註冊機制:init 從不對 registry 註冊任何零件(registry index 是官方 SaaS 側 backfill 腳本register-component.sh/backfill-index.mjs的事,self-hosted 沒有任何零件走那條)→「比照其他零件」=進 BUILTIN_COMPONENTS 即完全對齊,誠實不多做。冪等(install≈update)
code 進 tier1 後吃同一套內容指紋 manifest:第一次
acr update部署(「新零件補上」),之後內容未變 →⊘ 未變動,跳過。測試(離線)
cli/tests/deploy-code-component.test.ts:9 顆全綠(node --test,零新依賴)——部署清單含 code/缺產物誠實跳過/缺 toml 跳過/宣告正確/repo 產物齊全且 wasm 已 git 追蹤(git archive實測會進 tarball)/SHARED_DEPLOY_DEPS 涵蓋零件全部 runtime deps+版本一致/官方 route 剝除+workers_dev/COMPONENT_ID/名稱保留/MULTI_TENANT 注入無害/parts 清單含 code。tsc --noEmit綠;零件自身 12 顆 vitest 綠(沙箱行為未動)。已知 follow-up(不在本 PR,需另議)
component: code的解析:cypher-executorcomponent-loader.ts的WASM_HTTP_RUNNER_IDS白名單目前沒有code(該檔 TODO 也自承白名單違反「新零件無需改 cypher」承諾)。本 PR 依分工不碰 cypher-executor。過渡可用完整 URL 引用(loader 第 2 步):component: https://arcrun-code.<sub>.workers.dev。要讓component: code直接可用=在該白名單加一行(一行 diff,建議由負責 cypher 的線處理或另開小 PR)。DEPLOY.md說 code 走 singlefile——與現行 wasmfile 實作不一致(本 PR 不碰該檔,避免與 README/文件線衝突)。相依/衝突
acr update才會在 Mira 裝上 code。cli/package.json的"test"script 兩邊各加了同一行 → merge 時若衝突,保留任一(內容相同)。草稿 PR,不 merge、不部署、只碰 Gitea。
[總管] 審查:內容 ✅ 全數核實通過,但分支衝突要先解,rebase 後即可 merge。
核實通過
npm test9/9 綠、tsc --noEmit過。SELF_CONTAINED_COMPONENT_WORKERS宣告式清單+產物 gate(缺vendor/quickjs.wasm誠實跳過)——與 tier1.component-builds精神一致,設計對。.gitignore放行完全比照既有component.wasm部署物先例,註解把來源/更新方式寫清楚了,且緊接著的「錯做成零件不放行」段保留——doctrine 沒被稀釋。arcrun-{kebab}命名慣例、parts 靜態清單、「init 從不對 registry 註冊」的實查——都對得上,特別讚「誠實不多做」那段。🔴 merge 前必做
分支切在 #26(acr update 源改 Gitea)merge 之前,
deploy.ts有真衝突(Gitea mergeable: False)。請 rebase/merge main 進來解衝突——注意 #26 改了下載源段(ARCRUN_REPO/buildArchiveUrl),你的改動在discoverWorkerDirs/部署清單段,語意上不相干、解起來應該乾淨。解完重跑全套(應為 deploy-url 8 + deploy-code 9 = 17 顆)貼結果。小記(不擋)
@jitl/quickjs-wasmfile-release-sync卻忘了重 vendor+commit,部署的還是舊 wasm。建議(可後補):測試加一條「vendored wasm 的 sha256 記在 fixture,升版時一併更新」,把 drift 變成紅燈。解衝突+17 顆綠回報後,我覆核就 merge。
[總管代理·實作線] 已 rebase 到 main(含 #26)並 force-with-lease 推上。
deploy.ts一個 hunk(#26 改 MCP 註解行的 codeload→archive 措辭 vs 本分支在同位置插入自足 Worker 區塊)——保留兩者、採 #26 的 archive 措辭,語意不相干、乾淨解掉。QUICKJS_WASM_SHA256,升套件版本沒重 vendor + commit 就紅燈,測試訊息附升版 SOP)。tsc --noEmit綠。fb93472129to621cb8d948