dominds 1.23.10 → 1.24.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/dist/apps/runtime.js +2 -2
- package/dist/dialog-display-state.d.ts +2 -3
- package/dist/dialog-display-state.js +53 -145
- package/dist/dialog-drive-work.d.ts +3 -0
- package/dist/dialog-drive-work.js +21 -0
- package/dist/dialog-fork.d.ts +0 -1
- package/dist/dialog-fork.js +28 -32
- package/dist/dialog-generation-run.d.ts +4 -0
- package/dist/dialog-generation-run.js +24 -0
- package/dist/dialog-global-registry.d.ts +7 -8
- package/dist/dialog-global-registry.js +39 -33
- package/dist/dialog-instance-registry.js +12 -12
- package/dist/dialog-interruption.js +2 -2
- package/dist/dialog-latest-state.d.ts +4 -0
- package/dist/dialog-latest-state.js +14 -0
- package/dist/dialog.d.ts +31 -30
- package/dist/dialog.js +146 -56
- package/dist/docs/agent-priming.md +1 -1
- package/dist/docs/agent-priming.zh.md +1 -1
- package/dist/docs/app-constitution.md +1 -1
- package/dist/docs/app-constitution.zh.md +1 -1
- package/dist/docs/dialog-persistence.md +2 -2
- package/dist/docs/dialog-persistence.zh.md +2 -2
- package/dist/docs/dialog-system.md +72 -75
- package/dist/docs/dialog-system.zh.md +79 -82
- package/dist/docs/diligence-push.md +30 -40
- package/dist/docs/diligence-push.zh.md +15 -20
- package/dist/docs/dominds-agent-collaboration.zh.md +12 -10
- package/dist/docs/dominds-terminology.md +5 -2
- package/dist/docs/idle-reminder-wake.md +1 -1
- package/dist/docs/idle-reminder-wake.zh.md +1 -1
- package/dist/docs/issues/tellask-background-continuation-live-bugs-2026-05-17.zh.md +101 -0
- package/dist/docs/mcp-prompts-resources.md +13 -6
- package/dist/docs/mcp-support.md +18 -9
- package/dist/docs/mcp-support.zh.md +13 -8
- package/dist/docs/memory-system.md +51 -1
- package/dist/docs/memory-system.zh.md +51 -1
- package/dist/docs/team_mgmt-toolset.md +27 -10
- package/dist/docs/team_mgmt-toolset.zh.md +20 -9
- package/dist/docs/tellask-background-continuation-refactor.zh.md +1017 -0
- package/dist/docs/tellask-collab.md +4 -4
- package/dist/docs/tellask-collab.zh.md +4 -4
- package/dist/evt-registry.js +1 -0
- package/dist/llm/defaults.yaml +12 -9
- package/dist/llm/kernel-driver/drive.js +295 -70
- package/dist/llm/kernel-driver/engine.d.ts +1 -1
- package/dist/llm/kernel-driver/engine.js +4 -4
- package/dist/llm/kernel-driver/flow.js +197 -130
- package/dist/llm/kernel-driver/idle-reminder-wake.js +2 -4
- package/dist/llm/kernel-driver/loop.d.ts +4 -1
- package/dist/llm/kernel-driver/loop.js +268 -62
- package/dist/llm/kernel-driver/reply-guidance.js +29 -50
- package/dist/llm/kernel-driver/runtime.d.ts +10 -0
- package/dist/llm/kernel-driver/runtime.js +29 -84
- package/dist/llm/kernel-driver/sideDialog-txn.js +3 -0
- package/dist/llm/kernel-driver/sideDialog.d.ts +4 -13
- package/dist/llm/kernel-driver/sideDialog.js +165 -161
- package/dist/llm/kernel-driver/tellask-special.d.ts +5 -2
- package/dist/llm/kernel-driver/tellask-special.js +166 -184
- package/dist/llm/kernel-driver/types.d.ts +12 -8
- package/dist/mcp/config.d.ts +13 -5
- package/dist/mcp/config.js +37 -24
- package/dist/mcp/resources.d.ts +14 -3
- package/dist/mcp/resources.js +9 -6
- package/dist/mcp/supervisor.js +6 -1
- package/dist/mcp/tool-names.d.ts +2 -2
- package/dist/mcp/tool-names.js +4 -7
- package/dist/minds/system-prompt-parts.js +3 -0
- package/dist/persistence-errors.d.ts +1 -1
- package/dist/persistence.d.ts +80 -51
- package/dist/persistence.js +1750 -427
- package/dist/priming.d.ts +1 -1
- package/dist/priming.js +2 -2
- package/dist/recovery/proceeding-drive.js +46 -11
- package/dist/recovery/reply-special.js +42 -35
- package/dist/runtime/background-callee-summary.d.ts +2 -0
- package/dist/runtime/background-callee-summary.js +14 -0
- package/dist/runtime/driver-messages.d.ts +0 -8
- package/dist/runtime/driver-messages.js +0 -59
- package/dist/server/api-routes.js +40 -27
- package/dist/server/websocket-handler.js +39 -78
- package/dist/server.js +2 -2
- package/dist/shared-reminders.js +14 -3
- package/dist/skills/load.d.ts +7 -0
- package/dist/tools/cmd-runner.js +2 -0
- package/dist/tools/ctrl.js +6 -6
- package/dist/tools/os.js +2 -0
- package/dist/tools/pending-tellask-reminder.js +9 -9
- package/dist/tools/prompts/control/en/index.md +2 -0
- package/dist/tools/prompts/control/en/principles.md +1 -0
- package/dist/tools/prompts/control/en/tools.md +3 -0
- package/dist/tools/prompts/control/zh/index.md +2 -0
- package/dist/tools/prompts/control/zh/principles.md +1 -0
- package/dist/tools/prompts/control/zh/tools.md +3 -0
- package/dist/tools/prompts/personal_memory/en/principles.md +4 -1
- package/dist/tools/prompts/personal_memory/zh/principles.md +4 -1
- package/dist/tools/prompts/skills/en/index.md +1 -1
- package/dist/tools/prompts/skills/en/principles.md +5 -1
- package/dist/tools/prompts/skills/zh/index.md +1 -1
- package/dist/tools/prompts/skills/zh/principles.md +5 -1
- package/dist/tools/prompts/team_memory/en/principles.md +3 -0
- package/dist/tools/prompts/team_memory/en/scenarios.md +1 -1
- package/dist/tools/prompts/team_memory/zh/principles.md +3 -0
- package/dist/tools/prompts/team_memory/zh/scenarios.md +1 -1
- package/dist/tools/shell-capture-env.d.ts +1 -0
- package/dist/tools/shell-capture-env.js +44 -0
- package/dist/tools/skills.js +2 -0
- package/dist/tools/team_mgmt-mcp-manual.js +8 -8
- package/dist/tools/team_mgmt.js +34 -12
- package/dist/utils/task-package.js +9 -1
- package/package.json +3 -3
- package/webapp/dist/assets/{_basePickBy-CBh9Agsi.js → _basePickBy-LdPzzrA2.js} +3 -3
- package/webapp/dist/assets/_basePickBy-LdPzzrA2.js.map +1 -0
- package/webapp/dist/assets/{_baseUniq-D2UXV506.js → _baseUniq-Dd4qkGWy.js} +2 -2
- package/webapp/dist/assets/_baseUniq-Dd4qkGWy.js.map +1 -0
- package/webapp/dist/assets/{arc-CmeRUuzC.js → arc-Bx35xRdo.js} +2 -2
- package/webapp/dist/assets/arc-Bx35xRdo.js.map +1 -0
- package/webapp/dist/assets/{architectureDiagram-VXUJARFQ-D5hfsb4A.js → architectureDiagram-2XIMDMQ5-CqJear9j.js} +26 -8
- package/webapp/dist/assets/architectureDiagram-2XIMDMQ5-CqJear9j.js.map +1 -0
- package/webapp/dist/assets/{blockDiagram-VD42YOAC-BVswEa9D.js → blockDiagram-WCTKOSBZ-9tLmXg6W.js} +187 -170
- package/webapp/dist/assets/blockDiagram-WCTKOSBZ-9tLmXg6W.js.map +1 -0
- package/webapp/dist/assets/{c4Diagram-YG6GDRKO-Bgm6yzGX.js → c4Diagram-IC4MRINW-Dzv3iLb1.js} +4 -4
- package/webapp/dist/assets/c4Diagram-IC4MRINW-Dzv3iLb1.js.map +1 -0
- package/webapp/dist/assets/{channel-CDo0v82C.js → channel-DlYmbJjD.js} +2 -2
- package/webapp/dist/assets/channel-DlYmbJjD.js.map +1 -0
- package/webapp/dist/assets/{chunk-4BX2VUAB-DMqSdYxu.js → chunk-4BX2VUAB-H-sbLEAZ.js} +2 -2
- package/webapp/dist/assets/chunk-4BX2VUAB-H-sbLEAZ.js.map +1 -0
- package/webapp/dist/assets/{chunk-55IACEB6-CudmE3Fx.js → chunk-55IACEB6-DM99Uhn7.js} +2 -2
- package/webapp/dist/assets/chunk-55IACEB6-DM99Uhn7.js.map +1 -0
- package/webapp/dist/assets/{chunk-FMBD7UC4-BSVSuNxy.js → chunk-FMBD7UC4-BrYi5v3v.js} +2 -2
- package/webapp/dist/assets/chunk-FMBD7UC4-BrYi5v3v.js.map +1 -0
- package/webapp/dist/assets/{chunk-TZMSLE5B-aW2uEdtS.js → chunk-JSJVCQXG-xsaAqb_D.js} +14 -6
- package/webapp/dist/assets/chunk-JSJVCQXG-xsaAqb_D.js.map +1 -0
- package/webapp/dist/assets/{chunk-QN33PNHL-Cbf-pIxI.js → chunk-KX2RTZJC-DP9JzJzb.js} +2 -2
- package/webapp/dist/assets/chunk-KX2RTZJC-DP9JzJzb.js.map +1 -0
- package/webapp/dist/assets/{chunk-DI55MBZ5-CZCetJxI.js → chunk-NQ4KR5QH-B1Dmz0tx.js} +9 -7
- package/webapp/dist/assets/chunk-NQ4KR5QH-B1Dmz0tx.js.map +1 -0
- package/webapp/dist/assets/{chunk-QZHKN3VN-DYyIY8_q.js → chunk-QZHKN3VN-1BrJQ9T8.js} +2 -2
- package/webapp/dist/assets/chunk-QZHKN3VN-1BrJQ9T8.js.map +1 -0
- package/webapp/dist/assets/{chunk-B4BG7PRW-d5dfiagO.js → chunk-WL4C6EOR-m9798qm6.js} +171 -121
- package/webapp/dist/assets/chunk-WL4C6EOR-m9798qm6.js.map +1 -0
- package/webapp/dist/assets/{classDiagram-2ON5EDUG-C4-5PgVL.js → classDiagram-VBA2DB6C-DunVoVHy.js} +7 -6
- package/webapp/dist/assets/classDiagram-VBA2DB6C-DunVoVHy.js.map +1 -0
- package/webapp/dist/assets/{classDiagram-v2-WZHVMYZB-C4-5PgVL.js → classDiagram-v2-RAHNMMFH-DunVoVHy.js} +7 -6
- package/webapp/dist/assets/classDiagram-v2-RAHNMMFH-DunVoVHy.js.map +1 -0
- package/webapp/dist/assets/{clone-DivPByZ0.js → clone-CxYNYmli.js} +2 -2
- package/webapp/dist/assets/clone-CxYNYmli.js.map +1 -0
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-CwBAjMT3.js → cose-bilkent-S5V4N54A-CnD5vxv9.js} +2 -2
- package/webapp/dist/assets/cose-bilkent-S5V4N54A-CnD5vxv9.js.map +1 -0
- package/webapp/dist/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -1
- package/webapp/dist/assets/{dagre-6UL2VRFP-tC56AIio.js → dagre-KLK3FWXG-D8iLo6g8.js} +7 -7
- package/webapp/dist/assets/dagre-KLK3FWXG-D8iLo6g8.js.map +1 -0
- package/webapp/dist/assets/defaultLocale-B2RvLBDe.js.map +1 -1
- package/webapp/dist/assets/{diagram-PSM6KHXK-dEF_O6uj.js → diagram-E7M64L7V-CCGf4yS4.js} +10 -10
- package/webapp/dist/assets/diagram-E7M64L7V-CCGf4yS4.js.map +1 -0
- package/webapp/dist/assets/{diagram-QEK2KX5R-BC3CyB81.js → diagram-IFDJBPK2-nZVTTM2s.js} +9 -8
- package/webapp/dist/assets/diagram-IFDJBPK2-nZVTTM2s.js.map +1 -0
- package/webapp/dist/assets/{diagram-S2PKOQOG-BV-YMbA_.js → diagram-P4PSJMXO-DUG05oR4.js} +8 -8
- package/webapp/dist/assets/diagram-P4PSJMXO-DUG05oR4.js.map +1 -0
- package/webapp/dist/assets/{erDiagram-Q2GNP2WA-DIgdtwce.js → erDiagram-INFDFZHY-DTtcqarO.js} +96 -75
- package/webapp/dist/assets/erDiagram-INFDFZHY-DTtcqarO.js.map +1 -0
- package/webapp/dist/assets/{flowDiagram-NV44I4VS-C7Mawlld.js → flowDiagram-PKNHOUZH-Ol68h2lV.js} +98 -81
- package/webapp/dist/assets/flowDiagram-PKNHOUZH-Ol68h2lV.js.map +1 -0
- package/webapp/dist/assets/{ganttDiagram-JELNMOA3-DgaYLOeL.js → ganttDiagram-A5KZAMGK-BD9KkhMb.js} +28 -3
- package/webapp/dist/assets/ganttDiagram-A5KZAMGK-BD9KkhMb.js.map +1 -0
- package/webapp/dist/assets/{gitGraphDiagram-V2S2FVAM-Dwv1ZLFB.js → gitGraphDiagram-K3NZZRJ6-CZ4C5yhB.js} +38 -46
- package/webapp/dist/assets/gitGraphDiagram-K3NZZRJ6-CZ4C5yhB.js.map +1 -0
- package/webapp/dist/assets/graph-BICDsOFt.js +782 -0
- package/webapp/dist/assets/graph-BICDsOFt.js.map +1 -0
- package/webapp/dist/assets/{index-BGdI3lWA.css → index-BQoNJEGT.css} +19 -27
- package/webapp/dist/assets/{index-BsSFGqVX.js → index-BTMpGPk_.js} +1365 -1335
- package/webapp/dist/assets/{index-BsSFGqVX.js.map → index-BTMpGPk_.js.map} +1 -1
- package/webapp/dist/assets/{infoDiagram-HS3SLOUP-PDKRqD6y.js → infoDiagram-LFFYTUFH-D0xrjViS.js} +7 -7
- package/webapp/dist/assets/infoDiagram-LFFYTUFH-D0xrjViS.js.map +1 -0
- package/webapp/dist/assets/init-ZxktEp_H.js.map +1 -1
- package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-Beaj-xkw.js +966 -0
- package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-Beaj-xkw.js.map +1 -0
- package/webapp/dist/assets/{journeyDiagram-XKPGCS4Q-DDD6YlTa.js → journeyDiagram-4ABVD52K-k7BmCpXO.js} +5 -5
- package/webapp/dist/assets/journeyDiagram-4ABVD52K-k7BmCpXO.js.map +1 -0
- package/webapp/dist/assets/{kanban-definition-3W4ZIXB7-CK-CJzXm.js → kanban-definition-K7BYSVSG-BBQOWu--.js} +5 -3
- package/webapp/dist/assets/kanban-definition-K7BYSVSG-BBQOWu--.js.map +1 -0
- package/webapp/dist/assets/{layout-DRs2ltCp.js → layout-B_h66HyR.js} +5 -5
- package/webapp/dist/assets/layout-B_h66HyR.js.map +1 -0
- package/webapp/dist/assets/{linear-CiMu0dYF.js → linear-QdCnoDG9.js} +2 -2
- package/webapp/dist/assets/linear-QdCnoDG9.js.map +1 -0
- package/webapp/dist/assets/{mindmap-definition-VGOIOE7T-C8yEoHXx.js → mindmap-definition-YRQLILUH-BTk4BxEf.js} +7 -5
- package/webapp/dist/assets/mindmap-definition-YRQLILUH-BTk4BxEf.js.map +1 -0
- package/webapp/dist/assets/ordinal-CxptdPJm.js.map +1 -1
- package/webapp/dist/assets/{pieDiagram-ADFJNKIX-BhtVILXQ.js → pieDiagram-SKSYHLDU-DQonY6Ln.js} +8 -8
- package/webapp/dist/assets/pieDiagram-SKSYHLDU-DQonY6Ln.js.map +1 -0
- package/webapp/dist/assets/{quadrantDiagram-AYHSOK5B-B7Xuuv_G.js → quadrantDiagram-337W2JSQ-6tqc3Gus.js} +3 -3
- package/webapp/dist/assets/quadrantDiagram-337W2JSQ-6tqc3Gus.js.map +1 -0
- package/webapp/dist/assets/{requirementDiagram-UZGBJVZJ-DY6Q4U6l.js → requirementDiagram-Z7DCOOCP-C6r4anqd.js} +16 -6
- package/webapp/dist/assets/requirementDiagram-Z7DCOOCP-C6r4anqd.js.map +1 -0
- package/webapp/dist/assets/{sankeyDiagram-TZEHDZUN-DZPox4PX.js → sankeyDiagram-WA2Y5GQK-DE2CTSeA.js} +2 -2
- package/webapp/dist/assets/sankeyDiagram-WA2Y5GQK-DE2CTSeA.js.map +1 -0
- package/webapp/dist/assets/{sequenceDiagram-WL72ISMW-Bg6GPP0w.js → sequenceDiagram-2WXFIKYE-DSnyMSe6.js} +601 -201
- package/webapp/dist/assets/sequenceDiagram-2WXFIKYE-DSnyMSe6.js.map +1 -0
- package/webapp/dist/assets/{stateDiagram-FKZM4ZOC-CcskYNpn.js → stateDiagram-RAJIS63D-BsQOXkdZ.js} +9 -9
- package/webapp/dist/assets/stateDiagram-RAJIS63D-BsQOXkdZ.js.map +1 -0
- package/webapp/dist/assets/{stateDiagram-v2-4FDKWEC3-Dja5UwuW.js → stateDiagram-v2-FVOUBMTO-DW0AWykH.js} +5 -5
- package/webapp/dist/assets/stateDiagram-v2-FVOUBMTO-DW0AWykH.js.map +1 -0
- package/webapp/dist/assets/{timeline-definition-IT6M3QCI-CA-Wvxg8.js → timeline-definition-YZTLITO2-Dyxr7fE4.js} +3 -3
- package/webapp/dist/assets/timeline-definition-YZTLITO2-Dyxr7fE4.js.map +1 -0
- package/webapp/dist/assets/{treemap-GDKQZRPO-CF_Fur4n.js → treemap-KZPCXAKY-CPaPLIL2.js} +37 -24
- package/webapp/dist/assets/treemap-KZPCXAKY-CPaPLIL2.js.map +1 -0
- package/webapp/dist/assets/vennDiagram-LZ73GAT5-CTduB1wl.js +2487 -0
- package/webapp/dist/assets/vennDiagram-LZ73GAT5-CTduB1wl.js.map +1 -0
- package/webapp/dist/assets/{xychartDiagram-PRI3JC2R-CYc3vOkZ.js → xychartDiagram-JWTSCODW-Sb80BTd7.js} +4 -4
- package/webapp/dist/assets/xychartDiagram-JWTSCODW-Sb80BTd7.js.map +1 -0
- package/webapp/dist/index.html +2 -2
- package/dist/docs/tellask-revive-context-refactor.zh.md +0 -604
- package/webapp/dist/assets/_basePickBy-CBh9Agsi.js.map +0 -1
- package/webapp/dist/assets/_baseUniq-D2UXV506.js.map +0 -1
- package/webapp/dist/assets/arc-CmeRUuzC.js.map +0 -1
- package/webapp/dist/assets/architectureDiagram-VXUJARFQ-D5hfsb4A.js.map +0 -1
- package/webapp/dist/assets/blockDiagram-VD42YOAC-BVswEa9D.js.map +0 -1
- package/webapp/dist/assets/c4Diagram-YG6GDRKO-Bgm6yzGX.js.map +0 -1
- package/webapp/dist/assets/channel-CDo0v82C.js.map +0 -1
- package/webapp/dist/assets/chunk-4BX2VUAB-DMqSdYxu.js.map +0 -1
- package/webapp/dist/assets/chunk-55IACEB6-CudmE3Fx.js.map +0 -1
- package/webapp/dist/assets/chunk-B4BG7PRW-d5dfiagO.js.map +0 -1
- package/webapp/dist/assets/chunk-DI55MBZ5-CZCetJxI.js.map +0 -1
- package/webapp/dist/assets/chunk-FMBD7UC4-BSVSuNxy.js.map +0 -1
- package/webapp/dist/assets/chunk-QN33PNHL-Cbf-pIxI.js.map +0 -1
- package/webapp/dist/assets/chunk-QZHKN3VN-DYyIY8_q.js.map +0 -1
- package/webapp/dist/assets/chunk-TZMSLE5B-aW2uEdtS.js.map +0 -1
- package/webapp/dist/assets/classDiagram-2ON5EDUG-C4-5PgVL.js.map +0 -1
- package/webapp/dist/assets/classDiagram-v2-WZHVMYZB-C4-5PgVL.js.map +0 -1
- package/webapp/dist/assets/clone-DivPByZ0.js.map +0 -1
- package/webapp/dist/assets/cose-bilkent-S5V4N54A-CwBAjMT3.js.map +0 -1
- package/webapp/dist/assets/dagre-6UL2VRFP-tC56AIio.js.map +0 -1
- package/webapp/dist/assets/diagram-PSM6KHXK-dEF_O6uj.js.map +0 -1
- package/webapp/dist/assets/diagram-QEK2KX5R-BC3CyB81.js.map +0 -1
- package/webapp/dist/assets/diagram-S2PKOQOG-BV-YMbA_.js.map +0 -1
- package/webapp/dist/assets/erDiagram-Q2GNP2WA-DIgdtwce.js.map +0 -1
- package/webapp/dist/assets/flowDiagram-NV44I4VS-C7Mawlld.js.map +0 -1
- package/webapp/dist/assets/ganttDiagram-JELNMOA3-DgaYLOeL.js.map +0 -1
- package/webapp/dist/assets/gitGraphDiagram-V2S2FVAM-Dwv1ZLFB.js.map +0 -1
- package/webapp/dist/assets/graph-saC_350a.js +0 -425
- package/webapp/dist/assets/graph-saC_350a.js.map +0 -1
- package/webapp/dist/assets/infoDiagram-HS3SLOUP-PDKRqD6y.js.map +0 -1
- package/webapp/dist/assets/journeyDiagram-XKPGCS4Q-DDD6YlTa.js.map +0 -1
- package/webapp/dist/assets/kanban-definition-3W4ZIXB7-CK-CJzXm.js.map +0 -1
- package/webapp/dist/assets/layout-DRs2ltCp.js.map +0 -1
- package/webapp/dist/assets/linear-CiMu0dYF.js.map +0 -1
- package/webapp/dist/assets/mindmap-definition-VGOIOE7T-C8yEoHXx.js.map +0 -1
- package/webapp/dist/assets/pieDiagram-ADFJNKIX-BhtVILXQ.js.map +0 -1
- package/webapp/dist/assets/quadrantDiagram-AYHSOK5B-B7Xuuv_G.js.map +0 -1
- package/webapp/dist/assets/requirementDiagram-UZGBJVZJ-DY6Q4U6l.js.map +0 -1
- package/webapp/dist/assets/sankeyDiagram-TZEHDZUN-DZPox4PX.js.map +0 -1
- package/webapp/dist/assets/sequenceDiagram-WL72ISMW-Bg6GPP0w.js.map +0 -1
- package/webapp/dist/assets/stateDiagram-FKZM4ZOC-CcskYNpn.js.map +0 -1
- package/webapp/dist/assets/stateDiagram-v2-4FDKWEC3-Dja5UwuW.js.map +0 -1
- package/webapp/dist/assets/timeline-definition-IT6M3QCI-CA-Wvxg8.js.map +0 -1
- package/webapp/dist/assets/treemap-GDKQZRPO-CF_Fur4n.js.map +0 -1
- package/webapp/dist/assets/xychartDiagram-PRI3JC2R-CYc3vOkZ.js.map +0 -1
package/dist/apps/runtime.js
CHANGED
|
@@ -55,7 +55,7 @@ async function ensureMainDialogLoaded(rootId) {
|
|
|
55
55
|
const existing = dialog_global_registry_1.globalDialogRegistry.get(rootId);
|
|
56
56
|
if (existing) {
|
|
57
57
|
await existing.loadSideDialogRegistry();
|
|
58
|
-
await existing.
|
|
58
|
+
await existing.loadActiveCalleeDispatchesFromPersistence();
|
|
59
59
|
return existing;
|
|
60
60
|
}
|
|
61
61
|
return await (0, dialog_instance_registry_1.getOrRestoreMainDialog)(rootId, 'running');
|
|
@@ -118,7 +118,7 @@ async function resolveTargetDialog(sourceDlg, target) {
|
|
|
118
118
|
throw new Error(`dialog reminder target root not found (${describeTarget(target)})`);
|
|
119
119
|
}
|
|
120
120
|
await targetRoot.loadSideDialogRegistry();
|
|
121
|
-
await targetRoot.
|
|
121
|
+
await targetRoot.loadActiveCalleeDispatchesFromPersistence();
|
|
122
122
|
if (target.sessionSlug) {
|
|
123
123
|
const sideDialog = targetRoot.lookupSideDialog(target.agentId, target.sessionSlug);
|
|
124
124
|
if (!sideDialog) {
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* Design constraints:
|
|
8
8
|
* - `displayState` is a UI/diagnostic projection, not a business source of truth.
|
|
9
9
|
* - Primary control flow must rely on underlying facts (active runs, stop requests,
|
|
10
|
-
* pending Q4H,
|
|
10
|
+
* pending Q4H, active callee dispatches, queued prompts, persisted status, explicit
|
|
11
11
|
* interruption/death markers).
|
|
12
12
|
* - The projection is persisted to latest.yaml (`DialogLatestFile.displayState`) so it survives
|
|
13
13
|
* restarts and multi-tab views can converge quickly.
|
|
@@ -51,8 +51,7 @@ export declare function broadcastDisplayStateMarker(dialogId: DialogID, marker:
|
|
|
51
51
|
reason?: DialogInterruptionReason;
|
|
52
52
|
}): void;
|
|
53
53
|
export declare function computeIdleDisplayState(dlg: Dialog): Promise<DialogDisplayState>;
|
|
54
|
-
export declare function refreshRunControlProjectionFromPersistenceFacts(dialogId: DialogID, trigger: 'resume_dialog' | 'resume_all' | 'run_control_snapshot' | '
|
|
55
|
-
export declare function isRecoverableGeneratingLatest(latest: DialogLatestFile | null): boolean;
|
|
54
|
+
export declare function refreshRunControlProjectionFromPersistenceFacts(dialogId: DialogID, trigger: 'resume_dialog' | 'resume_all' | 'run_control_snapshot' | 'active_callee_dispatches_changed' | 'q4h_changed'): Promise<DialogLatestFile | null>;
|
|
56
55
|
export declare function reconcileDisplayStatesAfterRestart(): Promise<void>;
|
|
57
56
|
export declare function requestInterruptDialog(dialogId: DialogID, reason: StopRequestedReason): Promise<{
|
|
58
57
|
applied: boolean;
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* Design constraints:
|
|
9
9
|
* - `displayState` is a UI/diagnostic projection, not a business source of truth.
|
|
10
10
|
* - Primary control flow must rely on underlying facts (active runs, stop requests,
|
|
11
|
-
* pending Q4H,
|
|
11
|
+
* pending Q4H, active callee dispatches, queued prompts, persisted status, explicit
|
|
12
12
|
* interruption/death markers).
|
|
13
13
|
* - The projection is persisted to latest.yaml (`DialogLatestFile.displayState`) so it survives
|
|
14
14
|
* restarts and multi-tab views can converge quickly.
|
|
@@ -40,14 +40,15 @@ exports.setDialogDisplayState = setDialogDisplayState;
|
|
|
40
40
|
exports.broadcastDisplayStateMarker = broadcastDisplayStateMarker;
|
|
41
41
|
exports.computeIdleDisplayState = computeIdleDisplayState;
|
|
42
42
|
exports.refreshRunControlProjectionFromPersistenceFacts = refreshRunControlProjectionFromPersistenceFacts;
|
|
43
|
-
exports.isRecoverableGeneratingLatest = isRecoverableGeneratingLatest;
|
|
44
43
|
exports.reconcileDisplayStatesAfterRestart = reconcileDisplayStatesAfterRestart;
|
|
45
44
|
exports.requestInterruptDialog = requestInterruptDialog;
|
|
46
45
|
exports.requestEmergencyStopAll = requestEmergencyStopAll;
|
|
47
46
|
const time_1 = require("@longrun-ai/kernel/utils/time");
|
|
48
47
|
const dialog_1 = require("./dialog");
|
|
48
|
+
const dialog_generation_run_1 = require("./dialog-generation-run");
|
|
49
49
|
const dialog_global_registry_1 = require("./dialog-global-registry");
|
|
50
50
|
const dialog_interruption_1 = require("./dialog-interruption");
|
|
51
|
+
const dialog_latest_state_1 = require("./dialog-latest-state");
|
|
51
52
|
const evt_registry_1 = require("./evt-registry");
|
|
52
53
|
const log_1 = require("./log");
|
|
53
54
|
const persistence_1 = require("./persistence");
|
|
@@ -90,58 +91,23 @@ function isDialogLatestResumable(latest) {
|
|
|
90
91
|
function isSameDisplayState(left, right) {
|
|
91
92
|
return JSON.stringify(left) === JSON.stringify(right);
|
|
92
93
|
}
|
|
93
|
-
function isSideDialogResponseAnchor(record) {
|
|
94
|
-
return record?.type === 'tellask_anchor_record' && record.anchorRole === 'response';
|
|
95
|
-
}
|
|
96
94
|
function isNonIdleDisplayProjection(state) {
|
|
97
95
|
return state !== undefined && state.kind !== 'idle_waiting_user';
|
|
98
96
|
}
|
|
99
|
-
function
|
|
100
|
-
return
|
|
101
|
-
kind: 'stopped',
|
|
102
|
-
reason: { kind: 'pending_reply_obligation' },
|
|
103
|
-
continueEnabled: true,
|
|
104
|
-
};
|
|
97
|
+
function hasPendingNextStepTriggers(latest) {
|
|
98
|
+
return (latest?.nextStep.triggers.length ?? 0) > 0;
|
|
105
99
|
}
|
|
106
|
-
function
|
|
107
|
-
if (
|
|
108
|
-
return { kind: 'blocked', reason: { kind: 'needs_human_input_and_sideDialogs' } };
|
|
109
|
-
}
|
|
110
|
-
if (args.hasQ4H) {
|
|
100
|
+
function q4hSuspensionDisplayState(hasQ4H) {
|
|
101
|
+
if (hasQ4H) {
|
|
111
102
|
return { kind: 'blocked', reason: { kind: 'needs_human_input' } };
|
|
112
103
|
}
|
|
113
|
-
if (args.hasSideDialogs) {
|
|
114
|
-
return { kind: 'blocked', reason: { kind: 'waiting_for_sideDialogs' } };
|
|
115
|
-
}
|
|
116
104
|
return undefined;
|
|
117
105
|
}
|
|
118
|
-
async function hasSideDialogFinalResponseAnchor(dialogId, latest) {
|
|
119
|
-
if (dialogId.selfId === dialogId.rootId) {
|
|
120
|
-
return undefined;
|
|
121
|
-
}
|
|
122
|
-
const rawCourse = latest.currentCourse;
|
|
123
|
-
const currentCourse = Number.isFinite(rawCourse) && rawCourse > 0 ? Math.floor(rawCourse) : 1;
|
|
124
|
-
const courseEvents = await persistence_1.DialogPersistence.loadCourseEvents(dialogId, currentCourse, 'running');
|
|
125
|
-
for (let index = courseEvents.length - 1; index >= 0; index -= 1) {
|
|
126
|
-
const event = courseEvents[index];
|
|
127
|
-
if (event.type === 'tellask_anchor_record') {
|
|
128
|
-
return isSideDialogResponseAnchor(event) ? { callId: event.callId } : undefined;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
return undefined;
|
|
132
|
-
}
|
|
133
|
-
async function hasActiveSideDialogReplyObligation(dialogId) {
|
|
134
|
-
if (dialogId.selfId === dialogId.rootId) {
|
|
135
|
-
return false;
|
|
136
|
-
}
|
|
137
|
-
const activeObligation = await persistence_1.DialogPersistence.loadActiveTellaskReplyObligation(dialogId, 'running');
|
|
138
|
-
return activeObligation !== undefined;
|
|
139
|
-
}
|
|
140
106
|
async function resolveSideDialogFinalResponseClosure(args) {
|
|
141
107
|
if (!args.latest) {
|
|
142
108
|
return { kind: 'no_final_response' };
|
|
143
109
|
}
|
|
144
|
-
const finalResponseAnchor =
|
|
110
|
+
const finalResponseAnchor = args.latest.sideDialogFinalResponse;
|
|
145
111
|
if (!finalResponseAnchor) {
|
|
146
112
|
return { kind: 'no_final_response' };
|
|
147
113
|
}
|
|
@@ -165,37 +131,6 @@ async function resolveSideDialogFinalResponseClosure(args) {
|
|
|
165
131
|
activeReplyObligation,
|
|
166
132
|
};
|
|
167
133
|
}
|
|
168
|
-
async function coerceIdleDisplayStateForActiveSideDialogReplyObligation(dialogId, displayState) {
|
|
169
|
-
if (displayState.kind !== 'idle_waiting_user') {
|
|
170
|
-
return displayState;
|
|
171
|
-
}
|
|
172
|
-
if (!(await hasActiveSideDialogReplyObligation(dialogId))) {
|
|
173
|
-
return displayState;
|
|
174
|
-
}
|
|
175
|
-
const latest = await persistence_1.DialogPersistence.loadDialogLatest(dialogId, 'running');
|
|
176
|
-
const finalResponseClosure = await resolveSideDialogFinalResponseClosure({ dialogId, latest });
|
|
177
|
-
if (finalResponseClosure.kind === 'closed_with_matching_reply_obligation') {
|
|
178
|
-
await persistence_1.DialogPersistence.setActiveTellaskReplyObligation(dialogId, undefined, 'running');
|
|
179
|
-
return displayState;
|
|
180
|
-
}
|
|
181
|
-
if (finalResponseClosure.kind === 'closed_without_active_reply_obligation') {
|
|
182
|
-
return displayState;
|
|
183
|
-
}
|
|
184
|
-
const q4h = await persistence_1.DialogPersistence.loadQuestions4HumanState(dialogId, 'running');
|
|
185
|
-
const pendingSideDialogs = await persistence_1.DialogPersistence.loadPendingSideDialogs(dialogId, 'running');
|
|
186
|
-
const blocked = blockerDisplayState({
|
|
187
|
-
hasQ4H: q4h.length > 0,
|
|
188
|
-
hasSideDialogs: pendingSideDialogs.length > 0,
|
|
189
|
-
});
|
|
190
|
-
const healedDisplayState = blocked ?? pendingReplyObligationDisplayState();
|
|
191
|
-
log.warn('Prevented sideDialog with active reply obligation from entering idle display state', new Error('sideDialog idle display-state invariant violation'), {
|
|
192
|
-
dialogId: dialogId.valueOf(),
|
|
193
|
-
rootId: dialogId.rootId,
|
|
194
|
-
selfId: dialogId.selfId,
|
|
195
|
-
healedDisplayState,
|
|
196
|
-
});
|
|
197
|
-
return healedDisplayState;
|
|
198
|
-
}
|
|
199
134
|
function classifyRunControlBucket(state) {
|
|
200
135
|
if (!state)
|
|
201
136
|
return 'none';
|
|
@@ -246,17 +181,15 @@ async function getRunControlCountsSnapshot() {
|
|
|
246
181
|
else if (latest?.executionMarker?.kind === 'interrupted' &&
|
|
247
182
|
isStoppedReasonResumable(latest.executionMarker.reason)) {
|
|
248
183
|
// Keep run-control counts aligned with actual Continue affordance:
|
|
249
|
-
// - ordinary interrupted dialogs count as resumable only when no
|
|
250
|
-
// - interjection-paused dialogs still count as resumable even if
|
|
184
|
+
// - ordinary interrupted dialogs count as resumable only when no Q4H suspension remains
|
|
185
|
+
// - interjection-paused dialogs still count as resumable even if Q4H remains,
|
|
251
186
|
// because the intended UX is that Continue exits the temporary paused projection
|
|
252
187
|
// and re-evaluates the original task from fresh facts
|
|
253
188
|
if ((0, interjection_pause_stop_1.isUserInterjectionPauseStopReason)(latest.executionMarker.reason)) {
|
|
254
189
|
resumable++;
|
|
255
190
|
}
|
|
256
191
|
else {
|
|
257
|
-
|
|
258
|
-
const pendingSideDialogs = await persistence_1.DialogPersistence.loadPendingSideDialogs(dialogId, 'running');
|
|
259
|
-
if (q4h.length === 0 && pendingSideDialogs.length === 0) {
|
|
192
|
+
if (latest.userWait?.kind !== 'awaiting_user_answer') {
|
|
260
193
|
resumable++;
|
|
261
194
|
}
|
|
262
195
|
}
|
|
@@ -430,7 +363,6 @@ async function clearDialogInterruptedExecutionMarker(dialogId) {
|
|
|
430
363
|
await setDialogExecutionMarker(dialogId, undefined);
|
|
431
364
|
}
|
|
432
365
|
async function setDialogDisplayState(dialogId, displayState) {
|
|
433
|
-
displayState = await coerceIdleDisplayStateForActiveSideDialogReplyObligation(dialogId, displayState);
|
|
434
366
|
if (displayState.kind === 'dead' && dialogId.selfId === dialogId.rootId) {
|
|
435
367
|
log.warn('Rejecting dead displayState for main dialog (main dialogs must not be dead)', undefined, {
|
|
436
368
|
dialogId: dialogId.valueOf(),
|
|
@@ -535,18 +467,16 @@ async function computeIdleDisplayState(dlg) {
|
|
|
535
467
|
continueEnabled: isStoppedReasonResumable(latest.executionMarker.reason),
|
|
536
468
|
};
|
|
537
469
|
}
|
|
538
|
-
if (latest?.
|
|
470
|
+
if (latest?.pendingRuntimePrompt) {
|
|
539
471
|
return {
|
|
540
472
|
kind: 'stopped',
|
|
541
|
-
reason: { kind: '
|
|
473
|
+
reason: { kind: 'pending_runtime_prompt' },
|
|
542
474
|
continueEnabled: true,
|
|
543
475
|
};
|
|
544
476
|
}
|
|
545
|
-
const
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
if (blocked) {
|
|
549
|
-
return blocked;
|
|
477
|
+
const q4hSuspension = q4hSuspensionDisplayState(latest?.userWait?.kind === 'awaiting_user_answer');
|
|
478
|
+
if (q4hSuspension) {
|
|
479
|
+
return q4hSuspension;
|
|
550
480
|
}
|
|
551
481
|
const finalResponseClosure = await resolveSideDialogFinalResponseClosure({
|
|
552
482
|
dialogId: dlg.id,
|
|
@@ -556,9 +486,6 @@ async function computeIdleDisplayState(dlg) {
|
|
|
556
486
|
finalResponseClosure.kind === 'closed_with_matching_reply_obligation') {
|
|
557
487
|
return { kind: 'idle_waiting_user' };
|
|
558
488
|
}
|
|
559
|
-
if (await hasActiveSideDialogReplyObligation(dlg.id)) {
|
|
560
|
-
return pendingReplyObligationDisplayState();
|
|
561
|
-
}
|
|
562
489
|
return { kind: 'idle_waiting_user' };
|
|
563
490
|
}
|
|
564
491
|
async function computeIdleDisplayStateFromPersistence(dialogId) {
|
|
@@ -581,34 +508,27 @@ async function computeIdleDisplayStateFromPersistence(dialogId) {
|
|
|
581
508
|
continueEnabled: isStoppedReasonResumable(latest.executionMarker.reason),
|
|
582
509
|
};
|
|
583
510
|
}
|
|
584
|
-
if (latest?.
|
|
511
|
+
if (latest?.pendingRuntimePrompt) {
|
|
585
512
|
return {
|
|
586
513
|
kind: 'stopped',
|
|
587
|
-
reason: { kind: '
|
|
514
|
+
reason: { kind: 'pending_runtime_prompt' },
|
|
588
515
|
continueEnabled: true,
|
|
589
516
|
};
|
|
590
517
|
}
|
|
591
|
-
const
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
const hasSideDialogs = pendingSideDialogs.length > 0;
|
|
595
|
-
const blocked = blockerDisplayState({ hasQ4H, hasSideDialogs });
|
|
596
|
-
if (blocked) {
|
|
597
|
-
return blocked;
|
|
518
|
+
const q4hSuspension = q4hSuspensionDisplayState(latest?.userWait?.kind === 'awaiting_user_answer');
|
|
519
|
+
if (q4hSuspension) {
|
|
520
|
+
return q4hSuspension;
|
|
598
521
|
}
|
|
599
522
|
const finalResponseClosure = await resolveSideDialogFinalResponseClosure({ dialogId, latest });
|
|
600
523
|
if (finalResponseClosure.kind === 'closed_without_active_reply_obligation' ||
|
|
601
524
|
finalResponseClosure.kind === 'closed_with_matching_reply_obligation') {
|
|
602
525
|
return { kind: 'idle_waiting_user' };
|
|
603
526
|
}
|
|
604
|
-
if (await hasActiveSideDialogReplyObligation(dialogId)) {
|
|
605
|
-
return pendingReplyObligationDisplayState();
|
|
606
|
-
}
|
|
607
527
|
return { kind: 'idle_waiting_user' };
|
|
608
528
|
}
|
|
609
529
|
async function healStaleSideDialogRunControlAfterFinalResponse(args) {
|
|
610
530
|
if (args.dialogId.selfId === args.dialogId.rootId ||
|
|
611
|
-
(args.latest
|
|
531
|
+
(!hasPendingNextStepTriggers(args.latest) &&
|
|
612
532
|
args.latest.generating !== true &&
|
|
613
533
|
args.latest.executionMarker?.kind !== 'interrupted' &&
|
|
614
534
|
!isNonIdleDisplayProjection(args.latest.displayState))) {
|
|
@@ -617,7 +537,7 @@ async function healStaleSideDialogRunControlAfterFinalResponse(args) {
|
|
|
617
537
|
if (args.latest.executionMarker?.kind === 'dead') {
|
|
618
538
|
return args.latest;
|
|
619
539
|
}
|
|
620
|
-
if (args.latest.
|
|
540
|
+
if (args.latest.pendingRuntimePrompt) {
|
|
621
541
|
return args.latest;
|
|
622
542
|
}
|
|
623
543
|
const finalResponseClosure = await resolveSideDialogFinalResponseClosure({
|
|
@@ -645,7 +565,7 @@ async function healStaleSideDialogRunControlAfterFinalResponse(args) {
|
|
|
645
565
|
responseCallId: finalResponseClosure.callId,
|
|
646
566
|
clearedReplyObligation,
|
|
647
567
|
previousGenerating: args.latest.generating ?? null,
|
|
648
|
-
|
|
568
|
+
previousNextStepTriggerCount: args.latest.nextStep.triggers.length,
|
|
649
569
|
previousDisplayState: args.latest.displayState ?? null,
|
|
650
570
|
previousExecutionMarker: args.latest.executionMarker ?? null,
|
|
651
571
|
});
|
|
@@ -653,7 +573,7 @@ async function healStaleSideDialogRunControlAfterFinalResponse(args) {
|
|
|
653
573
|
kind: 'patch',
|
|
654
574
|
patch: {
|
|
655
575
|
generating: false,
|
|
656
|
-
|
|
576
|
+
nextStep: (0, dialog_latest_state_1.createEmptyDialogNextStepState)(),
|
|
657
577
|
displayState: { kind: 'idle_waiting_user' },
|
|
658
578
|
executionMarker: undefined,
|
|
659
579
|
},
|
|
@@ -690,16 +610,15 @@ async function refreshRunControlProjectionFromPersistenceFacts(dialogId, trigger
|
|
|
690
610
|
(0, interjection_pause_stop_1.isUserInterjectionPauseStopReason)(latest.executionMarker.reason)) {
|
|
691
611
|
// WARNING:
|
|
692
612
|
// This is the one place where the projection intentionally preserves the paused-interjection
|
|
693
|
-
// stopped state ahead of the current
|
|
613
|
+
// stopped state ahead of the current suspension facts. That is not a bug: after a user
|
|
694
614
|
// interjection we want the UI to keep showing "original task paused; click Continue" even if
|
|
695
|
-
// the underlying dialog is still waiting on Q4H
|
|
615
|
+
// the underlying dialog is still waiting on Q4H.
|
|
696
616
|
//
|
|
697
|
-
// The true source-of-truth decision about what Continue should do next lives in
|
|
698
|
-
//
|
|
699
|
-
//
|
|
700
|
-
// - keeps driving immediately.
|
|
617
|
+
// The true source-of-truth decision about what Continue should do next lives in `flow.ts`'s
|
|
618
|
+
// resume path, which performs a fresh fact scan at resume time and then either restores the
|
|
619
|
+
// Q4H suspension projection or keeps driving immediately.
|
|
701
620
|
//
|
|
702
|
-
// Do not "heal" this branch away by prioritizing
|
|
621
|
+
// Do not "heal" this branch away by prioritizing suspension facts here; that would collapse the
|
|
703
622
|
// temporary interjection UX and make repeated interjection turns revert too early.
|
|
704
623
|
return {
|
|
705
624
|
kind: 'stopped',
|
|
@@ -707,29 +626,22 @@ async function refreshRunControlProjectionFromPersistenceFacts(dialogId, trigger
|
|
|
707
626
|
continueEnabled: isStoppedReasonResumable(latest.executionMarker.reason),
|
|
708
627
|
};
|
|
709
628
|
}
|
|
710
|
-
if (latest.
|
|
629
|
+
if (latest.pendingRuntimePrompt) {
|
|
711
630
|
return {
|
|
712
631
|
kind: 'stopped',
|
|
713
|
-
reason: { kind: '
|
|
632
|
+
reason: { kind: 'pending_runtime_prompt' },
|
|
714
633
|
continueEnabled: true,
|
|
715
634
|
};
|
|
716
635
|
}
|
|
717
|
-
const
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
const hasSideDialogs = pendingSideDialogs.length > 0;
|
|
721
|
-
const blocked = blockerDisplayState({ hasQ4H, hasSideDialogs });
|
|
722
|
-
if (blocked) {
|
|
723
|
-
return blocked;
|
|
636
|
+
const q4hSuspension = q4hSuspensionDisplayState(latest.userWait?.kind === 'awaiting_user_answer');
|
|
637
|
+
if (q4hSuspension) {
|
|
638
|
+
return q4hSuspension;
|
|
724
639
|
}
|
|
725
640
|
const finalResponseClosure = await resolveSideDialogFinalResponseClosure({ dialogId, latest });
|
|
726
641
|
if (finalResponseClosure.kind === 'closed_without_active_reply_obligation' ||
|
|
727
642
|
finalResponseClosure.kind === 'closed_with_matching_reply_obligation') {
|
|
728
643
|
return { kind: 'idle_waiting_user' };
|
|
729
644
|
}
|
|
730
|
-
if (await hasActiveSideDialogReplyObligation(dialogId)) {
|
|
731
|
-
return pendingReplyObligationDisplayState();
|
|
732
|
-
}
|
|
733
645
|
if (latest.executionMarker?.kind === 'interrupted' &&
|
|
734
646
|
latest.executionMarker.reason.kind !== 'pending_reply_obligation') {
|
|
735
647
|
return {
|
|
@@ -775,21 +687,6 @@ async function computeIdleDisplayStateForReconciliation(dialogId) {
|
|
|
775
687
|
return null;
|
|
776
688
|
}
|
|
777
689
|
}
|
|
778
|
-
function isRecoverableGeneratingLatest(latest) {
|
|
779
|
-
if (latest?.generating !== true) {
|
|
780
|
-
return false;
|
|
781
|
-
}
|
|
782
|
-
const marker = latest.executionMarker;
|
|
783
|
-
if (!marker) {
|
|
784
|
-
return true;
|
|
785
|
-
}
|
|
786
|
-
if (marker.kind === 'dead') {
|
|
787
|
-
return false;
|
|
788
|
-
}
|
|
789
|
-
return (marker.kind !== 'interrupted' ||
|
|
790
|
-
marker.reason.kind === 'pending_course_start' ||
|
|
791
|
-
marker.reason.kind === 'pending_reply_obligation');
|
|
792
|
-
}
|
|
793
690
|
async function reconcileDisplayStatesAfterRestart() {
|
|
794
691
|
const dialogIds = await persistence_1.DialogPersistence.listAllDialogIds('running');
|
|
795
692
|
for (const dialogId of dialogIds) {
|
|
@@ -832,9 +729,13 @@ async function reconcileDisplayStatesAfterRestart() {
|
|
|
832
729
|
}
|
|
833
730
|
continue;
|
|
834
731
|
}
|
|
732
|
+
if (latest.generating === true && latest.generationRunState === undefined) {
|
|
733
|
+
await persistence_1.DialogPersistence.quarantineMalformedRuntimeState(dialogId, 'running', 'restart_reconciliation_missing_generation_run_state', `Restart reconciliation refused to recover generating dialog without generationRunState (rootId=${dialogId.rootId}, selfId=${dialogId.selfId})`);
|
|
734
|
+
continue;
|
|
735
|
+
}
|
|
835
736
|
if (dialogId.selfId !== dialogId.rootId &&
|
|
836
737
|
(latest.generating === true ||
|
|
837
|
-
latest
|
|
738
|
+
hasPendingNextStepTriggers(latest) ||
|
|
838
739
|
latest.executionMarker?.kind === 'interrupted' ||
|
|
839
740
|
isNonIdleDisplayProjection(latest.displayState))) {
|
|
840
741
|
const healedStaleSideDialogRunControl = await healStaleSideDialogRunControlAfterFinalResponse({
|
|
@@ -846,19 +747,26 @@ async function reconcileDisplayStatesAfterRestart() {
|
|
|
846
747
|
continue;
|
|
847
748
|
}
|
|
848
749
|
latest = healedStaleSideDialogRunControl;
|
|
849
|
-
if (latest.generating !== true && latest
|
|
750
|
+
if (latest.generating !== true && !hasPendingNextStepTriggers(latest)) {
|
|
850
751
|
continue;
|
|
851
752
|
}
|
|
852
753
|
}
|
|
853
|
-
|
|
754
|
+
const recoverableGenerationRunState = (0, dialog_generation_run_1.getRecoverableGenerationRunState)(latest);
|
|
755
|
+
if (recoverableGenerationRunState !== undefined) {
|
|
854
756
|
try {
|
|
757
|
+
await persistence_1.DialogPersistence.upsertNextStepTrigger(dialogId, {
|
|
758
|
+
triggerId: `open-generation-recovery:${dialogId.selfId}:${recoverableGenerationRunState.course}:${recoverableGenerationRunState.genseq}`,
|
|
759
|
+
kind: 'open_generation_recovery',
|
|
760
|
+
course: recoverableGenerationRunState.course,
|
|
761
|
+
genseq: recoverableGenerationRunState.genseq,
|
|
762
|
+
createdAt: recoverableGenerationRunState.openedAt,
|
|
763
|
+
}, 'running');
|
|
855
764
|
await persistence_1.DialogPersistence.mutateDialogLatest(dialogId, () => ({
|
|
856
765
|
kind: 'patch',
|
|
857
766
|
patch: {
|
|
858
|
-
needsDrive: true,
|
|
859
767
|
displayState: { kind: 'proceeding' },
|
|
860
768
|
executionMarker: existingMarker?.kind === 'interrupted' &&
|
|
861
|
-
(existingMarker.reason.kind === '
|
|
769
|
+
(existingMarker.reason.kind === 'pending_runtime_prompt' ||
|
|
862
770
|
existingMarker.reason.kind === 'pending_reply_obligation')
|
|
863
771
|
? undefined
|
|
864
772
|
: existingMarker,
|
|
@@ -872,7 +780,7 @@ async function reconcileDisplayStatesAfterRestart() {
|
|
|
872
780
|
}
|
|
873
781
|
continue;
|
|
874
782
|
}
|
|
875
|
-
if (latest.generating === true || latest
|
|
783
|
+
if (latest.generating === true || hasPendingNextStepTriggers(latest)) {
|
|
876
784
|
const nextIdle = await computeIdleDisplayStateForReconciliation(dialogId);
|
|
877
785
|
if (!nextIdle) {
|
|
878
786
|
continue;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hasDurableDriveWork = hasDurableDriveWork;
|
|
4
|
+
const dialog_generation_run_1 = require("./dialog-generation-run");
|
|
5
|
+
function hasResultArrivalTrigger(latest) {
|
|
6
|
+
return latest.nextStep.triggers.some((trigger) => trigger.kind === 'result_arrival');
|
|
7
|
+
}
|
|
8
|
+
function hasDurableDriveWork(latest) {
|
|
9
|
+
if (!latest) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
const replyDelivery = latest.replyDelivery;
|
|
13
|
+
if (replyDelivery &&
|
|
14
|
+
(replyDelivery.status === 'pending' || replyDelivery.toolResultStatus === 'pending')) {
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
if (latest.sideDialogFinalResponse !== undefined) {
|
|
18
|
+
return hasResultArrivalTrigger(latest);
|
|
19
|
+
}
|
|
20
|
+
return (latest.nextStep.triggers.length > 0 || (0, dialog_generation_run_1.getRecoverableGenerationRunState)(latest) !== undefined);
|
|
21
|
+
}
|
package/dist/dialog-fork.d.ts
CHANGED
package/dist/dialog-fork.js
CHANGED
|
@@ -9,6 +9,7 @@ const node_path_1 = __importDefault(require("node:path"));
|
|
|
9
9
|
const storage_1 = require("@longrun-ai/kernel/types/storage");
|
|
10
10
|
const time_1 = require("@longrun-ai/kernel/utils/time");
|
|
11
11
|
const dialog_1 = require("./dialog");
|
|
12
|
+
const dialog_latest_state_1 = require("./dialog-latest-state");
|
|
12
13
|
const persistence_1 = require("./persistence");
|
|
13
14
|
const tool_1 = require("./tool");
|
|
14
15
|
const id_1 = require("./utils/id");
|
|
@@ -49,8 +50,8 @@ function cloneQuestions(questions) {
|
|
|
49
50
|
callSiteRef: { ...question.callSiteRef },
|
|
50
51
|
}));
|
|
51
52
|
}
|
|
52
|
-
function
|
|
53
|
-
return
|
|
53
|
+
function cloneActiveCalleeDispatches(activeCalleeDispatches) {
|
|
54
|
+
return activeCalleeDispatches.map((entry) => ({
|
|
54
55
|
...entry,
|
|
55
56
|
mentionList: entry.mentionList ? [...entry.mentionList] : undefined,
|
|
56
57
|
}));
|
|
@@ -111,7 +112,7 @@ function isForkStateRecord(record) {
|
|
|
111
112
|
case 'sideDialog_created_record':
|
|
112
113
|
case 'reminders_reconciled_record':
|
|
113
114
|
case 'questions4human_reconciled_record':
|
|
114
|
-
case '
|
|
115
|
+
case 'active_callees_reconciled_record':
|
|
115
116
|
case 'sideDialog_registry_reconciled_record':
|
|
116
117
|
case 'sideDialog_responses_reconciled_record':
|
|
117
118
|
return record;
|
|
@@ -147,7 +148,7 @@ function isPersistedMessageRecord(record) {
|
|
|
147
148
|
case 'sideDialog_created_record':
|
|
148
149
|
case 'reminders_reconciled_record':
|
|
149
150
|
case 'questions4human_reconciled_record':
|
|
150
|
-
case '
|
|
151
|
+
case 'active_callees_reconciled_record':
|
|
151
152
|
case 'sideDialog_registry_reconciled_record':
|
|
152
153
|
case 'sideDialog_responses_reconciled_record':
|
|
153
154
|
return false;
|
|
@@ -242,7 +243,7 @@ function rewriteRecordForFork(record, newRootId) {
|
|
|
242
243
|
case 'sideDialog_created_record':
|
|
243
244
|
case 'reminders_reconciled_record':
|
|
244
245
|
case 'questions4human_reconciled_record':
|
|
245
|
-
case '
|
|
246
|
+
case 'active_callees_reconciled_record':
|
|
246
247
|
case 'sideDialog_registry_reconciled_record':
|
|
247
248
|
case 'sideDialog_responses_reconciled_record':
|
|
248
249
|
throw new Error(`Fork transcript copy must not include state record ${record.type}`);
|
|
@@ -275,16 +276,9 @@ function computeRootForkDisplayState(args) {
|
|
|
275
276
|
return { kind: 'idle_waiting_user' };
|
|
276
277
|
}
|
|
277
278
|
const hasQ4H = args.questions.length > 0;
|
|
278
|
-
const hasSideDialogs = args.pendingSideDialogs.length > 0;
|
|
279
|
-
if (hasQ4H && hasSideDialogs) {
|
|
280
|
-
return { kind: 'blocked', reason: { kind: 'needs_human_input_and_sideDialogs' } };
|
|
281
|
-
}
|
|
282
279
|
if (hasQ4H) {
|
|
283
280
|
return { kind: 'blocked', reason: { kind: 'needs_human_input' } };
|
|
284
281
|
}
|
|
285
|
-
if (hasSideDialogs) {
|
|
286
|
-
return { kind: 'blocked', reason: { kind: 'waiting_for_sideDialogs' } };
|
|
287
|
-
}
|
|
288
282
|
return { kind: 'stopped', reason: { kind: 'fork_continue_ready' }, continueEnabled: true };
|
|
289
283
|
}
|
|
290
284
|
async function copyArtifactsIfPresent(sourceId, targetId, sourceStatus) {
|
|
@@ -329,7 +323,7 @@ async function collectForkSnapshot(dialogId, status, cutoffAnchor) {
|
|
|
329
323
|
const courseNumbers = await listDialogCourseNumbers(dialogId, status);
|
|
330
324
|
let latestReminders = null;
|
|
331
325
|
let latestQuestions = null;
|
|
332
|
-
let
|
|
326
|
+
let latestActiveCalleeDispatches = null;
|
|
333
327
|
let latestRegistry = null;
|
|
334
328
|
let latestResponses = null;
|
|
335
329
|
for (const course of courseNumbers) {
|
|
@@ -347,8 +341,8 @@ async function collectForkSnapshot(dialogId, status, cutoffAnchor) {
|
|
|
347
341
|
case 'questions4human_reconciled_record':
|
|
348
342
|
latestQuestions = cloneQuestions(stateRecord.questions);
|
|
349
343
|
break;
|
|
350
|
-
case '
|
|
351
|
-
|
|
344
|
+
case 'active_callees_reconciled_record':
|
|
345
|
+
latestActiveCalleeDispatches = cloneActiveCalleeDispatches(stateRecord.activeCalleeDispatches);
|
|
352
346
|
break;
|
|
353
347
|
case 'sideDialog_registry_reconciled_record':
|
|
354
348
|
latestRegistry = cloneRegistryEntries(stateRecord.entries);
|
|
@@ -368,7 +362,7 @@ async function collectForkSnapshot(dialogId, status, cutoffAnchor) {
|
|
|
368
362
|
return {
|
|
369
363
|
reminders: latestReminders !== null ? latestReminders.map((item) => cloneReminderSnapshot(item)) : [],
|
|
370
364
|
questions: latestQuestions ?? [],
|
|
371
|
-
|
|
365
|
+
activeCalleeDispatches: latestActiveCalleeDispatches ?? [],
|
|
372
366
|
registryEntries: latestRegistry ?? [],
|
|
373
367
|
sideDialogResponses: latestResponses ?? [],
|
|
374
368
|
};
|
|
@@ -378,15 +372,15 @@ async function collectIncludedSideDialogs(args) {
|
|
|
378
372
|
const scannedDialogSelfIds = new Set();
|
|
379
373
|
const included = new Map();
|
|
380
374
|
while (queue.length > 0) {
|
|
381
|
-
const
|
|
382
|
-
if (!
|
|
375
|
+
const sourceDialogId = queue.shift();
|
|
376
|
+
if (!sourceDialogId)
|
|
383
377
|
break;
|
|
384
|
-
if (scannedDialogSelfIds.has(
|
|
378
|
+
if (scannedDialogSelfIds.has(sourceDialogId.selfId))
|
|
385
379
|
continue;
|
|
386
|
-
scannedDialogSelfIds.add(
|
|
387
|
-
const courseNumbers = await listDialogCourseNumbers(
|
|
380
|
+
scannedDialogSelfIds.add(sourceDialogId.selfId);
|
|
381
|
+
const courseNumbers = await listDialogCourseNumbers(sourceDialogId, args.sourceStatus);
|
|
388
382
|
for (const course of courseNumbers) {
|
|
389
|
-
const events = await persistence_1.DialogPersistence.readCourseEvents(
|
|
383
|
+
const events = await persistence_1.DialogPersistence.readCourseEvents(sourceDialogId, course, args.sourceStatus);
|
|
390
384
|
for (const event of events) {
|
|
391
385
|
if (event.type !== 'sideDialog_created_record')
|
|
392
386
|
continue;
|
|
@@ -457,7 +451,7 @@ async function buildDialogForkPlan(args) {
|
|
|
457
451
|
currentCourse: retainedCurrentCourse,
|
|
458
452
|
reminders: snapshot.reminders,
|
|
459
453
|
questions: snapshot.questions,
|
|
460
|
-
|
|
454
|
+
activeCalleeDispatches: snapshot.activeCalleeDispatches,
|
|
461
455
|
registryEntries: snapshot.registryEntries,
|
|
462
456
|
sideDialogResponses: snapshot.sideDialogResponses,
|
|
463
457
|
childCount: args.childCount,
|
|
@@ -489,11 +483,11 @@ async function appendForkBaselineState(plan, baselineSideDialogCreatedRecords) {
|
|
|
489
483
|
...FORK_BASELINE_ANCHOR,
|
|
490
484
|
questions: cloneQuestions(plan.questions),
|
|
491
485
|
};
|
|
492
|
-
const
|
|
486
|
+
const activeCalleesRecord = {
|
|
493
487
|
ts: baselineTs,
|
|
494
|
-
type: '
|
|
488
|
+
type: 'active_callees_reconciled_record',
|
|
495
489
|
...FORK_BASELINE_ANCHOR,
|
|
496
|
-
|
|
490
|
+
activeCalleeDispatches: cloneActiveCalleeDispatches(plan.activeCalleeDispatches),
|
|
497
491
|
};
|
|
498
492
|
const registryRecord = {
|
|
499
493
|
ts: baselineTs,
|
|
@@ -509,7 +503,7 @@ async function appendForkBaselineState(plan, baselineSideDialogCreatedRecords) {
|
|
|
509
503
|
};
|
|
510
504
|
await persistence_1.DialogPersistence.appendEvent(plan.targetId, 1, remindersRecord, 'running');
|
|
511
505
|
await persistence_1.DialogPersistence.appendEvent(plan.targetId, 1, q4hRecord, 'running');
|
|
512
|
-
await persistence_1.DialogPersistence.appendEvent(plan.targetId, 1,
|
|
506
|
+
await persistence_1.DialogPersistence.appendEvent(plan.targetId, 1, activeCalleesRecord, 'running');
|
|
513
507
|
await persistence_1.DialogPersistence.appendEvent(plan.targetId, 1, registryRecord, 'running');
|
|
514
508
|
await persistence_1.DialogPersistence.appendEvent(plan.targetId, 1, responsesRecord, 'running');
|
|
515
509
|
}
|
|
@@ -549,7 +543,9 @@ async function persistForkPlan(args) {
|
|
|
549
543
|
await appendForkBaselineState(plan, args.baselineRecordsByParentSelfId.get(plan.targetId.selfId) ?? []);
|
|
550
544
|
await persistence_1.DialogPersistence._saveReminderState(plan.targetId, [...plan.reminders], 'running');
|
|
551
545
|
await persistence_1.DialogPersistence._saveQuestions4HumanState(plan.targetId, [...plan.questions], 'running');
|
|
552
|
-
|
|
546
|
+
for (const record of plan.activeCalleeDispatches) {
|
|
547
|
+
await persistence_1.DialogPersistence.appendActiveCalleeDispatch(plan.targetId, record, undefined, 'running');
|
|
548
|
+
}
|
|
553
549
|
await persistence_1.DialogPersistence.saveSideDialogRegistry(plan.targetId, plan.registryEntries.map((entry) => ({
|
|
554
550
|
key: entry.key,
|
|
555
551
|
sideDialogId: new dialog_1.DialogID(entry.sideDialogId, plan.targetId.rootId),
|
|
@@ -563,7 +559,6 @@ async function persistForkPlan(args) {
|
|
|
563
559
|
? computeRootForkDisplayState({
|
|
564
560
|
action: args.action,
|
|
565
561
|
questions: plan.questions,
|
|
566
|
-
pendingSideDialogs: plan.pendingSideDialogs,
|
|
567
562
|
})
|
|
568
563
|
: { kind: 'idle_waiting_user' };
|
|
569
564
|
await persistence_1.DialogPersistence.mutateDialogLatest(plan.targetId, () => ({
|
|
@@ -576,7 +571,9 @@ async function persistForkPlan(args) {
|
|
|
576
571
|
functionCallCount: countFunctionCalls(currentCourseEvents),
|
|
577
572
|
sideDialogCount: plan.childCount,
|
|
578
573
|
generating: false,
|
|
579
|
-
|
|
574
|
+
nextStep: (0, dialog_latest_state_1.createEmptyDialogNextStepState)(),
|
|
575
|
+
tellaskCalls: (0, dialog_latest_state_1.createEmptyDialogTellaskCallState)(),
|
|
576
|
+
tellaskResults: (0, dialog_latest_state_1.createEmptyDialogTellaskResultState)(),
|
|
580
577
|
displayState,
|
|
581
578
|
disableDiligencePush: plan.targetId.selfId === plan.targetId.rootId ? args.latestDisableDiligencePush : false,
|
|
582
579
|
diligencePushRemainingBudget: plan.targetId.selfId === plan.targetId.rootId
|
|
@@ -642,11 +639,10 @@ async function forkMainDialogTreeAtGeneration(args) {
|
|
|
642
639
|
});
|
|
643
640
|
const action = draftUserText !== null
|
|
644
641
|
? { kind: 'draft_user_text', userText: draftUserText }
|
|
645
|
-
: rootPlan.questions.length > 0
|
|
642
|
+
: rootPlan.questions.length > 0
|
|
646
643
|
? {
|
|
647
644
|
kind: 'restore_pending',
|
|
648
645
|
pendingQ4H: rootPlan.questions.length > 0,
|
|
649
|
-
pendingSideDialogs: rootPlan.pendingSideDialogs.length > 0,
|
|
650
646
|
}
|
|
651
647
|
: { kind: 'auto_continue' };
|
|
652
648
|
const sideDialogPlans = [];
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { DialogGenerationRunState, DialogLatestFile } from '@longrun-ai/kernel/types/storage';
|
|
2
|
+
export declare function getRecoverableGenerationRunState(latest: DialogLatestFile | null | undefined): Extract<DialogGenerationRunState, {
|
|
3
|
+
kind: 'open';
|
|
4
|
+
}> | undefined;
|