dominds 1.4.2 → 1.5.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.
Files changed (174) hide show
  1. package/README.md +24 -0
  2. package/README.zh.md +24 -0
  3. package/dist/apps/app-json.js +38 -3
  4. package/dist/apps/dialog-run-controls.js +4 -0
  5. package/dist/apps/enabled-apps.js +8 -1
  6. package/dist/apps/installed-file.js +207 -0
  7. package/dist/apps/run-app-json.js +6 -6
  8. package/dist/apps/runtime-port.js +91 -0
  9. package/dist/apps/runtime.js +316 -68
  10. package/dist/apps-host/client.js +153 -3
  11. package/dist/apps-host/host.js +339 -2
  12. package/dist/apps-host/ipc-types.js +215 -30
  13. package/dist/cli/install.js +21 -1
  14. package/dist/dialog-fork.js +609 -0
  15. package/dist/dialog.js +2 -2
  16. package/dist/docs/agent-priming.md +38 -0
  17. package/dist/docs/agent-priming.zh.md +34 -0
  18. package/dist/docs/app-constitution.md +153 -2
  19. package/dist/docs/app-constitution.zh.md +153 -2
  20. package/dist/docs/dialog-persistence.md +31 -0
  21. package/dist/docs/dialog-persistence.zh.md +31 -0
  22. package/dist/docs/dialog-system.md +29 -0
  23. package/dist/docs/dialog-system.zh.md +29 -0
  24. package/dist/docs/kernel-app-architecture.md +286 -0
  25. package/dist/docs/kernel-app-architecture.zh.md +285 -0
  26. package/dist/llm/defaults.yaml +16 -0
  27. package/dist/llm/driver-entry.js +28 -0
  28. package/dist/llm/driver-v2/context-health.js +121 -0
  29. package/dist/llm/driver-v2/context.js +56 -0
  30. package/dist/llm/driver-v2/core.js +1545 -0
  31. package/dist/llm/driver-v2/index.js +26 -0
  32. package/dist/llm/driver-v2/orchestrator.js +158 -0
  33. package/dist/llm/driver-v2/policy.js +129 -0
  34. package/dist/llm/driver-v2/restore-dialog-hierarchy.js +73 -0
  35. package/dist/llm/driver-v2/round.js +366 -0
  36. package/dist/llm/driver-v2/runtime-utils.js +365 -0
  37. package/dist/llm/driver-v2/saying-events.js +20 -0
  38. package/dist/llm/driver-v2/subdialog-txn.js +42 -0
  39. package/dist/llm/driver-v2/supdialog-response.js +400 -0
  40. package/dist/llm/driver-v2/tellask-bridge.js +1148 -0
  41. package/dist/llm/driver-v2/types.js +10 -0
  42. package/dist/llm/driver-v2-ref-only/context-health.js +121 -0
  43. package/dist/llm/driver-v2-ref-only/context.js +17 -0
  44. package/dist/llm/driver-v2-ref-only/core.js +1710 -0
  45. package/dist/llm/driver-v2-ref-only/index.js +26 -0
  46. package/dist/llm/driver-v2-ref-only/orchestrator.js +158 -0
  47. package/dist/llm/driver-v2-ref-only/policy.js +129 -0
  48. package/dist/llm/driver-v2-ref-only/restore-dialog-hierarchy.js +73 -0
  49. package/dist/llm/driver-v2-ref-only/round.js +366 -0
  50. package/dist/llm/driver-v2-ref-only/runtime-utils.js +473 -0
  51. package/dist/llm/driver-v2-ref-only/saying-events.js +18 -0
  52. package/dist/llm/driver-v2-ref-only/subdialog-txn.js +42 -0
  53. package/dist/llm/driver-v2-ref-only/supdialog-response.js +453 -0
  54. package/dist/llm/driver-v2-ref-only/tellask-bridge.js +1178 -0
  55. package/dist/llm/driver-v2-ref-only/types.js +10 -0
  56. package/dist/llm/gen/anthropic.js +68 -15
  57. package/dist/llm/gen/codex.js +59 -10
  58. package/dist/llm/gen/openai-compatible.js +38 -9
  59. package/dist/llm/gen/openai.js +58 -11
  60. package/dist/llm/gen/tool-output-limit.js +50 -0
  61. package/dist/llm/kernel-driver/subdialog.js +23 -12
  62. package/dist/llm/kernel-driver/tellask-special.js +20 -4
  63. package/dist/minds/load.js +7 -0
  64. package/dist/persistence.js +216 -30
  65. package/dist/priming.js +171 -18
  66. package/dist/server/api-routes.js +82 -0
  67. package/dist/server/setup-routes.js +15 -0
  68. package/dist/shared/types/storage.js +77 -0
  69. package/dist/static/assets/{_basePickBy-B2o4z1Hf.js → _basePickBy-B-A5XrWM.js} +3 -3
  70. package/dist/static/assets/{_basePickBy-B2o4z1Hf.js.map → _basePickBy-B-A5XrWM.js.map} +1 -1
  71. package/dist/static/assets/{_baseUniq-CLmcxjdl.js → _baseUniq-BANLb0cu.js} +2 -2
  72. package/dist/static/assets/{_baseUniq-CLmcxjdl.js.map → _baseUniq-BANLb0cu.js.map} +1 -1
  73. package/dist/static/assets/{arc-CymD_KN7.js → arc-CYZYnojf.js} +2 -2
  74. package/dist/static/assets/{arc-CymD_KN7.js.map → arc-CYZYnojf.js.map} +1 -1
  75. package/dist/static/assets/{architectureDiagram-VXUJARFQ-DJQfSJUH.js → architectureDiagram-VXUJARFQ-Cxf4pmYG.js} +7 -7
  76. package/dist/static/assets/{architectureDiagram-VXUJARFQ-DJQfSJUH.js.map → architectureDiagram-VXUJARFQ-Cxf4pmYG.js.map} +1 -1
  77. package/dist/static/assets/{blockDiagram-VD42YOAC-pHVz60D0.js → blockDiagram-VD42YOAC-wvs0G30c.js} +7 -7
  78. package/dist/static/assets/{blockDiagram-VD42YOAC-pHVz60D0.js.map → blockDiagram-VD42YOAC-wvs0G30c.js.map} +1 -1
  79. package/dist/static/assets/{c4Diagram-YG6GDRKO-B0WnCfAT.js → c4Diagram-YG6GDRKO-BKFNexn4.js} +3 -3
  80. package/dist/static/assets/{c4Diagram-YG6GDRKO-B0WnCfAT.js.map → c4Diagram-YG6GDRKO-BKFNexn4.js.map} +1 -1
  81. package/dist/static/assets/{channel-CX9BlKil.js → channel-_1qpxJWy.js} +2 -2
  82. package/dist/static/assets/{channel-CX9BlKil.js.map → channel-_1qpxJWy.js.map} +1 -1
  83. package/dist/static/assets/{chunk-4BX2VUAB-lXArRj3o.js → chunk-4BX2VUAB-BIdC0phm.js} +2 -2
  84. package/dist/static/assets/{chunk-4BX2VUAB-lXArRj3o.js.map → chunk-4BX2VUAB-BIdC0phm.js.map} +1 -1
  85. package/dist/static/assets/{chunk-55IACEB6-CdqwynH9.js → chunk-55IACEB6-BNvGenQ9.js} +2 -2
  86. package/dist/static/assets/{chunk-55IACEB6-CdqwynH9.js.map → chunk-55IACEB6-BNvGenQ9.js.map} +1 -1
  87. package/dist/static/assets/{chunk-B4BG7PRW-Y-uXcJst.js → chunk-B4BG7PRW-jmf-1Wv7.js} +5 -5
  88. package/dist/static/assets/{chunk-B4BG7PRW-Y-uXcJst.js.map → chunk-B4BG7PRW-jmf-1Wv7.js.map} +1 -1
  89. package/dist/static/assets/{chunk-DI55MBZ5-C5xSbRST.js → chunk-DI55MBZ5-nmEmcikR.js} +4 -4
  90. package/dist/static/assets/{chunk-DI55MBZ5-C5xSbRST.js.map → chunk-DI55MBZ5-nmEmcikR.js.map} +1 -1
  91. package/dist/static/assets/{chunk-FMBD7UC4-5uefwCjI.js → chunk-FMBD7UC4-kGysaq_j.js} +2 -2
  92. package/dist/static/assets/{chunk-FMBD7UC4-5uefwCjI.js.map → chunk-FMBD7UC4-kGysaq_j.js.map} +1 -1
  93. package/dist/static/assets/{chunk-QN33PNHL-DzWVcvpI.js → chunk-QN33PNHL-8JwMLFIJ.js} +2 -2
  94. package/dist/static/assets/{chunk-QN33PNHL-DzWVcvpI.js.map → chunk-QN33PNHL-8JwMLFIJ.js.map} +1 -1
  95. package/dist/static/assets/{chunk-QZHKN3VN-BrrvAZdP.js → chunk-QZHKN3VN-DZleEj00.js} +2 -2
  96. package/dist/static/assets/{chunk-QZHKN3VN-BrrvAZdP.js.map → chunk-QZHKN3VN-DZleEj00.js.map} +1 -1
  97. package/dist/static/assets/{chunk-TZMSLE5B-DyKOlPTY.js → chunk-TZMSLE5B-CXxl_uqH.js} +2 -2
  98. package/dist/static/assets/{chunk-TZMSLE5B-DyKOlPTY.js.map → chunk-TZMSLE5B-CXxl_uqH.js.map} +1 -1
  99. package/dist/static/assets/{classDiagram-2ON5EDUG-FCrnlCWC.js → classDiagram-2ON5EDUG-C-7R0QB6.js} +6 -6
  100. package/dist/static/assets/{classDiagram-2ON5EDUG-FCrnlCWC.js.map → classDiagram-2ON5EDUG-C-7R0QB6.js.map} +1 -1
  101. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-FCrnlCWC.js → classDiagram-v2-WZHVMYZB-C-7R0QB6.js} +6 -6
  102. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-FCrnlCWC.js.map → classDiagram-v2-WZHVMYZB-C-7R0QB6.js.map} +1 -1
  103. package/dist/static/assets/{clone-BlI81KqZ.js → clone-BwOKYSj8.js} +2 -2
  104. package/dist/static/assets/{clone-BlI81KqZ.js.map → clone-BwOKYSj8.js.map} +1 -1
  105. package/dist/static/assets/{cose-bilkent-S5V4N54A-yM7S2atz.js → cose-bilkent-S5V4N54A-BCBalM7p.js} +2 -2
  106. package/dist/static/assets/{cose-bilkent-S5V4N54A-yM7S2atz.js.map → cose-bilkent-S5V4N54A-BCBalM7p.js.map} +1 -1
  107. package/dist/static/assets/{dagre-6UL2VRFP-BcweuZHt.js → dagre-6UL2VRFP-uV2ekQoj.js} +7 -7
  108. package/dist/static/assets/{dagre-6UL2VRFP-BcweuZHt.js.map → dagre-6UL2VRFP-uV2ekQoj.js.map} +1 -1
  109. package/dist/static/assets/{diagram-PSM6KHXK-D4-QwLW1.js → diagram-PSM6KHXK-D-ZMog1-.js} +8 -8
  110. package/dist/static/assets/{diagram-PSM6KHXK-D4-QwLW1.js.map → diagram-PSM6KHXK-D-ZMog1-.js.map} +1 -1
  111. package/dist/static/assets/{diagram-QEK2KX5R-BVbuejJn.js → diagram-QEK2KX5R-BThSELUH.js} +7 -7
  112. package/dist/static/assets/{diagram-QEK2KX5R-BVbuejJn.js.map → diagram-QEK2KX5R-BThSELUH.js.map} +1 -1
  113. package/dist/static/assets/{diagram-S2PKOQOG-pB6N6Tq_.js → diagram-S2PKOQOG-Di-YN5cd.js} +7 -7
  114. package/dist/static/assets/{diagram-S2PKOQOG-pB6N6Tq_.js.map → diagram-S2PKOQOG-Di-YN5cd.js.map} +1 -1
  115. package/dist/static/assets/{erDiagram-Q2GNP2WA-DLKmthuw.js → erDiagram-Q2GNP2WA-lBZ9DITn.js} +5 -5
  116. package/dist/static/assets/{erDiagram-Q2GNP2WA-DLKmthuw.js.map → erDiagram-Q2GNP2WA-lBZ9DITn.js.map} +1 -1
  117. package/dist/static/assets/{flowDiagram-NV44I4VS-BsBhWukh.js → flowDiagram-NV44I4VS-C_60PNQR.js} +6 -6
  118. package/dist/static/assets/{flowDiagram-NV44I4VS-BsBhWukh.js.map → flowDiagram-NV44I4VS-C_60PNQR.js.map} +1 -1
  119. package/dist/static/assets/{ganttDiagram-JELNMOA3-Debz-J-C.js → ganttDiagram-JELNMOA3-Dvqq-VHJ.js} +3 -3
  120. package/dist/static/assets/{ganttDiagram-JELNMOA3-Debz-J-C.js.map → ganttDiagram-JELNMOA3-Dvqq-VHJ.js.map} +1 -1
  121. package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-BnAPFBGR.js → gitGraphDiagram-V2S2FVAM-BTj8orRe.js} +8 -8
  122. package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-BnAPFBGR.js.map → gitGraphDiagram-V2S2FVAM-BTj8orRe.js.map} +1 -1
  123. package/dist/static/assets/{graph-DbzWiBNK.js → graph-BqCzR2Nl.js} +3 -3
  124. package/dist/static/assets/{graph-DbzWiBNK.js.map → graph-BqCzR2Nl.js.map} +1 -1
  125. package/dist/static/assets/{index-B-8J28g7.js → index-DrTqAfFy.js} +386 -201
  126. package/dist/static/assets/index-DrTqAfFy.js.map +1 -0
  127. package/dist/static/assets/{infoDiagram-HS3SLOUP-CZ5hWoxV.js → infoDiagram-HS3SLOUP-DlC6wsrv.js} +6 -6
  128. package/dist/static/assets/{infoDiagram-HS3SLOUP-CZ5hWoxV.js.map → infoDiagram-HS3SLOUP-DlC6wsrv.js.map} +1 -1
  129. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-CKN3oSxk.js → journeyDiagram-XKPGCS4Q-Dg_RgtQX.js} +5 -5
  130. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-CKN3oSxk.js.map → journeyDiagram-XKPGCS4Q-Dg_RgtQX.js.map} +1 -1
  131. package/dist/static/assets/{kanban-definition-3W4ZIXB7-BQCMklfJ.js → kanban-definition-3W4ZIXB7-DuGS3lId.js} +3 -3
  132. package/dist/static/assets/{kanban-definition-3W4ZIXB7-BQCMklfJ.js.map → kanban-definition-3W4ZIXB7-DuGS3lId.js.map} +1 -1
  133. package/dist/static/assets/{layout-C5B58szc.js → layout-FDz2bstZ.js} +5 -5
  134. package/dist/static/assets/{layout-C5B58szc.js.map → layout-FDz2bstZ.js.map} +1 -1
  135. package/dist/static/assets/{linear-_32fut6G.js → linear-CzsdvPGb.js} +2 -2
  136. package/dist/static/assets/{linear-_32fut6G.js.map → linear-CzsdvPGb.js.map} +1 -1
  137. package/dist/static/assets/{mindmap-definition-VGOIOE7T-C_goMzjx.js → mindmap-definition-VGOIOE7T-WsAF5UNp.js} +4 -4
  138. package/dist/static/assets/{mindmap-definition-VGOIOE7T-C_goMzjx.js.map → mindmap-definition-VGOIOE7T-WsAF5UNp.js.map} +1 -1
  139. package/dist/static/assets/{pieDiagram-ADFJNKIX-BQ2n0cOB.js → pieDiagram-ADFJNKIX-DJpRJ5ei.js} +8 -8
  140. package/dist/static/assets/{pieDiagram-ADFJNKIX-BQ2n0cOB.js.map → pieDiagram-ADFJNKIX-DJpRJ5ei.js.map} +1 -1
  141. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-BLg7_neg.js → quadrantDiagram-AYHSOK5B-CMyIzTkY.js} +3 -3
  142. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-BLg7_neg.js.map → quadrantDiagram-AYHSOK5B-CMyIzTkY.js.map} +1 -1
  143. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DwkJt0zi.js → requirementDiagram-UZGBJVZJ-D_yqVXGu.js} +4 -4
  144. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DwkJt0zi.js.map → requirementDiagram-UZGBJVZJ-D_yqVXGu.js.map} +1 -1
  145. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-DmxmatUB.js → sankeyDiagram-TZEHDZUN-D4-cF724.js} +2 -2
  146. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-DmxmatUB.js.map → sankeyDiagram-TZEHDZUN-D4-cF724.js.map} +1 -1
  147. package/dist/static/assets/{sequenceDiagram-WL72ISMW-KHU_eApU.js → sequenceDiagram-WL72ISMW-B7J3gWYN.js} +4 -4
  148. package/dist/static/assets/{sequenceDiagram-WL72ISMW-KHU_eApU.js.map → sequenceDiagram-WL72ISMW-B7J3gWYN.js.map} +1 -1
  149. package/dist/static/assets/{stateDiagram-FKZM4ZOC-B3DBCxAL.js → stateDiagram-FKZM4ZOC-DwEYYCcu.js} +9 -9
  150. package/dist/static/assets/{stateDiagram-FKZM4ZOC-B3DBCxAL.js.map → stateDiagram-FKZM4ZOC-DwEYYCcu.js.map} +1 -1
  151. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-C-uIk7gh.js → stateDiagram-v2-4FDKWEC3-D4LOOQV5.js} +5 -5
  152. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-C-uIk7gh.js.map → stateDiagram-v2-4FDKWEC3-D4LOOQV5.js.map} +1 -1
  153. package/dist/static/assets/{timeline-definition-IT6M3QCI-SysEcQCC.js → timeline-definition-IT6M3QCI-CyG-TJ_A.js} +3 -3
  154. package/dist/static/assets/{timeline-definition-IT6M3QCI-SysEcQCC.js.map → timeline-definition-IT6M3QCI-CyG-TJ_A.js.map} +1 -1
  155. package/dist/static/assets/{treemap-GDKQZRPO-d0AbKEc4.js → treemap-GDKQZRPO-yY4GiKmU.js} +5 -5
  156. package/dist/static/assets/{treemap-GDKQZRPO-d0AbKEc4.js.map → treemap-GDKQZRPO-yY4GiKmU.js.map} +1 -1
  157. package/dist/static/assets/{xychartDiagram-PRI3JC2R-CmSQMxUh.js → xychartDiagram-PRI3JC2R-5TYN_q15.js} +3 -3
  158. package/dist/static/assets/{xychartDiagram-PRI3JC2R-CmSQMxUh.js.map → xychartDiagram-PRI3JC2R-5TYN_q15.js.map} +1 -1
  159. package/dist/static/index.html +1 -1
  160. package/dist/team.js +33 -4
  161. package/dist/tools/app-reminders.js +280 -0
  162. package/dist/tools/prompts/memory/en/errors.md +155 -0
  163. package/dist/tools/prompts/memory/en/index.md +47 -0
  164. package/dist/tools/prompts/memory/en/principles.md +79 -0
  165. package/dist/tools/prompts/memory/en/scenarios.md +174 -0
  166. package/dist/tools/prompts/memory/en/tools.md +154 -0
  167. package/dist/tools/prompts/memory/zh/errors.md +155 -0
  168. package/dist/tools/prompts/memory/zh/index.md +47 -0
  169. package/dist/tools/prompts/memory/zh/principles.md +79 -0
  170. package/dist/tools/prompts/memory/zh/scenarios.md +174 -0
  171. package/dist/tools/prompts/memory/zh/tools.md +154 -0
  172. package/dist/tools/ripgrep.js +197 -63
  173. package/package.json +2 -2
  174. package/dist/static/assets/index-B-8J28g7.js.map +0 -1
