dominds 1.8.2 → 1.8.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/dist/apps/run-control.js +21 -4
  2. package/dist/apps/runtime.js +66 -24
  3. package/dist/dialog.js +23 -1
  4. package/dist/docs/app-constitution.md +3 -1
  5. package/dist/docs/app-constitution.zh.md +3 -1
  6. package/dist/docs/dialog-system.zh.md +5 -5
  7. package/dist/llm/kernel-driver/context.js +2 -31
  8. package/dist/llm/kernel-driver/drive.js +6 -8
  9. package/dist/llm/kernel-driver/subdialog.js +8 -0
  10. package/dist/minds/system-prompt.js +2 -2
  11. package/dist/priming.js +4 -0
  12. package/dist/server/websocket-handler.js +16 -0
  13. package/dist/server.js +7 -2
  14. package/dist/shared/diligence.js +2 -2
  15. package/dist/shared/i18n/driver-messages.js +47 -7
  16. package/dist/static/assets/{_basePickBy-DOCpneO0.js → _basePickBy-b79Z8z7v.js} +3 -3
  17. package/dist/static/assets/{_basePickBy-DOCpneO0.js.map → _basePickBy-b79Z8z7v.js.map} +1 -1
  18. package/dist/static/assets/{_baseUniq-DBZLqTK1.js → _baseUniq-EKRe-CHy.js} +2 -2
  19. package/dist/static/assets/{_baseUniq-DBZLqTK1.js.map → _baseUniq-EKRe-CHy.js.map} +1 -1
  20. package/dist/static/assets/{arc-Dw9YkyBZ.js → arc-CBReIrdk.js} +2 -2
  21. package/dist/static/assets/{arc-Dw9YkyBZ.js.map → arc-CBReIrdk.js.map} +1 -1
  22. package/dist/static/assets/{architectureDiagram-VXUJARFQ-DiXBIlTy.js → architectureDiagram-VXUJARFQ-arl_gJGi.js} +7 -7
  23. package/dist/static/assets/{architectureDiagram-VXUJARFQ-DiXBIlTy.js.map → architectureDiagram-VXUJARFQ-arl_gJGi.js.map} +1 -1
  24. package/dist/static/assets/{blockDiagram-VD42YOAC-CBTqG3TT.js → blockDiagram-VD42YOAC-BvLkPr7Y.js} +7 -7
  25. package/dist/static/assets/{blockDiagram-VD42YOAC-CBTqG3TT.js.map → blockDiagram-VD42YOAC-BvLkPr7Y.js.map} +1 -1
  26. package/dist/static/assets/{c4Diagram-YG6GDRKO-CKltdqcg.js → c4Diagram-YG6GDRKO-DLQB9QIV.js} +3 -3
  27. package/dist/static/assets/{c4Diagram-YG6GDRKO-CKltdqcg.js.map → c4Diagram-YG6GDRKO-DLQB9QIV.js.map} +1 -1
  28. package/dist/static/assets/{channel-CsfA5ddv.js → channel-C-1aKDRA.js} +2 -2
  29. package/dist/static/assets/{channel-CsfA5ddv.js.map → channel-C-1aKDRA.js.map} +1 -1
  30. package/dist/static/assets/{chunk-4BX2VUAB-BCdL9ibi.js → chunk-4BX2VUAB-guy7Bw0c.js} +2 -2
  31. package/dist/static/assets/{chunk-4BX2VUAB-BCdL9ibi.js.map → chunk-4BX2VUAB-guy7Bw0c.js.map} +1 -1
  32. package/dist/static/assets/{chunk-55IACEB6-CcKnxlqS.js → chunk-55IACEB6-CPekYUDl.js} +2 -2
  33. package/dist/static/assets/{chunk-55IACEB6-CcKnxlqS.js.map → chunk-55IACEB6-CPekYUDl.js.map} +1 -1
  34. package/dist/static/assets/{chunk-B4BG7PRW-BnypOYYo.js → chunk-B4BG7PRW-C7_VGVGd.js} +5 -5
  35. package/dist/static/assets/{chunk-B4BG7PRW-BnypOYYo.js.map → chunk-B4BG7PRW-C7_VGVGd.js.map} +1 -1
  36. package/dist/static/assets/{chunk-DI55MBZ5-BGYHpvhR.js → chunk-DI55MBZ5-B7Z_kPEp.js} +4 -4
  37. package/dist/static/assets/{chunk-DI55MBZ5-BGYHpvhR.js.map → chunk-DI55MBZ5-B7Z_kPEp.js.map} +1 -1
  38. package/dist/static/assets/{chunk-FMBD7UC4-Crf0Br1R.js → chunk-FMBD7UC4-CNyLnVLQ.js} +2 -2
  39. package/dist/static/assets/{chunk-FMBD7UC4-Crf0Br1R.js.map → chunk-FMBD7UC4-CNyLnVLQ.js.map} +1 -1
  40. package/dist/static/assets/{chunk-QN33PNHL-Cg1EQYdQ.js → chunk-QN33PNHL-De0KQ1wi.js} +2 -2
  41. package/dist/static/assets/{chunk-QN33PNHL-Cg1EQYdQ.js.map → chunk-QN33PNHL-De0KQ1wi.js.map} +1 -1
  42. package/dist/static/assets/{chunk-QZHKN3VN-DRH7UNkC.js → chunk-QZHKN3VN-DsfWQPDD.js} +2 -2
  43. package/dist/static/assets/{chunk-QZHKN3VN-DRH7UNkC.js.map → chunk-QZHKN3VN-DsfWQPDD.js.map} +1 -1
  44. package/dist/static/assets/{chunk-TZMSLE5B-CaZqBdnu.js → chunk-TZMSLE5B-BGHvMn1A.js} +2 -2
  45. package/dist/static/assets/{chunk-TZMSLE5B-CaZqBdnu.js.map → chunk-TZMSLE5B-BGHvMn1A.js.map} +1 -1
  46. package/dist/static/assets/{classDiagram-2ON5EDUG-DSsG0iFI.js → classDiagram-2ON5EDUG-JmOuUZWB.js} +6 -6
  47. package/dist/static/assets/{classDiagram-2ON5EDUG-DSsG0iFI.js.map → classDiagram-2ON5EDUG-JmOuUZWB.js.map} +1 -1
  48. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-DSsG0iFI.js → classDiagram-v2-WZHVMYZB-JmOuUZWB.js} +6 -6
  49. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-DSsG0iFI.js.map → classDiagram-v2-WZHVMYZB-JmOuUZWB.js.map} +1 -1
  50. package/dist/static/assets/{clone-xhbAL4G8.js → clone-bFKUwLh9.js} +2 -2
  51. package/dist/static/assets/{clone-xhbAL4G8.js.map → clone-bFKUwLh9.js.map} +1 -1
  52. package/dist/static/assets/{cose-bilkent-S5V4N54A-B7Rtmhjt.js → cose-bilkent-S5V4N54A-B-TrWbLI.js} +2 -2
  53. package/dist/static/assets/{cose-bilkent-S5V4N54A-B7Rtmhjt.js.map → cose-bilkent-S5V4N54A-B-TrWbLI.js.map} +1 -1
  54. package/dist/static/assets/{dagre-6UL2VRFP-BkqhLTnX.js → dagre-6UL2VRFP-eFdBPojd.js} +7 -7
  55. package/dist/static/assets/{dagre-6UL2VRFP-BkqhLTnX.js.map → dagre-6UL2VRFP-eFdBPojd.js.map} +1 -1
  56. package/dist/static/assets/{diagram-PSM6KHXK-CZKtGq3a.js → diagram-PSM6KHXK-CG-pEDnm.js} +8 -8
  57. package/dist/static/assets/{diagram-PSM6KHXK-CZKtGq3a.js.map → diagram-PSM6KHXK-CG-pEDnm.js.map} +1 -1
  58. package/dist/static/assets/{diagram-QEK2KX5R-CnMVuAHl.js → diagram-QEK2KX5R-DIMTH7OH.js} +7 -7
  59. package/dist/static/assets/{diagram-QEK2KX5R-CnMVuAHl.js.map → diagram-QEK2KX5R-DIMTH7OH.js.map} +1 -1
  60. package/dist/static/assets/{diagram-S2PKOQOG-CeSf7JXc.js → diagram-S2PKOQOG-CtsocJ3s.js} +7 -7
  61. package/dist/static/assets/{diagram-S2PKOQOG-CeSf7JXc.js.map → diagram-S2PKOQOG-CtsocJ3s.js.map} +1 -1
  62. package/dist/static/assets/{erDiagram-Q2GNP2WA-CSt8_Jg8.js → erDiagram-Q2GNP2WA-DE2fcc5h.js} +5 -5
  63. package/dist/static/assets/{erDiagram-Q2GNP2WA-CSt8_Jg8.js.map → erDiagram-Q2GNP2WA-DE2fcc5h.js.map} +1 -1
  64. package/dist/static/assets/{flowDiagram-NV44I4VS-D5Ml-CXN.js → flowDiagram-NV44I4VS-CRmxnCqy.js} +6 -6
  65. package/dist/static/assets/{flowDiagram-NV44I4VS-D5Ml-CXN.js.map → flowDiagram-NV44I4VS-CRmxnCqy.js.map} +1 -1
  66. package/dist/static/assets/{ganttDiagram-JELNMOA3-CyMWbWsa.js → ganttDiagram-JELNMOA3-MIOIERui.js} +3 -3
  67. package/dist/static/assets/{ganttDiagram-JELNMOA3-CyMWbWsa.js.map → ganttDiagram-JELNMOA3-MIOIERui.js.map} +1 -1
  68. package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-vl516Is8.js → gitGraphDiagram-V2S2FVAM-crIYDBIk.js} +8 -8
  69. package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-vl516Is8.js.map → gitGraphDiagram-V2S2FVAM-crIYDBIk.js.map} +1 -1
  70. package/dist/static/assets/{graph-BGZ_sL_x.js → graph-CB0VmlGP.js} +3 -3
  71. package/dist/static/assets/{graph-BGZ_sL_x.js.map → graph-CB0VmlGP.js.map} +1 -1
  72. package/dist/static/assets/{index-C-RsyM0K.js → index-CzBEs1w4.js} +53 -35
  73. package/dist/static/assets/{index-C-RsyM0K.js.map → index-CzBEs1w4.js.map} +1 -1
  74. package/dist/static/assets/{infoDiagram-HS3SLOUP-6wx0LbHY.js → infoDiagram-HS3SLOUP-CnsCAuJf.js} +6 -6
  75. package/dist/static/assets/{infoDiagram-HS3SLOUP-6wx0LbHY.js.map → infoDiagram-HS3SLOUP-CnsCAuJf.js.map} +1 -1
  76. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-YPjC-r77.js → journeyDiagram-XKPGCS4Q-BtzLS-NC.js} +5 -5
  77. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-YPjC-r77.js.map → journeyDiagram-XKPGCS4Q-BtzLS-NC.js.map} +1 -1
  78. package/dist/static/assets/{kanban-definition-3W4ZIXB7-DlG-ZWTO.js → kanban-definition-3W4ZIXB7-CwykQ3vY.js} +3 -3
  79. package/dist/static/assets/{kanban-definition-3W4ZIXB7-DlG-ZWTO.js.map → kanban-definition-3W4ZIXB7-CwykQ3vY.js.map} +1 -1
  80. package/dist/static/assets/{layout-BZJKhYY3.js → layout-Cu6uuh5P.js} +5 -5
  81. package/dist/static/assets/{layout-BZJKhYY3.js.map → layout-Cu6uuh5P.js.map} +1 -1
  82. package/dist/static/assets/{linear-Bau37zh5.js → linear-BXsc4B31.js} +2 -2
  83. package/dist/static/assets/{linear-Bau37zh5.js.map → linear-BXsc4B31.js.map} +1 -1
  84. package/dist/static/assets/{mindmap-definition-VGOIOE7T-n2WXgX4b.js → mindmap-definition-VGOIOE7T-BtD61cN8.js} +4 -4
  85. package/dist/static/assets/{mindmap-definition-VGOIOE7T-n2WXgX4b.js.map → mindmap-definition-VGOIOE7T-BtD61cN8.js.map} +1 -1
  86. package/dist/static/assets/{pieDiagram-ADFJNKIX-DgW7FkI4.js → pieDiagram-ADFJNKIX-B2EbMDmb.js} +8 -8
  87. package/dist/static/assets/{pieDiagram-ADFJNKIX-DgW7FkI4.js.map → pieDiagram-ADFJNKIX-B2EbMDmb.js.map} +1 -1
  88. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-BtsDjIpC.js → quadrantDiagram-AYHSOK5B-BwYvMil1.js} +3 -3
  89. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-BtsDjIpC.js.map → quadrantDiagram-AYHSOK5B-BwYvMil1.js.map} +1 -1
  90. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DPzuPEge.js → requirementDiagram-UZGBJVZJ-syDAMAIY.js} +4 -4
  91. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DPzuPEge.js.map → requirementDiagram-UZGBJVZJ-syDAMAIY.js.map} +1 -1
  92. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-BJS1ETtL.js → sankeyDiagram-TZEHDZUN-ifN71SAO.js} +2 -2
  93. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-BJS1ETtL.js.map → sankeyDiagram-TZEHDZUN-ifN71SAO.js.map} +1 -1
  94. package/dist/static/assets/{sequenceDiagram-WL72ISMW-DXEpa4ly.js → sequenceDiagram-WL72ISMW-ytS-PG6f.js} +4 -4
  95. package/dist/static/assets/{sequenceDiagram-WL72ISMW-DXEpa4ly.js.map → sequenceDiagram-WL72ISMW-ytS-PG6f.js.map} +1 -1
  96. package/dist/static/assets/{stateDiagram-FKZM4ZOC-CGU6VJY5.js → stateDiagram-FKZM4ZOC-BICTjIiL.js} +9 -9
  97. package/dist/static/assets/{stateDiagram-FKZM4ZOC-CGU6VJY5.js.map → stateDiagram-FKZM4ZOC-BICTjIiL.js.map} +1 -1
  98. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-Dx_GvlFA.js → stateDiagram-v2-4FDKWEC3-BD67hjdo.js} +5 -5
  99. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-Dx_GvlFA.js.map → stateDiagram-v2-4FDKWEC3-BD67hjdo.js.map} +1 -1
  100. package/dist/static/assets/{timeline-definition-IT6M3QCI-DcWLmdgJ.js → timeline-definition-IT6M3QCI-Bn4PeFHS.js} +3 -3
  101. package/dist/static/assets/{timeline-definition-IT6M3QCI-DcWLmdgJ.js.map → timeline-definition-IT6M3QCI-Bn4PeFHS.js.map} +1 -1
  102. package/dist/static/assets/{treemap-GDKQZRPO-BhUwKF9C.js → treemap-GDKQZRPO-C-_A6aNF.js} +5 -5
  103. package/dist/static/assets/{treemap-GDKQZRPO-BhUwKF9C.js.map → treemap-GDKQZRPO-C-_A6aNF.js.map} +1 -1
  104. package/dist/static/assets/{xychartDiagram-PRI3JC2R-Cr4t0oCq.js → xychartDiagram-PRI3JC2R-BaUb_VjF.js} +3 -3
  105. package/dist/static/assets/{xychartDiagram-PRI3JC2R-Cr4t0oCq.js.map → xychartDiagram-PRI3JC2R-BaUb_VjF.js.map} +1 -1
  106. package/dist/static/index.html +1 -1
  107. package/dist/tools/pending-tellask-reminder.js +2 -2
  108. package/dist/tools/prompts/team_mgmt/en/errors.md +6 -0
  109. package/dist/tools/prompts/team_mgmt/zh/errors.md +6 -0
  110. package/dist/tools/team_mgmt.js +29 -0
  111. package/package.json +1 -1
  112. package/dist/apps/installed-file.js +0 -207
  113. package/dist/apps/runtime-port.js +0 -91
  114. package/dist/docs/kernel-app-architecture.md +0 -286
  115. package/dist/docs/kernel-app-architecture.zh.md +0 -285
  116. package/dist/llm/driver-entry.js +0 -28
  117. package/dist/llm/driver-v2/context-health.js +0 -121
  118. package/dist/llm/driver-v2/context.js +0 -56
  119. package/dist/llm/driver-v2/core.js +0 -1545
  120. package/dist/llm/driver-v2/index.js +0 -26
  121. package/dist/llm/driver-v2/orchestrator.js +0 -158
  122. package/dist/llm/driver-v2/policy.js +0 -129
  123. package/dist/llm/driver-v2/restore-dialog-hierarchy.js +0 -73
  124. package/dist/llm/driver-v2/round.js +0 -366
  125. package/dist/llm/driver-v2/runtime-utils.js +0 -365
  126. package/dist/llm/driver-v2/saying-events.js +0 -20
  127. package/dist/llm/driver-v2/subdialog-txn.js +0 -42
  128. package/dist/llm/driver-v2/supdialog-response.js +0 -400
  129. package/dist/llm/driver-v2/tellask-bridge.js +0 -1148
  130. package/dist/llm/driver-v2/types.js +0 -10
  131. package/dist/llm/driver-v2-ref-only/context-health.js +0 -121
  132. package/dist/llm/driver-v2-ref-only/context.js +0 -17
  133. package/dist/llm/driver-v2-ref-only/core.js +0 -1710
  134. package/dist/llm/driver-v2-ref-only/index.js +0 -26
  135. package/dist/llm/driver-v2-ref-only/orchestrator.js +0 -158
  136. package/dist/llm/driver-v2-ref-only/policy.js +0 -129
  137. package/dist/llm/driver-v2-ref-only/restore-dialog-hierarchy.js +0 -73
  138. package/dist/llm/driver-v2-ref-only/round.js +0 -366
  139. package/dist/llm/driver-v2-ref-only/runtime-utils.js +0 -473
  140. package/dist/llm/driver-v2-ref-only/saying-events.js +0 -18
  141. package/dist/llm/driver-v2-ref-only/subdialog-txn.js +0 -42
  142. package/dist/llm/driver-v2-ref-only/supdialog-response.js +0 -453
  143. package/dist/llm/driver-v2-ref-only/tellask-bridge.js +0 -1178
  144. package/dist/llm/driver-v2-ref-only/types.js +0 -10
  145. package/dist/tools/prompts/memory/en/errors.md +0 -155
  146. package/dist/tools/prompts/memory/en/index.md +0 -47
  147. package/dist/tools/prompts/memory/en/principles.md +0 -79
  148. package/dist/tools/prompts/memory/en/scenarios.md +0 -174
  149. package/dist/tools/prompts/memory/en/tools.md +0 -154
  150. package/dist/tools/prompts/memory/zh/errors.md +0 -155
  151. package/dist/tools/prompts/memory/zh/index.md +0 -47
  152. package/dist/tools/prompts/memory/zh/principles.md +0 -79
  153. package/dist/tools/prompts/memory/zh/scenarios.md +0 -174
  154. package/dist/tools/prompts/memory/zh/tools.md +0 -154
