dominds 0.1.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/LICENSE +157 -0
- package/README.md +250 -0
- package/README.zh.md +161 -0
- package/dist/access-control.js +253 -0
- package/dist/cli/create.js +263 -0
- package/dist/cli/read.js +84 -0
- package/dist/cli/tui.js +199 -0
- package/dist/cli/webui.js +169 -0
- package/dist/cli.js +227 -0
- package/dist/dialog-factory.js +53 -0
- package/dist/dialog-global-registry.js +68 -0
- package/dist/dialog-instance-registry.js +78 -0
- package/dist/dialog-run-state.js +198 -0
- package/dist/dialog.js +1024 -0
- package/dist/evt-registry.js +103 -0
- package/dist/index.js +8 -0
- package/dist/llm/client.js +69 -0
- package/dist/llm/defaults.yaml +386 -0
- package/dist/llm/driver.js +3214 -0
- package/dist/llm/gen/anthropic.js +611 -0
- package/dist/llm/gen/codex.js +375 -0
- package/dist/llm/gen/mock.js +326 -0
- package/dist/llm/gen/openai.js +470 -0
- package/dist/llm/gen/registry.js +26 -0
- package/dist/llm/gen.js +2 -0
- package/dist/llm/tools-projection.js +37 -0
- package/dist/log.js +228 -0
- package/dist/mcp/config.js +230 -0
- package/dist/mcp/sdk-client.js +129 -0
- package/dist/mcp/server-runtime.js +57 -0
- package/dist/mcp/stdio-client.js +280 -0
- package/dist/mcp/supervisor.js +979 -0
- package/dist/mcp/tool-names.js +109 -0
- package/dist/minds/builtin/cmdr/persona.md +3 -0
- package/dist/minds/builtin/dijiang/knowledge.md +287 -0
- package/dist/minds/builtin/dijiang/persona.md +7 -0
- package/dist/minds/builtin/fuxi/persona.en.md +59 -0
- package/dist/minds/builtin/fuxi/persona.zh.md +49 -0
- package/dist/minds/builtin/pangu/persona.en.md +78 -0
- package/dist/minds/builtin/pangu/persona.zh.md +71 -0
- package/dist/minds/load.js +617 -0
- package/dist/minds/minds-i18n.js +131 -0
- package/dist/minds/system-prompt.js +281 -0
- package/dist/persistence.js +3128 -0
- package/dist/problems.js +109 -0
- package/dist/server/api-routes.js +1031 -0
- package/dist/server/auth.js +180 -0
- package/dist/server/mime-types.js +32 -0
- package/dist/server/prompts-routes.js +543 -0
- package/dist/server/server-core.js +235 -0
- package/dist/server/setup-routes.js +697 -0
- package/dist/server/static-server.js +132 -0
- package/dist/server/websocket-handler.js +1011 -0
- package/dist/server.js +164 -0
- package/dist/shared/async-fifo-mutex.js +36 -0
- package/dist/shared/diligence.js +20 -0
- package/dist/shared/dotenv.js +144 -0
- package/dist/shared/evt.js +195 -0
- package/dist/shared/i18n/driver-messages.js +267 -0
- package/dist/shared/i18n/text.js +9 -0
- package/dist/shared/i18n/tool-result-messages.js +51 -0
- package/dist/shared/rtws-cli.js +73 -0
- package/dist/shared/runtime-language.js +47 -0
- package/dist/shared/team-mgmt-manual.js +116 -0
- package/dist/shared/types/context-health.js +2 -0
- package/dist/shared/types/dialog.js +11 -0
- package/dist/shared/types/i18n.js +2 -0
- package/dist/shared/types/index.js +26 -0
- package/dist/shared/types/language.js +40 -0
- package/dist/shared/types/problems.js +2 -0
- package/dist/shared/types/prompts.js +2 -0
- package/dist/shared/types/q4h.js +7 -0
- package/dist/shared/types/run-state.js +8 -0
- package/dist/shared/types/setup.js +2 -0
- package/dist/shared/types/storage.js +10 -0
- package/dist/shared/types/tellask.js +8 -0
- package/dist/shared/types/tools-registry.js +2 -0
- package/dist/shared/types/wire.js +12 -0
- package/dist/shared/utils/fmt.js +9 -0
- package/dist/shared/utils/html.js +20 -0
- package/dist/shared/utils/id.js +18 -0
- package/dist/shared/utils/inter-dialog-format.js +101 -0
- package/dist/shared/utils/time.js +13 -0
- package/dist/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/dist/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/dist/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/dist/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/dist/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/dist/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/dist/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/dist/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/dist/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/dist/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/dist/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/dist/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/dist/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/dist/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/dist/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/dist/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/dist/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/dist/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/dist/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/dist/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/dist/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/dist/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/dist/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/dist/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/dist/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/dist/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/dist/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/dist/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/dist/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/dist/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/dist/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/dist/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/dist/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/dist/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/dist/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/dist/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/dist/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/dist/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/dist/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/dist/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/dist/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/dist/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/dist/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/dist/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/dist/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/dist/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/dist/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/dist/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/dist/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/dist/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/dist/static/assets/_baseUniq-Crfl3d5Y.js +661 -0
- package/dist/static/assets/_baseUniq-Crfl3d5Y.js.map +1 -0
- package/dist/static/assets/arc-CbA_x9GD.js +132 -0
- package/dist/static/assets/arc-CbA_x9GD.js.map +1 -0
- package/dist/static/assets/architectureDiagram-VXUJARFQ-lcFS8ZQJ.js +8685 -0
- package/dist/static/assets/architectureDiagram-VXUJARFQ-lcFS8ZQJ.js.map +1 -0
- package/dist/static/assets/blockDiagram-VD42YOAC-B3Q36qRc.js +3608 -0
- package/dist/static/assets/blockDiagram-VD42YOAC-B3Q36qRc.js.map +1 -0
- package/dist/static/assets/c4Diagram-YG6GDRKO-Mt-aq3VH.js +2482 -0
- package/dist/static/assets/c4Diagram-YG6GDRKO-Mt-aq3VH.js.map +1 -0
- package/dist/static/assets/channel-BVr1Yke-.js +8 -0
- package/dist/static/assets/channel-BVr1Yke-.js.map +1 -0
- package/dist/static/assets/chunk-4BX2VUAB-qCIn5Iic.js +17 -0
- package/dist/static/assets/chunk-4BX2VUAB-qCIn5Iic.js.map +1 -0
- package/dist/static/assets/chunk-55IACEB6-q172NeCV.js +14 -0
- package/dist/static/assets/chunk-55IACEB6-q172NeCV.js.map +1 -0
- package/dist/static/assets/chunk-B4BG7PRW-CMJmtYzq.js +1827 -0
- package/dist/static/assets/chunk-B4BG7PRW-CMJmtYzq.js.map +1 -0
- package/dist/static/assets/chunk-DI55MBZ5-DiuwwZPL.js +1916 -0
- package/dist/static/assets/chunk-DI55MBZ5-DiuwwZPL.js.map +1 -0
- package/dist/static/assets/chunk-FMBD7UC4-06sqZTTn.js +20 -0
- package/dist/static/assets/chunk-FMBD7UC4-06sqZTTn.js.map +1 -0
- package/dist/static/assets/chunk-QN33PNHL-CnpBNkpP.js +25 -0
- package/dist/static/assets/chunk-QN33PNHL-CnpBNkpP.js.map +1 -0
- package/dist/static/assets/chunk-QZHKN3VN-CNgjMR-e.js +18 -0
- package/dist/static/assets/chunk-QZHKN3VN-CNgjMR-e.js.map +1 -0
- package/dist/static/assets/chunk-TZMSLE5B-BxtzW6--.js +109 -0
- package/dist/static/assets/chunk-TZMSLE5B-BxtzW6--.js.map +1 -0
- package/dist/static/assets/classDiagram-2ON5EDUG-29huvmn-.js +23 -0
- package/dist/static/assets/classDiagram-2ON5EDUG-29huvmn-.js.map +1 -0
- package/dist/static/assets/classDiagram-v2-WZHVMYZB-29huvmn-.js +23 -0
- package/dist/static/assets/classDiagram-v2-WZHVMYZB-29huvmn-.js.map +1 -0
- package/dist/static/assets/clone-D2OgLSSn.js +9 -0
- package/dist/static/assets/clone-D2OgLSSn.js.map +1 -0
- package/dist/static/assets/cose-bilkent-S5V4N54A-BNegDCxl.js +4943 -0
- package/dist/static/assets/cose-bilkent-S5V4N54A-BNegDCxl.js.map +1 -0
- package/dist/static/assets/cytoscape.esm-Bm8DJGmZ.js +30240 -0
- package/dist/static/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -0
- package/dist/static/assets/dagre-6UL2VRFP-f1XrTRSn.js +695 -0
- package/dist/static/assets/dagre-6UL2VRFP-f1XrTRSn.js.map +1 -0
- package/dist/static/assets/defaultLocale-DVr69WTU.js +207 -0
- package/dist/static/assets/defaultLocale-DVr69WTU.js.map +1 -0
- package/dist/static/assets/diagram-PSM6KHXK-8w1WbeDi.js +849 -0
- package/dist/static/assets/diagram-PSM6KHXK-8w1WbeDi.js.map +1 -0
- package/dist/static/assets/diagram-QEK2KX5R-CF4wtMmR.js +303 -0
- package/dist/static/assets/diagram-QEK2KX5R-CF4wtMmR.js.map +1 -0
- package/dist/static/assets/diagram-S2PKOQOG-8p3Avgn2.js +213 -0
- package/dist/static/assets/diagram-S2PKOQOG-8p3Avgn2.js.map +1 -0
- package/dist/static/assets/erDiagram-Q2GNP2WA-BMKLxlM9.js +1159 -0
- package/dist/static/assets/erDiagram-Q2GNP2WA-BMKLxlM9.js.map +1 -0
- package/dist/static/assets/favicon-Cmg5RbCj.svg +8 -0
- package/dist/static/assets/flowDiagram-NV44I4VS-CgEuPNK2.js +2332 -0
- package/dist/static/assets/flowDiagram-NV44I4VS-CgEuPNK2.js.map +1 -0
- package/dist/static/assets/ganttDiagram-JELNMOA3-bJkDCf-9.js +3681 -0
- package/dist/static/assets/ganttDiagram-JELNMOA3-bJkDCf-9.js.map +1 -0
- package/dist/static/assets/gitGraphDiagram-NY62KEGX-4QE9kesp.js +1206 -0
- package/dist/static/assets/gitGraphDiagram-NY62KEGX-4QE9kesp.js.map +1 -0
- package/dist/static/assets/graph-CS0Pmm7c.js +597 -0
- package/dist/static/assets/graph-CS0Pmm7c.js.map +1 -0
- package/dist/static/assets/index-BS6HnGzC.js +112303 -0
- package/dist/static/assets/index-BS6HnGzC.js.map +1 -0
- package/dist/static/assets/index-DaIsSzC_.css +483 -0
- package/dist/static/assets/infoDiagram-WHAUD3N6-ypBcKfUs.js +34 -0
- package/dist/static/assets/infoDiagram-WHAUD3N6-ypBcKfUs.js.map +1 -0
- package/dist/static/assets/init-ZxktEp_H.js +17 -0
- package/dist/static/assets/init-ZxktEp_H.js.map +1 -0
- package/dist/static/assets/journeyDiagram-XKPGCS4Q-QnrxDowJ.js +1255 -0
- package/dist/static/assets/journeyDiagram-XKPGCS4Q-QnrxDowJ.js.map +1 -0
- package/dist/static/assets/kanban-definition-3W4ZIXB7-CfvEc4z5.js +1048 -0
- package/dist/static/assets/kanban-definition-3W4ZIXB7-CfvEc4z5.js.map +1 -0
- package/dist/static/assets/layout-8TGxpm23.js +2218 -0
- package/dist/static/assets/layout-8TGxpm23.js.map +1 -0
- package/dist/static/assets/linear-BATBPQQv.js +341 -0
- package/dist/static/assets/linear-BATBPQQv.js.map +1 -0
- package/dist/static/assets/min-B3oVH3AC.js +42 -0
- package/dist/static/assets/min-B3oVH3AC.js.map +1 -0
- package/dist/static/assets/mindmap-definition-VGOIOE7T-L7VLwwF8.js +1127 -0
- package/dist/static/assets/mindmap-definition-VGOIOE7T-L7VLwwF8.js.map +1 -0
- package/dist/static/assets/ordinal-CxptdPJm.js +77 -0
- package/dist/static/assets/ordinal-CxptdPJm.js.map +1 -0
- package/dist/static/assets/pieDiagram-ADFJNKIX-CFW3zIhM.js +241 -0
- package/dist/static/assets/pieDiagram-ADFJNKIX-CFW3zIhM.js.map +1 -0
- package/dist/static/assets/quadrantDiagram-AYHSOK5B-B7ssen3E.js +1338 -0
- package/dist/static/assets/quadrantDiagram-AYHSOK5B-B7ssen3E.js.map +1 -0
- package/dist/static/assets/requirementDiagram-UZGBJVZJ-D0v5BArv.js +1162 -0
- package/dist/static/assets/requirementDiagram-UZGBJVZJ-D0v5BArv.js.map +1 -0
- package/dist/static/assets/sankeyDiagram-TZEHDZUN-B7slncJe.js +1195 -0
- package/dist/static/assets/sankeyDiagram-TZEHDZUN-B7slncJe.js.map +1 -0
- package/dist/static/assets/sequenceDiagram-WL72ISMW-oXU2lRh_.js +3875 -0
- package/dist/static/assets/sequenceDiagram-WL72ISMW-oXU2lRh_.js.map +1 -0
- package/dist/static/assets/stateDiagram-FKZM4ZOC-CFYsEd0x.js +452 -0
- package/dist/static/assets/stateDiagram-FKZM4ZOC-CFYsEd0x.js.map +1 -0
- package/dist/static/assets/stateDiagram-v2-4FDKWEC3-C0UWaNA7.js +22 -0
- package/dist/static/assets/stateDiagram-v2-4FDKWEC3-C0UWaNA7.js.map +1 -0
- package/dist/static/assets/timeline-definition-IT6M3QCI-C3KODUrh.js +1223 -0
- package/dist/static/assets/timeline-definition-IT6M3QCI-C3KODUrh.js.map +1 -0
- package/dist/static/assets/treemap-KMMF4GRG-DAGDLhj2.js +18753 -0
- package/dist/static/assets/treemap-KMMF4GRG-DAGDLhj2.js.map +1 -0
- package/dist/static/assets/xychartDiagram-PRI3JC2R-C0J9iwTO.js +1888 -0
- package/dist/static/assets/xychartDiagram-PRI3JC2R-C0J9iwTO.js.map +1 -0
- package/dist/static/index.html +71 -0
- package/dist/static/testing/dom-observation-utils.js +425 -0
- package/dist/static/testing/e2e-test-helper.js +3119 -0
- package/dist/team.js +1160 -0
- package/dist/tellask.js +431 -0
- package/dist/tool.js +150 -0
- package/dist/tools/apply-patch.js +542 -0
- package/dist/tools/builtins.js +196 -0
- package/dist/tools/context-health.js +177 -0
- package/dist/tools/ctrl.js +478 -0
- package/dist/tools/diag.js +583 -0
- package/dist/tools/env.js +184 -0
- package/dist/tools/fs.js +818 -0
- package/dist/tools/mcp.js +138 -0
- package/dist/tools/mem.js +349 -0
- package/dist/tools/os.js +751 -0
- package/dist/tools/prompts/team_mgmt.en.md +70 -0
- package/dist/tools/prompts/team_mgmt.zh.md +70 -0
- package/dist/tools/prompts/ws_mod.en.md +86 -0
- package/dist/tools/prompts/ws_mod.zh.md +87 -0
- package/dist/tools/registry-snapshot.js +31 -0
- package/dist/tools/registry.js +121 -0
- package/dist/tools/ripgrep.js +678 -0
- package/dist/tools/team-mgmt.js +3300 -0
- package/dist/tools/txt.js +3178 -0
- package/dist/utils/id.js +72 -0
- package/dist/utils/task-doc.js +236 -0
- package/dist/utils/task-package.js +522 -0
- package/dist/utils/taskdoc-search.js +280 -0
- package/dist/utils/taskdoc.js +400 -0
- package/package.json +69 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.globalDialogRegistry = void 0;
|
|
4
|
+
const persistence_1 = require("./persistence");
|
|
5
|
+
class GlobalDialogRegistry {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.entries = new Map();
|
|
8
|
+
}
|
|
9
|
+
static getInstance() {
|
|
10
|
+
if (!GlobalDialogRegistry.instance) {
|
|
11
|
+
GlobalDialogRegistry.instance = new GlobalDialogRegistry();
|
|
12
|
+
}
|
|
13
|
+
return GlobalDialogRegistry.instance;
|
|
14
|
+
}
|
|
15
|
+
get(rootId) {
|
|
16
|
+
return this.entries.get(rootId)?.rootDialog;
|
|
17
|
+
}
|
|
18
|
+
register(rootDialog) {
|
|
19
|
+
// This registry is keyed by the *tree root id*.
|
|
20
|
+
// Only the canonical root dialog (selfId === rootId) should be stored here.
|
|
21
|
+
if (rootDialog.id.selfId !== rootDialog.id.rootId) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const existing = this.entries.get(rootDialog.id.rootId);
|
|
25
|
+
if (existing) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
this.entries.set(rootDialog.id.rootId, { rootDialog, needsDrive: false });
|
|
29
|
+
void (async () => {
|
|
30
|
+
try {
|
|
31
|
+
const needsDrive = await persistence_1.DialogPersistence.getNeedsDrive(rootDialog.id);
|
|
32
|
+
if (needsDrive) {
|
|
33
|
+
this.markNeedsDrive(rootDialog.id.rootId);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Best-effort hydration; backend driver will still function for runtime-triggered drives.
|
|
38
|
+
}
|
|
39
|
+
})();
|
|
40
|
+
}
|
|
41
|
+
unregister(rootId) {
|
|
42
|
+
this.entries.delete(rootId);
|
|
43
|
+
}
|
|
44
|
+
markNeedsDrive(rootId) {
|
|
45
|
+
const entry = this.entries.get(rootId);
|
|
46
|
+
if (entry) {
|
|
47
|
+
entry.needsDrive = true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
markNotNeedingDrive(rootId) {
|
|
51
|
+
const entry = this.entries.get(rootId);
|
|
52
|
+
if (entry) {
|
|
53
|
+
entry.needsDrive = false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
getDialogsNeedingDrive() {
|
|
57
|
+
return Array.from(this.entries.values())
|
|
58
|
+
.filter((entry) => entry.needsDrive)
|
|
59
|
+
.map((entry) => entry.rootDialog);
|
|
60
|
+
}
|
|
61
|
+
getAll() {
|
|
62
|
+
return Array.from(this.entries.values()).map((entry) => entry.rootDialog);
|
|
63
|
+
}
|
|
64
|
+
get size() {
|
|
65
|
+
return this.entries.size;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.globalDialogRegistry = GlobalDialogRegistry.getInstance();
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getOrRestoreRootDialog = getOrRestoreRootDialog;
|
|
4
|
+
exports.ensureDialogLoaded = ensureDialogLoaded;
|
|
5
|
+
const dialog_1 = require("./dialog");
|
|
6
|
+
const dialog_global_registry_1 = require("./dialog-global-registry");
|
|
7
|
+
const persistence_1 = require("./persistence");
|
|
8
|
+
async function getOrRestoreRootDialog(rootId, status) {
|
|
9
|
+
const existing = dialog_global_registry_1.globalDialogRegistry.get(rootId);
|
|
10
|
+
if (existing) {
|
|
11
|
+
existing.setPersistenceStatus(status);
|
|
12
|
+
await existing.loadSubdialogRegistry();
|
|
13
|
+
await existing.loadPendingSubdialogsFromPersistence();
|
|
14
|
+
return existing;
|
|
15
|
+
}
|
|
16
|
+
const rootDialogId = new dialog_1.DialogID(rootId);
|
|
17
|
+
const rootState = await persistence_1.DialogPersistence.restoreDialog(rootDialogId, status);
|
|
18
|
+
if (!rootState)
|
|
19
|
+
return undefined;
|
|
20
|
+
const latest = await persistence_1.DialogPersistence.loadDialogLatest(rootDialogId, status);
|
|
21
|
+
const rootStore = new persistence_1.DiskFileDialogStore(rootDialogId);
|
|
22
|
+
const rootDialog = new dialog_1.RootDialog(rootStore, rootState.metadata.taskDocPath, rootDialogId, rootState.metadata.agentId, {
|
|
23
|
+
messages: rootState.messages,
|
|
24
|
+
reminders: rootState.reminders,
|
|
25
|
+
currentRound: rootState.currentRound,
|
|
26
|
+
contextHealth: rootState.contextHealth,
|
|
27
|
+
});
|
|
28
|
+
rootDialog.disableDiligencePush = latest?.disableDiligencePush ?? false;
|
|
29
|
+
rootDialog.setPersistenceStatus(status);
|
|
30
|
+
dialog_global_registry_1.globalDialogRegistry.register(rootDialog);
|
|
31
|
+
// Keep the in-memory root dialog fully hydrated regardless of persistence status
|
|
32
|
+
// (running/completed/archived) so subdialog lookup is stable across UI navigation.
|
|
33
|
+
await rootDialog.loadSubdialogRegistry();
|
|
34
|
+
await rootDialog.loadPendingSubdialogsFromPersistence();
|
|
35
|
+
return rootDialog;
|
|
36
|
+
}
|
|
37
|
+
async function ensureDialogLoaded(rootDialog, targetId, status, visitedSelfIds = new Set()) {
|
|
38
|
+
if (targetId.selfId === targetId.rootId)
|
|
39
|
+
return rootDialog;
|
|
40
|
+
const existing = rootDialog.lookupDialog(targetId.selfId);
|
|
41
|
+
if (existing)
|
|
42
|
+
return existing;
|
|
43
|
+
if (visitedSelfIds.has(targetId.selfId))
|
|
44
|
+
return undefined;
|
|
45
|
+
visitedSelfIds.add(targetId.selfId);
|
|
46
|
+
const metadata = await persistence_1.DialogPersistence.loadDialogMetadata(targetId, status);
|
|
47
|
+
if (!metadata)
|
|
48
|
+
return undefined;
|
|
49
|
+
// Ensure parent dialog (supdialog) exists in root registry for SubDialog.supdialog resolution.
|
|
50
|
+
if (metadata.supdialogId && metadata.supdialogId !== targetId.rootId) {
|
|
51
|
+
await ensureDialogLoaded(rootDialog, new dialog_1.DialogID(metadata.supdialogId, targetId.rootId), status, visitedSelfIds);
|
|
52
|
+
}
|
|
53
|
+
const state = await persistence_1.DialogPersistence.restoreDialog(targetId, status);
|
|
54
|
+
if (!state)
|
|
55
|
+
return undefined;
|
|
56
|
+
const latest = await persistence_1.DialogPersistence.loadDialogLatest(targetId, status);
|
|
57
|
+
const assignmentFromSup = state.metadata.assignmentFromSup;
|
|
58
|
+
if (!assignmentFromSup)
|
|
59
|
+
return undefined;
|
|
60
|
+
// Ensure the caller dialog exists so SubDialog can resolve its effective supdialog.
|
|
61
|
+
if (assignmentFromSup.callerDialogId &&
|
|
62
|
+
assignmentFromSup.callerDialogId !== targetId.rootId &&
|
|
63
|
+
assignmentFromSup.callerDialogId !== targetId.selfId) {
|
|
64
|
+
await ensureDialogLoaded(rootDialog, new dialog_1.DialogID(assignmentFromSup.callerDialogId, targetId.rootId), status, visitedSelfIds);
|
|
65
|
+
}
|
|
66
|
+
const store = new persistence_1.DiskFileDialogStore(targetId);
|
|
67
|
+
const subdialog = new dialog_1.SubDialog(store, rootDialog, state.metadata.taskDocPath, targetId, state.metadata.agentId, assignmentFromSup, state.metadata.tellaskSession, {
|
|
68
|
+
messages: state.messages,
|
|
69
|
+
reminders: state.reminders,
|
|
70
|
+
currentRound: state.currentRound,
|
|
71
|
+
contextHealth: state.contextHealth,
|
|
72
|
+
});
|
|
73
|
+
subdialog.disableDiligencePush = latest?.disableDiligencePush ?? false;
|
|
74
|
+
if (subdialog.tellaskSession) {
|
|
75
|
+
rootDialog.registerSubdialog(subdialog);
|
|
76
|
+
}
|
|
77
|
+
return subdialog;
|
|
78
|
+
}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Module: dialog-run-state
|
|
4
|
+
*
|
|
5
|
+
* Owns the authoritative proceeding/idle/interrupted/blocked/terminal state for dialogs,
|
|
6
|
+
* plus best-effort cancellation for in-flight dialog drives.
|
|
7
|
+
*
|
|
8
|
+
* Design constraints:
|
|
9
|
+
* - State is persisted to latest.yaml (`DialogLatestFile.runState`) so it survives restarts.
|
|
10
|
+
* - "Stop" is best-effort: it aborts in-flight LLM streaming and lets the driver unwind.
|
|
11
|
+
* - Broadcasting is optional: when configured, run-state updates are pushed to all WS clients
|
|
12
|
+
* so multi-tab views converge without polling.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.setRunStateBroadcaster = setRunStateBroadcaster;
|
|
16
|
+
exports.hasActiveRun = hasActiveRun;
|
|
17
|
+
exports.getActiveRunSignal = getActiveRunSignal;
|
|
18
|
+
exports.createActiveRun = createActiveRun;
|
|
19
|
+
exports.clearActiveRun = clearActiveRun;
|
|
20
|
+
exports.getStopRequestedReason = getStopRequestedReason;
|
|
21
|
+
exports.setDialogRunState = setDialogRunState;
|
|
22
|
+
exports.broadcastRunStateMarker = broadcastRunStateMarker;
|
|
23
|
+
exports.computeIdleRunState = computeIdleRunState;
|
|
24
|
+
exports.reconcileRunStatesAfterRestart = reconcileRunStatesAfterRestart;
|
|
25
|
+
exports.requestInterruptDialog = requestInterruptDialog;
|
|
26
|
+
exports.requestEmergencyStopAll = requestEmergencyStopAll;
|
|
27
|
+
const dialog_1 = require("./dialog");
|
|
28
|
+
const evt_registry_1 = require("./evt-registry");
|
|
29
|
+
const log_1 = require("./log");
|
|
30
|
+
const persistence_1 = require("./persistence");
|
|
31
|
+
const log = (0, log_1.createLogger)('dialog-run-state');
|
|
32
|
+
let broadcastToClients;
|
|
33
|
+
const activeRunsByDialogKey = new Map();
|
|
34
|
+
function setRunStateBroadcaster(fn) {
|
|
35
|
+
broadcastToClients = fn;
|
|
36
|
+
}
|
|
37
|
+
function hasActiveRun(dialogId) {
|
|
38
|
+
return activeRunsByDialogKey.has(dialogId.key());
|
|
39
|
+
}
|
|
40
|
+
function getActiveRunSignal(dialogId) {
|
|
41
|
+
const run = activeRunsByDialogKey.get(dialogId.key());
|
|
42
|
+
return run?.abortController.signal;
|
|
43
|
+
}
|
|
44
|
+
function createActiveRun(dialogId) {
|
|
45
|
+
const key = dialogId.key();
|
|
46
|
+
const existing = activeRunsByDialogKey.get(key);
|
|
47
|
+
if (existing) {
|
|
48
|
+
return existing.abortController.signal;
|
|
49
|
+
}
|
|
50
|
+
const run = { abortController: new AbortController() };
|
|
51
|
+
activeRunsByDialogKey.set(key, run);
|
|
52
|
+
return run.abortController.signal;
|
|
53
|
+
}
|
|
54
|
+
function clearActiveRun(dialogId) {
|
|
55
|
+
activeRunsByDialogKey.delete(dialogId.key());
|
|
56
|
+
}
|
|
57
|
+
function getStopRequestedReason(dialogId) {
|
|
58
|
+
return activeRunsByDialogKey.get(dialogId.key())?.stopRequested;
|
|
59
|
+
}
|
|
60
|
+
async function setDialogRunState(dialogId, runState) {
|
|
61
|
+
try {
|
|
62
|
+
await persistence_1.DialogPersistence.mutateDialogLatest(dialogId, () => ({
|
|
63
|
+
kind: 'patch',
|
|
64
|
+
patch: { runState },
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
log.warn('Failed to persist dialog runState', err, { dialogId: dialogId.valueOf() });
|
|
69
|
+
}
|
|
70
|
+
const typed = evt_registry_1.dialogEventRegistry.createTypedEvent(dialogId, {
|
|
71
|
+
type: 'dlg_run_state_evt',
|
|
72
|
+
runState,
|
|
73
|
+
});
|
|
74
|
+
if (broadcastToClients) {
|
|
75
|
+
broadcastToClients(typed);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function broadcastRunStateMarker(dialogId, marker) {
|
|
79
|
+
const typed = evt_registry_1.dialogEventRegistry.createTypedEvent(dialogId, {
|
|
80
|
+
type: 'dlg_run_state_marker_evt',
|
|
81
|
+
kind: marker.kind,
|
|
82
|
+
reason: marker.reason,
|
|
83
|
+
});
|
|
84
|
+
if (broadcastToClients) {
|
|
85
|
+
broadcastToClients(typed);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async function computeIdleRunState(dlg) {
|
|
89
|
+
if (dlg.status === 'completed' || dlg.status === 'archived') {
|
|
90
|
+
return { kind: 'terminal', status: dlg.status };
|
|
91
|
+
}
|
|
92
|
+
const hasQ4H = await dlg.hasPendingQ4H();
|
|
93
|
+
const hasSubdialogs = await dlg.hasPendingSubdialogs();
|
|
94
|
+
if (hasQ4H && hasSubdialogs) {
|
|
95
|
+
return { kind: 'blocked', reason: { kind: 'needs_human_input_and_subdialogs' } };
|
|
96
|
+
}
|
|
97
|
+
if (hasQ4H) {
|
|
98
|
+
return { kind: 'blocked', reason: { kind: 'needs_human_input' } };
|
|
99
|
+
}
|
|
100
|
+
if (hasSubdialogs) {
|
|
101
|
+
return { kind: 'blocked', reason: { kind: 'waiting_for_subdialogs' } };
|
|
102
|
+
}
|
|
103
|
+
return { kind: 'idle_waiting_user' };
|
|
104
|
+
}
|
|
105
|
+
async function computeIdleRunStateFromPersistence(dialogId) {
|
|
106
|
+
const latest = await persistence_1.DialogPersistence.loadDialogLatest(dialogId, 'running');
|
|
107
|
+
const status = latest?.status;
|
|
108
|
+
if (status === 'completed' || status === 'archived') {
|
|
109
|
+
return { kind: 'terminal', status };
|
|
110
|
+
}
|
|
111
|
+
const q4h = await persistence_1.DialogPersistence.loadQuestions4HumanState(dialogId, 'running');
|
|
112
|
+
const pendingSubdialogs = await persistence_1.DialogPersistence.loadPendingSubdialogs(dialogId, 'running');
|
|
113
|
+
const hasQ4H = q4h.length > 0;
|
|
114
|
+
const hasSubdialogs = pendingSubdialogs.length > 0;
|
|
115
|
+
if (hasQ4H && hasSubdialogs) {
|
|
116
|
+
return { kind: 'blocked', reason: { kind: 'needs_human_input_and_subdialogs' } };
|
|
117
|
+
}
|
|
118
|
+
if (hasQ4H) {
|
|
119
|
+
return { kind: 'blocked', reason: { kind: 'needs_human_input' } };
|
|
120
|
+
}
|
|
121
|
+
if (hasSubdialogs) {
|
|
122
|
+
return { kind: 'blocked', reason: { kind: 'waiting_for_subdialogs' } };
|
|
123
|
+
}
|
|
124
|
+
return { kind: 'idle_waiting_user' };
|
|
125
|
+
}
|
|
126
|
+
async function reconcileRunStatesAfterRestart() {
|
|
127
|
+
const dialogIds = await persistence_1.DialogPersistence.listAllDialogIds('running');
|
|
128
|
+
for (const dialogId of dialogIds) {
|
|
129
|
+
const latest = await persistence_1.DialogPersistence.loadDialogLatest(dialogId, 'running');
|
|
130
|
+
const existing = latest?.runState;
|
|
131
|
+
const wasProceeding = latest?.generating === true ||
|
|
132
|
+
(existing !== undefined &&
|
|
133
|
+
(existing.kind === 'proceeding' || existing.kind === 'proceeding_stop_requested'));
|
|
134
|
+
if (wasProceeding) {
|
|
135
|
+
const nextIdle = await computeIdleRunStateFromPersistence(dialogId);
|
|
136
|
+
const next = nextIdle.kind === 'blocked'
|
|
137
|
+
? nextIdle
|
|
138
|
+
: { kind: 'interrupted', reason: { kind: 'server_restart' } };
|
|
139
|
+
try {
|
|
140
|
+
await persistence_1.DialogPersistence.mutateDialogLatest(dialogId, () => ({
|
|
141
|
+
kind: 'patch',
|
|
142
|
+
patch: { generating: false, runState: next },
|
|
143
|
+
}));
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
log.warn('Failed to reconcile proceeding dialog after restart', err, {
|
|
147
|
+
dialogId: dialogId.valueOf(),
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
if (!existing) {
|
|
153
|
+
const inferred = await computeIdleRunStateFromPersistence(dialogId);
|
|
154
|
+
try {
|
|
155
|
+
await persistence_1.DialogPersistence.mutateDialogLatest(dialogId, () => ({
|
|
156
|
+
kind: 'patch',
|
|
157
|
+
patch: { runState: inferred },
|
|
158
|
+
}));
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
log.warn('Failed to backfill missing runState', err, { dialogId: dialogId.valueOf() });
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
async function requestInterruptDialog(dialogId, reason) {
|
|
167
|
+
const key = dialogId.key();
|
|
168
|
+
const run = activeRunsByDialogKey.get(key);
|
|
169
|
+
if (!run) {
|
|
170
|
+
return { applied: false };
|
|
171
|
+
}
|
|
172
|
+
if (run.stopRequested) {
|
|
173
|
+
return { applied: false };
|
|
174
|
+
}
|
|
175
|
+
run.stopRequested = reason;
|
|
176
|
+
await setDialogRunState(dialogId, { kind: 'proceeding_stop_requested', reason });
|
|
177
|
+
try {
|
|
178
|
+
run.abortController.abort();
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
log.warn('Failed to abort active run', err, { dialogId: dialogId.valueOf() });
|
|
182
|
+
}
|
|
183
|
+
return { applied: true };
|
|
184
|
+
}
|
|
185
|
+
async function requestEmergencyStopAll() {
|
|
186
|
+
const keys = [...activeRunsByDialogKey.keys()];
|
|
187
|
+
let interrupted = 0;
|
|
188
|
+
for (const key of keys) {
|
|
189
|
+
const [rootId, selfId] = key.includes('#') ? key.split('#') : [key, key];
|
|
190
|
+
if (!rootId || !selfId)
|
|
191
|
+
continue;
|
|
192
|
+
const dialogId = new dialog_1.DialogID(selfId, rootId);
|
|
193
|
+
const res = await requestInterruptDialog(dialogId, 'emergency_stop');
|
|
194
|
+
if (res.applied)
|
|
195
|
+
interrupted++;
|
|
196
|
+
}
|
|
197
|
+
return { interrupted };
|
|
198
|
+
}
|