From 0b72b818a01362719e7bb33a91d72837855ae05f Mon Sep 17 00:00:00 2001 From: uncle6me-web Date: Fri, 14 Aug 2026 13:27:45 +0800 Subject: [PATCH 1/6] =?UTF-8?q?chore(builds):=20=E9=87=8D=E7=B7=A8=20tier2?= =?UTF-8?q?=20=E6=88=90=E5=93=81=20manifest=E2=80=94=E2=80=94repo=5Fdirty:?= =?UTF-8?q?true=20=E4=BF=AE=E6=AD=A3=E7=82=BA=E4=B9=BE=E6=B7=A8=20HEAD?= =?UTF-8?q?=EF=BC=8894d5452=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 出貨 D87(Arcrun#119)到 stage 時卡在 build-bundles.mjs 的落後閘:main 上現有的 .worker-builds/manifest.json 記著 repo_head=8286c8a(4b6cc15 那個 commit 的父提交) 且 repo_dirty:true——是那次 commit 在完成前先跑了建置腳本,manifest 跟著沒完成的 工作樹一起被 commit 進去。 在乾淨的 main HEAD(94d5452)重跑 scripts/build-worker-artifacts.mjs:五顆 worker 內容位元組完全相同(cypher-executor sha256 8e6487478bc8... 不變, 證明前一份的實際內容其實是對的,只是 metadata 記錯),這次只更新 generated_at/repo_head/repo_dirty/source_commit 四個欄位為正確值。 --- .worker-builds/manifest.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.worker-builds/manifest.json b/.worker-builds/manifest.json index 46778c5..8feb0f4 100644 --- a/.worker-builds/manifest.json +++ b/.worker-builds/manifest.json @@ -1,14 +1,14 @@ { "schema": 1, "built_for": "arcrun-tier2-worker-artifacts", - "generated_at": "2026-08-14T04:50:51.373Z", - "repo_head": "8286c8afec1b225fcec21654cfd1cad3143231fe", - "repo_dirty": true, + "generated_at": "2026-08-14T05:27:06.148Z", + "repo_head": "94d5452425893ea9f2ed0b7166c7a87ca8866cec", + "repo_dirty": false, "workers": [ { "name": "arcrun-cypher-executor", "source_dir": "cypher-executor", - "source_commit": "8286c8afec1b225fcec21654cfd1cad3143231fe", + "source_commit": "4b6cc159b8b264ddca27da86922b2d4847ba0871", "main_module": "worker.mjs", "main_file": "arcrun-cypher-executor/worker.mjs", "js_bytes": 589935, From 73bdb90780123361372f829da713332c729ecea9 Mon Sep 17 00:00:00 2001 From: uncle6me-web Date: Fri, 14 Aug 2026 20:02:42 +0800 Subject: [PATCH 2/6] =?UTF-8?q?pending-changes=EF=BC=9A=E5=AE=89=E8=A3=9D?= =?UTF-8?q?=E5=99=A8=E7=8B=80=E6=85=8B=E5=88=A4=E6=96=B7=E6=94=B9=E7=9C=8B?= =?UTF-8?q?=E5=B8=B3=E8=99=9F=E3=80=81=E4=B8=AD=E5=BF=83=E5=B8=B3=E6=9C=AC?= =?UTF-8?q?=E9=99=8D=E7=B4=9A=EF=BC=88leo=202026-08-14=20=E7=9A=84?= =?UTF-8?q?=E6=AA=A2=E4=BF=AE=E5=AD=94=E6=AF=94=E5=96=BB=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 同一天三次撞牆同一形狀:帳本與現場分岔時,安裝器相信帳本。 鐵律:帳本永遠不得產生停手;不合時以現場為準並順手改對帳本。 Co-Authored-By: Claude Opus 5 --- system-dev/docs/3-specs/pending-changes.md | 61 ++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/system-dev/docs/3-specs/pending-changes.md b/system-dev/docs/3-specs/pending-changes.md index 703f3a0..ec0605c 100644 --- a/system-dev/docs/3-specs/pending-changes.md +++ b/system-dev/docs/3-specs/pending-changes.md @@ -615,3 +615,64 @@ leo 的判準(2026-07-30): - **⏸ 等 leo 裁的兩題(票上 §七)**:① App 前端跑 Portal origin(ES module)還是 iframe ——短期 App 是否都由我們自己寫?② v0 只開 `nav` 一個掛載點夠不夠? - **狀態**:⏳ 待 confirm。沒 confirm 前照現行 SDD 走,不開新 SDD、不動功能程式碼。 + +--- + +## 提案:安裝器的狀態判斷一律看帳號,中心帳本降級成純優化資料(leo 2026-08-14) + +- **leo 原話(本提案的來源,也是判準)**: + > 「你吃飯了沒?是由我來判斷的嗎?我看到你沒有盤子,應該問你吃了嗎? + > 但我沒問,堅持說你吃過了,**因為我這裡登記你吃了,結果讓你不能買飯**。」 + > 「我有**檢修孔**,需要去問問就好了,東西有沒有**一看就知道**, + > **根本不應該由中心判斷**。」 + +- **病根(同一天三次撞牆,同一個形狀)**: + 安裝器用**自己的帳本**(`INSTALLER_KV` 的 `deployed::`) + 決定「這台裝過了沒」,而不是去看**帳號上現在有什麼**—— + 但它手上一直握著那把 CF token,一次 API 就問得到(=leo 說的檢修孔)。 + + | 撞牆 | 帳本說 | 現場 | 結果 | + |---|---|---|---| + | leo(`#120`) | 裝過了 → `update` | leo21c 已被清空,0 顆 worker | `rule.mjs:257` 停手「找不到任何要更新的 worker」,**畫面上沒有出口** | + | 封測者(`#123`) | 沒人綁這個名字 → 可以建 | 名字已被上次半殘安裝佔走 | CF 回 `title already exists`,**帳號永久卡死** | + | 08-14 早上的處置 | — | — | **人工去 uncle6 刪掉那筆紀錄**才能繼續=把帳本改回跟現場一致。**那是繞過,不是修法** | + +- **要達成什麼**:**帳本壞掉、被清掉、或根本不存在時,安裝器照樣裝得起來。** + +- **變更面(規格層,不是實作指定)**: + 1. **`mode`(init/update)的來源改成帳號現況**——「這個帳號上有沒有我們的 worker」。 + `worker.js:1750-1756` 現在讀兩條通道的 KV 前綴決定,改成問帳號。 + 2. **`rule.mjs:257` 那道「說是更新卻一顆 worker 都找不到 → 停手」不再是錯誤**。 + 在新判準下這個組合根本不會出現:沒有 worker ⇒ `mode` 本來就會是 `init`。 + (該閘原本是 `#97` 的另一道門,其防護目的由「2b 已部署綁定絕對優先」承接。) + 3. **中心帳本降級成純優化/提示資料**,只保留它別處拿不到的東西: + 每顆 worker 上次部署的 `sha256`(差異更新)、`bundleBase`(跨通道互蓋警告 t157)。 + 4. 🔴 **鐵律:帳本永遠不得產生「停手」。** 帳本與現場不合時, + **以現場為準並順手把帳本改對**,不是把使用者擋在門外。 + + > leo 補充(2026-08-14,這句定義了帳本的身分): + > 「**我只是記錄上次的,這次去看看**,本來要記錄 sha, + > **一看東西都沒了,也不能硬說你裝過**。」 + > + > ⇒ **帳本記的是「上次」,不是「現在」。** 它是歷史紀錄,不是狀態宣告。 + > 每一趟都要去看現場;**看到的與帳本衝突時,看到的才算數**。 + > ⇒ 這也是為什麼「帳本不得停手」不是一條例外處理,而是它本來就沒有那個權限—— + > 一份講過去的紀錄,本來就不該否決現在觀察到的事實。 + +- **不動的牆**: + · 2b「已部署 worker 的綁定=事實,絕對優先」不得放寬(`#97` 的災情來源) + · 接管同名資源仍須呼叫端聲明 `createNameIsOurs`,預設 fail-closed(`#123` 的反向災情) + · 判斷仍只有**一份**,在 `shared/resource-rule/`;安裝器不得自建第二套 + +- **影響分析**: + · 動的是 `installer/oauth-prototype/worker.js` 的 mode 決定點 + `shared/resource-rule/rule.mjs` + 的 update-mode 前置閘;**鏡像兩份要同批**(`MIRROR.json` 守著) + · 多一次帳號查詢(`listAllScripts` 本來就會查,可共用,預期零額外成本) + · 不動 KBDB、無 schema 異動、無新金鑰面、無新公開端點 + · 會讓 `#120` 從「要人工清中心紀錄」變成不需要人介入 + +- **牽涉的票**:`inkstone/Arcrun#120`(重裝死結,本提案的主治對象) + |`inkstone/Arcrun#123`(已併 `9ad95ee`,是同一個病在資源層的那一半) + |`inkstone/arcrun-rag#78`(用戶版 uninstaller,受益但不因此結案) + +- **狀態**:⏳ **待 leo confirm 範圍**。方向已由 leo 當面給定;未 confirm 前不動功能程式碼。 From cfb759a774ae2dcda735b4740728930ca510d028 Mon Sep 17 00:00:00 2001 From: uncle6me-web Date: Fri, 14 Aug 2026 20:05:29 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E6=8F=90=E6=A1=88=E6=94=B6=E6=96=82?= =?UTF-8?q?=EF=BC=9A=E9=82=A3=E5=BC=B5=E7=B4=99=E6=90=AC=E5=88=B0=E7=94=A8?= =?UTF-8?q?=E6=88=B6=E8=87=AA=E5=B7=B1=E7=9A=84=E5=B8=B3=E8=99=9F=E4=B8=8A?= =?UTF-8?q?=EF=BC=8C=E4=B8=AD=E5=BF=83=E4=B8=8D=E5=86=8D=E4=BF=9D=E7=AE=A1?= =?UTF-8?q?=EF=BC=88leo=202026-08-14=20=E7=AC=AC=E4=B8=89=E6=AC=A1?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 比「降級」更徹底——紙跟東西在同一個地方,一起消失 ⇒ #120 不是被修好,是沒有地方可以發生。 Co-Authored-By: Claude Opus 5 --- system-dev/docs/3-specs/pending-changes.md | 26 ++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/system-dev/docs/3-specs/pending-changes.md b/system-dev/docs/3-specs/pending-changes.md index ec0605c..fca38d0 100644 --- a/system-dev/docs/3-specs/pending-changes.md +++ b/system-dev/docs/3-specs/pending-changes.md @@ -645,8 +645,30 @@ leo 的判準(2026-07-30): 2. **`rule.mjs:257` 那道「說是更新卻一顆 worker 都找不到 → 停手」不再是錯誤**。 在新判準下這個組合根本不會出現:沒有 worker ⇒ `mode` 本來就會是 `init`。 (該閘原本是 `#97` 的另一道門,其防護目的由「2b 已部署綁定絕對優先」承接。) - 3. **中心帳本降級成純優化/提示資料**,只保留它別處拿不到的東西: - 每顆 worker 上次部署的 `sha256`(差異更新)、`bundleBase`(跨通道互蓋警告 t157)。 + 3. **那張紙搬到用戶自己的帳號上,中心不再保管**(leo 2026-08-14 第三次收斂,比「降級」更徹底): + + > 「**我覺得根本不用我 keep**,這次裝的 sha **記在一張紙放你家**, + > 下次又要裝我就把那張紙拿出來看你上次裝了什麼版本, + > **如果不符,以實際有幾顆為準**。」 + + ⇒ 紀錄(每顆 worker 的 `sha256`、`bundleBase`)**寫在使用者自己的 Cloudflare 帳號上**, + 不再寫進我們的 `INSTALLER_KV`。 + + 🔑 **為什麼這個比「降級」更好——它讓那個 bug 變成不可能發生,而不是被處理掉**: + 紙跟東西放在同一個地方 ⇒ **他把帳號清空時,紙跟著消失** + ⇒ 結構上不可能出現「東西沒了、而我們手上還留著一張說他裝過的紙」。 + `#120` 因此不是「被修好」,是**沒有地方可以發生**。 + + 附帶好處: + · 跨通道互蓋(t157)不必再讀「對方通道的 KV」——紙就在帳號上,兩條通道看的是同一張 + · 我們不再保管一份「誰裝了什麼」的中央登記簿(少一個要維護、會漂、會外洩的東西) + · 帳本壞掉/被清掉/從沒有過,安裝器照樣 work + + ⏸ **要 leo 一併裁的兩題**(實作前必須有答案,但**做法由收工方判斷**): + ① 那張紙**貼在帳號的什麼位置**才會「跟著東西一起消失」—— + 要能被拆除工具連帶清掉,且不需要額外權限面 + ② `hasDeployRecordForToken`(t154:用一把 token 查「這些帳號有沒有裝過」) + 現在靠中心前綴掃描,搬走後要改成逐帳號去看——**這是預期內的成本,不是阻礙** 4. 🔴 **鐵律:帳本永遠不得產生「停手」。** 帳本與現場不合時, **以現場為準並順手把帳本改對**,不是把使用者擋在門外。 From 9609924818ca72dde547a00af0e7919ed6f18668 Mon Sep 17 00:00:00 2001 From: uncle6me-web Date: Fri, 14 Aug 2026 20:08:29 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E6=8F=90=E6=A1=88=E8=A3=9C=E5=8B=BE?= =?UTF-8?q?=E9=80=A3=EF=BC=9A=E8=BE=A8=E8=AD=98=E7=A2=BC=E7=9A=84=E3=80=8C?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=80=85=E5=85=8D=E7=A2=BC=E3=80=8D=E6=98=AF?= =?UTF-8?q?=E9=9D=A0=E9=82=A3=E5=BC=B5=E7=B4=99=EF=BC=8C=E6=96=B9=E5=90=91?= =?UTF-8?q?=E8=88=87=E7=9B=B4=E8=A6=BA=E7=9B=B8=E5=8F=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 不是用辨識碼找那張紙,是用那張紙免掉辨識碼(t154)。 紙搬到帳號上後,免碼判準自然變成去帳號看一眼,並讓 #120 情境變誠實: 帳號清空=本來就是新裝,請填辨識碼是對的答案,不是把人關在門外。 Co-Authored-By: Claude Opus 5 --- system-dev/docs/3-specs/pending-changes.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/system-dev/docs/3-specs/pending-changes.md b/system-dev/docs/3-specs/pending-changes.md index fca38d0..67d7f10 100644 --- a/system-dev/docs/3-specs/pending-changes.md +++ b/system-dev/docs/3-specs/pending-changes.md @@ -664,6 +664,18 @@ leo 的判準(2026-07-30): · 我們不再保管一份「誰裝了什麼」的中央登記簿(少一個要維護、會漂、會外洩的東西) · 帳本壞掉/被清掉/從沒有過,安裝器照樣 work + 🔗 **必須一併處理的勾連:辨識碼的「更新者免碼」**(leo 2026-08-14 問「辨識碼是用來找那張紙的嗎」, + 查證後方向是**反的**): + · 辨識碼=**邀請閘**(`verifyInviteCode` 打 landing 的 `/api/verify-code`),與帳本無關; + 真正認出使用者的是 **email**(`slugFromEmail` 決定所有資源名字),辨識碼不參與。 + · 但 `worker.js:3246`(t154)**用那張紙免掉辨識碼**:碼留空 → 放行進 OAuth → + 查此帳號有無部署紀錄 → 有=視同已核可免碼;無=退回要碼。 + ⇒ 紙搬到帳號上之後,「免碼」的判準自然從**查中心登記簿**變成**去帳號上看一眼**。 + ⇒ 附帶讓 `#120` 那個情境變**誠實**:帳號被清空 ⇒ 沒有 worker、沒有紙 ⇒ 你本來就是新裝, + **「請填辨識碼」是正確答案**;對照今天是「免碼放行 → 進去才說找不到 worker → 停手、沒有出口」。 + **同一個情境,一個是請你填個碼,一個是把你關在門外。** + ⚠️ 辨識碼**不可拿掉**——那是封測資格閘,與本提案無關。 + ⏸ **要 leo 一併裁的兩題**(實作前必須有答案,但**做法由收工方判斷**): ① 那張紙**貼在帳號的什麼位置**才會「跟著東西一起消失」—— 要能被拆除工具連帶清掉,且不需要額外權限面 From 340b461f58ed6a9958850f8871cf05381ce95c9d Mon Sep 17 00:00:00 2001 From: uncle6me-web Date: Fri, 14 Aug 2026 23:25:26 +0800 Subject: [PATCH 5/6] =?UTF-8?q?fix(cypher):=20credential=20=E5=85=A8?= =?UTF-8?q?=E9=83=A8=E5=BE=9E=E6=96=B0=E5=AE=B6=E5=8F=96=E5=88=B0=E6=99=82?= =?UTF-8?q?=E4=B8=8D=E5=86=8D=E6=89=93=20auth=5Fstatic=5Fkey=20worker?= =?UTF-8?q?=EF=BC=88Arcrun#124=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 病:cypher 看到 {{credential.X}} 就無條件 fetch arcrun-auth-static-key.{WORKER_SUBDOMAIN}.workers.dev。那顆 worker **不在網頁安裝器的首裝清單裡**(只裝 cypher-executor / kbdb / http_request / code 四顆),也沒有「用到才長」的機制 ⇒ fetch 撞 CF 邊緣 404 `error code: 1042` ⇒ 凡是用到 {{credential.X}} 的節點全部 500。 實測兩台都一字不差地同死(唯讀證據): leo21c GET /q/bfezv28v/rag_chat → 500 Node kw_search failed: ... 1042 youlin GET /q/yuga3bse/rag_chat → 500 Node kw_search failed: ... 1042 geek6688(手工維護、那顆在) → 過得了這關 leo 的 8 支 RAG 工作流每一支都用 {{credential.}}(rag_chat 6 處、 rag_ingest_card 7 處)⇒ 問答與寫入同時死,不只 ingest。 修法:resolveCredentialRefs 在 resolveSecretsFromNewHome 之後,若 nameList 每一個都已取到明文,就直接 replaceCredentialRefs 回傳,不打那顆 worker。 為什麼是零行為變化:回填本來就在本檔做(replaceCredentialRefs);那顆 worker 在這條路徑上唯一多做的事是幫「沒取到」的 name fallback 舊 KV(T7 雙讀)。 全取到時它收到 resolved_secrets 就是原樣回傳。只要有任一 name 沒取到, 仍照舊全量交給 WASM 走 T7——不縮減既有能力,只在等價時省掉那一跳。 證據那把金鑰早就在手上:leo21c 的 credential 目錄 last_used_at=1786715805, 與最後一次失敗執行的時間戳同一秒(touchLastUsed 只在真的從新家取到值時才寫)。 🔴 這個 1042 與 d2048e2/95a1462 那兩輪不是同一個病:那兩輪是 same-zone fetch 被擋(解=global_fetch_strictly_public flag,service binding 的解法已被 revert 不要拿回來);本案是目標 worker 根本不存在。同一個錯誤碼、兩種原因。 邊界:rule 02 §2.2 不變(不解密/不展開模板/不組 JWT);rule 3.1 不變(不加 service binding)。明文來源仍是 secret_get host function,與改動前同一條路。 驗證:tsc 對本檔零錯誤;auth-dispatcher+credentials 測試 5 紅 8 綠, 與改動前基準線逐項相同(零回歸;那 5 紅是 7ba7855 註明的「刻意留紅燈」)。 Co-Authored-By: Claude Opus 5 --- .../src/actions/auth-dispatcher.ts | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/cypher-executor/src/actions/auth-dispatcher.ts b/cypher-executor/src/actions/auth-dispatcher.ts index b642fc3..50fa903 100644 --- a/cypher-executor/src/actions/auth-dispatcher.ts +++ b/cypher-executor/src/actions/auth-dispatcher.ts @@ -245,6 +245,35 @@ export async function resolveCredentialRefs( // 沒取到的 name 缺席 → WASM 的 resolve_credentials 分支 fallback 舊 KV(T7)。 const resolvedSecrets = await resolveSecretsFromNewHome(env, apiKey, nameList); + // ── 全部取到 → 不必打 auth_static_key worker(Arcrun#124,2026-08-14)──────────── + // + // 這條路徑上,那顆 worker 唯一比這裡多做的事,是「幫**沒取到**的 name 回頭翻舊 KV」 + // (T7 雙讀 fallback)。當 nameList 每一個都已經從新家取到明文時,它收到 + // `resolved_secrets` 後就是原樣回傳——回填本來就由下面的 `replaceCredentialRefs` + // 在本檔做。**所以那趟往返在「全取到」時不產生任何結果差異。** + // + // 為什麼這不是效能微調,是修 bug:`wasmWorkerUrl` 推導出的 + // `arcrun-auth-static-key.{WORKER_SUBDOMAIN}.workers.dev` **在網頁安裝器裝出來的實例上不存在** + // (首裝只裝 cypher-executor / kbdb / http_request / code 四顆,auth primitive 不在其中, + // 也沒有「用到才長」的機制)。於是 fetch 撞 CF 邊緣的 404 `error code: 1042` + // ⇒ 下面的 `!res.ok` throw ⇒ **凡是工作流用到 {{credential.X}} 的節點全部 500**。 + // 實測:leo21c 與全新安裝的 youlin 兩台,問答與寫入路徑一字不差地同死。 + // + // 🔴 給下一個人:**這個 1042 跟 d2048e2/95a1462 那兩輪的 1042 不是同一個病。** + // 那兩輪是「same-zone fetch 被 CF 擋」(解法=`global_fetch_strictly_public` flag, + // 且 service binding 的解法**已被 revert、不要再拿回來**)。本案是「**目標 worker 根本不存在**」 + // ——同一個錯誤碼、兩種原因。照舊帳去動 flag 或 binding 對本案完全無效(flag 早就在了)。 + // + // 邊界(rule 02 §2.2)不變:本檔仍然不解密、不展開模板、不組 JWT。 + // 明文的來源是 `secret_get`(host function,實作 = env[ref]),與改動前完全同一條路; + // 這裡只是不再為了「拿一份自己已經拿到的東西」去 fetch 一顆可能不存在的 worker。 + // + // 刻意保留 WASM 路徑:只要有任何一個 name 沒從新家取到(舊租戶、遷移過渡期的 KV 存量), + // 就照舊全量交給 WASM 走 T7 雙讀——**不縮減既有能力,只在等價時省掉那一跳**。 + if (nameList.every((n) => Object.prototype.hasOwnProperty.call(resolvedSecrets, n))) { + return replaceCredentialRefs(data, resolvedSecrets) as Record; + } + const url = wasmWorkerUrl('auth_static_key', env.WORKER_SUBDOMAIN); const res = await fetch(url, { method: 'POST', From b8a5201e8a3cc5167a6c21867e661723154539e3 Mon Sep 17 00:00:00 2001 From: uncle6me-web Date: Fri, 14 Aug 2026 23:26:28 +0800 Subject: [PATCH 6/6] =?UTF-8?q?build(worker-artifacts):=20=E9=87=8D?= =?UTF-8?q?=E6=89=93=20cypher-executor=20=E6=88=90=E5=93=81=EF=BC=88?= =?UTF-8?q?=E5=90=AB=20Arcrun#124=20=E4=BF=AE=E6=B3=95=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit sha256 8e6487478bc8 → 1da6a46e6a17(工作區乾淨時重編,repo_head 標記可信)。 Co-Authored-By: Claude Opus 5 --- .worker-builds/arcrun-cypher-executor/worker.mjs | 3 +++ .worker-builds/manifest.json | 10 +++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.worker-builds/arcrun-cypher-executor/worker.mjs b/.worker-builds/arcrun-cypher-executor/worker.mjs index dcaa5bc..f069da7 100644 --- a/.worker-builds/arcrun-cypher-executor/worker.mjs +++ b/.worker-builds/arcrun-cypher-executor/worker.mjs @@ -3791,6 +3791,9 @@ async function resolveCredentialRefs(data, env, apiKey) { if (names.size === 0) return data; const nameList = [...names]; const resolvedSecrets = await resolveSecretsFromNewHome(env, apiKey, nameList); + if (nameList.every((n) => Object.prototype.hasOwnProperty.call(resolvedSecrets, n))) { + return replaceCredentialRefs(data, resolvedSecrets); + } const url = wasmWorkerUrl("auth_static_key", env.WORKER_SUBDOMAIN); const res = await fetch(url, { method: "POST", diff --git a/.worker-builds/manifest.json b/.worker-builds/manifest.json index 8feb0f4..680dc05 100644 --- a/.worker-builds/manifest.json +++ b/.worker-builds/manifest.json @@ -1,18 +1,18 @@ { "schema": 1, "built_for": "arcrun-tier2-worker-artifacts", - "generated_at": "2026-08-14T05:27:06.148Z", - "repo_head": "94d5452425893ea9f2ed0b7166c7a87ca8866cec", + "generated_at": "2026-08-14T15:26:27.638Z", + "repo_head": "340b461f58ed6a9958850f8871cf05381ce95c9d", "repo_dirty": false, "workers": [ { "name": "arcrun-cypher-executor", "source_dir": "cypher-executor", - "source_commit": "4b6cc159b8b264ddca27da86922b2d4847ba0871", + "source_commit": "340b461f58ed6a9958850f8871cf05381ce95c9d", "main_module": "worker.mjs", "main_file": "arcrun-cypher-executor/worker.mjs", - "js_bytes": 589935, - "content_sha256": "8e6487478bc86bd289afaa5192cbd394b80b5235ea1eefb30ed716e6446a9312", + "js_bytes": 590085, + "content_sha256": "1da6a46e6a1781cb1a518635ff7e6b43a035710673066f4f764671c75441fdaf", "modules": [], "compat_date": "2025-02-19", "compat_flags": [