@@ -52,7 +52,7 @@
52
52
  padding: 20px;
53
53
  }
54
54
  </style>
55
- <script type="module" crossorigin src="/assets/index-C-RsyM0K.js"></script>
55
+ <script type="module" crossorigin src="/assets/index-CzBEs1w4.js"></script>
56
56
  <link rel="stylesheet" crossorigin href="/assets/index-CD5wtC_i.css">
57
57
  </head>
58
58
  <body>
@@ -62,8 +62,8 @@ function buildReminderMeta(pending) {
62
62
  }
63
63
  function buildReminderContent(language, pending) {
64
64
  const heading = language === 'zh'
65
- ? '⏳ 进行中诉请(自动添加,手动删除)'
66
- : '⏳ In-flight Tellasks (auto-added, manually deleted)';
65
+ ? `⏳ 进行中诉请(共 ${pending.length} 路,自动添加,手动删除)`
66
+ : `⏳ In-flight Tellasks (${pending.length} total, auto-added, manually deleted)`;
67
67
  if (pending.length === 0) {
68
68
  const noneRunningText = language === 'zh'
69
69
  ? '当前没有任何执行中的诉请,没有其祂智能体仍在后台工作,任何 “等待” 想法和行为都是错误的;若你删除后该提醒项未再次出现,也同样表示当前无可等待事项。若已明确知晓,可删除此提醒项以免碍眼。'
@@ -43,6 +43,12 @@
43
43
  2. Fix format issues in team.yaml
44
44
  3. Re-validate until no errors
45
45
  4. Clear Problems panel before proceeding
46
+ - Important: `team_mgmt_validate_team_cfg({})`, `team_mgmt_validate_mcp_cfg({})`, and `team_mgmt_manual({})` should remain usable even when an app-provided toolset is broken or missing; use them to continue investigation instead of stopping.
47
+ - App/toolset triage:
48
+ 1. Keep the validation output and identify the exact missing toolset / broken binding
49
+ 2. Inspect `.minds/app.yaml` with `team_mgmt_read_file({ path: "app.yaml" })`
50
+ 3. Review `team_mgmt_manual({ topics: ["toolsets","troubleshooting"] })`
51
+ 4. Then verify app install/enable state, apps-host startup, and the app host path/module integrity
46
52
 
47
53
  **MCP_VALIDATION_ERROR**
48
54
 
@@ -43,6 +43,12 @@
43
43
  2. 修复 team.yaml 中的格式问题
44
44
  3. 重新验证直到无错误
45
45
  4. 清空 Problems 面板后再继续
46
+ - 重要:即使 app 提供的 toolset 缺失或损坏,`team_mgmt_validate_team_cfg({})`、`team_mgmt_validate_mcp_cfg({})`、`team_mgmt_manual({})` 这些团队管理校验工具也应继续可用;应继续用它们排查,而不是中止。
47
+ - app/toolset 排查顺序:
48
+ 1. 保留校验输出,先定位缺失的 toolset / 断裂绑定
49
+ 2. 用 `team_mgmt_read_file({ path: "app.yaml" })` 检查 `.minds/app.yaml`
50
+ 3. 查看 `team_mgmt_manual({ topics: ["toolsets","troubleshooting"] })`
51
+ 4. 再核对 app 安装/启用状态、apps-host 启动情况,以及 app host 路径/模块是否损坏
46
52
 
47
53
  **MCP_VALIDATION_ERROR**
48
54
 
@@ -3506,6 +3506,7 @@ function renderTroubleshooting(language) {
3506
3506
  '症状:提示“Provider not found” → 原因:provider key 未定义/拼写错误/未按预期合并 defaults → 步骤:检查 `.minds/llm.yaml` 的 provider keys,并确认 `.minds/team.yaml` 引用的 key 存在。',
3507
3507
  '症状:提示“Model not found” → 原因:model key 未定义/拼写错误/不在该 provider 下 → 步骤:用 `team_mgmt_list_models({ provider_pattern: \"<providerKey>\", model_pattern: \"*\" })` 查已有模型 key,再修正 `.minds/team.yaml` 引用或补全 `.minds/llm.yaml`。',
3508
3508
  '症状:提示“permission denied / forbidden / not allowed” → 原因:权限规则(目录或扩展名)命中 deny-list 或未被 allow-list 覆盖 → 步骤:用 `team_mgmt_manual({ topics: [\"permissions\"] })` 复核规则,并检查该成员的 `*_dirs/no_*_dirs/*_file_ext_names/no_*_file_ext_names` 配置。',
3509
+ '症状:`team.yaml` 里引用的 app toolset 缺失 / app 相关能力失效 → 原因:enabled app 未正确安装/启用、apps-host 启动失败,或 app 自身 host 模块/运行时损坏 → 步骤:`team_mgmt_validate_team_cfg({})` 仍然可用;先用它确认具体缺失项,再检查 `.minds/app.yaml`、已启用 apps 解析结果与相关 app 安装路径;必要时让持有 team_mgmt 的团队管理智能体继续用 `team_mgmt_read_file` / `team_mgmt_ripgrep_*` / `team_mgmt_manual({ topics: [\"toolsets\",\"troubleshooting\"] })` 排查。',
3509
3510
  '症状:MCP 不生效 → 原因:mcp 配置错误/服务不可用/租用未释放 → 步骤:先运行 `team_mgmt_validate_mcp_cfg({})` 汇总错误;必要时用 `mcp_restart`;完成后用 `mcp_release` 释放租用。',
3510
3511
  ]));
