diff --git a/arcrun-cypher-executor/worker.mjs b/arcrun-cypher-executor/worker.mjs index c246743..b456b9b 100644 --- a/arcrun-cypher-executor/worker.mjs +++ b/arcrun-cypher-executor/worker.mjs @@ -13430,6 +13430,90 @@ portalRouter.delete( }); }) ); +async function buildDiagnostics(env, tenant2) { + const notes = []; + let embedding = { checked: false }; + try { + const [statusRes, selftestRes] = await Promise.all([ + kbdbFetch(env, `/embed/backfill/status?${new URLSearchParams({ owner_id: tenant2 }).toString()}`), + kbdbFetch(env, `/embed/selftest?${new URLSearchParams({ owner_id: tenant2 }).toString()}`) + ]); + const statusBody = await statusRes.json().catch(() => null); + const selftestBody = await selftestRes.json().catch(() => null); + embedding = { + checked: true, + module_enabled: statusBody?.enabled ?? false, + // Vectorize+AI binding 都在,才有「index」這回事 + cards_embedded: statusBody?.embedded ?? 0, + cards_pending: statusBody?.pending ?? 0, + self_test: { + ran: selftestBody?.tested ?? false, + // 三態:true=能搜到自己 / false=搜不到自己(index 收錄有缺)/ null=還沒東西可測或模組未開 + found_itself: selftestBody?.tested ? selftestBody?.passed ?? null : null, + note: selftestBody?.note ?? "" + } + }; + } catch (e) { + notes.push(`embed \u5065\u5EB7\u72C0\u614B\u67E5\u8A62\u5931\u6557\uFF1A${e instanceof Error ? e.message : String(e)}`); + } + let library_count = 0; + let triplet_count = 0; + const ownerParam = new URLSearchParams({ owner_id: tenant2 }).toString(); + try { + const [registeredLibs, autoRes, tripletRes] = await Promise.all([ + listRecordsByTemplate(env, LIBRARY_TEMPLATE).catch(() => []), + kbdbFetch(env, `/entries/libraries?${ownerParam}`), + kbdbFetch(env, `/records/triplet-stats?${ownerParam}`) + ]); + const knownLibs = new Set( + registeredLibs.map((r) => (r.values.name ?? "").trim()).filter((n) => !!n) + ); + const autoBody = await autoRes.json().catch(() => null); + for (const name of autoBody?.libraries ?? []) { + const n = String(name ?? "").trim(); + if (n && n !== "general") knownLibs.add(n); + } + library_count = knownLibs.size; + const tripletBody = await tripletRes.json().catch(() => null); + triplet_count = (tripletBody?.stats ?? []).reduce((sum, s) => sum + (Number(s.triplet_count) || 0), 0); + } catch (e) { + notes.push(`\u77E5\u8B58\u5EAB\u898F\u6A21\u67E5\u8A62\u5931\u6557\uFF1A${e instanceof Error ? e.message : String(e)}`); + } + let library_scope_check = { ran: false }; + if (library_count === 0 && triplet_count === 0) { + try { + const probeRes = await kbdbFetch(env, `/entries?${new URLSearchParams({ owner_id: tenant2, limit: "1" }).toString()}`); + const probeBody = await probeRes.json().catch(() => null); + const total = probeBody?.total ?? 0; + library_scope_check = { + ran: true, + any_entries_found: total > 0, + note: total > 0 ? `\u9019\u500B\u79DF\u6236\u5E95\u4E0B\u67E5\u5F97\u5230\u5176\u4ED6\u8CC7\u6599\uFF08entries \u5171 ${total} \u7B46\uFF09\uFF0C\u4F46\u5EAB\uFF0F\u4E09\u5143\u7D44\u7D71\u8A08\u4ECD\u56DE 0\u2014\u2014\u50CF\u662F\u67E5\u8A62\u65B9\u5F0F\u6216\u79DF\u6236\u5C0D\u4E0D\u4E0A\uFF0C\u4E0D\u50CF\u771F\u7684\u6C92\u8CC7\u6599\uFF0C\u9700\u8981\u4EBA\u518D\u67E5\u4E00\u6B21` : "\u9019\u500B\u79DF\u6236\u5E95\u4E0B\u5B8C\u5168\u67E5\u4E0D\u5230\u4EFB\u4F55\u8CC7\u6599\u2014\u2014\u6BD4\u8F03\u50CF\u662F\u771F\u7684\u9084\u6C92\u6709\u8CC7\u6599\uFF0C\u4E0D\u662F\u67E5\u8A62\u65B9\u5F0F\u932F\u4E86" + }; + } catch (e) { + library_scope_check = { + ran: true, + any_entries_found: null, + note: `\u81EA\u6211\u63A2\u6E2C\u67E5\u8A62\u672C\u8EAB\u5931\u6557\uFF1A${e instanceof Error ? e.message : String(e)}` + }; + } + } + return { library_count, triplet_count, library_scope_check, embedding, notes }; +} +portalRouter.get( + "/portal/daemon/diagnostics", + (c) => run(c, async () => { + const apiKey = (c.req.header("X-Arcrun-API-Key") ?? "").trim(); + if (!apiKey) return c.json({ error: "\u7F3A\u5C11 X-Arcrun-API-Key header" }, 401); + const core = await buildDiagnostics(c.env, apiKey); + return c.json({ + generated_at: (/* @__PURE__ */ new Date()).toISOString(), + instance_url: new URL(c.req.url).origin, + bundle_version: c.env.ARCRUN_BUNDLE_VERSION ?? null, + ...core + }); + }) +); // ../../matrix/arcrun/cypher-executor/src/routes/init-seed.ts var initSeedRouter = new Hono2(); @@ -14576,51 +14660,12 @@ portalDataRouter.get( const auth = await requirePortalUser(c); if (!auth.ok) return auth.res; const tenant2 = portalTenant(c.env); - const notes = []; - let embedding = { checked: false }; - try { - const [statusRes, selftestRes] = await Promise.all([ - kbdbFetch(c.env, `/embed/backfill/status?${new URLSearchParams({ owner_id: tenant2 }).toString()}`), - kbdbFetch(c.env, `/embed/selftest?${new URLSearchParams({ owner_id: tenant2 }).toString()}`) - ]); - const statusBody = await statusRes.json().catch(() => null); - const selftestBody = await selftestRes.json().catch(() => null); - embedding = { - checked: true, - module_enabled: statusBody?.enabled ?? false, - // Vectorize+AI binding 都在,才有「index」這回事 - cards_embedded: statusBody?.embedded ?? 0, - cards_pending: statusBody?.pending ?? 0, - self_test: { - ran: selftestBody?.tested ?? false, - // 三態:true=能搜到自己 / false=搜不到自己(index 收錄有缺)/ null=還沒東西可測或模組未開 - found_itself: selftestBody?.tested ? selftestBody?.passed ?? null : null, - note: selftestBody?.note ?? "" - } - }; - } catch (e) { - notes.push(`embed \u5065\u5EB7\u72C0\u614B\u67E5\u8A62\u5931\u6557\uFF1A${e instanceof Error ? e.message : String(e)}`); - } - let library_count = 0; - let triplet_count = 0; - try { - const mapRes = await kbdbFetch(c.env, `/map?${new URLSearchParams({ owner_id: tenant2 }).toString()}`); - const mapBody = await mapRes.json().catch(() => null); - const libs = Array.isArray(mapBody?.libraries) ? mapBody.libraries : []; - library_count = libs.length; - triplet_count = libs.reduce((sum, l) => sum + (Number(l.triplet_count) || 0), 0); - } catch (e) { - notes.push(`\u77E5\u8B58\u5EAB\u898F\u6A21\u67E5\u8A62\u5931\u6557\uFF1A${e instanceof Error ? e.message : String(e)}`); - } - notes.push("\u76EE\u524D\u96F2\u7AEF\u6C92\u6709\u4FDD\u5B58\u300C\u8403\u53D6/\u4E0A\u50B3\u5931\u6557\u300D\u7684\u6B77\u53F2\u7D00\u9304\uFF0C\u53EA\u80FD\u770B\u5230\u76EE\u524D\u7684\u805A\u5408\u8A08\u6578\uFF08\u4E0A\u9762 cards_pending\uFF0Fcards_embedded\uFF09\uFF1B\u82E5\u8981\u67E5\u67D0\u4E00\u6B21\u5931\u6557\u7684\u7576\u4E0B\u539F\u56E0\uFF0C\u9700\u5728\u5931\u6557\u7576\u4E0B\u7531\u5C01\u6E2C\u8005\u622A\u5716\u540C\u6B65\u5C0F\u5E6B\u624B\u8996\u7A97\u3002"); + const core = await buildDiagnostics(c.env, tenant2); return c.json({ generated_at: (/* @__PURE__ */ new Date()).toISOString(), instance_url: new URL(c.req.url).origin, bundle_version: c.env.ARCRUN_BUNDLE_VERSION ?? null, - library_count, - triplet_count, - embedding, - notes + ...core }); }) ); diff --git a/arcrun-kbdb/worker.mjs b/arcrun-kbdb/worker.mjs index e771ece..47ecf23 100644 --- a/arcrun-kbdb/worker.mjs +++ b/arcrun-kbdb/worker.mjs @@ -3115,7 +3115,11 @@ async function recomputeLibraryMap(db, input) { bridgeMap.set(r.entity, libs); } const bridges = [...bridgeMap.entries()].map(([entity, libraries]) => ({ entity, libraries })); - const narrative = input.narrative?.trim() || ""; + let narrative = input.narrative?.trim(); + if (!narrative) { + const prev = await getLibraryMapDetail(db, library, owner); + narrative = prev?.narrative?.trim() || ""; + } const coreNames = topEntities.slice(0, 3).map((t) => t.name); const content = `${library}\uFF1A${narrative || "\uFF08narrative \u5F85 ingest \u88DC\u5BEB\uFF09"}\u3002\u6838\u5FC3\uFF1A${coreNames.length ? coreNames.join("\u3001") : "\uFF08\u5C1A\u7121 entities\uFF09"}`; const blockEntry = await createEntry(db, { @@ -3171,6 +3175,68 @@ async function recomputeLibraryMap(db, input) { triplet_library_slot_added: librarySlotAdded }; } +async function liveTripletCountsByLibrary(db, tripletTemplateId, owner_id) { + const params = owner_id ? [tripletTemplateId, owner_id] : [tripletTemplateId]; + const res = await db.prepare( + `SELECT COALESCE(NULLIF(lib_e.content, ''), 'general') AS library, COUNT(*) AS n + FROM ( + SELECT DISTINCT ev.record_id + FROM entry_values ev JOIN entries e ON ev.entry_id = e.id + WHERE ev.template_id = ?${owner_id ? " AND e.owner_id = ?" : ""} + ) AS tr + LEFT JOIN entry_values lev ON lev.record_id = tr.record_id AND lev.slot_name = 'library' + LEFT JOIN entries lib_e ON lib_e.id = lev.entry_id + GROUP BY COALESCE(NULLIF(lib_e.content, ''), 'general')` + ).bind(...params).all(); + const m = /* @__PURE__ */ new Map(); + for (const r of res.results ?? []) m.set(r.library, r.n); + return m; +} +async function knownLibraryNames(db, owner_id) { + const names = /* @__PURE__ */ new Set(); + const entryParams = owner_id ? [owner_id] : []; + const entryRows = await db.prepare( + `SELECT DISTINCT json_extract(metadata_json, '$.library') AS library FROM entries + WHERE ${owner_id ? "owner_id = ?" : "1=1"} AND json_extract(metadata_json, '$.library') IS NOT NULL` + ).bind(...entryParams).all(); + for (const r of entryRows.results ?? []) if (r.library) names.add(r.library); + const libTpl = await getTemplate(db, "portal_library"); + if (libTpl) { + const libParams = owner_id ? [libTpl.id, owner_id] : [libTpl.id]; + const libRows = await db.prepare( + `SELECT MAX(CASE WHEN ev.slot_name = 'name' THEN e.content END) AS name + FROM entry_values ev JOIN entries e ON ev.entry_id = e.id + WHERE ev.template_id = ?${owner_id ? " AND e.owner_id = ?" : ""} + GROUP BY ev.record_id` + ).bind(...libParams).all(); + for (const r of libRows.results ?? []) if (r.name) names.add(r.name); + } + return names; +} +async function ensureFreshLibraryMaps(db, owner_id, tripletTemplateName = DEFAULT_TRIPLET_TEMPLATE) { + const tripletTpl = await getTemplate(db, tripletTemplateName); + if (!tripletTpl) return; + const [liveCounts, cached, known] = await Promise.all([ + liveTripletCountsByLibrary(db, tripletTpl.id, owner_id), + listLibraryMaps(db, owner_id), + knownLibraryNames(db, owner_id) + ]); + const cachedByLib = new Map(cached.map((m) => [m.library, m])); + const stale = /* @__PURE__ */ new Set(); + for (const [library, count] of liveCounts) { + const c = cachedByLib.get(library); + if (!c || c.triplet_count !== count) stale.add(library); + } + for (const name of known) { + if (!liveCounts.has(name) && !cachedByLib.has(name)) stale.add(name); + } + await Promise.all( + [...stale].map( + (library) => recomputeLibraryMap(db, { library, owner_id, triplet_template: tripletTemplateName }).catch(() => { + }) + ) + ); +} async function listLibraryMaps(db, owner_id) { const tpl = await getTemplate(db, LIBRARY_MAP_TEMPLATE_NAME); if (!tpl) return []; @@ -3241,11 +3307,18 @@ mapRoutes.post("/recompute", async (c) => { } }); mapRoutes.get("/", async (c) => { - const libraries = await listLibraryMaps(c.env.DB, c.req.query("owner_id") || void 0); + const owner = c.req.query("owner_id") || void 0; + await ensureFreshLibraryMaps(c.env.DB, owner).catch(() => { + }); + const libraries = await listLibraryMaps(c.env.DB, owner); return c.json({ success: true, libraries, count: libraries.length }); }); mapRoutes.get("/:library", async (c) => { - const map = await getLibraryMapDetail(c.env.DB, c.req.param("library"), c.req.query("owner_id") || void 0); + const owner = c.req.query("owner_id") || void 0; + const library = c.req.param("library"); + await ensureFreshLibraryMaps(c.env.DB, owner).catch(() => { + }); + const map = await getLibraryMapDetail(c.env.DB, library, owner); if (!map) return c.json({ success: false, error: "not found" }, 404); return c.json({ success: true, map }); }); diff --git a/manifest.json b/manifest.json index a08c54f..c15080f 100644 --- a/manifest.json +++ b/manifest.json @@ -1,692 +1,692 @@ { - "schema": 1, - "built": "2026-08-07", - "source": "Arcrun@c7a0b31", - "core": [ - { - "name": "arcrun-cypher-executor", - "canonical": null, - "main_module": "worker.mjs", - "main_file": "arcrun-cypher-executor/worker.mjs", - "js_bytes": 547200, - "modules": [], - "compat_date": "2025-02-19", - "compat_flags": [ - "nodejs_compat", - "global_fetch_strictly_public" - ], - "requires": { - "kv": [ - "EXEC_CONTEXT", - "WEBHOOKS", - "CREDENTIALS_KV", - "ANALYTICS_KV", - "RECIPES", - "USERS_KV", - "SESSIONS_KV" - ], - "d1": [ - { - "binding": "CREDENTIALS_DB", - "database_name": "arcrun-kbdb" - } - ], - "vectorize": 0, - "ai": true, - "vars": { - "ENVIRONMENT": "production", - "CF_ACCOUNT_ID": "", - "WORKER_SUBDOMAIN": "uncle6-me", - "KBDB_BASE_URL": "https://arcrun-kbdb.uncle6-me.workers.dev", - "CONSOLE_TENANT": "leo", - "PORTAL_SESSION_TTL": "604800", - "PORTAL_SHOW_WORKFLOWS": "admin", - "GITEA_BASE_URL": "https://git.uncle6.me", - "GITEA_SPRINT_REPO": "Leo/InkStoneCo", - "GITEA_SPRINT_DIR": "system-dev/docs/3-specs/autonomy-dispatch" - } - }, - "stripped": { - "services": 13 - }, - "warnings": [], - "sha256": "c0c98d24e5cc4edf750befe1e22bc21b89e94fafd301249c6061b34a6bd4d60c", - "bytes": 547200 - }, - { - "name": "arcrun-kbdb", - "canonical": null, - "main_module": "worker.mjs", - "main_file": "arcrun-kbdb/worker.mjs", - "js_bytes": 120285, - "modules": [], - "compat_date": "2025-02-19", - "compat_flags": [ - "nodejs_compat" - ], - "requires": { - "kv": [], - "d1": [ - { - "binding": "DB", - "database_name": "arcrun-kbdb" - } - ], - "vectorize": 1, - "ai": true, - "vars": { - "MULTI_TENANT": "false", - "ENVIRONMENT": "production" - } - }, - "warnings": [], - "sha256": "f8f7541fb7632c96a9b81539b804f29a7519fdb5af21fe43813d36a70da2272e", - "bytes": 120285 - }, - { - "name": "arcrun-http-request", - "canonical": "http_request", - "main_module": "worker.mjs", - "main_file": "arcrun-http-request/worker.mjs", - "js_bytes": 80519, - "modules": [ - { - "name": "component.wasm", - "type": "application/wasm", - "file": "arcrun-http-request/component.wasm", - "sha256": "cc15cc785703e7bbb8dbff2d38dc84a4ac24e2f44316182730abae0f170ef133" - } - ], - "compat_date": "2025-02-19", - "compat_flags": [ - "nodejs_compat", - "global_fetch_strictly_public" - ], - "requires": { - "kv": [], - "d1": [], - "vectorize": 0, - "ai": false, - "vars": { - "COMPONENT_ID": "http_request" - } - }, - "warnings": [], - "sha256": "8a175938bf1c98b8dce489ff3085a13f512a5bf18edd0d148233177ce8a20e21", - "bytes": 80519 - }, - { - "name": "arcrun-code", - "canonical": "code", - "main_module": "worker.mjs", - "main_file": "arcrun-code/worker.mjs", - "js_bytes": 154438, - "modules": [ - { - "name": "quickjs.wasm", - "type": "application/wasm", - "file": "arcrun-code/quickjs.wasm", - "sha256": "105c3bed22d457e43e3d1c3c1c6959fda62a8fe06f0fc8a985303c3a2be72232" - } - ], - "compat_date": "2025-02-19", - "compat_flags": [], - "requires": { - "kv": [], - "d1": [], - "vectorize": 0, - "ai": false, - "vars": { - "COMPONENT_ID": "code" - } - }, - "warnings": [], - "sha256": "761acc054b6f01bc2c37dce3b5923cd40d4ac8ac986bc0452f36e16463299a74", - "bytes": 154438 - }, - { - "name": "arcrun-array-ops", - "tier": 1, - "main_file": "tier1/array_ops/index.js", - "main_module": "index.js", - "sha256": "43672b094117db835018106e3baadbc8e6ab289a03394b2ac30acf59325a4e41", - "compat_date": "2025-02-19", - "compat_flags": [], - "modules": [ - { - "name": "2c05e315c753986af9193c194998f3109a0a17df-component.wasm", - "file": "tier1/array_ops/2c05e315c753986af9193c194998f3109a0a17df-component.wasm", - "type": "application/wasm", - "sha256": "74dc9d99f8b9ef43628b55c85c05beb1af8f6f90d78d07cd132ffe4b865147ae" - } - ], - "requires": { - "kv": [], - "d1": [], - "ai": false, - "vars": { - "COMPONENT_ID": "array_ops" - } - }, - "bytes": 71642 - }, - { - "name": "arcrun-auth-oauth2", - "tier": 1, - "main_file": "tier1/auth_oauth2/index.js", - "main_module": "index.js", - "sha256": "7714857f62339e03e0af8cd2f4e67702de870d0e10799816c0cee39f0056c41c", - "compat_date": "2025-02-19", - "compat_flags": [ - "nodejs_compat" - ], - "modules": [ - { - "name": "1e5dae631ff4edb232828412daf37439b7234e8a-component.wasm", - "file": "tier1/auth_oauth2/1e5dae631ff4edb232828412daf37439b7234e8a-component.wasm", - "type": "application/wasm", - "sha256": "3622c20644e6c8c39487109e7353e2590bad90b1207139e34dfb0cf1c2696664" - } - ], - "requires": { - "kv": [ - "CREDENTIALS_KV", - "RECIPES" - ], - "d1": [], - "ai": false, - "vars": { - "COMPONENT_ID": "auth_oauth2" - } - }, - "bytes": 106357 - }, - { - "name": "arcrun-auth-service-account", - "tier": 1, - "main_file": "tier1/auth_service_account/index.js", - "main_module": "index.js", - "sha256": "28c401fc38c77963e0301edd785db43c45ee263421d4cf60e615818a7da27231", - "compat_date": "2025-02-19", - "compat_flags": [ - "nodejs_compat" - ], - "modules": [ - { - "name": "65dfefeaf42ca5ed95b583203575f4563fecd4a9-component.wasm", - "file": "tier1/auth_service_account/65dfefeaf42ca5ed95b583203575f4563fecd4a9-component.wasm", - "type": "application/wasm", - "sha256": "7d0808b4b9a2df4fbb54977eafe34a5bdb99e0cc941d97462c62e26f3651951e" - } - ], - "requires": { - "kv": [ - "CREDENTIALS_KV", - "RECIPES" - ], - "d1": [], - "ai": false, - "vars": { - "COMPONENT_ID": "auth_service_account" - } - }, - "bytes": 108254 - }, - { - "name": "arcrun-auth-static-key", - "tier": 1, - "main_file": "tier1/auth_static_key/index.js", - "main_module": "index.js", - "sha256": "945a526e79afd86ecd22933fe173cd443010cc11a56a1a04691f6926748077fb", - "compat_date": "2025-02-19", - "compat_flags": [ - "nodejs_compat" - ], - "modules": [ - { - "name": "26a79169f7ae71b46962b7df87289a4d06899272-component.wasm", - "file": "tier1/auth_static_key/26a79169f7ae71b46962b7df87289a4d06899272-component.wasm", - "type": "application/wasm", - "sha256": "cd0f69a80ced0979749e0ec30b1981795a49eaa56bdb2ba102cd4b64f4670369" - } - ], - "requires": { - "kv": [ - "CREDENTIALS_KV", - "RECIPES" - ], - "d1": [], - "ai": false, - "vars": { - "COMPONENT_ID": "auth_static_key" - } - }, - "bytes": 107843 - }, - { - "name": "arcrun-cron", - "tier": 1, - "main_file": "tier1/cron/index.js", - "main_module": "index.js", - "sha256": "c252a90ac53dda32ead78d2aca503082afaa5922494199e26544974333f3d309", - "compat_date": "2025-02-19", - "compat_flags": [ - "nodejs_compat" - ], - "modules": [ - { - "name": "cfef89ca6e0f809fe5774d8e3db5e48222abb7f6-component.wasm", - "file": "tier1/cron/cfef89ca6e0f809fe5774d8e3db5e48222abb7f6-component.wasm", - "type": "application/wasm", - "sha256": "afb3a14f8c8f00f4f5573f44153cb1dcf6fc715b2fb47c2afb0aaf95b74d3cde" - } - ], - "requires": { - "kv": [], - "d1": [], - "ai": false, - "vars": { - "COMPONENT_ID": "cron" - } - }, - "bytes": 105381 - }, - { - "name": "arcrun-date-ops", - "tier": 1, - "main_file": "tier1/date_ops/index.js", - "main_module": "index.js", - "sha256": "8d90fa9e28bb2979195b0600a6d68a322d23028ecb4e8405b43c8b35d1dd711d", - "compat_date": "2025-02-19", - "compat_flags": [], - "modules": [ - { - "name": "b02bbde53cd62d1e12579e8238de745a1129fdc3-component.wasm", - "file": "tier1/date_ops/b02bbde53cd62d1e12579e8238de745a1129fdc3-component.wasm", - "type": "application/wasm", - "sha256": "4e2c1329ce4014aa86a9a6449d8699e67c6c616f5c07088dc21216d4036ca41e" - } - ], - "requires": { - "kv": [], - "d1": [], - "ai": false, - "vars": { - "COMPONENT_ID": "date_ops" - } - }, - "bytes": 71642 - }, - { - "name": "arcrun-filter", - "tier": 1, - "main_file": "tier1/filter/index.js", - "main_module": "index.js", - "sha256": "8e17bb1e1443b426d61c1b73c650d64fec59dc009017798ce95cf180bfbaec8a", - "compat_date": "2025-02-19", - "compat_flags": [], - "modules": [ - { - "name": "d5253d0bc89bf79b101ea87b8010786decf28eb2-component.wasm", - "file": "tier1/filter/d5253d0bc89bf79b101ea87b8010786decf28eb2-component.wasm", - "type": "application/wasm", - "sha256": "6a0692b386522918b3b5af79cf7877394d1f02c350018dbaef68ef380dad1b9e" - } - ], - "requires": { - "kv": [], - "d1": [], - "ai": false, - "vars": { - "COMPONENT_ID": "filter" - } - }, - "bytes": 71642 - }, - { - "name": "arcrun-foreach-control", - "tier": 1, - "main_file": "tier1/foreach_control/index.js", - "main_module": "index.js", - "sha256": "9f982412e6cbf7eb94a4f35ce3c34404cb18a56dbd45a858e7b8b1c56cf493ee", - "compat_date": "2025-02-19", - "compat_flags": [], - "modules": [ - { - "name": "f1948f457d59667fe7c6c1867389ceda8e3a01b4-component.wasm", - "file": "tier1/foreach_control/f1948f457d59667fe7c6c1867389ceda8e3a01b4-component.wasm", - "type": "application/wasm", - "sha256": "8ae161ab37cc78ef6fae65364a47f7accb572378b395c4637daa2ffa57f14632" - } - ], - "requires": { - "kv": [], - "d1": [], - "ai": false, - "vars": { - "COMPONENT_ID": "foreach_control" - } - }, - "bytes": 71642 - }, - { - "name": "arcrun-if-control", - "tier": 1, - "main_file": "tier1/if_control/index.js", - "main_module": "index.js", - "sha256": "b2b3942fb3565d5819b52c1d68e6f764b7178c86c508c7acd4f699068d32b5c5", - "compat_date": "2025-02-19", - "compat_flags": [], - "modules": [ - { - "name": "8f00b54a9af7ec82c27b8f62b9951af22eaa4612-component.wasm", - "file": "tier1/if_control/8f00b54a9af7ec82c27b8f62b9951af22eaa4612-component.wasm", - "type": "application/wasm", - "sha256": "87c81e9cf5e664f60c06a364508dd365d49953e1b7afba6a5753fce5a4c82636" - } - ], - "requires": { - "kv": [], - "d1": [], - "ai": false, - "vars": { - "COMPONENT_ID": "if_control" - } - }, - "bytes": 71642 - }, - { - "name": "arcrun-merge", - "tier": 1, - "main_file": "tier1/merge/index.js", - "main_module": "index.js", - "sha256": "ccb13c336383cf1fed01f78c36eb394c345ae09984d175d6d5a12d5246f0b89d", - "compat_date": "2025-02-19", - "compat_flags": [], - "modules": [ - { - "name": "e99ec54d9c509604b6fffd4b9184d3942a413520-component.wasm", - "file": "tier1/merge/e99ec54d9c509604b6fffd4b9184d3942a413520-component.wasm", - "type": "application/wasm", - "sha256": "55a4d143246df172f60b5e15e7b26e55279deda9db436e3d65bccc25c86d7cd9" - } - ], - "requires": { - "kv": [], - "d1": [], - "ai": false, - "vars": { - "COMPONENT_ID": "merge" - } - }, - "bytes": 71642 - }, - { - "name": "arcrun-number-ops", - "tier": 1, - "main_file": "tier1/number_ops/index.js", - "main_module": "index.js", - "sha256": "7a935bcee1b468f1299852a05e97e64fc1d62675d7a6f0cdcee2e2f2caf47df3", - "compat_date": "2025-02-19", - "compat_flags": [], - "modules": [ - { - "name": "70f7f87bddfc4341aea7f2f953f00b0e38209bc1-component.wasm", - "file": "tier1/number_ops/70f7f87bddfc4341aea7f2f953f00b0e38209bc1-component.wasm", - "type": "application/wasm", - "sha256": "452d1940f6e2b2b36dc97c145abcb7b5bacdbfa7631c742827c2f6f6db87b4ea" - } - ], - "requires": { - "kv": [], - "d1": [], - "ai": false, - "vars": { - "COMPONENT_ID": "number_ops" - } - }, - "bytes": 71642 - }, - { - "name": "arcrun-set", - "tier": 1, - "main_file": "tier1/set/index.js", - "main_module": "index.js", - "sha256": "a20c144576a62b60acae3bb79961f4ec493bd6c2a0e63a6d865ac9b1560f6db2", - "compat_date": "2025-02-19", - "compat_flags": [], - "modules": [ - { - "name": "6e202a50e05d7a48b3d3318e149670cd87f213c9-component.wasm", - "file": "tier1/set/6e202a50e05d7a48b3d3318e149670cd87f213c9-component.wasm", - "type": "application/wasm", - "sha256": "f5afcf6e57401d2d83b21fb971ec80ca56d5e8e4bdb74a004f3d118875ed57c4" - } - ], - "requires": { - "kv": [], - "d1": [], - "ai": false, - "vars": { - "COMPONENT_ID": "set" - } - }, - "bytes": 71642 - }, - { - "name": "arcrun-string-ops", - "tier": 1, - "main_file": "tier1/string_ops/index.js", - "main_module": "index.js", - "sha256": "5edee624dc5111877f10fd4f69cf6d93ef151ca9acb5d04b50197908a06c562b", - "compat_date": "2025-02-19", - "compat_flags": [], - "modules": [ - { - "name": "d2e03502220d42d7f65d990289a947213d6e1972-component.wasm", - "file": "tier1/string_ops/d2e03502220d42d7f65d990289a947213d6e1972-component.wasm", - "type": "application/wasm", - "sha256": "41f3243ee18bb9f4fcbaa417bd773347128dec2971132e240eddec19ba6a9da2" - } - ], - "requires": { - "kv": [], - "d1": [], - "ai": false, - "vars": { - "COMPONENT_ID": "string_ops" - } - }, - "bytes": 71642 - }, - { - "name": "arcrun-switch", - "tier": 1, - "main_file": "tier1/switch/index.js", - "main_module": "index.js", - "sha256": "9e2a023fbeae41e15d232de7f895538ab39dec3113bdac9737884383f92d576f", - "compat_date": "2025-02-19", - "compat_flags": [], - "modules": [ - { - "name": "1920d78cdde1384d775cbc6647957409cf185584-component.wasm", - "file": "tier1/switch/1920d78cdde1384d775cbc6647957409cf185584-component.wasm", - "type": "application/wasm", - "sha256": "6d993dc9b1affe16b600aaa7cae5af977108cc08513bb11d9d9db908285fea8b" - } - ], - "requires": { - "kv": [], - "d1": [], - "ai": false, - "vars": { - "COMPONENT_ID": "switch" - } - }, - "bytes": 71642 - }, - { - "name": "arcrun-try-catch", - "tier": 1, - "main_file": "tier1/try_catch/index.js", - "main_module": "index.js", - "sha256": "ed1ac75f0e73808e3a1ebd44e96faaac5ac5019b30fe66dec277ef7e1009ed1f", - "compat_date": "2025-02-19", - "compat_flags": [], - "modules": [ - { - "name": "6a99d0d167de81d14f89a86557dc913fd84af607-component.wasm", - "file": "tier1/try_catch/6a99d0d167de81d14f89a86557dc913fd84af607-component.wasm", - "type": "application/wasm", - "sha256": "10eaddc5ef0d3dc68e3f009970541ac7f5fce30dcdbecec9a333afd5a29e3486" - } - ], - "requires": { - "kv": [], - "d1": [], - "ai": false, - "vars": { - "COMPONENT_ID": "try_catch" - } - }, - "bytes": 71642 - }, - { - "name": "arcrun-validate-json", - "tier": 1, - "main_file": "tier1/validate_json/index.js", - "main_module": "index.js", - "sha256": "d8030654c65df195d7e0e23a6d366bace35711896c21d8eff9fae70f853f150e", - "compat_date": "2025-02-19", - "compat_flags": [], - "modules": [ - { - "name": "d0c376152f3b536223d350c5cd10609e89062211-component.wasm", - "file": "tier1/validate_json/d0c376152f3b536223d350c5cd10609e89062211-component.wasm", - "type": "application/wasm", - "sha256": "8142ffd3cc57efbb9128faaf450b646111b0f2e2575cc29a7b562a7b185912ab" - } - ], - "requires": { - "kv": [], - "d1": [], - "ai": false, - "vars": { - "COMPONENT_ID": "validate_json" - } - }, - "bytes": 71642 - }, - { - "name": "arcrun-wait", - "tier": 1, - "main_file": "tier1/wait/index.js", - "main_module": "index.js", - "sha256": "e596e83ac43525ea13940691571f56825e155d16d2ddbf54703a4efea63526ee", - "compat_date": "2025-02-19", - "compat_flags": [], - "modules": [ - { - "name": "7a79aab24cf9a299e7a22147080b3c7bdfe3493d-component.wasm", - "file": "tier1/wait/7a79aab24cf9a299e7a22147080b3c7bdfe3493d-component.wasm", - "type": "application/wasm", - "sha256": "52ca2d184bf3dcc646bb94f29f7f3e69b5540276363e83a54cb435ff33ca2f3c" - } - ], - "requires": { - "kv": [], - "d1": [], - "ai": false, - "vars": { - "COMPONENT_ID": "wait" - } - }, - "bytes": 71642 - }, - { - "name": "arcrun-registry", - "tier": 2, - "main_file": "tier2/registry/index.js", - "main_module": "index.js", - "sha256": "6e7c6239e03cedf1acd56cc5ef7c30acacab021c9833aa0c87e6909569b1785d", - "compat_date": "2025-02-19", - "compat_flags": [ - "nodejs_compat" - ], - "modules": [], - "requires": { - "kv": [ - "SUBMISSIONS_KV", - "ANALYTICS_KV" - ], - "d1": [], - "ai": true, - "vars": { - "ENVIRONMENT": "production" - } - }, - "stripped_services": [], - "bytes": 250971 - }, - { - "name": "arcrun-mcp", - "tier": 2, - "main_file": "tier2/mcp/index.js", - "main_module": "index.js", - "sha256": "65515d2f20647fca61a51df47437d2b088f83b8d6f227b3bb0d8ead2ebac9982", - "compat_date": "2024-11-27", - "compat_flags": [ - "nodejs_compat" - ], - "modules": [], - "requires": { - "kv": [ - "OAUTH_KV" - ], - "d1": [], - "ai": false, - "vars": {} - }, - "stripped_services": [ - "COMPONENT_REGISTRY", - "CYPHER_EXECUTOR", - "KBDB" - ], - "bytes": 1304459 - }, - { - "name": "arcrun-rag-ui", - "tier": 2, - "main_file": "tier2/ui/index.js", - "main_module": "index.js", - "sha256": "089ee208de75fff645f53c487abb8adc12dc7143cc5fc4972b761bd06d842453", - "compat_date": "2026-07-01", - "compat_flags": [], - "modules": [], - "requires": { - "kv": [], - "d1": [], - "ai": false, - "vars": {} - }, - "bytes": 495557 - } - ], - "daemon": { - "version": "v0.15.0", - "built": "20260729-2238", - "notes": "t149 多帳號同步修復+t150 版本一致性(collector 與 tray 同版)", - "mac": { - "file": "daemon/ArcrunRAG-mac-unsigned.zip", - "sha256": "2974c172440960924dbe089757ad0bf37f6288b86d83e39abd169a9966413d46" - }, - "win": { - "file": "daemon/ArcrunRAG-win-unsigned.zip", - "sha256": "1191af74b3c841536f08625d2449fa4add3e829c93d5cebc391da59e6f7e05a6" + "schema": 1, + "built": "2026-08-08", + "source": "Arcrun@8447165", + "core": [ + { + "name": "arcrun-cypher-executor", + "canonical": null, + "main_module": "worker.mjs", + "main_file": "arcrun-cypher-executor/worker.mjs", + "js_bytes": 549108, + "modules": [], + "compat_date": "2025-02-19", + "compat_flags": [ + "nodejs_compat", + "global_fetch_strictly_public" + ], + "requires": { + "kv": [ + "EXEC_CONTEXT", + "WEBHOOKS", + "CREDENTIALS_KV", + "ANALYTICS_KV", + "RECIPES", + "USERS_KV", + "SESSIONS_KV" + ], + "d1": [ + { + "binding": "CREDENTIALS_DB", + "database_name": "arcrun-kbdb" + } + ], + "vectorize": 0, + "ai": true, + "vars": { + "ENVIRONMENT": "production", + "CF_ACCOUNT_ID": "", + "WORKER_SUBDOMAIN": "uncle6-me", + "KBDB_BASE_URL": "https://arcrun-kbdb.uncle6-me.workers.dev", + "CONSOLE_TENANT": "leo", + "PORTAL_SESSION_TTL": "604800", + "PORTAL_SHOW_WORKFLOWS": "admin", + "GITEA_BASE_URL": "https://git.uncle6.me", + "GITEA_SPRINT_REPO": "Leo/InkStoneCo", + "GITEA_SPRINT_DIR": "system-dev/docs/3-specs/autonomy-dispatch" } + }, + "stripped": { + "services": 13 + }, + "warnings": [], + "sha256": "065090f8c5cbf7c8c27dd2e0b938728f6f8d44da69850daaf3f076fec4161dd8", + "bytes": 549108 }, - "release": "1.4.20", - "built_for": "oauth-installer-lazy-load", - "notes": [], - "fingerprint": "bf4216391d5689090776e5ec8ce8b39f36221f5ab85e7ffe2d40741b6086ced3" -} \ No newline at end of file + { + "name": "arcrun-kbdb", + "canonical": null, + "main_module": "worker.mjs", + "main_file": "arcrun-kbdb/worker.mjs", + "js_bytes": 123450, + "modules": [], + "compat_date": "2025-02-19", + "compat_flags": [ + "nodejs_compat" + ], + "requires": { + "kv": [], + "d1": [ + { + "binding": "DB", + "database_name": "arcrun-kbdb" + } + ], + "vectorize": 0, + "ai": false, + "vars": { + "ENVIRONMENT": "production" + } + }, + "warnings": [], + "sha256": "067e0e09d453f8b233897b87166d448edad5b612a4267574a8486aa9a002f83b", + "bytes": 123450 + }, + { + "name": "arcrun-http-request", + "canonical": "http_request", + "main_module": "worker.mjs", + "main_file": "arcrun-http-request/worker.mjs", + "js_bytes": 80519, + "modules": [ + { + "name": "component.wasm", + "type": "application/wasm", + "file": "arcrun-http-request/component.wasm", + "sha256": "cc15cc785703e7bbb8dbff2d38dc84a4ac24e2f44316182730abae0f170ef133" + } + ], + "compat_date": "2025-02-19", + "compat_flags": [ + "nodejs_compat", + "global_fetch_strictly_public" + ], + "requires": { + "kv": [], + "d1": [], + "vectorize": 0, + "ai": false, + "vars": { + "MULTI_TENANT": "false", + "COMPONENT_ID": "http_request" + } + }, + "warnings": [], + "sha256": "8a175938bf1c98b8dce489ff3085a13f512a5bf18edd0d148233177ce8a20e21", + "bytes": 80519 + }, + { + "name": "arcrun-code", + "canonical": "code", + "main_module": "worker.mjs", + "main_file": "arcrun-code/worker.mjs", + "js_bytes": 154438, + "modules": [ + { + "name": "quickjs.wasm", + "type": "application/wasm", + "file": "arcrun-code/quickjs.wasm", + "sha256": "105c3bed22d457e43e3d1c3c1c6959fda62a8fe06f0fc8a985303c3a2be72232" + } + ], + "compat_date": "2025-02-19", + "compat_flags": [], + "requires": { + "kv": [], + "d1": [], + "vectorize": 0, + "ai": false, + "vars": { + "COMPONENT_ID": "code" + } + }, + "warnings": [], + "sha256": "761acc054b6f01bc2c37dce3b5923cd40d4ac8ac986bc0452f36e16463299a74", + "bytes": 154438 + }, + { + "name": "arcrun-array-ops", + "tier": 1, + "main_file": "tier1/array_ops/index.js", + "main_module": "index.js", + "sha256": "43672b094117db835018106e3baadbc8e6ab289a03394b2ac30acf59325a4e41", + "compat_date": "2025-02-19", + "compat_flags": [], + "modules": [ + { + "name": "2c05e315c753986af9193c194998f3109a0a17df-component.wasm", + "file": "tier1/array_ops/2c05e315c753986af9193c194998f3109a0a17df-component.wasm", + "type": "application/wasm", + "sha256": "74dc9d99f8b9ef43628b55c85c05beb1af8f6f90d78d07cd132ffe4b865147ae" + } + ], + "requires": { + "kv": [], + "d1": [], + "ai": false, + "vars": { + "COMPONENT_ID": "array_ops" + } + }, + "bytes": 71642 + }, + { + "name": "arcrun-auth-oauth2", + "tier": 1, + "main_file": "tier1/auth_oauth2/index.js", + "main_module": "index.js", + "sha256": "7714857f62339e03e0af8cd2f4e67702de870d0e10799816c0cee39f0056c41c", + "compat_date": "2025-02-19", + "compat_flags": [ + "nodejs_compat" + ], + "modules": [ + { + "name": "1e5dae631ff4edb232828412daf37439b7234e8a-component.wasm", + "file": "tier1/auth_oauth2/1e5dae631ff4edb232828412daf37439b7234e8a-component.wasm", + "type": "application/wasm", + "sha256": "3622c20644e6c8c39487109e7353e2590bad90b1207139e34dfb0cf1c2696664" + } + ], + "requires": { + "kv": [ + "CREDENTIALS_KV", + "RECIPES" + ], + "d1": [], + "ai": false, + "vars": { + "COMPONENT_ID": "auth_oauth2" + } + }, + "bytes": 106357 + }, + { + "name": "arcrun-auth-service-account", + "tier": 1, + "main_file": "tier1/auth_service_account/index.js", + "main_module": "index.js", + "sha256": "28c401fc38c77963e0301edd785db43c45ee263421d4cf60e615818a7da27231", + "compat_date": "2025-02-19", + "compat_flags": [ + "nodejs_compat" + ], + "modules": [ + { + "name": "65dfefeaf42ca5ed95b583203575f4563fecd4a9-component.wasm", + "file": "tier1/auth_service_account/65dfefeaf42ca5ed95b583203575f4563fecd4a9-component.wasm", + "type": "application/wasm", + "sha256": "7d0808b4b9a2df4fbb54977eafe34a5bdb99e0cc941d97462c62e26f3651951e" + } + ], + "requires": { + "kv": [ + "CREDENTIALS_KV", + "RECIPES" + ], + "d1": [], + "ai": false, + "vars": { + "COMPONENT_ID": "auth_service_account" + } + }, + "bytes": 108254 + }, + { + "name": "arcrun-auth-static-key", + "tier": 1, + "main_file": "tier1/auth_static_key/index.js", + "main_module": "index.js", + "sha256": "945a526e79afd86ecd22933fe173cd443010cc11a56a1a04691f6926748077fb", + "compat_date": "2025-02-19", + "compat_flags": [ + "nodejs_compat" + ], + "modules": [ + { + "name": "26a79169f7ae71b46962b7df87289a4d06899272-component.wasm", + "file": "tier1/auth_static_key/26a79169f7ae71b46962b7df87289a4d06899272-component.wasm", + "type": "application/wasm", + "sha256": "cd0f69a80ced0979749e0ec30b1981795a49eaa56bdb2ba102cd4b64f4670369" + } + ], + "requires": { + "kv": [ + "CREDENTIALS_KV", + "RECIPES" + ], + "d1": [], + "ai": false, + "vars": { + "COMPONENT_ID": "auth_static_key" + } + }, + "bytes": 107843 + }, + { + "name": "arcrun-cron", + "tier": 1, + "main_file": "tier1/cron/index.js", + "main_module": "index.js", + "sha256": "c252a90ac53dda32ead78d2aca503082afaa5922494199e26544974333f3d309", + "compat_date": "2025-02-19", + "compat_flags": [ + "nodejs_compat" + ], + "modules": [ + { + "name": "cfef89ca6e0f809fe5774d8e3db5e48222abb7f6-component.wasm", + "file": "tier1/cron/cfef89ca6e0f809fe5774d8e3db5e48222abb7f6-component.wasm", + "type": "application/wasm", + "sha256": "afb3a14f8c8f00f4f5573f44153cb1dcf6fc715b2fb47c2afb0aaf95b74d3cde" + } + ], + "requires": { + "kv": [], + "d1": [], + "ai": false, + "vars": { + "COMPONENT_ID": "cron" + } + }, + "bytes": 105381 + }, + { + "name": "arcrun-date-ops", + "tier": 1, + "main_file": "tier1/date_ops/index.js", + "main_module": "index.js", + "sha256": "8d90fa9e28bb2979195b0600a6d68a322d23028ecb4e8405b43c8b35d1dd711d", + "compat_date": "2025-02-19", + "compat_flags": [], + "modules": [ + { + "name": "b02bbde53cd62d1e12579e8238de745a1129fdc3-component.wasm", + "file": "tier1/date_ops/b02bbde53cd62d1e12579e8238de745a1129fdc3-component.wasm", + "type": "application/wasm", + "sha256": "4e2c1329ce4014aa86a9a6449d8699e67c6c616f5c07088dc21216d4036ca41e" + } + ], + "requires": { + "kv": [], + "d1": [], + "ai": false, + "vars": { + "COMPONENT_ID": "date_ops" + } + }, + "bytes": 71642 + }, + { + "name": "arcrun-filter", + "tier": 1, + "main_file": "tier1/filter/index.js", + "main_module": "index.js", + "sha256": "8e17bb1e1443b426d61c1b73c650d64fec59dc009017798ce95cf180bfbaec8a", + "compat_date": "2025-02-19", + "compat_flags": [], + "modules": [ + { + "name": "d5253d0bc89bf79b101ea87b8010786decf28eb2-component.wasm", + "file": "tier1/filter/d5253d0bc89bf79b101ea87b8010786decf28eb2-component.wasm", + "type": "application/wasm", + "sha256": "6a0692b386522918b3b5af79cf7877394d1f02c350018dbaef68ef380dad1b9e" + } + ], + "requires": { + "kv": [], + "d1": [], + "ai": false, + "vars": { + "COMPONENT_ID": "filter" + } + }, + "bytes": 71642 + }, + { + "name": "arcrun-foreach-control", + "tier": 1, + "main_file": "tier1/foreach_control/index.js", + "main_module": "index.js", + "sha256": "9f982412e6cbf7eb94a4f35ce3c34404cb18a56dbd45a858e7b8b1c56cf493ee", + "compat_date": "2025-02-19", + "compat_flags": [], + "modules": [ + { + "name": "f1948f457d59667fe7c6c1867389ceda8e3a01b4-component.wasm", + "file": "tier1/foreach_control/f1948f457d59667fe7c6c1867389ceda8e3a01b4-component.wasm", + "type": "application/wasm", + "sha256": "8ae161ab37cc78ef6fae65364a47f7accb572378b395c4637daa2ffa57f14632" + } + ], + "requires": { + "kv": [], + "d1": [], + "ai": false, + "vars": { + "COMPONENT_ID": "foreach_control" + } + }, + "bytes": 71642 + }, + { + "name": "arcrun-if-control", + "tier": 1, + "main_file": "tier1/if_control/index.js", + "main_module": "index.js", + "sha256": "b2b3942fb3565d5819b52c1d68e6f764b7178c86c508c7acd4f699068d32b5c5", + "compat_date": "2025-02-19", + "compat_flags": [], + "modules": [ + { + "name": "8f00b54a9af7ec82c27b8f62b9951af22eaa4612-component.wasm", + "file": "tier1/if_control/8f00b54a9af7ec82c27b8f62b9951af22eaa4612-component.wasm", + "type": "application/wasm", + "sha256": "87c81e9cf5e664f60c06a364508dd365d49953e1b7afba6a5753fce5a4c82636" + } + ], + "requires": { + "kv": [], + "d1": [], + "ai": false, + "vars": { + "COMPONENT_ID": "if_control" + } + }, + "bytes": 71642 + }, + { + "name": "arcrun-merge", + "tier": 1, + "main_file": "tier1/merge/index.js", + "main_module": "index.js", + "sha256": "ccb13c336383cf1fed01f78c36eb394c345ae09984d175d6d5a12d5246f0b89d", + "compat_date": "2025-02-19", + "compat_flags": [], + "modules": [ + { + "name": "e99ec54d9c509604b6fffd4b9184d3942a413520-component.wasm", + "file": "tier1/merge/e99ec54d9c509604b6fffd4b9184d3942a413520-component.wasm", + "type": "application/wasm", + "sha256": "55a4d143246df172f60b5e15e7b26e55279deda9db436e3d65bccc25c86d7cd9" + } + ], + "requires": { + "kv": [], + "d1": [], + "ai": false, + "vars": { + "COMPONENT_ID": "merge" + } + }, + "bytes": 71642 + }, + { + "name": "arcrun-number-ops", + "tier": 1, + "main_file": "tier1/number_ops/index.js", + "main_module": "index.js", + "sha256": "7a935bcee1b468f1299852a05e97e64fc1d62675d7a6f0cdcee2e2f2caf47df3", + "compat_date": "2025-02-19", + "compat_flags": [], + "modules": [ + { + "name": "70f7f87bddfc4341aea7f2f953f00b0e38209bc1-component.wasm", + "file": "tier1/number_ops/70f7f87bddfc4341aea7f2f953f00b0e38209bc1-component.wasm", + "type": "application/wasm", + "sha256": "452d1940f6e2b2b36dc97c145abcb7b5bacdbfa7631c742827c2f6f6db87b4ea" + } + ], + "requires": { + "kv": [], + "d1": [], + "ai": false, + "vars": { + "COMPONENT_ID": "number_ops" + } + }, + "bytes": 71642 + }, + { + "name": "arcrun-set", + "tier": 1, + "main_file": "tier1/set/index.js", + "main_module": "index.js", + "sha256": "a20c144576a62b60acae3bb79961f4ec493bd6c2a0e63a6d865ac9b1560f6db2", + "compat_date": "2025-02-19", + "compat_flags": [], + "modules": [ + { + "name": "6e202a50e05d7a48b3d3318e149670cd87f213c9-component.wasm", + "file": "tier1/set/6e202a50e05d7a48b3d3318e149670cd87f213c9-component.wasm", + "type": "application/wasm", + "sha256": "f5afcf6e57401d2d83b21fb971ec80ca56d5e8e4bdb74a004f3d118875ed57c4" + } + ], + "requires": { + "kv": [], + "d1": [], + "ai": false, + "vars": { + "COMPONENT_ID": "set" + } + }, + "bytes": 71642 + }, + { + "name": "arcrun-string-ops", + "tier": 1, + "main_file": "tier1/string_ops/index.js", + "main_module": "index.js", + "sha256": "5edee624dc5111877f10fd4f69cf6d93ef151ca9acb5d04b50197908a06c562b", + "compat_date": "2025-02-19", + "compat_flags": [], + "modules": [ + { + "name": "d2e03502220d42d7f65d990289a947213d6e1972-component.wasm", + "file": "tier1/string_ops/d2e03502220d42d7f65d990289a947213d6e1972-component.wasm", + "type": "application/wasm", + "sha256": "41f3243ee18bb9f4fcbaa417bd773347128dec2971132e240eddec19ba6a9da2" + } + ], + "requires": { + "kv": [], + "d1": [], + "ai": false, + "vars": { + "COMPONENT_ID": "string_ops" + } + }, + "bytes": 71642 + }, + { + "name": "arcrun-switch", + "tier": 1, + "main_file": "tier1/switch/index.js", + "main_module": "index.js", + "sha256": "9e2a023fbeae41e15d232de7f895538ab39dec3113bdac9737884383f92d576f", + "compat_date": "2025-02-19", + "compat_flags": [], + "modules": [ + { + "name": "1920d78cdde1384d775cbc6647957409cf185584-component.wasm", + "file": "tier1/switch/1920d78cdde1384d775cbc6647957409cf185584-component.wasm", + "type": "application/wasm", + "sha256": "6d993dc9b1affe16b600aaa7cae5af977108cc08513bb11d9d9db908285fea8b" + } + ], + "requires": { + "kv": [], + "d1": [], + "ai": false, + "vars": { + "COMPONENT_ID": "switch" + } + }, + "bytes": 71642 + }, + { + "name": "arcrun-try-catch", + "tier": 1, + "main_file": "tier1/try_catch/index.js", + "main_module": "index.js", + "sha256": "ed1ac75f0e73808e3a1ebd44e96faaac5ac5019b30fe66dec277ef7e1009ed1f", + "compat_date": "2025-02-19", + "compat_flags": [], + "modules": [ + { + "name": "6a99d0d167de81d14f89a86557dc913fd84af607-component.wasm", + "file": "tier1/try_catch/6a99d0d167de81d14f89a86557dc913fd84af607-component.wasm", + "type": "application/wasm", + "sha256": "10eaddc5ef0d3dc68e3f009970541ac7f5fce30dcdbecec9a333afd5a29e3486" + } + ], + "requires": { + "kv": [], + "d1": [], + "ai": false, + "vars": { + "COMPONENT_ID": "try_catch" + } + }, + "bytes": 71642 + }, + { + "name": "arcrun-validate-json", + "tier": 1, + "main_file": "tier1/validate_json/index.js", + "main_module": "index.js", + "sha256": "d8030654c65df195d7e0e23a6d366bace35711896c21d8eff9fae70f853f150e", + "compat_date": "2025-02-19", + "compat_flags": [], + "modules": [ + { + "name": "d0c376152f3b536223d350c5cd10609e89062211-component.wasm", + "file": "tier1/validate_json/d0c376152f3b536223d350c5cd10609e89062211-component.wasm", + "type": "application/wasm", + "sha256": "8142ffd3cc57efbb9128faaf450b646111b0f2e2575cc29a7b562a7b185912ab" + } + ], + "requires": { + "kv": [], + "d1": [], + "ai": false, + "vars": { + "COMPONENT_ID": "validate_json" + } + }, + "bytes": 71642 + }, + { + "name": "arcrun-wait", + "tier": 1, + "main_file": "tier1/wait/index.js", + "main_module": "index.js", + "sha256": "e596e83ac43525ea13940691571f56825e155d16d2ddbf54703a4efea63526ee", + "compat_date": "2025-02-19", + "compat_flags": [], + "modules": [ + { + "name": "7a79aab24cf9a299e7a22147080b3c7bdfe3493d-component.wasm", + "file": "tier1/wait/7a79aab24cf9a299e7a22147080b3c7bdfe3493d-component.wasm", + "type": "application/wasm", + "sha256": "52ca2d184bf3dcc646bb94f29f7f3e69b5540276363e83a54cb435ff33ca2f3c" + } + ], + "requires": { + "kv": [], + "d1": [], + "ai": false, + "vars": { + "COMPONENT_ID": "wait" + } + }, + "bytes": 71642 + }, + { + "name": "arcrun-registry", + "tier": 2, + "main_file": "tier2/registry/index.js", + "main_module": "index.js", + "sha256": "6e7c6239e03cedf1acd56cc5ef7c30acacab021c9833aa0c87e6909569b1785d", + "compat_date": "2025-02-19", + "compat_flags": [ + "nodejs_compat" + ], + "modules": [], + "requires": { + "kv": [ + "SUBMISSIONS_KV", + "ANALYTICS_KV" + ], + "d1": [], + "ai": true, + "vars": { + "ENVIRONMENT": "production" + } + }, + "stripped_services": [], + "bytes": 250971 + }, + { + "name": "arcrun-mcp", + "tier": 2, + "main_file": "tier2/mcp/index.js", + "main_module": "index.js", + "sha256": "65515d2f20647fca61a51df47437d2b088f83b8d6f227b3bb0d8ead2ebac9982", + "compat_date": "2024-11-27", + "compat_flags": [ + "nodejs_compat" + ], + "modules": [], + "requires": { + "kv": [ + "OAUTH_KV" + ], + "d1": [], + "ai": false, + "vars": {} + }, + "stripped_services": [ + "COMPONENT_REGISTRY", + "CYPHER_EXECUTOR", + "KBDB" + ], + "bytes": 1304459 + }, + { + "name": "arcrun-rag-ui", + "tier": 2, + "main_file": "tier2/ui/index.js", + "main_module": "index.js", + "sha256": "c5c09b0dad59da06f1f2e5a018b01e0cc2a3a96ec7bada996a61e962bc3ab672", + "compat_date": "2026-07-01", + "compat_flags": [], + "modules": [], + "requires": { + "kv": [], + "d1": [], + "ai": false, + "vars": {} + }, + "bytes": 496294 + } + ], + "daemon": { + "version": "v0.15.0", + "built": "20260729-2238", + "notes": "t149 多帳號同步修復+t150 版本一致性(collector 與 tray 同版)", + "mac": { + "file": "daemon/ArcrunRAG-mac-unsigned.zip", + "sha256": "2974c172440960924dbe089757ad0bf37f6288b86d83e39abd169a9966413d46" + }, + "win": { + "file": "daemon/ArcrunRAG-win-unsigned.zip", + "sha256": "1191af74b3c841536f08625d2449fa4add3e829c93d5cebc391da59e6f7e05a6" + } + }, + "release": "1.4.22", + "built_for": "oauth-installer-lazy-load", + "notes": [], + "fingerprint": "ba8f8044d99184392c997e0f6c92002139d3cda917ee89001caba96d0236500b" +} diff --git a/tier2/ui/index.js b/tier2/ui/index.js index 450a585..8a433a6 100644 --- a/tier2/ui/index.js +++ b/tier2/ui/index.js @@ -1,6 +1,6 @@ // arcrun-rag-ui — 用戶實例的 GUI(console-ui/public 內嵌;由 build-ui-bundle.mjs 產生,勿手改) -const FILES = {"/apple-touch-icon.png":{"type":"image/png","b64":true,"data":"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"},"/console/dashboard/index.html":{"type":"text/html; charset=utf-8","b64":false,"data":"\n\n\n\n\nArcrun 駕駛艙\n\n\n\n\n\n\n
\n
\n
Arcrun 駕駛艙
\n
\n
\n \n
\n
\n
\n
\n
\n
載入中
\n
\n
\n
\n
\n
\n
今日完成
\n
/
\n
\n
\n
\n
收件匣未處理
\n
\n
來自 Telegram
\n
\n
\n
\n
等你的事
\n
載入中…
\n
\n
\n
今日路線
\n \n
本週
\n \n
系統狀況live 健康信號
\n
載入中…
\n
每 60 秒自動刷新
\n 進入完整控制台 ›\n
\n\n\n\n"},"/console/index.html":{"type":"text/html; charset=utf-8","b64":false,"data":"\n\n\n\n\nArcrun Console\n\n\n\n\n\n\n\n\n
\n
\n
\n
Arcrun
\n
私人系統・僅供擁有者進入
\n
\n
\n \n \n \n
\n
\n
這是一個人的智慧總部。
若你不是擁有者,這裡沒有你要找的東西。
\n \n \n
\n
\n\n\n
\n
\n
\n
Arcrun
\n
首次設定
\n
系統偵測到尚未設定擁有者帳號。
設定一組 Email 與密碼,之後只有你能進入。
\n
\n
\n \n \n \n \n
\n
\n \n
\n
\n\n\n
\n
\n
Arcrun
\n \n
總庫搜尋
\n
工作流
\n \n
設定
\n
☾ 切深色
\n
\n
\n
\n\n \n
\n
Arcrun 控制台
\n
\n
\n
\n
\n
\n
載入中
\n
\n
\n
\n
\n
\n
今日完成
\n
/
\n
\n
\n
\n
收件匣未處理
\n
\n
來自 Telegram
\n
\n
\n
\n
等你的事
\n
載入中…
\n
\n
\n
\n
\n
\n 今日路線狀態即時同步\n
\n
  • 載入中…
\n
本週
\n
    \n
    每 60 秒自動刷新
    \n
    \n
    \n
    \n\n \n
    \n
    總庫搜尋
    \n
    \n
    \n
    \n 藏書地圖\n
    \n
    地圖載入中…
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n\n \n
    \n
    \n \n 知識卡片\n
    \n
    \n
    載入中…
    \n
    \n
    關聯視圖
    \n
    \n
    \n
    \n
    \n
    \n\n \n
    \n
    工作流
    \n \n
    載入中…
    \n
    \n
    零件與 Recipes(框架資源)
    \n
    \n \n \n
    \n
    \n
    \n
    \n\n \n
    \n
    憑證管理
    \n
    \n 🛡 保險箱原則:系統只保存目錄與加密後的值,任何頁面都看不到密文內容。只能整筆替換或刪除。\n
    \n
    \n
    新增憑證
    \n
    \n \n \n \n \n
    \n
    \n
    \n
    載入中…
    \n
    \n\n \n
    \n
    分流台全部待辦・80/15/5
    \n
    \n
    載入中…
    \n
    \n\n \n
    \n
    設定
    \n
    \n
    \n
    \n
    \n
    深色模式
    \n
    預設淺色(紙感)。切換立即生效,選擇記在這台裝置(localStorage)。
    \n
    \n
    \n
    \n
    \n
    \n \n
    語意搜尋
    \n
    狀態偵測中…
    \n
    \n
    \n
    \n
    MCP token 有效期(TTL)
    \n
    讀取中…
    \n
    \n 誠實佔位:此頁還不能改這個值——可調功能=Arcrun#19(設定頁改→存 KBDB→發 token 時讀)。實作前要調整請在部署端 env MCP_TOKEN_TTL(mcp worker)設定。\n
    \n
    \n
    \n
    更換帳號密碼
    \n
    需輸入舊密碼驗證身分
    \n
    \n \n \n \n \n
    \n
    \n
    \n \n
    \n
    系統資訊
    \n
    載入中…
    \n
    \n \n
    \n
    \n\n
    \n
    \n\n\n
    \n \n
    搜尋
    \n
    工作流
    \n \n
    設定
    \n
    \n\n
    \n\n\n\n\n"},"/favicon.ico":{"type":"image/x-icon","b64":true,"data":"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"},"/favicon.svg":{"type":"image/svg+xml","b64":false,"data":"arcrun icon"},"/index.html":{"type":"text/html; charset=utf-8","b64":false,"data":"\n\n\n\nArcrun RAG\n\n\n\n\n\n\n\n

    正在前往搜尋頁… 沒有自動跳轉請點這裡

    \n\n\n"},"/portal/index.html":{"type":"text/html; charset=utf-8","b64":false,"data":"\n\n\n\n\nArcrun Portal\n\n\n\n\n\n\n\n\n\n\n\n
    \n
    \n
    \n
    \"arc>run\" width=\"986\" height=\"176\">\"arc>run\" width=\"986\" height=\"176\">
    \n
    知識入口・Portal
    \n
    \n
    \n \n \n \n
    \n
    \n
    帳號由管理員發放。忘記密碼請聯絡管理員重設。
    \n \n
    \n
    \n\n\n
    \n
    \n
    \n
    \"arc>run\" width=\"986\" height=\"176\">\"arc>run\" width=\"986\" height=\"176\">
    \n
    歡迎!先建立你的帳號
    \n
    \n
    \n \n \n \n \n
    \n \n \n
    \n
    這組帳密就是之後登入知識庫用的,只需要設定這一次。
    \n
    \n
    \n\n\n
    \n
    \n
    \"arcrun\"\"arcrun\"
    \n
    搜尋
    \n
    總圖
    \n
    上傳
    \n
    工作流
    \n
    管理
    \n
    設定
    \n
    ☾ 切深色
    \n
    \n
    \n
    \n\n \n
    \n
    搜尋
    \n
    \n
    \n \n \n
    \n
    \n \n \n \n
    \n \n
    \n
    AI 問答・答案附出處,可回搜尋驗證
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n\n \n
    \n
    總圖
    \n
    \n
    \n
    \n 點節點可跳到該實體的圖譜搜尋。這張圖由知識庫的三元組即時算出——同一份地圖的文字版\n (給 AI 注入用的總庫目錄)。\n
    \n
    \n
    \n\n \n
    \n
    \n \n 知識卡片\n
    \n
    載入中…
    \n
    \n\n \n
    \n
    上傳Markdown / 純文字
    \n
    \n 上傳的文件會進入知識庫收件管線:約 1 分鐘後可在搜尋頁找到;AI 整理後會以 wiki 卡形式出現。支援 .md / .txt(一律以 .md 收件)。\n
    \n
    \n
    把 .md / .txt 檔案拖放到這裡
    \n
    \n \n \n
    \n
    \n
    \n\n \n
    \n
    工作流唯讀・系統狀態
    \n
    \n 此頁只顯示系統裡的工作流與最近執行狀態,不能觸發執行(觸發屬系統擁有者權限)。\n
    \n
    載入中…
    \n
    \n\n \n
    \n
    設定
    \n
    \n \n
    \n
    \n
    \n
    \n 版本\n \n
    \n
    查詢中…
    \n
    \n \n
    \n
    \n
    \n
    我的帳號
    \n
    載入中…
    \n
    \n
    \n
    \n
    \n
    深色模式
    \n
    預設淺色(紙感)。切換立即生效,選擇記在這台裝置。
    \n
    \n
    \n
    \n
    \n
    \n
    更改密碼
    \n
    需輸入舊密碼驗證身分;新密碼至少 8 碼
    \n
    \n \n \n \n \n
    \n
    \n
    \n \n
    \n \n
    \n 你的知識庫網址(小幫手連線用)\n \n \n
    \n
    同步小幫手
    \n
    把你電腦上的資料夾變成知識庫。換電腦或重裝時可以再下載一次。
    \n
    \n 下載 Mac 版\n
    封測版未簽章,第一次請右鍵→打開。裝好第一次開啟時,貼上這個網址+你的帳號密碼就連上了。
    \n
    \n
    \n \n
    \n
    AI 設定
    \n
    \n 這裡不需要任何設定。聊天問答用的是你自己 Cloudflare 帳號內建的 AI,裝好就能直接問。
    \n 文件整理成知識卡的部分,請在同步小幫手(電腦上的托盤圖示)的「AI 設定…」填一把 Gemini API Key。\n
    \n
    \n \n
    \n
    疑難排解
    \n
    搜尋或同步有問題時,可以匯出一份狀態檔給我們,幫你更快找到問題(只有統計數字,不含你的任何文件內容)。
    \n
    \n \n
    \n
    \n
    \n \n
    \n
    \n\n \n
    \n
    管理帳號與知識庫授權
    \n\n
    帳號管理
    \n
    \n
    新增同仁帳號
    \n
    建立後會產生一組一次性密碼——只顯示這一次,請當場轉交同仁(同仁可在「設定」自行改密)。
    \n
    \n \n \n \n \n
    \n
    \n
    \n
    \n
    載入中…
    \n\n
    庫目錄管理
    \n
    \n 你的知識庫網址(小幫手連線用)\n \n \n
    \n
    \n \n 裝好同步小幫手並選好要看守的資料夾之後,每個資料夾會自動成為一個「庫」出現在下面——不需要人工新增。下面還是空的,代表小幫手還沒裝好或還沒選資料夾。\n
    \n
    載入中…
    \n
    \n\n
    \n
    \n\n\n
    \n
    搜尋
    \n
    總圖
    \n
    上傳
    \n
    工作流
    \n
    管理
    \n
    設定
    \n
    \n\n
    \n\n\n\n"},"/portal/os-split.test.mjs":{"type":"application/javascript; charset=utf-8","b64":false,"data":"import fs from 'node:fs';\nconst html = fs.readFileSync(new URL('./index.html', import.meta.url).pathname,'utf8');\n// 抽出 daemonPick 相關函式(從 DAEMON_BASE_DEFAULT 到 daemonHint 結尾)\n//\n// 🔴 2026-08-05:結尾標記本來寫死 daemonHint 的**整句文案**,於是同日改 Mac 提示語\n// (zip→DMG 的步驟不同)就讓這支自測直接炸「抽不到函式區塊」,而且沒人發現。\n// ⇒ 改成錨定「函式結束」這個結構,不再綁文案——文案本來就會改,測試不該為此壞掉。\nconst start = html.indexOf('var DAEMON_BASE_DEFAULT');\nconst hintAt = html.indexOf('function daemonHint', start);\nconst endMark = '\\n }';\nconst end = hintAt < 0 ? -1 : html.indexOf(endMark, hintAt) + endMark.length;\nif (start < 0 || hintAt < 0 || end < start) throw new Error('抽不到函式區塊');\nconst src = html.slice(start, end);\n\nconst cases = [\n ['Windows', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120 Safari/537.36'],\n ['Mac', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 Safari/605.1.15'],\n ['iPhone', 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 Safari/604.1'],\n ['Linux', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 Chrome/120 Safari/537.36'],\n];\nlet pass=0, fail=0;\nconst chk=(l,c,extra='')=>{ if(c){console.log('PASS:',l);pass++;} else {console.log('FAIL:',l,extra);fail++;} };\n\nfor (const [name, ua] of cases) {\n const fn = new Function('navigator','window', src + '; return {daemonPick:daemonPick, daemonHint:daemonHint, daemonBase:daemonBase};');\n const api = fn({userAgent: ua}, {});\n const d = api.daemonPick();\n const label = d.sure ? d.pick.label : '(兩個都給)';\n const url = d.sure ? d.pick.url : d.mac.url + ' + ' + d.win.url;\n console.log(`\\n[${name}] sure=${d.sure} → ${label}`);\n console.log(` url: ${url}`);\n if (name==='Windows') {\n chk('Windows 給 win zip', d.sure && d.pick.url.endsWith('ArcrunRAG-win-unsigned.zip'), d.pick&&d.pick.url);\n chk('Windows 另一版是 Mac', d.other && d.other.url.endsWith('ArcrunRAG-mac.dmg'));\n chk('Windows 話術提 藍色視窗', api.daemonHint('win').includes('仍要執行'));\n }\n if (name==='Mac') {\n // 2026-08-05:Mac 一律給 DMG(拖進 Applications 的標準安裝畫面),不再給 zip\n // ——zip 解開就是一個裸 .app,使用者會直接在「下載」資料夾雙擊執行,自更新會蓋錯位置。\n chk('Mac 給 dmg(不是 zip)', d.sure && d.pick.url.endsWith('ArcrunRAG-mac.dmg'));\n chk('Mac 另一版是 Windows', d.other && d.other.url.endsWith('win-unsigned.zip'));\n chk('Mac 話術提 右鍵打開', api.daemonHint('mac').includes('右鍵'));\n }\n if (name==='iPhone' || name==='Linux') {\n // iPhone 含 \"Mac OS X\" 但不是桌機 Mac;Linux 兩者皆非 → 都該落在「不確定=兩個都給」\n if (name==='Linux') chk('Linux 判不出來→兩個都給', d.sure===false);\n if (name==='iPhone') chk('iPhone 不該被判成 Mac(手機→兩個都給)', d.sure===false, 'sure='+d.sure);\n }\n}\n// 舊 key 相容\nconst fn2 = new Function('navigator','window', src + '; return daemonBase();');\nconsole.log('\\n[相容] daemonDownload 舊 key →', fn2({userAgent:''},{ARCRUN_CONFIG:{daemonDownload:'https://x.dev/d/ArcrunRAG-mac-unsigned.zip'}}));\nchk('舊 key 推得出目錄', fn2({userAgent:''},{ARCRUN_CONFIG:{daemonDownload:'https://x.dev/d/ArcrunRAG-mac-unsigned.zip'}})==='https://x.dev/d/');\nchk('daemonBase 新 key 優先', fn2({userAgent:''},{ARCRUN_CONFIG:{daemonBase:'https://y.dev/z'}})==='https://y.dev/z/');\nconsole.log(`\\n=== ${pass} passed, ${fail} failed ===`);\nprocess.exit(fail?1:0);\n"},"/portal/safejson.test.mjs":{"type":"application/javascript; charset=utf-8","b64":false,"data":"import fs from 'node:fs';\nconst html = fs.readFileSync(new URL('./index.html', import.meta.url).pathname,'utf8');\n\n// 抽出 safeJson 與 friendlyErr 求值\nconst grab = (name) => {\n const i = html.indexOf(`function ${name}(`);\n if (i < 0) throw new Error(`找不到 ${name}`);\n let d=0, j=html.indexOf('{', i);\n for (let k=j;k{c?(console.log('PASS:',l),pass++):(console.log('FAIL:',l,e),fail++)};\n\n// ① safeJson:非 JSON 不可拋例外(同事撞到的 404 HTML 頁)\nconst html404 = '404 Not Found';\nawait fn.safeJson({ text: () => Promise.resolve(html404) })\n .then(d => t('404 HTML → 回空物件不拋錯', typeof d === 'object' && d !== null))\n .catch(e => t('404 HTML → 不該拋錯', false, e.message));\n\nawait fn.safeJson({ text: () => Promise.resolve('') })\n .then(d => t('空回應 → 回空物件', JSON.stringify(d)==='{}'))\n .catch(() => t('空回應 → 不該拋錯', false));\n\nawait fn.safeJson({ text: () => Promise.resolve('{\"error\":\"帳號或密碼不對\"}') })\n .then(d => t('正常 JSON 仍要解析得出來', d.error === '帳號或密碼不對'), )\n .catch(() => t('正常 JSON 不該拋錯', false));\n\n// ② friendlyErr:不可把技術訊息噴給使用者\nconst leak = fn.friendlyErr(new Error('Unexpected non-whitespace character after JSON at position 4'));\nt('JSON 錯誤 → 不外洩原文', !/JSON|position/i.test(leak), `實得: ${leak}`);\nt('JSON 錯誤 → 說人話', /伺服器回應異常/.test(leak), `實得: ${leak}`);\n\nconst net = fn.friendlyErr(new Error('Failed to fetch'));\nt('網路錯誤 → 既有訊息保留', /連線中斷/.test(net), `實得: ${net}`);\n\nconst ours = fn.friendlyErr(new Error('帳號或密碼不對——用你在知識庫網站設定的那組'));\nt('我們自己的中文訊息 → 原樣顯示', /帳號或密碼不對/.test(ours), `實得: ${ours}`);\n\nconst stack = fn.friendlyErr(new Error('TypeError: Cannot read properties of undefined'));\nt('英文技術訊息 → 收斂不外洩', !/TypeError|undefined/.test(stack), `實得: ${stack}`);\n\nconsole.log(`\\n=== ${pass} passed, ${fail} failed ===`);\nprocess.exit(fail?1:0);\n"}}; -const UI_FINGERPRINT = "24b136c5f4c9f892ba895fd6c0dc0abde67b88a1d58b63d959bf273b85713eb1"; +const FILES = {"/apple-touch-icon.png":{"type":"image/png","b64":true,"data":"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"},"/console/dashboard/index.html":{"type":"text/html; charset=utf-8","b64":false,"data":"\n\n\n\n\nArcrun 駕駛艙\n\n\n\n\n\n\n
    \n
    \n
    Arcrun 駕駛艙
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    載入中
    \n
    \n
    \n
    \n
    \n
    \n
    今日完成
    \n
    /
    \n
    \n
    \n
    \n
    收件匣未處理
    \n
    \n
    來自 Telegram
    \n
    \n
    \n
    \n
    等你的事
    \n
    載入中…
    \n
    \n
    \n
    今日路線
    \n \n
    本週
    \n \n
    系統狀況live 健康信號
    \n
    載入中…
    \n
    每 60 秒自動刷新
    \n 進入完整控制台 ›\n
    \n\n\n\n"},"/console/index.html":{"type":"text/html; charset=utf-8","b64":false,"data":"\n\n\n\n\nArcrun Console\n\n\n\n\n\n\n\n\n
    \n
    \n
    \n
    Arcrun
    \n
    私人系統・僅供擁有者進入
    \n
    \n
    \n \n \n \n
    \n
    \n
    這是一個人的智慧總部。
    若你不是擁有者,這裡沒有你要找的東西。
    \n \n \n
    \n
    \n\n\n
    \n
    \n
    \n
    Arcrun
    \n
    首次設定
    \n
    系統偵測到尚未設定擁有者帳號。
    設定一組 Email 與密碼,之後只有你能進入。
    \n
    \n
    \n \n \n \n \n
    \n
    \n \n
    \n
    \n\n\n
    \n
    \n
    Arcrun
    \n \n
    總庫搜尋
    \n
    工作流
    \n \n
    設定
    \n
    ☾ 切深色
    \n
    \n
    \n
    \n\n \n
    \n
    Arcrun 控制台
    \n
    \n
    \n
    \n
    \n
    \n
    載入中
    \n
    \n
    \n
    \n
    \n
    \n
    今日完成
    \n
    /
    \n
    \n
    \n
    \n
    收件匣未處理
    \n
    \n
    來自 Telegram
    \n
    \n
    \n
    \n
    等你的事
    \n
    載入中…
    \n
    \n
    \n
    \n
    \n
    \n 今日路線狀態即時同步\n
    \n
    • 載入中…
    \n
    本週
    \n
      \n
      每 60 秒自動刷新
      \n
      \n
      \n
      \n\n \n
      \n
      總庫搜尋
      \n
      \n
      \n
      \n 藏書地圖\n
      \n
      地圖載入中…
      \n
      \n
      \n
      \n \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n\n \n
      \n
      \n \n 知識卡片\n
      \n
      \n
      載入中…
      \n
      \n
      關聯視圖
      \n
      \n
      \n
      \n
      \n
      \n\n \n
      \n
      工作流
      \n \n
      載入中…
      \n
      \n
      零件與 Recipes(框架資源)
      \n
      \n \n \n
      \n
      \n
      \n
      \n\n \n
      \n
      憑證管理
      \n
      \n 🛡 保險箱原則:系統只保存目錄與加密後的值,任何頁面都看不到密文內容。只能整筆替換或刪除。\n
      \n
      \n
      新增憑證
      \n
      \n \n \n \n \n
      \n
      \n
      \n
      載入中…
      \n
      \n\n \n
      \n
      分流台全部待辦・80/15/5
      \n
      \n
      載入中…
      \n
      \n\n \n
      \n
      設定
      \n
      \n
      \n
      \n
      \n
      深色模式
      \n
      預設淺色(紙感)。切換立即生效,選擇記在這台裝置(localStorage)。
      \n
      \n
      \n
      \n
      \n
      \n \n
      語意搜尋
      \n
      狀態偵測中…
      \n
      \n
      \n
      \n
      MCP token 有效期(TTL)
      \n
      讀取中…
      \n
      \n 誠實佔位:此頁還不能改這個值——可調功能=Arcrun#19(設定頁改→存 KBDB→發 token 時讀)。實作前要調整請在部署端 env MCP_TOKEN_TTL(mcp worker)設定。\n
      \n
      \n
      \n
      更換帳號密碼
      \n
      需輸入舊密碼驗證身分
      \n
      \n \n \n \n \n
      \n
      \n
      \n \n
      \n
      系統資訊
      \n
      載入中…
      \n
      \n \n
      \n
      \n\n
      \n
      \n\n\n
      \n \n
      搜尋
      \n
      工作流
      \n \n
      設定
      \n
      \n\n
      \n\n\n\n\n"},"/favicon.ico":{"type":"image/x-icon","b64":true,"data":"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"},"/favicon.svg":{"type":"image/svg+xml","b64":false,"data":"arcrun icon"},"/index.html":{"type":"text/html; charset=utf-8","b64":false,"data":"\n\n\n\nArcrun RAG\n\n\n\n\n\n\n\n

      正在前往搜尋頁… 沒有自動跳轉請點這裡

      \n\n\n"},"/portal/index.html":{"type":"text/html; charset=utf-8","b64":false,"data":"\n\n\n\n\nArcrun Portal\n\n\n\n\n\n\n\n\n\n\n\n
      \n
      \n
      \n
      \"arc>run\" width=\"986\" height=\"176\">\"arc>run\" width=\"986\" height=\"176\">
      \n
      知識入口・Portal
      \n
      \n
      \n \n \n \n
      \n
      \n
      帳號由管理員發放。忘記密碼請聯絡管理員重設。
      \n \n
      \n
      \n\n\n
      \n
      \n
      \n
      \"arc>run\" width=\"986\" height=\"176\">\"arc>run\" width=\"986\" height=\"176\">
      \n
      歡迎!先建立你的帳號
      \n
      \n
      \n \n \n \n \n
      \n \n \n
      \n
      這組帳密就是之後登入知識庫用的,只需要設定這一次。
      \n
      \n
      \n\n\n
      \n
      \n
      \"arcrun\"\"arcrun\"
      \n
      搜尋
      \n
      總圖
      \n
      上傳
      \n
      工作流
      \n
      管理
      \n
      設定
      \n
      ☾ 切深色
      \n
      \n
      \n
      \n\n \n
      \n
      搜尋
      \n
      \n
      \n \n \n
      \n
      \n \n \n \n
      \n \n
      \n
      AI 問答・答案附出處,可回搜尋驗證
      \n
      \n \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n\n \n
      \n
      總圖
      \n
      \n
      \n
      \n 點節點可跳到該實體的圖譜搜尋。這張圖由知識庫的三元組即時算出——同一份地圖的文字版\n (給 AI 注入用的總庫目錄)。\n
      \n
      \n
      \n\n \n
      \n
      \n \n 知識卡片\n
      \n
      載入中…
      \n
      \n\n \n
      \n
      上傳Markdown / 純文字
      \n
      \n 上傳的文件會進入知識庫收件管線:約 1 分鐘後可在搜尋頁找到;AI 整理後會以 wiki 卡形式出現。支援 .md / .txt(一律以 .md 收件)。\n
      \n
      \n
      把 .md / .txt 檔案拖放到這裡
      \n
      \n \n \n
      \n
      \n
      \n\n \n
      \n
      工作流唯讀・系統狀態
      \n
      \n 此頁只顯示系統裡的工作流與最近執行狀態,不能觸發執行(觸發屬系統擁有者權限)。\n
      \n
      載入中…
      \n
      \n\n \n
      \n
      設定
      \n
      \n \n
      \n
      \n
      \n
      \n 版本\n \n
      \n
      查詢中…
      \n
      \n \n
      \n
      \n
      \n
      我的帳號
      \n
      載入中…
      \n
      \n
      \n
      \n
      \n
      深色模式
      \n
      預設淺色(紙感)。切換立即生效,選擇記在這台裝置。
      \n
      \n
      \n
      \n
      \n
      \n
      更改密碼
      \n
      需輸入舊密碼驗證身分;新密碼至少 8 碼
      \n
      \n \n \n \n \n
      \n
      \n
      \n \n
      \n \n
      \n 你的知識庫網址(小幫手連線用)\n \n \n
      \n
      同步小幫手
      \n
      把你電腦上的資料夾變成知識庫。換電腦或重裝時可以再下載一次。
      \n
      \n 下載 Mac 版\n
      封測版未簽章,第一次請右鍵→打開。裝好第一次開啟時,貼上這個網址+你的帳號密碼就連上了。
      \n
      \n
      \n \n
      \n
      AI 設定
      \n
      \n 這裡不需要任何設定。聊天問答用的是你自己 Cloudflare 帳號內建的 AI,裝好就能直接問。
      \n 文件整理成知識卡的部分,請在同步小幫手(電腦上的托盤圖示)的「AI 設定…」填一把 Gemini API Key。\n
      \n
      \n \n
      \n
      疑難排解
      \n
      這裡只看得到雲端這半,完整診斷請到你電腦上的 Arcrun 匯出。同步小幫手完全連不上時,才用下面這顆備用(只有統計數字,不含你的任何文件內容)。
      \n
      \n \n
      \n
      \n
      \n \n
      \n
      \n\n \n
      \n
      管理帳號與知識庫授權
      \n\n
      帳號管理
      \n
      \n
      新增同仁帳號
      \n
      建立後會產生一組一次性密碼——只顯示這一次,請當場轉交同仁(同仁可在「設定」自行改密)。
      \n
      \n \n \n \n \n
      \n
      \n
      \n
      \n
      載入中…
      \n\n
      庫目錄管理
      \n
      \n 你的知識庫網址(小幫手連線用)\n \n \n
      \n
      \n \n 裝好同步小幫手並選好要看守的資料夾之後,每個資料夾會自動成為一個「庫」出現在下面——不需要人工新增。下面還是空的,代表小幫手還沒裝好或還沒選資料夾。\n
      \n
      載入中…
      \n
      \n\n
      \n
      \n\n\n
      \n
      搜尋
      \n
      總圖
      \n
      上傳
      \n
      工作流
      \n
      管理
      \n
      設定
      \n
      \n\n
      \n\n\n\n"},"/portal/os-split.test.mjs":{"type":"application/javascript; charset=utf-8","b64":false,"data":"import fs from 'node:fs';\nconst html = fs.readFileSync(new URL('./index.html', import.meta.url).pathname,'utf8');\n// 抽出 daemonPick 相關函式(從 DAEMON_BASE_DEFAULT 到 daemonHint 結尾)\n//\n// 🔴 2026-08-05:結尾標記本來寫死 daemonHint 的**整句文案**,於是同日改 Mac 提示語\n// (zip→DMG 的步驟不同)就讓這支自測直接炸「抽不到函式區塊」,而且沒人發現。\n// ⇒ 改成錨定「函式結束」這個結構,不再綁文案——文案本來就會改,測試不該為此壞掉。\nconst start = html.indexOf('var DAEMON_BASE_DEFAULT');\nconst hintAt = html.indexOf('function daemonHint', start);\nconst endMark = '\\n }';\nconst end = hintAt < 0 ? -1 : html.indexOf(endMark, hintAt) + endMark.length;\nif (start < 0 || hintAt < 0 || end < start) throw new Error('抽不到函式區塊');\nconst src = html.slice(start, end);\n\nconst cases = [\n ['Windows', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120 Safari/537.36'],\n ['Mac', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 Safari/605.1.15'],\n ['iPhone', 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 Safari/604.1'],\n ['Linux', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 Chrome/120 Safari/537.36'],\n];\nlet pass=0, fail=0;\nconst chk=(l,c,extra='')=>{ if(c){console.log('PASS:',l);pass++;} else {console.log('FAIL:',l,extra);fail++;} };\n\nfor (const [name, ua] of cases) {\n const fn = new Function('navigator','window', src + '; return {daemonPick:daemonPick, daemonHint:daemonHint, daemonBase:daemonBase};');\n const api = fn({userAgent: ua}, {});\n const d = api.daemonPick();\n const label = d.sure ? d.pick.label : '(兩個都給)';\n const url = d.sure ? d.pick.url : d.mac.url + ' + ' + d.win.url;\n console.log(`\\n[${name}] sure=${d.sure} → ${label}`);\n console.log(` url: ${url}`);\n if (name==='Windows') {\n chk('Windows 給 win zip', d.sure && d.pick.url.endsWith('ArcrunRAG-win-unsigned.zip'), d.pick&&d.pick.url);\n chk('Windows 另一版是 Mac', d.other && d.other.url.endsWith('ArcrunRAG-mac.dmg'));\n chk('Windows 話術提 藍色視窗', api.daemonHint('win').includes('仍要執行'));\n }\n if (name==='Mac') {\n // 2026-08-05:Mac 一律給 DMG(拖進 Applications 的標準安裝畫面),不再給 zip\n // ——zip 解開就是一個裸 .app,使用者會直接在「下載」資料夾雙擊執行,自更新會蓋錯位置。\n chk('Mac 給 dmg(不是 zip)', d.sure && d.pick.url.endsWith('ArcrunRAG-mac.dmg'));\n chk('Mac 另一版是 Windows', d.other && d.other.url.endsWith('win-unsigned.zip'));\n chk('Mac 話術提 右鍵打開', api.daemonHint('mac').includes('右鍵'));\n }\n if (name==='iPhone' || name==='Linux') {\n // iPhone 含 \"Mac OS X\" 但不是桌機 Mac;Linux 兩者皆非 → 都該落在「不確定=兩個都給」\n if (name==='Linux') chk('Linux 判不出來→兩個都給', d.sure===false);\n if (name==='iPhone') chk('iPhone 不該被判成 Mac(手機→兩個都給)', d.sure===false, 'sure='+d.sure);\n }\n}\n// 舊 key 相容\nconst fn2 = new Function('navigator','window', src + '; return daemonBase();');\nconsole.log('\\n[相容] daemonDownload 舊 key →', fn2({userAgent:''},{ARCRUN_CONFIG:{daemonDownload:'https://x.dev/d/ArcrunRAG-mac-unsigned.zip'}}));\nchk('舊 key 推得出目錄', fn2({userAgent:''},{ARCRUN_CONFIG:{daemonDownload:'https://x.dev/d/ArcrunRAG-mac-unsigned.zip'}})==='https://x.dev/d/');\nchk('daemonBase 新 key 優先', fn2({userAgent:''},{ARCRUN_CONFIG:{daemonBase:'https://y.dev/z'}})==='https://y.dev/z/');\nconsole.log(`\\n=== ${pass} passed, ${fail} failed ===`);\nprocess.exit(fail?1:0);\n"},"/portal/safejson.test.mjs":{"type":"application/javascript; charset=utf-8","b64":false,"data":"import fs from 'node:fs';\nconst html = fs.readFileSync(new URL('./index.html', import.meta.url).pathname,'utf8');\n\n// 抽出 safeJson 與 friendlyErr 求值\nconst grab = (name) => {\n const i = html.indexOf(`function ${name}(`);\n if (i < 0) throw new Error(`找不到 ${name}`);\n let d=0, j=html.indexOf('{', i);\n for (let k=j;k{c?(console.log('PASS:',l),pass++):(console.log('FAIL:',l,e),fail++)};\n\n// ① safeJson:非 JSON 不可拋例外(同事撞到的 404 HTML 頁)\nconst html404 = '404 Not Found';\nawait fn.safeJson({ text: () => Promise.resolve(html404) })\n .then(d => t('404 HTML → 回空物件不拋錯', typeof d === 'object' && d !== null))\n .catch(e => t('404 HTML → 不該拋錯', false, e.message));\n\nawait fn.safeJson({ text: () => Promise.resolve('') })\n .then(d => t('空回應 → 回空物件', JSON.stringify(d)==='{}'))\n .catch(() => t('空回應 → 不該拋錯', false));\n\nawait fn.safeJson({ text: () => Promise.resolve('{\"error\":\"帳號或密碼不對\"}') })\n .then(d => t('正常 JSON 仍要解析得出來', d.error === '帳號或密碼不對'), )\n .catch(() => t('正常 JSON 不該拋錯', false));\n\n// ② friendlyErr:不可把技術訊息噴給使用者\nconst leak = fn.friendlyErr(new Error('Unexpected non-whitespace character after JSON at position 4'));\nt('JSON 錯誤 → 不外洩原文', !/JSON|position/i.test(leak), `實得: ${leak}`);\nt('JSON 錯誤 → 說人話', /伺服器回應異常/.test(leak), `實得: ${leak}`);\n\nconst net = fn.friendlyErr(new Error('Failed to fetch'));\nt('網路錯誤 → 既有訊息保留', /連線中斷/.test(net), `實得: ${net}`);\n\nconst ours = fn.friendlyErr(new Error('帳號或密碼不對——用你在知識庫網站設定的那組'));\nt('我們自己的中文訊息 → 原樣顯示', /帳號或密碼不對/.test(ours), `實得: ${ours}`);\n\nconst stack = fn.friendlyErr(new Error('TypeError: Cannot read properties of undefined'));\nt('英文技術訊息 → 收斂不外洩', !/TypeError|undefined/.test(stack), `實得: ${stack}`);\n\nconsole.log(`\\n=== ${pass} passed, ${fail} failed ===`);\nprocess.exit(fail?1:0);\n"}}; +const UI_FINGERPRINT = "c75afbacec44d6d7f4b765e66c071e57c82a0e7585cf7f02038218324bd45f41"; function b64ToBytes(b64) { const bin = atob(b64); const a = new Uint8Array(bin.length); for (let i = 0; i < bin.length; i++) a[i] = bin.charCodeAt(i); return a; } export default { async fetch(request, env) {