Merge remote-tracking branch 'origin/main' into fix/pg-boolean-columns

This commit is contained in:
2026-10-05 05:04:33 +00:00
18 changed files with 455 additions and 31 deletions
@@ -0,0 +1,33 @@
# feature/contrast-typography 任务卡
任务主记录:PR #198 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/198(merge cf998fe89b);状态:已完成(回填);owner:weichen
## 基线与授权
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 34e82d53c1716f0075d510a5f7b6d72dd3fc9912
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-contrast-typography(worktree);分支:feature/contrast-typography
- 授权与交付终点:实现对比度与字号治理(令牌、contrast-guard、DESIGN.md、消费端迁移、本机界面字号)。不改 Core 契约,不改后端 settings schema,不做 px→rem / prefers-contrast / 聚焦环加强。交付为 UI、Frontend、Dev 各一个 PR。
## 目标与非目标
- 目标:三套主题的正文与文字档对比度 ≥ 4.5:1,装饰 faint 与图形语义色 ≥ 3:1;墨绿侧栏强调色与「新建任务」按钮可见;表头与决策性文字不再使用 faint + 10px;设置中心可调界面字号(13/14/16/18,仅本机)。
- 非目标:账号级字号同步、rem 标尺、高对比媒体查询、聚焦环重做。
## 同步记录
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|---|---|---|---|
| 启动 | 34e82d53c1716f0075d510a5f7b6d72dd3fc9912 | 34e82d53c1716f0075d510a5f7b6d72dd3fc9912 | 2026-10-05T04:25:22Z |
## 结果与验证
- 结果:三套主题的正文与文字档达到 4.5:1,装饰 faint 与图形语义色达到 3:1。墨绿侧栏的强调色与「新建任务」按钮分开用浅色令牌。设置中心可调本机界面字号(13/14/16/18)。
- 验证:Dev 仓 `make test` 退出码 0(2026-10-05)。其中 frontend vitest 17 文件 81 项、knip 43 <= 43;ui vitest 14 文件 103 项(含 contrast-guard)、tsc、knip 55 <= 55。浏览器在 Vite(127.0.0.1:5175)上核对计算样式:墨绿新建任务按钮为 #e9f0f6 / #082d4f,active 图标为 #8fd4b4,表头无 uppercase 且走 --text-dim;`--ui-font-size: 18px` 时 xs 为 calc(18px - 3px)。后端 8787 未启动,设置弹窗本身没有点开。
- 影响与剩余项:px→rem、prefers-contrast、聚焦环不在本次。子仓 PR 合入后 Dev 的 gitlink 才指向已合入提交。
| 同步前验收 | 34e82d53c1716f0075d510a5f7b6d72dd3fc9912 | 17b502e5c0332607793a32240ae7c68ccf97915c | 2026-10-05T04:39:43Z |
## 闭合记录(card-autoclose 回填)
- 依据:merge cf998fe89b2d44e673fd91d55038eb02c5806da5(PR #198)已包含于 origin/main,分支成果已落盘;本段为合入后回填。
- 合并主题:Merge pull request 'Pair the contrast rules with the token change' (#198) from feature/contrast-typography into main
- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。
@@ -0,0 +1,34 @@
# feature/docx-paper-preview 任务卡
任务主记录:https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/196 ;状态:已完成(回填);owner:weichen
## 基线与授权
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= eaae87e635ce31570159637cfe400f099b4daf5b
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-docx-paper-preview(worktree);分支:feature/docx-paper-preview
- 授权与交付终点:实现 docx 纸面原貌预览(令牌、样式、栏宽缩放、测试、浏览器核对、子仓与 Dev PR)。合入 main 与 task-finish 等所有者合入后执行。不改写历史、不改分支保护、不发布版本。
## 目标与非目标
- 目标:docx 预览固定白纸黑字,保留文档自带样式,窄预览栏整页等比缩小,全屏栏宽足够时保持 100%。
- 受影响:`DESIGN.md`;UI 仓 tokens/ui.css/FilePreview;Frontend 仓 styles.css、previewsetup、previewfit。
- 非目标:mammoth 与伪 docx 文本回退仍走主题化 `.doc-viewer`;不改 `renderAsync` 的分页选项;不改 xlsx/pptx 的解析路径。
## 同步记录
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|---|---|---|---|
| 启动 | eaae87e635ce31570159637cfe400f099b4daf5b | eaae87e635ce31570159637cfe400f099b4daf5b | 2026-10-05T03:54:31Z |
| 同步前验收 | eaae87e635ce31570159637cfe400f099b4daf5b | 10eaaeb8dc4f0e869847d3874a90793be3dfedf9 | 2026-10-05T04:03:56Z |
## 结果与验证
- 结果:UI `b14c9c0`(https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-UI/pulls/35)增加 `--paper` / `--paper-ink` 并允许预览加载器返回清理函数;Frontend `9badbb1`(https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Frontend/pulls/44)把 docx 页画到纸面令牌上并按栏宽缩放。
- 验证:UI `npx vitest run` 84 通过、`npx tsc --noEmit` 通过;Frontend `npm test` 81 通过、`npx tsc -b` 通过。`make test` 于 2026-10-05 在本 worktree 通过(boundaries、pins、libs、core、backend、frontend 81、ui 84、agent-command)。浏览器核对页:深色窄栏 420px 纸面 `rgb(255,255,255)`、默认墨色 `rgb(0,0,0)`、标题保留文档蓝 `rgb(31,78,121)`、红句保留 `rgb(192,0,0)`,缩放 `matrix(0.496222)`(页宽 794);浅色主题纸面与墨色不变;墨绿主题底座 `rgb(224,224,219)`、纸面仍白;栏宽 998px 时 `transform=none`(100%)。
- 影响与剩余项:深色主题下 docx 正文恢复可读。mammoth 与伪 docx 文本回退仍走主题化排版。合入权在所有者,合入后才能 task-finish。
## 闭合记录(card-autoclose 回填)
- 依据:merge 7e59377f1e12a6c00f867014f94d3acfe14896af(PR #196)已包含于 origin/main,分支成果已落盘;本段为合入后回填。
- 合并主题:Merge pull request 'Preview docx on fixed paper instead of the theme background' (#196) from feature/docx-paper-preview into main
- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。
@@ -0,0 +1,33 @@
# feature/preview-scroll-consolidate 任务卡
任务主记录:PR #200 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/200(merge 795bff20f3);状态:已完成(回填);owner:weichen
## 基线与授权
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 34e82d53c1716f0075d510a5f7b6d72dd3fc9912
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-preview-scroll-consolidate(worktree);分支:feature/preview-scroll-consolidate
- 授权与交付终点:修复右侧预览滚动,并删除 DocViewer 弹窗,以预览栏展开态承接。终点是 Dev 仓 gitlink 合入 main。
## 目标与非目标
- 目标:`.preview-pane-body` 成为唯一滚动容器;docx 页高变化时重算缩放高度;删除全屏弹窗;文本编辑/保存留在预览栏。
- 非目标:不改 FilePreview 的格式分派,不改左右栏宽度偏好。
## 同步记录
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|---|---|---|---|
| 启动 | 34e82d53c1716f0075d510a5f7b6d72dd3fc9912 | 34e82d53c1716f0075d510a5f7b6d72dd3fc9912 | 2026-10-05T04:34:21Z |
| 同步前验收 | 581ca385596891b1c0f6cc170c5e62075079a27e | d95deca618710d49bc0beeed84a003ffcfc54dc5 | 2026-10-05T04:44:26Z |
## 结果与验证
- 结果:UI 图标 PR https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-UI/pulls/36 已合入;Frontend PR https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Frontend/pulls/46 已合入。本分支推进这两个 gitlink。
- 验证:同步后 `make test` 通过(frontend 17 files / 82 tests,ui 14 files / 103 tests,backend 与库测试通过)。Headless Chromium:1400px docx 宿主在 764px 栏内由 pane-body 滚动,pdf iframe 撑满该栏。
- 影响与剩余项:登录后的六格式手工矩阵(docx/xlsx/pptx/pdf/md/代码 × 常态/展开)尚未在真实会话里点过。展开态不写入本地偏好,刷新后回到分栏。
## 闭合记录(card-autoclose 回填)
- 依据:merge 795bff20f327cc515f5c269200c362d0af2ac14c(PR #200)已包含于 origin/main,分支成果已落盘;本段为合入后回填。
- 合并主题:Advance UI and frontend pins for the single preview pane
- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。
@@ -0,0 +1,38 @@
# feature/sillytavern-review 任务卡
任务主记录:[Dev #186](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/186);状态:已完成(回填);owner:weichen
## 基线与授权
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 4fd03eee6230f82464def08f2543adab27aba948
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-sillytavern-review(worktree);分支:feature/sillytavern-review
- 授权与交付终点:调研记录、已核实的安全缺口,以及方案里的批次 A–D 都在本任务实现。完成后推送、建 PR、合入,并在 worktree 内 `make task-finish`。不拷 SillyTavern 代码或文案。不轮换 Tavily 密钥,只在验收说明里建议轮换。不改认证默认 `auto`,不加 CSRF token,不加 CSP 上报端点。
## 目标与非目标
- 目标:Documents 记录与提案 §2.5;HTML 清洗与安全响应头;来源校验与非回环无认证拒绝启动;密钥独立存储与设置快照;个人指令、会话要求、条件注入、上下文分段估算与消息整形;复制、成组排除、追加式候选回复;用户 `/` 命令展开成提示词且不自动触发。
- 契约:`Message` 增加 `excluded` / `variantGroup` / `variantIndex`。`Conversation` 增加 `sessionNote`。`ContextObservation` 增加 `sections` 与 `prefixHash`。新表见 Backend 迁移 v16。设置新增 `context.userInstructions`、`context.contextWindow`、`context.messageShape`。
- 兼容:反向代理或用主机名从局域网访问时,必须把对外域名写入 `allowedHosts`,否则未开认证时 Host 校验返回 403。旧设置里的明文密钥在启动时迁入 `secret_keys` 后从设置 JSON 清除;运行时仍接受尚未迁走的旧字段。
- 非目标:缓存断点、编辑重发、会话分支、窗口外召回、世界书概率/递归/分组/定时、密钥静态加密、i18n、出站代理、画像导入导出、扩展系统、宏、群聊、角色卡、自定义 CSS、删除消息、自动触发的快捷回复。
## 同步记录
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|---|---|---|---|
| 启动 | 4fd03eee6230f82464def08f2543adab27aba948 | 4fd03eee6230f82464def08f2543adab27aba948 | 2026-10-04T17:06:46Z |
## 结果与验证
- 结果:安全缺口 S1–S4 与批次 A–D 已在本分支实现。子仓 PR 已合入:Documents [#37](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/37)、UI [#34](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-UI/pulls/34)、Core [#21](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Core/pulls/21)、Frontend [#43](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Frontend/pulls/43)、Native [#16](https://git-home.u1680832.nyat.app:30319/weichen/Agent-Native/pulls/16)、Squad [#15](https://git-home.u1680832.nyat.app:30319/weichen/Agent-Squad/pulls/15)、Backend [#63](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Backend/pulls/63)。Dev 钉住的功能提交是这些合入提交的祖先:core `0b5c774`,native `3a110a7`,squad `5a57636`,ui `6b2589c`,frontend `eb6502f`,documents `f3f823e`,backend `c05832d`。
- 验证:`make test` 与 `make build` 退出码 0。`config explain --addr 0.0.0.0:8788` 显示拒绝启动。`serve --addr 0.0.0.0:18799` 退出码 1 且不建库。dev 已部署 `dev@ae06838`,监听 `127.0.0.1:8788`;`/` 带 CSP、nosniff、same-origin。该实例开了认证:跨站 POST 403,无 Origin 的 POST 与 `Host: evil.example` 为 401。同一二进制的无认证实例上,无 Origin 的 POST 为 201,跨站 POST 403,`Host: evil.example` 403,`127.0.0.1` 的健康检查 200,HTML 工件带 `sandbox`。浏览器:Markdown 预览去掉 script 与 `javascript:` 链接,外链图片变成「外部图片 · 域名」;docx、xlsx、pdf 与示例插件工作区无 CSP 报错;mock 对话一轮可见复制、排除、重新生成和「约 N token」。
- 影响与剩余项:Tavily 密钥曾暴露在无认证监听上,建议轮换,本任务不轮换。暂缓项与拒绝项仍不做。pptx 没有可用样例,未单独打开预览。
| 同步前验收 | 4fd03eee6230f82464def08f2543adab27aba948 | cd6be001414759f3ad00cf860ae095b70593e296 | 2026-10-04T18:42:56Z |
| 同步前验收 | 4fd03eee6230f82464def08f2543adab27aba948 | ce551683256e770d96c18fdaf93df49df4e0e3b1 | 2026-10-04T18:45:12Z |
| 同步前验收 | 4fd03eee6230f82464def08f2543adab27aba948 | ae06838d66c295d674cee0334ac2a7e9acd1a92f | 2026-10-04T19:45:46Z |
| 同步前验收 | 4fd03eee6230f82464def08f2543adab27aba948 | 3678f58cd3b8b3ca48e412c650c6be3befdf04fa | 2026-10-04T19:46:37Z |
## 闭合记录(card-autoclose 回填)
- 依据:merge 090be2404e2157f5df551c62165074625c602403(PR #186)已包含于 origin/main,分支成果已落盘;本段为合入后回填。
- 合并主题:Pin the SillyTavern borrow, guards, and context controls
- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。
@@ -0,0 +1,33 @@
# feature/store-pg-archived-literal 任务卡
任务主记录:PR #194 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/194;backend PR #65 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Backend/pulls/65;状态:已完成(回填);owner:weichen
## 基线与授权
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 989ed378ddd83b3bc3f47d2b497857dfe024d87f
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-store-pg-archived-literal(worktree);分支:feature/store-pg-archived-literal
- 授权与交付终点:修复 postgres 档 `GET /api/conversations` 500,推进 backend 与 Dev gitlink PR。合入与 dev 部署在 PR 就绪后执行。不改 schema,不处理登录前 401。
## 目标与非目标
- 目标:`ListTasks` 默认未归档视图把 `archived` 绑成 Go bool,消除 PG `boolean = integer`(42883)。
- 非目标:不改迁移(PG BOOLEAN / SQLite INTEGER 保持),不改认证 401。
## 同步记录
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|---|---|---|---|
| 启动 | 989ed378ddd83b3bc3f47d2b497857dfe024d87f | 989ed378ddd83b3bc3f47d2b497857dfe024d87f | 2026-10-05T03:15:37Z |
## 结果与验证
- 结果:backend `8d82408` 将 `ListTasks` 的 `archived=0` 改为 `archived=?` 绑定 `false`;`openTestStore` 兼容 URL 与键值对 DSN,search_path 保留 public。
- 验证:修复前 pg1 上 `TestConversationFlagsAndTaskList` 报 SQLSTATE 42883。修复后 `AGENT_PG_TEST_DSN=<pg1> go test ./internal/store -count=1` 通过;backend `go vet ./... && go test ./... -count=1` 通过;Dev 仓 `make test` 通过(2026-10-05)。
- 影响与剩余项:只推进 `modules/backend` gitlink。backend PR #65 与本仓 PR 待所有者合入;合入后重新部署 dev 并用 `GET /api/conversations` 验收。401 不在本次范围。
| 同步前验收 | 989ed378ddd83b3bc3f47d2b497857dfe024d87f | e1ec73941eb3a98dfe25b516b1ede39b9d6c68c9 | 2026-10-05T03:20:05Z |
## 闭合记录(card-autoclose 回填)
- 依据:merge 1a033b41a679f991f282c7aea0de30084df0b3e9(PR #194)已包含于 origin/main,分支成果已落盘;本段为合入后回填。
- 合并主题:Merge pull request 'Pin the ListTasks archived boolean fix in the backend store' (#194) from feature/store-pg-archived-literal into main
- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。
@@ -0,0 +1,32 @@
# feature/store-pg-bool-dialect 任务卡
任务主记录:PR #192 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/192(merge 626373b8e8);状态:已完成(回填);owner:weichen
## 基线与授权
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= dc42ceb36950a6d890d1e19676a0af6fd894d693
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-store-pg-bool-dialect(worktree);分支:feature/store-pg-bool-dialect
- 授权与交付终点:<本次允许的动作与终点;未授权事项写明>
## 目标与非目标
<预期结果、受影响入口/模块/契约;明确不做什么。>
## 同步记录
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|---|---|---|---|
| 启动 | dc42ceb36950a6d890d1e19676a0af6fd894d693 | dc42ceb36950a6d890d1e19676a0af6fd894d693 | 2026-10-05T02:49:12Z |
## 结果与验证
- 结果:
- 验证:
- 影响与剩余项:
| 同步前验收 | dc42ceb36950a6d890d1e19676a0af6fd894d693 | 0dc178aa81b36f82b1a47ae7ac29f079ebd4ee14 | 2026-10-05T02:54:20Z |
## 闭合记录(card-autoclose 回填)
- 依据:merge 626373b8e84e9c3da5f7762a59b7eedfb2cdf841(PR #192)已包含于 origin/main,分支成果已落盘;本段为合入后回填。
- 合并主题:Merge pull request 'Pin the postgres boolean dialect fix in the backend store' (#192) from feature/store-pg-bool-dialect into main
- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。
@@ -0,0 +1,32 @@
# feature/svc-adjust-warn-fix 任务卡
任务主记录:PR #189 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/189(merge 40ee4a1112);状态:已完成(回填);owner:weichen
## 基线与授权
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 73041b49fd8567aa02483a70bffed0ef8116bd22
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-svc-adjust-warn-fix(worktree);分支:feature/svc-adjust-warn-fix
- 授权与交付终点:<本次允许的动作与终点;未授权事项写明>
## 目标与非目标
<预期结果、受影响入口/模块/契约;明确不做什么。>
## 同步记录
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|---|---|---|---|
| 启动 | 73041b49fd8567aa02483a70bffed0ef8116bd22 | 73041b49fd8567aa02483a70bffed0ef8116bd22 | 2026-10-05T02:22:29Z |
## 结果与验证
- 结果:
- 验证:
- 影响与剩余项:
| 同步前验收 | 73041b49fd8567aa02483a70bffed0ef8116bd22 | 421ee87d044b84c034be7f67a40e0864116c399d | 2026-10-05T02:23:33Z |
## 闭合记录(card-autoclose 回填)
- 依据:merge 40ee4a111274d090bf98b3c4e55a66f18d5e994b(PR #189)已包含于 origin/main,分支成果已落盘;本段为合入后回填。
- 合并主题:Merge pull request 'Normalize the rebuild args comparison to stop spurious drop warnings' (#189) from feature/svc-adjust-warn-fix into main
- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。
@@ -0,0 +1,42 @@
# feature/svc-start-keep-db-binding 任务卡
任务主记录:PR #188 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/188(merge 73041b49fd);状态:已完成(回填);owner:weichen
## 基线与授权
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 4d59610fd17fb1a05cf55ff266f393cc007995e2
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-svc-start-keep-db-binding(worktree);分支:feature/svc-start-keep-db-binding
- 授权与交付终点:用户明确要求修复 svc.sh 此类缺陷(2026-10-05 dev 服务事故后续)。终点 = PR 合入 main + 主检出回归验证。
## 目标与非目标
背景(2026-10-05 01:23 dev 事故):后端 8eda35f 引入 listen guard 后,`svc.sh dev restart --addr 0.0.0.0:8788` 走"显式参数重建"分支,dev 分支刻意不拼 `--dsn/--auth`,持久化的 pg1 绑定被静默丢弃 → 二进制 `--auth auto` 无 DSN 判认证关 → 守卫拒启("进程即退")。且 `record_state` 在健康探测前写盘,坏 `exec=` 持久化,裸 start 复用导致二次失败。
修复项:
1. 重建分支 dbref 兜底:`dsn_from_dbref` 由 dbref 从 pg 实例登记重建 `--dsn`(优先级 CLI_DSN > SVC_*_DSN > dbref;mock 除外);dev 同样尊重显式 `--dsn/--auth`(此前传入即被静默丢弃)。
2. 失败不落坏配置:agent/static 启动的 `record_state` 后移至健康探测后——探测通过才写 svc.env;进程即退时保留上次配置并明示;超时(进程存活)按实际运行参数登记。pg 路径原本就在 pg_ctl 成功后落盘,不动。
3. 预检拦截:非回环 + 认证判定关(按二进制 AuthEnabled 口径:--auth on;未显式 off 且带 --dsn)时 svc.sh 层提前拒绝并给可操作报错(回环/绑定/--auth on/INSECURE_LISTEN 四条出路);二进制 listen guard 仍是权威。
4. 日志泄漏对齐:启动/复用/旧产物过滤三处日志对 DSN 掩码(此前裸打密码,违背脚本自述"DSN 默认掩码"原则)。
同类排查结论(不改):`set --addr` 对 agent 拒绝并指向 restart;`db --clear`/`config --clear` 均同步改写 exec=,无漂移;非 dev 环境重建分支原本就带 --dsn/--auth,行为保持。
非目标:不改后端 listen guard 语义;不改 deploy 物化/构建链路。
## 同步记录
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|---|---|---|---|
| 启动 | 4d59610fd17fb1a05cf55ff266f393cc007995e2 | 4d59610fd17fb1a05cf55ff266f393cc007995e2 | 2026-10-05T01:51:21Z |
## 结果与验证
- 结果:
- 验证:
- 影响与剩余项:
| 同步前验收 | 4d59610fd17fb1a05cf55ff266f393cc007995e2 | 42151071263aa133520fe346b6b1929e1ecda008 | 2026-10-05T02:16:28Z |
## 闭合记录(card-autoclose 回填)
- 依据:merge 73041b49fd8567aa02483a70bffed0ef8116bd22(PR #188)已包含于 origin/main,分支成果已落盘;本段为合入后回填。
- 合并主题:Merge pull request 'Keep the DB binding and fail closed on svc.sh start rebuilds' (#188) from feature/svc-start-keep-db-binding into main
- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。
+65 -8
View File
@@ -44,21 +44,46 @@ Agent-System-Dev 是桌面优先、Web 兼容的 AI 工作台。界面应**冷
### 2.3 文本
`--text`(主读文本,深 `#d4d4d4` / 浅 `#262626`)、`--text-dim`(62%)、`--text-faint`(38%)。
`--text`(主读文本,深 `#d4d4d4` / 浅 `#262626` / 墨绿 `#082d4f`)。
`--text-dim`:深 66% / 浅 68% / 墨绿 70%。
`--text-faint`:深 52% / 浅与墨绿 58%。
用文本层级制造信息密度,先于增加更多边框或颜色。
门槛(`contrast-guard.test.ts`,WCAG 2.1):
- `--text` 与 `--text-dim` 在主区表面(`--bg`、`--bg-panel`、`--bg-raised`、代码底 `--bg-inset`)不低于 **4.5:1**。
- `--text-faint` 不低于 **3:1**,并且**只用于装饰**:占位符、chevron、kbd、关闭图标的默认色。
- 承载决策或需要读完的文字从 `--text-dim` 起步:表头、确认详情、工具清单、空态说明、设置项描述、状态词。不要把 faint 当内容色。
侧栏另用 `--text-sidebar-dim`(墨绿 78%)与 `--text-sidebar-faint`(墨绿 62%),门槛与主区相同,只跟 `--bg-sidebar` 对拍。
侧栏会把 `--text*` 重映射成侧栏色。挂在侧栏 DOM 里、但画在主区纸面上的浮层(账户菜单)改用 `--text-workspace*`,这是同一套文字的不被重映射的副本。
### 2.4 强调与语义色
- 交互强调蓝:`--accent`(深 `#4099ff` / 浅 `#0b7fff`)。**只用于**链接、选中指示、聚焦环、
进行中指示;不做大面积铺底、不做主按钮底色。
- 主按钮:单色系反色——`--primary`(深 `#ffffff` / 浅 `#0d0d0d`)配 `--primary-foreground`
(反向黑/白)。品牌色保持克制。
- 语义:`--ok #46bf72`、`--warn #ff8a30`、`--err #ff5c5c`(浅色 `#1e8a3e/#e07b00/#e03131`)。
语义色只表语义。
- 语义图形色:`--ok #46bf72`、`--warn #ff8a30`、`--err #ff5c5c`(浅色与墨绿 `#1e8a3e` / `#d17300` / `#e03131`)。
语义色只表语义。图形色(状态点、描边、色条)在 `--bg` / `--bg-panel` / `--bg-raised` 上不低于 **3:1**。
**图形色不作文字。** 链接、状态词、差异文字、空闲状态字用下面的文字档。
- 文字档(同一色相,专门保证 4.5:1,含铺在 `*-soft` 上):
| 令牌 | 深色 | 浅色 / 墨绿 | 用途 |
|---|---|---|---|
| `--accent-text` | `#58a6ff` | `#0858b0` | 链接、动作字 |
| `--warn-text` | `#ff8a30` | `#8d4d00` | 警告文字;也作警告徽标底 |
| `--err-text` | `#ff7272` | `#a92525` | 错误文字;也作错误徽标底 |
| `--ok-text` | `#46bf72` | `#17682f` | 成功状态字 |
| `--idle-text` | `#929292` | `#636363` | 空闲状态字 |
| `--diff-add-text` | `#7dcea0` | `#17682f` | 差异增加的文字 |
| `--diff-remove-text` | `#ff9b9b` | `#a92525` | 差异删除的文字 |
徽标:底用对应 `*-text`,字用 `--text-on-semantic`(深 `#101010` / 浅与墨绿 `#ffffff`)。
- 等你确认用 `--wait`(深 `#8b93ff` / 浅 `#3a46c8` / 墨绿 `#3d5a9a`)和 `--wait-soft`。
不借用成功绿,也不用红或橙装饰等待。
- 差异视图:增加用 `--diff-add` / `--diff-add-text`,删除用 `--diff-remove` / `--diff-remove-text`。
- 空闲任务用 `--task-idle`,定时任务用 `--task-scheduled`。两者不要混成同一种灰。
- 空闲任务的图形用 `--task-idle`,文字用 `--idle-text`。定时任务用 `--task-scheduled`。两者不要混成同一种灰。
### 2.5 墨绿主题(可选,`data-theme='molv'`)
@@ -72,8 +97,23 @@ Agent-System-Dev 是桌面优先、Web 兼容的 AI 工作台。界面应**冷
| `--bg-sidebar` | `#082d4f` | 左栏、顶栏 |
| `--text` | `#082d4f` | 主读文本 |
| `--text-sidebar` | `#e9f0f6` | 左栏与顶栏文字 |
| `--accent` | `#165f49` | 交互强调(翠绿) |
| `--primary` / `--primary-foreground` | `#082d4f` / `#f3f8f5` | 主按钮 |
| `--accent` | `#165f49` | 主区交互强调(翠绿)。不用于侧栏 |
| `--accent-sidebar` | `#8fd4b4` | 侧栏内的强调:active 图标、聚焦边、选中条 |
| `--primary` / `--primary-foreground` | `#082d4f` / `#f3f8f5` | 主区主按钮 |
| `--primary-sidebar` / `--primary-sidebar-foreground` | `#e9f0f6` / `#082d4f` | 侧栏上的主按钮(「新建任务」) |
深色与浅色下,侧栏三令牌别名到主区:`--primary-sidebar` 同 `--primary`,深色 `--accent-sidebar` 同 `--accent`。浅色侧栏是白底,`--accent-sidebar` 改走 `--accent-text`(`#0b7fff` 在白底上不足 4.5:1)。侧栏内的 active、聚焦和主按钮只消费这组令牌,不直接用主区 `--accent` / `--primary`。
### 2.6 文档纸面(主题不变量)
Office 分页预览是**内容**,不是界面。纸面与默认墨色固定,三套主题同值:
| 令牌 | 值 | 用途 |
|---|---|---|
| `--paper` | `#ffffff` | docx 页、幻灯片等文档纸面 |
| `--paper-ink` | `#000000` | 纸面上没有自带颜色的文字的默认墨色 |
规则:保留文档自己的字号、颜色、表格和图片样式。禁止用 `--bg` / `--text` 等主题令牌覆盖这些内联样式。界面只负责纸面周围的底座(`--bg-inset`)和按栏宽等比缩放。
## 3. 字号标尺(唯一字号体系)
@@ -86,12 +126,15 @@ Agent-System-Dev 是桌面优先、Web 兼容的 AI 工作台。界面应**冷
| `--fs-ui-base` | = | 14 | 正文、常用按钮、区块标题 |
| `--fs-ui-caption` | −1px | 13 | 紧凑辅助文案 |
| `--fs-ui-sm` | −2px | 12 | 次要信息、行内代码 |
| `--fs-ui-xs` | −4px | 10 | 徽标、快捷键、极弱元数据 |
| `--fs-ui-xs` | −3px | 11 | 仅徽标与图标性字符 |
| `--fs-ui-tooltip` | 同 `--fs-ui-sm` | 12 | 提示气泡。不另起字号 |
| `--fs-code` | −2px | 12 | 代码块、终端、Diff。随 `--ui-font-size` 缩放 |
规则:UI 组件一律用标尺令牌;禁止行内 `font-size` 数值与 Tailwind 式任意字号
(守护测试棘轮拦截)。用户调字号只改 `--ui-font-size`,不改根字号;图标、间距、圆角不随字号缩放。
例外:代码/Diff/终端/文档正文用独立阅读字号(等宽 12–12.5px、文档 13.5px)。
设置中心「界面字号」提供 13 / 14 / 16 / 18 四档,写入 `--ui-font-size`,只存在本机(`localStorage`),不进账号设置。
表头用 `--fs-ui-sm` + `--text-dim`,不用 xs,也不要对中文做 `uppercase`。
例外:文档正文保留自己的阅读字号(约 13.5px),不跟界面标尺走。
字体:`--font` 系统栈优先(-apple-system/PingFang SC…);路径、命令、代码、快捷键用 `--mono`。
@@ -169,6 +212,7 @@ Agent-System-Dev 是桌面优先、Web 兼容的 AI 工作台。界面应**冷
- 展开态按 id 记忆,切回不丢;
- 失败不强制展开:状态词虚线下划线,hover tooltip 给报错,支持一键复制;
- 内容懒渲染,收起后延迟卸载(300ms,配合高度动画)。
- 模型、卡片和文档里的 HTML 只经 `@ui` `safeHtml` 写入。外部图片和音视频不直接加载,改成带来源域名的链接;同源地址、`data:image` 和 `blob:` 照常显示。
### 9.2 折叠(@ui Collapsible 原语)
@@ -232,9 +276,22 @@ Primary(`--primary` 反色)、Ghost(透明,hover 出表面)、Danger
5. 弹窗套弹窗;
6. 同一对象出现第二个预览落位(预览只在预览区,全屏是它的放大);
7. `<details>` 折叠——用 Collapsible。
8. 绕过 `safeHtml` 直接把 HTML 字符串写进页面(`dangerouslySetInnerHTML` 或非空的 `innerHTML` 赋值)。
9. 文字与背景的对比度低于门槛(正文与文字档 4.5:1,装饰 faint 与图形语义色 3:1)——`contrast-guard.test.ts`。
## 12. 演进规则
改风格 = `DESIGN.md` 与 `tokens.css`(必要时 `motion.css`)**同 PR 成对修改**,附前后值对照;
不允许只改代码不改文档。新增视觉规则先问:它属于结构、表面、交互还是状态?
拿不准时,选更安静的方案、用更强的信息层级。
### 12.1 对比度与字号(2026-10-05)前后值
| 令牌 | 之前 | 之后 |
|---|---|---|
| `--text-dim` | 三主题 62% | 深 66% / 浅 68% / 墨绿 70% |
| `--text-faint` | 深 38% / 浅与墨绿 42% | 深 52% / 浅与墨绿 58% |
| `--text-sidebar-dim` / `faint`(墨绿) | 72% / 46% | 78% / 62% |
| `--warn`(浅色、墨绿) | `#e07b00`(白底 2.99:1) | `#d17300` |
| `--fs-ui-xs` | −4px(10px) | −3px(11px),仅徽标 |
| 文字档 `*-text`、`--text-on-semantic`、`--accent-sidebar`、`--primary-sidebar`、`--fs-code`、`--idle-text` | 无 | 见 §2.4–§3。图形色不再当文字用 |
+2
View File
@@ -164,6 +164,8 @@ scripts/svc.sh ui deploy --kind static --dir ../dist # 直接服务既有
| `--data DIR` | agent 数据目录(默认 `runtime/<name>/data`) |
| `--plugins DIR` | agent 插件源(默认随 deploy 复制环境目录的 `plugins/`) |
| `--dsn DSN` / `--auth on\|off\|auto` / `--mock` | agent 运行参数(非 dev 环境默认 `--auth auto`) |
| `SVC_<NAME>_INSECURE_LISTEN` | 设为 `1` 时允许该服务在非回环地址上不开启认证。值传给进程的 `AGENT_SYSTEM_INSECURE_LISTEN`,不写进 `exec=`。旧二进制会忽略 |
| `SVC_<NAME>_ALLOWED_HOSTS` | 逗号分隔的额外主机名,传给 `AGENT_SYSTEM_ALLOWED_HOSTS`,供反向代理的 Host / Origin 校验 |
| `--model-base/--model-key/--model-name`、`--light-*`、`--tavily-keys` | 启动健康后播种 |
| `--dry-run` | 只解析并打印部署计划(来源、物化路径、产物去向、启动参数) |
| `--pick [dev\|release]` | 交互式编号选提交(需 TTY) |
+1
View File
@@ -2,6 +2,7 @@
"backend/app backend/bus",
"backend/app backend/cardsvc",
"backend/app backend/cmdbus",
"backend/app backend/config",
"backend/app backend/hostapi",
"backend/app backend/intentgate",
"backend/app backend/pgbus",
+104 -17
View File
@@ -55,7 +55,8 @@
# ════════════════════ 配置优先级 ════════════════════
# 命令行 > --config/--env 文件 > svc.env 持久化(exec=/addr=)> SVC_<NAME>_* 环境变量
# (.svc.env 自动加载,同层)> 默认值。裸 start/restart 复用上次启动配置;显式参数
# 出现即覆盖。任意环境 X 的变量名:SVC_<X 大写,- → _>_ADDR/DATA/DSN/AUTH/MOCK。
# 出现即覆盖。任意环境 X 的变量名:SVC_<X 大写,- → _>_ADDR/DATA/DSN/AUTH/MOCK,
# 以及 INSECURE_LISTEN / ALLOWED_HOSTS(传给进程的 AGENT_SYSTEM_*,旧二进制会忽略)。
#
# ════════════════════ 服务模型与登记 ════════════════════
# - 服务名 ^[a-z][a-z0-9-]{0,15}$(保留字不可用);dev=8788 / prod=8787 默认端口,
@@ -400,9 +401,11 @@ dotenv 格式:KEY=VALUE,支持 # 注释、成对引号、export 前缀;只
播种幂等:设置持久化在 agent 数据目录,播过一次后续启动无需再传。
持久化语义:
- deploy/start 成功后把当前态写入 svc.env(600)
- deploy/start 成功(健康探测通过)后把当前态写入 svc.env(600);启动失败不覆盖
上次配置——裸 start 仍按上次可用参数重试
- 裸 start/restart 复用 exec=(上次完整参数);任何显式参数(或 --config 文件、
SVC_* 变量)出现即整体重建参数
SVC_* 变量)出现即整体重建参数——重建时 dbref 绑定的 --dsn 自动从实例登记
重建保留(mock 档或显式 --dsn 除外)
- tags 随每次登记合并去重,跨重启保留
服务级配置文件(与上述 svc.sh dotenv 层不同——这是 agent 二进制自己的 JSON 配置):
@@ -1171,6 +1174,41 @@ PY
fi
}
# dsn_from_dbref DBREF:由 dbref(pg实例/库名)从该实例登记重建连接串。
# 实例未登记 / 非 postgres / 缺 addr·user·password 时返回非零且不输出。
dsn_from_dbref() {
local dbref="$1" inst tdb taddr tuser tpass
inst="${dbref%%/*}"; tdb="${dbref#*/}"
{ [ -n "$inst" ] && [ -n "$tdb" ] && [ "$inst" != "$dbref" ]; } || return 1
[ -f "$RUNTIME/$inst/svc.env" ] || return 1
[ "$(svc_kind "$inst")" = postgres ] || return 1
taddr="$(env_kv_of "$inst" addr)"
tuser="$(env_kv_of "$inst" user)"
tpass="$(env_kv_of "$inst" password)"
{ [ -n "$taddr" ] && [ -n "$tuser" ] && [ -n "$tpass" ]; } || return 1
printf 'postgresql://%s:%s@%s:%s/%s' "$tuser" "$tpass" "${taddr%:*}" "${taddr##*:}" "$tdb"
}
# addr_is_loopback HOST:回环写法白名单判定(127.x / ::1 / localhost)。
# 只服务启动预检的快速拦截:其余形态一律按非回环处理,权威判定在二进制 listen guard。
addr_is_loopback() {
case "$1" in
localhost|127.*|::1|[::1]) return 0 ;;
*) return 1 ;;
esac
}
# agent_args_authed ARGS:按二进制 AuthEnabled 口径判断启动参数是否开启认证
# (--auth on;或未显式 off 且带 --dsn——auto+PG 即开)。--mock 只影响存储档不影响认证。
agent_args_authed() {
case "$1" in
*--auth[=\ ]on*) return 0 ;;
*--auth[=\ ]off*) return 1 ;;
*--dsn\ *) return 0 ;;
*) return 1 ;;
esac
}
agent_do_start() {
mkdir -p "$ENV_DATA" "$ENV_DIR"
check_port_free || return 1
@@ -1184,21 +1222,36 @@ agent_do_start() {
local exec_args
if ! agent_has_explicit_cfg && [ -n "$(svc_get exec)" ]; then
exec_args="$(svc_get exec)"
c_info "[$ENV_NAME] 复用上次配置(svc.env exec=;显式参数可覆盖):$exec_args"
c_info "[$ENV_NAME] 复用上次配置(svc.env exec=;显式参数可覆盖):$(mask_dsn "$exec_args")"
else
local args=""
if [ "$CLI_MOCK" = 1 ] || [ "$(env_var "$ENV_NAME" MOCK)" = "1" ]; then
args="--mock"
elif [ "$ENV_NAME" != dev ]; then
else
local dsn="${CLI_DSN:-$(env_var "$ENV_NAME" DSN)}"
[ -n "$dsn" ] && args="$args --dsn $dsn"
local auth="${CLI_AUTH:-$(env_var "$ENV_NAME" AUTH)}"
[ -z "$auth" ] && auth=auto
args="$args --auth $auth"
# dbref 兜底:显式参数重建启动参数时,持久化的数据库绑定不再静默丢失
#(2026-10-05 dev 事故:restart --addr 走重建分支丢 --dsn → auto 判认证关 → 守卫拒启)。
if [ -z "$dsn" ] && [ -n "$(svc_get dbref)" ]; then
local bound_dsn
if bound_dsn="$(dsn_from_dbref "$(svc_get dbref)")"; then
dsn="$bound_dsn"
c_info "[$ENV_NAME] 数据库绑定 $(svc_get dbref) 随参数重建保留"
else
c_warn "[$ENV_NAME] dbref=$(svc_get dbref) 无法重建 DSN(实例缺失或登记不全),按无数据库绑定启动"
fi
fi
[ -n "$dsn" ] && args="$args --dsn $dsn"
if [ -n "$dsn" ] || [ -n "$auth" ] || [ "$ENV_NAME" != dev ]; then
[ -z "$auth" ] && auth=auto
args="$args --auth $auth"
fi
fi
local adjusted; adjusted="$(adjust_args_for_bin "$ENV_BIN" "$args")"
if [ "$adjusted" != "$args" ]; then
c_warn "[$ENV_NAME] 该产物不支持 --dsn/--auth(旧版本二进制),已自动省略:${args:-<无>} → ${adjusted:-<无>}"
# adjust_args_for_bin 返回值已去首空格——比较前对 args 同样归一,否则每次
# 带 --dsn/--auth 的重建都会误报"旧版本二进制已自动省略"(参数实际全保留)。
if [ "$adjusted" != "${args# }" ]; then
c_warn "[$ENV_NAME] 该产物不支持 --dsn/--auth(旧版本二进制),已自动省略:$(mask_dsn "${args:-<无>}") → $(mask_dsn "${adjusted:-<无>}")"
fi
args="$adjusted"
exec_args="--addr $ENV_ADDR --data $ENV_DATA --plugins ${CLI_PLUGINS:-$ENV_DIR/plugins} $args $CLI_EXTRA"
@@ -1206,11 +1259,35 @@ agent_do_start() {
fi
SVC_EXEC="$exec_args"
SVC_PIDCHECK="$ENV_BIN"
c_info "[$ENV_NAME] 启动:$ENV_BIN serve $exec_args"
local guard_env=() insecure hosts
insecure="$(env_var "$ENV_NAME" INSECURE_LISTEN)"
hosts="$(env_var "$ENV_NAME" ALLOWED_HOSTS)"
[ -n "$insecure" ] && guard_env+=("AGENT_SYSTEM_INSECURE_LISTEN=$insecure")
[ -n "$hosts" ] && guard_env+=("AGENT_SYSTEM_ALLOWED_HOSTS=$hosts")
# 预检(快速拦截):非回环地址且认证判定为关时提前拒绝,报错可操作——
# 不等二进制 listen guard 以"进程即退"暴露;二进制守卫仍是权威。
local pf_addr; pf_addr="$(printf '%s' "$exec_args" | sed -n 's/.*--addr \([^ ]*\).*/\1/p')"
pf_addr="${pf_addr:-$ENV_ADDR}"
if ! addr_is_loopback "${pf_addr%:*}" && [ -z "$insecure" ] && ! agent_args_authed "$exec_args"; then
c_err "[$ENV_NAME] 拒绝启动:非回环地址 $pf_addr 且认证判定为关(auto 无 DSN 即关)。"
c_err " 任选其一:--addr 127.0.0.1:${pf_addr##*:};数据库绑定 scripts/svc.sh $ENV_NAME db <pg实例>;"
c_err " 显式 --auth on;或环境 SVC_$(printf '%s' "$ENV_NAME" | tr 'a-z-' 'A-Z_')_INSECURE_LISTEN=1 显式放行。"
c_err " 登记未变更(svc.env 保留上次配置);二进制侧 listen guard 同样会拒绝。"
hist_event start fail "" "预检拒绝:非回环且未开认证"
return 1
fi
c_info "[$ENV_NAME] 启动:$ENV_BIN serve $(mask_dsn "$exec_args")"
if [ -n "$insecure" ] || [ -n "$hosts" ]; then
c_info "[$ENV_NAME] 监听守卫:insecureListen=${insecure:-0} allowedHosts=${hosts:-无}"
fi
# 直接 nohup 简单命令:$! 即服务进程本身,pidfile 语义才成立。
nohup "$ENV_BIN" serve $exec_args >> "$ENV_DIR/svc.log" 2>&1 &
# 守卫变量走环境,不写进 exec=;旧二进制不认识这两个变量,会忽略。
if [ "${#guard_env[@]}" -gt 0 ]; then
nohup env "${guard_env[@]}" "$ENV_BIN" serve $exec_args >> "$ENV_DIR/svc.log" 2>&1 &
else
nohup "$ENV_BIN" serve $exec_args >> "$ENV_DIR/svc.log" 2>&1 &
fi
echo $! > "$ENV_PID"
record_state
# 健康探测:取 exec 里的 --addr(复用持久化配置时可能与当前派生值不同)。
local probe="${ENV_ADDR}"
case "$exec_args" in *--addr\ *)
@@ -1220,18 +1297,23 @@ agent_do_start() {
[ "$phost" = "0.0.0.0" ] || [ "$phost" = "::" ] && phost="127.0.0.1"
for _ in $(seq 1 100); do
if curl -s -o /dev/null -m 2 "http://$phost:${probe##*:}/" 2>/dev/null; then
# 健康通过才写 svc.env——启动失败不再用新参数覆盖上次的可用配置
#(2026-10-05 dev 事故:失败后坏 exec= 持久化,裸 start 复用导致二次失败)。
record_state
c_ok "[$ENV_NAME] 已启动 pid=$(read_pid) → http://$phost:${probe##*:}(来源 ${SVC_SOURCE:-?},日志:$ENV_DIR/svc.log)"
hist_event start ok "$(read_pid)" "http://$phost:${probe##*:}"
seed_settings "$phost" "${probe##*:}"
return 0
fi
pid_alive "$(read_pid)" || {
c_err "[$ENV_NAME] 进程启动后即退出,查看日志:tail -40 $ENV_DIR/svc.log"
c_err "[$ENV_NAME] 进程启动后即退出(登记未变更,svc.env 保留上次 exec=),查看日志:tail -40 $ENV_DIR/svc.log"
hist_event start fail "$(read_pid)" "进程即退(日志 svc.log)"
return 1
}
sleep 0.2
done
# 进程存活但未响应:按实际运行参数登记(进程确以新参数在跑,登记与现实一致)。
record_state
c_err "[$ENV_NAME] 20s 健康检查未通过(进程存活但未响应),查看日志:tail -40 $ENV_DIR/svc.log"
hist_event start fail "$(read_pid)" "健康检查超时"
return 1
@@ -1342,22 +1424,23 @@ static_do_start() {
c_info "[$ENV_NAME] 启动静态服务:python3 http.server $port --bind $host --directory $htdocs"
nohup python3 -m http.server "$port" --bind "$host" --directory "$htdocs" >> "$ENV_DIR/svc.log" 2>&1 &
echo $! > "$ENV_PID"
record_state "htdocs=$htdocs"
local probe_host="$host"
[ "$probe_host" = "0.0.0.0" ] || [ "$probe_host" = "::" ] && probe_host="127.0.0.1"
for _ in $(seq 1 50); do
if curl -s -o /dev/null -m 2 "http://$probe_host:$port/" 2>/dev/null; then
record_state "htdocs=$htdocs" # 健康通过才写 svc.env(与 agent 路径同规)
c_ok "[$ENV_NAME] 已启动 pid=$(read_pid) → http://$probe_host:$port/(目录 $htdocs)"
hist_event start ok "$(read_pid)" "http://$probe_host:$port/"
return 0
fi
pid_alive "$(read_pid)" || {
c_err "[$ENV_NAME] 进程启动后即退出,查看日志:tail -40 $ENV_DIR/svc.log"
c_err "[$ENV_NAME] 进程启动后即退出(登记未变更,svc.env 保留上次配置),查看日志:tail -40 $ENV_DIR/svc.log"
hist_event start fail "$(read_pid)" "进程即退"
return 1
}
sleep 0.2
done
record_state "htdocs=$htdocs"
c_err "[$ENV_NAME] 10s 健康检查未通过"
hist_event start fail "$(read_pid)" "健康检查超时"
return 1
@@ -2402,7 +2485,11 @@ env_status_detail() {
printf ' 数据库 %s\n' "${dbref:-无(内嵌 SQLite 档;绑定:<name> db <pg名>)}"
cfile="$(svc_get conffile)"
[ -z "$cfile" ] && cfile="$(printf '%s' "$(svc_get exec)" | sed -n 's/.*--config \([^ ]*\).*/\1/p')"
printf ' 配置文件 %s\n' "${cfile:-无(命令行参数形态;<name> config <file> 绑定)}" ;;
printf ' 配置文件 %s\n' "${cfile:-无(命令行参数形态;<name> config <file> 绑定)}"
printf ' 监听守卫 insecureListen=%s allowedHosts=%s\n' \
"$(env_var "$ENV_NAME" INSECURE_LISTEN)" \
"$(env_var "$ENV_NAME" ALLOWED_HOSTS)"
;;
postgres)
printf ' 库 %s 用户 %s\n' "$(svc_get dbname)" "$(svc_get user)"
printf ' DSN postgresql://%s:***@%s:%s/%s(db dsn %s --reveal 看密码)\n' \