@@ -0,0 +1,174 @@
1
+ # memory 使用场景
2
+
3
+ ## 模板(场景)
4
+
5
+ ### 场景格式
6
+
7
+ - 目标
8
+ - 前置条件
9
+ - 步骤
10
+ - 期望信号
11
+ - 失败分支处理
12
+ - 完成判据
13
+
14
+ ## 场景 1:任务进度跟踪
15
+
16
+ ### 场景描述
17
+
18
+ 在长时间任务中,需要持久化任务进度,以便重启后继续。
19
+
20
+ ### 示例
21
+
22
+ **添加任务列表**
23
+
24
+ ```typescript
25
+ add_memory({
26
+ path: 'project/i18n-tasks',
27
+ content:
28
+ '## 待办任务\n\n- [ ] 创建 ws_mod 手册\n- [ ] 创建 team_mgmt 手册\n- [ ] 创建 memory 手册\n- [ ] 创建 control 手册\n\n## 进行中\n- [ ] 创建 ws_mod 手册 [100%]',
29
+ });
30
+ ```
31
+
32
+ **更新任务进度**
33
+
34
+ ```typescript
35
+ replace_memory({
36
+ path: 'project/i18n-tasks',
37
+ content:
38
+ '## 待办任务\n\n- [ ] 创建 team_mgmt 手册\n- [ ] 创建 memory 手册\n- [ ] 创建 control 手册\n\n## 已完成\n- [x] 创建 ws_mod 手册\n\n## 进行中\n- [ ] 创建 team_mgmt 手册 [50%]',
39
+ });
40
+ ```
41
+
42
+ ## 场景 2:用户偏好存储
43
+
44
+ ### 场景描述
45
+
46
+ 保存用户偏好设置,例如编程语言、主题等。
47
+
48
+ ### 示例
49
+
50
+ **保存用户偏好**
51
+
52
+ ```typescript
53
+ add_memory({
54
+ path: 'user/preferences',
55
+ content:
56
+ '## 用户偏好\n\n- 编程语言: TypeScript\n- 代码风格: strict\n- 主题: dark\n- 自动保存: true',
57
+ });
58
+ ```
59
+
60
+ **更新偏好**
61
+
62
+ ```typescript
63
+ replace_memory({
64
+ path: 'user/preferences',
65
+ content:
66
+ '## 用户偏好\n\n- 编程语言: TypeScript\n- 代码风格: strict\n- 主题: light\n- 自动保存: true',
67
+ });
68
+ ```
69
+
70
+ ## 场景 3:上下文信息保存
71
+
72
+ ### 场景描述
73
+
74
+ 在复杂任务中,保存重要的上下文信息,避免重复查询。
75
+
76
+ ### 示例
77
+
78
+ **保存 API 信息**
79
+
80
+ ```typescript
81
+ add_memory({
82
+ path: 'context/api-endpoints',
83
+ content:
84
+ '## API 端点\n\n- 用户登录: POST /api/auth/login\n- 获取用户信息: GET /api/user/info\n- 更新用户设置: PUT /api/user/settings\n\n## 认证\n- 使用 Bearer Token\n- 有效期: 24 小时',
85
+ });
86
+ ```
87
+
88
+ **保存技术栈**
89
+
90
+ ```typescript
91
+ add_memory({
92
+ path: 'context/tech-stack',
93
+ content:
94
+ '## 技术栈\n\n- 前端: React + TypeScript\n- 后端: Node.js + Express\n- 数据库: PostgreSQL\n- 缓存: Redis',
95
+ });
96
+ ```
97
+
98
+ ## 场景 4:会议记录
99
+
100
+ ### 场景描述
101
+
102
+ 保存会议要点和决策。
103
+
104
+ ### 示例
105
+
106
+ ```typescript
107
+ add_memory({
108
+ path: 'meeting/2024-01-15',
109
+ content:
110
+ '## 会议纪要: 2024-01-15\n\n### 参与者\n- @fullstack\n- @i18n\n- @ux\n\n### 议题\n1. i18n 手册创建计划\n2. man 函数 UX 改进\n\n### 决策\n- 优先创建 ws_mod 和 team_mgmt 手册\n- man 函数支持模糊匹配\n\n### 待办\n- @i18n: 创建 memory 手册\n- @fullstack: 优化 man 函数',
111
+ });
112
+ ```
113
+
114
+ ## 场景 5:知识库
115
+
116
+ ### 场景描述
117
+
118
+ 建立个人知识库,保存学习笔记。
119
+
120
+ ### 示例
121
+
122
+ ```typescript
123
+ add_memory({
124
+ path: 'knowledge/typescript-tips',
125
+ content:
126
+ '## TypeScript 技巧\n\n### 1. 类型推断\nconst x = 1; // 类型推断为 number\n\n### 2. 接口 vs 类型\n- 接口: 可扩展,适合对象类型\n- 类型: 支持联合类型、交叉类型\n\n### 3. strict 模式\n启用 strict 模式可以获得更好的类型安全',
127
+ });
128
+ ```
129
+
130
+ ## 场景 6:临时笔记
131
+
132
+ ### 场景描述
133
+
134
+ 临时保存需要稍后处理的信息。
135
+
136
+ ### 示例
137
+
138
+ ```typescript
139
+ add_memory({
140
+ path: 'scratchpad/temp-notes',
141
+ content:
142
+ '## 临时笔记\n\n- TODO: 检查 team.yaml 配置\n- TODO: 验证 man 函数类型\n- TODO: 更新差遣牒进度',
143
+ });
144
+ ```
145
+
146
+ **处理完后删除**
147
+
148
+ ```typescript
149
+ drop_memory({
150
+ path: 'scratchpad/temp-notes',
151
+ });
152
+ ```
153
+
154
+ ## 场景 7:清理过时记忆
155
+
156
+ ### 场景描述
157
+
158
+ 定期清理不再需要的记忆。
159
+
160
+ ### 示例
161
+
162
+ ```typescript
163
+ // 查看当前所有记忆(智能体可读取)
164
+ // 逐个删除不需要的记忆
165
+ drop_memory({
166
+ path: 'project/old-feature',
167
+ });
168
+ ```
169
+
170
+ 或者使用 `clear_memory` 清空所有记忆(谨慎使用):
171
+
172
+ ```typescript
173
+ clear_memory({});
174
+ ```
@@ -0,0 +1,154 @@
1
+ # memory 工具参考
2
+
3
+ ## 模板(工具)
4
+
5
+ ### 阅读方式
6
+
7
+ - "工具契约(Schema)" 为参数/返回的权威来源。
8
+
9
+ ### 单工具字段顺序
10
+
11
+ 1. 用途
12
+ 2. 调用签名
13
+ 3. 参数(参见 schema)
14
+ 4. 前置条件
15
+ 5. 成功信号
16
+ 6. 失败/错误
17
+ 7. 可直接执行示例
18
+ 8. 常见误用
19
+
20
+ ## 工具列表
21
+
22
+ ### 1. add_memory
23
+
24
+ 创建新记忆(路径不存在时)。
25
+
26
+ **参数:**
27
+
28
+ - `path`(必需):记忆的唯一标识符
29
+ - `content`(必需):记忆内容
30
+
31
+ **返回:**
32
+
33
+ ```yaml
34
+ status: ok|error
35
+ path: <记忆路径>
36
+ content_size: <内容字节数>
37
+ created_at: <创建时间戳>
38
+ ```
39
+
40
+ **错误:**
41
+
42
+ - `MEMORY_ALREADY_EXISTS`:路径已存在,使用 `replace_memory` 更新
43
+
44
+ ### 2. replace_memory
45
+
46
+ 更新已有记忆(路径存在时)。
47
+
48
+ **参数:**
49
+
50
+ - `path`(必需):记忆的唯一标识符
51
+ - `content`(必需):新的记忆内容
52
+
53
+ **返回:**
54
+
55
+ ```yaml
56
+ status: ok|error
57
+ path: <记忆路径>
58
+ content_size: <内容字节数>
59
+ updated_at: <更新时间戳>
60
+ ```
61
+
62
+ **错误:**
63
+
64
+ - `MEMORY_NOT_FOUND`:路径不存在,使用 `add_memory` 创建
65
+
66
+ ### 3. drop_memory
67
+
68
+ 删除指定记忆。
69
+
70
+ **参数:**
71
+
72
+ - `path`(必需):要删除的记忆路径
73
+
74
+ **返回:**
75
+
76
+ ```yaml
77
+ status: ok|error
78
+ path: <记忆路径>
79
+ deleted_at: <删除时间戳>
80
+ ```
81
+
82
+ **错误:**
83
+
84
+ - `MEMORY_NOT_FOUND`:路径不存在
85
+
86
+ ### 4. clear_memory
87
+
88
+ 清空所有个人记忆。
89
+
90
+ **警告:** 此操作不可恢复!
91
+
92
+ **参数:** 无
93
+
94
+ **返回:**
95
+
96
+ ```yaml
97
+ status: ok|error
98
+ cleared_count: <删除的记忆数量>
99
+ cleared_at: <删除时间戳>
100
+ ```
101
+
102
+ **错误:**
103
+
104
+ - 无(即使没有记忆也会返回成功)
105
+
106
+ ## 使用示例
107
+
108
+ ### 添加新记忆
109
+
110
+ ```typescript
111
+ add_memory({
112
+ path: 'project/todo',
113
+ content: '- 完成 i18n 文档\n- 编写测试用例\n- 更新 README',
114
+ });
115
+ ```
116
+
117
+ ### 更新已有记忆
118
+
119
+ ```typescript
120
+ replace_memory({
121
+ path: 'project/todo',
122
+ content: '- 完成 i18n 文档 [DONE]\n- 编写测试用例 [IN PROGRESS]\n- 更新 README',
123
+ });
124
+ ```
125
+
126
+ ### 删除记忆
127
+
128
+ ```typescript
129
+ drop_memory({
130
+ path: 'project/todo',
131
+ });
132
+ ```
133
+
134
+ ### 清空所有记忆
135
+
136
+ ```typescript
137
+ clear_memory({});
138
+ ```
139
+
140
+ ## YAML 输出契约
141
+
142
+ 所有工具的输出都使用 YAML 格式,便于程序化处理:
143
+
144
+ - `status`:操作状态,`ok` 表示成功,`error` 表示失败
145
+ - `path`:记忆路径
146
+ - 其他字段:具体操作的附加信息
147
+
148
+ 错误时返回:
149
+
150
+ ```yaml
151
+ status: error
152
+ error_code: <错误代码>
153
+ message: <错误消息>
154
+ ```
@@ -23,6 +23,11 @@ function yamlFlowStringArray(values) {
23
23
  return '[]';
24
24
  return `[${values.map(yamlQuote).join(', ')}]`;
25
25
  }