3511
3512
  }
@@ -3516,9 +3517,21 @@ function renderTroubleshooting(language) {
3516
3517
  'Symptom: "Provider not found" → Cause: provider key not defined / typo / unexpected merge with defaults → Steps: check `.minds/llm.yaml` provider keys and ensure `.minds/team.yaml` references an existing key.',
3517
3518
  'Symptom: "Model not found" → Cause: model key not defined / typo / not under that provider → Steps: run `team_mgmt_list_models({ provider_pattern: \"<providerKey>\", model_pattern: \"*\" })` and fix `.minds/team.yaml` references or update `.minds/llm.yaml`.',
3518
3519
  'Symptom: "permission denied / forbidden / not allowed" → Cause: permission rules (directory or extension) hit deny-list or are not covered by allow-list → Steps: review `team_mgmt_manual({ topics: [\"permissions\"] })` and the member `*_dirs/no_*_dirs/*_file_ext_names/no_*_file_ext_names` config.',
3520
+ 'Symptom: an app-provided toolset referenced from `team.yaml` is missing / app capability is unavailable → Cause: enabled app not installed/enabled correctly, apps-host startup failure, or a broken app host module/runtime → Steps: `team_mgmt_validate_team_cfg({})` remains available; use it first to identify the missing binding, then inspect `.minds/app.yaml`, enabled-app resolution, and the app install path. The team manager should continue with `team_mgmt_read_file`, `team_mgmt_ripgrep_*`, and `team_mgmt_manual({ topics: ["toolsets","troubleshooting"] })`.',
3519
3521
  'Symptom: MCP not working → Cause: bad config / server down / leasing issues → Steps: run `team_mgmt_validate_mcp_cfg({})` first, then use `mcp_restart` if needed; call `mcp_release` when done.',
3520
3522
  ]));
