dominds 0.7.6 → 0.8.2
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/README.md +2 -2
- package/README.zh.md +2 -2
- package/dist/agent-priming.js +169 -200
- package/dist/cli/read.js +2 -7
- package/dist/dialog-factory.js +6 -4
- package/dist/dialog-instance-registry.js +2 -2
- package/dist/dialog.js +99 -91
- package/dist/docs/dialog-persistence.md +2 -2
- package/dist/docs/dialog-persistence.zh.md +2 -2
- package/dist/docs/dialog-system.md +86 -90
- package/dist/docs/dialog-system.zh.md +82 -83
- package/dist/docs/diligence-push.md +2 -2
- package/dist/docs/diligence-push.zh.md +2 -2
- package/dist/docs/dominds-agent-priming.md +11 -11
- package/dist/docs/dominds-agent-priming.zh.md +9 -9
- package/dist/docs/dominds-terminology.md +34 -34
- package/dist/docs/fbr-implementation.md +4 -4
- package/dist/docs/fbr-implementation.zh.md +4 -4
- package/dist/docs/fbr.md +31 -53
- package/dist/docs/fbr.zh.md +30 -48
- package/dist/docs/mottos.md +2 -3
- package/dist/docs/mottos.zh.md +2 -2
- package/dist/docs/q4h.md +6 -6
- package/dist/docs/q4h.zh.md +6 -6
- package/dist/docs/tellask-collab.md +13 -13
- package/dist/docs/tellask-collab.zh.md +18 -18
- package/dist/llm/driver-entry.js +9 -33
- package/dist/llm/driver-v2/core.js +413 -111
- package/dist/llm/driver-v2/index.js +5 -0
- package/dist/llm/driver-v2/orchestrator.js +4 -3
- package/dist/llm/driver-v2/policy.js +17 -23
- package/dist/llm/driver-v2/restore-dialog-hierarchy.js +73 -0
- package/dist/llm/driver-v2/round.js +18 -7
- package/dist/llm/driver-v2/runtime-utils.js +3 -5
- package/dist/llm/driver-v2/saying-events.js +4 -42
- package/dist/llm/driver-v2/supdialog-response.js +110 -23
- package/dist/llm/driver-v2/tellask-bridge.js +560 -458
- package/dist/mcp/sdk-client.js +1 -1
- package/dist/mcp/server-runtime.js +1 -1
- package/dist/mcp/stdio-client.js +6 -6
- package/dist/mcp/tool-names.js +1 -1
- package/dist/minds/builtin/fuxi/persona.en.md +10 -10
- package/dist/minds/builtin/fuxi/persona.zh.md +12 -12
- package/dist/minds/builtin/pangu/persona.en.md +7 -7
- package/dist/minds/builtin/pangu/persona.zh.md +6 -6
- package/dist/minds/minds-i18n.js +2 -2
- package/dist/minds/system-prompt-parts.js +15 -12
- package/dist/minds/system-prompt.js +58 -56
- package/dist/persistence.js +675 -527
- package/dist/server/api-routes.js +1 -1
- package/dist/server/websocket-handler.js +10 -20
- package/dist/server.js +3 -3
- package/dist/shared/diligence.js +12 -12
- package/dist/shared/i18n/driver-messages.js +28 -118
- package/dist/shared/utils/inter-dialog-format.js +53 -53
- package/dist/snippets/starting.en.md +1 -1
- package/dist/snippets/starting.zh.md +1 -2
- package/dist/static/assets/{_baseUniq-2IQvcpiv.js → _baseUniq-D4N_zVXV.js} +2 -2
- package/dist/static/assets/{_baseUniq-2IQvcpiv.js.map → _baseUniq-D4N_zVXV.js.map} +1 -1
- package/dist/static/assets/{arc-Boi4s2EY.js → arc-7bP9qomB.js} +2 -2
- package/dist/static/assets/{arc-Boi4s2EY.js.map → arc-7bP9qomB.js.map} +1 -1
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-CV1IIalQ.js → architectureDiagram-VXUJARFQ-DToIiZuZ.js} +6 -6
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-CV1IIalQ.js.map → architectureDiagram-VXUJARFQ-DToIiZuZ.js.map} +1 -1
- package/dist/static/assets/{blockDiagram-VD42YOAC-C66ZvUb1.js → blockDiagram-VD42YOAC-C-pRNHpf.js} +7 -7
- package/dist/static/assets/{blockDiagram-VD42YOAC-C66ZvUb1.js.map → blockDiagram-VD42YOAC-C-pRNHpf.js.map} +1 -1
- package/dist/static/assets/{c4Diagram-YG6GDRKO-2YQZQ-KQ.js → c4Diagram-YG6GDRKO-Bnp-nWKO.js} +3 -3
- package/dist/static/assets/{c4Diagram-YG6GDRKO-2YQZQ-KQ.js.map → c4Diagram-YG6GDRKO-Bnp-nWKO.js.map} +1 -1
- package/dist/static/assets/{channel-DBG_xYT_.js → channel-CTv1SsAF.js} +2 -2
- package/dist/static/assets/{channel-DBG_xYT_.js.map → channel-CTv1SsAF.js.map} +1 -1
- package/dist/static/assets/{chunk-4BX2VUAB-D92pQ5qM.js → chunk-4BX2VUAB-D_OGa3ss.js} +2 -2
- package/dist/static/assets/{chunk-4BX2VUAB-D92pQ5qM.js.map → chunk-4BX2VUAB-D_OGa3ss.js.map} +1 -1
- package/dist/static/assets/{chunk-55IACEB6-T3IKxvjm.js → chunk-55IACEB6-I4o4MCuM.js} +2 -2
- package/dist/static/assets/{chunk-55IACEB6-T3IKxvjm.js.map → chunk-55IACEB6-I4o4MCuM.js.map} +1 -1
- package/dist/static/assets/{chunk-B4BG7PRW-SKDCq7xY.js → chunk-B4BG7PRW-Bp-TIXg6.js} +5 -5
- package/dist/static/assets/{chunk-B4BG7PRW-SKDCq7xY.js.map → chunk-B4BG7PRW-Bp-TIXg6.js.map} +1 -1
- package/dist/static/assets/{chunk-DI55MBZ5-CKY9xXzj.js → chunk-DI55MBZ5-Bnph5Hmd.js} +4 -4
- package/dist/static/assets/{chunk-DI55MBZ5-CKY9xXzj.js.map → chunk-DI55MBZ5-Bnph5Hmd.js.map} +1 -1
- package/dist/static/assets/{chunk-FMBD7UC4-CzaQthG_.js → chunk-FMBD7UC4-q3UyRsNI.js} +2 -2
- package/dist/static/assets/{chunk-FMBD7UC4-CzaQthG_.js.map → chunk-FMBD7UC4-q3UyRsNI.js.map} +1 -1
- package/dist/static/assets/{chunk-QN33PNHL-8v7ASP75.js → chunk-QN33PNHL-BxUlvLXP.js} +2 -2
- package/dist/static/assets/{chunk-QN33PNHL-8v7ASP75.js.map → chunk-QN33PNHL-BxUlvLXP.js.map} +1 -1
- package/dist/static/assets/{chunk-QZHKN3VN-Cd3_mr-D.js → chunk-QZHKN3VN-DpQR9BVw.js} +2 -2
- package/dist/static/assets/{chunk-QZHKN3VN-Cd3_mr-D.js.map → chunk-QZHKN3VN-DpQR9BVw.js.map} +1 -1
- package/dist/static/assets/{chunk-TZMSLE5B-BrTyfkJK.js → chunk-TZMSLE5B-BX8vrVo0.js} +2 -2
- package/dist/static/assets/{chunk-TZMSLE5B-BrTyfkJK.js.map → chunk-TZMSLE5B-BX8vrVo0.js.map} +1 -1
- package/dist/static/assets/{classDiagram-2ON5EDUG-pLBmQ3Qa.js → classDiagram-2ON5EDUG-Ccx5_2Xq.js} +6 -6
- package/dist/static/assets/{classDiagram-2ON5EDUG-pLBmQ3Qa.js.map → classDiagram-2ON5EDUG-Ccx5_2Xq.js.map} +1 -1
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-pLBmQ3Qa.js → classDiagram-v2-WZHVMYZB-Ccx5_2Xq.js} +6 -6
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-pLBmQ3Qa.js.map → classDiagram-v2-WZHVMYZB-Ccx5_2Xq.js.map} +1 -1
- package/dist/static/assets/{clone-rjxmrDHc.js → clone-Cl5zSMrO.js} +2 -2
- package/dist/static/assets/{clone-rjxmrDHc.js.map → clone-Cl5zSMrO.js.map} +1 -1
- package/dist/static/assets/{cose-bilkent-S5V4N54A-DaW3q2vS.js → cose-bilkent-S5V4N54A-B-FUX86B.js} +2 -2
- package/dist/static/assets/{cose-bilkent-S5V4N54A-DaW3q2vS.js.map → cose-bilkent-S5V4N54A-B-FUX86B.js.map} +1 -1
- package/dist/static/assets/{dagre-6UL2VRFP-BT252775.js → dagre-6UL2VRFP-Bj8vSSpT.js} +7 -7
- package/dist/static/assets/{dagre-6UL2VRFP-BT252775.js.map → dagre-6UL2VRFP-Bj8vSSpT.js.map} +1 -1
- package/dist/static/assets/{diagram-PSM6KHXK-Cp0jEYgm.js → diagram-PSM6KHXK-BPcgy7jf.js} +7 -7
- package/dist/static/assets/{diagram-PSM6KHXK-Cp0jEYgm.js.map → diagram-PSM6KHXK-BPcgy7jf.js.map} +1 -1
- package/dist/static/assets/{diagram-QEK2KX5R-BYEiCch_.js → diagram-QEK2KX5R-DHxd6LWi.js} +6 -6
- package/dist/static/assets/{diagram-QEK2KX5R-BYEiCch_.js.map → diagram-QEK2KX5R-DHxd6LWi.js.map} +1 -1
- package/dist/static/assets/{diagram-S2PKOQOG-SNGZ1B53.js → diagram-S2PKOQOG-C4ynhhLr.js} +6 -6
- package/dist/static/assets/{diagram-S2PKOQOG-SNGZ1B53.js.map → diagram-S2PKOQOG-C4ynhhLr.js.map} +1 -1
- package/dist/static/assets/{erDiagram-Q2GNP2WA-CMdkkngT.js → erDiagram-Q2GNP2WA-CQ25uxxf.js} +5 -5
- package/dist/static/assets/{erDiagram-Q2GNP2WA-CMdkkngT.js.map → erDiagram-Q2GNP2WA-CQ25uxxf.js.map} +1 -1
- package/dist/static/assets/{flowDiagram-NV44I4VS-k203P84f.js → flowDiagram-NV44I4VS-ChkkAldk.js} +6 -6
- package/dist/static/assets/{flowDiagram-NV44I4VS-k203P84f.js.map → flowDiagram-NV44I4VS-ChkkAldk.js.map} +1 -1
- package/dist/static/assets/{ganttDiagram-JELNMOA3-CgsVe01-.js → ganttDiagram-JELNMOA3-CBt_Zorl.js} +3 -3
- package/dist/static/assets/{ganttDiagram-JELNMOA3-CgsVe01-.js.map → ganttDiagram-JELNMOA3-CBt_Zorl.js.map} +1 -1
- package/dist/static/assets/{gitGraphDiagram-NY62KEGX-BGOR_N5w.js → gitGraphDiagram-NY62KEGX-CtBc2dOO.js} +7 -7
- package/dist/static/assets/{gitGraphDiagram-NY62KEGX-BGOR_N5w.js.map → gitGraphDiagram-NY62KEGX-CtBc2dOO.js.map} +1 -1
- package/dist/static/assets/{graph-DDHIhCSW.js → graph-BGzNnzuI.js} +3 -3
- package/dist/static/assets/{graph-DDHIhCSW.js.map → graph-BGzNnzuI.js.map} +1 -1
- package/dist/static/assets/{index-CUZD-Ua6.js → index-Vrp1PT3b.js} +654 -355
- package/dist/static/assets/index-Vrp1PT3b.js.map +1 -0
- package/dist/static/assets/{infoDiagram-WHAUD3N6-D0GlWUIm.js → infoDiagram-WHAUD3N6-BYJF-Ol5.js} +5 -5
- package/dist/static/assets/{infoDiagram-WHAUD3N6-D0GlWUIm.js.map → infoDiagram-WHAUD3N6-BYJF-Ol5.js.map} +1 -1
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-I0W1fDTZ.js → journeyDiagram-XKPGCS4Q-Cl2p8ZBw.js} +5 -5
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-I0W1fDTZ.js.map → journeyDiagram-XKPGCS4Q-Cl2p8ZBw.js.map} +1 -1
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-BY5xVZyl.js → kanban-definition-3W4ZIXB7-DBH-HEwY.js} +3 -3
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-BY5xVZyl.js.map → kanban-definition-3W4ZIXB7-DBH-HEwY.js.map} +1 -1
- package/dist/static/assets/{layout-C7mFT1m6.js → layout-DdWO-uEo.js} +5 -5
- package/dist/static/assets/{layout-C7mFT1m6.js.map → layout-DdWO-uEo.js.map} +1 -1
- package/dist/static/assets/{linear-WSX0brRY.js → linear-BY3MovaF.js} +2 -2
- package/dist/static/assets/{linear-WSX0brRY.js.map → linear-BY3MovaF.js.map} +1 -1
- package/dist/static/assets/{min-DOTQTP4p.js → min-aHCJK1uN.js} +3 -3
- package/dist/static/assets/{min-DOTQTP4p.js.map → min-aHCJK1uN.js.map} +1 -1
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-BWhHo-Hq.js → mindmap-definition-VGOIOE7T-BjJnBRtB.js} +4 -4
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-BWhHo-Hq.js.map → mindmap-definition-VGOIOE7T-BjJnBRtB.js.map} +1 -1
- package/dist/static/assets/{pieDiagram-ADFJNKIX-B91oxvos.js → pieDiagram-ADFJNKIX-xAcmdymv.js} +7 -7
- package/dist/static/assets/{pieDiagram-ADFJNKIX-B91oxvos.js.map → pieDiagram-ADFJNKIX-xAcmdymv.js.map} +1 -1
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-DqMUyBPr.js → quadrantDiagram-AYHSOK5B-BPbEGCEj.js} +3 -3
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-DqMUyBPr.js.map → quadrantDiagram-AYHSOK5B-BPbEGCEj.js.map} +1 -1
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-COUayA3m.js → requirementDiagram-UZGBJVZJ--w6UfXy0.js} +4 -4
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-COUayA3m.js.map → requirementDiagram-UZGBJVZJ--w6UfXy0.js.map} +1 -1
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-Bp9r8YDi.js → sankeyDiagram-TZEHDZUN-B_T6TQwh.js} +2 -2
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-Bp9r8YDi.js.map → sankeyDiagram-TZEHDZUN-B_T6TQwh.js.map} +1 -1
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-CpuTC5cG.js → sequenceDiagram-WL72ISMW-DX_oVvqA.js} +4 -4
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-CpuTC5cG.js.map → sequenceDiagram-WL72ISMW-DX_oVvqA.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-Bxoo7e6E.js → stateDiagram-FKZM4ZOC-BAybZU8l.js} +9 -9
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-Bxoo7e6E.js.map → stateDiagram-FKZM4ZOC-BAybZU8l.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-Q-DL7tae.js → stateDiagram-v2-4FDKWEC3-BUsvuCdD.js} +5 -5
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-Q-DL7tae.js.map → stateDiagram-v2-4FDKWEC3-BUsvuCdD.js.map} +1 -1
- package/dist/static/assets/{timeline-definition-IT6M3QCI-DuOiHQPk.js → timeline-definition-IT6M3QCI-DOYN-4XM.js} +3 -3
- package/dist/static/assets/{timeline-definition-IT6M3QCI-DuOiHQPk.js.map → timeline-definition-IT6M3QCI-DOYN-4XM.js.map} +1 -1
- package/dist/static/assets/{treemap-KMMF4GRG-YbrDC0fO.js → treemap-KMMF4GRG-CQXygT0T.js} +4 -4
- package/dist/static/assets/{treemap-KMMF4GRG-YbrDC0fO.js.map → treemap-KMMF4GRG-CQXygT0T.js.map} +1 -1
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-DDRlTIfV.js → xychartDiagram-PRI3JC2R-ByFAvTeN.js} +3 -3
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-DDRlTIfV.js.map → xychartDiagram-PRI3JC2R-ByFAvTeN.js.map} +1 -1
- package/dist/static/index.html +1 -1
- package/dist/tools/builtins.js +0 -8
- package/dist/tools/env.js +1 -1
- package/dist/tools/mcp.js +31 -9
- package/dist/tools/pending-tellask-reminder.js +14 -17
- package/dist/tools/team-mgmt.js +1 -1
- package/package.json +1 -1
- package/dist/static/assets/index-CUZD-Ua6.js.map +0 -1
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
|
|
49
49
|
### Q4H (向人类提问)
|
|
50
50
|
|
|
51
|
-
**Q4H** 是由对话(主对话或子对话)提出的待处理问题,需要人工输入才能继续。Q4H 被索引在对话的 `q4h.yaml` 文件中(一个索引,不是真理之源),并由 `clear_mind` 操作清除。实际的问题内容存储在对话的对话消息中,其中记录了
|
|
51
|
+
**Q4H** 是由对话(主对话或子对话)提出的待处理问题,需要人工输入才能继续。Q4H 被索引在对话的 `q4h.yaml` 文件中(一个索引,不是真理之源),并由 `clear_mind` 操作清除。实际的问题内容存储在对话的对话消息中,其中记录了 `!?askHuman()` Tellask。
|
|
52
52
|
|
|
53
53
|
### 子对话索引 (subdlg.yaml)
|
|
54
54
|
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
|
|
61
61
|
### 子对话注册表
|
|
62
62
|
|
|
63
|
-
**子对话注册表** 是根对话作用域的 Map,维护对已注册子对话的持久引用。注册表使用 `agentId!
|
|
63
|
+
**子对话注册表** 是根对话作用域的 Map,维护对已注册子对话的持久引用。注册表使用 `agentId!sessionSlug` 作为其键格式。当根完成时,它随根移动到 `done/`,并在根加载时通过扫描 done/ 子对话 YAML 重建。若某个支线对话被宣布卡死,其对应的 TYPE B 注册表条目会被移除,以便后续可用同一 `agentId!sessionSlug` 创建全新的支线对话。
|
|
64
64
|
|
|
65
65
|
### 队友 Tellask
|
|
66
66
|
|
|
@@ -68,9 +68,9 @@
|
|
|
68
68
|
|
|
69
69
|
**诉请块结构**(另见 [`dominds-terminology.md`](./dominds-terminology.md)):
|
|
70
70
|
|
|
71
|
-
- **诉请头(Tellask headline)**:诉请块第一行
|
|
72
|
-
- **诉请正文(Tellask body
|
|
73
|
-
-
|
|
71
|
+
- **诉请头(Tellask headline)**:诉请块第一行 `tellaskSessionless({ targetAgentId: "<name>", tellaskContent: "..." })`(同一诉请块内,后续以 `tellask* function call` 开头的行会并入诉请头)。
|
|
72
|
+
- **诉请正文(Tellask body)**:由 tellask-special 函数参数 `tellaskContent` 承载的正文载荷。
|
|
73
|
+
- `sessionSlug` 等结构化指令必须写在诉请头中。
|
|
74
74
|
|
|
75
75
|
---
|
|
76
76
|
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
每个根的 `selfId → Dialog` 对象映射。此注册表包含根对话本身以及所有已加载的子对话,支持在层级内对任何对话进行 O(1) 查找。
|
|
92
92
|
|
|
93
93
|
**子对话注册表(每个根对话)**
|
|
94
|
-
每个根的 `agentId!
|
|
94
|
+
每个根的 `agentId!sessionSlug → Subdialog` 对象映射。此注册表跟踪用于在多次交互中恢复的 TYPE B 已注册子对话。TYPE C 瞬态子对话永远不会被注册。
|
|
95
95
|
|
|
96
96
|
### 每对话互斥锁
|
|
97
97
|
|
|
@@ -139,18 +139,18 @@
|
|
|
139
139
|
|
|
140
140
|
```mermaid
|
|
141
141
|
flowchart TD
|
|
142
|
-
M[LLM 发出
|
|
143
|
-
Q -- 是 --> A[TYPE A:回问诉请<br/>(`TellaskBack` / 回问诉请)<br
|
|
144
|
-
Q -- 否 --> T{是否存在
|
|
145
|
-
T -- 是 --> B[TYPE B:已注册子对话 Tellask<br/>(`Tellask Session` / 长线诉请)<br
|
|
146
|
-
T -- 否 --> C[TYPE C:瞬态子对话 Tellask<br/>(`Fresh Tellask` / 一次性诉请)<br
|
|
142
|
+
M[LLM 发出 tellaskSessionless({ targetAgentId: "mention", tellaskContent: "..." })] --> Q{这是子对话在告诉其直接上位对话吗?}
|
|
143
|
+
Q -- 是 --> A[TYPE A:回问诉请<br/>(`TellaskBack` / 回问诉请)<br/>主要:`tellaskBack({ tellaskContent: "..." })`(无 sessionSlug)]
|
|
144
|
+
Q -- 否 --> T{是否存在 sessionSlug?}
|
|
145
|
+
T -- 是 --> B[TYPE B:已注册子对话 Tellask<br/>(`Tellask Session` / 长线诉请)<br/>tellask({ targetAgentId: "agentId", sessionSlug: "tellaskSession", tellaskContent: "..." })]
|
|
146
|
+
T -- 否 --> C[TYPE C:瞬态子对话 Tellask<br/>(`Fresh Tellask` / 一次性诉请)<br/>tellaskSessionless({ targetAgentId: "agentId", tellaskContent: "..." })]
|
|
147
147
|
```
|
|
148
148
|
|
|
149
149
|
### TYPE A:上位 Tellask(Type A / `TellaskBack` / 回问诉请)
|
|
150
150
|
|
|
151
|
-
|
|
151
|
+
**主要语法**:`tellaskBack({ tellaskContent: "..." })`(无 `sessionSlug`)— `tellaskBack({ tellaskContent: "..." }) sessionSlug ...` 是**语法错误**
|
|
152
152
|
|
|
153
|
-
|
|
153
|
+
**可容忍的回退**:`tellaskBack({ tellaskContent: "..." })`(无 `sessionSlug`)
|
|
154
154
|
|
|
155
155
|
**行为**:
|
|
156
156
|
|
|
@@ -164,7 +164,7 @@ flowchart TD
|
|
|
164
164
|
- 使用 `subdialog.supdialog` 引用(无注册表查找)
|
|
165
165
|
- 无需注册 — 上位对话关系是固有的
|
|
166
166
|
- 上位对话始终是层级中的直接父级
|
|
167
|
-
-
|
|
167
|
+
- `tellaskBack({ tellaskContent: "..." })` 是**规范**的 TYPE A 语法:它始终路由到“诉请者”(发起本次诉请的对话),避免自行猜测。
|
|
168
168
|
|
|
169
169
|
**示例**:
|
|
170
170
|
|
|
@@ -172,7 +172,7 @@ flowchart TD
|
|
|
172
172
|
当前对话:sub-001(agentId: "backend-dev")
|
|
173
173
|
父上位对话:"orchestrator"(agentId)
|
|
174
174
|
|
|
175
|
-
LLM
|
|
175
|
+
LLM 发出:tellaskSessionless({ targetAgentId: "orchestrator", tellaskContent: "..." }) 我应该如何处理数据库迁移?
|
|
176
176
|
|
|
177
177
|
结果:
|
|
178
178
|
- sub-001 挂起
|
|
@@ -183,31 +183,30 @@ LLM 发出:!?@orchestrator 我应该如何处理数据库迁移?
|
|
|
183
183
|
|
|
184
184
|
### TYPE B:已注册子对话 Tellask(Type B / `Tellask Session` / 长线诉请)
|
|
185
185
|
|
|
186
|
-
|
|
186
|
+
**语法**:`tellask({ targetAgentId: "<anyAgentId>", sessionSlug: "<tellaskSession>", tellaskContent: "..." })`(注意 `sessionSlug` 前的空格)
|
|
187
187
|
|
|
188
|
-
**扪心自问 (FBR)
|
|
188
|
+
**扪心自问 (FBR) 语法**:`freshBootsReasoning({ tellaskContent: "..." })`
|
|
189
189
|
|
|
190
|
-
-
|
|
191
|
-
-
|
|
192
|
-
-
|
|
193
|
-
- **FBR 本身应该很常见**,但使用 `!tellaskSession` 寻址的变体应该很罕见。对于大多数 FBR 使用,首选 `!?@self`(TYPE C,瞬态)。仅当你明确想要一个可恢复的、长期存在的"初心会话"用于多步骤子问题时,才使用 `!?@self !tellaskSession ...`。
|
|
190
|
+
- `freshBootsReasoning` 是专用函数工具,不是 Tellask 的特殊 target 别名。
|
|
191
|
+
- FBR 不接受 `sessionSlug` 或 `mentionList`。
|
|
192
|
+
- FBR 由更严格的“无工具”策略驱动;详见 [`fbr.zh.md`](./fbr.zh.md)。
|
|
194
193
|
|
|
195
194
|
**Tellask 会话键模式**:`<tellaskSession>` 使用与 `<mention-id>` 相同的标识符模式:`[a-zA-Z][a-zA-Z0-9_-]*`。解析在空白或标点处停止;任何尾随的标题文本在 tellaskSession 解析时被忽略。
|
|
196
195
|
|
|
197
|
-
**注册表键**:`agentId!
|
|
196
|
+
**注册表键**:`agentId!sessionSlug`
|
|
198
197
|
|
|
199
198
|
**行为**:
|
|
200
199
|
|
|
201
|
-
1. 检查注册表中是否存在键为 `agentId!
|
|
200
|
+
1. 检查注册表中是否存在键为 `agentId!sessionSlug` 的现有子对话
|
|
202
201
|
2. **如果存在**:恢复已注册的子对话
|
|
203
|
-
3. **如果不存在**:创建新的子对话并使用键 `agentId!
|
|
202
|
+
3. **如果不存在**:创建新的子对话并使用键 `agentId!sessionSlug` 注册它
|
|
204
203
|
4. 父对话在子对话运行时**挂起**
|
|
205
204
|
5. 子对话的响应流回父级
|
|
206
205
|
6. 父级**恢复**,子对话的响应在上下文中
|
|
207
206
|
|
|
208
207
|
**当前调用者跟踪(对复用很重要):**
|
|
209
208
|
|
|
210
|
-
当已注册的子对话被再次 Tellask(相同的 `agentId!
|
|
209
|
+
当已注册的子对话被再次 Tellask(相同的 `agentId!sessionSlug`)时,调用者可能是**不同的对话**(主线对话或其他支线对话)。在每次 TYPE B Tellask 时,子对话的元数据都会更新为:
|
|
211
210
|
|
|
212
211
|
- **当前调用者对话 ID**(这样响应就会路由回*最新*的调用者)
|
|
213
212
|
- **Tellask 信息**(标题/正文、来源角色、来源成员、callId)
|
|
@@ -216,7 +215,7 @@ LLM 发出:!?@orchestrator 我应该如何处理数据库迁移?
|
|
|
216
215
|
|
|
217
216
|
**恢复时的 Tellask 上下文**:
|
|
218
217
|
|
|
219
|
-
- 在每次 TYPE B Tellask(新的或恢复的)时,父级提供的 `
|
|
218
|
+
- 在每次 TYPE B Tellask(新的或恢复的)时,父级提供的 `mentionList`/`tellaskContent`
|
|
220
219
|
在驱动子对话之前作为新用户消息追加到子对话中。
|
|
221
220
|
这确保子对话在每次 Tellask 时都能收到最新的请求上下文。
|
|
222
221
|
- 系统注入的恢复提示仅用于上下文,**不会被解析**为队友/工具 Tellask。
|
|
@@ -234,7 +233,7 @@ LLM 发出:!?@orchestrator 我应该如何处理数据库迁移?
|
|
|
234
233
|
根对话:orchestrator
|
|
235
234
|
注册表:{}(空)
|
|
236
235
|
|
|
237
|
-
LLM
|
|
236
|
+
LLM 发出:tellask({ targetAgentId: "researcher", sessionSlug: "market-analysis", tellaskContent: "..." })
|
|
238
237
|
|
|
239
238
|
结果(第一次调用):
|
|
240
239
|
- 注册表查找:不存在 "researcher!market-analysis"
|
|
@@ -245,7 +244,7 @@ LLM 发出:!?@researcher !tellaskSession market-analysis
|
|
|
245
244
|
- 响应流回 orchestrator
|
|
246
245
|
- orchestrator 恢复
|
|
247
246
|
|
|
248
|
-
LLM
|
|
247
|
+
LLM 再次发出:tellask({ targetAgentId: "researcher", sessionSlug: "market-analysis", tellaskContent: "..." })
|
|
249
248
|
|
|
250
249
|
结果(第二次调用):
|
|
251
250
|
- 注册表查找:"researcher!market-analysis" 存在
|
|
@@ -258,12 +257,12 @@ LLM 再次发出:!?@researcher !tellaskSession market-analysis
|
|
|
258
257
|
|
|
259
258
|
### TYPE C:瞬态子对话 Tellask(Type C / `Fresh Tellask` / 一次性诉请)
|
|
260
259
|
|
|
261
|
-
|
|
260
|
+
**语法**:`tellaskSessionless({ targetAgentId: "<nonSupdialogAgentId>", tellaskContent: "..." })`(无 `sessionSlug`)
|
|
262
261
|
|
|
263
|
-
**扪心自问 (FBR)
|
|
262
|
+
**扪心自问 (FBR) 自调用语法(默认;最常见)**:`freshBootsReasoning({ tellaskContent: "..." })`
|
|
264
263
|
|
|
265
|
-
-
|
|
266
|
-
- 由
|
|
264
|
+
- `freshBootsReasoning({ tellaskContent: "..." })` 指向当前对话的 agentId,并创建一条路由到同一 agentId 的**新的临时子对话**。
|
|
265
|
+
- 由 `freshBootsReasoning({ tellaskContent: "..." })` 创建的支线对话属于 FBR,并以更严格的“无工具”策略驱动;详见 [`fbr.zh.md`](./fbr.zh.md)。
|
|
267
266
|
- 对于大多数扪心自问 会话使用此方式:隔离单个子问题,产生答案,然后返回。
|
|
268
267
|
|
|
269
268
|
**行为**:
|
|
@@ -272,7 +271,7 @@ LLM 再次发出:!?@researcher !tellaskSession market-analysis
|
|
|
272
271
|
2. 使用指定的 agentId 创建**新的子对话**
|
|
273
272
|
3. 驱动新的子对话:
|
|
274
273
|
- 一般 TYPE C 子对话是“完整能力”的(可上位调用、队友诉请、按配置使用工具)。
|
|
275
|
-
-
|
|
274
|
+
- `freshBootsReasoning({ tellaskContent: "..." })` 属于 FBR 特例:无工具、诉请受限(见 `fbr.zh.md`)。
|
|
276
275
|
4. 子对话的响应流回父级
|
|
277
276
|
5. 父级**恢复**,子对话的响应在上下文中
|
|
278
277
|
|
|
@@ -280,7 +279,7 @@ LLM 再次发出:!?@researcher !tellaskSession market-analysis
|
|
|
280
279
|
|
|
281
280
|
- **无注册表查找** - 总是创建新的子对话
|
|
282
281
|
- **不注册** - 在 Tellask 之间不持久化
|
|
283
|
-
- 子对话本身一般是“完整能力”的;但
|
|
282
|
+
- 子对话本身一般是“完整能力”的;但 `freshBootsReasoning({ tellaskContent: "..." })` FBR 是特例:无工具且诉请受限(见 `fbr.zh.md`)。
|
|
284
283
|
- 与 TYPE B 的唯一区别:无注册表查找/恢复能力
|
|
285
284
|
- 用于一次性的、独立的任务
|
|
286
285
|
|
|
@@ -309,16 +308,16 @@ LLM 再次发出:@code-reviewer 审查这个其他 PR
|
|
|
309
308
|
|
|
310
309
|
### 对比总结
|
|
311
310
|
|
|
312
|
-
| 方面
|
|
313
|
-
|
|
|
314
|
-
| **语法**
|
|
315
|
-
|
|
|
316
|
-
| **注册表查找**
|
|
317
|
-
| **恢复**
|
|
318
|
-
| **注册**
|
|
319
|
-
| **父级行为**
|
|
320
|
-
| **子对话能力**
|
|
321
|
-
| **用例**
|
|
311
|
+
| 方面 | TYPE A:上位 Tellask (`TellaskBack`) | TYPE B:已注册子对话 Tellask (`Tellask Session`) | TYPE C:瞬态子对话 Tellask (`Fresh Tellask`) |
|
|
312
|
+
| --------------- | ---------------------------------------- | ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
|
|
313
|
+
| **语法** | `tellaskBack({ tellaskContent: "..." })` | `tellask({ targetAgentId: "<anyAgentId>", sessionSlug: "<id>", tellaskContent: "..." })` | `tellaskSessionless({ targetAgentId: "<nonSupdialogAgentId>", tellaskContent: "..." })` |
|
|
314
|
+
| **sessionSlug** | 不允许 | 必须 | 不允许 |
|
|
315
|
+
| **注册表查找** | 否(使用 `subdialog.supdialog`) | 是(`agentId!sessionSlug`) | 否(永不注册) |
|
|
316
|
+
| **恢复** | 否(上位对话不是子对话) | 是(查找找到现有的) | 否(总是新的) |
|
|
317
|
+
| **注册** | 不适用 | 创建并注册 | 永不注册 |
|
|
318
|
+
| **父级行为** | 子对话挂起 | 父级挂起 | 父级挂起 |
|
|
319
|
+
| **子对话能力** | 完整(上位调用、队友、工具) | 完整(上位调用、队友、工具) | 完整(上位调用、队友、工具) |
|
|
320
|
+
| **用例** | 从父级澄清(`TellaskBack`) | 恢复持久子任务(`Tellask Session`) | 一次性独立任务(`Fresh Tellask`) |
|
|
322
321
|
|
|
323
322
|
---
|
|
324
323
|
|
|
@@ -329,7 +328,7 @@ Dominds 对话系统建立在四个相互关联的核心机制之上,这些机
|
|
|
329
328
|
```mermaid
|
|
330
329
|
flowchart TD
|
|
331
330
|
H[对话层级<br/>(root ↔ 子对话)] <--> S[子对话供应<br/>(响应、待处理列表、注册表)]
|
|
332
|
-
H --> Q[Q4H (
|
|
331
|
+
H --> Q[Q4H (!?askHuman())<br/>(q4h.yaml 索引)]
|
|
333
332
|
S --> Q
|
|
334
333
|
|
|
335
334
|
Q --> UI[前端 Q4H 面板<br/>(questions_count_update)]
|
|
@@ -343,7 +342,7 @@ flowchart TD
|
|
|
343
342
|
|
|
344
343
|
### 关键设计原则
|
|
345
344
|
|
|
346
|
-
1. **Q4H 索引在 `q4h.yaml` 中**:Q4H 问题被索引在 `q4h.yaml` 中(作为索引,不是真理之源),并由思维清晰操作清除。实际的问题内容在对话的对话消息中,其中记录了
|
|
345
|
+
1. **Q4H 索引在 `q4h.yaml` 中**:Q4H 问题被索引在 `q4h.yaml` 中(作为索引,不是真理之源),并由思维清晰操作清除。实际的问题内容在对话的对话消息中,其中记录了 `!?askHuman()` Tellask。它们不会在 `clear_mind` 中存活。
|
|
347
346
|
|
|
348
347
|
2. **层级 Q4H**:层级中的任何对话都可以自行提出 Q4H(根对话或子对话)。问题被索引在提出问题的对话中,而不是向上传递。
|
|
349
348
|
|
|
@@ -375,20 +374,20 @@ Q4H(向人类提问)是对话可以暂停执行并请求人工输入的机
|
|
|
375
374
|
/**
|
|
376
375
|
* HumanQuestion - 索引条目持久化在每个对话的 q4h.yaml 中
|
|
377
376
|
* 注意:这是索引,不是真理之源。实际的 question
|
|
378
|
-
* 内容在对话的对话消息中,其中记录了
|
|
379
|
-
*(通过
|
|
377
|
+
* 内容在对话的对话消息中,其中记录了 askHuman() Tellask
|
|
378
|
+
*(通过 !?askHuman() 调用)。
|
|
380
379
|
*/
|
|
381
380
|
interface HumanQuestion {
|
|
382
381
|
readonly id: string; // 唯一标识符(UUID)- 匹配消息 ID
|
|
383
|
-
readonly
|
|
384
|
-
readonly
|
|
382
|
+
readonly mentionList: string; // 问题标题
|
|
383
|
+
readonly tellaskContent: string; // 详细问题上下文
|
|
385
384
|
readonly askedAt: string; // ISO 时间戳
|
|
386
385
|
}
|
|
387
386
|
```
|
|
388
387
|
|
|
389
388
|
**存储位置**:`<dialog-path>/q4h.yaml` - 作为快速查找的索引
|
|
390
389
|
|
|
391
|
-
**真理之源**:实际的
|
|
390
|
+
**真理之源**:实际的 `!?askHuman()` Tellask 存储在对话的对话消息中(course JSONL 文件),即提出问题的地方。
|
|
392
391
|
|
|
393
392
|
### Q4H 机制流程
|
|
394
393
|
|
|
@@ -412,33 +411,33 @@ sequenceDiagram
|
|
|
412
411
|
|
|
413
412
|
### 对话何时提出 Q4H?
|
|
414
413
|
|
|
415
|
-
当
|
|
414
|
+
当 `!?askHuman()` 队友 Tellask 被任何对话(根或子对话)自行调用时,会提出 Q4H:
|
|
416
415
|
|
|
417
416
|
```typescript
|
|
418
417
|
// 来自 main/llm/driver.ts,executeTellaskCall 函数
|
|
419
|
-
const isQ4H =
|
|
418
|
+
const isQ4H = callKind === 'askHuman';
|
|
420
419
|
```
|
|
421
420
|
|
|
422
421
|
**调用模式**:
|
|
423
422
|
|
|
424
423
|
```
|
|
425
|
-
|
|
424
|
+
!?askHuman() <问题标题>
|
|
426
425
|
!?<问题正文内容>
|
|
427
426
|
```
|
|
428
427
|
|
|
429
428
|
### Q4H 记录过程
|
|
430
429
|
|
|
431
430
|
```typescript
|
|
432
|
-
// 当检测到
|
|
431
|
+
// 当检测到 !?askHuman() 作为队友 Tellask 时
|
|
433
432
|
async function recordQuestionForHuman(
|
|
434
433
|
dlg: Dialog,
|
|
435
|
-
|
|
436
|
-
|
|
434
|
+
mentionList: string,
|
|
435
|
+
tellaskContent: string,
|
|
437
436
|
): Promise<void> {
|
|
438
437
|
const question: HumanQuestion = {
|
|
439
438
|
id: generateDialogID(),
|
|
440
|
-
|
|
441
|
-
|
|
439
|
+
mentionList,
|
|
440
|
+
tellaskContent,
|
|
442
441
|
askedAt: formatUnifiedTimestamp(new Date()),
|
|
443
442
|
};
|
|
444
443
|
|
|
@@ -503,7 +502,7 @@ interface DriveDialogByUserAnswerRequest {
|
|
|
503
502
|
**流程(智能体拉取模型)**:
|
|
504
503
|
|
|
505
504
|
1. 用户在 UI 中看到 Q4H 指示器/徽章
|
|
506
|
-
2. 用户点击面板/列表中的 Q4H,导航到
|
|
505
|
+
2. 用户点击面板/列表中的 Q4H,导航到 `askHuman()` Tellask 站点
|
|
507
506
|
3. 用户在输入文本区域中输入答案(与常规消息相同)
|
|
508
507
|
4. 前端发送 `drive_dialog_by_user_answer` 数据包
|
|
509
508
|
5. 后端根据 q4h.yaml 验证 `questionId`
|
|
@@ -547,7 +546,7 @@ sequenceDiagram
|
|
|
547
546
|
Sup->>Sub: 创建子对话(TYPE B 或 C)
|
|
548
547
|
Note over Sup: 上位对话因待处理子对话而阻塞
|
|
549
548
|
|
|
550
|
-
Sub->>WS: 发出
|
|
549
|
+
Sub->>WS: 发出 !?askHuman() 问题
|
|
551
550
|
WS-->>UI: questions_count_update
|
|
552
551
|
Note over Sub: 子对话在回答之前无法继续
|
|
553
552
|
|
|
@@ -719,7 +718,7 @@ async function checkSubdialogRevival(supdialog: Dialog): Promise<void> {
|
|
|
719
718
|
|
|
720
719
|
**实现说明**:
|
|
721
720
|
|
|
722
|
-
- `change_mind`
|
|
721
|
+
- `change_mind` 仅在根对话中可用(不在子对话中);子对话必须通过回问诉请(`tellaskBack({ tellaskContent: "..." })`)询问诉请者以更新共享 Taskdoc。
|
|
723
722
|
- 对于 `*.tsk/` Taskdoc 包,Taskdoc 是封装的:通用文件工具不得读取/写入/列出/删除 `*.tsk/` 下的任何内容。请参阅 [`encapsulated-taskdoc.zh.md`](./encapsulated-taskdoc.zh.md)。
|
|
724
723
|
|
|
725
724
|
---
|
|
@@ -759,7 +758,7 @@ async function checkSubdialogRevival(supdialog: Dialog): Promise<void> {
|
|
|
759
758
|
| 方面 | 描述 |
|
|
760
759
|
| ------------ | ------------------------------------------ |
|
|
761
760
|
| **作用域** | 仅限根对话(子对话无法访问) |
|
|
762
|
-
| **键格式** | `agentId!
|
|
761
|
+
| **键格式** | `agentId!sessionSlug`(单级 Map) |
|
|
763
762
|
| **存储** | 根对话目录中的 `registry.yaml` |
|
|
764
763
|
| **生命周期** | 正常流程保留;被宣布卡死的子对话条目会移除 |
|
|
765
764
|
| **持久化** | 根完成时随根移动到 `done/` |
|
|
@@ -780,7 +779,7 @@ researcher!market-analysis:
|
|
|
780
779
|
|
|
781
780
|
```mermaid
|
|
782
781
|
flowchart TD
|
|
783
|
-
Tellask[TYPE B Tellask:
|
|
782
|
+
Tellask[TYPE B Tellask: tellask({ targetAgentId: "agentId", sessionSlug: "tellaskSession", tellaskContent: "..." })] --> Key[计算键:agentId!sessionSlug]
|
|
784
783
|
Key --> Lookup{注册表命中?}
|
|
785
784
|
Lookup -- 是 --> Resume[恢复 + 驱动现有子对话]
|
|
786
785
|
Lookup -- 否 --> Create[创建 + 注册 + 驱动新的子对话]
|
|
@@ -796,9 +795,9 @@ flowchart TD
|
|
|
796
795
|
|
|
797
796
|
- `RootDialog`
|
|
798
797
|
- 拥有 TYPE B 子对话注册表(`registry.yaml`)
|
|
799
|
-
- 创建/注册/查找已注册的子对话(`agentId!
|
|
798
|
+
- 创建/注册/查找已注册的子对话(`agentId!sessionSlug`)
|
|
800
799
|
- `SubDialog`
|
|
801
|
-
- 有一个 `supdialog` 引用(直接父级)并将其用于 TYPE A
|
|
800
|
+
- 有一个 `supdialog` 引用(直接父级)并将其用于 TYPE A(`tellaskBack({ tellaskContent: "..." })`)
|
|
802
801
|
- 无法访问或更改根注册表(按设计)
|
|
803
802
|
|
|
804
803
|
**互斥锁语义**:
|
|
@@ -910,7 +909,7 @@ interface RegistryMethods {
|
|
|
910
909
|
**上下文继承**:新的子对话自动接收:
|
|
911
910
|
|
|
912
911
|
- 对相同 rtws(运行时工作区)Taskdoc 的引用(推荐:`tasks/feature-auth.tsk/`);`dlg.taskDocPath` 在对话创建时固定,永不重新分配
|
|
913
|
-
- 上位 Tellask 上下文(
|
|
912
|
+
- 上位 Tellask 上下文(mentionList + tellaskContent)解释其目的
|
|
914
913
|
- 访问共享团队内存
|
|
915
914
|
- 访问其智能体的个人内存
|
|
916
915
|
|
|
@@ -1075,7 +1074,7 @@ flowchart TD
|
|
|
1075
1074
|
|
|
1076
1075
|
这些图表专注于**控制流**,避免框图对齐,以便在不同的markdown查看器中呈现时保持可读性。
|
|
1077
1076
|
|
|
1078
|
-
#### TYPE A:回问诉请(`TellaskBack
|
|
1077
|
+
#### TYPE A:回问诉请(`TellaskBack`)(`tellaskBack({ tellaskContent: "..." })`,无 `sessionSlug`)
|
|
1079
1078
|
|
|
1080
1079
|
```mermaid
|
|
1081
1080
|
sequenceDiagram
|
|
@@ -1083,13 +1082,13 @@ sequenceDiagram
|
|
|
1083
1082
|
participant Driver as 后端驱动程序
|
|
1084
1083
|
participant Sup as 上位对话(直接父级)
|
|
1085
1084
|
|
|
1086
|
-
Sub->>Driver: 发出
|
|
1085
|
+
Sub->>Driver: 发出 `tellaskBack({ tellaskContent: "..." })` + 问题
|
|
1087
1086
|
Driver->>Sup: 驱动上位对话以回答
|
|
1088
1087
|
Sup-->>Driver: 响应文本
|
|
1089
1088
|
Driver-->>Sub: 恢复子对话,响应在上下文中
|
|
1090
1089
|
```
|
|
1091
1090
|
|
|
1092
|
-
#### TYPE B:已注册子对话 Tellask(`Tellask Session
|
|
1091
|
+
#### TYPE B:已注册子对话 Tellask(`Tellask Session`)(`tellask({ targetAgentId: "agentId", sessionSlug: "tellaskSession", tellaskContent: "..." })`)
|
|
1093
1092
|
|
|
1094
1093
|
```mermaid
|
|
1095
1094
|
sequenceDiagram
|
|
@@ -1098,8 +1097,8 @@ sequenceDiagram
|
|
|
1098
1097
|
participant Reg as 根子对话注册表
|
|
1099
1098
|
participant Sub as 已注册的子对话
|
|
1100
1099
|
|
|
1101
|
-
Caller->>Driver: 发出
|
|
1102
|
-
Driver->>Reg: 查找 `agentId!
|
|
1100
|
+
Caller->>Driver: 发出 `tellask({ targetAgentId: "agentId", sessionSlug: "tellaskSession", tellaskContent: "..." })`
|
|
1101
|
+
Driver->>Reg: 查找 `agentId!sessionSlug`
|
|
1103
1102
|
alt 注册表命中
|
|
1104
1103
|
Reg-->>Driver: 现有子对话 selfId
|
|
1105
1104
|
Driver->>Sub: 恢复 + 驱动
|
|
@@ -1117,7 +1116,7 @@ end
|
|
|
1117
1116
|
|
|
1118
1117
|
````
|
|
1119
1118
|
|
|
1120
|
-
#### TYPE C:瞬态子对话 Tellask(`Fresh Tellask
|
|
1119
|
+
#### TYPE C:瞬态子对话 Tellask(`Fresh Tellask`)(`tellaskSessionless({ targetAgentId: "agentId", tellaskContent: "..." })`,或 `freshBootsReasoning({ tellaskContent: "..." })`)
|
|
1121
1120
|
|
|
1122
1121
|
```mermaid
|
|
1123
1122
|
sequenceDiagram
|
|
@@ -1125,7 +1124,7 @@ sequenceDiagram
|
|
|
1125
1124
|
participant Driver as 后端驱动程序
|
|
1126
1125
|
participant Sub as 瞬态子对话
|
|
1127
1126
|
|
|
1128
|
-
Caller->>Driver: 发出
|
|
1127
|
+
Caller->>Driver: 发出 `tellaskSessionless({ targetAgentId: "agentId", tellaskContent: "..." })`
|
|
1129
1128
|
Driver->>Sub: 创建(不注册)
|
|
1130
1129
|
Driver->>Sub: 驱动
|
|
1131
1130
|
Sub-->>Driver: 最终响应
|
|
@@ -1136,7 +1135,7 @@ sequenceDiagram
|
|
|
1136
1135
|
|
|
1137
1136
|
```mermaid
|
|
1138
1137
|
flowchart TD
|
|
1139
|
-
A[
|
|
1138
|
+
A[!?askHuman() Tellask 发出] --> B[将 HumanQuestion 条目追加到 q4h.yaml]
|
|
1140
1139
|
B --> C[发出 questions_count_update]
|
|
1141
1140
|
C --> D[UI 显示 Q4H 徽章/列表]
|
|
1142
1141
|
D --> E{如何清除?}
|
|
@@ -1160,7 +1159,7 @@ sequenceDiagram
|
|
|
1160
1159
|
|
|
1161
1160
|
Sup->>Sub: 创建子对话(TYPE B 或 C)
|
|
1162
1161
|
Note over Sup,Sub: 上位对话因待处理子对话而阻塞
|
|
1163
|
-
Sub->>WS: 发出
|
|
1162
|
+
Sub->>WS: 发出 !?askHuman() 问题(Q4H)
|
|
1164
1163
|
WS-->>UI: questions_count_update(全局)
|
|
1165
1164
|
|
|
1166
1165
|
Note over Sub: 子对话在回答之前无法继续
|
|
@@ -1189,7 +1188,7 @@ sequenceDiagram
|
|
|
1189
1188
|
participant Store as 持久化(q4h.yaml)
|
|
1190
1189
|
participant UI as 前端
|
|
1191
1190
|
|
|
1192
|
-
User->>Main:
|
|
1191
|
+
User->>Main: !?askHuman() 问题
|
|
1193
1192
|
Main->>Store: recordQuestionForHuman()
|
|
1194
1193
|
Main-->>UI: questions_count_update
|
|
1195
1194
|
Main-->>Main: 暂停根驱动循环
|
|
@@ -1246,7 +1245,7 @@ sequenceDiagram
|
|
|
1246
1245
|
sequenceDiagram
|
|
1247
1246
|
participant Root as 根对话
|
|
1248
1247
|
participant Store as 持久化(registry.yaml + dialogs/)
|
|
1249
|
-
participant Sub as 子对话(@researcher
|
|
1248
|
+
participant Sub as 子对话(@researcher sessionSlug market)
|
|
1250
1249
|
|
|
1251
1250
|
Root->>Store: lookup registry key "researcher!market"
|
|
1252
1251
|
alt not found
|
|
@@ -1320,11 +1319,11 @@ Dominds 对话系统为层次化、人在回路的 AI 协作提供了一个强
|
|
|
1320
1319
|
|
|
1321
1320
|
### 三种队友 Tellask 类型
|
|
1322
1321
|
|
|
1323
|
-
| 类型(内部) | 用户可见术语 | 语法
|
|
1324
|
-
| ------------ | ----------------- |
|
|
1325
|
-
| TYPE A | `TellaskBack` |
|
|
1326
|
-
| TYPE B | `Tellask Session` |
|
|
1327
|
-
| TYPE C | `Fresh Tellask` |
|
|
1322
|
+
| 类型(内部) | 用户可见术语 | 语法 | 注册表 | 用例 |
|
|
1323
|
+
| ------------ | ----------------- | ----------------------------------------------------------------------------------- | --------------------- | ---------------- |
|
|
1324
|
+
| TYPE A | `TellaskBack` | `tellaskBack({ tellaskContent: "..." })` | 无注册表 | 澄清(询问来源) |
|
|
1325
|
+
| TYPE B | `Tellask Session` | `tellask({ targetAgentId: "agentId", sessionSlug: "<id>", tellaskContent: "..." })` | `agentId!sessionSlug` | 可恢复多轮工作 |
|
|
1326
|
+
| TYPE C | `Fresh Tellask` | `tellaskSessionless({ targetAgentId: "agentId", tellaskContent: "..." })` | 未注册 | 单次 / 不可恢复 |
|
|
1328
1327
|
|
|
1329
1328
|
### 类职责
|
|
1330
1329
|
|
|
@@ -31,13 +31,13 @@ is legitimately suspended (Q4H or pending subdialogs).
|
|
|
31
31
|
|
|
32
32
|
- **Root/main dialog**: a `RootDialog` (`dlg.id.rootId === dlg.id.selfId`), the primary conversation thread.
|
|
33
33
|
- **Subdialog**: a `SubDialog`, created for tellask / scoped work.
|
|
34
|
-
- **Q4H**: "Questions for Human", initiated via
|
|
34
|
+
- **Q4H**: "Questions for Human", initiated via `askHuman()`, which suspends dialog progression until the human responds.
|
|
35
35
|
|
|
36
36
|
## Expected "normal" completion path (recommended)
|
|
37
37
|
|
|
38
38
|
When the agent needs a human decision to conclude (e.g., confirm a choice or decide whether to mark the dialog done), the correct path is:
|
|
39
39
|
|
|
40
|
-
1. The agent issues a Q4H (
|
|
40
|
+
1. The agent issues a Q4H (`askHuman()`) with the necessary context and explicit decision request.
|
|
41
41
|
2. The WebUI surfaces the Q4H clearly.
|
|
42
42
|
3. The human decides and either:
|
|
43
43
|
- marks the root dialog "done" manually, or
|
|
@@ -27,13 +27,13 @@ Dominds 根对话旨在长期运行。根对话"停止"(变为空闲)通常
|
|
|
27
27
|
|
|
28
28
|
- **根/主对话**:`RootDialog`(`dlg.id.rootId === dlg.id.selfId`),主要对话线程。
|
|
29
29
|
- **子对话**:`SubDialog`,为 tellask / 作用域工作创建。
|
|
30
|
-
- **Q4H**:"Questions for Human",通过
|
|
30
|
+
- **Q4H**:"Questions for Human",通过 `askHuman()` 发起,暂停对话进度直到人类响应。
|
|
31
31
|
|
|
32
32
|
## 预期的"正常"完成路径(推荐)
|
|
33
33
|
|
|
34
34
|
当智能体需要人类决策来结束时(例如,确认选择或决定是否将对话标记为完成),正确的路径是:
|
|
35
35
|
|
|
36
|
-
1. 智能体发出 Q4H
|
|
36
|
+
1. 智能体发出 Q4H(`askHuman()`)并提供必要的上下文和明确的决策请求。
|
|
37
37
|
2. WebUI 清楚地呈现 Q4H。
|
|
38
38
|
3. 人类决定并:
|
|
39
39
|
- 手动将根对话标记为"完成",或
|
|
@@ -4,8 +4,8 @@ Chinese version: [中文版](./dominds-agent-priming.zh.md)
|
|
|
4
4
|
|
|
5
5
|
## Summary
|
|
6
6
|
|
|
7
|
-
Dominds has a real, runtime-enforced Tellask mechanism (
|
|
8
|
-
(FBR) mechanism (
|
|
7
|
+
Dominds has a real, runtime-enforced Tellask mechanism (`tellask* function call`) and a real, runtime-enforced Fresh Boots Reasoning
|
|
8
|
+
(FBR) mechanism (`freshBootsReasoning`). Even if system prompts explain these mechanisms in detail, most foundation models were not
|
|
9
9
|
trained in a world where “asking a teammate to run a shell command” is actually possible, so they often treat such text
|
|
10
10
|
as aspirational or hypothetical.
|
|
11
11
|
|
|
@@ -14,7 +14,7 @@ short, real Tellask + real return + real FBR + real distillation so the model ga
|
|
|
14
14
|
|
|
15
15
|
- teammate Tellasks are real and will be executed
|
|
16
16
|
- tool outputs are real and will be returned and persisted
|
|
17
|
-
-
|
|
17
|
+
- `freshBootsReasoning` FBR is real and will report back
|
|
18
18
|
- distillation is expected (extract the best, dedupe, reconcile), not “repeat each draft”
|
|
19
19
|
|
|
20
20
|
More precisely: it **guides the agent to show it to itself** — letting it personally walk through
|
|
@@ -31,7 +31,7 @@ Related docs:
|
|
|
31
31
|
|
|
32
32
|
- Tellask runtime: [`dialog-system.md`](./dialog-system.md)
|
|
33
33
|
- Terminology (Mainline/Sideline): [`dominds-terminology.md`](./dominds-terminology.md)
|
|
34
|
-
- FBR (
|
|
34
|
+
- FBR (`freshBootsReasoning`): [`fbr.md`](./fbr.md)
|
|
35
35
|
- Work language vs UI language: [`i18n.md`](./i18n.md)
|
|
36
36
|
|
|
37
37
|
---
|
|
@@ -39,7 +39,7 @@ Related docs:
|
|
|
39
39
|
## Goals
|
|
40
40
|
|
|
41
41
|
- Establish immediate trust that Tellask/return/persistence are real.
|
|
42
|
-
- Run a real
|
|
42
|
+
- Run a real `freshBootsReasoning` FBR loop at dialog creation.
|
|
43
43
|
- Build muscle memory for the timing contract: initiate FBR, wait for feedback, then synthesize/decide.
|
|
44
44
|
- Make distillation itself part of the “felt” experience (dedupe/reconcile/extract-the-best).
|
|
45
45
|
- Keep the procedure safe, small, and deterministic (default command: `uname -a`).
|
|
@@ -57,9 +57,9 @@ Related docs:
|
|
|
57
57
|
|
|
58
58
|
- **Mainline dialog**: the primary thread where the user and the main agent interact.
|
|
59
59
|
- **Sideline dialog**: a temporary work thread created by Tellask / FBR, reporting results back to the mainline.
|
|
60
|
-
- **Tellask**: a structured request (
|
|
60
|
+
- **Tellask**: a structured request (`tellask({ targetAgentId: "<memberId>", sessionSlug: "<slug>", tellaskContent: "..." })`) from a tellasker to a tellaskee.
|
|
61
61
|
- **Shell specialist**: a teammate designated to run shell commands safely (configured via `shell_specialists`).
|
|
62
|
-
- **FBR**: Fresh Boots Reasoning, implemented as
|
|
62
|
+
- **FBR**: Fresh Boots Reasoning, implemented as `freshBootsReasoning` (a tool-less sideline dialog). See [`fbr.md`](./fbr.md).
|
|
63
63
|
|
|
64
64
|
---
|
|
65
65
|
|
|
@@ -92,7 +92,7 @@ The Tellask body should be short and operational:
|
|
|
92
92
|
|
|
93
93
|
### 3) Real FBR: reflect on what the environment implies
|
|
94
94
|
|
|
95
|
-
After obtaining the environment snapshot, the main agent issues a real
|
|
95
|
+
After obtaining the environment snapshot, the main agent issues a real `freshBootsReasoning` Tellask to trigger FBR.
|
|
96
96
|
|
|
97
97
|
The FBR body should include:
|
|
98
98
|
|
|
@@ -102,7 +102,7 @@ The FBR body should include:
|
|
|
102
102
|
|
|
103
103
|
Optional parallel drafts:
|
|
104
104
|
|
|
105
|
-
- If the team member config enables `fbr_effort` (default `3`), the runtime creates multiple
|
|
105
|
+
- If the team member config enables `fbr_effort` (default `3`), the runtime creates multiple `freshBootsReasoning` FBR sideline
|
|
106
106
|
dialogs concurrently so the agent produces multiple independent “fresh boots” drafts for the mainline dialog to
|
|
107
107
|
distill.
|
|
108
108
|
- These drafts have **no stable identity mapping**, and there is no meaningful ordering requirement; the mainline dialog
|
|
@@ -112,7 +112,7 @@ Optional parallel drafts:
|
|
|
112
112
|
|
|
113
113
|
Phase boundary (critical):
|
|
114
114
|
|
|
115
|
-
-
|
|
115
|
+
- `freshBootsReasoning` is the **initiation action**, not completed decision-making.
|
|
116
116
|
- Mainline must enter a wait phase until feedback from that FBR run returns.
|
|
117
117
|
- If `fbr_effort = N`, mainline must wait for all N drafts before distillation; do not finalize from partial drafts.
|
|
118
118
|
|
|
@@ -197,7 +197,7 @@ Instead, inject a small, stable **course prefix** into model context at the star
|
|
|
197
197
|
- Render Agent Priming as a realistic transcript the user can inspect.
|
|
198
198
|
- Prefer a collapsible top section with clear labels:
|
|
199
199
|
- “Teammate Tellask (shell)”
|
|
200
|
-
- “FBR (
|
|
200
|
+
- “FBR (`freshBootsReasoning`)"
|
|
201
201
|
- “Agent Priming”
|
|
202
202
|
|
|
203
203
|
### Opt-out
|