797e7f751c
leo 被鎖在自己的系統外面:1.4.35 已出 prod,「忘記密碼」畫面在線上,但按下去回 503「這台實例還沒有設定寄信服務」。根因在 products/arcrun-rag 的安裝器—— `grep -rn PORTAL_MAIL_RELAY installer/` 是零命中,即使 landing 那半(郵差) D62 已經寫好。這個 repo 這邊改兩件配合修: - /health 多回 `mail_relay_configured`(布林,不洩漏網址)——安裝器判斷「要不要 重推」只比 bundle_version,但這個 var 是這次才第一次被注入,跟版本號無關; 純比版本號的話,已經在最新版的實例(如 leo 那台)永遠不會因為「按更新」而 重推,這個 var 永遠補不進去。安裝器那邊會讀這個欄位決定要不要強制重推。 - portal.ts 的 503 訊息改白話(不提「實例」)+給一條使用者自己走得完的路 (重新執行安裝/更新),不再說「請管理員幫你改密碼」——單人使用者的管理員 就是他自己,那是死路(同源病灶:arcrun-rag#25)。 安裝器那半的修法(PORTAL_MAIL_RELAY_BASE 注入+stale 判斷)在 products/arcrun-rag 同批修(installer/oauth-prototype/worker.js)。 測試:cypher-executor `npx vitest run tests/portal-auth.test.ts tests/health.test.ts` 37/37 綠(35+2,既有測試無回歸;本次未新增測試——改動是訊息文案與健康檢查欄位, 行為已由既有測試覆蓋的路徑保護)。
40 lines
2.3 KiB
TypeScript
40 lines
2.3 KiB
TypeScript
import { Hono } from 'hono';
|
||
import type { Bindings } from '../types';
|
||
import { authStoreStatus } from '../lib/portal-auth-store';
|
||
|
||
export const healthRouter = new Hono<{ Bindings: Bindings }>();
|
||
|
||
// t162(leo 07-31 實撞:「小幫手一直顯示知識庫需要更新…重新更新後並不會消失」):
|
||
// daemon cloudVersionStale() 讀 /health 的 `bundle_version` 判斷是否過舊——
|
||
// 但本端點過去只回 {ok:true},**從沒吐這個欄位** ⇒ daemon 恆讀到空字串
|
||
// ⇒ 恆判 stale ⇒ 假警報永遠不消失(安裝器其實一直有注入 ARCRUN_BUNDLE_VERSION var,
|
||
// 只是沒有人把它吐出來)。修=誠實回報本實例的 bundle 版本。
|
||
// 未注入(本地 dev/很舊的實例)就省略該欄——daemon 對空字串仍判 stale,
|
||
// 那是**正確的**(真的是老實例,該更新)。
|
||
// D61(ADR D61 / Leo/arcrun-rag#55):多吐一個 `auth_store`——「認證住哪、寫不寫得進去」
|
||
// 要在實例自己這一側就看得出來,不是等用戶登不進去才發現(#10「寧可明顯失敗」)。
|
||
// 只回統計不回內容(帳號數/有沒有 console 帳密/分片數),不洩漏任何 email 或雜湊。
|
||
// bundle_version 的既有行為不動(未注入就省略該欄——daemon 對空字串判 stale 是正確的)。
|
||
healthRouter.get('/health', (c) => {
|
||
const bundleVersion = c.env.ARCRUN_BUNDLE_VERSION;
|
||
return c.json({
|
||
ok: true,
|
||
...(bundleVersion ? { bundle_version: bundleVersion } : {}),
|
||
auth_store: authStoreStatus(c.env),
|
||
// arcrun-rag#38/#69/#25(2026-08-11):安裝器判斷「要不要重推」只比 bundle_version——
|
||
// 但這次要修的洞是「installer 從沒注入過 PORTAL_MAIL_RELAY_BASE」,跟 bundle 內容
|
||
// 版本無關(同一個 cypher 版本,有的實例有這個 var、有的沒有)。純比版本號的話,
|
||
// 已經在最新版的實例(如 leo 自己那台)永遠不會因為「按更新」而重推,這個 var
|
||
// 就永遠補不進去。只回布林(有沒有設,不回值本身)——不洩漏郵差網址。
|
||
mail_relay_configured: Boolean(String(c.env.PORTAL_MAIL_RELAY_BASE ?? '').trim()),
|
||
});
|
||
});
|
||
|
||
healthRouter.get('/', (c) =>
|
||
c.json({
|
||
service: 'arcrun-cypher-executor',
|
||
version: '1.0.0',
|
||
status: 'ok',
|
||
})
|
||
);
|