dominds 0.6.2 → 0.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/access-control.js +2 -2
- package/dist/agent-priming.js +826 -92
- package/dist/cli/read.js +406 -12
- package/dist/dialog.js +4 -0
- package/dist/docs/design.md +1 -0
- package/dist/docs/design.zh.md +1 -0
- package/dist/docs/dialog-system.md +12 -7
- package/dist/docs/dialog-system.zh.md +7 -3
- package/dist/docs/dominds-agent-priming.md +10 -1
- package/dist/docs/dominds-agent-priming.zh.md +9 -1
- package/dist/docs/dominds-terminology.md +8 -8
- package/dist/docs/fbr-implementation.md +77 -0
- package/dist/docs/fbr-implementation.zh.md +77 -0
- package/dist/docs/fbr.md +142 -141
- package/dist/docs/fbr.zh.md +129 -123
- package/dist/docs/keep-going.zh.md +162 -0
- package/dist/docs/showing-by-doing.md +208 -0
- package/dist/docs/showing-by-doing.zh.md +177 -0
- package/dist/docs/tellask-collab.md +250 -0
- package/dist/docs/tellask-collab.zh.md +254 -0
- package/dist/docs/txt-editing-tools.md +2 -2
- package/dist/docs/txt-editing-tools.zh.md +2 -2
- package/dist/llm/defaults.yaml +82 -4
- package/dist/llm/driver.js +280 -104
- package/dist/llm/gen/codex.js +49 -2
- package/dist/log.js +385 -30
- package/dist/mcp/supervisor.js +113 -40
- package/dist/minds/builtin/pangu/persona.zh.md +2 -2
- package/dist/minds/load.js +49 -284
- package/dist/minds/minds-i18n.js +2 -2
- package/dist/minds/promptdocs.js +263 -0
- package/dist/minds/system-prompt-parts.js +231 -0
- package/dist/minds/system-prompt.js +190 -223
- package/dist/persistence.js +66 -1
- package/dist/server/websocket-handler.js +14 -0
- package/dist/shared/diligence.js +40 -6
- package/dist/shared/utils/inter-dialog-format.js +3 -5
- package/dist/showing-by-doing.js +34 -31
- package/dist/snippets/README.en.md +3 -0
- package/dist/static/assets/{_baseUniq-C9vbtHF9.js → _baseUniq-C7IpU2Uk.js} +2 -2
- package/dist/static/assets/{_baseUniq-C9vbtHF9.js.map → _baseUniq-C7IpU2Uk.js.map} +1 -1
- package/dist/static/assets/{arc-hulXG01i.js → arc-1bhQqjON.js} +2 -2
- package/dist/static/assets/{arc-hulXG01i.js.map → arc-1bhQqjON.js.map} +1 -1
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-DdLIAMT5.js → architectureDiagram-VXUJARFQ-CkEi1QpB.js} +6 -6
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-DdLIAMT5.js.map → architectureDiagram-VXUJARFQ-CkEi1QpB.js.map} +1 -1
- package/dist/static/assets/{blockDiagram-VD42YOAC-DACsx66C.js → blockDiagram-VD42YOAC-DaBQ5-pY.js} +7 -7
- package/dist/static/assets/{blockDiagram-VD42YOAC-DACsx66C.js.map → blockDiagram-VD42YOAC-DaBQ5-pY.js.map} +1 -1
- package/dist/static/assets/{c4Diagram-YG6GDRKO-Cd5xZlLy.js → c4Diagram-YG6GDRKO-ChUgpgkP.js} +3 -3
- package/dist/static/assets/{c4Diagram-YG6GDRKO-Cd5xZlLy.js.map → c4Diagram-YG6GDRKO-ChUgpgkP.js.map} +1 -1
- package/dist/static/assets/{channel-NQehis0Z.js → channel-CxvmwllM.js} +2 -2
- package/dist/static/assets/{channel-NQehis0Z.js.map → channel-CxvmwllM.js.map} +1 -1
- package/dist/static/assets/{chunk-4BX2VUAB-DZDPl76b.js → chunk-4BX2VUAB-CKsrU2yk.js} +2 -2
- package/dist/static/assets/{chunk-4BX2VUAB-DZDPl76b.js.map → chunk-4BX2VUAB-CKsrU2yk.js.map} +1 -1
- package/dist/static/assets/{chunk-55IACEB6-CFSRDUbl.js → chunk-55IACEB6-BAau9SFt.js} +2 -2
- package/dist/static/assets/{chunk-55IACEB6-CFSRDUbl.js.map → chunk-55IACEB6-BAau9SFt.js.map} +1 -1
- package/dist/static/assets/{chunk-B4BG7PRW-BqQQ9M_z.js → chunk-B4BG7PRW--IiJ7W1m.js} +5 -5
- package/dist/static/assets/{chunk-B4BG7PRW-BqQQ9M_z.js.map → chunk-B4BG7PRW--IiJ7W1m.js.map} +1 -1
- package/dist/static/assets/{chunk-DI55MBZ5-FiFzz1Gh.js → chunk-DI55MBZ5-B83KrPQj.js} +4 -4
- package/dist/static/assets/{chunk-DI55MBZ5-FiFzz1Gh.js.map → chunk-DI55MBZ5-B83KrPQj.js.map} +1 -1
- package/dist/static/assets/{chunk-FMBD7UC4-DqqtCyWK.js → chunk-FMBD7UC4-BlDXzeza.js} +2 -2
- package/dist/static/assets/{chunk-FMBD7UC4-DqqtCyWK.js.map → chunk-FMBD7UC4-BlDXzeza.js.map} +1 -1
- package/dist/static/assets/{chunk-QN33PNHL-F0laQQ-J.js → chunk-QN33PNHL-B596W_v7.js} +2 -2
- package/dist/static/assets/{chunk-QN33PNHL-F0laQQ-J.js.map → chunk-QN33PNHL-B596W_v7.js.map} +1 -1
- package/dist/static/assets/{chunk-QZHKN3VN-CWhEZPaV.js → chunk-QZHKN3VN-UBBCxgBb.js} +2 -2
- package/dist/static/assets/{chunk-QZHKN3VN-CWhEZPaV.js.map → chunk-QZHKN3VN-UBBCxgBb.js.map} +1 -1
- package/dist/static/assets/{chunk-TZMSLE5B-Dx9cnwUy.js → chunk-TZMSLE5B-D-wCX2wJ.js} +2 -2
- package/dist/static/assets/{chunk-TZMSLE5B-Dx9cnwUy.js.map → chunk-TZMSLE5B-D-wCX2wJ.js.map} +1 -1
- package/dist/static/assets/{classDiagram-2ON5EDUG-Dp-dyEGy.js → classDiagram-2ON5EDUG-DvtmzPcu.js} +6 -6
- package/dist/static/assets/{classDiagram-2ON5EDUG-Dp-dyEGy.js.map → classDiagram-2ON5EDUG-DvtmzPcu.js.map} +1 -1
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-Dp-dyEGy.js → classDiagram-v2-WZHVMYZB-DvtmzPcu.js} +6 -6
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-Dp-dyEGy.js.map → classDiagram-v2-WZHVMYZB-DvtmzPcu.js.map} +1 -1
- package/dist/static/assets/{clone-C6mKvxs5.js → clone-DgJ0ZR-k.js} +2 -2
- package/dist/static/assets/{clone-C6mKvxs5.js.map → clone-DgJ0ZR-k.js.map} +1 -1
- package/dist/static/assets/{cose-bilkent-S5V4N54A-Dbwh3GoX.js → cose-bilkent-S5V4N54A-DXMyFQvy.js} +2 -2
- package/dist/static/assets/{cose-bilkent-S5V4N54A-Dbwh3GoX.js.map → cose-bilkent-S5V4N54A-DXMyFQvy.js.map} +1 -1
- package/dist/static/assets/{dagre-6UL2VRFP-BD_6e0Uk.js → dagre-6UL2VRFP-BdaUG-j_.js} +7 -7
- package/dist/static/assets/{dagre-6UL2VRFP-BD_6e0Uk.js.map → dagre-6UL2VRFP-BdaUG-j_.js.map} +1 -1
- package/dist/static/assets/{diagram-PSM6KHXK-BWt7Q59-.js → diagram-PSM6KHXK-NLiqKBzn.js} +7 -7
- package/dist/static/assets/{diagram-PSM6KHXK-BWt7Q59-.js.map → diagram-PSM6KHXK-NLiqKBzn.js.map} +1 -1
- package/dist/static/assets/{diagram-QEK2KX5R-D0BvBR_a.js → diagram-QEK2KX5R-D-0fyvY_.js} +6 -6
- package/dist/static/assets/{diagram-QEK2KX5R-D0BvBR_a.js.map → diagram-QEK2KX5R-D-0fyvY_.js.map} +1 -1
- package/dist/static/assets/{diagram-S2PKOQOG-D8uRdKXp.js → diagram-S2PKOQOG-BQ_FU59m.js} +6 -6
- package/dist/static/assets/{diagram-S2PKOQOG-D8uRdKXp.js.map → diagram-S2PKOQOG-BQ_FU59m.js.map} +1 -1
- package/dist/static/assets/{erDiagram-Q2GNP2WA-CQoifjFq.js → erDiagram-Q2GNP2WA-DyftKeuC.js} +5 -5
- package/dist/static/assets/{erDiagram-Q2GNP2WA-CQoifjFq.js.map → erDiagram-Q2GNP2WA-DyftKeuC.js.map} +1 -1
- package/dist/static/assets/{flowDiagram-NV44I4VS-CGhdeaG8.js → flowDiagram-NV44I4VS-9SGefONA.js} +6 -6
- package/dist/static/assets/{flowDiagram-NV44I4VS-CGhdeaG8.js.map → flowDiagram-NV44I4VS-9SGefONA.js.map} +1 -1
- package/dist/static/assets/{ganttDiagram-JELNMOA3-D8W0wb9H.js → ganttDiagram-JELNMOA3-k_WLhf-r.js} +3 -3
- package/dist/static/assets/{ganttDiagram-JELNMOA3-D8W0wb9H.js.map → ganttDiagram-JELNMOA3-k_WLhf-r.js.map} +1 -1
- package/dist/static/assets/{gitGraphDiagram-NY62KEGX-ChHni_jP.js → gitGraphDiagram-NY62KEGX-3eoLlCOY.js} +7 -7
- package/dist/static/assets/{gitGraphDiagram-NY62KEGX-ChHni_jP.js.map → gitGraphDiagram-NY62KEGX-3eoLlCOY.js.map} +1 -1
- package/dist/static/assets/{graph-BWoi_FgC.js → graph-vUevIs4s.js} +3 -3
- package/dist/static/assets/{graph-BWoi_FgC.js.map → graph-vUevIs4s.js.map} +1 -1
- package/dist/static/assets/{index-th_praGg.js → index-BNBG2CE1.js} +399 -68
- package/dist/static/assets/index-BNBG2CE1.js.map +1 -0
- package/dist/static/assets/{infoDiagram-WHAUD3N6-B_XKKZTV.js → infoDiagram-WHAUD3N6-CwEhVxkU.js} +5 -5
- package/dist/static/assets/{infoDiagram-WHAUD3N6-B_XKKZTV.js.map → infoDiagram-WHAUD3N6-CwEhVxkU.js.map} +1 -1
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-ChGuQ6T9.js → journeyDiagram-XKPGCS4Q-Dtdq4G4Q.js} +5 -5
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-ChGuQ6T9.js.map → journeyDiagram-XKPGCS4Q-Dtdq4G4Q.js.map} +1 -1
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-BjWe623u.js → kanban-definition-3W4ZIXB7-Bli-AycJ.js} +3 -3
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-BjWe623u.js.map → kanban-definition-3W4ZIXB7-Bli-AycJ.js.map} +1 -1
- package/dist/static/assets/{layout-BPyT310w.js → layout-CGlA8c09.js} +5 -5
- package/dist/static/assets/{layout-BPyT310w.js.map → layout-CGlA8c09.js.map} +1 -1
- package/dist/static/assets/{linear-xUsVjXWq.js → linear-Da2jDWL3.js} +2 -2
- package/dist/static/assets/{linear-xUsVjXWq.js.map → linear-Da2jDWL3.js.map} +1 -1
- package/dist/static/assets/{min-xFt7zeOd.js → min-Co741hTV.js} +3 -3
- package/dist/static/assets/{min-xFt7zeOd.js.map → min-Co741hTV.js.map} +1 -1
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-DT_dvf2c.js → mindmap-definition-VGOIOE7T-DvkIjoq8.js} +4 -4
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-DT_dvf2c.js.map → mindmap-definition-VGOIOE7T-DvkIjoq8.js.map} +1 -1
- package/dist/static/assets/{pieDiagram-ADFJNKIX-B1DQ-OaG.js → pieDiagram-ADFJNKIX-BGuGhTu8.js} +7 -7
- package/dist/static/assets/{pieDiagram-ADFJNKIX-B1DQ-OaG.js.map → pieDiagram-ADFJNKIX-BGuGhTu8.js.map} +1 -1
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-IHqyr3iT.js → quadrantDiagram-AYHSOK5B-DAZcrJMg.js} +3 -3
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-IHqyr3iT.js.map → quadrantDiagram-AYHSOK5B-DAZcrJMg.js.map} +1 -1
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-CKBpht7B.js → requirementDiagram-UZGBJVZJ-CXN0DxZs.js} +4 -4
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-CKBpht7B.js.map → requirementDiagram-UZGBJVZJ-CXN0DxZs.js.map} +1 -1
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-D2uGjv3i.js → sankeyDiagram-TZEHDZUN-B7-yAePZ.js} +2 -2
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-D2uGjv3i.js.map → sankeyDiagram-TZEHDZUN-B7-yAePZ.js.map} +1 -1
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-wLFRhAKd.js → sequenceDiagram-WL72ISMW-DfBNY6h_.js} +4 -4
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-wLFRhAKd.js.map → sequenceDiagram-WL72ISMW-DfBNY6h_.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-BFGQTbx5.js → stateDiagram-FKZM4ZOC-BLo1xRVY.js} +9 -9
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-BFGQTbx5.js.map → stateDiagram-FKZM4ZOC-BLo1xRVY.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-DF7AjJuk.js → stateDiagram-v2-4FDKWEC3-Dq7MAD0I.js} +5 -5
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-DF7AjJuk.js.map → stateDiagram-v2-4FDKWEC3-Dq7MAD0I.js.map} +1 -1
- package/dist/static/assets/{timeline-definition-IT6M3QCI-ChHFOb0o.js → timeline-definition-IT6M3QCI-ySWyBF3b.js} +3 -3
- package/dist/static/assets/{timeline-definition-IT6M3QCI-ChHFOb0o.js.map → timeline-definition-IT6M3QCI-ySWyBF3b.js.map} +1 -1
- package/dist/static/assets/{treemap-KMMF4GRG-BxaNvQU4.js → treemap-KMMF4GRG-DOp4sqOh.js} +4 -4
- package/dist/static/assets/{treemap-KMMF4GRG-BxaNvQU4.js.map → treemap-KMMF4GRG-DOp4sqOh.js.map} +1 -1
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-CrNKeY_-.js → xychartDiagram-PRI3JC2R-vkmh67qb.js} +3 -3
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-CrNKeY_-.js.map → xychartDiagram-PRI3JC2R-vkmh67qb.js.map} +1 -1
- package/dist/static/index.html +1 -1
- package/dist/team.js +29 -6
- package/dist/tool.js +56 -0
- package/dist/tools/builtins.js +4 -2
- package/dist/tools/context-health.js +7 -7
- package/dist/tools/os.js +267 -30
- package/dist/tools/pending-tellask-reminder.js +185 -0
- package/dist/tools/plan.js +1 -0
- package/dist/tools/ripgrep.js +145 -4
- package/dist/tools/shell-tools.js +21 -0
- package/dist/tools/team-mgmt.js +4 -4
- package/dist/tools/toolset-manual.js +74 -0
- package/dist/utils/task-doc.js +16 -16
- package/package.json +1 -1
- package/dist/minds/builtin/cmdr/persona.md +0 -3
- package/dist/minds/builtin/dijiang/knowledge.md +0 -287
- package/dist/minds/builtin/dijiang/persona.md +0 -7
- package/dist/static/assets/index-th_praGg.js.map +0 -1
- package/dist/static/testing/dom-observation-utils.js +0 -425
- package/dist/static/testing/e2e-test-helper.js +0 -3119
package/dist/docs/fbr.zh.md
CHANGED
|
@@ -1,204 +1,209 @@
|
|
|
1
|
-
# 扪心自问(FBR
|
|
1
|
+
# 扪心自问(FBR)——机制规格
|
|
2
2
|
|
|
3
3
|
英文版:[English](./fbr.md)
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
> 本文是 **FBR 规范**(以本文为准)。实现细节见:[`fbr-implementation.zh.md`](./fbr-implementation.zh.md)。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
## 1. 这是什么
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
**扪心自问(FBR, Fresh Boots Reasoning)** 是 Dominds 的一种工作机制:在主线对话推进过程中,智能体可以把一个边界清晰的子问题“拆出去”,以 **更干净的上下文** 重新推理一次,然后把结论回贴到主线对话中。
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
2. **可配置的 FBR 并发**:在 `.minds/team.yaml` 增加 `fbr-effort`(默认 `3`;“三个臭皮匠,顶个诸葛亮”):
|
|
13
|
-
- `0` 禁用该队友的 `!?@self` FBR
|
|
14
|
-
- `1..100` 表示每次 `!?@self` 会并发创建这么多个 FBR 支线对话
|
|
15
|
-
- `> 100` 视为配置错误(直接报错)
|
|
16
|
-
3. **FBR 专用模型参数覆盖**:在 `.minds/team.yaml` 增加 `fbr_model_params`,其格式与 `model_params` 完全相同(参考 `dominds/main/llm/defaults.yaml` 的 `model_param_options`)。目的:FBR 时可使用不同的模型参数(例如更高的 `temperature`),而不影响主线对话。
|
|
17
|
-
- 注:通用的 `max_tokens` 允许写成顶层 `max_tokens`,也允许写成 `general.max_tokens`(与 `model_param_options` 的分组一致);二选一即可,禁止同时设置。
|
|
11
|
+
在 Dominds 里,FBR 通过 **诉请(Tellask)语法** 触发,其中 `@self` 只是入口语法(“对当前对话自身发起诉请”);FBR 的核心是运行时对这条支线对话施加的一组强制约束与并发语义。
|
|
18
12
|
|
|
19
|
-
##
|
|
13
|
+
## 2. 设计原则与取舍(为什么这样做)
|
|
20
14
|
|
|
21
|
-
|
|
22
|
-
- 支持“多样本推理”:通过并发创建多个 FBR 支线对话(`fbr-effort`)提升决策质量。
|
|
23
|
-
- 允许只在 FBR 场景调整模型参数,而不影响主线对话的整体行为风格。
|
|
15
|
+
### 2.1 可预期优先:FBR 必须“无工具”
|
|
24
16
|
|
|
25
|
-
|
|
17
|
+
FBR 的价值来自“把推理拉回文本”:让被诉请者只围绕诉请正文进行独立推理,而不是在工具、环境、副作用里游走。为此,FBR 支线对话必须满足:
|
|
26
18
|
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
- 不改写通用的队友诉请分类法(详见 [`dialog-system.zh.md`](./dialog-system.zh.md));本文档仅约束 `@self` FBR。
|
|
19
|
+
- **技术上 0 工具**(不是“提示词里说别用工具”)
|
|
20
|
+
- **上下文以诉请正文为权威**(不是“默认继承主线历史”)
|
|
30
21
|
|
|
31
|
-
|
|
22
|
+
这两点让 FBR 更像一个可控的“推理试算器”,而不是另一个会自行探索环境的智能体。
|
|
32
23
|
|
|
33
|
-
|
|
34
|
-
- **诉请(Tellask)**:以 `!?@...` 形式对某个对话参与方(包括 `@self`)发起的结构化请求。
|
|
35
|
-
- **诉请者 / 被诉请者**:一次诉请中的请求方 / 应答方。
|
|
36
|
-
- **主线对话 / 支线对话**:对外用语,用于描述承载主要推进的对话线程及其临时工作线程。
|
|
37
|
-
(实现语境中可能出现 `root/main/subdialog` 等术语;不要把这些实现术语写进用户可见提示词/示例。)
|
|
24
|
+
### 2.2 不搞隐式魔法:禁用就要明确失败
|
|
38
25
|
|
|
39
|
-
|
|
26
|
+
如果团队配置禁用了 FBR(例如 `fbr-effort: 0`),运行时必须 **对用户可见且清晰地拒绝** `!?@self`,避免“看起来发了诉请、实际上被静默忽略”的隐性失败。
|
|
40
27
|
|
|
41
|
-
###
|
|
28
|
+
### 2.3 多样本推理,而不是“多代理协作”
|
|
42
29
|
|
|
43
|
-
|
|
30
|
+
`fbr-effort` 的并发语义并不是让多条支线相互对话或协作,而是 **并行产生多个互相独立的推理样本**,由主线对话负责综合提炼。
|
|
44
31
|
|
|
45
|
-
|
|
46
|
-
- 少用(可恢复):`!?@self !tellaskSession <tellaskSession>`(该支线对话会携带自身既有的 `tellaskSession` 历史)
|
|
32
|
+
## 3. 用户语法(`@self` 只是入口)
|
|
47
33
|
|
|
48
|
-
|
|
34
|
+
### 3.1 触发语法
|
|
49
35
|
|
|
50
|
-
|
|
36
|
+
以下两种语法都触发 FBR:
|
|
51
37
|
|
|
52
|
-
|
|
38
|
+
- **默认(瞬态)**:`!?@self`
|
|
39
|
+
- **少用(可恢复)**:`!?@self !tellaskSession <tellaskSession>`
|
|
53
40
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
41
|
+
说明:
|
|
42
|
+
|
|
43
|
+
- `@self` 表示“对当前对话自身(同一 agentId)发起诉请”。它是 **自诉请的显式语法**,用于避免把 `@teammate` 的引用/回声误判成“自己给自己诉请”。
|
|
44
|
+
- FBR 的“可恢复”能力来自 `!tellaskSession`(Tellask 会话寻址),而不是来自 `@self` 本身。
|
|
45
|
+
|
|
46
|
+
### 3.2 作用域
|
|
47
|
+
|
|
48
|
+
本文档只定义 **FBR 机制**,并说明其通过 `!?@self` 触发的行为契约。一般的队友诉请(`!?@<teammate>`)仍按 [`dialog-system.zh.md`](./dialog-system.zh.md) 的 Tellask 分类与能力模型执行。
|
|
49
|
+
|
|
50
|
+
如果你需要“同人设但可用工具”的支线对话,不要用 `@self`;请使用一个明确的队友身份并授予其相应工具集(或用显式 `@<agentId>` 的一般诉请机制)。
|
|
51
|
+
|
|
52
|
+
## 4. 运行时契约(必须做到什么)
|
|
53
|
+
|
|
54
|
+
本节使用“必须/不得/应/可”描述运行时的强制要求。
|
|
55
|
+
|
|
56
|
+
### 4.1 隔离与上下文
|
|
57
|
+
|
|
58
|
+
当运行时驱动由 `!?@self` 创建的 FBR 支线对话时,必须强制满足:
|
|
59
|
+
|
|
60
|
+
- **不依赖诉请者对话上下文**:
|
|
59
61
|
- 被诉请者不得假设能访问诉请者的主线/支线对话历史
|
|
60
62
|
- 被诉请者必须把诉请正文当作主要且权威的任务上下文
|
|
61
|
-
- 若使用 `!tellaskSession
|
|
62
|
-
|
|
63
|
+
- 若使用 `!tellaskSession`(可恢复)形式,被诉请者可以使用 **自身** 的 `tellaskSession` 历史作为显式上下文
|
|
64
|
+
- **不得通过工具补上下文**:
|
|
65
|
+
- 不得读文件/跑命令/浏览
|
|
66
|
+
- 不得读取 Memory 或 rtws(运行时工作区)状态
|
|
63
67
|
|
|
64
|
-
|
|
68
|
+
直觉上:FBR 的“初心”不是“忘掉一切系统规则”,而是“相对诉请者对话不继承历史”。运行时仍可能无条件注入基础规则(安全、格式、少量只读摘要等),但 **推理依据必须以诉请正文为主**(可恢复形式除外:可使用自身历史)。
|
|
65
69
|
|
|
66
|
-
###
|
|
70
|
+
### 4.2 无工具(提示词 + 技术强制)
|
|
67
71
|
|
|
68
|
-
|
|
72
|
+
FBR 的无工具约束必须同时满足两类要求:
|
|
69
73
|
|
|
70
|
-
|
|
74
|
+
1. **提示词契约**:运行时必须把“无工具”约束表达得明确无歧义。
|
|
75
|
+
2. **API/传输层契约**:运行时必须在技术上强制执行“0 工具”。
|
|
71
76
|
|
|
72
|
-
|
|
77
|
+
#### 4.2.1 system prompt 的要求(不得包含工具说明)
|
|
73
78
|
|
|
74
|
-
|
|
75
|
-
- 请求 payload 中不得包含任何 tool/function 定义(有效工具列表必须为空)
|
|
76
|
-
- 不得启用提供方支持的任何“工具调用模式 / 工具选择 / 函数调用 开关”
|
|
77
|
-
- 即便提供方 SDK 默认会接受工具调用,运行时也必须拒绝 FBR 中模型发出的任何工具调用企图。
|
|
79
|
+
FBR 支线对话的 system prompt 必须明确包含(措辞可不同,但语义必须到位):
|
|
78
80
|
|
|
79
|
-
|
|
81
|
+
- 这是一次 FBR 支线对话,诉请正文是主要任务上下文
|
|
82
|
+
- 不要假设能访问诉请者对话历史
|
|
83
|
+
- 若诉请正文缺少关键上下文,需要列出缺失信息与阻塞原因
|
|
84
|
+
- 仅当必须澄清关键缺失上下文时,允许 `!?@tellasker` 回问诉请者;除此之外不要发起任何诉请
|
|
80
85
|
|
|
81
|
-
|
|
86
|
+
同时,**system prompt 本体不得包含任何工具说明**(不得出现“有哪些工具/如何用工具/例子命令/白名单”等)。
|
|
82
87
|
|
|
83
|
-
|
|
84
|
-
- 你不能直接访问 rtws(运行时工作区) / 文件 / 浏览器 / shell(工具调用已禁用)。
|
|
85
|
-
- 诉请正文是**主要任务上下文**;不要假设你能访问诉请者线程历史。
|
|
86
|
-
- 若这是可恢复的 `!tellaskSession` FBR,你可以使用**自身**既有的 `tellaskSession` 历史作为显式上下文。
|
|
87
|
-
- 若诉请正文缺少关键上下文,你需要列出缺失信息及其阻塞原因。
|
|
88
|
-
- 仅当你必须澄清关键缺失上下文时,允许 `!?@tellasker` 回问诉请者;除此之外不要发起任何诉请。
|
|
88
|
+
#### 4.2.2 附加“无工具提示”(唯一允许的工具相关文本)
|
|
89
89
|
|
|
90
|
-
|
|
90
|
+
关于工具可用性的所有表达必须收敛到单独附加的一段“无工具提示”,并且:
|
|
91
91
|
|
|
92
|
-
|
|
92
|
+
- 该提示必须 **简短、固定、不可扩展**
|
|
93
|
+
- 必须明确声明:
|
|
94
|
+
- 没有任何工具,不能调用工具
|
|
95
|
+
- 不能访问 rtws / 文件 / 浏览器 / shell
|
|
96
|
+
- 不得包含任何工具清单、允许列表、示例命令或执行指导
|
|
97
|
+
|
|
98
|
+
如果提供方集成通常会注入工具提示(或工具结构),那么对 FBR 必须二选一:
|
|
93
99
|
|
|
94
100
|
- 完全不注入工具提示,或
|
|
95
|
-
-
|
|
101
|
+
- 仅注入与“无工具提示”**完全一致**的文本
|
|
96
102
|
|
|
97
103
|
无论如何,FBR 支线对话都不应看到任何工具定义。
|
|
98
104
|
|
|
99
|
-
|
|
105
|
+
#### 4.2.3 LLM 请求必须是“0 工具”
|
|
100
106
|
|
|
101
|
-
FBR
|
|
107
|
+
发起 `@self` FBR 支线对话的 LLM 请求必须做到 **0 个可用工具**:
|
|
102
108
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
3. **前提假设**(应明确标注来源:诉请正文/会话历史)
|
|
106
|
-
4. **未知项 / 缺失上下文**
|
|
107
|
-
5. **下一步**(由诉请者在主线对话中执行;主线对话可能具备工具)
|
|
108
|
-
|
|
109
|
-
### 执行与错误处理
|
|
109
|
+
- 请求 payload 中不得包含任何 tool/function 定义(有效工具列表必须为空)
|
|
110
|
+
- 不得启用提供方支持的任何“工具调用模式 / 工具选择 / 函数调用”开关
|
|
110
111
|
|
|
111
|
-
|
|
112
|
-
- 错误应当“响亮且可调试”(例如在日志/事件中携带明确的错误原因标识)。
|
|
112
|
+
并且:如果模型仍尝试发出 tool/function call,运行时必须视为违规并硬拒绝(见 4.5)。
|
|
113
113
|
|
|
114
|
-
|
|
114
|
+
### 4.3 诉请限制:仅允许 `!?@tellasker`
|
|
115
115
|
|
|
116
|
-
|
|
116
|
+
FBR 支线对话不得发起任何队友诉请(包括 `!?@human`)。唯一例外是 `!?@tellasker`:
|
|
117
117
|
|
|
118
|
-
|
|
118
|
+
- 仅支线对话可用,用于回问上游诉请者对话
|
|
119
|
+
- 仅当必须澄清关键缺失上下文时才允许
|
|
120
|
+
- 允许“回问”,不鼓励“把任务推回去”
|
|
119
121
|
|
|
120
|
-
|
|
122
|
+
### 4.4 输出契约(便于主线综合)
|
|
121
123
|
|
|
122
|
-
|
|
124
|
+
FBR 支线对话应产出一份便于诉请者整合的简明推理结果。推荐结构(不强制):
|
|
123
125
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
- `< 0` 或非整数:配置错误
|
|
126
|
+
1. **结论 / 建议**
|
|
127
|
+
2. **推理过程**(基于诉请正文;若为可恢复形式,可结合自身 `tellaskSession` 历史)
|
|
128
|
+
3. **前提假设**(明确标注来源:诉请正文/会话历史)
|
|
129
|
+
4. **未知与缺口**(如果有)
|
|
130
|
+
5. **给主线的下一步**(主线可能有工具/队友,可在主线执行)
|
|
130
131
|
|
|
131
|
-
|
|
132
|
+
### 4.5 违规与报错(必须“响亮可调试”)
|
|
132
133
|
|
|
133
|
-
-
|
|
134
|
+
- 若 FBR 支线对话尝试发起违规诉请(非 `@tellasker`)或尝试 tool/function call,运行时必须硬拒绝该次驱动。
|
|
135
|
+
- 反馈必须 **对用户可见、语义清晰**,并且日志/事件中应包含可检索的错误原因字符串,避免静默吞掉。
|
|
134
136
|
|
|
135
|
-
|
|
137
|
+
## 5. 并发语义:`fbr-effort`
|
|
136
138
|
|
|
137
|
-
|
|
139
|
+
`fbr-effort` 是 **按队友成员(member)配置** 的整数参数,也可以放在 `member_defaults` 里作为 rtws 默认值。
|
|
138
140
|
|
|
139
|
-
-
|
|
140
|
-
-
|
|
141
|
-
-
|
|
142
|
-
-
|
|
143
|
-
|
|
141
|
+
- 类型:整数
|
|
142
|
+
- 默认:`3`
|
|
143
|
+
- `0`:禁用该成员的 `!?@self` FBR(必须明确报错拒绝)
|
|
144
|
+
- `1..100`:每次 `!?@self` 并发创建 N 条 FBR 支线对话
|
|
145
|
+
- `> 100` / 非整数 / 负数:配置错误(直接报错,不做 clamp)
|
|
144
146
|
|
|
145
|
-
|
|
147
|
+
当 `fbr-effort = N`:
|
|
146
148
|
|
|
147
|
-
|
|
149
|
+
- 运行时必须把一条 `!?@self` 扩展为 **N 条并行的无工具 FBR 支线对话**
|
|
150
|
+
- 每条支线接收相同的诉请正文与相同的 FBR 提示词约束
|
|
151
|
+
- 主线必须接收全部 N 条回贴;**不应依赖固定顺序**(可按完成顺序回贴)
|
|
148
152
|
|
|
149
|
-
|
|
153
|
+
对可恢复的 `!?@self !tellaskSession <tellaskSession>` 形式,若 `N > 1`,运行时必须派生出 **不同的**
|
|
154
|
+
会话键,使并行支线互不共享历史(推荐:`<tellaskSession>.fbr-<i>`)。
|
|
150
155
|
|
|
151
|
-
|
|
152
|
-
- 作用域:仅对 `!?@self` FBR 支线对话生效
|
|
153
|
-
- 非 FBR 场景仍使用正常的 `model_params`
|
|
156
|
+
## 6. 模型参数覆盖:`fbr_model_params`
|
|
154
157
|
|
|
155
|
-
|
|
158
|
+
`fbr_model_params` 用于只在驱动 FBR 支线对话时覆盖模型参数:
|
|
156
159
|
|
|
157
|
-
-
|
|
158
|
-
-
|
|
160
|
+
- 结构:与 `model_params` 完全一致(参考 `dominds/main/llm/defaults.yaml` 的 `model_param_options`)
|
|
161
|
+
- 作用域:仅对 `!?@self` FBR 生效
|
|
162
|
+
- 合并:建议在成员的有效 `model_params` 之上做深合并覆盖(便于只改少数字段,如 `temperature`)
|
|
163
|
+
- `max_tokens` 允许写成顶层 `max_tokens`,也允许写成 `general.max_tokens`;二选一,禁止同时设置
|
|
159
164
|
|
|
160
|
-
##
|
|
165
|
+
## 7. 配置示例
|
|
161
166
|
|
|
162
|
-
###
|
|
167
|
+
### 7.1 诉请正文必须自给自足
|
|
163
168
|
|
|
164
|
-
|
|
169
|
+
坏例(依赖外部上下文与工具):
|
|
165
170
|
|
|
166
171
|
```text
|
|
167
172
|
!?@self
|
|
168
|
-
|
|
173
|
+
把 bug 找出来并修掉。
|
|
169
174
|
```
|
|
170
175
|
|
|
171
|
-
|
|
176
|
+
好例(把关键上下文写进正文):
|
|
172
177
|
|
|
173
178
|
```text
|
|
174
179
|
!?@self
|
|
175
|
-
|
|
180
|
+
你正在做无工具的 FBR。请只使用下方文本推理。
|
|
176
181
|
|
|
177
|
-
|
|
182
|
+
目标:判断最可能的根因,并给出 2–3 个可行修复方向。
|
|
178
183
|
|
|
179
184
|
现象:
|
|
180
|
-
- 点击 “Run”
|
|
185
|
+
- 点击 “Run” 偶发卡死 ~10 秒。
|
|
181
186
|
|
|
182
187
|
约束:
|
|
183
188
|
- 不能改后端协议。
|
|
184
189
|
|
|
185
|
-
|
|
186
|
-
|
|
190
|
+
线索(日志/片段):
|
|
191
|
+
<粘贴相关日志或代码片段>
|
|
187
192
|
```
|
|
188
193
|
|
|
189
|
-
### `.minds/team.yaml`
|
|
194
|
+
### 7.2 `.minds/team.yaml`
|
|
190
195
|
|
|
191
196
|
```yaml
|
|
192
197
|
member_defaults:
|
|
193
|
-
# 默认每次 `!?@self` 并发创建 3 条无工具 FBR
|
|
198
|
+
# 默认每次 `!?@self` 并发创建 3 条无工具 FBR 支线对话。
|
|
194
199
|
fbr-effort: 3
|
|
195
200
|
|
|
196
201
|
members:
|
|
197
202
|
ux:
|
|
198
|
-
# 每次 `!?@self` 并发创建 5
|
|
203
|
+
# 每次 `!?@self` 并发创建 5 条独立推理样本。
|
|
199
204
|
fbr-effort: 5
|
|
200
205
|
|
|
201
|
-
# 让 FBR
|
|
206
|
+
# 让 FBR 更“发散”,但不影响主线风格。
|
|
202
207
|
fbr_model_params:
|
|
203
208
|
codex:
|
|
204
209
|
temperature: 0.9
|
|
@@ -207,15 +212,16 @@ members:
|
|
|
207
212
|
max_tokens: 1200
|
|
208
213
|
```
|
|
209
214
|
|
|
210
|
-
##
|
|
215
|
+
## 8. 与一般支线对话的关系(避免混用)
|
|
211
216
|
|
|
212
|
-
-
|
|
213
|
-
|
|
214
|
-
-
|
|
217
|
+
- `!?@self` 的 FBR 支线对话是 **特例**:无工具、正文优先、诉请受限、可并发扩展。
|
|
218
|
+
- 一般的 `!?@<teammate>` 支线对话仍是“完整能力”的(可按配置拥有工具与工具集)。
|
|
219
|
+
- 若你需要“同人设 + 可用工具”的支线,不要用 `@self`;请显式配置一个队友身份来承载这类工作线程。
|
|
215
220
|
|
|
216
|
-
##
|
|
221
|
+
## 9. 验收清单(实现检查点)
|
|
217
222
|
|
|
218
|
-
- `!?@self`
|
|
219
|
-
-
|
|
220
|
-
-
|
|
221
|
-
- `
|
|
223
|
+
- `!?@self` 触发 FBR:支线对话必须无工具,并且在 API 层确认为“0 工具”请求。
|
|
224
|
+
- system prompt 本体不含工具说明;工具相关文本只能来自独立、固定的“无工具提示”。
|
|
225
|
+
- FBR 支线对话不得发起队友诉请;仅允许必要时 `!?@tellasker` 回问。
|
|
226
|
+
- `fbr-effort` 默认 `3`,接受 `0..100`,禁用时明确报错拒绝。
|
|
227
|
+
- `fbr_model_params` 仅对 FBR 生效,且与 `model_params` 同结构、按深合并覆盖。
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# Keep-Going(鞭策)— 设计文档
|
|
2
|
+
|
|
3
|
+
## 概述
|
|
4
|
+
|
|
5
|
+
Dominds 根对话旨在长期运行。根对话"停止"(变为空闲)通常不是操作员想要的:他们希望智能体持续推进,直到:
|
|
6
|
+
|
|
7
|
+
- 合法地暂停等待人类决策(Q4H),或
|
|
8
|
+
- 合法地暂停等待子对话(tellask/backfill)。
|
|
9
|
+
|
|
10
|
+
本文档指定了一个运行时机制("keep-going"),仅针对**根/主对话**,防止对话停止:每当驱动程序即将停止时,它会自动发送一个简短的鞭策语(渲染为正常的用户气泡)并继续生成,除非对话处于合法暂停状态(Q4H 或待处理的子对话)。
|
|
11
|
+
|
|
12
|
+
## 目标
|
|
13
|
+
|
|
14
|
+
- 防止根对话停止,除非处于合法暂停状态(Q4H / 子对话)。
|
|
15
|
+
- 保持行为可预测和有界(无无限循环)。
|
|
16
|
+
- 使鞭策语文本可按工作区(rtws)和语言配置。
|
|
17
|
+
- 提供清晰的用户控制的"禁用"机制。
|
|
18
|
+
|
|
19
|
+
## 非目标
|
|
20
|
+
|
|
21
|
+
- 自动完成/自动将对话标记为完成。
|
|
22
|
+
- 将此行为应用于子对话(子对话保持范围,应向其调用者报告)。
|
|
23
|
+
|
|
24
|
+
## 定义
|
|
25
|
+
|
|
26
|
+
- **根/主对话**:`RootDialog`(`dlg.id.rootId === dlg.id.selfId`),主要对话线程。
|
|
27
|
+
- **子对话**:`SubDialog`,为 tellask / 作用域工作创建。
|
|
28
|
+
- **Q4H**:"Questions for Human",通过 `!?@human` 发起,暂停对话进度直到人类响应。
|
|
29
|
+
|
|
30
|
+
## 预期的"正常"完成路径(推荐)
|
|
31
|
+
|
|
32
|
+
当智能体需要人类决策来结束时(例如,确认选择或决定是否将对话标记为完成),正确的路径是:
|
|
33
|
+
|
|
34
|
+
1. 智能体发出 Q4H(`!?@human`)并提供必要的上下文和明确的决策请求。
|
|
35
|
+
2. WebUI 清楚地呈现 Q4H。
|
|
36
|
+
3. 人类决定并:
|
|
37
|
+
- 手动将根对话标记为"完成",或
|
|
38
|
+
- 提供请求的信息以便对话继续。
|
|
39
|
+
|
|
40
|
+
这是"受控收敛"路径。keep-going 机制不应覆盖合法的暂停状态。
|
|
41
|
+
|
|
42
|
+
## Keep-Going 行为("自动继续"回退)
|
|
43
|
+
|
|
44
|
+
### 触发条件(必须全部满足)
|
|
45
|
+
|
|
46
|
+
- 对话是**根/主对话**(绝不会是子对话)。
|
|
47
|
+
- 对话**未暂停**:
|
|
48
|
+
- 没有待处理的 Q4H,并且
|
|
49
|
+
- 没有待处理的子对话(等待回填)。
|
|
50
|
+
- 驱动程序即将停止生成循环(即没有工具/函数输出需要另一次迭代)。
|
|
51
|
+
|
|
52
|
+
### 操作
|
|
53
|
+
|
|
54
|
+
运行时自动发送一个鞭策语(渲染为正常的用户气泡)并运行另一次生成迭代。
|
|
55
|
+
|
|
56
|
+
### 有界性
|
|
57
|
+
|
|
58
|
+
为避免无限循环,keep-going 有一个按对话的预算(每个成员的 `diligence-push-max`),控制对于给定对话在运行时强制 Q4H 暂停之前可以注入多少个自动继续的鞭策语。
|
|
59
|
+
|
|
60
|
+
- 默认值:**3**
|
|
61
|
+
- 如果 `< 1`,则该成员的 keep-going 有效禁用
|
|
62
|
+
- 可通过 `.minds/team.yaml` 中的 `diligence-push-max` 按成员配置
|
|
63
|
+
|
|
64
|
+
### Q4H 时重置
|
|
65
|
+
|
|
66
|
+
当对话因待处理的 Q4H(Questions for Human)而暂停时,keep-going 注入计数器会被重置。这确保在人类回答 Q4H 并恢复对话后,对话会获得新的 keep-going 预算。
|
|
67
|
+
|
|
68
|
+
### 预算耗尽 → 强制 Q4H
|
|
69
|
+
|
|
70
|
+
当 keep-going 预算耗尽时,运行时会创建一个 Q4H 条目,询问人类是否继续或停止。这将"有界性"转换为合法的暂停点,并避免无限自动继续循环。
|
|
71
|
+
|
|
72
|
+
### 禁用开关
|
|
73
|
+
|
|
74
|
+
可以通过以下任一方式按 rtws 禁用 keep-going:
|
|
75
|
+
|
|
76
|
+
- 如果选中的鞭策语文件存在但其内容为空/仅空白,则禁用 keep-going(不注入)。
|
|
77
|
+
|
|
78
|
+
可以通过以下任一方式按成员禁用 keep-going:
|
|
79
|
+
|
|
80
|
+
- 如果 `diligence-push-max < 1`,则该成员的 keep-going 被禁用(不注入)。
|
|
81
|
+
|
|
82
|
+
## 鞭策语解析
|
|
83
|
+
|
|
84
|
+
让 `<rtws>` 为当前运行时工作区(即 `process.cwd()`)。
|
|
85
|
+
|
|
86
|
+
解析顺序:
|
|
87
|
+
|
|
88
|
+
1. `<rtws>/.minds/diligence.<work-lang-id>.md`(例如,`diligence.zh.md`)
|
|
89
|
+
2. `<rtws>/.minds/diligence.md`(语言无关的回退)
|
|
90
|
+
3. 内置回退文本(硬编码的 i18n;`zh` 是规范的并嵌入在源代码中)
|
|
91
|
+
|
|
92
|
+
如果上述顺序中第一个存在的文件具有空/空白内容,则**禁用** keep-going。
|
|
93
|
+
|
|
94
|
+
注意:鞭策语文件中的 YAML frontmatter 会被运行时忽略。如果存在,它被视为非内容元数据并从提示正文中剥离。
|
|
95
|
+
|
|
96
|
+
### 团队成员上限:`diligence-push-max`
|
|
97
|
+
|
|
98
|
+
每个团队成员可以选择通过 `.minds/team.yaml` 限制 keep-going:
|
|
99
|
+
|
|
100
|
+
```yaml
|
|
101
|
+
members:
|
|
102
|
+
alice:
|
|
103
|
+
diligence-push-max: 10
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
规则:
|
|
107
|
+
|
|
108
|
+
- 如果缺失,`diligence-push-max` 对于该成员默认为 **3**。
|
|
109
|
+
- 如果 `diligence-push-max < 1`,则该成员的 keep-going 被禁用(不注入),即使鞭策语文件存在。
|
|
110
|
+
- 内置影子成员 `fuxi` 和 `pangu` 默认为 `diligence-push-max: 0`,除非在 team.yaml 中显式覆盖。
|
|
111
|
+
|
|
112
|
+
## UX 备注
|
|
113
|
+
|
|
114
|
+
- Keep-going 是一个仅运行时的提示,但它应该是**可见的**:鞭策语渲染为正常的用户消息气泡(由运行时自动发送),以便操作员理解为什么会出现额外的迭代。
|
|
115
|
+
- 用户应该观察到智能体在仅工具操作后继续简短的跟进。
|
|
116
|
+
- 当智能体真正需要用户干预时,它应该使用 Q4H。Keep-going 不应试图"假装"完成。
|
|
117
|
+
|
|
118
|
+
## 实现(后端)
|
|
119
|
+
|
|
120
|
+
### 位置
|
|
121
|
+
|
|
122
|
+
在 LLM 驱动程序循环中实现(`dominds/main/llm/driver.ts`),作为迭代后的小检查:
|
|
123
|
+
|
|
124
|
+
1. 如果 `suspendForHuman` 为 true,则停止(Q4H / 子对话待处理)。
|
|
125
|
+
2. 如果有任何工具反馈,则正常继续。
|
|
126
|
+
3. 否则(仅限根),尝试 keep-going 自动继续:
|
|
127
|
+
- 如果禁用 → 正常停止。
|
|
128
|
+
- 如果预算耗尽 → 创建 Q4H 并停止。
|
|
129
|
+
- 否则 → 自动发送鞭策语并继续。
|
|
130
|
+
|
|
131
|
+
### 消息类型
|
|
132
|
+
|
|
133
|
+
我们将鞭策语作为自动发送的用户消息注入:
|
|
134
|
+
|
|
135
|
+
- 类型为 `prompting_msg`、角色为 `'user'` 的 `ChatMessage`
|
|
136
|
+
|
|
137
|
+
这确保了:
|
|
138
|
+
|
|
139
|
+
- 它存在于模型上下文中
|
|
140
|
+
- 它作为人类消息记录持久化
|
|
141
|
+
- 它在聊天时间线中渲染为正常的用户气泡(像任何其他用户消息一样)
|
|
142
|
+
|
|
143
|
+
## 可观察性
|
|
144
|
+
|
|
145
|
+
建议的后续步骤(初始实现不需要):
|
|
146
|
+
|
|
147
|
+
- 当触发 keep-going 时添加结构化日志行,包括:
|
|
148
|
+
- 对话 id
|
|
149
|
+
- 语言
|
|
150
|
+
- 使用的鞭策语来源(语言特定/通用/内置/禁用)
|
|
151
|
+
- 为"keep-going 触发"和"keep-going 因空文件禁用"添加可选的指标计数器。
|
|
152
|
+
|
|
153
|
+
## 测试
|
|
154
|
+
|
|
155
|
+
回归测试应覆盖:
|
|
156
|
+
|
|
157
|
+
- 根对话:仅工具输出 → 鞭策语注入 → 继续响应
|
|
158
|
+
- 根对话:空助手输出 → 鞭策语注入 → 继续响应
|
|
159
|
+
- 子对话:无鞭策语注入
|
|
160
|
+
- 工作区配置:
|
|
161
|
+
- 当语言特定文件缺失时,`.minds/diligence.md` 被遵守
|
|
162
|
+
- 空的鞭策语文件禁用 keep-going
|