Files
Arcrun/.claude/rules/01-tech-stack.md
Leo 6f6e31dbee fix(cypher): deploy P0 #9/#10/#10衍生 fixes (workers.dev URL + nested FOREACH + propagateCtx)
arcrun.md 一直標  已解決但 fix 在 working tree 沒推。今天 mira 7B.3f 端對端
跑不通才發現 production 還是舊版(fetch *.arcrun.dev 同 zone 自循環 → 522)。

涵蓋:
- P0 #9: wasmWorkerUrl() 從 *.arcrun.dev 改 arcrun-{kebab}.{WORKER_SUBDOMAIN}.workers.dev
  + types.ts/wrangler.toml 加 WORKER_SUBDOMAIN binding (uncle6-me)
  + auth-dispatcher.ts 用新 signature
- P0 #10A: interpolateData() 拆 interpolateString + interpolateValue 遞迴 nested
- P0 #10B: propagateCtx() helper 把上游 output spread + 用 node id namespace 存
  讓下游能 {{node_id.data.text}} 永不被覆蓋。5 個 edge type 全用此 helper
- P0 #10C: FOREACH 找 iterable 先看 result 沒有再看 ctx + 掃 nested object 一層
  解雙重 FOREACH(paragraph→triplets)內層跑 0 次

rules/01-tech-stack.md + rules/03-component-architecture.md 同步補 workers.dev 慣例說明。

未推 5 個 worker 改動,今晚才發現實際沒部署過。
2026-05-14 11:02:44 +08:00

4.0 KiB
Raw Permalink Blame History

技術棧硬限制

三層語言對應(絕對不可混用)

層級 語言 位置 職責
零件(Component TinyGo 或 AssemblyScript → WASM registry/components/{name}/ 所有業務邏輯
零件 Worker 包裝 TypeScript(固定模板,不寫業務邏輯) .component-builds/{name}/ WASI shimstdin/stdout JSON
Orchestration Worker TypeScript + Hono cypher-executor/ HTTP routing、workflow 執行排程、host functions
CLI TypeScript + Node.js cli/ acr 指令
Python SDK Python python-sdk/ HTTP thin wrapper + client 端加密
JS SDK TypeScript + Web Crypto js-sdk/ HTTP thin wrapper + client 端加密
Frontend React 19 + Vite + Tailwind v4 landing/ Cloudflare Pages

零件實作規範

只有兩種合法語言

  • TinyGotinygo build -target=wasi -o {name}.wasm main.go
  • AssemblyScriptasc main.ts --target release -o {name}.wasm

I/O 模型

  • stdinJSON input
  • stdoutJSON output
  • 不用 HTTP server,不監聽 socketWASI preview1 沒 socket

Host Functions(零件呼叫外部能力的唯一管道)

u6u namespace 下:

Host Function 用途
u6u.http_request 發 HTTP 請求
u6u.kv_get 讀 Cloudflare KVWorker 側依 key 前綴路由到正確 KV)
u6u.crypto_decrypt AES-GCM 解密(encryption key 永不暴露給 WASM
u6u.crypto_sign_rs256 RSA-SHA256 簽章(PKCS8 bytes 傳入)

所有 host function 在 cypher-executor/src/lib/wasi-shim.ts 實作。零件透過 WASI import 使用。

資料儲存

儲存 用途 Key 格式
Cloudflare KV WEBHOOKS workflow 定義(cypher binding YAML webhook:{api_key}:{name}
Cloudflare KV CREDENTIALS_KV 加密 credential {api_key}:cred:{name}
Cloudflare KV RECIPES auth recipe / 動態 API recipe auth_recipe:{service}, rec_{hash}
Cloudflare KV USERS_KV 用戶資料 user:{api_key}
Cloudflare KV SESSIONS_KV session session:{token}
Cloudflare KV ANALYTICS_KV 執行分析 execution:{timestamp}:{id}
Cloudflare KV EXEC_CONTEXT workflow 執行中的 context ctx:{execution_id}:{node_id}
Cloudflare R2 WASM_BUCKET 只用於用戶自製零件Phase 5 以後啟用) {api_key}:cmp:{hash}

警告:R2 不存平台內建零件的 WASM。平台零件已 bundle 進各自的 Worker binary[[wasm_modules]]import ... assert { type: 'webassembly' })。

加解密規範

  • 演算法AES-GCM 256-bit
  • 加密位置Client 端(CLI / Python SDK / JS SDK
    • Pythoncryptography 套件
    • JSWeb Crypto APIcrypto.subtle
  • 解密位置Server 端 WASM primitive(透過 host function crypto_decrypt
    • cypher-executor TS 不解密,只提供 host function
    • ENCRYPTION_KEY 只在 Worker host function 內部讀取,永不經 stdin / 回傳值傳給 WASM
  • 傳輸格式{ name, encrypted, iv }iv base64、encrypted base64

網路部署

  • 平台 API(對外)cypher.arcrun.devcypher-executor
  • Landingarcrun.dev
  • 每個零件 Worker
    • 對內(cypher-executor 用來 fetch component,避開同 zone 死鎖)arcrun-{kebab}.{WORKER_SUBDOMAIN}.workers.dev
      • 例:arcrun-kbdb-get.uncle6-me.workers.dev
      • cypher-executor 從 wrangler.toml [vars] WORKER_SUBDOMAIN 組出此 URL
    • 對外(可選,零件對全網開放被 curl 用){kebab}.arcrun.dev
    • 新增 component worker 部署清單name = "arcrun-{kebab}" + [[routes]] 對外(可選)+ dashboard 啟用 workers.dev(必須)
  • 部署工具Wrangler