dominds 1.20.2 → 1.20.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/README.md +4 -4
  2. package/README.zh.md +2 -2
  3. package/dist/access-control.js +2 -2
  4. package/dist/cli/webui.d.ts +1 -1
  5. package/dist/cli/webui.js +29 -9
  6. package/dist/docs/OEC-philosophy.md +1 -1
  7. package/dist/docs/cli-usage.md +2 -1
  8. package/dist/docs/cli-usage.zh.md +6 -3
  9. package/dist/docs/context-health.md +2 -2
  10. package/dist/docs/context-health.zh.md +2 -2
  11. package/dist/docs/design.md +3 -3
  12. package/dist/docs/design.zh.md +3 -3
  13. package/dist/docs/dialog-system.md +18 -10
  14. package/dist/docs/dialog-system.zh.md +18 -10
  15. package/dist/docs/dominds-terminology.md +4 -4
  16. package/dist/docs/encapsulated-taskdoc.md +17 -10
  17. package/dist/docs/encapsulated-taskdoc.zh.md +18 -11
  18. package/dist/minds/load.js +15 -4
  19. package/dist/minds/minds-i18n.js +2 -2
  20. package/dist/minds/system-prompt-parts.js +11 -11
  21. package/dist/runtime/driver-messages.js +8 -4
  22. package/dist/server/api-routes.js +65 -0
  23. package/dist/server/port-selection.d.ts +19 -0
  24. package/dist/server/port-selection.js +57 -0
  25. package/dist/server/server-core.d.ts +2 -2
  26. package/dist/server/server-core.js +21 -7
  27. package/dist/server/static-server.js +1 -0
  28. package/dist/server.d.ts +3 -0
  29. package/dist/server.js +109 -44
  30. package/dist/team.d.ts +2 -3
  31. package/dist/team.js +17 -4
  32. package/dist/tools/builtins.js +5 -0
  33. package/dist/tools/ctrl.d.ts +11 -7
  34. package/dist/tools/ctrl.js +248 -34
  35. package/dist/tools/prompts/control/en/errors.md +2 -2
  36. package/dist/tools/prompts/control/en/index.md +1 -1
  37. package/dist/tools/prompts/control/en/principles.md +14 -12
  38. package/dist/tools/prompts/control/en/tools.md +40 -6
  39. package/dist/tools/prompts/control/zh/errors.md +2 -2
  40. package/dist/tools/prompts/control/zh/index.md +1 -1
  41. package/dist/tools/prompts/control/zh/principles.md +14 -12
  42. package/dist/tools/prompts/control/zh/tools.md +40 -6
  43. package/dist/tools/prompts/personal_memory/en/principles.md +1 -1
  44. package/dist/tools/prompts/personal_memory/zh/principles.md +1 -1
  45. package/dist/tools/prompts/team_memory/en/principles.md +1 -1
  46. package/dist/tools/prompts/team_memory/zh/principles.md +1 -1
  47. package/dist/tools/registry.d.ts +6 -0
  48. package/dist/tools/team_mgmt.js +5 -5
  49. package/dist/utils/task-package.d.ts +24 -1
  50. package/dist/utils/task-package.js +80 -5
  51. package/dist/utils/taskdoc-search-worker-client.d.ts +12 -0
  52. package/dist/utils/taskdoc-search-worker-client.js +320 -0
  53. package/dist/utils/taskdoc-search-worker.d.ts +1 -0
  54. package/dist/utils/taskdoc-search-worker.js +42 -0
  55. package/dist/utils/taskdoc-search.d.ts +28 -7
  56. package/dist/utils/taskdoc-search.js +62 -15
  57. package/dist/utils/taskdoc.js +60 -22
  58. package/package.json +3 -3
  59. package/webapp/dist/assets/{_basePickBy-B7M9Q0Fa.js → _basePickBy-BrC49DPW.js} +3 -3
  60. package/webapp/dist/assets/{_basePickBy-B7M9Q0Fa.js.map → _basePickBy-BrC49DPW.js.map} +1 -1
  61. package/webapp/dist/assets/{_baseUniq-DAeYoL6j.js → _baseUniq-C_Wcx-_S.js} +2 -2
  62. package/webapp/dist/assets/{_baseUniq-DAeYoL6j.js.map → _baseUniq-C_Wcx-_S.js.map} +1 -1
  63. package/webapp/dist/assets/{arc-Bh4nDbNR.js → arc-X5iIdpx0.js} +2 -2
  64. package/webapp/dist/assets/{arc-Bh4nDbNR.js.map → arc-X5iIdpx0.js.map} +1 -1
  65. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CxqmdsIm.js → architectureDiagram-2XIMDMQ5-DFfhMGkT.js} +7 -7
  66. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CxqmdsIm.js.map → architectureDiagram-2XIMDMQ5-DFfhMGkT.js.map} +1 -1
  67. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-CxIWLtpt.js → blockDiagram-WCTKOSBZ-BAt4BaxZ.js} +7 -7
  68. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-CxIWLtpt.js.map → blockDiagram-WCTKOSBZ-BAt4BaxZ.js.map} +1 -1
  69. package/webapp/dist/assets/{c4Diagram-IC4MRINW-1qErOIgG.js → c4Diagram-IC4MRINW-BYxKH5AA.js} +3 -3
  70. package/webapp/dist/assets/{c4Diagram-IC4MRINW-1qErOIgG.js.map → c4Diagram-IC4MRINW-BYxKH5AA.js.map} +1 -1
  71. package/webapp/dist/assets/{channel-DkgZHNUe.js → channel-CuYhL59H.js} +2 -2
  72. package/webapp/dist/assets/{channel-DkgZHNUe.js.map → channel-CuYhL59H.js.map} +1 -1
  73. package/webapp/dist/assets/{chunk-4BX2VUAB-BmdMbU9v.js → chunk-4BX2VUAB-Ch1PfLiD.js} +2 -2
  74. package/webapp/dist/assets/{chunk-4BX2VUAB-BmdMbU9v.js.map → chunk-4BX2VUAB-Ch1PfLiD.js.map} +1 -1
  75. package/webapp/dist/assets/{chunk-55IACEB6-D6LDTDBy.js → chunk-55IACEB6-B3rzakPd.js} +2 -2
  76. package/webapp/dist/assets/{chunk-55IACEB6-D6LDTDBy.js.map → chunk-55IACEB6-B3rzakPd.js.map} +1 -1
  77. package/webapp/dist/assets/{chunk-FMBD7UC4-C-BdCe4C.js → chunk-FMBD7UC4-CCZWJRJ5.js} +2 -2
  78. package/webapp/dist/assets/{chunk-FMBD7UC4-C-BdCe4C.js.map → chunk-FMBD7UC4-CCZWJRJ5.js.map} +1 -1
  79. package/webapp/dist/assets/{chunk-JSJVCQXG-WA_BLIm9.js → chunk-JSJVCQXG-Dqd_MOPD.js} +2 -2
  80. package/webapp/dist/assets/{chunk-JSJVCQXG-WA_BLIm9.js.map → chunk-JSJVCQXG-Dqd_MOPD.js.map} +1 -1
  81. package/webapp/dist/assets/{chunk-KX2RTZJC-CA7sDJO5.js → chunk-KX2RTZJC-DOpPZD_q.js} +2 -2
  82. package/webapp/dist/assets/{chunk-KX2RTZJC-CA7sDJO5.js.map → chunk-KX2RTZJC-DOpPZD_q.js.map} +1 -1
  83. package/webapp/dist/assets/{chunk-NQ4KR5QH-wlvxalE3.js → chunk-NQ4KR5QH-CUj2LNV0.js} +4 -4
  84. package/webapp/dist/assets/{chunk-NQ4KR5QH-wlvxalE3.js.map → chunk-NQ4KR5QH-CUj2LNV0.js.map} +1 -1
  85. package/webapp/dist/assets/{chunk-QZHKN3VN-Bo1VMcph.js → chunk-QZHKN3VN-DXeWDyzh.js} +2 -2
  86. package/webapp/dist/assets/{chunk-QZHKN3VN-Bo1VMcph.js.map → chunk-QZHKN3VN-DXeWDyzh.js.map} +1 -1
  87. package/webapp/dist/assets/{chunk-WL4C6EOR-B-Pk44be.js → chunk-WL4C6EOR-CqTowzs6.js} +6 -6
  88. package/webapp/dist/assets/{chunk-WL4C6EOR-B-Pk44be.js.map → chunk-WL4C6EOR-CqTowzs6.js.map} +1 -1
  89. package/webapp/dist/assets/{classDiagram-VBA2DB6C-BqKuyb49.js → classDiagram-VBA2DB6C-CvsxEN3D.js} +7 -7
  90. package/webapp/dist/assets/{classDiagram-VBA2DB6C-BqKuyb49.js.map → classDiagram-VBA2DB6C-CvsxEN3D.js.map} +1 -1
  91. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-BqKuyb49.js → classDiagram-v2-RAHNMMFH-CvsxEN3D.js} +7 -7
  92. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-BqKuyb49.js.map → classDiagram-v2-RAHNMMFH-CvsxEN3D.js.map} +1 -1
  93. package/webapp/dist/assets/{clone-BX5z8WVZ.js → clone-PGWIYNYc.js} +2 -2
  94. package/webapp/dist/assets/{clone-BX5z8WVZ.js.map → clone-PGWIYNYc.js.map} +1 -1
  95. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-B-s11SgN.js → cose-bilkent-S5V4N54A-Cf8RR_8j.js} +2 -2
  96. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-B-s11SgN.js.map → cose-bilkent-S5V4N54A-Cf8RR_8j.js.map} +1 -1
  97. package/webapp/dist/assets/{dagre-KLK3FWXG-DmQFV2qK.js → dagre-KLK3FWXG-C1yQDg-6.js} +7 -7
  98. package/webapp/dist/assets/{dagre-KLK3FWXG-DmQFV2qK.js.map → dagre-KLK3FWXG-C1yQDg-6.js.map} +1 -1
  99. package/webapp/dist/assets/{diagram-E7M64L7V-QRaBfST8.js → diagram-E7M64L7V-CrT4qBJh.js} +8 -8
  100. package/webapp/dist/assets/{diagram-E7M64L7V-QRaBfST8.js.map → diagram-E7M64L7V-CrT4qBJh.js.map} +1 -1
  101. package/webapp/dist/assets/{diagram-IFDJBPK2-lrWn1Obo.js → diagram-IFDJBPK2-B8WaCOcr.js} +7 -7
  102. package/webapp/dist/assets/{diagram-IFDJBPK2-lrWn1Obo.js.map → diagram-IFDJBPK2-B8WaCOcr.js.map} +1 -1
  103. package/webapp/dist/assets/{diagram-P4PSJMXO-sTU7Hh-Y.js → diagram-P4PSJMXO-BCZeNfu_.js} +7 -7
  104. package/webapp/dist/assets/{diagram-P4PSJMXO-sTU7Hh-Y.js.map → diagram-P4PSJMXO-BCZeNfu_.js.map} +1 -1
  105. package/webapp/dist/assets/{erDiagram-INFDFZHY-Cx6jc9Wq.js → erDiagram-INFDFZHY-BrYt0-mW.js} +5 -5
  106. package/webapp/dist/assets/{erDiagram-INFDFZHY-Cx6jc9Wq.js.map → erDiagram-INFDFZHY-BrYt0-mW.js.map} +1 -1
  107. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DfGI49Dz.js → flowDiagram-PKNHOUZH-8lZ5d5y-.js} +7 -7
  108. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DfGI49Dz.js.map → flowDiagram-PKNHOUZH-8lZ5d5y-.js.map} +1 -1
  109. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-nrcHWWaM.js → ganttDiagram-A5KZAMGK-CQ8pOLf-.js} +3 -3
  110. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-nrcHWWaM.js.map → ganttDiagram-A5KZAMGK-CQ8pOLf-.js.map} +1 -1
  111. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-D8ivAqd6.js → gitGraphDiagram-K3NZZRJ6-aOTOe0HP.js} +8 -8
  112. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-D8ivAqd6.js.map → gitGraphDiagram-K3NZZRJ6-aOTOe0HP.js.map} +1 -1
  113. package/webapp/dist/assets/{graph-R5G-y8tB.js → graph-CyMR1egR.js} +3 -3
  114. package/webapp/dist/assets/{graph-R5G-y8tB.js.map → graph-CyMR1egR.js.map} +1 -1
  115. package/webapp/dist/assets/{index--fy89xGh.js → index-B9TTmMv-.js} +550 -134
  116. package/webapp/dist/assets/index-B9TTmMv-.js.map +1 -0
  117. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-PIoZHr7s.js → infoDiagram-LFFYTUFH-CXR9XjRe.js} +6 -6
  118. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-PIoZHr7s.js.map → infoDiagram-LFFYTUFH-CXR9XjRe.js.map} +1 -1
  119. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-oCM-LYk1.js → ishikawaDiagram-PHBUUO56-zwe-cqRW.js} +2 -2
  120. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-oCM-LYk1.js.map → ishikawaDiagram-PHBUUO56-zwe-cqRW.js.map} +1 -1
  121. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-C2qidjQ5.js → journeyDiagram-4ABVD52K-BV-8X5hz.js} +5 -5
  122. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-C2qidjQ5.js.map → journeyDiagram-4ABVD52K-BV-8X5hz.js.map} +1 -1
  123. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-Du0TC8WS.js → kanban-definition-K7BYSVSG-E3W-szUv.js} +3 -3
  124. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-Du0TC8WS.js.map → kanban-definition-K7BYSVSG-E3W-szUv.js.map} +1 -1
  125. package/webapp/dist/assets/{layout-VmEo1OEB.js → layout-DvIjuV8I.js} +5 -5
  126. package/webapp/dist/assets/{layout-VmEo1OEB.js.map → layout-DvIjuV8I.js.map} +1 -1
  127. package/webapp/dist/assets/{linear-B662YHAc.js → linear-C-SIS0ki.js} +2 -2
  128. package/webapp/dist/assets/{linear-B662YHAc.js.map → linear-C-SIS0ki.js.map} +1 -1
  129. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-D7arZj95.js → mindmap-definition-YRQLILUH-wigkPJ2B.js} +4 -4
  130. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-D7arZj95.js.map → mindmap-definition-YRQLILUH-wigkPJ2B.js.map} +1 -1
  131. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DvjPP4PA.js → pieDiagram-SKSYHLDU-BKrYJ0LE.js} +8 -8
  132. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DvjPP4PA.js.map → pieDiagram-SKSYHLDU-BKrYJ0LE.js.map} +1 -1
  133. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-B_JUGMj_.js → quadrantDiagram-337W2JSQ-fjwd0gVY.js} +3 -3
  134. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-B_JUGMj_.js.map → quadrantDiagram-337W2JSQ-fjwd0gVY.js.map} +1 -1
  135. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-DF0mpvE3.js → requirementDiagram-Z7DCOOCP-vgTMObSA.js} +4 -4
  136. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-DF0mpvE3.js.map → requirementDiagram-Z7DCOOCP-vgTMObSA.js.map} +1 -1
  137. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-CoXlxv00.js → sankeyDiagram-WA2Y5GQK-B-ZV3LF7.js} +2 -2
  138. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-CoXlxv00.js.map → sankeyDiagram-WA2Y5GQK-B-ZV3LF7.js.map} +1 -1
  139. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-DYqT5Pg7.js → sequenceDiagram-2WXFIKYE-DPhZYHhW.js} +4 -4
  140. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-DYqT5Pg7.js.map → sequenceDiagram-2WXFIKYE-DPhZYHhW.js.map} +1 -1
  141. package/webapp/dist/assets/{stateDiagram-RAJIS63D-D9b1mN8-.js → stateDiagram-RAJIS63D-DLsw3SC8.js} +9 -9
  142. package/webapp/dist/assets/{stateDiagram-RAJIS63D-D9b1mN8-.js.map → stateDiagram-RAJIS63D-DLsw3SC8.js.map} +1 -1
  143. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-DNzgudL_.js → stateDiagram-v2-FVOUBMTO-DqXB3dNs.js} +5 -5
  144. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-DNzgudL_.js.map → stateDiagram-v2-FVOUBMTO-DqXB3dNs.js.map} +1 -1
  145. package/webapp/dist/assets/{timeline-definition-YZTLITO2-CkyKUY7A.js → timeline-definition-YZTLITO2-BFSqlDfo.js} +3 -3
  146. package/webapp/dist/assets/{timeline-definition-YZTLITO2-CkyKUY7A.js.map → timeline-definition-YZTLITO2-BFSqlDfo.js.map} +1 -1
  147. package/webapp/dist/assets/{treemap-KZPCXAKY-CZd09kF-.js → treemap-KZPCXAKY-sdfq6mHG.js} +5 -5
  148. package/webapp/dist/assets/{treemap-KZPCXAKY-CZd09kF-.js.map → treemap-KZPCXAKY-sdfq6mHG.js.map} +1 -1
  149. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-BxVF5Olo.js → vennDiagram-LZ73GAT5-D7Cioksz.js} +2 -2
  150. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-BxVF5Olo.js.map → vennDiagram-LZ73GAT5-D7Cioksz.js.map} +1 -1
  151. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-BRwRloPc.js → xychartDiagram-JWTSCODW-No65aXqH.js} +3 -3
  152. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-BRwRloPc.js.map → xychartDiagram-JWTSCODW-No65aXqH.js.map} +1 -1
  153. package/webapp/dist/index.html +1 -1
  154. package/webapp/dist/assets/index--fy89xGh.js.map +0 -1
