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.
- package/README.md +4 -4
- package/README.zh.md +2 -2
- package/dist/access-control.js +2 -2
- package/dist/cli/webui.d.ts +1 -1
- package/dist/cli/webui.js +29 -9
- package/dist/docs/OEC-philosophy.md +1 -1
- package/dist/docs/cli-usage.md +2 -1
- package/dist/docs/cli-usage.zh.md +6 -3
- package/dist/docs/context-health.md +2 -2
- package/dist/docs/context-health.zh.md +2 -2
- package/dist/docs/design.md +3 -3
- package/dist/docs/design.zh.md +3 -3
- package/dist/docs/dialog-system.md +18 -10
- package/dist/docs/dialog-system.zh.md +18 -10
- package/dist/docs/dominds-terminology.md +4 -4
- package/dist/docs/encapsulated-taskdoc.md +17 -10
- package/dist/docs/encapsulated-taskdoc.zh.md +18 -11
- package/dist/minds/load.js +15 -4
- package/dist/minds/minds-i18n.js +2 -2
- package/dist/minds/system-prompt-parts.js +11 -11
- package/dist/runtime/driver-messages.js +8 -4
- package/dist/server/api-routes.js +65 -0
- package/dist/server/port-selection.d.ts +19 -0
- package/dist/server/port-selection.js +57 -0
- package/dist/server/server-core.d.ts +2 -2
- package/dist/server/server-core.js +21 -7
- package/dist/server/static-server.js +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.js +109 -44
- package/dist/team.d.ts +2 -3
- package/dist/team.js +17 -4
- package/dist/tools/builtins.js +5 -0
- package/dist/tools/ctrl.d.ts +11 -7
- package/dist/tools/ctrl.js +248 -34
- package/dist/tools/prompts/control/en/errors.md +2 -2
- package/dist/tools/prompts/control/en/index.md +1 -1
- package/dist/tools/prompts/control/en/principles.md +14 -12
- package/dist/tools/prompts/control/en/tools.md +40 -6
- package/dist/tools/prompts/control/zh/errors.md +2 -2
- package/dist/tools/prompts/control/zh/index.md +1 -1
- package/dist/tools/prompts/control/zh/principles.md +14 -12
- package/dist/tools/prompts/control/zh/tools.md +40 -6
- package/dist/tools/prompts/personal_memory/en/principles.md +1 -1
- package/dist/tools/prompts/personal_memory/zh/principles.md +1 -1
- package/dist/tools/prompts/team_memory/en/principles.md +1 -1
- package/dist/tools/prompts/team_memory/zh/principles.md +1 -1
- package/dist/tools/registry.d.ts +6 -0
- package/dist/tools/team_mgmt.js +5 -5
- package/dist/utils/task-package.d.ts +24 -1
- package/dist/utils/task-package.js +80 -5
- package/dist/utils/taskdoc-search-worker-client.d.ts +12 -0
- package/dist/utils/taskdoc-search-worker-client.js +320 -0
- package/dist/utils/taskdoc-search-worker.d.ts +1 -0
- package/dist/utils/taskdoc-search-worker.js +42 -0
- package/dist/utils/taskdoc-search.d.ts +28 -7
- package/dist/utils/taskdoc-search.js +62 -15
- package/dist/utils/taskdoc.js +60 -22
- package/package.json +3 -3
- package/webapp/dist/assets/{_basePickBy-B7M9Q0Fa.js → _basePickBy-BrC49DPW.js} +3 -3
- package/webapp/dist/assets/{_basePickBy-B7M9Q0Fa.js.map → _basePickBy-BrC49DPW.js.map} +1 -1
- package/webapp/dist/assets/{_baseUniq-DAeYoL6j.js → _baseUniq-C_Wcx-_S.js} +2 -2
- package/webapp/dist/assets/{_baseUniq-DAeYoL6j.js.map → _baseUniq-C_Wcx-_S.js.map} +1 -1
- package/webapp/dist/assets/{arc-Bh4nDbNR.js → arc-X5iIdpx0.js} +2 -2
- package/webapp/dist/assets/{arc-Bh4nDbNR.js.map → arc-X5iIdpx0.js.map} +1 -1
- package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CxqmdsIm.js → architectureDiagram-2XIMDMQ5-DFfhMGkT.js} +7 -7
- package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CxqmdsIm.js.map → architectureDiagram-2XIMDMQ5-DFfhMGkT.js.map} +1 -1
- package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-CxIWLtpt.js → blockDiagram-WCTKOSBZ-BAt4BaxZ.js} +7 -7
- package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-CxIWLtpt.js.map → blockDiagram-WCTKOSBZ-BAt4BaxZ.js.map} +1 -1
- package/webapp/dist/assets/{c4Diagram-IC4MRINW-1qErOIgG.js → c4Diagram-IC4MRINW-BYxKH5AA.js} +3 -3
- package/webapp/dist/assets/{c4Diagram-IC4MRINW-1qErOIgG.js.map → c4Diagram-IC4MRINW-BYxKH5AA.js.map} +1 -1
- package/webapp/dist/assets/{channel-DkgZHNUe.js → channel-CuYhL59H.js} +2 -2
- package/webapp/dist/assets/{channel-DkgZHNUe.js.map → channel-CuYhL59H.js.map} +1 -1
- package/webapp/dist/assets/{chunk-4BX2VUAB-BmdMbU9v.js → chunk-4BX2VUAB-Ch1PfLiD.js} +2 -2
- package/webapp/dist/assets/{chunk-4BX2VUAB-BmdMbU9v.js.map → chunk-4BX2VUAB-Ch1PfLiD.js.map} +1 -1
- package/webapp/dist/assets/{chunk-55IACEB6-D6LDTDBy.js → chunk-55IACEB6-B3rzakPd.js} +2 -2
- package/webapp/dist/assets/{chunk-55IACEB6-D6LDTDBy.js.map → chunk-55IACEB6-B3rzakPd.js.map} +1 -1
- package/webapp/dist/assets/{chunk-FMBD7UC4-C-BdCe4C.js → chunk-FMBD7UC4-CCZWJRJ5.js} +2 -2
- package/webapp/dist/assets/{chunk-FMBD7UC4-C-BdCe4C.js.map → chunk-FMBD7UC4-CCZWJRJ5.js.map} +1 -1
- package/webapp/dist/assets/{chunk-JSJVCQXG-WA_BLIm9.js → chunk-JSJVCQXG-Dqd_MOPD.js} +2 -2
- package/webapp/dist/assets/{chunk-JSJVCQXG-WA_BLIm9.js.map → chunk-JSJVCQXG-Dqd_MOPD.js.map} +1 -1
- package/webapp/dist/assets/{chunk-KX2RTZJC-CA7sDJO5.js → chunk-KX2RTZJC-DOpPZD_q.js} +2 -2
- package/webapp/dist/assets/{chunk-KX2RTZJC-CA7sDJO5.js.map → chunk-KX2RTZJC-DOpPZD_q.js.map} +1 -1
- package/webapp/dist/assets/{chunk-NQ4KR5QH-wlvxalE3.js → chunk-NQ4KR5QH-CUj2LNV0.js} +4 -4
- package/webapp/dist/assets/{chunk-NQ4KR5QH-wlvxalE3.js.map → chunk-NQ4KR5QH-CUj2LNV0.js.map} +1 -1
- package/webapp/dist/assets/{chunk-QZHKN3VN-Bo1VMcph.js → chunk-QZHKN3VN-DXeWDyzh.js} +2 -2
- package/webapp/dist/assets/{chunk-QZHKN3VN-Bo1VMcph.js.map → chunk-QZHKN3VN-DXeWDyzh.js.map} +1 -1
- package/webapp/dist/assets/{chunk-WL4C6EOR-B-Pk44be.js → chunk-WL4C6EOR-CqTowzs6.js} +6 -6
- package/webapp/dist/assets/{chunk-WL4C6EOR-B-Pk44be.js.map → chunk-WL4C6EOR-CqTowzs6.js.map} +1 -1
- package/webapp/dist/assets/{classDiagram-VBA2DB6C-BqKuyb49.js → classDiagram-VBA2DB6C-CvsxEN3D.js} +7 -7
- package/webapp/dist/assets/{classDiagram-VBA2DB6C-BqKuyb49.js.map → classDiagram-VBA2DB6C-CvsxEN3D.js.map} +1 -1
- package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-BqKuyb49.js → classDiagram-v2-RAHNMMFH-CvsxEN3D.js} +7 -7
- package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-BqKuyb49.js.map → classDiagram-v2-RAHNMMFH-CvsxEN3D.js.map} +1 -1
- package/webapp/dist/assets/{clone-BX5z8WVZ.js → clone-PGWIYNYc.js} +2 -2
- package/webapp/dist/assets/{clone-BX5z8WVZ.js.map → clone-PGWIYNYc.js.map} +1 -1
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-B-s11SgN.js → cose-bilkent-S5V4N54A-Cf8RR_8j.js} +2 -2
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-B-s11SgN.js.map → cose-bilkent-S5V4N54A-Cf8RR_8j.js.map} +1 -1
- package/webapp/dist/assets/{dagre-KLK3FWXG-DmQFV2qK.js → dagre-KLK3FWXG-C1yQDg-6.js} +7 -7
- package/webapp/dist/assets/{dagre-KLK3FWXG-DmQFV2qK.js.map → dagre-KLK3FWXG-C1yQDg-6.js.map} +1 -1
- package/webapp/dist/assets/{diagram-E7M64L7V-QRaBfST8.js → diagram-E7M64L7V-CrT4qBJh.js} +8 -8
- package/webapp/dist/assets/{diagram-E7M64L7V-QRaBfST8.js.map → diagram-E7M64L7V-CrT4qBJh.js.map} +1 -1
- package/webapp/dist/assets/{diagram-IFDJBPK2-lrWn1Obo.js → diagram-IFDJBPK2-B8WaCOcr.js} +7 -7
- package/webapp/dist/assets/{diagram-IFDJBPK2-lrWn1Obo.js.map → diagram-IFDJBPK2-B8WaCOcr.js.map} +1 -1
- package/webapp/dist/assets/{diagram-P4PSJMXO-sTU7Hh-Y.js → diagram-P4PSJMXO-BCZeNfu_.js} +7 -7
- package/webapp/dist/assets/{diagram-P4PSJMXO-sTU7Hh-Y.js.map → diagram-P4PSJMXO-BCZeNfu_.js.map} +1 -1
- package/webapp/dist/assets/{erDiagram-INFDFZHY-Cx6jc9Wq.js → erDiagram-INFDFZHY-BrYt0-mW.js} +5 -5
- package/webapp/dist/assets/{erDiagram-INFDFZHY-Cx6jc9Wq.js.map → erDiagram-INFDFZHY-BrYt0-mW.js.map} +1 -1
- package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DfGI49Dz.js → flowDiagram-PKNHOUZH-8lZ5d5y-.js} +7 -7
- package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DfGI49Dz.js.map → flowDiagram-PKNHOUZH-8lZ5d5y-.js.map} +1 -1
- package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-nrcHWWaM.js → ganttDiagram-A5KZAMGK-CQ8pOLf-.js} +3 -3
- package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-nrcHWWaM.js.map → ganttDiagram-A5KZAMGK-CQ8pOLf-.js.map} +1 -1
- package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-D8ivAqd6.js → gitGraphDiagram-K3NZZRJ6-aOTOe0HP.js} +8 -8
- package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-D8ivAqd6.js.map → gitGraphDiagram-K3NZZRJ6-aOTOe0HP.js.map} +1 -1
- package/webapp/dist/assets/{graph-R5G-y8tB.js → graph-CyMR1egR.js} +3 -3
- package/webapp/dist/assets/{graph-R5G-y8tB.js.map → graph-CyMR1egR.js.map} +1 -1
- package/webapp/dist/assets/{index--fy89xGh.js → index-B9TTmMv-.js} +550 -134
- package/webapp/dist/assets/index-B9TTmMv-.js.map +1 -0
- package/webapp/dist/assets/{infoDiagram-LFFYTUFH-PIoZHr7s.js → infoDiagram-LFFYTUFH-CXR9XjRe.js} +6 -6
- package/webapp/dist/assets/{infoDiagram-LFFYTUFH-PIoZHr7s.js.map → infoDiagram-LFFYTUFH-CXR9XjRe.js.map} +1 -1
- package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-oCM-LYk1.js → ishikawaDiagram-PHBUUO56-zwe-cqRW.js} +2 -2
- package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-oCM-LYk1.js.map → ishikawaDiagram-PHBUUO56-zwe-cqRW.js.map} +1 -1
- package/webapp/dist/assets/{journeyDiagram-4ABVD52K-C2qidjQ5.js → journeyDiagram-4ABVD52K-BV-8X5hz.js} +5 -5
- package/webapp/dist/assets/{journeyDiagram-4ABVD52K-C2qidjQ5.js.map → journeyDiagram-4ABVD52K-BV-8X5hz.js.map} +1 -1
- package/webapp/dist/assets/{kanban-definition-K7BYSVSG-Du0TC8WS.js → kanban-definition-K7BYSVSG-E3W-szUv.js} +3 -3
- package/webapp/dist/assets/{kanban-definition-K7BYSVSG-Du0TC8WS.js.map → kanban-definition-K7BYSVSG-E3W-szUv.js.map} +1 -1
- package/webapp/dist/assets/{layout-VmEo1OEB.js → layout-DvIjuV8I.js} +5 -5
- package/webapp/dist/assets/{layout-VmEo1OEB.js.map → layout-DvIjuV8I.js.map} +1 -1
- package/webapp/dist/assets/{linear-B662YHAc.js → linear-C-SIS0ki.js} +2 -2
- package/webapp/dist/assets/{linear-B662YHAc.js.map → linear-C-SIS0ki.js.map} +1 -1
- package/webapp/dist/assets/{mindmap-definition-YRQLILUH-D7arZj95.js → mindmap-definition-YRQLILUH-wigkPJ2B.js} +4 -4
- package/webapp/dist/assets/{mindmap-definition-YRQLILUH-D7arZj95.js.map → mindmap-definition-YRQLILUH-wigkPJ2B.js.map} +1 -1
- package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DvjPP4PA.js → pieDiagram-SKSYHLDU-BKrYJ0LE.js} +8 -8
- package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DvjPP4PA.js.map → pieDiagram-SKSYHLDU-BKrYJ0LE.js.map} +1 -1
- package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-B_JUGMj_.js → quadrantDiagram-337W2JSQ-fjwd0gVY.js} +3 -3
- package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-B_JUGMj_.js.map → quadrantDiagram-337W2JSQ-fjwd0gVY.js.map} +1 -1
- package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-DF0mpvE3.js → requirementDiagram-Z7DCOOCP-vgTMObSA.js} +4 -4
- package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-DF0mpvE3.js.map → requirementDiagram-Z7DCOOCP-vgTMObSA.js.map} +1 -1
- package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-CoXlxv00.js → sankeyDiagram-WA2Y5GQK-B-ZV3LF7.js} +2 -2
- package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-CoXlxv00.js.map → sankeyDiagram-WA2Y5GQK-B-ZV3LF7.js.map} +1 -1
- package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-DYqT5Pg7.js → sequenceDiagram-2WXFIKYE-DPhZYHhW.js} +4 -4
- package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-DYqT5Pg7.js.map → sequenceDiagram-2WXFIKYE-DPhZYHhW.js.map} +1 -1
- package/webapp/dist/assets/{stateDiagram-RAJIS63D-D9b1mN8-.js → stateDiagram-RAJIS63D-DLsw3SC8.js} +9 -9
- package/webapp/dist/assets/{stateDiagram-RAJIS63D-D9b1mN8-.js.map → stateDiagram-RAJIS63D-DLsw3SC8.js.map} +1 -1
- package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-DNzgudL_.js → stateDiagram-v2-FVOUBMTO-DqXB3dNs.js} +5 -5
- package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-DNzgudL_.js.map → stateDiagram-v2-FVOUBMTO-DqXB3dNs.js.map} +1 -1
- package/webapp/dist/assets/{timeline-definition-YZTLITO2-CkyKUY7A.js → timeline-definition-YZTLITO2-BFSqlDfo.js} +3 -3
- package/webapp/dist/assets/{timeline-definition-YZTLITO2-CkyKUY7A.js.map → timeline-definition-YZTLITO2-BFSqlDfo.js.map} +1 -1
- package/webapp/dist/assets/{treemap-KZPCXAKY-CZd09kF-.js → treemap-KZPCXAKY-sdfq6mHG.js} +5 -5
- package/webapp/dist/assets/{treemap-KZPCXAKY-CZd09kF-.js.map → treemap-KZPCXAKY-sdfq6mHG.js.map} +1 -1
- package/webapp/dist/assets/{vennDiagram-LZ73GAT5-BxVF5Olo.js → vennDiagram-LZ73GAT5-D7Cioksz.js} +2 -2
- package/webapp/dist/assets/{vennDiagram-LZ73GAT5-BxVF5Olo.js.map → vennDiagram-LZ73GAT5-D7Cioksz.js.map} +1 -1
- package/webapp/dist/assets/{xychartDiagram-JWTSCODW-BRwRloPc.js → xychartDiagram-JWTSCODW-No65aXqH.js} +3 -3
- package/webapp/dist/assets/{xychartDiagram-JWTSCODW-BRwRloPc.js.map → xychartDiagram-JWTSCODW-No65aXqH.js.map} +1 -1
- package/webapp/dist/index.html +1 -1
- 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
|
|
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
|
-
|
|
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
|
-
|
|
115
|
-
const
|
|
116
|
-
mode:
|
|
117
|
-
|
|
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
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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
|
-
|
|
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
|
-
|
|
212
|
+
await startedCore.stop();
|
|
213
|
+
throw error;
|
|
147
214
|
}
|
|
148
|
-
|
|
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
|
|
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
|
|
156
|
-
* Honors declaration order
|
|
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
|
|
570
|
-
* Honors declaration order
|
|
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
|
}
|
package/dist/tools/builtins.js
CHANGED
|
@@ -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: '对话控制:维护提醒项、差遣牒分段,并管理对话进程重置。',
|
package/dist/tools/ctrl.d.ts
CHANGED
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Module: tools/ctrl
|
|
3
3
|
*
|
|
4
|
-
* Intrinsic dialog control tools
|
|
4
|
+
* Intrinsic dialog control tools.
|
|
5
5
|
*
|
|
6
|
-
* These tools are
|
|
7
|
-
* explicitly listed in team.yaml toolsets or tools configuration.
|
|
8
|
-
*
|
|
9
|
-
*
|
|
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
|
-
* -
|
|
17
|
-
* -
|
|
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;
|