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
@@ -52,7 +52,7 @@
52
52
  padding: 20px;
53
53
  }
54
54
  </style>
55
- <script type="module" crossorigin src="/assets/index-B-8J28g7.js"></script>
55
+ <script type="module" crossorigin src="/assets/index-DrTqAfFy.js"></script>
56
56
  <link rel="stylesheet" crossorigin href="/assets/index-CD5wtC_i.css">
57
57
  </head>
58
58
  <body>
package/dist/team.js CHANGED
@@ -14,6 +14,7 @@ exports.Team = void 0;
14
14
  */
15
15
  const promises_1 = __importDefault(require("fs/promises"));
16
16
  const yaml_1 = __importDefault(require("yaml"));
17
+ const enabled_apps_1 = require("./apps/enabled-apps");
17
18
  const teammates_1 = require("./apps/teammates");
18
19
  const client_1 = require("./llm/client");
19
20
  const log_1 = require("./log");
@@ -530,10 +531,26 @@ exports.Team = Team;
530
531
  async function validateMemberToolsetBindings(team, md) {
531
532
  const registeredToolsets = new Set(Object.keys((0, registry_1.listToolsets)()));
532
533
  const mcpDeclared = await readMcpDeclaredToolsets();
534
+ let enabledAppToolsets = new Set();
535
+ try {
536
+ const snapshot = await (0, enabled_apps_1.loadEnabledAppsSnapshot)({ rtwsRootAbs: process.cwd() });
537
+ enabledAppToolsets = new Set(snapshot.enabledApps.flatMap((app) => (app.installJson.contributes?.toolsets ?? []).map((toolset) => toolset.id)));
538
+ }
539
+ catch (err) {
540
+ addIssue('apps/toolsets/load', 'Failed to load enabled app toolsets while validating .minds/team.yaml toolset bindings.', err instanceof Error ? err.message : String(err));
541
+ }
533
542
  const validateAt = (args) => {
534
543
  for (const toolsetName of args.toolsets) {
535
- if (registeredToolsets.has(toolsetName))
544
+ const registeredMeta = (0, registry_1.getToolsetMeta)(toolsetName);
545
+ if (registeredToolsets.has(toolsetName)) {
546
+ if (registeredMeta?.source === 'app') {
547
+ continue;
548
+ }
549
+ continue;
550
+ }
551
+ if (enabledAppToolsets.has(toolsetName)) {
536
552
  continue;
553
+ }
537
554
  if (mcpDeclared.kind === 'loaded' && mcpDeclared.declaredServerIds.has(toolsetName)) {
538
555
  if (mcpDeclared.invalidServerIds.has(toolsetName)) {
539
556
  addIssue(`${args.idPrefix}/toolsets/${sanitizeProblemIdSegment(toolsetName)}/mcp_declared_invalid`, `Invalid .minds/team.yaml: ${args.atPrefix}.toolsets contains an MCP toolset whose server config is invalid.`, [
@@ -554,9 +571,10 @@ exports.Team = Team;
554
571
  continue;
555
572
  }
556
573
  addIssue(`${args.idPrefix}/toolsets/${sanitizeProblemIdSegment(toolsetName)}/missing`, `Invalid .minds/team.yaml: ${args.atPrefix}.toolsets contains an unknown toolset.`, [
557
- `Resolved ${args.atPrefix}.toolsets includes '${toolsetName}', but this toolset is neither registered nor declared in .minds/mcp.yaml.`,
558
- `Fix: change ${args.atPrefix}.toolsets to a valid toolset name, or declare MCP server '${toolsetName}' in .minds/mcp.yaml.`,
559
- `Tip: run team_mgmt_validate_mcp_cfg({}) to confirm MCP declarations are valid and loaded.`,
574
+ `Resolved ${args.atPrefix}.toolsets includes '${toolsetName}', but this toolset is not currently registered in runtime registry and is not declared in .minds/mcp.yaml.`,
575
+ `If '${toolsetName}' is expected from an enabled app, confirm the app is installed/enabled in this rtws and that its contributes.toolsets were loaded successfully.`,
576
+ `Otherwise, fix ${args.atPrefix}.toolsets to a valid built-in/app toolset name, or declare MCP server '${toolsetName}' in .minds/mcp.yaml.`,
577
+ `Tip: run team_mgmt_validate_mcp_cfg({}) for MCP checks, and inspect / refresh enabled apps if this toolset should come from an app.`,
560
578
  ].join('\n'));
561
579
  }
562
580
  };
@@ -871,6 +889,7 @@ exports.Team = Team;
871
889
  Team.TEAM_YAML_MODEL_PARAMS_OPENAI_KEYS = [
872
890
  'temperature',
873
891
  'max_tokens',
892
+ 'service_tier',
874
893
  'top_p',
875
894
  'frequency_penalty',
876
895
  'presence_penalty',
@@ -942,6 +961,7 @@ exports.Team = Team;
942
961
  verbosity: `Did you mean \`${modelParamsAt}.codex.verbosity\` (preferred for provider: codex) or \`${modelParamsAt}.openai.verbosity\`?`,
943
962
  parallel_tool_calls: `Did you mean \`${modelParamsAt}.codex.parallel_tool_calls\` (preferred for provider: codex) or \`${modelParamsAt}.openai.parallel_tool_calls\`?`,
944
963
  web_search: `Did you mean \`${modelParamsAt}.codex.web_search\` (preferred for provider: codex) or \`${modelParamsAt}.openai.web_search\`?`,
964
+ service_tier: `Did you mean \`${modelParamsAt}.codex.service_tier\` (preferred for provider: codex) or \`${modelParamsAt}.openai.service_tier\`?`,
945
965
  temperature: `Did you mean \`${modelParamsAt}.codex.temperature\` / \`${modelParamsAt}.openai.temperature\` (or \`${modelParamsAt}.anthropic.temperature\`)?`,
946
966
  top_p: `Did you mean \`${modelParamsAt}.codex.top_p\` / \`${modelParamsAt}.openai.top_p\` (or \`${modelParamsAt}.anthropic.top_p\`)?`,
947
967
  max_tokens: `Did you mean \`${modelParamsAt}.max_tokens\` / \`${modelParamsAt}.general.max_tokens\` (provider-agnostic), or \`${modelParamsAt}.codex.max_tokens\` / \`${modelParamsAt}.openai.max_tokens\` / \`${modelParamsAt}.anthropic.max_tokens\`?`,
@@ -1606,6 +1626,15 @@ exports.Team = Team;
1606
1626
  asOptionalString(params.user, `${at2}.user`);
1607
1627
  asOptionalBoolean(params.parallel_tool_calls, `${at2}.parallel_tool_calls`);
1608
1628
  asOptionalBoolean(params.json_response, `${at2}.json_response`);
1629
+ const serviceTier = params.service_tier;
1630
+ if (serviceTier !== undefined &&
1631
+ serviceTier !== 'auto' &&
1632
+ serviceTier !== 'default' &&
1633
+ serviceTier !== 'flex' &&
1634
+ serviceTier !== 'scale' &&
1635
+ serviceTier !== 'priority') {
1636
+ throw new Error(`Invalid ${at2}.service_tier: expected auto|default|flex|scale|priority (got ${describeValueType(serviceTier)})`);
1637
+ }
1609
1638
  const reasoningEffort = params.reasoning_effort;
1610
1639
  if (reasoningEffort !== undefined &&
1611
1640
  reasoningEffort !== 'none' &&
@@ -0,0 +1,280 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildAppReminderOwnerRegistryName = buildAppReminderOwnerRegistryName;
4
+ exports.ensureAppReminderOwnersRegistered = ensureAppReminderOwnersRegistered;
5
+ exports.unregisterAppReminderOwnersForApps = unregisterAppReminderOwnersForApps;
6
+ exports.applyAppReminderRequests = applyAppReminderRequests;
7
+ const evt_registry_1 = require("../evt-registry");
8
+ const driver_messages_1 = require("../shared/i18n/driver-messages");
9
+ const runtime_language_1 = require("../shared/runtime-language");
10
+ const tool_1 = require("../tool");
11
+ const registry_1 = require("./registry");
12
+ const APP_REMINDER_META_KEYS = new Set([
13
+ 'kind',
14
+ 'appId',
15
+ 'ownerRef',
16
+ 'managedByTool',
17
+ 'source',
18
+ 'updateExample',
19
+ 'ownerMeta',
20
+ ]);
21
+ const appReminderDescriptors = new Map();
22
+ function isRecord(value) {
23
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
24
+ }
25
+ function isJsonRecord(value) {
26
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
27
+ }
28
+ function isAppReminderMeta(value) {
29
+ if (!isRecord(value))
30
+ return false;
31
+ if (value['kind'] !== 'app_reminder_owner')
32
+ return false;
33
+ if (typeof value['appId'] !== 'string' || value['appId'].trim() === '')
34
+ return false;
35
+ if (typeof value['ownerRef'] !== 'string' || value['ownerRef'].trim() === '')
36
+ return false;
37
+ if (typeof value['managedByTool'] !== 'string' || value['managedByTool'].trim() === '')
38
+ return false;
39
+ if (typeof value['source'] !== 'string' || value['source'].trim() === '')
40
+ return false;
41
+ if (typeof value['updateExample'] !== 'string' || value['updateExample'].trim() === '')
42
+ return false;
43
+ return true;
44
+ }
45
+ function normalizeInsertPosition(remindersLength, position) {
46
+ if (position === undefined)
47
+ return remindersLength;
48
+ if (!Number.isFinite(position))
49
+ return remindersLength;
50
+ const normalized = Math.floor(position);
51
+ if (normalized <= 0)
52
+ return 0;
53
+ if (normalized >= remindersLength)
54
+ return remindersLength;
55
+ return normalized;
56
+ }
57
+ function toManagedByTool(owner) {
58
+ const managedByTool = owner.managedByTool?.trim();
59
+ if (managedByTool && managedByTool.length > 0)
60
+ return managedByTool;
61
+ return owner.ref;
62
+ }
63
+ function toUpdateExample(owner) {
64
+ const updateExample = owner.updateExample?.trim();
65
+ if (updateExample && updateExample.length > 0)
66
+ return updateExample;
67
+ return `${toManagedByTool(owner)}({ ... })`;
68
+ }
69
+ function buildDescriptor(params) {
70
+ return {
71
+ appId: params.appId,
72
+ ownerRef: params.owner.ref,
73
+ registryName: buildAppReminderOwnerRegistryName(params.appId, params.owner.ref),
74
+ managedByTool: toManagedByTool(params.owner),
75
+ source: toManagedByTool(params.owner),
76
+ updateExample: toUpdateExample(params.owner),
77
+ };
78
+ }
79
+ function buildAppReminderMeta(descriptor, ownerMeta) {
80
+ const baseMeta = {
81
+ kind: 'app_reminder_owner',
82
+ appId: descriptor.appId,
83
+ ownerRef: descriptor.ownerRef,
84
+ managedByTool: descriptor.managedByTool,
85
+ source: descriptor.source,
86
+ updateExample: descriptor.updateExample,
87
+ };
88
+ if (isJsonRecord(ownerMeta)) {
89
+ return { ...ownerMeta, ...baseMeta };
90
+ }
91
+ if (ownerMeta !== undefined) {
92
+ return { ...baseMeta, ownerMeta };
93
+ }
94
+ return baseMeta;
95
+ }
96
+ function extractOwnerMeta(meta) {
97
+ if (!isJsonRecord(meta)) {
98
+ return undefined;
99
+ }
100
+ const payloadEntries = Object.entries(meta).filter(([key]) => !APP_REMINDER_META_KEYS.has(key));
101
+ if (payloadEntries.length > 0) {
102
+ return Object.fromEntries(payloadEntries);
103
+ }
104
+ return meta['ownerMeta'];
105
+ }
106
+ function toReminderState(reminder) {
107
+ return {
108
+ content: reminder.content,
109
+ meta: extractOwnerMeta(reminder.meta),
110
+ echoback: reminder.echoback,
111
+ };
112
+ }
113
+ function findOwnedReminderEntries(dlg, descriptor, owner) {
114
+ const entries = [];
115
+ for (let index = 0; index < dlg.reminders.length; index += 1) {
116
+ const reminder = dlg.reminders[index];
117
+ if (!reminder || reminder.owner !== owner || !isAppReminderMeta(reminder.meta)) {
118
+ continue;
119
+ }
120
+ if (reminder.meta.appId !== descriptor.appId ||
121
+ reminder.meta.ownerRef !== descriptor.ownerRef) {
122
+ continue;
123
+ }
124
+ entries.push({ index, reminder });
125
+ }
126
+ return entries;
127
+ }
128
+ function fallbackRenderedReminder(reminder, reminderNo) {
129
+ const language = (0, runtime_language_1.getWorkLanguage)();
130
+ return {
131
+ type: 'transient_guide_msg',
132
+ role: 'assistant',
133
+ content: (0, driver_messages_1.formatReminderItemGuide)(language, reminderNo, reminder.content, {
134
+ meta: reminder.meta,
135
+ }),
136
+ };
137
+ }
138
+ async function persistAndPublishReminders(dlg) {
139
+ await dlg.dlgStore.persistReminders(dlg, dlg.reminders);
140
+ const reminderNoByIndex = (0, tool_1.computeReminderNoByIndex)(dlg.reminders);
141
+ const reminders = dlg.reminders.map((reminder, index) => ({
142
+ content: reminder.content,
143
+ meta: isRecord(reminder.meta) ? reminder.meta : undefined,
144
+ reminder_no: reminderNoByIndex.get(index),
145
+ echoback: (0, tool_1.reminderEchoBackEnabled)(reminder),
146
+ }));
147
+ const evt = { type: 'full_reminders_update', reminders };
148
+ (0, evt_registry_1.postDialogEvent)(dlg, evt);
149
+ }
150
+ function createAppReminderOwner(params) {
151
+ const { descriptor, resolveHostClient } = params;
152
+ const owner = {
153
+ name: descriptor.registryName,
154
+ async updateReminder(dlg, reminder) {
155
+ if (reminder.owner !== owner || !isAppReminderMeta(reminder.meta)) {
156
+ return { treatment: 'keep' };
157
+ }
158
+ try {
159
+ const client = resolveHostClient();
160
+ const result = await client.updateReminder(descriptor.appId, descriptor.ownerRef, {
161
+ dialogId: dlg.id.selfId,
162
+ reminder: toReminderState(reminder),
163
+ });
164
+ if (result.treatment !== 'update') {
165
+ return result;
166
+ }
167
+ return {
168
+ treatment: 'update',
169
+ updatedContent: result.updatedContent ?? reminder.content,
170
+ updatedMeta: result.updatedMeta !== undefined
171
+ ? buildAppReminderMeta(descriptor, result.updatedMeta)
172
+ : reminder.meta,
173
+ };
174
+ }
175
+ catch {
176
+ return { treatment: 'keep' };
177
+ }
178
+ },
179
+ async renderReminder(dlg, reminder, index) {
180
+ if (reminder.owner !== owner || !isAppReminderMeta(reminder.meta)) {
181
+ return fallbackRenderedReminder(reminder, index + 1);
182
+ }
183
+ try {
184
+ const client = resolveHostClient();
185
+ return await client.renderReminder(descriptor.appId, descriptor.ownerRef, {
186
+ dialogId: dlg.id.selfId,
187
+ reminder: toReminderState(reminder),
188
+ reminderNo: index + 1,
189
+ workLanguage: (0, runtime_language_1.getWorkLanguage)(),
190
+ });
191
+ }
192
+ catch {
193
+ return fallbackRenderedReminder(reminder, index + 1);
194
+ }
195
+ },
196
+ };
197
+ return owner;
198
+ }
199
+ function buildAppReminderOwnerRegistryName(appId, ownerRef) {
200
+ return `app/${appId}/${ownerRef}`;
201
+ }
202
+ function ensureAppReminderOwnersRegistered(params) {
203
+ for (const app of params.enabledApps) {
204
+ const reminderOwners = app.installJson.contributes?.reminderOwners ?? [];
205
+ const seenOwnerRefs = new Set();
206
+ for (const owner of reminderOwners) {
207
+ if (seenOwnerRefs.has(owner.ref)) {
208
+ throw new Error(`App '${app.appId}' declares duplicate reminder owner ref '${owner.ref}'`);
209
+ }
210
+ seenOwnerRefs.add(owner.ref);
211
+ const descriptor = buildDescriptor({ appId: app.appId, owner });
212
+ appReminderDescriptors.set(descriptor.registryName, descriptor);
213
+ if ((0, registry_1.getReminderOwner)(descriptor.registryName)) {
214
+ continue;
215
+ }
216
+ (0, registry_1.registerReminderOwner)(createAppReminderOwner({ descriptor, resolveHostClient: params.resolveHostClient }));
217
+ }
218
+ }
219
+ }
220
+ function unregisterAppReminderOwnersForApps(params) {
221
+ const appIdSet = new Set(params.appIds);
222
+ for (const [registryName, descriptor] of appReminderDescriptors.entries()) {
223
+ if (!appIdSet.has(descriptor.appId)) {
224
+ continue;
225
+ }
226
+ (0, registry_1.unregisterReminderOwner)(registryName);
227
+ appReminderDescriptors.delete(registryName);
228
+ }
229
+ }
230
+ async function applyAppReminderRequests(dlg, params) {
231
+ const client = params.resolveHostClient();
232
+ let changed = false;
233
+ for (const request of params.reminderRequests) {
234
+ const registryName = buildAppReminderOwnerRegistryName(params.appId, request.ownerRef);
235
+ const descriptor = appReminderDescriptors.get(registryName);
236
+ const owner = (0, registry_1.getReminderOwner)(registryName);
237
+ if (!descriptor || !owner) {
238
+ throw new Error(`App '${params.appId}' attempted to use unregistered reminder owner '${request.ownerRef}'`);
239
+ }
240
+ const ownedEntries = findOwnedReminderEntries(dlg, descriptor, owner);
241
+ const result = await client.applyReminder(params.appId, request.ownerRef, request, {
242
+ dialogId: dlg.id.selfId,
243
+ ownedReminders: ownedEntries.map((entry) => toReminderState(entry.reminder)),
244
+ });
245
+ switch (result.treatment) {
246
+ case 'noop':
247
+ break;
248
+ case 'add': {
249
+ dlg.addReminder(result.reminder.content, owner, buildAppReminderMeta(descriptor, result.reminder.meta), normalizeInsertPosition(dlg.reminders.length, result.position), { echoback: result.reminder.echoback });
250
+ changed = true;
251
+ break;
252
+ }
253
+ case 'update': {
254
+ const target = ownedEntries[result.ownedIndex];
255
+ if (!target) {
256
+ throw new Error(`App '${params.appId}' reminder owner '${request.ownerRef}' returned invalid ownedIndex=${result.ownedIndex}`);
257
+ }
258
+ dlg.updateReminder(target.index, result.reminder.content, buildAppReminderMeta(descriptor, result.reminder.meta), { echoback: result.reminder.echoback });
259
+ changed = true;
260
+ break;
261
+ }
262
+ case 'delete': {
263
+ const target = ownedEntries[result.ownedIndex];
264
+ if (!target) {
265
+ throw new Error(`App '${params.appId}' reminder owner '${request.ownerRef}' returned invalid ownedIndex=${result.ownedIndex}`);
266
+ }
267
+ dlg.deleteReminder(target.index);
268
+ changed = true;
269
+ break;
270
+ }
271
+ default: {
272
+ const _exhaustive = result;
273
+ throw new Error(`Unsupported app reminder apply result: ${String(_exhaustive)}`);
274
+ }
275
+ }
276
+ }
277
+ if (changed) {
278
+ await persistAndPublishReminders(dlg);
279
+ }
280
+ }
@@ -0,0 +1,155 @@
1
+ # memory Error Handling
2
+
3
+ ## Template (Errors)
4
+
5
+ ### Error Chain (required)
6
+
7
+ 1. Trigger Condition
8
+ 2. Detection Signal
9
+ 3. Recovery Steps
10
+ 4. Success Criteria
11
+ 5. Escalation Path (optional)
12
+
13
+ ## Error Codes
14
+
15
+ ### MEMORY_ALREADY_EXISTS
16
+
17
+ **Description:** Path already exists, cannot use `add_memory` to create new memory.
18
+
19
+ **Cause:**
20
+
21
+ - The path you're trying to add is already occupied by another memory
22
+
23
+ **Solution:**
24
+
25
+ - Use `replace_memory` to update existing memory
26
+ - Or use a different path to create new memory
27
+
28
+ **Example:**
29
+
30
+ ```
31
+ Error:
32
+ status: error
33
+ error_code: MEMORY_ALREADY_EXISTS
34
+ message: Path "project/todo" already exists, please use replace_memory to update
35
+ ```
36
+
37
+ ### MEMORY_NOT_FOUND
38
+
39
+ **Description:** Path does not exist, cannot perform operation.
40
+
41
+ **Cause:**
42
+
43
+ - The memory path you're trying to access doesn't exist
44
+ - The path was deleted or never created
45
+
46
+ **Solution:**
47
+
48
+ - For update/delete operations, first use `add_memory` to create
49
+ - Check if the path is correct
50
+
51
+ **Example:**
52
+
53
+ ```
54
+ Error:
55
+ status: error
56
+ error_code: MEMORY_NOT_FOUND
57
+ message: Path "project/todo" does not exist, please use add_memory to create first
58
+ ```
59
+
60
+ ### MEMORY_PATH_INVALID
61
+
62
+ **Description:** Path format is invalid.
63
+
64
+ **Cause:**
65
+
66
+ - Path contains illegal characters
67
+ - Path length exceeds limit
68
+
69
+ **Solution:**
70
+
71
+ - Ensure path only contains letters, numbers, underscores, slashes
72
+ - Path length should not exceed 255 characters
73
+
74
+ **Example:**
75
+
76
+ ```
77
+ Error:
78
+ status: error
79
+ error_code: MEMORY_PATH_INVALID
80
+ message: Path "project/*invalid*" contains illegal characters
81
+ ```
82
+
83
+ ### MEMORY_CONTENT_TOO_LARGE
84
+
85
+ **Description:** Memory content is too large.
86
+
87
+ **Cause:**
88
+
89
+ - Single memory content exceeds 1MB limit
90
+
91
+ **Solution:**
92
+
93
+ - Compress content
94
+ - Split into multiple memories
95
+ - Use external storage (e.g., files)
96
+
97
+ **Example:**
98
+
99
+ ```
100
+ Error:
101
+ status: error
102
+ error_code: MEMORY_CONTENT_TOO_LARGE
103
+ message: Content size 1.2MB exceeds 1MB limit
104
+ ```
105
+
106
+ ### MEMORY_STORAGE_ERROR
107
+
108
+ **Description:** Storage error.
109
+
110
+ **Cause:**
111
+
112
+ - Insufficient disk space
113
+ - Permission issues
114
+ - File system error
115
+
116
+ **Solution:**
117
+
118
+ - Check disk space
119
+ - Check file permissions
120
+ - Retry operation
121
+
122
+ **Example:**
123
+
124
+ ```
125
+ Error:
126
+ status: error
127
+ error_code: MEMORY_STORAGE_ERROR
128
+ message: Cannot write to storage, insufficient disk space
129
+ ```
130
+
131
+ ## Frequently Asked Questions
132
+
133
+ ### Q: Does memory auto-save?
134
+
135
+ A: Yes, all memory operations are immediately persisted to disk. No manual save is needed.
136
+
137
+ ### Q: Is there a limit on the number of memories?
138
+
139
+ A: There's no strict limit, but it's recommended to keep the number of memories reasonable (less than 100 recommended).
140
+
141
+ ### Q: Can other members see my memories?
142
+
143
+ A: No, memory is a personal memory tool, only the current agent can access it. If you need to share with team members, please use team_memory.
144
+
145
+ ### Q: Will clear_memory delete all memories?
146
+
147
+ A: Yes, `clear_memory` will delete all personal memories, this operation is irreversible. Please use with caution.
148
+
149
+ ### Q: Do memories expire?
150
+
151
+ A: No, memories are permanently saved until explicitly deleted.
152
+
153
+ ### Q: How do I view all current memories?
154
+
155
+ A: The agent can access all personal memories during response generation. You can directly ask the agent what memories it currently has.
@@ -0,0 +1,47 @@
1
+ # memory Personal Memory Tools Manual
2
+
3
+ ## Template (Index)
4
+
5
+ ### One-line Positioning
6
+
7
+ - <What this toolset is for, in one sentence>
8
+
9
+ ### Tool List
10
+
11
+ - <Enumerate core tools or point to Tools/Schema section>
12
+
13
+ ### 30-Second Quickstart
14
+
15
+ 1. <call ...>
16
+ 2. <observe ...>
17
+ 3. <next step ...>
18
+
19
+ ### Navigation
20
+
21
+ - principles / tools / scenarios / errors
22
+
23
+ ### Boundaries vs Other Toolsets
24
+
25
+ - <When to use this vs a sibling toolset>
26
+
27
+ memory is Dominds' **personal memory toolset** for managing an agent's private memory:
28
+
29
+ - **Privacy**: Memory is only visible to the current agent, not shared with other members
30
+ - **Persistence**: Memory is persisted to disk and retained after conversation restarts
31
+ - **Structured**: Supports organizing memory by path for easy categorization and retrieval
32
+
33
+ ## Quick Navigation
34
+
35
+ | Topic | Description |
36
+ | ----------------------------- | ----------------------------------------------- |
37
+ | [principles](./principles.md) | Core concepts, memory lifecycle, best practices |
38
+ | [tools](./tools.md) | Complete tool list and interface contracts |
39
+ | [scenarios](./scenarios.md) | Common usage scenarios (copy-paste ready) |
40
+ | [errors](./errors.md) | Error codes and solutions |
41
+
42
+ ## Status
43
+
44
+ - Status: Implemented
45
+ - Main implementation files:
46
+ - Tool implementation: `dominds/main/tools/mem.ts`
47
+ - Toolset metadata: `dominds/main/tools/builtins.ts`, `dominds/main/tools/registry.ts`
@@ -0,0 +1,79 @@
1
+ # memory Principles and Core Concepts
2
+
3
+ ## Template (Principles)
4
+
5
+ ### Design Goals
6
+
7
+ - <Goal 1>
8
+ - <Goal 2>
9
+
10
+ ### Contract Principles
11
+
12
+ - <Input/Output contract rules>
13
+
14
+ ### Safety & Boundaries
15
+
16
+ - <Access constraints / guardrails>
17
+
18
+ ### Failure & Recovery
19
+
20
+ - <What to do when a call fails>
21
+
22
+ ### Glossary
23
+
24
+ - <Toolset-specific terms>
25
+
26
+ ## Memory Model
27
+
28
+ The memory toolset uses a **path key-value storage** model:
29
+
30
+ - **Path**: Unique identifier for the memory, similar to a file system path, e.g., `project/todo` or `user/preferences/theme`
31
+ - **Content**: Actual content of the memory, can be arbitrary text
32
+
33
+ ## Tool Overview
34
+
35
+ | Tool | Function |
36
+ | -------------- | -------------------------------------------- |
37
+ | add_memory | Create new memory (when path does not exist) |
38
+ | replace_memory | Update existing memory (when path exists) |
39
+ | drop_memory | Delete memory |
40
+ | clear_memory | Clear all personal memory (irrecoverable) |
41
+
42
+ ## Memory Lifecycle
43
+
44
+ 1. **Create (add)**: Use `add_memory` to create new memory
45
+ 2. **Read**: Agent can read existing memory during response generation
46
+ 3. **Update (replace)**: Use `replace_memory` to update memory content
47
+ 4. **Delete (drop)**: Use `drop_memory` to delete specific memory
48
+
49
+ ## Best Practices
50
+
51
+ ### 1. Path Naming Conventions
52
+
53
+ - Use descriptive paths: `project/architecture`, `user/preferences/language`
54
+ - Avoid special characters: Do not include `/`, `\`, `*`, etc. in paths
55
+ - Use hierarchical structure: Organize memory by topic, e.g., `project/todo`, `project/done`
56
+
57
+ ### 2. Content Format
58
+
59
+ - Keep content concise: Each memory should cover only one topic
60
+ - Use structured format: Can use Markdown format to organize content
61
+ - Regular cleanup: Periodically check and delete outdated memories
62
+
63
+ ### 3. Usage Scenarios
64
+
65
+ - **Task persistence**: Save long-term task progress
66
+ - **Context memory**: Save important information from conversation context
67
+ - **Preference settings**: Save user preferences and configuration information
68
+
69
+ ## Relationship with Other Tools
70
+
71
+ - **team_memory**: Team shared memory, visible to all members
72
+ - **reminder**: Temporary reminder, session-level
73
+ - **change_mind**: Update taskdoc (goals/constraints/progress)
74
+
75
+ ## Limitations and Notes
76
+
77
+ 1. Memory content has size limit (max 1MB per memory)
78
+ 2. Memory path cannot exceed 255 characters
79
+ 3. `clear_memory` will delete all memory, **irrecoverable**