dominds 1.6.7 → 1.7.0
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/dist/apps/installed-file.js +207 -0
- package/dist/apps/runtime-port.js +91 -0
- package/dist/course-transition.js +40 -12
- package/dist/dialog-fork.js +10 -6
- package/dist/dialog.js +12 -12
- package/dist/docs/kernel-app-architecture.md +286 -0
- package/dist/docs/kernel-app-architecture.zh.md +285 -0
- package/dist/llm/driver-entry.js +28 -0
- package/dist/llm/driver-v2/context-health.js +121 -0
- package/dist/llm/driver-v2/context.js +56 -0
- package/dist/llm/driver-v2/core.js +1545 -0
- package/dist/llm/driver-v2/index.js +26 -0
- package/dist/llm/driver-v2/orchestrator.js +158 -0
- package/dist/llm/driver-v2/policy.js +129 -0
- package/dist/llm/driver-v2/restore-dialog-hierarchy.js +73 -0
- package/dist/llm/driver-v2/round.js +366 -0
- package/dist/llm/driver-v2/runtime-utils.js +365 -0
- package/dist/llm/driver-v2/saying-events.js +20 -0
- package/dist/llm/driver-v2/subdialog-txn.js +42 -0
- package/dist/llm/driver-v2/supdialog-response.js +400 -0
- package/dist/llm/driver-v2/tellask-bridge.js +1148 -0
- package/dist/llm/driver-v2/types.js +10 -0
- package/dist/llm/driver-v2-ref-only/context-health.js +121 -0
- package/dist/llm/driver-v2-ref-only/context.js +17 -0
- package/dist/llm/driver-v2-ref-only/core.js +1710 -0
- package/dist/llm/driver-v2-ref-only/index.js +26 -0
- package/dist/llm/driver-v2-ref-only/orchestrator.js +158 -0
- package/dist/llm/driver-v2-ref-only/policy.js +129 -0
- package/dist/llm/driver-v2-ref-only/restore-dialog-hierarchy.js +73 -0
- package/dist/llm/driver-v2-ref-only/round.js +366 -0
- package/dist/llm/driver-v2-ref-only/runtime-utils.js +473 -0
- package/dist/llm/driver-v2-ref-only/saying-events.js +18 -0
- package/dist/llm/driver-v2-ref-only/subdialog-txn.js +42 -0
- package/dist/llm/driver-v2-ref-only/supdialog-response.js +453 -0
- package/dist/llm/driver-v2-ref-only/tellask-bridge.js +1178 -0
- package/dist/llm/driver-v2-ref-only/types.js +10 -0
- package/dist/llm/gen/anthropic.js +1 -1
- package/dist/llm/gen/codex.js +1 -0
- package/dist/llm/gen/mock.js +5 -0
- package/dist/llm/gen/openai-compatible.js +1 -0
- package/dist/llm/gen/openai.js +1 -0
- package/dist/llm/kernel-driver/context.js +7 -2
- package/dist/llm/kernel-driver/drive.js +1 -1
- package/dist/llm/kernel-driver/flow.js +2 -2
- package/dist/llm/kernel-driver/subdialog.js +42 -14
- package/dist/llm/kernel-driver/tellask-special.js +11 -11
- package/dist/persistence.js +361 -73
- package/dist/priming.js +203 -27
- package/dist/server/websocket-handler.js +1 -1
- package/dist/shared/utils/inter-dialog-format.js +79 -2
- package/dist/static/assets/{_basePickBy-B9gw9xu3.js → _basePickBy-B5JpcIlf.js} +3 -3
- package/dist/static/assets/{_basePickBy-B9gw9xu3.js.map → _basePickBy-B5JpcIlf.js.map} +1 -1
- package/dist/static/assets/{_baseUniq-CdteP2Ad.js → _baseUniq-B6ENA5xp.js} +2 -2
- package/dist/static/assets/{_baseUniq-CdteP2Ad.js.map → _baseUniq-B6ENA5xp.js.map} +1 -1
- package/dist/static/assets/{arc-BaFSInZP.js → arc-CztgHQ6S.js} +2 -2
- package/dist/static/assets/{arc-BaFSInZP.js.map → arc-CztgHQ6S.js.map} +1 -1
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-kO0ROBqa.js → architectureDiagram-VXUJARFQ-CdI-KLc0.js} +7 -7
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-kO0ROBqa.js.map → architectureDiagram-VXUJARFQ-CdI-KLc0.js.map} +1 -1
- package/dist/static/assets/{blockDiagram-VD42YOAC-D766EIYA.js → blockDiagram-VD42YOAC-BALBf4XM.js} +7 -7
- package/dist/static/assets/{blockDiagram-VD42YOAC-D766EIYA.js.map → blockDiagram-VD42YOAC-BALBf4XM.js.map} +1 -1
- package/dist/static/assets/{c4Diagram-YG6GDRKO-DwL98wWS.js → c4Diagram-YG6GDRKO-a1k6yPrP.js} +3 -3
- package/dist/static/assets/{c4Diagram-YG6GDRKO-DwL98wWS.js.map → c4Diagram-YG6GDRKO-a1k6yPrP.js.map} +1 -1
- package/dist/static/assets/{channel-CcUPWS87.js → channel-CWNdqJ-I.js} +2 -2
- package/dist/static/assets/{channel-CcUPWS87.js.map → channel-CWNdqJ-I.js.map} +1 -1
- package/dist/static/assets/{chunk-4BX2VUAB-BeTSwCuA.js → chunk-4BX2VUAB-BQeTUB5q.js} +2 -2
- package/dist/static/assets/{chunk-4BX2VUAB-BeTSwCuA.js.map → chunk-4BX2VUAB-BQeTUB5q.js.map} +1 -1
- package/dist/static/assets/{chunk-55IACEB6-C6Tzr8i_.js → chunk-55IACEB6-DDefFY4X.js} +2 -2
- package/dist/static/assets/{chunk-55IACEB6-C6Tzr8i_.js.map → chunk-55IACEB6-DDefFY4X.js.map} +1 -1
- package/dist/static/assets/{chunk-B4BG7PRW-DSi9x25j.js → chunk-B4BG7PRW-B3r4W-g_.js} +5 -5
- package/dist/static/assets/{chunk-B4BG7PRW-DSi9x25j.js.map → chunk-B4BG7PRW-B3r4W-g_.js.map} +1 -1
- package/dist/static/assets/{chunk-DI55MBZ5-CfAPRphL.js → chunk-DI55MBZ5-BDKIjQbt.js} +4 -4
- package/dist/static/assets/{chunk-DI55MBZ5-CfAPRphL.js.map → chunk-DI55MBZ5-BDKIjQbt.js.map} +1 -1
- package/dist/static/assets/{chunk-FMBD7UC4-B-M6vSiI.js → chunk-FMBD7UC4-BRjO7LO2.js} +2 -2
- package/dist/static/assets/{chunk-FMBD7UC4-B-M6vSiI.js.map → chunk-FMBD7UC4-BRjO7LO2.js.map} +1 -1
- package/dist/static/assets/{chunk-QN33PNHL-yU2oNaRc.js → chunk-QN33PNHL-DtUbDqMq.js} +2 -2
- package/dist/static/assets/{chunk-QN33PNHL-yU2oNaRc.js.map → chunk-QN33PNHL-DtUbDqMq.js.map} +1 -1
- package/dist/static/assets/{chunk-QZHKN3VN-jPTrvtzO.js → chunk-QZHKN3VN-HvxW4tgI.js} +2 -2
- package/dist/static/assets/{chunk-QZHKN3VN-jPTrvtzO.js.map → chunk-QZHKN3VN-HvxW4tgI.js.map} +1 -1
- package/dist/static/assets/{chunk-TZMSLE5B-Bls_D3TM.js → chunk-TZMSLE5B-8kvbFL8c.js} +2 -2
- package/dist/static/assets/{chunk-TZMSLE5B-Bls_D3TM.js.map → chunk-TZMSLE5B-8kvbFL8c.js.map} +1 -1
- package/dist/static/assets/{classDiagram-2ON5EDUG-6HSV8O5b.js → classDiagram-2ON5EDUG-BT0K1-Ue.js} +6 -6
- package/dist/static/assets/{classDiagram-2ON5EDUG-6HSV8O5b.js.map → classDiagram-2ON5EDUG-BT0K1-Ue.js.map} +1 -1
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-6HSV8O5b.js → classDiagram-v2-WZHVMYZB-BT0K1-Ue.js} +6 -6
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-6HSV8O5b.js.map → classDiagram-v2-WZHVMYZB-BT0K1-Ue.js.map} +1 -1
- package/dist/static/assets/{clone-CtKoD5Su.js → clone-C8ji-9VG.js} +2 -2
- package/dist/static/assets/{clone-CtKoD5Su.js.map → clone-C8ji-9VG.js.map} +1 -1
- package/dist/static/assets/{cose-bilkent-S5V4N54A-C8Q_0ZER.js → cose-bilkent-S5V4N54A-DgZIHStr.js} +2 -2
- package/dist/static/assets/{cose-bilkent-S5V4N54A-C8Q_0ZER.js.map → cose-bilkent-S5V4N54A-DgZIHStr.js.map} +1 -1
- package/dist/static/assets/{dagre-6UL2VRFP-CYIohfVW.js → dagre-6UL2VRFP-CoLMSS7V.js} +7 -7
- package/dist/static/assets/{dagre-6UL2VRFP-CYIohfVW.js.map → dagre-6UL2VRFP-CoLMSS7V.js.map} +1 -1
- package/dist/static/assets/{diagram-PSM6KHXK-BTYKp-4w.js → diagram-PSM6KHXK-BbaRu7Ko.js} +8 -8
- package/dist/static/assets/{diagram-PSM6KHXK-BTYKp-4w.js.map → diagram-PSM6KHXK-BbaRu7Ko.js.map} +1 -1
- package/dist/static/assets/{diagram-QEK2KX5R-CopAPXBx.js → diagram-QEK2KX5R-w2QJoEvf.js} +7 -7
- package/dist/static/assets/{diagram-QEK2KX5R-CopAPXBx.js.map → diagram-QEK2KX5R-w2QJoEvf.js.map} +1 -1
- package/dist/static/assets/{diagram-S2PKOQOG-BxYzu2CQ.js → diagram-S2PKOQOG-CZ3V7aTH.js} +7 -7
- package/dist/static/assets/{diagram-S2PKOQOG-BxYzu2CQ.js.map → diagram-S2PKOQOG-CZ3V7aTH.js.map} +1 -1
- package/dist/static/assets/{erDiagram-Q2GNP2WA-8SOoYoCD.js → erDiagram-Q2GNP2WA-B_D5zZGW.js} +5 -5
- package/dist/static/assets/{erDiagram-Q2GNP2WA-8SOoYoCD.js.map → erDiagram-Q2GNP2WA-B_D5zZGW.js.map} +1 -1
- package/dist/static/assets/{flowDiagram-NV44I4VS-x3ds9tRp.js → flowDiagram-NV44I4VS-CdleeZSt.js} +6 -6
- package/dist/static/assets/{flowDiagram-NV44I4VS-x3ds9tRp.js.map → flowDiagram-NV44I4VS-CdleeZSt.js.map} +1 -1
- package/dist/static/assets/{ganttDiagram-JELNMOA3-JJe52R5B.js → ganttDiagram-JELNMOA3-D4I0mcXy.js} +3 -3
- package/dist/static/assets/{ganttDiagram-JELNMOA3-JJe52R5B.js.map → ganttDiagram-JELNMOA3-D4I0mcXy.js.map} +1 -1
- package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-D5WErFAP.js → gitGraphDiagram-V2S2FVAM-2TDy5WsI.js} +8 -8
- package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-D5WErFAP.js.map → gitGraphDiagram-V2S2FVAM-2TDy5WsI.js.map} +1 -1
- package/dist/static/assets/{graph-D2qG911_.js → graph-6qmT9kvE.js} +3 -3
- package/dist/static/assets/{graph-D2qG911_.js.map → graph-6qmT9kvE.js.map} +1 -1
- package/dist/static/assets/{index-BRvFzt7r.js → index-DZjf7VGN.js} +272 -80
- package/dist/static/assets/{index-BRvFzt7r.js.map → index-DZjf7VGN.js.map} +1 -1
- package/dist/static/assets/{infoDiagram-HS3SLOUP-CJgZXXei.js → infoDiagram-HS3SLOUP-Cdngu1wO.js} +6 -6
- package/dist/static/assets/{infoDiagram-HS3SLOUP-CJgZXXei.js.map → infoDiagram-HS3SLOUP-Cdngu1wO.js.map} +1 -1
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-DsA_9YlY.js → journeyDiagram-XKPGCS4Q-C8JGH9qX.js} +5 -5
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-DsA_9YlY.js.map → journeyDiagram-XKPGCS4Q-C8JGH9qX.js.map} +1 -1
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-l0WL_yMI.js → kanban-definition-3W4ZIXB7-CgcdAoUr.js} +3 -3
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-l0WL_yMI.js.map → kanban-definition-3W4ZIXB7-CgcdAoUr.js.map} +1 -1
- package/dist/static/assets/{layout-CpX1UYDN.js → layout--9zDsdfQ.js} +5 -5
- package/dist/static/assets/{layout-CpX1UYDN.js.map → layout--9zDsdfQ.js.map} +1 -1
- package/dist/static/assets/{linear-BwAZ1jvU.js → linear-f6M3OqrG.js} +2 -2
- package/dist/static/assets/{linear-BwAZ1jvU.js.map → linear-f6M3OqrG.js.map} +1 -1
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-CbPr4yzk.js → mindmap-definition-VGOIOE7T-O6D8o0NA.js} +4 -4
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-CbPr4yzk.js.map → mindmap-definition-VGOIOE7T-O6D8o0NA.js.map} +1 -1
- package/dist/static/assets/{pieDiagram-ADFJNKIX-Dm1nDIqq.js → pieDiagram-ADFJNKIX-B73iJXia.js} +8 -8
- package/dist/static/assets/{pieDiagram-ADFJNKIX-Dm1nDIqq.js.map → pieDiagram-ADFJNKIX-B73iJXia.js.map} +1 -1
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-ZsrsqMXx.js → quadrantDiagram-AYHSOK5B-1MkdhL3o.js} +3 -3
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-ZsrsqMXx.js.map → quadrantDiagram-AYHSOK5B-1MkdhL3o.js.map} +1 -1
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-Dcm7em76.js → requirementDiagram-UZGBJVZJ-BANDg6Jt.js} +4 -4
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-Dcm7em76.js.map → requirementDiagram-UZGBJVZJ-BANDg6Jt.js.map} +1 -1
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-CZaCjU14.js → sankeyDiagram-TZEHDZUN-XEoMNqRv.js} +2 -2
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-CZaCjU14.js.map → sankeyDiagram-TZEHDZUN-XEoMNqRv.js.map} +1 -1
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-CcfoaMSR.js → sequenceDiagram-WL72ISMW-Brw-9CPI.js} +4 -4
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-CcfoaMSR.js.map → sequenceDiagram-WL72ISMW-Brw-9CPI.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-BVIDD43e.js → stateDiagram-FKZM4ZOC-CVzsrvr2.js} +9 -9
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-BVIDD43e.js.map → stateDiagram-FKZM4ZOC-CVzsrvr2.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-B9GL2xr3.js → stateDiagram-v2-4FDKWEC3-B9j-EAhS.js} +5 -5
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-B9GL2xr3.js.map → stateDiagram-v2-4FDKWEC3-B9j-EAhS.js.map} +1 -1
- package/dist/static/assets/{timeline-definition-IT6M3QCI-8iKDS8Ig.js → timeline-definition-IT6M3QCI-S3mM3ltV.js} +3 -3
- package/dist/static/assets/{timeline-definition-IT6M3QCI-8iKDS8Ig.js.map → timeline-definition-IT6M3QCI-S3mM3ltV.js.map} +1 -1
- package/dist/static/assets/{treemap-GDKQZRPO-CbxnTnrn.js → treemap-GDKQZRPO-Cf1b3Cgv.js} +5 -5
- package/dist/static/assets/{treemap-GDKQZRPO-CbxnTnrn.js.map → treemap-GDKQZRPO-Cf1b3Cgv.js.map} +1 -1
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-C0KMwrOR.js → xychartDiagram-PRI3JC2R-CYvqfglb.js} +3 -3
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-C0KMwrOR.js.map → xychartDiagram-PRI3JC2R-CYvqfglb.js.map} +1 -1
- package/dist/static/index.html +1 -1
- package/dist/tools/prompts/memory/en/errors.md +155 -0
- package/dist/tools/prompts/memory/en/index.md +47 -0
- package/dist/tools/prompts/memory/en/principles.md +79 -0
- package/dist/tools/prompts/memory/en/scenarios.md +174 -0
- package/dist/tools/prompts/memory/en/tools.md +154 -0
- package/dist/tools/prompts/memory/zh/errors.md +155 -0
- package/dist/tools/prompts/memory/zh/index.md +47 -0
- package/dist/tools/prompts/memory/zh/principles.md +79 -0
- package/dist/tools/prompts/memory/zh/scenarios.md +174 -0
- package/dist/tools/prompts/memory/zh/tools.md +154 -0
- package/package.json +1 -1
|
@@ -0,0 +1,207 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
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
|
+
}
|
|
@@ -150,7 +150,7 @@ async function notifyWaitingDialogsOfClearedMind(dialog) {
|
|
|
150
150
|
}, undefined, ownerDialog.status);
|
|
151
151
|
for (const pendingRecord of owner.pendingRecords) {
|
|
152
152
|
const requesterId = ownerDialog.agentId;
|
|
153
|
-
const response = (0, inter_dialog_format_1.
|
|
153
|
+
const response = (0, inter_dialog_format_1.formatTellaskResponseContent)({
|
|
154
154
|
callName: pendingRecord.callName,
|
|
155
155
|
responderId: dialog.agentId,
|
|
156
156
|
requesterId,
|
|
@@ -161,23 +161,51 @@ async function notifyWaitingDialogsOfClearedMind(dialog) {
|
|
|
161
161
|
status: 'failed',
|
|
162
162
|
language,
|
|
163
163
|
});
|
|
164
|
-
|
|
164
|
+
const carryoverOriginCourse = pendingRecord.callingCourse;
|
|
165
|
+
const carryoverContent = carryoverOriginCourse !== undefined && carryoverOriginCourse !== ownerDialog.currentCourse
|
|
166
|
+
? (0, inter_dialog_format_1.formatTellaskCarryoverResultContent)({
|
|
167
|
+
originCourse: carryoverOriginCourse,
|
|
168
|
+
callName: pendingRecord.callName,
|
|
169
|
+
responderId: dialog.agentId,
|
|
170
|
+
mentionList: pendingRecord.mentionList,
|
|
171
|
+
sessionSlug: pendingRecord.sessionSlug,
|
|
172
|
+
tellaskContent: pendingRecord.tellaskContent,
|
|
173
|
+
responseBody,
|
|
174
|
+
status: 'failed',
|
|
175
|
+
language,
|
|
176
|
+
})
|
|
177
|
+
: undefined;
|
|
178
|
+
await ownerDialog.receiveTellaskResponse(dialog.agentId, pendingRecord.callName, pendingRecord.mentionList, pendingRecord.tellaskContent, 'failed', dialog.id, {
|
|
165
179
|
response,
|
|
166
180
|
agentId: dialog.agentId,
|
|
167
181
|
callId: pendingRecord.callId,
|
|
168
182
|
originMemberId: requesterId,
|
|
183
|
+
originCourse: carryoverOriginCourse,
|
|
184
|
+
carryoverContent,
|
|
169
185
|
sessionSlug: pendingRecord.sessionSlug,
|
|
170
186
|
});
|
|
171
|
-
const immediateMirror =
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
187
|
+
const immediateMirror = carryoverContent !== undefined
|
|
188
|
+
? {
|
|
189
|
+
type: 'tellask_carryover_result_msg',
|
|
190
|
+
role: 'user',
|
|
191
|
+
content: carryoverContent,
|
|
192
|
+
originCourse: carryoverOriginCourse,
|
|
193
|
+
responderId: dialog.agentId,
|
|
194
|
+
callName: pendingRecord.callName,
|
|
195
|
+
tellaskContent: pendingRecord.tellaskContent,
|
|
196
|
+
status: 'failed',
|
|
197
|
+
callId: pendingRecord.callId,
|
|
198
|
+
}
|
|
199
|
+
: {
|
|
200
|
+
type: 'tellask_result_msg',
|
|
201
|
+
role: 'tool',
|
|
202
|
+
responderId: dialog.agentId,
|
|
203
|
+
mentionList: pendingRecord.mentionList,
|
|
204
|
+
tellaskContent: pendingRecord.tellaskContent,
|
|
205
|
+
status: 'failed',
|
|
206
|
+
callId: pendingRecord.callId,
|
|
207
|
+
content: response,
|
|
208
|
+
};
|
|
181
209
|
await ownerDialog.addChatMessages(immediateMirror);
|
|
182
210
|
totalInvalidated += 1;
|
|
183
211
|
}
|
package/dist/dialog-fork.js
CHANGED
|
@@ -100,12 +100,14 @@ function isPersistedMessageRecord(record) {
|
|
|
100
100
|
case 'human_text_record':
|
|
101
101
|
case 'func_call_record':
|
|
102
102
|
case 'func_result_record':
|
|
103
|
-
case '
|
|
104
|
-
case '
|
|
103
|
+
case 'tellask_call_result_record':
|
|
104
|
+
case 'tellask_response_record':
|
|
105
|
+
case 'tellask_carryover_result_record':
|
|
105
106
|
return true;
|
|
106
107
|
case 'web_search_call_record':
|
|
107
108
|
case 'quest_for_sup_record':
|
|
108
|
-
case '
|
|
109
|
+
case 'tellask_call_carryover_record':
|
|
110
|
+
case 'tellask_call_anchor_record':
|
|
109
111
|
case 'gen_start_record':
|
|
110
112
|
case 'gen_finish_record':
|
|
111
113
|
case 'subdialog_created_record':
|
|
@@ -172,9 +174,11 @@ function rewriteRecordForFork(record, newRootId) {
|
|
|
172
174
|
case 'web_search_call_record':
|
|
173
175
|
case 'human_text_record':
|
|
174
176
|
case 'quest_for_sup_record':
|
|
175
|
-
case '
|
|
176
|
-
case '
|
|
177
|
-
case '
|
|
177
|
+
case 'tellask_call_result_record':
|
|
178
|
+
case 'tellask_call_carryover_record':
|
|
179
|
+
case 'tellask_call_anchor_record':
|
|
180
|
+
case 'tellask_response_record':
|
|
181
|
+
case 'tellask_carryover_result_record':
|
|
178
182
|
case 'gen_start_record':
|
|
179
183
|
case 'gen_finish_record':
|
|
180
184
|
return record;
|
package/dist/dialog.js
CHANGED
|
@@ -143,7 +143,7 @@ class Dialog {
|
|
|
143
143
|
this.disableDiligencePush = false;
|
|
144
144
|
// Current callId for tellask call correlation
|
|
145
145
|
// - Set during teammate_call_finish_evt (from tellask-special function calls)
|
|
146
|
-
// - Retrieved during inline call-result emission (for
|
|
146
|
+
// - Retrieved during inline call-result emission (for receiveTellaskCallResult callId parameter)
|
|
147
147
|
// - Enables frontend to attach result INLINE to the calling section
|
|
148
148
|
// - NOT used for teammate tellasks (which use calleeDialogId instead)
|
|
149
149
|
this._currentCallId = null;
|
|
@@ -792,14 +792,14 @@ class Dialog {
|
|
|
792
792
|
/**
|
|
793
793
|
* Receive call result with callId for inline correlation
|
|
794
794
|
*/
|
|
795
|
-
async
|
|
796
|
-
return await this.dlgStore.
|
|
795
|
+
async receiveTellaskCallResult(responderId, callName, mentionList, tellaskContent, result, status, callId) {
|
|
796
|
+
return await this.dlgStore.receiveTellaskCallResult(this, responderId, callName, mentionList, tellaskContent, result, status, callId);
|
|
797
797
|
}
|
|
798
798
|
/**
|
|
799
799
|
* Receive teammate response (separate bubble for @teammate tellasks)
|
|
800
800
|
*/
|
|
801
|
-
async
|
|
802
|
-
return await this.dlgStore.
|
|
801
|
+
async receiveTellaskResponse(responderId, callName, mentionList, tellaskContent, status, subdialogId, options) {
|
|
802
|
+
return await this.dlgStore.receiveTellaskResponse(this, responderId, callName, mentionList, tellaskContent, status, subdialogId, options);
|
|
803
803
|
}
|
|
804
804
|
async updateQuestions4Human(questions) {
|
|
805
805
|
return await this.dlgStore.updateQuestions4Human(this, questions);
|
|
@@ -871,7 +871,7 @@ class Dialog {
|
|
|
871
871
|
// Emit virtual generating_start_evt for subdialog response bubble
|
|
872
872
|
await this.notifyGeneratingStart();
|
|
873
873
|
const rawResponse = response;
|
|
874
|
-
// Emit
|
|
874
|
+
// Emit TellaskResponseEvent
|
|
875
875
|
const evt = (() => {
|
|
876
876
|
switch (callName) {
|
|
877
877
|
case 'tellask':
|
|
@@ -880,7 +880,7 @@ class Dialog {
|
|
|
880
880
|
`(dialogId=${this.id.selfId}, subdialogId=${subdialogId.selfId}, callId=${callId})`);
|
|
881
881
|
}
|
|
882
882
|
return {
|
|
883
|
-
type: '
|
|
883
|
+
type: 'tellask_response_evt',
|
|
884
884
|
responderId,
|
|
885
885
|
calleeDialogId: subdialogId.selfId,
|
|
886
886
|
callName,
|
|
@@ -896,7 +896,7 @@ class Dialog {
|
|
|
896
896
|
};
|
|
897
897
|
case 'tellaskSessionless':
|
|
898
898
|
return {
|
|
899
|
-
type: '
|
|
899
|
+
type: 'tellask_response_evt',
|
|
900
900
|
responderId,
|
|
901
901
|
calleeDialogId: subdialogId.selfId,
|
|
902
902
|
callName,
|
|
@@ -911,7 +911,7 @@ class Dialog {
|
|
|
911
911
|
};
|
|
912
912
|
case 'freshBootsReasoning':
|
|
913
913
|
return {
|
|
914
|
-
type: '
|
|
914
|
+
type: 'tellask_response_evt',
|
|
915
915
|
responderId,
|
|
916
916
|
calleeDialogId: subdialogId.selfId,
|
|
917
917
|
callName,
|
|
@@ -930,7 +930,7 @@ class Dialog {
|
|
|
930
930
|
await this.notifyGeneratingFinish();
|
|
931
931
|
}
|
|
932
932
|
catch (err) {
|
|
933
|
-
log_1.log.warn('Failed to post
|
|
933
|
+
log_1.log.warn('Failed to post tellask_response_evt event', undefined, {
|
|
934
934
|
error: err,
|
|
935
935
|
message: err instanceof Error ? err.message : String(err),
|
|
936
936
|
});
|
|
@@ -1144,11 +1144,11 @@ class DialogStore {
|
|
|
1144
1144
|
/**
|
|
1145
1145
|
* Receive call result with callId for inline correlation
|
|
1146
1146
|
*/
|
|
1147
|
-
async
|
|
1147
|
+
async receiveTellaskCallResult(_dialog, _responderId, _callName, _mentionList, _tellaskContent, _result, _status, _callId) { }
|
|
1148
1148
|
/**
|
|
1149
1149
|
* Receive teammate response (separate bubble for @teammate tellasks)
|
|
1150
1150
|
*/
|
|
1151
|
-
async
|
|
1151
|
+
async receiveTellaskResponse(_dialog, _responderId, _callName, _mentionList, _tellaskContent, _status, _subdialogId, _options) { }
|
|
1152
1152
|
async updateQuestions4Human(_dialog, _questions) { }
|
|
1153
1153
|
/**
|
|
1154
1154
|
* Load Questions for Human state from storage
|