3521
3523
  }
3524
+ function isLikelyAppToolsetBindingProblem(problem) {
3525
+ if (problem.kind !== 'team_workspace_config_error')
3526
+ return false;
3527
+ if (!problem.id.includes('/toolsets/'))
3528
+ return false;
3529
+ return (problem.detail.errorText.includes('enabled app') ||
3530
+ problem.detail.errorText.includes('enabled apps') ||
3531
+ problem.detail.errorText.includes('inspect / refresh enabled apps') ||
3532
+ problem.detail.errorText.includes('inspect the app install path') ||
3533
+ problem.detail.errorText.includes('app is installed/enabled'));
3534
+ }
3522
3535
  async function renderModelParamsManual(language) {
3523
3536
  const header = language === 'zh'
3524
3537
  ? fmtHeader('model_params(成员模型参数)')
@@ -4443,11 +4456,26 @@ exports.teamMgmtValidateTeamCfgTool = {
4443
4456
  issueLines.push(`- ${p.id}: ${p.message}`);
4444
4457
  issueLines.push(' ' + p.detail.errorText.split('\n').join('\n '));
4445
4458
  }
4459
+ const hasAppToolsetBindingProblem = teamProblems.some(isLikelyAppToolsetBindingProblem);
4460
+ const followUpLines = language === 'zh'
4461
+ ? [
4462
+ '说明:`team_mgmt_validate_team_cfg({})` / `team_mgmt_validate_mcp_cfg({})` / `team_mgmt_manual({})` 等团队管理校验工具应继续可用;不要因为相关 app/toolset 出错就停止排查。',
4463
+ hasAppToolsetBindingProblem
4464
+ ? '建议排查顺序:1) 先保留并阅读本校验输出;2) 用 `team_mgmt_read_file({ path: "app.yaml" })` 检查 `.minds/app.yaml` 依赖声明;3) 再结合 `team_mgmt_manual({ topics: ["toolsets","troubleshooting"] })` 核对该 toolset 是否应来自 enabled app,以及 app 安装/启用/宿主路径是否损坏。'
4465
+ : '建议:继续用 `team_mgmt_manual({ topics: ["team","toolsets","troubleshooting"] })`、`team_mgmt_read_file`、`team_mgmt_ripgrep_*` 缩小范围,再修复后重新运行本校验工具。',
4466
+ ]
4467
+ : [
4468
+ 'Note: team-management validation tools such as `team_mgmt_validate_team_cfg({})`, `team_mgmt_validate_mcp_cfg({})`, and `team_mgmt_manual({})` should remain usable; do not stop investigation just because a related app/toolset is failing.',
4469
+ hasAppToolsetBindingProblem
4470
+ ? 'Suggested triage order: 1) keep and read this validation output; 2) inspect `.minds/app.yaml` via `team_mgmt_read_file({ path: "app.yaml" })`; 3) use `team_mgmt_manual({ topics: ["toolsets","troubleshooting"] })` to confirm whether the missing toolset should come from an enabled app, then verify app install/enable state and host path integrity.'
4471
+ : 'Suggestion: continue with `team_mgmt_manual({ topics: ["team","toolsets","troubleshooting"] })`, `team_mgmt_read_file`, and `team_mgmt_ripgrep_*` to narrow scope, then re-run this validator after fixes.',
4472
+ ];
4446
4473
  const msg = language === 'zh'
4447
4474
  ? fmtHeader('team.yaml 校验失败') +
4448
4475
  fmtList([
4449
4476
  `\`${TEAM_YAML_REL}\`:❌ 检测到 ${teamProblems.length} 个问题(详见 Problems 面板)`,
4450
4477
  '说明:坏的成员配置可能会在运行时被跳过或在使用时失败(为了保持 Team 可用),但你仍应立即修复以免行为偏离预期。',
4478
+ ...followUpLines,
4451
4479
  ]) +
4452
4480
  '\n' +
4453
4481
  issueLines.join('\n')
@@ -4455,6 +4483,7 @@ exports.teamMgmtValidateTeamCfgTool = {
4455
4483
  fmtList([
4456
4484
  `\`${TEAM_YAML_REL}\`: ❌ ${teamProblems.length} issue(s) detected (see Problems panel)`,
4457
4485
  'Note: invalid member configs may be omitted at runtime or fail when used (to keep the Team usable), but you should fix them immediately.',
4486
+ ...followUpLines,
4458
4487
  ]) +
4459
4488
  '\n' +
4460
4489
  issueLines.join('\n');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dominds",
3
- "version": "1.8.2",
3
+ "version": "1.8.4",
4
4
  "description": "DevOps Mindsets — Sustainable Agentic Product Lifecycle",
5
5
  "type": "commonjs",
6
6
  "private": false,
@@ -1,207 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.INSTALLED_APPS_REL_PATH = void 0;
7
- exports.loadInstalledAppsFile = loadInstalledAppsFile;
8
- exports.writeInstalledAppsFile = writeInstalledAppsFile;
9
- exports.upsertInstalledApp = upsertInstalledApp;
10
- exports.removeInstalledApp = removeInstalledApp;
11
- exports.setAppEnabled = setAppEnabled;
12
- exports.setAppRuntimePort = setAppRuntimePort;
13
- exports.findInstalledApp = findInstalledApp;
14
- const promises_1 = __importDefault(require("fs/promises"));
15
- const path_1 = __importDefault(require("path"));
16
- const yaml_1 = __importDefault(require("yaml"));
17
- const time_1 = require("../shared/utils/time");
18
- exports.INSTALLED_APPS_REL_PATH = path_1.default.join('.apps', 'installed.yaml');
19
- function isRecord(v) {
20
- return typeof v === 'object' && v !== null && !Array.isArray(v);
21
- }
22
- function asString(v) {
23
- return typeof v === 'string' ? v : null;
24
- }
25
- function asBool(v) {
26
- return typeof v === 'boolean' ? v : null;
27
- }
28
- function asNullableNumber(v) {
29
- if (v === null)
30
- return null;
31
- if (typeof v === 'number' && Number.isFinite(v))
32
- return v;
33
- return null;
34
- }
35
- function parseSource(v, at) {
36
- if (!isRecord(v))
37
- return { ok: false, errorText: `Invalid ${at}: expected object` };
38
- const kind = asString(v['kind']);
39
- if (kind !== 'npx' && kind !== 'local') {
40
- return { ok: false, errorText: `Invalid ${at}.kind: expected 'npx'|'local'` };
41
- }
42
- if (kind === 'npx') {
43
- const spec = asString(v['spec']);
44
- if (!spec || spec.trim() === '')
45
- return { ok: false, errorText: `Invalid ${at}.spec: required` };
46
- return { ok: true, source: { kind, spec } };
47
- }
48
- const pathAbs = asString(v['pathAbs']);
49
- if (!pathAbs || pathAbs.trim() === '')
50
- return { ok: false, errorText: `Invalid ${at}.pathAbs: required` };
51
- return { ok: true, source: { kind, pathAbs } };
52
- }
53
- function parseRuntime(v, at) {
54
- if (!isRecord(v))
55
- return { ok: false, errorText: `Invalid ${at}: expected object` };
56
- const portRaw = v['port'];
57
- const port = asNullableNumber(portRaw);
58
- if (port === null) {
59
- if (portRaw !== null) {
60
- return { ok: false, errorText: `Invalid ${at}.port: expected number|null` };
61
- }
62
- return { ok: true, runtime: { port: null } };
63
- }
64
- if (port < 0 || !Number.isInteger(port))
65
- return { ok: false, errorText: `Invalid ${at}.port: expected non-negative integer|null` };
66
- return { ok: true, runtime: { port: port } };
67
- }
68
- function parseEntry(v, at) {
69
- if (!isRecord(v))
70
- return { ok: false, errorText: `Invalid ${at}: expected object` };
71
- const id = asString(v['id']);
72
- if (!id || id.trim() === '')
73
- return { ok: false, errorText: `Invalid ${at}.id: required` };
74
- const enabled = asBool(v['enabled']);
75
- if (enabled === null)
76
- return { ok: false, errorText: `Invalid ${at}.enabled: boolean required` };
77
- const installedAt = asString(v['installedAt']);
78
- const updatedAt = asString(v['updatedAt']);
79
- if (!installedAt || installedAt.trim() === '')
80
- return { ok: false, errorText: `Invalid ${at}.installedAt: required` };
81
- if (!updatedAt || updatedAt.trim() === '')
82
- return { ok: false, errorText: `Invalid ${at}.updatedAt: required` };
83
- const sourceParsed = parseSource(v['source'], `${at}.source`);
84
- if (!sourceParsed.ok)
85
- return sourceParsed;
86
- const runtimeParsed = parseRuntime(v['runtime'] ?? { port: null }, `${at}.runtime`);
87
- if (!runtimeParsed.ok)
88
- return runtimeParsed;
89
- // installJson is validated by install/update command on write. On read we keep permissive:
90
- // kernel will fail fast later if it needs a missing field.
91
- const installJson = v['installJson'];
92
- if (!isRecord(installJson))
93
- return { ok: false, errorText: `Invalid ${at}.installJson: expected object` };
94
- return {
95
- ok: true,
96
- entry: {
97
- id,
98
- enabled,
99
- source: sourceParsed.source,
100
- runtime: runtimeParsed.runtime,
101
- installJson: installJson,
102
- installedAt,
103
- updatedAt,
104
- },
105
- };
106
- }
107
- async function loadInstalledAppsFile(params) {
108
- const filePathAbs = path_1.default.resolve(params.rtwsRootAbs, exports.INSTALLED_APPS_REL_PATH);
109
- let raw;
110
- try {
111
- raw = await promises_1.default.readFile(filePathAbs, 'utf-8');
112
- }
113
- catch (err) {
114
- const isEnoent = typeof err === 'object' &&
115
- err !== null &&
116
- 'code' in err &&
117
- err.code === 'ENOENT';
118
- if (isEnoent) {
119
- return { kind: 'ok', filePathAbs, file: { schemaVersion: 1, apps: [] } };
120
- }
121
- return {
122
- kind: 'error',
123
- filePathAbs,
124
- errorText: err instanceof Error ? err.message : String(err),
125
- };
126
- }
127
- let parsed;
128
- try {
129
- parsed = yaml_1.default.parse(raw);
130
- }
131
- catch (err) {
132
- return {
133
- kind: 'error',
134
- filePathAbs,
135
- errorText: `Failed to parse YAML: ${err instanceof Error ? err.message : String(err)}`,
136
- };
137
- }
138
- if (!isRecord(parsed)) {
139
- return { kind: 'error', filePathAbs, errorText: 'Invalid installed.yaml: expected object' };
140
- }
141
- const schemaVersion = parsed['schemaVersion'];
142
- if (schemaVersion !== 1) {
143
- return {
144
- kind: 'error',
145
- filePathAbs,
146
- errorText: `Unsupported schemaVersion: ${String(schemaVersion)}`,
147
- };
148
- }
149
- const appsRaw = parsed['apps'];
150
- if (!Array.isArray(appsRaw)) {
151
- return {
152
- kind: 'error',
153
- filePathAbs,
154
- errorText: 'Invalid installed.yaml: apps must be an array',
155
- };
156
- }
157
- const apps = [];
158
- for (let i = 0; i < appsRaw.length; i += 1) {
159
- const e = parseEntry(appsRaw[i], `apps[${i}]`);
160
- if (!e.ok)
161
- return { kind: 'error', filePathAbs, errorText: e.errorText };
162
- apps.push(e.entry);
163
- }
164
- return { kind: 'ok', filePathAbs, file: { schemaVersion: 1, apps } };
165
- }
166
- async function writeInstalledAppsFile(params) {
167
- const dirAbs = path_1.default.resolve(params.rtwsRootAbs, '.apps');
168
- await promises_1.default.mkdir(dirAbs, { recursive: true });
169
- const filePathAbs = path_1.default.resolve(params.rtwsRootAbs, exports.INSTALLED_APPS_REL_PATH);
170
- const yamlText = yaml_1.default.stringify(params.file);
171
- await promises_1.default.writeFile(filePathAbs, yamlText, 'utf-8');
172
- }
173
- function upsertInstalledApp(params) {
174
- const apps = [...params.existing.apps];
175
- const idx = apps.findIndex((a) => a.id === params.next.id);
176
- if (idx >= 0) {
177
- apps[idx] = params.next;
178
- }
179
- else {
180
- apps.push(params.next);
181
- }
182
- return { schemaVersion: 1, apps };
183
- }
184
- function removeInstalledApp(params) {
185
- return { schemaVersion: 1, apps: params.existing.apps.filter((a) => a.id !== params.appId) };
186
- }
187
- function setAppEnabled(params) {
188
- const now = (0, time_1.formatUnifiedTimestamp)(new Date());
189
- const apps = params.existing.apps.map((a) => a.id === params.appId ? { ...a, enabled: params.enabled, updatedAt: now } : a);
190
- return { schemaVersion: 1, apps };
191
- }
192
- function setAppRuntimePort(params) {
193
- const existingApp = findInstalledApp(params.existing, params.appId);
194
- if (!existingApp)
195
- return params.existing;
196
- if (existingApp.runtime.port === params.port)
197
- return params.existing;
198
- const now = (0, time_1.formatUnifiedTimestamp)(new Date());
199
- const apps = params.existing.apps.map((a) => a.id === params.appId
200
- ? { ...a, runtime: { ...a.runtime, port: params.port }, updatedAt: now }
201
- : a);
202
- return { schemaVersion: 1, apps };
203
- }
204
- function findInstalledApp(file, appId) {
205
- const found = file.apps.find((a) => a.id === appId);
206
- return found ?? null;
207
- }
@@ -1,91 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.resolveStableAppRuntimePort = resolveStableAppRuntimePort;
7
- const node_net_1 = __importDefault(require("node:net"));
8
- const STABLE_PORT_RANGE_START = 43000;
9
- const STABLE_PORT_RANGE_END = 49999;
10
- const PORT_MAX = 65535;
11
- function isPositivePort(value) {
12
- return (typeof value === 'number' &&
13
- Number.isInteger(value) &&
14
- value > 0 &&
15
- value <= PORT_MAX &&
16
- Number.isFinite(value));
17
- }
18
- function hashAppId(appId) {
19
- // FNV-1a 32-bit hash for deterministic port probing order.
20
- let hash = 0x811c9dc5;
21
- for (let i = 0; i < appId.length; i += 1) {
22
- hash ^= appId.charCodeAt(i);
23
- hash = Math.imul(hash, 0x01000193);
24
- }
25
- return hash >>> 0;
26
- }
27
- function collectReservedPorts(existingApps, appId) {
28
- const reserved = new Set();
29
- for (const app of existingApps) {
30
- if (app.id === appId)
31
- continue;
32
- if (isPositivePort(app.runtime.port)) {
33
- reserved.add(app.runtime.port);
34
- }
35
- }
36
- return reserved;
37
- }
38
- async function canBindPort(port) {
39
- return await new Promise((resolve) => {
40
- const server = node_net_1.default.createServer();
41
- server.unref();
42
- const finish = (ok) => {
43
- server.removeAllListeners('error');
44
- server.removeAllListeners('listening');
45
- resolve(ok);
46
- };
47
- server.once('error', () => {
48
- finish(false);
49
- });
50
- server.once('listening', () => {
51
- server.close(() => finish(true));
52
- });
53
- server.listen({ host: '127.0.0.1', port, exclusive: true });
54
- });
55
- }
56
- async function pickDeterministicAvailablePort(params) {
57
- const rangeSize = STABLE_PORT_RANGE_END - STABLE_PORT_RANGE_START + 1;
58
- if (rangeSize <= 0) {
59
- throw new Error('Invalid stable app runtime port range configuration');
60
- }
61
- const baseHash = hashAppId(params.appId);
62
- for (let i = 0; i < rangeSize; i += 1) {
63
- const candidate = STABLE_PORT_RANGE_START + ((baseHash + i) % rangeSize);
64
- if (params.reservedPorts.has(candidate))
65
- continue;
66
- if (await canBindPort(candidate))
67
- return candidate;
68
- }
69
- throw new Error(`Failed to allocate stable runtime port for app '${params.appId}': no bindable port in ${STABLE_PORT_RANGE_START}-${STABLE_PORT_RANGE_END}`);
70
- }
71
- async function resolveStableAppRuntimePort(params) {
72
- if (!params.installJson.frontend)
73
- return null;
74
- const reservedPorts = collectReservedPorts(params.existingApps, params.appId);
75
- if (isPositivePort(params.existingRuntimePort)) {
76
- if (reservedPorts.has(params.existingRuntimePort)) {
77
- throw new Error(`Invalid installed apps state: runtime port ${params.existingRuntimePort} for '${params.appId}' collides with another installed app`);
78
- }
79
- return params.existingRuntimePort;
80
- }
81
- const defaultPort = params.installJson.frontend.defaultPort;
82
- if (isPositivePort(defaultPort) &&
83
- !reservedPorts.has(defaultPort) &&
84
- (await canBindPort(defaultPort))) {
85
- return defaultPort;
86
- }
87
- return await pickDeterministicAvailablePort({
88
- appId: params.appId,
89
- reservedPorts,
90
- });
91
- }