dominds 1.3.1 → 1.4.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 +9 -2
- package/README.zh.md +9 -2
- package/dist/apps/app-lock-file.js +33 -57
- package/dist/apps/configuration-file.js +267 -0
- package/dist/apps/enabled-apps.js +217 -252
- package/dist/apps/manifest.js +132 -0
- package/dist/apps/resolution-file.js +80 -192
- package/dist/apps/workspace-app-state.js +8 -0
- package/dist/cli/disable.js +18 -22
- package/dist/cli/enable.js +20 -58
- package/dist/cli/install.js +74 -80
- package/dist/cli/uninstall.js +48 -25
- package/dist/cli/update.js +36 -80
- package/dist/docs/app-constitution.md +12 -7
- package/dist/docs/app-constitution.zh.md +13 -8
- package/dist/llm/kernel-driver/engine.js +10 -4
- package/dist/llm/kernel-driver/flow.js +93 -0
- package/dist/llm/kernel-driver/loop.js +4 -1
- package/dist/llm/kernel-driver/subdialog.js +5 -1
- package/dist/llm/kernel-driver/tellask-special.js +48 -6
- package/dist/server/server-core.js +19 -4
- package/dist/server/websocket-handler.js +26 -6
- package/dist/static/assets/{_basePickBy-CmziIRM9.js → _basePickBy-B2o4z1Hf.js} +3 -3
- package/dist/static/assets/{_basePickBy-CmziIRM9.js.map → _basePickBy-B2o4z1Hf.js.map} +1 -1
- package/dist/static/assets/{_baseUniq-CgDZxcD0.js → _baseUniq-CLmcxjdl.js} +2 -2
- package/dist/static/assets/{_baseUniq-CgDZxcD0.js.map → _baseUniq-CLmcxjdl.js.map} +1 -1
- package/dist/static/assets/{arc-Df9rjNNk.js → arc-CymD_KN7.js} +2 -2
- package/dist/static/assets/{arc-Df9rjNNk.js.map → arc-CymD_KN7.js.map} +1 -1
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-Bif8topC.js → architectureDiagram-VXUJARFQ-DJQfSJUH.js} +7 -7
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-Bif8topC.js.map → architectureDiagram-VXUJARFQ-DJQfSJUH.js.map} +1 -1
- package/dist/static/assets/{blockDiagram-VD42YOAC-D9Egoflr.js → blockDiagram-VD42YOAC-pHVz60D0.js} +7 -7
- package/dist/static/assets/{blockDiagram-VD42YOAC-D9Egoflr.js.map → blockDiagram-VD42YOAC-pHVz60D0.js.map} +1 -1
- package/dist/static/assets/{c4Diagram-YG6GDRKO-DBf1NeBf.js → c4Diagram-YG6GDRKO-B0WnCfAT.js} +3 -3
- package/dist/static/assets/{c4Diagram-YG6GDRKO-DBf1NeBf.js.map → c4Diagram-YG6GDRKO-B0WnCfAT.js.map} +1 -1
- package/dist/static/assets/{channel-Dc34yAJl.js → channel-CX9BlKil.js} +2 -2
- package/dist/static/assets/{channel-Dc34yAJl.js.map → channel-CX9BlKil.js.map} +1 -1
- package/dist/static/assets/{chunk-4BX2VUAB-B65G1dJI.js → chunk-4BX2VUAB-lXArRj3o.js} +2 -2
- package/dist/static/assets/{chunk-4BX2VUAB-B65G1dJI.js.map → chunk-4BX2VUAB-lXArRj3o.js.map} +1 -1
- package/dist/static/assets/{chunk-55IACEB6-CSDEOGl2.js → chunk-55IACEB6-CdqwynH9.js} +2 -2
- package/dist/static/assets/{chunk-55IACEB6-CSDEOGl2.js.map → chunk-55IACEB6-CdqwynH9.js.map} +1 -1
- package/dist/static/assets/{chunk-B4BG7PRW-Cb6W3QWJ.js → chunk-B4BG7PRW-Y-uXcJst.js} +5 -5
- package/dist/static/assets/{chunk-B4BG7PRW-Cb6W3QWJ.js.map → chunk-B4BG7PRW-Y-uXcJst.js.map} +1 -1
- package/dist/static/assets/{chunk-DI55MBZ5-ZAJWeVWH.js → chunk-DI55MBZ5-C5xSbRST.js} +4 -4
- package/dist/static/assets/{chunk-DI55MBZ5-ZAJWeVWH.js.map → chunk-DI55MBZ5-C5xSbRST.js.map} +1 -1
- package/dist/static/assets/{chunk-FMBD7UC4-DiwRlImb.js → chunk-FMBD7UC4-5uefwCjI.js} +2 -2
- package/dist/static/assets/{chunk-FMBD7UC4-DiwRlImb.js.map → chunk-FMBD7UC4-5uefwCjI.js.map} +1 -1
- package/dist/static/assets/{chunk-QN33PNHL-wilj7fb5.js → chunk-QN33PNHL-DzWVcvpI.js} +2 -2
- package/dist/static/assets/{chunk-QN33PNHL-wilj7fb5.js.map → chunk-QN33PNHL-DzWVcvpI.js.map} +1 -1
- package/dist/static/assets/{chunk-QZHKN3VN-DGmviJfR.js → chunk-QZHKN3VN-BrrvAZdP.js} +2 -2
- package/dist/static/assets/{chunk-QZHKN3VN-DGmviJfR.js.map → chunk-QZHKN3VN-BrrvAZdP.js.map} +1 -1
- package/dist/static/assets/{chunk-TZMSLE5B-Nm5wTXa_.js → chunk-TZMSLE5B-DyKOlPTY.js} +2 -2
- package/dist/static/assets/{chunk-TZMSLE5B-Nm5wTXa_.js.map → chunk-TZMSLE5B-DyKOlPTY.js.map} +1 -1
- package/dist/static/assets/{classDiagram-2ON5EDUG-BvUbXD6H.js → classDiagram-2ON5EDUG-FCrnlCWC.js} +6 -6
- package/dist/static/assets/{classDiagram-2ON5EDUG-BvUbXD6H.js.map → classDiagram-2ON5EDUG-FCrnlCWC.js.map} +1 -1
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-BvUbXD6H.js → classDiagram-v2-WZHVMYZB-FCrnlCWC.js} +6 -6
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-BvUbXD6H.js.map → classDiagram-v2-WZHVMYZB-FCrnlCWC.js.map} +1 -1
- package/dist/static/assets/{clone-0VLS7GaA.js → clone-BlI81KqZ.js} +2 -2
- package/dist/static/assets/{clone-0VLS7GaA.js.map → clone-BlI81KqZ.js.map} +1 -1
- package/dist/static/assets/{cose-bilkent-S5V4N54A-anaPs-75.js → cose-bilkent-S5V4N54A-yM7S2atz.js} +2 -2
- package/dist/static/assets/{cose-bilkent-S5V4N54A-anaPs-75.js.map → cose-bilkent-S5V4N54A-yM7S2atz.js.map} +1 -1
- package/dist/static/assets/{dagre-6UL2VRFP-YwdsZ11r.js → dagre-6UL2VRFP-BcweuZHt.js} +7 -7
- package/dist/static/assets/{dagre-6UL2VRFP-YwdsZ11r.js.map → dagre-6UL2VRFP-BcweuZHt.js.map} +1 -1
- package/dist/static/assets/{diagram-PSM6KHXK-5KQCf3h2.js → diagram-PSM6KHXK-D4-QwLW1.js} +8 -8
- package/dist/static/assets/{diagram-PSM6KHXK-5KQCf3h2.js.map → diagram-PSM6KHXK-D4-QwLW1.js.map} +1 -1
- package/dist/static/assets/{diagram-QEK2KX5R-Mf24XxZL.js → diagram-QEK2KX5R-BVbuejJn.js} +7 -7
- package/dist/static/assets/{diagram-QEK2KX5R-Mf24XxZL.js.map → diagram-QEK2KX5R-BVbuejJn.js.map} +1 -1
- package/dist/static/assets/{diagram-S2PKOQOG-DyQjD4D5.js → diagram-S2PKOQOG-pB6N6Tq_.js} +7 -7
- package/dist/static/assets/{diagram-S2PKOQOG-DyQjD4D5.js.map → diagram-S2PKOQOG-pB6N6Tq_.js.map} +1 -1
- package/dist/static/assets/{erDiagram-Q2GNP2WA-CEzTKw1u.js → erDiagram-Q2GNP2WA-DLKmthuw.js} +5 -5
- package/dist/static/assets/{erDiagram-Q2GNP2WA-CEzTKw1u.js.map → erDiagram-Q2GNP2WA-DLKmthuw.js.map} +1 -1
- package/dist/static/assets/{flowDiagram-NV44I4VS-DT821XSz.js → flowDiagram-NV44I4VS-BsBhWukh.js} +6 -6
- package/dist/static/assets/{flowDiagram-NV44I4VS-DT821XSz.js.map → flowDiagram-NV44I4VS-BsBhWukh.js.map} +1 -1
- package/dist/static/assets/{ganttDiagram-JELNMOA3-DlmeVsGg.js → ganttDiagram-JELNMOA3-Debz-J-C.js} +3 -3
- package/dist/static/assets/{ganttDiagram-JELNMOA3-DlmeVsGg.js.map → ganttDiagram-JELNMOA3-Debz-J-C.js.map} +1 -1
- package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-yAfyBG_d.js → gitGraphDiagram-V2S2FVAM-BnAPFBGR.js} +8 -8
- package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-yAfyBG_d.js.map → gitGraphDiagram-V2S2FVAM-BnAPFBGR.js.map} +1 -1
- package/dist/static/assets/{graph-BYv8vyWe.js → graph-DbzWiBNK.js} +3 -3
- package/dist/static/assets/{graph-BYv8vyWe.js.map → graph-DbzWiBNK.js.map} +1 -1
- package/dist/static/assets/{index-DMbwqOm6.js → index-B-8J28g7.js} +987 -1049
- package/dist/static/assets/index-B-8J28g7.js.map +1 -0
- package/dist/static/assets/{index-BiNcBn_U.css → index-CD5wtC_i.css} +1 -1
- package/dist/static/assets/{infoDiagram-HS3SLOUP-DaadramQ.js → infoDiagram-HS3SLOUP-CZ5hWoxV.js} +6 -6
- package/dist/static/assets/{infoDiagram-HS3SLOUP-DaadramQ.js.map → infoDiagram-HS3SLOUP-CZ5hWoxV.js.map} +1 -1
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-ftN8hxu3.js → journeyDiagram-XKPGCS4Q-CKN3oSxk.js} +5 -5
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-ftN8hxu3.js.map → journeyDiagram-XKPGCS4Q-CKN3oSxk.js.map} +1 -1
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-BIXETQ-C.js → kanban-definition-3W4ZIXB7-BQCMklfJ.js} +3 -3
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-BIXETQ-C.js.map → kanban-definition-3W4ZIXB7-BQCMklfJ.js.map} +1 -1
- package/dist/static/assets/{layout-OTbrj0Ye.js → layout-C5B58szc.js} +5 -5
- package/dist/static/assets/{layout-OTbrj0Ye.js.map → layout-C5B58szc.js.map} +1 -1
- package/dist/static/assets/{linear-CVfOC669.js → linear-_32fut6G.js} +2 -2
- package/dist/static/assets/{linear-CVfOC669.js.map → linear-_32fut6G.js.map} +1 -1
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-D2zv5uI9.js → mindmap-definition-VGOIOE7T-C_goMzjx.js} +4 -4
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-D2zv5uI9.js.map → mindmap-definition-VGOIOE7T-C_goMzjx.js.map} +1 -1
- package/dist/static/assets/{pieDiagram-ADFJNKIX-DaUXTsv7.js → pieDiagram-ADFJNKIX-BQ2n0cOB.js} +8 -8
- package/dist/static/assets/{pieDiagram-ADFJNKIX-DaUXTsv7.js.map → pieDiagram-ADFJNKIX-BQ2n0cOB.js.map} +1 -1
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-B7O2wPX9.js → quadrantDiagram-AYHSOK5B-BLg7_neg.js} +3 -3
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-B7O2wPX9.js.map → quadrantDiagram-AYHSOK5B-BLg7_neg.js.map} +1 -1
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DpauVPY1.js → requirementDiagram-UZGBJVZJ-DwkJt0zi.js} +4 -4
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DpauVPY1.js.map → requirementDiagram-UZGBJVZJ-DwkJt0zi.js.map} +1 -1
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-B3Hbfvad.js → sankeyDiagram-TZEHDZUN-DmxmatUB.js} +2 -2
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-B3Hbfvad.js.map → sankeyDiagram-TZEHDZUN-DmxmatUB.js.map} +1 -1
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-KdbWByWT.js → sequenceDiagram-WL72ISMW-KHU_eApU.js} +4 -4
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-KdbWByWT.js.map → sequenceDiagram-WL72ISMW-KHU_eApU.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-yDOCVezC.js → stateDiagram-FKZM4ZOC-B3DBCxAL.js} +9 -9
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-yDOCVezC.js.map → stateDiagram-FKZM4ZOC-B3DBCxAL.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-CpCJhvQO.js → stateDiagram-v2-4FDKWEC3-C-uIk7gh.js} +5 -5
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-CpCJhvQO.js.map → stateDiagram-v2-4FDKWEC3-C-uIk7gh.js.map} +1 -1
- package/dist/static/assets/{timeline-definition-IT6M3QCI-CHxuEjhV.js → timeline-definition-IT6M3QCI-SysEcQCC.js} +3 -3
- package/dist/static/assets/{timeline-definition-IT6M3QCI-CHxuEjhV.js.map → timeline-definition-IT6M3QCI-SysEcQCC.js.map} +1 -1
- package/dist/static/assets/{treemap-GDKQZRPO-Bsqu3wIy.js → treemap-GDKQZRPO-d0AbKEc4.js} +5 -5
- package/dist/static/assets/{treemap-GDKQZRPO-Bsqu3wIy.js.map → treemap-GDKQZRPO-d0AbKEc4.js.map} +1 -1
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-RZy33lFF.js → xychartDiagram-PRI3JC2R-CmSQMxUh.js} +3 -3
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-RZy33lFF.js.map → xychartDiagram-PRI3JC2R-CmSQMxUh.js.map} +1 -1
- package/dist/static/index.html +2 -2
- package/dist/tools/fs.js +1 -1
- package/package.json +9 -7
- package/dist/agent-priming.js +0 -2051
- package/dist/apps/installed-file.js +0 -207
- package/dist/apps/runtime-port.js +0 -91
- package/dist/docs/dominds-agent-priming.md +0 -218
- package/dist/docs/dominds-agent-priming.zh.md +0 -196
- package/dist/docs/drive-logic-context-refactor-plan.zh.md +0 -338
- package/dist/docs/keep-going.md +0 -176
- package/dist/docs/keep-going.zh.md +0 -162
- package/dist/docs/kernel-app-architecture.md +0 -286
- package/dist/docs/kernel-app-architecture.zh.md +0 -285
- package/dist/docs/showing-by-doing.md +0 -208
- package/dist/docs/showing-by-doing.zh.md +0 -177
- package/dist/docs/team-mgmt-toolset.md +0 -482
- package/dist/docs/team-mgmt-toolset.zh.md +0 -426
- package/dist/llm/driver-entry.js +0 -28
- package/dist/llm/driver-v2/context-health.js +0 -121
- package/dist/llm/driver-v2/context.js +0 -56
- package/dist/llm/driver-v2/core.js +0 -1545
- package/dist/llm/driver-v2/index.js +0 -26
- package/dist/llm/driver-v2/orchestrator.js +0 -158
- package/dist/llm/driver-v2/policy.js +0 -129
- package/dist/llm/driver-v2/restore-dialog-hierarchy.js +0 -73
- package/dist/llm/driver-v2/round.js +0 -366
- package/dist/llm/driver-v2/runtime-utils.js +0 -365
- package/dist/llm/driver-v2/saying-events.js +0 -20
- package/dist/llm/driver-v2/subdialog-txn.js +0 -42
- package/dist/llm/driver-v2/supdialog-response.js +0 -400
- package/dist/llm/driver-v2/tellask-bridge.js +0 -1148
- package/dist/llm/driver-v2/types.js +0 -10
- package/dist/llm/driver-v2-ref-only/context-health.js +0 -121
- package/dist/llm/driver-v2-ref-only/context.js +0 -17
- package/dist/llm/driver-v2-ref-only/core.js +0 -1710
- package/dist/llm/driver-v2-ref-only/index.js +0 -26
- package/dist/llm/driver-v2-ref-only/orchestrator.js +0 -158
- package/dist/llm/driver-v2-ref-only/policy.js +0 -129
- package/dist/llm/driver-v2-ref-only/restore-dialog-hierarchy.js +0 -73
- package/dist/llm/driver-v2-ref-only/round.js +0 -366
- package/dist/llm/driver-v2-ref-only/runtime-utils.js +0 -473
- package/dist/llm/driver-v2-ref-only/saying-events.js +0 -18
- package/dist/llm/driver-v2-ref-only/subdialog-txn.js +0 -42
- package/dist/llm/driver-v2-ref-only/supdialog-response.js +0 -453
- package/dist/llm/driver-v2-ref-only/tellask-bridge.js +0 -1178
- package/dist/llm/driver-v2-ref-only/types.js +0 -10
- package/dist/llm/driver.js +0 -4093
- package/dist/minds/promptdocs.js +0 -263
- package/dist/server/prompts-routes.js +0 -545
- package/dist/shared/team-mgmt-manual.js +0 -120
- package/dist/shared/types/prompts.js +0 -2
- package/dist/shared/types/tellask.js +0 -8
- package/dist/showing-by-doing.js +0 -1091
- package/dist/snippets/README.en.md +0 -3
- package/dist/snippets/README.md +0 -4
- package/dist/static/assets/index-DMbwqOm6.js.map +0 -1
- package/dist/tellask.js +0 -439
- package/dist/tools/context-health.js +0 -177
- package/dist/tools/diag.js +0 -583
- package/dist/tools/prompts/memory/en/errors.md +0 -155
- package/dist/tools/prompts/memory/en/index.md +0 -47
- package/dist/tools/prompts/memory/en/principles.md +0 -87
- package/dist/tools/prompts/memory/en/scenarios.md +0 -174
- package/dist/tools/prompts/memory/en/tools.md +0 -129
- package/dist/tools/prompts/memory/zh/errors.md +0 -155
- package/dist/tools/prompts/memory/zh/index.md +0 -47
- package/dist/tools/prompts/memory/zh/principles.md +0 -89
- package/dist/tools/prompts/memory/zh/scenarios.md +0 -174
- package/dist/tools/prompts/memory/zh/tools.md +0 -129
- package/dist/tools/team-mgmt.js +0 -3487
- package/dist/utils/task-doc.js +0 -236
|
@@ -1,285 +0,0 @@
|
|
|
1
|
-
# Kernel–App 架构(原型 v0.1)
|
|
2
|
-
|
|
3
|
-
English version: [English](./kernel-app-architecture.md)
|
|
4
|
-
|
|
5
|
-
## 范围与目标
|
|
6
|
-
|
|
7
|
-
本文件描述 Dominds 的 Kernel–App 分离原型设计,覆盖:
|
|
8
|
-
|
|
9
|
-
- 两级 namespace(kernel 外层 / app 内层)与解析规则
|
|
10
|
-
- app install json(`app --json`)扩展字段
|
|
11
|
-
- export/import 语义与冲突处理
|
|
12
|
-
- app defunc 语义
|
|
13
|
-
- app 集成手册(`app_integration_manual`)
|
|
14
|
-
- app 语言约束(work/ui language 与 i18n)
|
|
15
|
-
- `<rtws>/.apps/<app-id>/team.yaml` 增量覆盖 DSL
|
|
16
|
-
|
|
17
|
-
本原型的代码实现用于 **概念与功能验证**;本文件是“综合方案推进”的主载体(可被后续实现/迁移/评审稳定引用)。
|
|
18
|
-
|
|
19
|
-
## 非目标
|
|
20
|
-
|
|
21
|
-
- 2.x 前不引入协议/schema 版本与兼容策略
|
|
22
|
-
- 2.x 前不引入 sandbox 隔离
|
|
23
|
-
- run control 大幅扩展不在本文讨论(将单独出专项文档)
|
|
24
|
-
|
|
25
|
-
## 核心概念
|
|
26
|
-
|
|
27
|
-
- Kernel registry 维持当前 dominds 状态,内置能力将逐步迁出为独立 app。
|
|
28
|
-
- 每个 app 维护独立 registry,**app 本地优先、允许同名覆盖**。
|
|
29
|
-
- app 不会把对象注册到 kernel registry。
|
|
30
|
-
- app 之间互相隔离,只有通过 export/import 显式交换对象。
|
|
31
|
-
|
|
32
|
-
## Identity 与解析(Resolution)
|
|
33
|
-
|
|
34
|
-
### 名称空间
|
|
35
|
-
|
|
36
|
-
- 两级 scope:`kernel` 与 `app`。
|
|
37
|
-
- 在“运行时解析”中,对象的 **短 ID**(例如 `toolsetId`、`memberId`、`toolName`)仍然以当前 kernel 的习惯用法为主。
|
|
38
|
-
- 在“日志/诊断/Problems/文档”中,需要可唯一指认来源,因此引入 **Qualified Id**(仅用于诊断/显示,不强制写入 wire 协议):
|
|
39
|
-
- `kernel:<name>`
|
|
40
|
-
- `app:<appId>:<name>`
|
|
41
|
-
|
|
42
|
-
### 解析顺序(app 内)
|
|
43
|
-
|
|
44
|
-
对任意解析请求(tool/toolset/member),在 app 内的解析顺序固定为:
|
|
45
|
-
|
|
46
|
-
1. `local(app)`(含:app 自身注册 + import 进来的对象)
|
|
47
|
-
2. `kernel`
|
|
48
|
-
|
|
49
|
-
说明:
|
|
50
|
-
|
|
51
|
-
- **允许同名覆盖**仅发生在 `local(app)` 覆盖 `kernel` 的场景。
|
|
52
|
-
- App 之间互不覆盖;若 import 导致 `local(app)` 内部同名冲突,则 app 置为 defunc。
|
|
53
|
-
|
|
54
|
-
## App install json(`app --json`)
|
|
55
|
-
|
|
56
|
-
在现有 `DomindsAppInstallJsonV1` 基础上新增:
|
|
57
|
-
|
|
58
|
-
- `depends?: [{ appId: string; versionRange: string }]`
|
|
59
|
-
- `exports?: { members?: string[]; toolsets?: string[] }`
|
|
60
|
-
|
|
61
|
-
约定:
|
|
62
|
-
|
|
63
|
-
- `exports` 为空表示不允许被 import。
|
|
64
|
-
- `exports` 可以列出多个对象,但 import 的最小单元固定为 **单个成员 / 单个工具集**(一次 import 指向一个 ID)。
|
|
65
|
-
- `exports` 中的成员必须来自 `contributes.teammatesYamlRelPath` 的成员定义。
|
|
66
|
-
- `exports` 中的工具集必须来自 `contributes.toolsets`。
|
|
67
|
-
|
|
68
|
-
## Registry 与解析规则
|
|
69
|
-
|
|
70
|
-
- App 内对象解析顺序:**local(app) → kernel**。
|
|
71
|
-
- App 之间互不覆盖;若 import 后发生同名冲突,app 置为 defunc。
|
|
72
|
-
- Kernel registry 不接收 app 注册对象,因此不存在“从 kernel registry 移除”这一操作。
|
|
73
|
-
- defunc 的 app 不参与解析(但其对象也不会被“移除”——因为它们从未进入 kernel registry)。
|
|
74
|
-
|
|
75
|
-
## Export / Import 语义
|
|
76
|
-
|
|
77
|
-
### Export
|
|
78
|
-
|
|
79
|
-
- 由 app install json 的 `exports` 声明。
|
|
80
|
-
- Kernel 对外提供 app exports 查询(API 形态可在实现阶段确定)。
|
|
81
|
-
|
|
82
|
-
### Import
|
|
83
|
-
|
|
84
|
-
- **成员 import**:在 app 的 `team.yaml` 中声明。
|
|
85
|
-
- **工具集 import**:在 app 的 `team.yaml` 中声明;运行时通过 dominds API 拉取工具集元信息,并注册到 app registry。
|
|
86
|
-
|
|
87
|
-
推荐结构(示意):
|
|
88
|
-
|
|
89
|
-
```yaml
|
|
90
|
-
imports:
|
|
91
|
-
members:
|
|
92
|
-
- app: foo_app
|
|
93
|
-
id: npc_foo
|
|
94
|
-
toolsets:
|
|
95
|
-
- app: bar_app
|
|
96
|
-
id: bar_toolset
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
### 冲突与依赖失败
|
|
100
|
-
|
|
101
|
-
- import 冲突或依赖不满足 → app 置为 defunc。
|
|
102
|
-
|
|
103
|
-
#### 冲突矩阵(最小规则集)
|
|
104
|
-
|
|
105
|
-
| 场景 | 结果 |
|
|
106
|
-
| ------------------------------------------- | ------------------------- |
|
|
107
|
-
| `local(app)` 与 `kernel` 同名 | 允许(local 覆盖 kernel) |
|
|
108
|
-
| import 的 member/toolset 与 app 本地同名 | defunc |
|
|
109
|
-
| import 的 member/toolset 与其它 import 同名 | defunc |
|
|
110
|
-
| import 指向未 export 的对象 | defunc |
|
|
111
|
-
| depends 不满足(缺失/版本不匹配) | defunc |
|
|
112
|
-
|
|
113
|
-
## Defunc 语义
|
|
114
|
-
|
|
115
|
-
- defunc 后 app 功能不可用。
|
|
116
|
-
- 不会从 registry 移除(app registry 不再被使用;kernel registry 没有 app 对象)。
|
|
117
|
-
- defunc 原因应被记录并可被诊断。
|
|
118
|
-
|
|
119
|
-
### Defunc 触发条件(建议枚举)
|
|
120
|
-
|
|
121
|
-
- `MANIFEST_INVALID`:install json 字段缺失/格式错误。
|
|
122
|
-
- `DEPENDENCY_MISSING` / `DEPENDENCY_VERSION_MISMATCH`:depends 缺失或不满足。
|
|
123
|
-
- `EXPORTS_INVALID`:exports 声明引用不存在的 member/toolset。
|
|
124
|
-
- `IMPORT_NOT_EXPORTED`:import 指向的对象未在对方 exports 声明。
|
|
125
|
-
- `IMPORT_CONFLICT`:import 引入同名冲突。
|
|
126
|
-
- `TEAM_OVERRIDE_INVALID`:`<rtws>/.apps/<app-id>/team.yaml` 覆盖 DSL 解析或校验失败。
|
|
127
|
-
- `IMPORT_FETCH_FAILED`:通过 API 拉取 toolset 元信息失败或返回无效。
|
|
128
|
-
|
|
129
|
-
### 重试语义(建议)
|
|
130
|
-
|
|
131
|
-
- defunc 默认 **可重试**:当依赖/配置问题被修复后,kernel 在下一次 app 刷新周期重新加载该 app。
|
|
132
|
-
- 重试不会自动修改已有对话/历史 round;仅影响后续解析与新调用。
|
|
133
|
-
|
|
134
|
-
### 可观测性(建议)
|
|
135
|
-
|
|
136
|
-
- defunc 必须进入 Problems(或等价的可见面),至少包含:`appId`、`reasonKind`、`detail`、`firstSeenAt`、`lastSeenAt`、`retryable`、`suggestedAction`。
|
|
137
|
-
- `app_integration_manual` 调用失败 **不触发 defunc**(失败应被记录,但不应让 app 进入不可用)。
|
|
138
|
-
|
|
139
|
-
## App 集成手册(`app_integration_manual`)
|
|
140
|
-
|
|
141
|
-
- kernel 固定工具:`app_integration_manual`
|
|
142
|
-
- 参数:`{ appId: string, language?: string }`
|
|
143
|
-
- 未指定 `language` 时默认 **work language**。
|
|
144
|
-
- kernel 通过 IPC 路由到 app host,由 app 返回内容。
|
|
145
|
-
- app 可以静态输出 markdown,或运行时动态生成。
|
|
146
|
-
- app 必须提供 zh/en 双语内容。
|
|
147
|
-
- 调用失败不触发 defunc(返回错误即可)。
|
|
148
|
-
|
|
149
|
-
## 语言约束
|
|
150
|
-
|
|
151
|
-
- **work language** 来自 `LANG` 环境变量,kernel 与 app host 继承并且运行期不可变。
|
|
152
|
-
- app 必须遵守 kernel 的 work language。
|
|
153
|
-
- app UI 可以独立设置 ui language。
|
|
154
|
-
- 所有 app 必须至少支持 zh/en 双语。
|
|
155
|
-
|
|
156
|
-
## `team.yaml` 增量覆盖 DSL
|
|
157
|
-
|
|
158
|
-
覆盖文件:`<rtws>/.apps/<app-id>/team.yaml`
|
|
159
|
-
|
|
160
|
-
- 无需 `actions:` 顶层。
|
|
161
|
-
- 使用领域特定语法,支持 **add/replace/modify/delete**。
|
|
162
|
-
- 每次读取磁盘时执行动作,失败则 app 置为 defunc。
|
|
163
|
-
|
|
164
|
-
示意:
|
|
165
|
-
|
|
166
|
-
```yaml
|
|
167
|
-
version: 1
|
|
168
|
-
|
|
169
|
-
add:
|
|
170
|
-
members:
|
|
171
|
-
- id: npc_new
|
|
172
|
-
value:
|
|
173
|
-
name: 新NPC
|
|
174
|
-
toolsets: [trae_toolset]
|
|
175
|
-
|
|
176
|
-
replace:
|
|
177
|
-
members:
|
|
178
|
-
- id: npc_old
|
|
179
|
-
value:
|
|
180
|
-
name: 旧NPC
|
|
181
|
-
hidden: true
|
|
182
|
-
|
|
183
|
-
modify:
|
|
184
|
-
members:
|
|
185
|
-
- id: npc_village_head
|
|
186
|
-
set:
|
|
187
|
-
toolsets: [trae_toolset, extra_toolset]
|
|
188
|
-
streaming: true
|
|
189
|
-
unset: [tools]
|
|
190
|
-
merge:
|
|
191
|
-
model_params:
|
|
192
|
-
codex:
|
|
193
|
-
temperature: 0.2
|
|
194
|
-
member_defaults:
|
|
195
|
-
set:
|
|
196
|
-
provider: codex
|
|
197
|
-
|
|
198
|
-
delete:
|
|
199
|
-
members:
|
|
200
|
-
- id: npc_removed
|
|
201
|
-
|
|
202
|
-
set_default_responder: npc_village_head
|
|
203
|
-
|
|
204
|
-
add_shell_specialist:
|
|
205
|
-
- npc_village_head
|
|
206
|
-
|
|
207
|
-
remove_shell_specialist:
|
|
208
|
-
- npc_foo
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
语义约束:
|
|
212
|
-
|
|
213
|
-
- `modify_member` 支持 `set`/`unset`/`merge`,其中 `merge` 对对象执行深合并。
|
|
214
|
-
- 所有新增/替换/修改需经过现有 team.yaml 校验逻辑。
|
|
215
|
-
- 出现冲突或解析失败,app 置 defunc。
|
|
216
|
-
|
|
217
|
-
## 加载流程(建议)
|
|
218
|
-
|
|
219
|
-
1. 解析并落实工具集(本地 toolsets + imports.toolsets),**先注册工具集与内含工具**
|
|
220
|
-
2. 读取 app 内置 team.yaml
|
|
221
|
-
3. 解析 imports.members
|
|
222
|
-
4. 应用 `<rtws>/.apps/<app-id>/team.yaml` 覆盖
|
|
223
|
-
5. 执行校验(此时工具/工具集已可解析)
|
|
224
|
-
6. 成功 → 注册成员到 app registry
|
|
225
|
-
7. 失败 → app defunc
|
|
226
|
-
|
|
227
|
-
## 复核包(Review Packet)
|
|
228
|
-
|
|
229
|
-
本节用于让 reviewer 在 30 分钟内完成复核并继续推进(不把实现细节写进差遣牒 progress)。
|
|
230
|
-
|
|
231
|
-
### 产物索引(Artifacts)
|
|
232
|
-
|
|
233
|
-
- 架构文档(语义源):`dominds/docs/kernel-app-architecture.zh.md`
|
|
234
|
-
- 英文对齐:`dominds/docs/kernel-app-architecture.md`
|
|
235
|
-
|
|
236
|
-
### 近期变更影响面(Delta)
|
|
237
|
-
|
|
238
|
-
- WebSocket 驱动不再接收 `runControlId/runControlInput`(run control 的大幅扩展另起专项文档)。
|
|
239
|
-
- apps-host 的 run control 结果不再支持 `systemPromptPatch/prompt`(收敛为最小的 continue/reject 形态)。
|
|
240
|
-
- kernel-driver 的 context-health 驱动逻辑对齐 driver-v2 的实现方式(仅作为原型期收敛/清理)。
|
|
241
|
-
|
|
242
|
-
### 最小行为复核(Smoke,建议)
|
|
243
|
-
|
|
244
|
-
以下 smoke 以“原型仅概念/功能验证”为前提,重点验证系统未因近期清理而破坏既有路径:
|
|
245
|
-
|
|
246
|
-
1. `pnpm -C dominds run lint:types` 通过。
|
|
247
|
-
2. 若当前 rtws 存在已启用 app:启动后 apps runtime 能启动 apps-host,并将 app 的 `contributes.toolsets` 注册为 proxy tools(不发生 name collision)。
|
|
248
|
-
3. 在 WebUI 驱动对话与 Q4H 回答时,不再需要/不再发送 `runControlId/runControlInput`。
|
|
249
|
-
|
|
250
|
-
## 原型现状与问题清单(Gap List)
|
|
251
|
-
|
|
252
|
-
本原型当前已具备的“可验证骨架”(仅陈述事实,不承诺完备):
|
|
253
|
-
|
|
254
|
-
- 已有 apps runtime + apps-host IPC 基础设施,可启动 apps-host 子进程并转发 tool 调用。
|
|
255
|
-
- 已支持按 app 的 `contributes.toolsets` 注册 proxy toolset/tool(用于概念/功能验证)。
|
|
256
|
-
- 已支持 app 声明 dialog run controls 的注册(但 run control 语义扩展另起专项文档)。
|
|
257
|
-
|
|
258
|
-
本原型尚未闭环/需要后续实现明确落点的事项(作为“现状与问题”产物):
|
|
259
|
-
|
|
260
|
-
- `depends/exports/imports` 的加载、校验与冲突处理目前主要停留在架构规格层,尚需落地实现与端到端验证。
|
|
261
|
-
- defunc 的生命周期状态机、Problems 可观测面、可重试/重载入口需要实现级闭包(含日志/错误分类)。
|
|
262
|
-
- `<rtws>/.apps/<app-id>/team.yaml` override DSL 的实际读取/动作执行/校验落点需要实现与回归。
|
|
263
|
-
- `app_integration_manual(appId, language?)` 的 kernel 固定工具与 IPC 路由需要实现与回归。
|
|
264
|
-
- 迁移路线图(内置能力迁出顺序、回滚策略、dogfooding gate)需在后续实现阶段形成可执行清单。
|
|
265
|
-
|
|
266
|
-
## 完成定义(验收口径)
|
|
267
|
-
|
|
268
|
-
当以下条件满足时,可认为本原型的“综合方案推进”文档交付完成:
|
|
269
|
-
|
|
270
|
-
- 本文覆盖并明确:Identity/Resolution、defunc 触发与可重试、imports/exports 粒度与冲突矩阵、team.yaml override DSL、`app_integration_manual` 契约。
|
|
271
|
-
- 关键规则使用“发生 X → 系统做 Y”的句式,且没有依赖读源码才能理解的隐式前提。
|
|
272
|
-
- `kernel-app-architecture.zh.md` 与英文版 `kernel-app-architecture.md` 同步一致(zh 为语义基准)。
|
|
273
|
-
|
|
274
|
-
## 关键落点(现有代码)
|
|
275
|
-
|
|
276
|
-
- install json 解析:`dominds/main/apps/app-json.ts`
|
|
277
|
-
- apps runtime:`dominds/main/apps/runtime.ts`
|
|
278
|
-
- apps host contract:`dominds/main/apps-host/app-host-contract.ts`
|
|
279
|
-
- apps host IPC:`dominds/main/apps-host/ipc-types.ts`
|
|
280
|
-
- team.yaml 解析:`dominds/main/team.ts`
|
|
281
|
-
- app teammates loader:`dominds/main/apps/teammates.ts`
|
|
282
|
-
|
|
283
|
-
---
|
|
284
|
-
|
|
285
|
-
本文件为原型阶段设计草案,后续实现细节会跟随代码落地更新。
|
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
# Showing-by-Doing (做给祂看): Make Tellask Real
|
|
2
|
-
|
|
3
|
-
Chinese version: [中文版](./showing-by-doing.zh.md)
|
|
4
|
-
|
|
5
|
-
## Summary
|
|
6
|
-
|
|
7
|
-
Dominds has a real, runtime-enforced Tellask mechanism (`!?@...`) and a real, runtime-enforced Fresh Boots Reasoning
|
|
8
|
-
(FBR) mechanism (`!?@self`). Even if system prompts explain these mechanisms in detail, most foundation models were not
|
|
9
|
-
trained in a world where “asking a teammate to run a shell command” is actually possible, so they often treat such text
|
|
10
|
-
as aspirational or hypothetical.
|
|
11
|
-
|
|
12
|
-
**Showing-by-Doing (做给祂看)** is a tiny, highly realistic “first impression” procedure executed at dialog creation
|
|
13
|
-
time. It runs a short, real Tellask + real FBR round-trip so the model gains _felt-sense_ that:
|
|
14
|
-
|
|
15
|
-
- teammate Tellasks are real and will be executed
|
|
16
|
-
- tool outputs are real and will be returned
|
|
17
|
-
- FBR is real and will produce a report back to the caller
|
|
18
|
-
|
|
19
|
-
This makes subsequent use of Tellasks and `!?@self` FBR more reliable across the entire dialog lifecycle.
|
|
20
|
-
|
|
21
|
-
As a consequence, we can **dramatically simplify system prompts**: keep only short, accurate statements of the Tellask/FBR
|
|
22
|
-
contracts, and rely on Showing-by-Doing to establish “this is real and works here”.
|
|
23
|
-
|
|
24
|
-
Related docs:
|
|
25
|
-
|
|
26
|
-
- Tellask runtime: `dominds/docs/dialog-system.md`
|
|
27
|
-
- Terminology (Mainline/Sideline): `dominds/docs/dominds-terminology.md`
|
|
28
|
-
- FBR (`!?@self`): `dominds/docs/fbr.md`
|
|
29
|
-
- Work language vs UI language: `dominds/docs/i18n.md`
|
|
30
|
-
|
|
31
|
-
---
|
|
32
|
-
|
|
33
|
-
## Goals
|
|
34
|
-
|
|
35
|
-
- Establish immediate trust that **Tellask is not “just prompt text”**: it is an executable, backend-driven mechanism.
|
|
36
|
-
- Establish immediate trust that **FBR is not “just reasoning”**: it is a concrete sideline dialog that reports back.
|
|
37
|
-
- Keep the procedure safe, small, and deterministic (default command: `uname -a`).
|
|
38
|
-
- Persist and display the interaction so it is credible from multiple angles (backend record + frontend transcript).
|
|
39
|
-
|
|
40
|
-
## Non-goals
|
|
41
|
-
|
|
42
|
-
- Running arbitrary user-provided commands as part of dialog creation.
|
|
43
|
-
- Collecting sensitive system information (beyond minimal OS/kernel identification).
|
|
44
|
-
- Replacing proper documentation: this is an experiential supplement, not the main spec.
|
|
45
|
-
|
|
46
|
-
---
|
|
47
|
-
|
|
48
|
-
## Definitions (user-facing)
|
|
49
|
-
|
|
50
|
-
- **Mainline dialog**: the primary thread where the user and the main agent interact.
|
|
51
|
-
- **Sideline dialog**: a temporary work thread created by Tellask / FBR, reporting results back to the mainline.
|
|
52
|
-
- **Tellask**: a structured request (`!?@<memberId> ...`) from a tellasker to a tellaskee.
|
|
53
|
-
- **Shell specialist**: a teammate designated to run shell commands safely (configured via `shell_specialists`).
|
|
54
|
-
- **FBR**: Fresh Boots Reasoning, implemented as `!?@self` (a tool-less sideline dialog). See `dominds/docs/fbr.md`.
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
## Runtime flow (at dialog creation)
|
|
59
|
-
|
|
60
|
-
Showing-by-Doing runs **before** the first user message is processed (a “prelude”), unless the user opts out.
|
|
61
|
-
|
|
62
|
-
### 1) Choose the shell execution path
|
|
63
|
-
|
|
64
|
-
1. If the team config includes at least one `shell_specialists` member, pick one deterministically (e.g. the first).
|
|
65
|
-
2. Otherwise, let the **Dominds runtime** execute the baseline command directly (not via agent tools).
|
|
66
|
-
|
|
67
|
-
Note: team config validation normally requires `shell_specialists` to be non-empty if any teammate has shell tools, and
|
|
68
|
-
also requires that only listed shell specialists have shell tools. In other words, “no `shell_specialists` configured”
|
|
69
|
-
usually means “shell tools are disabled for all user-facing teammates”.
|
|
70
|
-
|
|
71
|
-
Baseline command:
|
|
72
|
-
|
|
73
|
-
- `uname -a`
|
|
74
|
-
|
|
75
|
-
If `uname -a` fails (e.g. non-POSIX host), the runtime should fall back to a platform-appropriate equivalent, but the
|
|
76
|
-
default “muscle memory” path is intentionally `uname -a` because it is common, low-risk, and quick.
|
|
77
|
-
|
|
78
|
-
### 2) Real teammate Tellask: ask for `uname -a`
|
|
79
|
-
|
|
80
|
-
If a shell specialist exists, the main agent (tellasker) issues **a real Tellask** to the shell specialist (tellaskee),
|
|
81
|
-
in the server-wide **work language** (see `dominds/docs/i18n.md`).
|
|
82
|
-
|
|
83
|
-
The Tellask body should be short and operational:
|
|
84
|
-
|
|
85
|
-
- ask the shell specialist to run `uname -a`
|
|
86
|
-
- ask them to return the raw output verbatim
|
|
87
|
-
- ask them to include an error + alternative command if `uname` is not available
|
|
88
|
-
|
|
89
|
-
The result must be recorded as a normal, debuggable transcript that clearly shows:
|
|
90
|
-
|
|
91
|
-
- the Tellask headline + body
|
|
92
|
-
- the shell specialist’s command execution
|
|
93
|
-
- the returned output
|
|
94
|
-
|
|
95
|
-
Minimal configuration example:
|
|
96
|
-
|
|
97
|
-
```yaml
|
|
98
|
-
# .minds/team.yaml
|
|
99
|
-
shell_specialists:
|
|
100
|
-
- cmdr
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
### 3) Real FBR: reflect on what the environment implies
|
|
104
|
-
|
|
105
|
-
After obtaining the environment snapshot (from the shell specialist or direct tool run), the main agent issues a real
|
|
106
|
-
`!?@self` Tellask to trigger **FBR**.
|
|
107
|
-
|
|
108
|
-
The FBR Tellask body should include:
|
|
109
|
-
|
|
110
|
-
- the exact `uname -a` output
|
|
111
|
-
- the main agent’s tool availability assumptions (e.g. “in mainline I may have `fs`/`os`/`mem`; in FBR you have no tools”)
|
|
112
|
-
- the question: “What should I be careful about in this environment? Which CLI tools should I prioritize, and why?”
|
|
113
|
-
|
|
114
|
-
The FBR response should return a compact report that the main agent can reuse, typically:
|
|
115
|
-
|
|
116
|
-
- environment notes (OS family, kernel, container/VM hints if any)
|
|
117
|
-
- do/don’t list (pitfalls)
|
|
118
|
-
- a short “preferred commands” shortlist (e.g. `rg`, `sed`, `jq`, `tar`, `ps`, `lsof`, depending on host)
|
|
119
|
-
|
|
120
|
-
### 4) Summarize into an “Environment Quickstart” note
|
|
121
|
-
|
|
122
|
-
The main agent then writes a short, user-visible summary to the mainline dialog so the knowledge is explicit and
|
|
123
|
-
searchable in the transcript.
|
|
124
|
-
|
|
125
|
-
---
|
|
126
|
-
|
|
127
|
-
## Fallback behavior
|
|
128
|
-
|
|
129
|
-
Showing-by-Doing should degrade gracefully:
|
|
130
|
-
|
|
131
|
-
- **No `shell_specialists` configured**: the Dominds runtime runs `uname -a` directly, then do FBR.
|
|
132
|
-
- **Shell specialist fails or times out**: the Dominds runtime runs `uname -a` directly and continue, marking the
|
|
133
|
-
specialist attempt as failed in the transcript.
|
|
134
|
-
- **`uname` not available / command fails**: run FBR with “environment unknown”; the report should explicitly list what
|
|
135
|
-
is missing and suggest what to gather later.
|
|
136
|
-
|
|
137
|
-
---
|
|
138
|
-
|
|
139
|
-
## Persistence, caching, and reuse
|
|
140
|
-
|
|
141
|
-
### 1) Persist as real dialog records (backend + frontend)
|
|
142
|
-
|
|
143
|
-
All Showing-by-Doing steps must be persisted as standard dialog artifacts (messages + events) so they remain credible:
|
|
144
|
-
|
|
145
|
-
- they survive restarts (subject to normal dialog persistence rules)
|
|
146
|
-
- they are debuggable in logs/storage
|
|
147
|
-
- they are rendered in the WebUI transcript (ideally as a collapsible “Prelude” section)
|
|
148
|
-
|
|
149
|
-
### 2) Process-wide cache (per teammate)
|
|
150
|
-
|
|
151
|
-
To avoid repeating `uname -a` + FBR on every new dialog, the backend process may maintain a **server-scoped cache** keyed
|
|
152
|
-
by (at minimum):
|
|
153
|
-
|
|
154
|
-
- tellasker teammate id (the agent whose dialogs are being created)
|
|
155
|
-
- an environment fingerprint derived from the `uname -a` output (exact string or hashed)
|
|
156
|
-
|
|
157
|
-
Cache payload (recommended):
|
|
158
|
-
|
|
159
|
-
- the full Showing-by-Doing transcript (Tellask + output + FBR + summary)
|
|
160
|
-
- a short “Environment Quickstart” distilled form (for compact context injection)
|
|
161
|
-
- timestamps + a version tag for future schema changes
|
|
162
|
-
|
|
163
|
-
Reuse policy:
|
|
164
|
-
|
|
165
|
-
- If a valid cache entry exists, a new dialog may **reuse** the cached transcript instead of re-running.
|
|
166
|
-
- Reused entries should still be visible in the new dialog’s transcript, clearly labeled as “Reused from cache”.
|
|
167
|
-
|
|
168
|
-
Invalidation (recommended):
|
|
169
|
-
|
|
170
|
-
- invalidate when the environment fingerprint changes
|
|
171
|
-
- allow a manual “Refresh environment snapshot” action for debugging
|
|
172
|
-
|
|
173
|
-
### 3) Carry across `clear_mind`
|
|
174
|
-
|
|
175
|
-
After each `clear_mind` (entering the next “journey stage”), do **not** rely on reminders for this.
|
|
176
|
-
|
|
177
|
-
Instead, inject a small, stable **course prefix** into the model context at the start of each new course (i.e. the first
|
|
178
|
-
few messages in the historical dialog section). This prefix should be a condensed transcript distilled from the original
|
|
179
|
-
Showing-by-Doing run (shell snapshot + FBR highlights + quickstart), so the agent keeps its “felt-sense” of Tellask/FBR
|
|
180
|
-
and environment constraints without re-running the prelude.
|
|
181
|
-
|
|
182
|
-
---
|
|
183
|
-
|
|
184
|
-
## UX requirements (WebUI)
|
|
185
|
-
|
|
186
|
-
### Display
|
|
187
|
-
|
|
188
|
-
- Render Showing-by-Doing as a realistic transcript the user can inspect.
|
|
189
|
-
- Prefer a collapsible “Prelude” section at the top of the dialog, with clear labels:
|
|
190
|
-
- “Teammate Tellask (shell)”
|
|
191
|
-
- “FBR (`!?@self`)”
|
|
192
|
-
- “Environment Quickstart”
|
|
193
|
-
|
|
194
|
-
### Opt-out
|
|
195
|
-
|
|
196
|
-
The dialog creation UI should include an explicit opt-out, e.g.:
|
|
197
|
-
|
|
198
|
-
- Checkbox: “Skip Showing-by-Doing (do not run environment prelude)”
|
|
199
|
-
|
|
200
|
-
If opted out, no prelude actions are executed and no prelude transcript is generated.
|
|
201
|
-
|
|
202
|
-
---
|
|
203
|
-
|
|
204
|
-
## Safety notes
|
|
205
|
-
|
|
206
|
-
- Default to a single, low-risk command (`uname -a`).
|
|
207
|
-
- Do not run anything that modifies the filesystem or network as part of this prelude.
|
|
208
|
-
- Treat the prelude transcript as user-visible by default; avoid including secrets or personally identifying details.
|
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
# 做给祂看(Showing-by-Doing):把诉请机制变成“体感”
|
|
2
|
-
|
|
3
|
-
英文版:[English](./showing-by-doing.md)
|
|
4
|
-
|
|
5
|
-
## 摘要
|
|
6
|
-
|
|
7
|
-
Dominds 的诉请(Tellask,`!?@...`)与扪心自问(FBR,`!?@self`)并不是“写在系统提示里的约定”,而是**后端真实可驱动、可执行、可回传、可持久化**的机制。
|
|
8
|
-
|
|
9
|
-
问题在于:即使系统提示把诉请机制写得再细,大多数基础模型也并未在“真的可以随时拉一个队友去跑 shell 命令并把结果带回来”的世界里被训练过,因此容易把这些提示当成“说说而已 / 仅供参考”。这会直接削弱诉请与 FBR 的可用性。
|
|
10
|
-
|
|
11
|
-
因此引入 **“做给祂看”**:在一个对话创建之初,运行一段极短、极拟真的“真实诉请 + 真实 FBR”往返,让智能体产生明确的体感:
|
|
12
|
-
|
|
13
|
-
- 诉请是真的,会被执行
|
|
14
|
-
- 工具输出是真的,会被带回并写入对话记录
|
|
15
|
-
- `!?@self` FBR 也是真的,会作为支线对话产出报告并回传
|
|
16
|
-
|
|
17
|
-
体感建立后,系统提示可以**大幅简化**:只保留“短而准确”的契约说明即可,把“这在本环境里真实可用”的可信度交给做给祂看来完成。
|
|
18
|
-
|
|
19
|
-
相关文档:
|
|
20
|
-
|
|
21
|
-
- 诉请机制与子对话:`dominds/docs/dialog-system.md`
|
|
22
|
-
- 术语约定(主线/支线;诉请方/应答方):`dominds/docs/dominds-terminology.md`
|
|
23
|
-
- FBR(`!?@self`):`dominds/docs/fbr.md`
|
|
24
|
-
- 工作语言 vs UI 语言:`dominds/docs/i18n.md`
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
## 目标
|
|
29
|
-
|
|
30
|
-
- 在对话一开始就建立“诉请/回传/持久化都是真的”的信任。
|
|
31
|
-
- 在对话一开始就跑通一次 `!?@self` 的 FBR 回路。
|
|
32
|
-
- 过程足够小、可控、低风险(默认只执行 `uname -a`)。
|
|
33
|
-
- 记录从多角度都高度拟真:后端存档 + 前端可见的对话转录。
|
|
34
|
-
|
|
35
|
-
## 非目标
|
|
36
|
-
|
|
37
|
-
- 不在创建对话时执行任意用户输入的命令。
|
|
38
|
-
- 不收集敏感信息(默认只采集最小的 OS/Kernel 识别信息)。
|
|
39
|
-
- 不替代系统提示/设计文档:这是“体感补强”,不是完整规范的主载体。
|
|
40
|
-
|
|
41
|
-
---
|
|
42
|
-
|
|
43
|
-
## 概念(用户视角)
|
|
44
|
-
|
|
45
|
-
- **主线对话**:用户与主要智能体交互的那条线。
|
|
46
|
-
- **支线对话**:由诉请 / FBR 触发的临时工作线,产出结果回传主线。
|
|
47
|
-
- **诉请(Tellask)**:以 `!?@<memberId> ...` 向队友/对话发起的结构化请求。
|
|
48
|
-
- **Shell 专家(shell specialist)**:被允许执行 shell 命令并回传结果的队友(由 `shell_specialists` 配置指定)。
|
|
49
|
-
- **FBR(扪心自问)**:以 `!?@self` 触发的“无工具支线推理”,产出报告回传主线。
|
|
50
|
-
|
|
51
|
-
---
|
|
52
|
-
|
|
53
|
-
## 运行流程(对话创建时)
|
|
54
|
-
|
|
55
|
-
做给祂看发生在**第一条用户消息被处理之前**(可视为一个 Prelude / 序幕),除非用户在创建对话时明确选择跳过。
|
|
56
|
-
|
|
57
|
-
### 1)选择执行路径
|
|
58
|
-
|
|
59
|
-
1. 如果 team 配置里存在 `shell_specialists`,选择一个 shell 专员(建议确定性选择:列表第一个)。
|
|
60
|
-
2. 否则,由 **Dominds 运行时**直接执行基线命令(不通过智能体工具)。
|
|
61
|
-
|
|
62
|
-
补充:team 配置校验一般会要求——只要有队友拥有 shell 工具,就必须配置非空的 `shell_specialists`;同时,非 shell 专员不应持有 shell 工具。因此“没有配置 `shell_specialists`”通常意味着“对用户可见的队友都没有 shell 工具可用”。
|
|
63
|
-
|
|
64
|
-
基线命令(默认):
|
|
65
|
-
|
|
66
|
-
- `uname -a`
|
|
67
|
-
|
|
68
|
-
`uname -a` 失败时(例如非 POSIX 环境),可以改用平台等价命令;但默认肌肉记忆路径保留 `uname -a`,因为它低风险、快、且信息量刚好够用。
|
|
69
|
-
|
|
70
|
-
### 2)真实队友诉请:让 shell 专员执行 `uname -a`
|
|
71
|
-
|
|
72
|
-
若存在 shell 专员,则主线智能体(诉请方)以**工作语言**(server-wide,见 `dominds/docs/i18n.md`)向 shell 专员(应答方)发起真实诉请,要求:
|
|
73
|
-
|
|
74
|
-
- 执行 `uname -a`
|
|
75
|
-
- 原样返回输出
|
|
76
|
-
- 若命令不可用,返回错误信息,并给出替代命令建议
|
|
77
|
-
|
|
78
|
-
结果必须以正常对话转录的方式落盘并展示,至少清晰体现:
|
|
79
|
-
|
|
80
|
-
- 诉请的 headline + body
|
|
81
|
-
- shell 专员实际执行了命令
|
|
82
|
-
- 返回的原始输出
|
|
83
|
-
|
|
84
|
-
最小配置示例:
|
|
85
|
-
|
|
86
|
-
```yaml
|
|
87
|
-
# .minds/team.yaml
|
|
88
|
-
shell_specialists:
|
|
89
|
-
- cmdr
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
### 3)真实 FBR:基于环境信息做一次“扪心自问”
|
|
93
|
-
|
|
94
|
-
拿到环境快照(来自 shell 专员或直接运行)后,主线智能体触发一次 `!?@self` FBR,并在 FBR 的诉请正文里带上:
|
|
95
|
-
|
|
96
|
-
- `uname -a` 的完整输出
|
|
97
|
-
- 主线可用工具的假设(例如“主线可能有 `fs`/`os`/`mem`;但 FBR 你没有任何工具”)
|
|
98
|
-
- 问题:在这个环境里要注意什么?优先用哪些命令行工具,为什么?
|
|
99
|
-
|
|
100
|
-
FBR 产出应尽量短而可复用,典型包括:
|
|
101
|
-
|
|
102
|
-
- 环境判断(OS 家族、内核、是否容器/VM 线索)
|
|
103
|
-
- 注意事项(坑点清单)
|
|
104
|
-
- “优先工具/命令” shortlist(例如 `rg`、`sed`、`jq`、`tar`、`ps`、`lsof` 等,视环境而定)
|
|
105
|
-
|
|
106
|
-
### 4)把结果收敛成“环境速记”
|
|
107
|
-
|
|
108
|
-
主线智能体在主线对话里追加一条短总结(Environment Quickstart),让关键信息显性化、可检索。
|
|
109
|
-
|
|
110
|
-
---
|
|
111
|
-
|
|
112
|
-
## 降级策略
|
|
113
|
-
|
|
114
|
-
- **未配置 `shell_specialists`**:由 Dominds 运行时直接执行 `uname -a`,然后进入 FBR。
|
|
115
|
-
- **shell 专员失败/超时**:记录失败原因,由 Dominds 运行时直接执行 `uname -a`,继续进入 FBR。
|
|
116
|
-
- **`uname` 不存在/执行失败**:跳过命令执行,直接让 FBR 以“环境未知”输出:缺什么信息、为什么关键、后续如何补齐。
|
|
117
|
-
|
|
118
|
-
---
|
|
119
|
-
|
|
120
|
-
## 持久化、缓存与复用
|
|
121
|
-
|
|
122
|
-
### 1)记录必须“像真的一样”
|
|
123
|
-
|
|
124
|
-
做给祂看的每一步都必须作为标准对话记录落盘(消息 + 事件),并在 WebUI 中可见:
|
|
125
|
-
|
|
126
|
-
- 可跨重启(遵循常规对话持久化)
|
|
127
|
-
- 可 debug(日志/存储都有迹可循)
|
|
128
|
-
- 前端可查看转录(建议 UI 上做一个可折叠 Prelude 区域)
|
|
129
|
-
|
|
130
|
-
### 2)仅进程内缓存(按智能体维度)
|
|
131
|
-
|
|
132
|
-
为了避免每次新对话都重复跑 `uname -a` + FBR,后端进程可以维护一个**进程内缓存**(重启失效),按(至少)主线智能体 id 做 key。
|
|
133
|
-
|
|
134
|
-
缓存内容建议包含:
|
|
135
|
-
|
|
136
|
-
- 完整转录(诉请 + shell 输出 + FBR + 速记)
|
|
137
|
-
- 一份更短的 distilled “环境速记”(用于注入上下文)
|
|
138
|
-
- 时间戳 + 版本号(未来 schema 变化用)
|
|
139
|
-
|
|
140
|
-
复用策略:
|
|
141
|
-
|
|
142
|
-
- 若命中缓存,新对话可以直接复用首次的转录与速记,不再重复执行。
|
|
143
|
-
- 复用的记录在新对话里仍应可见,并清楚标记“来自缓存复用”。
|
|
144
|
-
|
|
145
|
-
### 3)跨 `clear_mind` 携带
|
|
146
|
-
|
|
147
|
-
每次 `clear_mind` 进入下一程时,不要依赖 reminder 来承载这件事。
|
|
148
|
-
|
|
149
|
-
改为:在每一程对话的上下文里,注入一段小而稳定的 **course prefix**(可理解为“历史消息区最开头的几条 msg”),内容是从首次做给祂看中提炼出的压缩转录(shell 快照 + FBR 摘要 + 环境速记)。这样智能体能持续保留“体感”和环境约束,而无需重复执行 Prelude,也不必每次把整段长转录重新塞进上下文。
|
|
150
|
-
|
|
151
|
-
---
|
|
152
|
-
|
|
153
|
-
## WebUI 需求
|
|
154
|
-
|
|
155
|
-
### 展示
|
|
156
|
-
|
|
157
|
-
- 做给祂看应以真实对话转录展示,用户可展开查看细节。
|
|
158
|
-
- 建议在对话顶部提供一个可折叠 Prelude 区域,并带上清晰标签:
|
|
159
|
-
- “队友诉请(shell)”
|
|
160
|
-
- “FBR(`!?@self`)”
|
|
161
|
-
- “环境速记(Environment Quickstart)”
|
|
162
|
-
|
|
163
|
-
### 创建对话时可选择跳过(opt-out)
|
|
164
|
-
|
|
165
|
-
创建对话框上提供明确开关,例如:
|
|
166
|
-
|
|
167
|
-
- Checkbox:“跳过做给祂看(不执行环境序幕)”
|
|
168
|
-
|
|
169
|
-
若选择跳过,则不执行任何 Prelude 行为,也不生成 Prelude 转录。
|
|
170
|
-
|
|
171
|
-
---
|
|
172
|
-
|
|
173
|
-
## 安全注意事项
|
|
174
|
-
|
|
175
|
-
- 默认只执行 `uname -a`(低风险、只读、快)。
|
|
176
|
-
- Prelude 禁止任何会改写文件/网络/系统状态的操作。
|
|
177
|
-
- 由于 Prelude 默认用户可见,严禁输出密钥/敏感信息。
|