package/dist/server.js CHANGED
@@ -42,7 +42,7 @@ exports.startServer = startServer;
42
42
  * - Provides `/api/*` endpoints and `/ws` WebSocket communication
43
43
  * - CLI bootstrap with optional cwd/port/host/mode parameters
44
44
  * - Development mode: `tsx --watch src/server.ts -p <port> --mode dev`
45
- * - Production mode: `node dist/server.js` (default port 5666)
45
+ * - Production mode: `node dist/server.js` (default port behavior: 5666-)
46
46
  */
47
47
  const path = __importStar(require("path"));
48
48
  const runtime_1 = require("./apps/runtime");
@@ -54,6 +54,7 @@ const reply_special_1 = require("./recovery/reply-special");
54
54
  const work_language_1 = require("./runtime/work-language");
55
55
  const auth_1 = require("./server/auth");
56
56
  const dominds_self_update_1 = require("./server/dominds-self-update");
57
+ const port_selection_1 = require("./server/port-selection");
57
58
  const server_core_1 = require("./server/server-core");
58
59
  const websocket_handler_1 = require("./server/websocket-handler");
59
60
  require("./tools/builtins");
@@ -87,74 +88,131 @@ function parseArgs(argv) {
87
88
  i++;
88
89
  continue;
89
90
  }