26
+ function yamlFlowNumberArray(values) {
27
+ if (values.length === 0)
28
+ return '[]';
29
+ return `[${values.join(', ')}]`;
30
+ }
26
31
  function requireNonEmptyStringArg(args, key) {
27
32
  const value = args[key];
28
33
  if (typeof value !== 'string' || value.trim() === '') {
@@ -223,6 +228,176 @@ function formatForbiddenSearchPathAccessDeniedYaml(mode, pattern, searchPath, fo
223
228
  ].join('\n');
224
229
  return formatYamlCodeBlock(yaml);
225
230
  }
231
+ const RIPGREP_SNIPPET_TEXT_CHAR_LIMIT = 400;
232
+ const RIPGREP_SNIPPET_OUTPUT_CHAR_LIMIT = 200000;
233
+ const RIPGREP_SNIPPET_RESULTS_CHAR_BUDGET = RIPGREP_SNIPPET_OUTPUT_CHAR_LIMIT - 2048;
234
+ function truncateRipgrepSnippetText(text, maxChars = RIPGREP_SNIPPET_TEXT_CHAR_LIMIT) {
235
+ if (text.length <= maxChars)
236
+ return { text, truncated: false, originalChars: text.length };
237
+ const suffix = `...[truncated ${text.length - maxChars} chars]`;
238
+ if (suffix.length >= maxChars) {
239
+ return { text: suffix.slice(0, maxChars), truncated: true, originalChars: text.length };
240
+ }
241
+ const keepChars = maxChars - suffix.length;
242
+ return {
243
+ text: `${text.slice(0, keepChars)}${suffix}`,
244
+ truncated: true,
245
+ originalChars: text.length,
246
+ };
247
+ }
248
+ function sumNumbers(values) {
249
+ let total = 0;
250
+ for (const value of values)
251
+ total += value;
252
+ return total;
253
+ }
254
+ function renderRipgrepSnippetResult(result) {
255
+ const match = truncateRipgrepSnippetText(result.match);
256
+ const renderedBefore = (result.before ?? []).map((line) => truncateRipgrepSnippetText(line));
257
+ const renderedAfter = (result.after ?? []).map((line) => truncateRipgrepSnippetText(line));
258
+ const beforeOriginalChars = renderedBefore.map((line) => line.originalChars);
259
+ const afterOriginalChars = renderedAfter.map((line) => line.originalChars);
260
+ const textTruncated = match.truncated ||
261
+ renderedBefore.some((line) => line.truncated) ||
262
+ renderedAfter.some((line) => line.truncated);
263
+ const reasons = textTruncated ? ['per_text_char_limit'] : [];
264
+ const originalTextChars = match.originalChars + sumNumbers(beforeOriginalChars) + sumNumbers(afterOriginalChars);
265
+ return {
266
+ yaml: [
267
+ ` - path: ${yamlQuote(result.path)}`,
268
+ ` line: ${result.line}`,
269
+ ` col: ${result.col}`,
270
+ ` text_truncated: ${textTruncated}`,
271
+ ` match: ${yamlQuote(match.text)}`,
272
+ ...(result.before
273
+ ? [` before: ${yamlFlowStringArray(renderedBefore.map((line) => line.text))}`]
274
+ : []),
275
+ ...(result.after
276
+ ? [` after: ${yamlFlowStringArray(renderedAfter.map((line) => line.text))}`]
277
+ : []),
278
+ ` truncation:`,
279
+ ` applied: ${textTruncated}`,
280
+ ` reasons: ${yamlFlowStringArray(reasons)}`,
281
+ ` match_original_chars: ${match.originalChars}`,
282
+ ` before_original_chars: ${yamlFlowNumberArray(beforeOriginalChars)}`,
283
+ ` after_original_chars: ${yamlFlowNumberArray(afterOriginalChars)}`,
284
+ ].join('\n'),
285
+ textTruncated,
286
+ originalTextChars,
287
+ };
288
+ }
289
+ function fitRipgrepSnippetResults(results) {
290
+ const rendered = [];
291
+ let usedChars = 0;
292
+ let textTruncated = false;
293
+ let outputCharsTruncated = false;
294
+ let textTrimmedResultCount = 0;
295
+ let shownOriginalTextChars = 0;
296
+ let omittedOriginalTextChars = 0;
297
+ let omittedResultsByOutputBudget = 0;
298
+ for (let idx = 0; idx < results.length; idx += 1) {
299
+ const result = results[idx];
300
+ const next = renderRipgrepSnippetResult(result);
301
+ textTruncated = textTruncated || next.textTruncated;
302
+ if (next.textTruncated)
303
+ textTrimmedResultCount += 1;
304
+ const nextChars = next.yaml.length + (rendered.length > 0 ? 1 : 0);
305
+ if (usedChars + nextChars > RIPGREP_SNIPPET_RESULTS_CHAR_BUDGET) {
306
+ outputCharsTruncated = true;
307
+ omittedResultsByOutputBudget = results.length - idx;
308
+ omittedOriginalTextChars += next.originalTextChars;
309
+ for (let rest = idx + 1; rest < results.length; rest += 1) {
310
+ omittedOriginalTextChars += renderRipgrepSnippetResult(results[rest]).originalTextChars;
311
+ }
312
+ break;
313
+ }
314
+ rendered.push(next.yaml);
315
+ usedChars += nextChars;
316
+ shownOriginalTextChars += next.originalTextChars;
317
+ }
318
+ if (rendered.length < results.length && !outputCharsTruncated) {
319
+ outputCharsTruncated = true;
320
+ omittedResultsByOutputBudget = results.length - rendered.length;
321
+ }
322
+ return {
323
+ rendered,
324
+ textTruncated,
325
+ outputCharsTruncated,
326
+ textTrimmedResultCount,
327
+ shownOriginalTextChars,
328
+ omittedOriginalTextChars,
329
+ omittedResultsByOutputBudget,
330
+ };
331
+ }
332
+ function buildRipgrepSnippetSummary(input) {
333
+ if (input.totalMatches === 0)
334
+ return 'No matches.';
335
+ if (input.truncatedByMatchLimit && input.truncatedByOutputChars) {
336
+ return `Found ${input.totalMatches} matches; showing ${input.shownResults} snippets within max_results/output limits (truncated=true).`;
337
+ }
338
+ if (input.truncatedByOutputChars) {
339
+ return `Found ${input.totalMatches} matches; showing ${input.shownResults} snippets within output size limit (truncated=true).`;
340
+ }
341
+ if (input.truncatedByMatchLimit) {
342
+ return `Showing first ${input.maxResults} of ${input.totalMatches} matches (truncated=true).`;
343
+ }
344
+ if (input.textTruncated) {
345
+ return `Found ${input.totalMatches} matches; long snippet lines were trimmed for readability.`;
346
+ }
347
+ return `Found ${input.totalMatches} matches.`;
348
+ }
349
+ function formatRipgrepSnippetYaml(input) {
350
+ const fitted = fitRipgrepSnippetResults(input.results);
351
+ const truncatedByMatchLimit = input.totalMatches > input.maxResults;
352
+ const truncated = truncatedByMatchLimit || fitted.outputCharsTruncated || fitted.textTruncated;
353
+ const truncationReasons = [];
354
+ if (truncatedByMatchLimit)
355
+ truncationReasons.push('max_results');
356
+ if (fitted.outputCharsTruncated)
357
+ truncationReasons.push('output_char_budget');
358
+ if (fitted.textTruncated)
359
+ truncationReasons.push('per_text_char_limit');
360
+ const summary = buildRipgrepSnippetSummary({
361
+ totalMatches: input.totalMatches,
362
+ shownResults: fitted.rendered.length,
363
+ maxResults: input.maxResults,
364
+ truncatedByMatchLimit,
365
+ truncatedByOutputChars: fitted.outputCharsTruncated,
366
+ textTruncated: fitted.textTruncated,
367
+ });
368
+ const yaml = [
369
+ `status: ok`,
370
+ `pattern: ${yamlQuote(input.pattern)}`,
371
+ `mode: snippets`,
372
+ `path: ${yamlQuote(input.searchPath)}`,
373
+ ...(input.globs.length > 0 ? [`globs: ${yamlFlowStringArray(input.globs)}`] : []),
374
+ `case: ${input.caseMode}`,
375
+ `fixed_strings: ${input.fixedStrings}`,
376
+ `regex: ${!input.fixedStrings}`,
377
+ `truncated: ${truncated}`,
378
+ `truncated_by_output_chars: ${fitted.outputCharsTruncated}`,
379
+ `snippet_text_truncated: ${fitted.textTruncated}`,
380
+ `limits:`,
381
+ ` max_results: ${input.maxResults}`,
382
+ ` max_output_chars: ${RIPGREP_SNIPPET_OUTPUT_CHAR_LIMIT}`,
383
+ ` per_text_char_limit: ${RIPGREP_SNIPPET_TEXT_CHAR_LIMIT}`,
384
+ `totals:`,
385
+ ` files_matched: ${input.fileCount}`,
386
+ ` matches: ${input.totalMatches}`,
387
+ ` shown_results: ${fitted.rendered.length}`,
388
+ `truncation:`,
389
+ ` applied: ${truncated}`,
390
+ ` reasons: ${yamlFlowStringArray(truncationReasons)}`,
391
+ ` text_trimmed_result_count: ${fitted.textTrimmedResultCount}`,
392
+ ` omitted_results_by_output_budget: ${fitted.omittedResultsByOutputBudget}`,
393
+ ` shown_original_text_chars: ${fitted.shownOriginalTextChars}`,
394
+ ` omitted_original_text_chars: ${fitted.omittedOriginalTextChars}`,
395
+ `summary: ${yamlQuote(summary)}`,
396
+ `results:`,
397
+ ...fitted.rendered,
398
+ ].join('\n');
399
+ return formatYamlCodeBlock(yaml);
400
+ }
226
401
  function defaultBaseOptions() {
227
402
  return {
228
403
  globs: [],
@@ -549,39 +724,17 @@ async function runRipgrepSnippets(caller, pattern, searchPath, options) {
549
724
  const after = lines.slice(idx0 + 1, idx0 + 1 + options.contextAfter);
550
725
  results.push({ path: filePath, line: ln, col, match: text, before, after });
551
726
  }
552
- const truncated = totalMatches > options.maxResults;
553
- const summary = totalMatches === 0
554
- ? 'No matches.'
555
- : truncated
556
- ? `Showing first ${options.maxResults} of ${totalMatches} matches (truncated=true).`
557
- : `Found ${totalMatches} matches.`;
558
- const yaml = [
559
- `status: ok`,
560
- `pattern: ${yamlQuote(pattern)}`,
561
- `mode: snippets`,
562
- `path: ${yamlQuote(searchPath)}`,
563
- ...(options.globs.length > 0 ? [`globs: ${yamlFlowStringArray(options.globs)}`] : []),
564
- `case: ${options.caseMode}`,
565
- `fixed_strings: ${options.fixedStrings}`,
566
- `regex: ${!options.fixedStrings}`,
567
- `truncated: ${truncated}`,
568
- `limits:`,
569
- ` max_results: ${options.maxResults}`,
570
- `totals:`,
571
- ` files_matched: ${fileSet.size}`,
572
- ` matches: ${totalMatches}`,
573
- `summary: ${yamlQuote(summary)}`,
574
- `results:`,
575
- ...results.map((r) => [
576
- ` - path: ${yamlQuote(r.path)}`,
577
- ` line: ${r.line}`,
578
- ` col: ${r.col}`,
579
- ` match: ${yamlQuote(r.match)}`,
580
- ` before: ${yamlFlowStringArray(r.before)}`,
581
- ` after: ${yamlFlowStringArray(r.after)}`,
582
- ].join('\n')),
583
- ].join('\n');
584
- return formatYamlCodeBlock(yaml);
727
+ return formatRipgrepSnippetYaml({
728
+ pattern,
729
+ searchPath,
730
+ globs: options.globs,
731
+ caseMode: options.caseMode,
732
+ fixedStrings: options.fixedStrings,
733
+ maxResults: options.maxResults,
734
+ fileCount: fileSet.size,
735
+ totalMatches,
736
+ results,
737
+ });
585
738
  }
586
739
  catch (error) {
587
740
  return formatYamlCodeBlock([
@@ -771,36 +924,17 @@ async function runRipgrepSearch(caller, pattern, searchPath, rawRgArgs) {
771
924
  if (results.length < options.maxResults)
772
925
  results.push({ path: filePath, line: ln, col, match: text });
773
926
  }
774
- const truncated = totalMatches > options.maxResults;
775
- const summary = totalMatches === 0
776
- ? 'No matches.'
777
- : truncated
778
- ? `Showing first ${options.maxResults} of ${totalMatches} matches (truncated=true).`
779
- : `Found ${totalMatches} matches.`;
780
- const yaml = [
781
- `status: ok`,
782
- `pattern: ${yamlQuote(pattern)}`,
783
- `mode: snippets`,
784
- `path: ${yamlQuote(searchPath)}`,
785
- `case: smart`,
786
- `fixed_strings: false`,
787
- `regex: true`,
788
- `truncated: ${truncated}`,
789
- `limits:`,
790
- ` max_results: ${options.maxResults}`,
791
- `totals:`,
792
- ` files_matched: ${fileSet.size}`,
793
- ` matches: ${totalMatches}`,
794
- `summary: ${yamlQuote(summary)}`,
795
- `results:`,
796
- ...results.map((r) => [
797
- ` - path: ${yamlQuote(r.path)}`,
798
- ` line: ${r.line}`,
799
- ` col: ${r.col}`,
800
- ` match: ${yamlQuote(r.match)}`,
801
- ].join('\n')),
802
- ].join('\n');
803
- return formatYamlCodeBlock(yaml);
927
+ return formatRipgrepSnippetYaml({
928
+ pattern,
929
+ searchPath,
930
+ globs: [],
931
+ caseMode: 'smart',
932
+ fixedStrings: false,
933
+ maxResults: options.maxResults,
934
+ fileCount: fileSet.size,
935
+ totalMatches,
936
+ results,
937
+ });
804
938
  }
805
939
  catch (error) {
806
940
  return formatYamlCodeBlock([
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dominds",
3
- "version": "1.4.2",
3
+ "version": "1.5.2",
4
4
  "description": "DevOps Mindsets — Sustainable Agentic Product Lifecycle",
5
5
  "type": "commonjs",
6
6
  "private": false,
@@ -53,7 +53,7 @@
53
53
  "pnpm": ">=10.30.3"
54
54
  },
55
55
  "dependencies": {
56
- "@longrun-ai/codex-auth": "^0.9.0",
56
+ "@longrun-ai/codex-auth": "^0.9.1",
57
57
  "@anthropic-ai/sdk": "^0.78.0",
58
58
  "openai": "^6.27.0",
59
59
  "@modelcontextprotocol/sdk": "^1.27.1",