From 4ba73815bf56951f5415d045ce6d438c52e3a54d Mon Sep 17 00:00:00 2001 From: richblack Date: Fri, 7 Aug 2026 18:55:36 +0800 Subject: [PATCH] =?UTF-8?q?staging=201.4.18=EF=BC=9A=E6=AA=A2=E4=BF=AE?= =?UTF-8?q?=E5=AD=94=E6=8C=89=E9=88=95=E9=80=B2=20UI=20bundle=EF=BC=88Osca?= =?UTF-8?q?r=20=E6=8C=89=E5=BE=97=E5=88=B0=E4=BA=86=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit build-ui-bundle.mjs 把 console-ui/public 重打進 tier2/ui/index.js。 複驗(grep 產物,不假設): 「匯出診斷檔給我們看」 1 處 createObjectURL 1 處(按一下下載一個 JSON 檔) /portal/data/diagnostics 3 處 owner_id 外露 0 處 背景:build-bundles.mjs 只打 4 顆核心(cypher/kbdb/http_request/code), UI 屬「沿用非本腳本產的 20 顆」不重打 => 只跑 build-bundles 的話 檢修孔前端永遠送不出去。這支要另外跑。 --- manifest.json | 1376 ++++++++++++++++++++++----------------------- tier2/ui/index.js | 15 +- 2 files changed, 701 insertions(+), 690 deletions(-) diff --git a/manifest.json b/manifest.json index 2d0458f..a20a72e 100644 --- a/manifest.json +++ b/manifest.json @@ -1,691 +1,691 @@ { - "schema": 1, - "built": "2026-08-07", - "source": "Arcrun@5388f40", - "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": 115858, - "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": "c0fb948c2b207898ca64b16d6c934ae2601c5a6f3104320558ca69d35e422cb1", - "bytes": 115858 - }, - { - "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": "1a295abca7f1a499a593863d171c20aafb8825734fc09f6a34948cb0b6f21130", - "compat_date": "2026-07-01", - "compat_flags": [], - "modules": [], - "requires": { - "kv": [], - "d1": [], - "ai": false, - "vars": {} - }, - "bytes": 250141 - } - ], - "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-07", + "source": "Arcrun@5388f40", + "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 }, - "release": "1.4.17", - "built_for": "oauth-installer-lazy-load", - "notes": [], - "fingerprint": "a607001ccafa9363fc7aba400820b7bd9976d16ea25053d91be9909760b90a44" -} \ No newline at end of file + { + "name": "arcrun-kbdb", + "canonical": null, + "main_module": "worker.mjs", + "main_file": "arcrun-kbdb/worker.mjs", + "js_bytes": 115858, + "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": "c0fb948c2b207898ca64b16d6c934ae2601c5a6f3104320558ca69d35e422cb1", + "bytes": 115858 + }, + { + "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": "e834295e5d4f50c4fe5f6a3fe66ca3c01ad14b1175a0d6f2f5167cdfa4f66543", + "compat_date": "2026-07-01", + "compat_flags": [], + "modules": [], + "requires": { + "kv": [], + "d1": [], + "ai": false, + "vars": {} + }, + "bytes": 493891 + } + ], + "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.18", + "built_for": "oauth-installer-lazy-load", + "notes": [], + "fingerprint": "48e31efa35fa2c9c782a81d6ab5f80ecef078feb95791f37ad97bca8e8e1ae31" +} diff --git a/tier2/ui/index.js b/tier2/ui/index.js index 5dcabf0..935781b 100644 --- a/tier2/ui/index.js +++ b/tier2/ui/index.js @@ -1,10 +1,21 @@ -// arcrun-rag-ui — 用戶實例的 GUI(console-ui/public 內嵌;t20④d-2 由 build-ui-bundle.mjs 產生,勿手改) -const FILES = {"/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"},"/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
    Arcrun
    \n
    知識入口・Portal
    \n
    \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
    \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
    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
    需輸入舊密碼驗證身分;新密碼至少 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 \n
    \n
    Gemini API Key
    \n
    聊天問答與文件萃取都用這一把。免費申請,金鑰只存在你自己的知識庫裡。
    \n \n
    \n \n 已輸入(金鑰已安全保存,不顯示內容)\n \n \n
    \n \n
    \n \n
    \n
    讓知識卡整理得更好(選填)
    \n \n
    \n 讀你文件、整理成知識卡的那個 AI,換成更強的模型。卡片會更抓得到重點、關聯也連得更準,之後搜尋和問答的品質跟著提升。需要你的電腦已安裝 Claude Code。不填就用上面那把 Gemini,一樣能用。\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 結尾)\nconst start = html.indexOf('var DAEMON_BASE_DEFAULT');\nconst endMark = \"return '(封測版未簽章,第一次請右鍵→打開)';\\n }\";\nconst end = html.indexOf(endMark) + endMark.length;\nif (start < 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('mac-unsigned.zip'));\n chk('Windows 話術提 藍色視窗', api.daemonHint('win').includes('仍要執行'));\n }\n if (name==='Mac') {\n chk('Mac 給 mac zip', d.sure && d.pick.url.endsWith('ArcrunRAG-mac-unsigned.zip'));\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"}}; +// 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 = "77de1380c5df57aaa818ad5c8acf44534b0801a9cec0484b9a89e1dc37c17161"; 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) { const url = new URL(request.url); let p = url.pathname; + // 🔴 UI 自報版本(安裝器據此判斷要不要重推,取代「猜 favicon 特徵」)。 + // 比照 cypher 的 /health。舊世代的 UI 沒有這條路由 ⇒ SPA fallback 回 HTML + // ⇒ 安裝器解析 JSON 失敗=判定為舊版=重推。**天然向後相容,不需額外世代判斷。** + // bundle_version 由安裝器以 ARCRUN_BUNDLE_VERSION 注入(cypher /health 同一個值); + // 沒注入就回空字串,安裝器那端把空值一律當「舊的」處理。 + if (p === '/__version') { + return new Response(JSON.stringify({ ok: true, ui_fingerprint: UI_FINGERPRINT, bundle_version: env.ARCRUN_BUNDLE_VERSION || '' }), { + headers: { 'content-type': 'application/json; charset=utf-8', 'cache-control': 'no-store' }, + }); + } // config.js 動態產生:apiBase 指向同帳號的 cypher(WORKER_SUBDOMAIN 由安裝器注入) if (p === '/config.js') { const sub = env.WORKER_SUBDOMAIN || '';