dominds 1.4.2 → 1.5.1
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 +24 -0
- package/README.zh.md +24 -0
- package/dist/apps/app-json.js +38 -3
- package/dist/apps/dialog-run-controls.js +4 -0
- package/dist/apps/enabled-apps.js +8 -1
- package/dist/apps/installed-file.js +207 -0
- package/dist/apps/run-app-json.js +6 -6
- package/dist/apps/runtime-port.js +91 -0
- package/dist/apps/runtime.js +316 -68
- package/dist/apps-host/client.js +153 -3
- package/dist/apps-host/host.js +339 -2
- package/dist/apps-host/ipc-types.js +215 -30
- package/dist/cli/install.js +21 -1
- package/dist/dialog-fork.js +608 -0
- package/dist/dialog.js +2 -2
- package/dist/docs/app-constitution.md +153 -2
- package/dist/docs/app-constitution.zh.md +153 -2
- package/dist/docs/dialog-persistence.md +31 -0
- package/dist/docs/dialog-persistence.zh.md +31 -0
- package/dist/docs/dialog-system.md +29 -0
- package/dist/docs/dialog-system.zh.md +29 -0
- package/dist/docs/kernel-app-architecture.md +286 -0
- package/dist/docs/kernel-app-architecture.zh.md +285 -0
- package/dist/llm/defaults.yaml +16 -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 +68 -15
- package/dist/llm/gen/codex.js +59 -10
- package/dist/llm/gen/openai-compatible.js +38 -9
- package/dist/llm/gen/openai.js +58 -11
- package/dist/llm/gen/tool-output-limit.js +50 -0
- package/dist/llm/kernel-driver/subdialog.js +8 -1
- package/dist/llm/kernel-driver/tellask-special.js +18 -3
- package/dist/minds/load.js +7 -0
- package/dist/persistence.js +190 -28
- package/dist/priming.js +20 -1
- package/dist/server/api-routes.js +82 -0
- package/dist/server/setup-routes.js +15 -0
- package/dist/static/assets/{_basePickBy-B2o4z1Hf.js → _basePickBy-C-nynT9f.js} +3 -3
- package/dist/static/assets/{_basePickBy-B2o4z1Hf.js.map → _basePickBy-C-nynT9f.js.map} +1 -1
- package/dist/static/assets/{_baseUniq-CLmcxjdl.js → _baseUniq-CiHd-eVT.js} +2 -2
- package/dist/static/assets/{_baseUniq-CLmcxjdl.js.map → _baseUniq-CiHd-eVT.js.map} +1 -1
- package/dist/static/assets/{arc-CymD_KN7.js → arc-_OJzDWy1.js} +2 -2
- package/dist/static/assets/{arc-CymD_KN7.js.map → arc-_OJzDWy1.js.map} +1 -1
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-DJQfSJUH.js → architectureDiagram-VXUJARFQ-CDEG85ub.js} +7 -7
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-DJQfSJUH.js.map → architectureDiagram-VXUJARFQ-CDEG85ub.js.map} +1 -1
- package/dist/static/assets/{blockDiagram-VD42YOAC-pHVz60D0.js → blockDiagram-VD42YOAC-1LzKVc5t.js} +7 -7
- package/dist/static/assets/{blockDiagram-VD42YOAC-pHVz60D0.js.map → blockDiagram-VD42YOAC-1LzKVc5t.js.map} +1 -1
- package/dist/static/assets/{c4Diagram-YG6GDRKO-B0WnCfAT.js → c4Diagram-YG6GDRKO-BzYnVyvY.js} +3 -3
- package/dist/static/assets/{c4Diagram-YG6GDRKO-B0WnCfAT.js.map → c4Diagram-YG6GDRKO-BzYnVyvY.js.map} +1 -1
- package/dist/static/assets/{channel-CX9BlKil.js → channel-VAEDAk9T.js} +2 -2
- package/dist/static/assets/{channel-CX9BlKil.js.map → channel-VAEDAk9T.js.map} +1 -1
- package/dist/static/assets/{chunk-4BX2VUAB-lXArRj3o.js → chunk-4BX2VUAB-D0r2u3mX.js} +2 -2
- package/dist/static/assets/{chunk-4BX2VUAB-lXArRj3o.js.map → chunk-4BX2VUAB-D0r2u3mX.js.map} +1 -1
- package/dist/static/assets/{chunk-55IACEB6-CdqwynH9.js → chunk-55IACEB6-Dkl8Xw7i.js} +2 -2
- package/dist/static/assets/{chunk-55IACEB6-CdqwynH9.js.map → chunk-55IACEB6-Dkl8Xw7i.js.map} +1 -1
- package/dist/static/assets/{chunk-B4BG7PRW-Y-uXcJst.js → chunk-B4BG7PRW-9sxsI8ns.js} +5 -5
- package/dist/static/assets/{chunk-B4BG7PRW-Y-uXcJst.js.map → chunk-B4BG7PRW-9sxsI8ns.js.map} +1 -1
- package/dist/static/assets/{chunk-DI55MBZ5-C5xSbRST.js → chunk-DI55MBZ5-AHaqkaLl.js} +4 -4
- package/dist/static/assets/{chunk-DI55MBZ5-C5xSbRST.js.map → chunk-DI55MBZ5-AHaqkaLl.js.map} +1 -1
- package/dist/static/assets/{chunk-FMBD7UC4-5uefwCjI.js → chunk-FMBD7UC4-NWDLDixD.js} +2 -2
- package/dist/static/assets/{chunk-FMBD7UC4-5uefwCjI.js.map → chunk-FMBD7UC4-NWDLDixD.js.map} +1 -1
- package/dist/static/assets/{chunk-QN33PNHL-DzWVcvpI.js → chunk-QN33PNHL-C2KeUqle.js} +2 -2
- package/dist/static/assets/{chunk-QN33PNHL-DzWVcvpI.js.map → chunk-QN33PNHL-C2KeUqle.js.map} +1 -1
- package/dist/static/assets/{chunk-QZHKN3VN-BrrvAZdP.js → chunk-QZHKN3VN-B6Eoxo5L.js} +2 -2
- package/dist/static/assets/{chunk-QZHKN3VN-BrrvAZdP.js.map → chunk-QZHKN3VN-B6Eoxo5L.js.map} +1 -1
- package/dist/static/assets/{chunk-TZMSLE5B-DyKOlPTY.js → chunk-TZMSLE5B-Bc-VyQon.js} +2 -2
- package/dist/static/assets/{chunk-TZMSLE5B-DyKOlPTY.js.map → chunk-TZMSLE5B-Bc-VyQon.js.map} +1 -1
- package/dist/static/assets/{classDiagram-2ON5EDUG-FCrnlCWC.js → classDiagram-2ON5EDUG-DmPfsN1H.js} +6 -6
- package/dist/static/assets/{classDiagram-2ON5EDUG-FCrnlCWC.js.map → classDiagram-2ON5EDUG-DmPfsN1H.js.map} +1 -1
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-FCrnlCWC.js → classDiagram-v2-WZHVMYZB-DmPfsN1H.js} +6 -6
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-FCrnlCWC.js.map → classDiagram-v2-WZHVMYZB-DmPfsN1H.js.map} +1 -1
- package/dist/static/assets/{clone-BlI81KqZ.js → clone-B1R4pLTW.js} +2 -2
- package/dist/static/assets/{clone-BlI81KqZ.js.map → clone-B1R4pLTW.js.map} +1 -1
- package/dist/static/assets/{cose-bilkent-S5V4N54A-yM7S2atz.js → cose-bilkent-S5V4N54A-CxY__sKv.js} +2 -2
- package/dist/static/assets/{cose-bilkent-S5V4N54A-yM7S2atz.js.map → cose-bilkent-S5V4N54A-CxY__sKv.js.map} +1 -1
- package/dist/static/assets/{dagre-6UL2VRFP-BcweuZHt.js → dagre-6UL2VRFP-CPkB5tQ0.js} +7 -7
- package/dist/static/assets/{dagre-6UL2VRFP-BcweuZHt.js.map → dagre-6UL2VRFP-CPkB5tQ0.js.map} +1 -1
- package/dist/static/assets/{diagram-PSM6KHXK-D4-QwLW1.js → diagram-PSM6KHXK-C6kCVpCz.js} +8 -8
- package/dist/static/assets/{diagram-PSM6KHXK-D4-QwLW1.js.map → diagram-PSM6KHXK-C6kCVpCz.js.map} +1 -1
- package/dist/static/assets/{diagram-QEK2KX5R-BVbuejJn.js → diagram-QEK2KX5R-BWF6htf1.js} +7 -7
- package/dist/static/assets/{diagram-QEK2KX5R-BVbuejJn.js.map → diagram-QEK2KX5R-BWF6htf1.js.map} +1 -1
- package/dist/static/assets/{diagram-S2PKOQOG-pB6N6Tq_.js → diagram-S2PKOQOG-lKGJH6O9.js} +7 -7
- package/dist/static/assets/{diagram-S2PKOQOG-pB6N6Tq_.js.map → diagram-S2PKOQOG-lKGJH6O9.js.map} +1 -1
- package/dist/static/assets/{erDiagram-Q2GNP2WA-DLKmthuw.js → erDiagram-Q2GNP2WA-DJ3YaFob.js} +5 -5
- package/dist/static/assets/{erDiagram-Q2GNP2WA-DLKmthuw.js.map → erDiagram-Q2GNP2WA-DJ3YaFob.js.map} +1 -1
- package/dist/static/assets/{flowDiagram-NV44I4VS-BsBhWukh.js → flowDiagram-NV44I4VS-h3eQwA3O.js} +6 -6
- package/dist/static/assets/{flowDiagram-NV44I4VS-BsBhWukh.js.map → flowDiagram-NV44I4VS-h3eQwA3O.js.map} +1 -1
- package/dist/static/assets/{ganttDiagram-JELNMOA3-Debz-J-C.js → ganttDiagram-JELNMOA3-BCbsDOF_.js} +3 -3
- package/dist/static/assets/{ganttDiagram-JELNMOA3-Debz-J-C.js.map → ganttDiagram-JELNMOA3-BCbsDOF_.js.map} +1 -1
- package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-BnAPFBGR.js → gitGraphDiagram-V2S2FVAM-D0kX6h-T.js} +8 -8
- package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-BnAPFBGR.js.map → gitGraphDiagram-V2S2FVAM-D0kX6h-T.js.map} +1 -1
- package/dist/static/assets/{graph-DbzWiBNK.js → graph-CZIEXp3A.js} +3 -3
- package/dist/static/assets/{graph-DbzWiBNK.js.map → graph-CZIEXp3A.js.map} +1 -1
- package/dist/static/assets/{index-B-8J28g7.js → index-vIzCTZQE.js} +156 -35
- package/dist/static/assets/index-vIzCTZQE.js.map +1 -0
- package/dist/static/assets/{infoDiagram-HS3SLOUP-CZ5hWoxV.js → infoDiagram-HS3SLOUP-DUNbcXxv.js} +6 -6
- package/dist/static/assets/{infoDiagram-HS3SLOUP-CZ5hWoxV.js.map → infoDiagram-HS3SLOUP-DUNbcXxv.js.map} +1 -1
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-CKN3oSxk.js → journeyDiagram-XKPGCS4Q-Cg_VhiqB.js} +5 -5
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-CKN3oSxk.js.map → journeyDiagram-XKPGCS4Q-Cg_VhiqB.js.map} +1 -1
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-BQCMklfJ.js → kanban-definition-3W4ZIXB7-DMVCZVFE.js} +3 -3
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-BQCMklfJ.js.map → kanban-definition-3W4ZIXB7-DMVCZVFE.js.map} +1 -1
- package/dist/static/assets/{layout-C5B58szc.js → layout-DoKTmwlM.js} +5 -5
- package/dist/static/assets/{layout-C5B58szc.js.map → layout-DoKTmwlM.js.map} +1 -1
- package/dist/static/assets/{linear-_32fut6G.js → linear-DFVlPfX6.js} +2 -2
- package/dist/static/assets/{linear-_32fut6G.js.map → linear-DFVlPfX6.js.map} +1 -1
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-C_goMzjx.js → mindmap-definition-VGOIOE7T-l5K7agVV.js} +4 -4
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-C_goMzjx.js.map → mindmap-definition-VGOIOE7T-l5K7agVV.js.map} +1 -1
- package/dist/static/assets/{pieDiagram-ADFJNKIX-BQ2n0cOB.js → pieDiagram-ADFJNKIX-BfQzSE-A.js} +8 -8
- package/dist/static/assets/{pieDiagram-ADFJNKIX-BQ2n0cOB.js.map → pieDiagram-ADFJNKIX-BfQzSE-A.js.map} +1 -1
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-BLg7_neg.js → quadrantDiagram-AYHSOK5B-CJWvA5jc.js} +3 -3
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-BLg7_neg.js.map → quadrantDiagram-AYHSOK5B-CJWvA5jc.js.map} +1 -1
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DwkJt0zi.js → requirementDiagram-UZGBJVZJ-CeBbmqBK.js} +4 -4
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DwkJt0zi.js.map → requirementDiagram-UZGBJVZJ-CeBbmqBK.js.map} +1 -1
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-DmxmatUB.js → sankeyDiagram-TZEHDZUN-JeUBTDxx.js} +2 -2
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-DmxmatUB.js.map → sankeyDiagram-TZEHDZUN-JeUBTDxx.js.map} +1 -1
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-KHU_eApU.js → sequenceDiagram-WL72ISMW-Bd_7Pgc5.js} +4 -4
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-KHU_eApU.js.map → sequenceDiagram-WL72ISMW-Bd_7Pgc5.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-B3DBCxAL.js → stateDiagram-FKZM4ZOC-D_WyM3K1.js} +9 -9
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-B3DBCxAL.js.map → stateDiagram-FKZM4ZOC-D_WyM3K1.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-C-uIk7gh.js → stateDiagram-v2-4FDKWEC3-Q_yh26yx.js} +5 -5
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-C-uIk7gh.js.map → stateDiagram-v2-4FDKWEC3-Q_yh26yx.js.map} +1 -1
- package/dist/static/assets/{timeline-definition-IT6M3QCI-SysEcQCC.js → timeline-definition-IT6M3QCI-Ca8mCFDg.js} +3 -3
- package/dist/static/assets/{timeline-definition-IT6M3QCI-SysEcQCC.js.map → timeline-definition-IT6M3QCI-Ca8mCFDg.js.map} +1 -1
- package/dist/static/assets/{treemap-GDKQZRPO-d0AbKEc4.js → treemap-GDKQZRPO-CyBvKC8o.js} +5 -5
- package/dist/static/assets/{treemap-GDKQZRPO-d0AbKEc4.js.map → treemap-GDKQZRPO-CyBvKC8o.js.map} +1 -1
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-CmSQMxUh.js → xychartDiagram-PRI3JC2R-DY0BLEdj.js} +3 -3
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-CmSQMxUh.js.map → xychartDiagram-PRI3JC2R-DY0BLEdj.js.map} +1 -1
- package/dist/static/index.html +1 -1
- package/dist/team.js +33 -4
- package/dist/tools/app-reminders.js +280 -0
- 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/dist/tools/ripgrep.js +197 -63
- package/package.json +2 -2
- package/dist/static/assets/index-B-8J28g7.js.map +0 -1
package/dist/apps/runtime.js
CHANGED
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.getAppsHostClient = getAppsHostClient;
|
|
4
7
|
exports.shutdownAppsRuntime = shutdownAppsRuntime;
|
|
5
8
|
exports.registerEnabledAppsToolProxies = registerEnabledAppsToolProxies;
|
|
6
9
|
exports.initAppsRuntime = initAppsRuntime;
|
|
10
|
+
const crypto_1 = require("crypto");
|
|
11
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
12
|
+
const path_1 = __importDefault(require("path"));
|
|
13
|
+
const dialog_1 = require("../dialog");
|
|
14
|
+
const dialog_global_registry_1 = require("../dialog-global-registry");
|
|
15
|
+
const dialog_instance_registry_1 = require("../dialog-instance-registry");
|
|
7
16
|
const log_1 = require("../log");
|
|
17
|
+
const app_reminders_1 = require("../tools/app-reminders");
|
|
8
18
|
const registry_1 = require("../tools/registry");
|
|
9
19
|
const client_1 = require("../apps-host/client");
|
|
10
20
|
const dialog_run_controls_1 = require("./dialog-run-controls");
|
|
@@ -12,20 +22,133 @@ const enabled_apps_1 = require("./enabled-apps");
|
|
|
12
22
|
const problems_1 = require("./problems");
|
|
13
23
|
const log = (0, log_1.createLogger)('apps-runtime');
|
|
14
24
|
let appsHostClient = null;
|
|
15
|
-
|
|
25
|
+
let hostedAppsSignature = null;
|
|
26
|
+
let appsRuntimeConfig = null;
|
|
27
|
+
let refreshQueue = Promise.resolve();
|
|
28
|
+
const registeredAppArtifactsById = new Map();
|
|
29
|
+
function resolveRootDialogFor(dlg) {
|
|
30
|
+
if (dlg instanceof dialog_1.RootDialog) {
|
|
31
|
+
return dlg;
|
|
32
|
+
}
|
|
33
|
+
if (dlg instanceof dialog_1.SubDialog) {
|
|
34
|
+
return dlg.rootDialog;
|
|
35
|
+
}
|
|
36
|
+
throw new Error(`Unsupported dialog type for app runtime: ${dlg.constructor.name}`);
|
|
37
|
+
}
|
|
38
|
+
async function ensureRootDialogLoaded(rootId) {
|
|
39
|
+
const existing = dialog_global_registry_1.globalDialogRegistry.get(rootId);
|
|
40
|
+
if (existing) {
|
|
41
|
+
await existing.loadSubdialogRegistry();
|
|
42
|
+
await existing.loadPendingSubdialogsFromPersistence();
|
|
43
|
+
return existing;
|
|
44
|
+
}
|
|
45
|
+
return await (0, dialog_instance_registry_1.getOrRestoreRootDialog)(rootId, 'running');
|
|
46
|
+
}
|
|
47
|
+
async function ensureDialogLoadedBySelfId(rootDialog, dialogSelfId) {
|
|
48
|
+
if (dialogSelfId === rootDialog.id.rootId) {
|
|
49
|
+
return rootDialog;
|
|
50
|
+
}
|
|
51
|
+
const existing = rootDialog.lookupDialog(dialogSelfId);
|
|
52
|
+
if (existing) {
|
|
53
|
+
return existing;
|
|
54
|
+
}
|
|
55
|
+
return await (0, dialog_instance_registry_1.ensureDialogLoaded)(rootDialog, new dialog_1.DialogID(dialogSelfId, rootDialog.id.rootId), 'running');
|
|
56
|
+
}
|
|
57
|
+
function describeTarget(target) {
|
|
58
|
+
if ('dialogId' in target) {
|
|
59
|
+
return `dialogId=${target.dialogId}`;
|
|
60
|
+
}
|
|
61
|
+
const parts = [`agentId=${target.agentId}`];
|
|
62
|
+
if (target.rootDialogId) {
|
|
63
|
+
parts.push(`rootDialogId=${target.rootDialogId}`);
|
|
64
|
+
}
|
|
65
|
+
if (target.sessionSlug) {
|
|
66
|
+
parts.push(`sessionSlug=${target.sessionSlug}`);
|
|
67
|
+
}
|
|
68
|
+
return parts.join(' ');
|
|
69
|
+
}
|
|
70
|
+
async function resolveTargetDialog(sourceDlg, target) {
|
|
71
|
+
const sourceRoot = resolveRootDialogFor(sourceDlg);
|
|
72
|
+
if ('dialogId' in target) {
|
|
73
|
+
const matches = [];
|
|
74
|
+
const seenDialogKeys = new Set();
|
|
75
|
+
const pushMatch = (dialog) => {
|
|
76
|
+
if (!dialog)
|
|
77
|
+
return;
|
|
78
|
+
const key = dialog.id.valueOf();
|
|
79
|
+
if (seenDialogKeys.has(key))
|
|
80
|
+
return;
|
|
81
|
+
seenDialogKeys.add(key);
|
|
82
|
+
matches.push(dialog);
|
|
83
|
+
};
|
|
84
|
+
pushMatch(await ensureDialogLoadedBySelfId(sourceRoot, target.dialogId));
|
|
85
|
+
for (const loadedRoot of dialog_global_registry_1.globalDialogRegistry.getAll()) {
|
|
86
|
+
pushMatch(await ensureDialogLoadedBySelfId(loadedRoot, target.dialogId));
|
|
87
|
+
}
|
|
88
|
+
if (target.dialogId !== sourceRoot.id.rootId) {
|
|
89
|
+
pushMatch(await ensureRootDialogLoaded(target.dialogId));
|
|
90
|
+
}
|
|
91
|
+
if (matches.length === 1) {
|
|
92
|
+
return matches[0];
|
|
93
|
+
}
|
|
94
|
+
if (matches.length === 0) {
|
|
95
|
+
throw new Error(`dialog reminder target not found (${describeTarget(target)})`);
|
|
96
|
+
}
|
|
97
|
+
throw new Error(`dialog reminder target is ambiguous (${describeTarget(target)})`);
|
|
98
|
+
}
|
|
99
|
+
const targetRootId = target.rootDialogId ?? sourceRoot.id.rootId;
|
|
100
|
+
const targetRoot = targetRootId === sourceRoot.id.rootId ? sourceRoot : await ensureRootDialogLoaded(targetRootId);
|
|
101
|
+
if (!targetRoot) {
|
|
102
|
+
throw new Error(`dialog reminder target root not found (${describeTarget(target)})`);
|
|
103
|
+
}
|
|
104
|
+
await targetRoot.loadSubdialogRegistry();
|
|
105
|
+
await targetRoot.loadPendingSubdialogsFromPersistence();
|
|
106
|
+
if (target.sessionSlug) {
|
|
107
|
+
const subdialog = targetRoot.lookupSubdialog(target.agentId, target.sessionSlug);
|
|
108
|
+
if (!subdialog) {
|
|
109
|
+
throw new Error(`dialog reminder target not found (${describeTarget(target)})`);
|
|
110
|
+
}
|
|
111
|
+
return subdialog;
|
|
112
|
+
}
|
|
113
|
+
const matches = targetRoot.getAllDialogs().filter((dialog) => dialog.agentId === target.agentId);
|
|
114
|
+
if (matches.length === 1) {
|
|
115
|
+
return matches[0];
|
|
116
|
+
}
|
|
117
|
+
if (matches.length === 0) {
|
|
118
|
+
throw new Error(`dialog reminder target not found (${describeTarget(target)})`);
|
|
119
|
+
}
|
|
120
|
+
throw new Error(`dialog reminder target is ambiguous (${describeTarget(target)})`);
|
|
121
|
+
}
|
|
122
|
+
async function applyDialogReminderRequestBatches(sourceDlg, appId, dialogReminderRequests) {
|
|
123
|
+
for (const batch of dialogReminderRequests) {
|
|
124
|
+
if (batch.reminderRequests.length === 0) {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
const targetDlg = await resolveTargetDialog(sourceDlg, batch.target);
|
|
128
|
+
await (0, app_reminders_1.applyAppReminderRequests)(targetDlg, {
|
|
129
|
+
appId,
|
|
130
|
+
reminderRequests: batch.reminderRequests,
|
|
131
|
+
resolveHostClient: getAppsHostClient,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
16
135
|
function getAppsHostClient() {
|
|
17
136
|
if (!appsHostClient) {
|
|
18
137
|
throw new Error('Apps host is not initialized');
|
|
19
138
|
}
|
|
20
139
|
return appsHostClient;
|
|
21
140
|
}
|
|
22
|
-
async function
|
|
141
|
+
async function stopAppsHost() {
|
|
23
142
|
const client = appsHostClient;
|
|
24
143
|
if (!client)
|
|
25
144
|
return;
|
|
26
145
|
appsHostClient = null;
|
|
146
|
+
hostedAppsSignature = null;
|
|
27
147
|
await client.shutdown();
|
|
28
148
|
}
|
|
149
|
+
async function shutdownAppsRuntime() {
|
|
150
|
+
await stopAppsHost();
|
|
151
|
+
}
|
|
29
152
|
function ensureNoDuplicateTool(toolName, appId) {
|
|
30
153
|
const existing = (0, registry_1.getTool)(toolName);
|
|
31
154
|
if (existing) {
|
|
@@ -47,84 +170,209 @@ function registerAppToolset(params) {
|
|
|
47
170
|
(0, registry_1.registerToolset)(params.toolsetId, params.tools);
|
|
48
171
|
(0, registry_1.setToolsetMeta)(params.toolsetId, { source: 'app', descriptionI18n: params.descriptionI18n });
|
|
49
172
|
}
|
|
50
|
-
function
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
173
|
+
function computeAppSignature(app) {
|
|
174
|
+
return JSON.stringify({
|
|
175
|
+
appId: app.appId,
|
|
176
|
+
runtimePort: app.runtimePort,
|
|
177
|
+
installJson: app.installJson,
|
|
178
|
+
hostSourceVersion: app.hostSourceVersion,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
function computeHostedAppsSignature(enabledApps) {
|
|
182
|
+
return JSON.stringify(enabledApps.map((app) => ({
|
|
183
|
+
appId: app.appId,
|
|
184
|
+
runtimePort: app.runtimePort,
|
|
185
|
+
installJson: app.installJson,
|
|
186
|
+
hostSourceVersion: app.hostSourceVersion,
|
|
187
|
+
})));
|
|
188
|
+
}
|
|
189
|
+
async function computeHostSourceVersion(params) {
|
|
190
|
+
if (params.source.kind !== 'local') {
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
const host = params.installJson.host;
|
|
194
|
+
if (host.kind !== 'node_module') {
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
const moduleAbs = path_1.default.resolve(params.source.pathAbs, host.moduleRelPath);
|
|
198
|
+
try {
|
|
199
|
+
const content = await promises_1.default.readFile(moduleAbs);
|
|
200
|
+
const digest = (0, crypto_1.createHash)('sha256').update(content).digest('hex');
|
|
201
|
+
return `sha256:${digest}`;
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
205
|
+
return `unreadable:${moduleAbs}:${message}`;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
function unregisterRegisteredAppArtifacts(appId) {
|
|
209
|
+
const registered = registeredAppArtifactsById.get(appId);
|
|
210
|
+
if (!registered) {
|
|
211
|
+
(0, app_reminders_1.unregisterAppReminderOwnersForApps)({ appIds: [appId] });
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
for (const toolName of registered.toolNames) {
|
|
215
|
+
(0, registry_1.unregisterTool)(toolName);
|
|
216
|
+
}
|
|
217
|
+
for (const toolsetId of registered.toolsetIds) {
|
|
218
|
+
(0, registry_1.unregisterToolset)(toolsetId);
|
|
219
|
+
}
|
|
220
|
+
for (const controlId of registered.dialogRunControlIds) {
|
|
221
|
+
(0, dialog_run_controls_1.unregisterAppDialogRunControl)(controlId);
|
|
222
|
+
}
|
|
223
|
+
(0, app_reminders_1.unregisterAppReminderOwnersForApps)({ appIds: [appId] });
|
|
224
|
+
registeredAppArtifactsById.delete(appId);
|
|
225
|
+
}
|
|
226
|
+
async function ensureAppsHostReadyForToolCalls() {
|
|
227
|
+
const config = appsRuntimeConfig;
|
|
228
|
+
if (!config && !appsHostClient) {
|
|
229
|
+
throw new Error('Apps host is unavailable in the current runtime; start an interactive Dominds runtime first');
|
|
230
|
+
}
|
|
231
|
+
if (config) {
|
|
232
|
+
await registerEnabledAppsToolProxies({ rtwsRootAbs: config.rtwsRootAbs });
|
|
233
|
+
}
|
|
234
|
+
return getAppsHostClient();
|
|
235
|
+
}
|
|
236
|
+
function registerAppArtifacts(app) {
|
|
237
|
+
const toolNames = [];
|
|
238
|
+
const toolsetIds = [];
|
|
239
|
+
const dialogRunControlIds = [];
|
|
240
|
+
const toolsets = app.installJson.contributes?.toolsets ?? [];
|
|
241
|
+
for (const ts of toolsets) {
|
|
242
|
+
const tools = ts.tools.map((t) => ({
|
|
243
|
+
type: 'func',
|
|
244
|
+
name: t.name,
|
|
245
|
+
description: t.description,
|
|
246
|
+
descriptionI18n: t.descriptionI18n,
|
|
247
|
+
parameters: t.parameters,
|
|
248
|
+
call: async (dlg, caller, args) => {
|
|
249
|
+
const host = await ensureAppsHostReadyForToolCalls();
|
|
250
|
+
const result = await host.callTool(t.name, args, {
|
|
251
|
+
dialogId: dlg.id.selfId,
|
|
252
|
+
rootDialogId: dlg.id.rootId,
|
|
253
|
+
agentId: dlg.agentId,
|
|
254
|
+
sessionSlug: dlg instanceof dialog_1.SubDialog ? dlg.sessionSlug : undefined,
|
|
255
|
+
callerId: caller.id,
|
|
256
|
+
});
|
|
257
|
+
if (Array.isArray(result.reminderRequests) && result.reminderRequests.length > 0) {
|
|
258
|
+
await (0, app_reminders_1.applyAppReminderRequests)(dlg, {
|
|
259
|
+
appId: app.appId,
|
|
260
|
+
reminderRequests: result.reminderRequests,
|
|
261
|
+
resolveHostClient: getAppsHostClient,
|
|
67
262
|
});
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
263
|
+
}
|
|
264
|
+
if (Array.isArray(result.dialogReminderRequests) &&
|
|
265
|
+
result.dialogReminderRequests.length > 0) {
|
|
266
|
+
await applyDialogReminderRequestBatches(dlg, app.appId, result.dialogReminderRequests);
|
|
267
|
+
}
|
|
268
|
+
return result.output;
|
|
269
|
+
},
|
|
270
|
+
}));
|
|
271
|
+
registerAppToolset({
|
|
272
|
+
appId: app.appId,
|
|
273
|
+
toolsetId: ts.id,
|
|
274
|
+
tools,
|
|
275
|
+
descriptionI18n: ts.descriptionI18n,
|
|
276
|
+
});
|
|
277
|
+
toolsetIds.push(ts.id);
|
|
278
|
+
toolNames.push(...tools.map((tool) => tool.name));
|
|
78
279
|
}
|
|
280
|
+
const controls = app.installJson.contributes?.dialogRunControls ?? [];
|
|
281
|
+
for (const control of controls) {
|
|
282
|
+
(0, dialog_run_controls_1.registerAppDialogRunControl)({
|
|
283
|
+
id: control.id,
|
|
284
|
+
appId: app.appId,
|
|
285
|
+
descriptionI18n: control.descriptionI18n,
|
|
286
|
+
});
|
|
287
|
+
dialogRunControlIds.push(control.id);
|
|
288
|
+
}
|
|
289
|
+
(0, app_reminders_1.ensureAppReminderOwnersRegistered)({
|
|
290
|
+
enabledApps: [app],
|
|
291
|
+
resolveHostClient: getAppsHostClient,
|
|
292
|
+
});
|
|
293
|
+
registeredAppArtifactsById.set(app.appId, {
|
|
294
|
+
signature: computeAppSignature(app),
|
|
295
|
+
toolNames,
|
|
296
|
+
toolsetIds,
|
|
297
|
+
dialogRunControlIds,
|
|
298
|
+
});
|
|
79
299
|
}
|
|
80
|
-
function
|
|
300
|
+
function syncRegisteredAppArtifacts(params) {
|
|
301
|
+
const nextAppIds = new Set(params.enabledApps.map((app) => app.appId));
|
|
302
|
+
for (const appId of registeredAppArtifactsById.keys()) {
|
|
303
|
+
if (!nextAppIds.has(appId)) {
|
|
304
|
+
unregisterRegisteredAppArtifacts(appId);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
81
307
|
for (const app of params.enabledApps) {
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
308
|
+
const nextSignature = computeAppSignature(app);
|
|
309
|
+
const existing = registeredAppArtifactsById.get(app.appId);
|
|
310
|
+
if (existing?.signature === nextSignature) {
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
if (existing) {
|
|
314
|
+
unregisterRegisteredAppArtifacts(app.appId);
|
|
89
315
|
}
|
|
316
|
+
registerAppArtifacts(app);
|
|
90
317
|
}
|
|
91
318
|
}
|
|
92
|
-
async function
|
|
93
|
-
const
|
|
94
|
-
(
|
|
95
|
-
const enabledApps = snapshot.enabledApps.map((a) => ({
|
|
96
|
-
appId: a.id,
|
|
97
|
-
runtimePort: a.runtimePort,
|
|
98
|
-
installJson: a.installJson,
|
|
99
|
-
}));
|
|
100
|
-
if (enabledApps.length === 0)
|
|
319
|
+
async function syncAppsHostToEnabledApps(params) {
|
|
320
|
+
const config = appsRuntimeConfig;
|
|
321
|
+
if (!config) {
|
|
101
322
|
return;
|
|
102
|
-
registerAppProxyToolsForEnabledApps({ enabledApps });
|
|
103
|
-
}
|
|
104
|
-
async function initAppsRuntime(params) {
|
|
105
|
-
if (appsHostClient) {
|
|
106
|
-
throw new Error('Apps runtime already initialized');
|
|
107
323
|
}
|
|
108
|
-
const
|
|
109
|
-
(
|
|
110
|
-
|
|
111
|
-
appId: a.id,
|
|
112
|
-
runtimePort: a.runtimePort,
|
|
113
|
-
installJson: a.installJson,
|
|
114
|
-
}));
|
|
115
|
-
if (enabledApps.length === 0) {
|
|
116
|
-
log.info('No enabled apps');
|
|
324
|
+
const nextSignature = computeHostedAppsSignature(params.enabledApps);
|
|
325
|
+
if (params.enabledApps.length === 0) {
|
|
326
|
+
await stopAppsHost();
|
|
117
327
|
return;
|
|
118
328
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
log.info(`Starting apps-host (${enabledApps.length} enabled apps)`);
|
|
329
|
+
if (appsHostClient && hostedAppsSignature === nextSignature) {
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
await stopAppsHost();
|
|
333
|
+
log.info(`Starting apps-host (${params.enabledApps.length} enabled apps)`);
|
|
124
334
|
const { client } = await (0, client_1.startAppsHost)({
|
|
125
|
-
rtwsRootAbs:
|
|
126
|
-
kernel:
|
|
127
|
-
apps: enabledApps,
|
|
335
|
+
rtwsRootAbs: config.rtwsRootAbs,
|
|
336
|
+
kernel: config.kernel,
|
|
337
|
+
apps: params.enabledApps,
|
|
128
338
|
});
|
|
129
339
|
appsHostClient = client;
|
|
340
|
+
hostedAppsSignature = nextSignature;
|
|
341
|
+
}
|
|
342
|
+
async function refreshEnabledAppsRuntimeNow(params) {
|
|
343
|
+
const snapshot = await (0, enabled_apps_1.loadEnabledAppsSnapshot)({ rtwsRootAbs: params.rtwsRootAbs });
|
|
344
|
+
(0, problems_1.reconcileAppsResolutionIssuesToProblems)({ issues: snapshot.issues });
|
|
345
|
+
const enabledApps = await Promise.all(snapshot.enabledApps.map(async (app) => ({
|
|
346
|
+
appId: app.id,
|
|
347
|
+
runtimePort: app.runtimePort,
|
|
348
|
+
installJson: app.installJson,
|
|
349
|
+
hostSourceVersion: await computeHostSourceVersion({
|
|
350
|
+
source: app.source,
|
|
351
|
+
installJson: app.installJson,
|
|
352
|
+
}),
|
|
353
|
+
})));
|
|
354
|
+
syncRegisteredAppArtifacts({ enabledApps });
|
|
355
|
+
if (params.ensureHost) {
|
|
356
|
+
await syncAppsHostToEnabledApps({ enabledApps });
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
async function registerEnabledAppsToolProxies(params) {
|
|
360
|
+
const run = refreshQueue.then(() => refreshEnabledAppsRuntimeNow({
|
|
361
|
+
rtwsRootAbs: params.rtwsRootAbs,
|
|
362
|
+
ensureHost: appsRuntimeConfig !== null,
|
|
363
|
+
}));
|
|
364
|
+
refreshQueue = run.catch(() => undefined);
|
|
365
|
+
await run;
|
|
366
|
+
}
|
|
367
|
+
async function initAppsRuntime(params) {
|
|
368
|
+
appsRuntimeConfig = {
|
|
369
|
+
rtwsRootAbs: params.rtwsRootAbs,
|
|
370
|
+
kernel: params.kernel,
|
|
371
|
+
};
|
|
372
|
+
const run = refreshQueue.then(() => refreshEnabledAppsRuntimeNow({
|
|
373
|
+
rtwsRootAbs: params.rtwsRootAbs,
|
|
374
|
+
ensureHost: true,
|
|
375
|
+
}));
|
|
376
|
+
refreshQueue = run.catch(() => undefined);
|
|
377
|
+
await run;
|
|
130
378
|
}
|
package/dist/apps-host/client.js
CHANGED
|
@@ -46,6 +46,24 @@ function parseMessageToKernel(v) {
|
|
|
46
46
|
throw new Error('Invalid tool_result message: callId required');
|
|
47
47
|
return v;
|
|
48
48
|
}
|
|
49
|
+
if (type === 'reminder_apply_result') {
|
|
50
|
+
const callId = asString(v['callId']);
|
|
51
|
+
if (!callId)
|
|
52
|
+
throw new Error('Invalid reminder_apply_result message: callId required');
|
|
53
|
+
return v;
|
|
54
|
+
}
|
|
55
|
+
if (type === 'reminder_update_result') {
|
|
56
|
+
const callId = asString(v['callId']);
|
|
57
|
+
if (!callId)
|
|
58
|
+
throw new Error('Invalid reminder_update_result message: callId required');
|
|
59
|
+
return v;
|
|
60
|
+
}
|
|
61
|
+
if (type === 'reminder_render_result') {
|
|
62
|
+
const callId = asString(v['callId']);
|
|
63
|
+
if (!callId)
|
|
64
|
+
throw new Error('Invalid reminder_render_result message: callId required');
|
|
65
|
+
return v;
|
|
66
|
+
}
|
|
49
67
|
if (type === 'run_control_result') {
|
|
50
68
|
const callId = asString(v['callId']);
|
|
51
69
|
if (!callId)
|
|
@@ -84,6 +102,9 @@ async function startAppsHost(params) {
|
|
|
84
102
|
}
|
|
85
103
|
const pendingTools = new Map();
|
|
86
104
|
const pendingRunControls = new Map();
|
|
105
|
+
const pendingReminderApplies = new Map();
|
|
106
|
+
const pendingReminderUpdates = new Map();
|
|
107
|
+
const pendingReminderRenders = new Map();
|
|
87
108
|
let ready = false;
|
|
88
109
|
let readyMsg = null;
|
|
89
110
|
let readyResolve = null;
|
|
@@ -106,6 +127,21 @@ async function startAppsHost(params) {
|
|
|
106
127
|
p.reject(err);
|
|
107
128
|
}
|
|
108
129
|
pendingRunControls.clear();
|
|
130
|
+
for (const p of pendingReminderApplies.values()) {
|
|
131
|
+
clearTimeout(p.timeout);
|
|
132
|
+
p.reject(err);
|
|
133
|
+
}
|
|
134
|
+
pendingReminderApplies.clear();
|
|
135
|
+
for (const p of pendingReminderUpdates.values()) {
|
|
136
|
+
clearTimeout(p.timeout);
|
|
137
|
+
p.reject(err);
|
|
138
|
+
}
|
|
139
|
+
pendingReminderUpdates.clear();
|
|
140
|
+
for (const p of pendingReminderRenders.values()) {
|
|
141
|
+
clearTimeout(p.timeout);
|
|
142
|
+
p.reject(err);
|
|
143
|
+
}
|
|
144
|
+
pendingReminderRenders.clear();
|
|
109
145
|
};
|
|
110
146
|
child.on('exit', (code, signal) => {
|
|
111
147
|
const err = new Error(`apps-host exited (code=${code ?? 'null'} signal=${signal ?? 'null'})`);
|
|
@@ -140,8 +176,13 @@ async function startAppsHost(params) {
|
|
|
140
176
|
}
|
|
141
177
|
pendingTools.delete(msg.callId);
|
|
142
178
|
clearTimeout(p.timeout);
|
|
143
|
-
if (msg.ok)
|
|
144
|
-
p.resolve(
|
|
179
|
+
if (msg.ok) {
|
|
180
|
+
p.resolve({
|
|
181
|
+
output: msg.output,
|
|
182
|
+
reminderRequests: msg.reminderRequests,
|
|
183
|
+
dialogReminderRequests: msg.dialogReminderRequests,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
145
186
|
else
|
|
146
187
|
p.reject(new Error(msg.errorText));
|
|
147
188
|
return;
|
|
@@ -158,6 +199,48 @@ async function startAppsHost(params) {
|
|
|
158
199
|
return;
|
|
159
200
|
}
|
|
160
201
|
p.resolve(msg.result);
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
if (msg.type === 'reminder_apply_result') {
|
|
205
|
+
const p = pendingReminderApplies.get(msg.callId);
|
|
206
|
+
if (!p) {
|
|
207
|
+
throw new Error(`Unexpected reminder_apply_result for unknown callId: ${msg.callId}`);
|
|
208
|
+
}
|
|
209
|
+
pendingReminderApplies.delete(msg.callId);
|
|
210
|
+
clearTimeout(p.timeout);
|
|
211
|
+
if (!msg.ok) {
|
|
212
|
+
p.reject(new Error(msg.errorText));
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
p.resolve(msg.result);
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
if (msg.type === 'reminder_update_result') {
|
|
219
|
+
const p = pendingReminderUpdates.get(msg.callId);
|
|
220
|
+
if (!p) {
|
|
221
|
+
throw new Error(`Unexpected reminder_update_result for unknown callId: ${msg.callId}`);
|
|
222
|
+
}
|
|
223
|
+
pendingReminderUpdates.delete(msg.callId);
|
|
224
|
+
clearTimeout(p.timeout);
|
|
225
|
+
if (!msg.ok) {
|
|
226
|
+
p.reject(new Error(msg.errorText));
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
p.resolve(msg.result);
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
if (msg.type === 'reminder_render_result') {
|
|
233
|
+
const p = pendingReminderRenders.get(msg.callId);
|
|
234
|
+
if (!p) {
|
|
235
|
+
throw new Error(`Unexpected reminder_render_result for unknown callId: ${msg.callId}`);
|
|
236
|
+
}
|
|
237
|
+
pendingReminderRenders.delete(msg.callId);
|
|
238
|
+
clearTimeout(p.timeout);
|
|
239
|
+
if (!msg.ok) {
|
|
240
|
+
p.reject(new Error(msg.errorText));
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
p.resolve(msg.message);
|
|
161
244
|
}
|
|
162
245
|
}
|
|
163
246
|
catch (err) {
|
|
@@ -210,6 +293,70 @@ async function startAppsHost(params) {
|
|
|
210
293
|
child.send(msg);
|
|
211
294
|
});
|
|
212
295
|
};
|
|
296
|
+
const applyReminder = async (appId, ownerRef, request, ctx) => {
|
|
297
|
+
if (!ready) {
|
|
298
|
+
throw new Error(`apps-host is not ready yet (reminderOwner=${appId}/${ownerRef})`);
|
|
299
|
+
}
|
|
300
|
+
const callId = (0, crypto_1.randomUUID)();
|
|
301
|
+
const msg = {
|
|
302
|
+
type: 'reminder_apply',
|
|
303
|
+
callId,
|
|
304
|
+
appId,
|
|
305
|
+
ownerRef,
|
|
306
|
+
request,
|
|
307
|
+
ctx,
|
|
308
|
+
};
|
|
309
|
+
return await new Promise((resolve, reject) => {
|
|
310
|
+
const timeout = setTimeout(() => {
|
|
311
|
+
pendingReminderApplies.delete(callId);
|
|
312
|
+
reject(new Error(`apps-host reminder apply timed out: owner=${appId}/${ownerRef} callId=${callId}`));
|
|
313
|
+
}, 60000);
|
|
314
|
+
pendingReminderApplies.set(callId, { resolve, reject, timeout });
|
|
315
|
+
child.send(msg);
|
|
316
|
+
});
|
|
317
|
+
};
|
|
318
|
+
const updateReminder = async (appId, ownerRef, ctx) => {
|
|
319
|
+
if (!ready) {
|
|
320
|
+
throw new Error(`apps-host is not ready yet (reminderOwner=${appId}/${ownerRef})`);
|
|
321
|
+
}
|
|
322
|
+
const callId = (0, crypto_1.randomUUID)();
|
|
323
|
+
const msg = {
|
|
324
|
+
type: 'reminder_update',
|
|
325
|
+
callId,
|
|
326
|
+
appId,
|
|
327
|
+
ownerRef,
|
|
328
|
+
ctx,
|
|
329
|
+
};
|
|
330
|
+
return await new Promise((resolve, reject) => {
|
|
331
|
+
const timeout = setTimeout(() => {
|
|
332
|
+
pendingReminderUpdates.delete(callId);
|
|
333
|
+
reject(new Error(`apps-host reminder update timed out: owner=${appId}/${ownerRef} callId=${callId}`));
|
|
334
|
+
}, 60000);
|
|
335
|
+
pendingReminderUpdates.set(callId, { resolve, reject, timeout });
|
|
336
|
+
child.send(msg);
|
|
337
|
+
});
|
|
338
|
+
};
|
|
339
|
+
const renderReminder = async (appId, ownerRef, ctx) => {
|
|
340
|
+
if (!ready) {
|
|
341
|
+
throw new Error(`apps-host is not ready yet (reminderOwner=${appId}/${ownerRef})`);
|
|
342
|
+
}
|
|
343
|
+
const callId = (0, crypto_1.randomUUID)();
|
|
344
|
+
const msg = {
|
|
345
|
+
type: 'reminder_render',
|
|
346
|
+
callId,
|
|
347
|
+
appId,
|
|
348
|
+
ownerRef,
|
|
349
|
+
ctx,
|
|
350
|
+
};
|
|
351
|
+
return await new Promise((resolve, reject) => {
|
|
352
|
+
const timeout = setTimeout(() => {
|
|
353
|
+
pendingReminderRenders.delete(callId);
|
|
354
|
+
reject(new Error(`apps-host reminder render timed out: owner=${appId}/${ownerRef} callId=${callId}`));
|
|
355
|
+
}, 60000);
|
|
356
|
+
pendingReminderRenders.set(callId, { resolve, reject, timeout });
|
|
357
|
+
child.send(msg);
|
|
358
|
+
});
|
|
359
|
+
};
|
|
213
360
|
const shutdown = async () => {
|
|
214
361
|
try {
|
|
215
362
|
child.send({ type: 'shutdown' });
|
|
@@ -222,5 +369,8 @@ async function startAppsHost(params) {
|
|
|
222
369
|
if (!readyMsg) {
|
|
223
370
|
throw new Error('apps-host: internal error (readyMsg missing after readyPromise resolved)');
|
|
224
371
|
}
|
|
225
|
-
return {
|
|
372
|
+
return {
|
|
373
|
+
client: { callTool, applyRunControl, applyReminder, updateReminder, renderReminder, shutdown },
|
|
374
|
+
ready: readyResult,
|
|
375
|
+
};
|
|
226
376
|
}
|