91
+ if (a.startsWith('--port=')) {
92
+ out['p'] = a.slice('--port='.length);
93
+ continue;
94
+ }
90
95
  if (a === '-H' || a === '--host') {
91
96
  out['H'] = argv[i + 1];
92
97
  i++;
93
98
  continue;
94
99
  }
100
+ if (a.startsWith('--host=')) {
101
+ out['H'] = a.slice('--host='.length);
102
+ continue;
103
+ }
95
104
  if (a === '--mode') {
96
105
  out['mode'] = argv[i + 1];
97
106
  i++;
98
107
  continue;
99
108
  }
109
+ if (a.startsWith('--mode=')) {
110
+ out['mode'] = a.slice('--mode='.length);
111
+ continue;
112
+ }
100
113
  }
101
114
  return out;
102
115
  }
116
+ function getErrnoCode(error) {
117
+ if (!(error instanceof Error))
118
+ return undefined;
119
+ const withCode = error;
120
+ return typeof withCode.code === 'string' ? withCode.code : undefined;
121
+ }
103
122
  async function startServer(opts = {}) {
104
123
  const { language: resolvedLanguage, source } = (0, work_language_1.resolveWorkLanguage)({ env: process.env });
105
124
  (0, work_language_1.setWorkLanguage)(resolvedLanguage);
106
125
  // Get port and host from options
107
126
  const mode = opts.mode || 'prod';
108
- const port = opts.port ?? 5666;
127
+ const preferredPort = opts.port ?? port_selection_1.DEFAULT_WEBUI_PORT;
128
+ const strictPort = opts.strictPort ?? opts.port !== undefined;
129
+ const portAutoDirection = opts.portAutoDirection ?? 'down';
109
130
  const host = opts.host || '127.0.0.1';
110
131
  const startBackendDriver = opts.startBackendDriver ?? true;
111
- log.info(`Starting server in ${mode} mode on ${host}:${port} (working language: ${(0, work_language_1.getWorkLanguage)()} from ${source})`);
132
+ const portCandidates = (0, port_selection_1.buildWebuiPortCandidates)({
133
+ preferredPort,
134
+ strictPort,
135
+ direction: portAutoDirection,
136
+ });
137
+ log.info(`Starting server in ${mode} mode on ${host}:${preferredPort} (${strictPort ? 'strict port' : `auto port ${portAutoDirection}`}; working language: ${(0, work_language_1.getWorkLanguage)()} from ${source})`);
112
138
  // WebSocket clients set
113
139
  const clients = new Set();
114
- // Create server configuration
115
- const config = {
116
- mode: mode === 'dev' ? 'development' : 'production',
117
- staticRoot: 'webapp/dist',
118
- host,
119
- port,
120
- clients,
121
- auth: (0, auth_1.computeAuthConfig)({
122
- mode: mode === 'dev' ? 'development' : 'production',
123
- env: process.env,
124
- }),
125
- };
126
- const auth = config.auth ?? { kind: 'disabled' };
127
- // Create HTTP server
128
- const httpServer = (0, server_core_1.createHttpServer)(config);
129
- (0, dominds_self_update_1.configureDomindsSelfUpdate)({
130
- host,
131
- port,
132
- mode: config.mode,
133
- stopServer: async () => {
134
- await httpServer.stop();
135
- },
140
+ const serverMode = mode === 'dev' ? 'development' : 'production';
141
+ const auth = (0, auth_1.computeAuthConfig)({
142
+ mode: serverMode,
143
+ env: process.env,
136
144
  });
137
- // Setup WebSocket server
138
- (0, websocket_handler_1.setupWebSocketServer)(httpServer.getHttpServer(), clients, config.auth ?? { kind: 'disabled' }, (0, work_language_1.getWorkLanguage)(), config.mode);
139
- // MCP is best-effort: startup must not be blocked by MCP config/server issues.
140
- (0, supervisor_1.startMcpSupervisor)();
141
- // Apps host is optional for server boot: app failures must stay loud, but they must not block WebUI startup.
145
+ let startedCore = null;
146
+ let boundPort = null;
147
+ for (const candidatePort of portCandidates) {
148
+ const config = {
149
+ mode: serverMode,
150
+ staticRoot: 'webapp/dist',
151
+ host,
152
+ port: candidatePort,
153
+ clients,
154
+ auth,
155
+ };
156
+ const candidateServer = (0, server_core_1.createHttpServer)(config);
157
+ try {
158
+ boundPort = await candidateServer.start();
159
+ (0, websocket_handler_1.setupWebSocketServer)(candidateServer.getHttpServer(), clients, auth, (0, work_language_1.getWorkLanguage)(), config.mode);
160
+ startedCore = candidateServer;
161
+ break;
162
+ }
163
+ catch (error) {
164
+ if (!strictPort && getErrnoCode(error) === 'EADDRINUSE') {
165
+ const nextDirection = portAutoDirection === 'down' ? 'lower' : 'higher';
166
+ log.warn(`WebUI port ${candidatePort} is already in use; trying the next ${nextDirection} port`);
167
+ continue;
168
+ }
169
+ if (boundPort !== null && startedCore === null) {
170
+ await candidateServer.stop();
171
+ }
172
+ throw error;
173
+ }
174
+ }
175
+ if (startedCore === null || boundPort === null) {
176
+ const boundText = (0, port_selection_1.formatWebuiPortScanBound)({
177
+ preferredPort,
178
+ direction: portAutoDirection,
179
+ });
180
+ throw new Error(`Failed to start WebUI: no available port found from ${preferredPort} ${boundText}`);
181
+ }
182
+ if (!strictPort && boundPort !== preferredPort) {
183
+ log.warn(`WebUI preferred port ${preferredPort} was unavailable; listening on ${boundPort}`);
184
+ }
142
185
  try {
143
- await (0, runtime_1.initAppsRuntime)({ rtwsRootAbs: process.cwd(), kernel: { host, port } });
186
+ (0, dominds_self_update_1.configureDomindsSelfUpdate)({
187
+ host,
188
+ port: boundPort,
189
+ mode: serverMode,
190
+ stopServer: async () => {
191
+ await startedCore.stop();
192
+ },
193
+ });
194
+ // MCP is best-effort: startup must not be blocked by MCP config/server issues.
195
+ (0, supervisor_1.startMcpSupervisor)();
196
+ // Apps host is optional for server boot: app failures must stay loud, but they must not block WebUI startup.
197
+ try {
198
+ await (0, runtime_1.initAppsRuntime)({ rtwsRootAbs: process.cwd(), kernel: { host, port: boundPort } });
199
+ }
200
+ catch (error) {
201
+ log.warn('Apps runtime initialization failed during server startup; continuing without app runtime capabilities until the app issue is fixed', error instanceof Error ? error : new Error(String(error)));
202
+ }
203
+ // Crash recovery: any dialogs left in "proceeding" state are surfaced as interrupted/resumable.
204
+ await (0, dialog_display_state_1.reconcileDisplayStatesAfterRestart)();
205
+ await (0, reply_special_1.recoverPendingReplyTellaskCallsAfterRestart)();
206
+ // Tests may opt out so the process can shut down cleanly without a driver stop API.
207
+ if (startBackendDriver) {
208
+ void (0, kernel_driver_1.runBackendDriver)();
209
+ }
144
210
  }
145
211
  catch (error) {
146
- log.warn('Apps runtime initialization failed during server startup; continuing without app runtime capabilities until the app issue is fixed', error instanceof Error ? error : new Error(String(error)));
212
+ await startedCore.stop();
213
+ throw error;
147
214
  }
148
- // Crash recovery: any dialogs left in "proceeding" state are surfaced as interrupted/resumable.
149
- await (0, dialog_display_state_1.reconcileDisplayStatesAfterRestart)();
150
- await (0, reply_special_1.recoverPendingReplyTellaskCallsAfterRestart)();
151
- // Tests may opt out so the process can shut down cleanly without a driver stop API.
152
- if (startBackendDriver) {
153
- void (0, kernel_driver_1.runBackendDriver)();
154
- }
155
- // Start listening
156
- await httpServer.start();
157
- return { httpServer, auth, host, port, mode };
215
+ return { httpServer: startedCore, auth, host, port: boundPort, mode };
158
216
  }
159
217
  // Main function for CLI execution
160
218
  async function main() {
@@ -172,10 +230,17 @@ async function main() {
172
230
  }
173
231
  }
174
232
  // Get port, host, and mode from CLI args
175
- const port = cliArgs['p'] ? Number(cliArgs['p']) : undefined;
233
+ const portSpecRaw = cliArgs['p'];
234
+ const parsedPort = typeof portSpecRaw === 'string' ? (0, port_selection_1.parseWebuiPortSpec)(portSpecRaw) : undefined;
235
+ if (portSpecRaw !== undefined && parsedPort === null) {
236
+ throw new Error('Invalid --port value: expected a port number, optionally suffixed with + or -');
237
+ }
238
+ const port = parsedPort?.port;
239
+ const strictPort = parsedPort?.strictPort;
240
+ const portAutoDirection = parsedPort?.portAutoDirection;
176
241
  const host = cliArgs['H'] || undefined;
177
242
  const mode = cliArgs['mode'] || undefined;
178
- await startServer({ port, host, mode });
243
+ await startServer({ port, host, mode, strictPort, portAutoDirection });
179
244
  }
180
245
  // Start server if this file is run directly
181
246
  if (require.main === module) {
package/dist/team.d.ts CHANGED
@@ -152,9 +152,8 @@ export declare namespace Team {
152
152
  setStreaming(streaming: boolean | undefined): void;
153
153
  setHidden(hidden: boolean | undefined): void;
154
154
  /**
155
- * Returns a flat list of Tool objects by resolving toolsets and merging with individual tools.
156
- * Honors declaration order of toolsets and tools. Logs warnings for duplicate tool names
157
- * that resolve to different Tool objects. Returns no duplicate tools per name.
155
+ * Returns a flat list of assignable toolset names after expanding wildcards and exclusions.
156
+ * Honors declaration order and returns each toolset at most once.
158
157
  */
159
158
  listResolvedToolsetNames(options?: {
160
159
  onMissing?: 'warn' | 'silent';
package/dist/team.js CHANGED
@@ -566,9 +566,8 @@ exports.Team = Team;
566
566
  this.hidden = hidden;
567
567
  }
568
568
  /**
569
- * Returns a flat list of Tool objects by resolving toolsets and merging with individual tools.
570
- * Honors declaration order of toolsets and tools. Logs warnings for duplicate tool names
571
- * that resolve to different Tool objects. Returns no duplicate tools per name.
569
+ * Returns a flat list of assignable toolset names after expanding wildcards and exclusions.
570
+ * Honors declaration order and returns each toolset at most once.
572
571
  */
573
572
  listResolvedToolsetNames(options) {
574
573
  const onMissing = options?.onMissing ?? 'warn';
@@ -586,11 +585,12 @@ exports.Team = Team;
586
585
  }
587
586
  const resolved = [];
588
587
  const seen = new Set();
588
+ const isAssignableToolset = (name) => (0, registry_1.getToolsetMeta)(name)?.assignable !== false;
589
589
  for (const toolsetName of [...staticToolsets, ...dynamicToolsetNames]) {
590
590
  if (toolsetName.startsWith('!'))
591
591
  continue;
592
592
  const toolsetNames = toolsetName === '*'
593
- ? Object.keys((0, registry_1.listToolsets)()).filter((n) => !excludedToolsets.has(n))
593
+ ? Object.keys((0, registry_1.listToolsets)()).filter((n) => !excludedToolsets.has(n) && isAssignableToolset(n))
594
594
  : excludedToolsets.has(toolsetName)
595
595
  ? []
596
596
  : [toolsetName];
@@ -611,6 +611,12 @@ exports.Team = Team;
611
611
  }
612
612
  continue;
613
613
  }
614
+ if (!isAssignableToolset(resolvedToolsetName)) {
615
+ if (onMissing === 'warn') {
616
+ log_1.log.warn(`Toolset '${resolvedToolsetName}' is intrinsic and cannot be assigned in team config for member '${this.id}'`);
617
+ }
618
+ continue;
619
+ }
614
620
  resolved.push(resolvedToolsetName);
615
621
  seen.add(resolvedToolsetName);
616
622
  }
@@ -818,6 +824,13 @@ exports.Team = Team;
818
824
  for (const toolsetName of args.toolsets) {
819
825
  const registeredMeta = (0, registry_1.getToolsetMeta)(toolsetName);
820
826
  if (registeredToolsets.has(toolsetName)) {
827
+ if (registeredMeta?.assignable === false) {
828
+ addIssue(`${args.idPrefix}/toolsets/${sanitizeProblemIdSegment(toolsetName)}/not_assignable`, `Invalid .minds/team.yaml: ${args.atPrefix}.toolsets contains an intrinsic toolset that cannot be assigned.`, [
829
+ `Resolved ${args.atPrefix}.toolsets includes '${toolsetName}', but '${toolsetName}' is injected by Dominds at runtime according to dialog scope.`,
830
+ `Remove '${toolsetName}' from ${args.atPrefix}.toolsets; do not grant intrinsic tools through team config.`,
831
+ ].join('\n'));
832
+ continue;
833
+ }
821
834
  if (registeredMeta?.source === 'app') {
822
835
  continue;
823
836
  }
@@ -96,8 +96,10 @@ function manualSpecFor(toolsetId) {
96
96
  (0, registry_1.registerTool)(ctrl_1.deleteReminderTool);
97
97
  (0, registry_1.registerTool)(ctrl_1.updateReminderTool);
98
98
  (0, registry_1.registerTool)(ctrl_1.clearMindTool);
99
+ (0, registry_1.registerTool)(ctrl_1.doMindTool);
99
100
  (0, registry_1.registerTool)(ctrl_1.changeMindTool);
100
101
  (0, registry_1.registerTool)(ctrl_1.mindMoreTool);
102
+ (0, registry_1.registerTool)(ctrl_1.neverMindTool);
101
103
  (0, registry_1.registerTool)(ctrl_1.recallTaskdocTool);
102
104
  // Team management tools (scoped to `.minds/**`)
103
105
  for (const tool of team_mgmt_1.teamMgmtTools) {
@@ -139,12 +141,15 @@ for (const tool of team_mgmt_1.teamMgmtTools) {
139
141
  ctrl_1.deleteReminderTool,
140
142
  ctrl_1.updateReminderTool,
141
143
  ctrl_1.clearMindTool,
144
+ ctrl_1.doMindTool,
142
145
  ctrl_1.changeMindTool,
143
146
  ctrl_1.mindMoreTool,
147
+ ctrl_1.neverMindTool,
144
148
  ctrl_1.recallTaskdocTool,
145
149
  ]);
146
150
  (0, registry_1.setToolsetMeta)('control', {
147
151
  source: 'dominds',
152
+ assignable: false,
148
153
  descriptionI18n: {
149
154
  en: 'Dialog control: manage reminders, Taskdoc sections, and course resets.',
150
155
  zh: '对话控制:维护提醒项、差遣牒分段,并管理对话进程重置。',
@@ -1,20 +1,22 @@
1
1
  /**
2
2
  * Module: tools/ctrl
3
3
  *
4
- * Intrinsic dialog control tools - ALWAYS AVAILABLE TO ALL AGENTS
4
+ * Intrinsic dialog control tools.
5
5
  *
6
- * These tools are automatically included for every agent without needing to be
7
- * explicitly listed in team.yaml toolsets or tools configuration. They provide
8
- * core functionality for reminder management and mind control that should be
9
- * universally accessible.
6
+ * These tools are injected by runtime according to dialog scope without needing
7
+ * to be explicitly listed in team.yaml toolsets or tools configuration. Reminder
8
+ * and course-control tools are available in all dialog scopes; Taskdoc mutation
9
+ * tools are only exposed in Main Dialogs.
10
10
  *
11
11
  * INTRINSIC TOOLS:
12
12
  * - add_reminder: Add a reminder
13
13
  * - delete_reminder: Delete a reminder by id
14
14
  * - update_reminder: Update reminder content
15
15
  * - clear_mind: Start a new course, optionally add a reminder
16
- * - change_mind: Update a `.tsk/` Taskdoc section without starting a new course
17
- * - mind_more: Append entries to a `.tsk/` Taskdoc section without starting a new course
16
+ * - do_mind: Main Dialog only; create a new `.tsk/` Taskdoc section without starting a new course
17
+ * - change_mind: Main Dialog only; update a `.tsk/` Taskdoc section without starting a new course
18
+ * - mind_more: Main Dialog only; append entries to a `.tsk/` Taskdoc section without starting a new course
19
+ * - never_mind: Main Dialog only; delete a `.tsk/` Taskdoc section file without starting a new course
18
20
  * - recall_taskdoc: Read a Taskdoc section from `*.tsk/` by (category, selector)
19
21
  *
20
22
  * USAGE CONTEXT:
@@ -32,5 +34,7 @@ export declare const addReminderTool: FuncTool;
32
34
  export declare const updateReminderTool: FuncTool;
33
35
  export declare const clearMindTool: FuncTool;
34
36
  export declare const changeMindTool: FuncTool;
37
+ export declare const doMindTool: FuncTool;
38
+ export declare const neverMindTool: FuncTool;
35
39
  export declare const mindMoreTool: FuncTool;
36
40
  export declare const recallTaskdocTool: FuncTool;