dominds 1.18.2 → 1.19.2
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/access-control.js +6 -6
- package/dist/apps/runtime.d.ts +2 -2
- package/dist/apps/runtime.js +28 -28
- package/dist/apps-host/client.d.ts +1 -1
- package/dist/apps-host/host.js +7 -7
- package/dist/apps-host/ipc-types.d.ts +2 -2
- package/dist/apps-host/ipc-types.js +10 -10
- package/dist/cli/read.d.ts +0 -1
- package/dist/cli/read.js +1 -6
- package/dist/dialog-display-state.d.ts +6 -6
- package/dist/dialog-display-state.js +46 -46
- package/dist/dialog-factory.d.ts +12 -12
- package/dist/dialog-factory.js +33 -30
- package/dist/dialog-fork.d.ts +2 -2
- package/dist/dialog-fork.js +140 -115
- package/dist/dialog-global-registry.d.ts +5 -5
- package/dist/dialog-global-registry.js +11 -11
- package/dist/dialog-instance-registry.d.ts +3 -3
- package/dist/dialog-instance-registry.js +52 -41
- package/dist/dialog.d.ts +100 -113
- package/dist/dialog.js +274 -229
- package/dist/docs/agent-priming.md +5 -5
- package/dist/docs/agent-priming.zh.md +5 -5
- package/dist/docs/app-constitution.md +1 -1
- package/dist/docs/app-constitution.zh.md +1 -1
- package/dist/docs/cli-usage.md +1 -1
- package/dist/docs/cli-usage.zh.md +1 -1
- package/dist/docs/design.md +14 -14
- package/dist/docs/design.zh.md +14 -14
- package/dist/docs/dialog-persistence.md +58 -58
- package/dist/docs/dialog-persistence.zh.md +61 -61
- package/dist/docs/dialog-system.md +363 -367
- package/dist/docs/dialog-system.zh.md +355 -357
- package/dist/docs/diligence-push.md +18 -18
- package/dist/docs/diligence-push.zh.md +17 -17
- package/dist/docs/dominds-agent-collaboration.zh.md +3 -3
- package/dist/docs/dominds-terminology.md +46 -47
- package/dist/docs/encapsulated-taskdoc.md +4 -4
- package/dist/docs/encapsulated-taskdoc.zh.md +3 -3
- package/dist/docs/fbr.md +30 -30
- package/dist/docs/fbr.zh.md +15 -15
- package/dist/docs/i18n.md +2 -2
- package/dist/docs/i18n.zh.md +2 -2
- package/dist/docs/mcp-support.md +5 -4
- package/dist/docs/mcp-support.zh.md +3 -2
- package/dist/docs/memory-system.md +4 -4
- package/dist/docs/memory-system.zh.md +1 -1
- package/dist/docs/mottos.md +1 -1
- package/dist/docs/mottos.zh.md +1 -1
- package/dist/docs/q4h.md +3 -3
- package/dist/docs/q4h.zh.md +1 -1
- package/dist/docs/roadmap.md +2 -2
- package/dist/docs/team_mgmt-toolset.md +11 -3
- package/dist/docs/team_mgmt-toolset.zh.md +9 -2
- package/dist/docs/tellask-collab.md +18 -18
- package/dist/docs/tellask-collab.zh.md +8 -8
- package/dist/docs/tellask-revive-context-refactor.zh.md +591 -0
- package/dist/evt-registry.d.ts +1 -2
- package/dist/evt-registry.js +2 -7
- package/dist/llm/gen/mock.js +9 -0
- package/dist/llm/kernel-driver/context.d.ts +1 -2
- package/dist/llm/kernel-driver/context.js +12 -26
- package/dist/llm/kernel-driver/drive.js +99 -75
- package/dist/llm/kernel-driver/engine.d.ts +2 -2
- package/dist/llm/kernel-driver/engine.js +10 -10
- package/dist/llm/kernel-driver/fbr.js +6 -6
- package/dist/llm/kernel-driver/flow.d.ts +1 -1
- package/dist/llm/kernel-driver/flow.js +129 -93
- package/dist/llm/kernel-driver/guardrails.js +4 -4
- package/dist/llm/kernel-driver/index.d.ts +1 -1
- package/dist/llm/kernel-driver/index.js +2 -2
- package/dist/llm/kernel-driver/loop.js +30 -30
- package/dist/llm/kernel-driver/reply-guidance.js +47 -52
- package/dist/llm/kernel-driver/restore.d.ts +3 -3
- package/dist/llm/kernel-driver/restore.js +23 -28
- package/dist/llm/kernel-driver/runtime.d.ts +1 -1
- package/dist/llm/kernel-driver/runtime.js +1 -1
- package/dist/llm/kernel-driver/sideDialog-txn.d.ts +8 -0
- package/dist/llm/kernel-driver/{subdialog-txn.js → sideDialog-txn.js} +13 -13
- package/dist/llm/kernel-driver/{subdialog.d.ts → sideDialog.d.ts} +13 -13
- package/dist/llm/kernel-driver/{subdialog.js → sideDialog.js} +203 -170
- package/dist/llm/kernel-driver/tellask-special.d.ts +7 -3
- package/dist/llm/kernel-driver/tellask-special.js +474 -497
- package/dist/llm/kernel-driver/types.d.ts +25 -9
- package/dist/mcp/config.d.ts +1 -0
- package/dist/mcp/config.js +7 -2
- package/dist/mcp/supervisor.d.ts +2 -0
- package/dist/mcp/supervisor.js +2 -1
- package/dist/minds/builtin/pangu/persona.en.md +4 -4
- package/dist/minds/load.js +6 -6
- package/dist/minds/system-prompt-parts.d.ts +1 -1
- package/dist/minds/system-prompt-parts.js +12 -12
- package/dist/minds/system-prompt.d.ts +1 -1
- package/dist/minds/system-prompt.js +56 -56
- package/dist/persistence-errors.d.ts +1 -1
- package/dist/persistence.d.ts +126 -121
- package/dist/persistence.js +1190 -786
- package/dist/priming.d.ts +3 -3
- package/dist/priming.js +62 -61
- package/dist/recovery/reply-special.js +5 -5
- package/dist/runtime/driver-messages.d.ts +3 -2
- package/dist/runtime/driver-messages.js +68 -57
- package/dist/runtime/inter-dialog-format.d.ts +12 -10
- package/dist/runtime/inter-dialog-format.js +80 -35
- package/dist/runtime/interjection-pause-stop.js +1 -1
- package/dist/runtime/reply-prompt-copy.d.ts +7 -3
- package/dist/runtime/reply-prompt-copy.js +39 -14
- package/dist/server/api-routes.js +87 -83
- package/dist/server/static-server.js +1 -1
- package/dist/server/websocket-handler.js +163 -153
- package/dist/tool-availability.js +1 -1
- package/dist/tools/app-reminders.js +17 -4
- package/dist/tools/ctrl.js +5 -5
- package/dist/tools/os.js +16 -16
- package/dist/tools/pending-tellask-reminder.js +20 -14
- package/dist/tools/prompts/control/en/index.md +1 -1
- package/dist/tools/prompts/control/en/principles.md +8 -8
- package/dist/tools/prompts/control/en/scenarios.md +7 -7
- package/dist/tools/prompts/control/en/tools.md +7 -7
- package/dist/tools/prompts/control/zh/principles.md +4 -4
- package/dist/tools/prompts/control/zh/scenarios.md +5 -5
- package/dist/tools/prompts/control/zh/tools.md +3 -3
- package/dist/tools/prompts/team_memory/en/scenarios.md +1 -1
- package/dist/tools/prompts/team_memory/zh/scenarios.md +1 -1
- package/dist/tools/team_mgmt-manual.js +2 -2
- package/dist/tools/team_mgmt-mcp-manual.js +10 -0
- package/dist/tools/team_mgmt.js +4 -4
- package/dist/utils/taskdoc.js +12 -12
- package/package.json +3 -3
- package/webapp/dist/assets/{_basePickBy-BPJaiZdW.js → _basePickBy-B7M9Q0Fa.js} +3 -3
- package/webapp/dist/assets/_basePickBy-B7M9Q0Fa.js.map +1 -0
- package/webapp/dist/assets/{_baseUniq-BEetT15i.js → _baseUniq-DAeYoL6j.js} +2 -2
- package/webapp/dist/assets/_baseUniq-DAeYoL6j.js.map +1 -0
- package/webapp/dist/assets/{arc-Dm7Zf36f.js → arc-Bh4nDbNR.js} +2 -2
- package/webapp/dist/assets/arc-Bh4nDbNR.js.map +1 -0
- package/webapp/dist/assets/{architectureDiagram-VXUJARFQ-BpTPtkuo.js → architectureDiagram-2XIMDMQ5-CxqmdsIm.js} +26 -8
- package/webapp/dist/assets/architectureDiagram-2XIMDMQ5-CxqmdsIm.js.map +1 -0
- package/webapp/dist/assets/{blockDiagram-VD42YOAC-C8fLN0iu.js → blockDiagram-WCTKOSBZ-CxIWLtpt.js} +187 -170
- package/webapp/dist/assets/blockDiagram-WCTKOSBZ-CxIWLtpt.js.map +1 -0
- package/webapp/dist/assets/{c4Diagram-YG6GDRKO-BpPr62CH.js → c4Diagram-IC4MRINW-1qErOIgG.js} +4 -4
- package/webapp/dist/assets/c4Diagram-IC4MRINW-1qErOIgG.js.map +1 -0
- package/webapp/dist/assets/{channel-EMYoPjW3.js → channel-DkgZHNUe.js} +2 -2
- package/webapp/dist/assets/channel-DkgZHNUe.js.map +1 -0
- package/webapp/dist/assets/{chunk-4BX2VUAB-CefNtjWG.js → chunk-4BX2VUAB-BmdMbU9v.js} +2 -2
- package/webapp/dist/assets/chunk-4BX2VUAB-BmdMbU9v.js.map +1 -0
- package/webapp/dist/assets/{chunk-55IACEB6-C_X7T43V.js → chunk-55IACEB6-D6LDTDBy.js} +2 -2
- package/webapp/dist/assets/chunk-55IACEB6-D6LDTDBy.js.map +1 -0
- package/webapp/dist/assets/{chunk-FMBD7UC4-ORmtkrtS.js → chunk-FMBD7UC4-C-BdCe4C.js} +2 -2
- package/webapp/dist/assets/chunk-FMBD7UC4-C-BdCe4C.js.map +1 -0
- package/webapp/dist/assets/{chunk-TZMSLE5B-Gao4qrq7.js → chunk-JSJVCQXG-WA_BLIm9.js} +14 -6
- package/webapp/dist/assets/chunk-JSJVCQXG-WA_BLIm9.js.map +1 -0
- package/webapp/dist/assets/{chunk-QN33PNHL-LTAOVhWu.js → chunk-KX2RTZJC-CA7sDJO5.js} +2 -2
- package/webapp/dist/assets/chunk-KX2RTZJC-CA7sDJO5.js.map +1 -0
- package/webapp/dist/assets/{chunk-DI55MBZ5-CbvrsI_w.js → chunk-NQ4KR5QH-wlvxalE3.js} +9 -7
- package/webapp/dist/assets/chunk-NQ4KR5QH-wlvxalE3.js.map +1 -0
- package/webapp/dist/assets/{chunk-QZHKN3VN-ZoUM_4u5.js → chunk-QZHKN3VN-Bo1VMcph.js} +2 -2
- package/webapp/dist/assets/chunk-QZHKN3VN-Bo1VMcph.js.map +1 -0
- package/webapp/dist/assets/{chunk-B4BG7PRW-BRe3_2oA.js → chunk-WL4C6EOR-B-Pk44be.js} +171 -121
- package/webapp/dist/assets/chunk-WL4C6EOR-B-Pk44be.js.map +1 -0
- package/webapp/dist/assets/{classDiagram-2ON5EDUG-uha1vIGN.js → classDiagram-VBA2DB6C-BqKuyb49.js} +7 -6
- package/webapp/dist/assets/classDiagram-VBA2DB6C-BqKuyb49.js.map +1 -0
- package/webapp/dist/assets/{classDiagram-v2-WZHVMYZB-uha1vIGN.js → classDiagram-v2-RAHNMMFH-BqKuyb49.js} +7 -6
- package/webapp/dist/assets/classDiagram-v2-RAHNMMFH-BqKuyb49.js.map +1 -0
- package/webapp/dist/assets/{clone-_9Ayb1Gp.js → clone-BX5z8WVZ.js} +2 -2
- package/webapp/dist/assets/clone-BX5z8WVZ.js.map +1 -0
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-C8wDw3NY.js → cose-bilkent-S5V4N54A-B-s11SgN.js} +2 -2
- package/webapp/dist/assets/cose-bilkent-S5V4N54A-B-s11SgN.js.map +1 -0
- package/webapp/dist/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -1
- package/webapp/dist/assets/{dagre-6UL2VRFP-BUSeNot0.js → dagre-KLK3FWXG-DmQFV2qK.js} +7 -7
- package/webapp/dist/assets/dagre-KLK3FWXG-DmQFV2qK.js.map +1 -0
- package/webapp/dist/assets/defaultLocale-B2RvLBDe.js.map +1 -1
- package/webapp/dist/assets/{diagram-PSM6KHXK-CMZAksVC.js → diagram-E7M64L7V-QRaBfST8.js} +10 -10
- package/webapp/dist/assets/diagram-E7M64L7V-QRaBfST8.js.map +1 -0
- package/webapp/dist/assets/{diagram-QEK2KX5R-BQKoRtwy.js → diagram-IFDJBPK2-lrWn1Obo.js} +9 -8
- package/webapp/dist/assets/diagram-IFDJBPK2-lrWn1Obo.js.map +1 -0
- package/webapp/dist/assets/{diagram-S2PKOQOG-DjMG97kd.js → diagram-P4PSJMXO-sTU7Hh-Y.js} +8 -8
- package/webapp/dist/assets/diagram-P4PSJMXO-sTU7Hh-Y.js.map +1 -0
- package/webapp/dist/assets/{erDiagram-Q2GNP2WA-BujwA137.js → erDiagram-INFDFZHY-Cx6jc9Wq.js} +96 -75
- package/webapp/dist/assets/erDiagram-INFDFZHY-Cx6jc9Wq.js.map +1 -0
- package/webapp/dist/assets/{flowDiagram-NV44I4VS-DgwPjg4y.js → flowDiagram-PKNHOUZH-DfGI49Dz.js} +98 -81
- package/webapp/dist/assets/flowDiagram-PKNHOUZH-DfGI49Dz.js.map +1 -0
- package/webapp/dist/assets/{ganttDiagram-JELNMOA3-Db2ykf3E.js → ganttDiagram-A5KZAMGK-nrcHWWaM.js} +28 -3
- package/webapp/dist/assets/ganttDiagram-A5KZAMGK-nrcHWWaM.js.map +1 -0
- package/webapp/dist/assets/{gitGraphDiagram-V2S2FVAM-D_gSifkv.js → gitGraphDiagram-K3NZZRJ6-D8ivAqd6.js} +38 -46
- package/webapp/dist/assets/gitGraphDiagram-K3NZZRJ6-D8ivAqd6.js.map +1 -0
- package/webapp/dist/assets/graph-R5G-y8tB.js +782 -0
- package/webapp/dist/assets/graph-R5G-y8tB.js.map +1 -0
- package/webapp/dist/assets/{index-DLajsIDJ.js → index--fy89xGh.js} +2214 -2023
- package/webapp/dist/assets/index--fy89xGh.js.map +1 -0
- package/webapp/dist/assets/{index-xvYYeHuy.css → index-DZFkLLVz.css} +18 -10
- package/webapp/dist/assets/{infoDiagram-HS3SLOUP-BDba5pKs.js → infoDiagram-LFFYTUFH-PIoZHr7s.js} +7 -7
- package/webapp/dist/assets/infoDiagram-LFFYTUFH-PIoZHr7s.js.map +1 -0
- package/webapp/dist/assets/init-ZxktEp_H.js.map +1 -1
- package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-oCM-LYk1.js +966 -0
- package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-oCM-LYk1.js.map +1 -0
- package/webapp/dist/assets/{journeyDiagram-XKPGCS4Q-CmJAbmlm.js → journeyDiagram-4ABVD52K-C2qidjQ5.js} +5 -5
- package/webapp/dist/assets/journeyDiagram-4ABVD52K-C2qidjQ5.js.map +1 -0
- package/webapp/dist/assets/{kanban-definition-3W4ZIXB7-DxQeBTDk.js → kanban-definition-K7BYSVSG-Du0TC8WS.js} +5 -3
- package/webapp/dist/assets/kanban-definition-K7BYSVSG-Du0TC8WS.js.map +1 -0
- package/webapp/dist/assets/{layout-DteV_yE8.js → layout-VmEo1OEB.js} +5 -5
- package/webapp/dist/assets/layout-VmEo1OEB.js.map +1 -0
- package/webapp/dist/assets/{linear-zItbPrND.js → linear-B662YHAc.js} +2 -2
- package/webapp/dist/assets/linear-B662YHAc.js.map +1 -0
- package/webapp/dist/assets/{mindmap-definition-VGOIOE7T-BJXI7UqO.js → mindmap-definition-YRQLILUH-D7arZj95.js} +7 -5
- package/webapp/dist/assets/mindmap-definition-YRQLILUH-D7arZj95.js.map +1 -0
- package/webapp/dist/assets/ordinal-CxptdPJm.js.map +1 -1
- package/webapp/dist/assets/{pieDiagram-ADFJNKIX-BpM-aH2p.js → pieDiagram-SKSYHLDU-DvjPP4PA.js} +8 -8
- package/webapp/dist/assets/pieDiagram-SKSYHLDU-DvjPP4PA.js.map +1 -0
- package/webapp/dist/assets/{quadrantDiagram-AYHSOK5B-NXdIpA15.js → quadrantDiagram-337W2JSQ-B_JUGMj_.js} +3 -3
- package/webapp/dist/assets/quadrantDiagram-337W2JSQ-B_JUGMj_.js.map +1 -0
- package/webapp/dist/assets/{requirementDiagram-UZGBJVZJ-D1AICAA0.js → requirementDiagram-Z7DCOOCP-DF0mpvE3.js} +16 -6
- package/webapp/dist/assets/requirementDiagram-Z7DCOOCP-DF0mpvE3.js.map +1 -0
- package/webapp/dist/assets/{sankeyDiagram-TZEHDZUN-WiReDPfo.js → sankeyDiagram-WA2Y5GQK-CoXlxv00.js} +2 -2
- package/webapp/dist/assets/sankeyDiagram-WA2Y5GQK-CoXlxv00.js.map +1 -0
- package/webapp/dist/assets/{sequenceDiagram-WL72ISMW-Cw76oP8t.js → sequenceDiagram-2WXFIKYE-DYqT5Pg7.js} +601 -201
- package/webapp/dist/assets/sequenceDiagram-2WXFIKYE-DYqT5Pg7.js.map +1 -0
- package/webapp/dist/assets/{stateDiagram-FKZM4ZOC-QjCeRczs.js → stateDiagram-RAJIS63D-D9b1mN8-.js} +9 -9
- package/webapp/dist/assets/stateDiagram-RAJIS63D-D9b1mN8-.js.map +1 -0
- package/webapp/dist/assets/{stateDiagram-v2-4FDKWEC3-IClqxQ4s.js → stateDiagram-v2-FVOUBMTO-DNzgudL_.js} +5 -5
- package/webapp/dist/assets/stateDiagram-v2-FVOUBMTO-DNzgudL_.js.map +1 -0
- package/webapp/dist/assets/{timeline-definition-IT6M3QCI-BfyfTY7m.js → timeline-definition-YZTLITO2-CkyKUY7A.js} +3 -3
- package/webapp/dist/assets/timeline-definition-YZTLITO2-CkyKUY7A.js.map +1 -0
- package/webapp/dist/assets/{treemap-GDKQZRPO-C5MiL6--.js → treemap-KZPCXAKY-CZd09kF-.js} +37 -24
- package/webapp/dist/assets/treemap-KZPCXAKY-CZd09kF-.js.map +1 -0
- package/webapp/dist/assets/vennDiagram-LZ73GAT5-BxVF5Olo.js +2487 -0
- package/webapp/dist/assets/vennDiagram-LZ73GAT5-BxVF5Olo.js.map +1 -0
- package/webapp/dist/assets/{xychartDiagram-PRI3JC2R-ybaJrSry.js → xychartDiagram-JWTSCODW-BRwRloPc.js} +4 -4
- package/webapp/dist/assets/xychartDiagram-JWTSCODW-BRwRloPc.js.map +1 -0
- package/webapp/dist/index.html +2 -2
- package/dist/docs/issues/global-dialog-event-broadcaster-missing.md +0 -128
- package/dist/llm/kernel-driver/subdialog-txn.d.ts +0 -8
- package/webapp/dist/assets/_basePickBy-BPJaiZdW.js.map +0 -1
- package/webapp/dist/assets/_baseUniq-BEetT15i.js.map +0 -1
- package/webapp/dist/assets/arc-Dm7Zf36f.js.map +0 -1
- package/webapp/dist/assets/architectureDiagram-VXUJARFQ-BpTPtkuo.js.map +0 -1
- package/webapp/dist/assets/blockDiagram-VD42YOAC-C8fLN0iu.js.map +0 -1
- package/webapp/dist/assets/c4Diagram-YG6GDRKO-BpPr62CH.js.map +0 -1
- package/webapp/dist/assets/channel-EMYoPjW3.js.map +0 -1
- package/webapp/dist/assets/chunk-4BX2VUAB-CefNtjWG.js.map +0 -1
- package/webapp/dist/assets/chunk-55IACEB6-C_X7T43V.js.map +0 -1
- package/webapp/dist/assets/chunk-B4BG7PRW-BRe3_2oA.js.map +0 -1
- package/webapp/dist/assets/chunk-DI55MBZ5-CbvrsI_w.js.map +0 -1
- package/webapp/dist/assets/chunk-FMBD7UC4-ORmtkrtS.js.map +0 -1
- package/webapp/dist/assets/chunk-QN33PNHL-LTAOVhWu.js.map +0 -1
- package/webapp/dist/assets/chunk-QZHKN3VN-ZoUM_4u5.js.map +0 -1
- package/webapp/dist/assets/chunk-TZMSLE5B-Gao4qrq7.js.map +0 -1
- package/webapp/dist/assets/classDiagram-2ON5EDUG-uha1vIGN.js.map +0 -1
- package/webapp/dist/assets/classDiagram-v2-WZHVMYZB-uha1vIGN.js.map +0 -1
- package/webapp/dist/assets/clone-_9Ayb1Gp.js.map +0 -1
- package/webapp/dist/assets/cose-bilkent-S5V4N54A-C8wDw3NY.js.map +0 -1
- package/webapp/dist/assets/dagre-6UL2VRFP-BUSeNot0.js.map +0 -1
- package/webapp/dist/assets/diagram-PSM6KHXK-CMZAksVC.js.map +0 -1
- package/webapp/dist/assets/diagram-QEK2KX5R-BQKoRtwy.js.map +0 -1
- package/webapp/dist/assets/diagram-S2PKOQOG-DjMG97kd.js.map +0 -1
- package/webapp/dist/assets/erDiagram-Q2GNP2WA-BujwA137.js.map +0 -1
- package/webapp/dist/assets/flowDiagram-NV44I4VS-DgwPjg4y.js.map +0 -1
- package/webapp/dist/assets/ganttDiagram-JELNMOA3-Db2ykf3E.js.map +0 -1
- package/webapp/dist/assets/gitGraphDiagram-V2S2FVAM-D_gSifkv.js.map +0 -1
- package/webapp/dist/assets/graph-BHjCU5xP.js +0 -425
- package/webapp/dist/assets/graph-BHjCU5xP.js.map +0 -1
- package/webapp/dist/assets/index-DLajsIDJ.js.map +0 -1
- package/webapp/dist/assets/infoDiagram-HS3SLOUP-BDba5pKs.js.map +0 -1
- package/webapp/dist/assets/journeyDiagram-XKPGCS4Q-CmJAbmlm.js.map +0 -1
- package/webapp/dist/assets/kanban-definition-3W4ZIXB7-DxQeBTDk.js.map +0 -1
- package/webapp/dist/assets/layout-DteV_yE8.js.map +0 -1
- package/webapp/dist/assets/linear-zItbPrND.js.map +0 -1
- package/webapp/dist/assets/mindmap-definition-VGOIOE7T-BJXI7UqO.js.map +0 -1
- package/webapp/dist/assets/pieDiagram-ADFJNKIX-BpM-aH2p.js.map +0 -1
- package/webapp/dist/assets/quadrantDiagram-AYHSOK5B-NXdIpA15.js.map +0 -1
- package/webapp/dist/assets/requirementDiagram-UZGBJVZJ-D1AICAA0.js.map +0 -1
- package/webapp/dist/assets/sankeyDiagram-TZEHDZUN-WiReDPfo.js.map +0 -1
- package/webapp/dist/assets/sequenceDiagram-WL72ISMW-Cw76oP8t.js.map +0 -1
- package/webapp/dist/assets/stateDiagram-FKZM4ZOC-QjCeRczs.js.map +0 -1
- package/webapp/dist/assets/stateDiagram-v2-4FDKWEC3-IClqxQ4s.js.map +0 -1
- package/webapp/dist/assets/timeline-definition-IT6M3QCI-BfyfTY7m.js.map +0 -1
- package/webapp/dist/assets/treemap-GDKQZRPO-C5MiL6--.js.map +0 -1
- package/webapp/dist/assets/xychartDiagram-PRI3JC2R-ybaJrSry.js.map +0 -1
|
@@ -11,10 +11,10 @@ This document provides detailed implementation specifications for the Dominds di
|
|
|
11
11
|
3. [3-Type Teammate Tellask Taxonomy](#3-type-teammate-tellask-taxonomy)
|
|
12
12
|
4. [Core Mechanisms](#core-mechanisms)
|
|
13
13
|
5. [Q4H: Questions for Human](#q4h-questions-for-human)
|
|
14
|
-
6. [Dialog
|
|
14
|
+
6. [Dialog Relationship & SideDialogs](#dialog-relationship--sidedialogs)
|
|
15
15
|
7. [Mental Clarity Tools](#mental-clarity-tools)
|
|
16
16
|
8. [Reminder Management](#reminder-management)
|
|
17
|
-
9. [
|
|
17
|
+
9. [SideDialog Registry](#sideDialog-registry)
|
|
18
18
|
10. [Technical Architecture](#technical-architecture)
|
|
19
19
|
11. [Dialog Management](#dialog-management)
|
|
20
20
|
12. [Memory Management](#memory-management)
|
|
@@ -27,55 +27,55 @@ This document provides detailed implementation specifications for the Dominds di
|
|
|
27
27
|
## Terminology
|
|
28
28
|
|
|
29
29
|
This chapter defines the implementation-facing terms used throughout this document.
|
|
30
|
-
For bilingual / user-facing naming conventions (
|
|
30
|
+
For bilingual / user-facing naming conventions (Main Dialog / Side Dialog; tellasker / tellaskee), see [`dominds-terminology.md`](./dominds-terminology.md).
|
|
31
31
|
For Taskdoc package structure and encapsulation rules, see [`encapsulated-taskdoc.md`](./encapsulated-taskdoc.md).
|
|
32
32
|
|
|
33
|
-
###
|
|
33
|
+
### AskerDialog
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
An **askerDialog** is the implementation-facing dialog that currently owns an assignment or reply obligation for a sideDialog. It may be the main dialog or another sideDialog; it is a tellask/reply relationship, not inherently a hierarchy label.
|
|
36
36
|
|
|
37
|
-
Note: **
|
|
37
|
+
Note: **askerDialog** is a tellask/reply relation, not a hierarchy or seniority label. For TYPE A (`tellaskBack`), the tellasker is the direct askerDialog; for TYPE B/C, the tellasker may be a different dialog.
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
An askerDialog may receive **TellaskBack** from sideDialogs that currently owe it a reply. When a sideDialog needs guidance or additional context, it can Tellask back via `tellaskBack({ tellaskContent: "..." })` (TYPE A / `TellaskBack`), which provides responses that feed back into the sideDialog's context.
|
|
40
40
|
|
|
41
|
-
###
|
|
41
|
+
### SideDialog
|
|
42
42
|
|
|
43
|
-
A **
|
|
43
|
+
A **sideDialog** is a specialized dialog spawned by an askerDialog to handle specific subtasks. SideDialogs operate with fresh context, focusing on targeted objectives while maintaining a communication link back to their askerDialog.
|
|
44
44
|
|
|
45
|
-
**TellaskBack**: A
|
|
45
|
+
**TellaskBack**: A sideDialog can Tellask its **tellasker** to request clarification during task execution. In TYPE A, the tellasker is the direct askerDialog. This allows the sideDialog to ask questions and receive guidance while maintaining its own context and progress.
|
|
46
46
|
|
|
47
|
-
### Tellasker
|
|
47
|
+
### Tellasker / Tellaskee (Tellask roles)
|
|
48
48
|
|
|
49
|
-
A **tellasker
|
|
49
|
+
A **tellasker** is the dialog that issued the current Tellask. A **tellaskee** is the dialog handling that Tellask (this dialog). These are **Tellask roles**, not hierarchy:
|
|
50
50
|
|
|
51
|
-
- For TYPE A (`tellaskBack`), the tellasker
|
|
52
|
-
- For TYPE B/C, the tellasker
|
|
53
|
-
- Responses route to the **current tellasker
|
|
51
|
+
- For TYPE A (`tellaskBack`), the tellasker is the direct askerDialog.
|
|
52
|
+
- For TYPE B/C, the tellasker may be a different dialog (main dialog or another Side Dialog).
|
|
53
|
+
- Responses route to the **current tellasker** recorded in `assignmentFromAsker`.
|
|
54
54
|
|
|
55
|
-
### Main Dialog
|
|
55
|
+
### Main Dialog
|
|
56
56
|
|
|
57
|
-
The **main dialog**
|
|
57
|
+
The **main dialog** is the top-level dialog with no askerDialog relationship. It serves as the main entry point for task execution and can spawn multiple levels of sideDialogs.
|
|
58
58
|
|
|
59
59
|
### Q4H (Questions for Human)
|
|
60
60
|
|
|
61
|
-
A **Q4H** is a pending question raised by a dialog (main or
|
|
61
|
+
A **Q4H** is a pending question raised by a dialog (main or sideDialog) that requires human input to proceed. Q4Hs are indexed in the dialog's `q4h.yaml` file (an index, not source of truth) and are **cleared by `clear_mind` operations**. The actual question content is stored in the dialog's messages where the `askHuman({ tellaskContent: "..." })` Tellask was recorded.
|
|
62
62
|
|
|
63
|
-
###
|
|
63
|
+
### SideDialog Index (subdlg.yaml)
|
|
64
64
|
|
|
65
|
-
A **subdlg.yaml** file indexes pending
|
|
65
|
+
A **subdlg.yaml** file indexes pending sideDialogs that an askerDialog is waiting for. Like `q4h.yaml`, it is an index file, not the source of truth:
|
|
66
66
|
|
|
67
|
-
- The index tracks which
|
|
68
|
-
- Actual
|
|
67
|
+
- The index tracks which sideDialog IDs the tellasker is waiting for
|
|
68
|
+
- Actual sideDialog state is verified from disk (done/ directory)
|
|
69
69
|
- Used by the backend coroutine for crash recovery and auto-revive
|
|
70
70
|
|
|
71
|
-
###
|
|
71
|
+
### SideDialog Registry
|
|
72
72
|
|
|
73
|
-
The **
|
|
74
|
-
If a
|
|
73
|
+
The **sideDialog registry** is a main-dialog-scoped Map that maintains persistent references to registered sideDialogs. The registry uses `agentId!sessionSlug` as its key format. It moves with the main dialog to `done/` when the main dialog completes, and is rebuilt on main dialog load by scanning done/ sideDialog YAMLs.
|
|
74
|
+
If a Side Dialog is declared dead, its Type B registry entry is removed so the same `agentId!sessionSlug` can start a brand-new Side Dialog on the next Tellask.
|
|
75
75
|
|
|
76
76
|
### Teammate Tellask
|
|
77
77
|
|
|
78
|
-
A **teammate Tellask** is a Dominds specific syntax that triggers communication with another agent as
|
|
78
|
+
A **teammate Tellask** is a Dominds specific syntax that triggers communication with another agent as sideDialog. Teammate Tellasks have three distinct patterns with different semantics (see Section 3).
|
|
79
79
|
|
|
80
80
|
**Tellask block structure** (see also [`dominds-terminology.md`](./dominds-terminology.md)):
|
|
81
81
|
|
|
@@ -91,18 +91,18 @@ A **teammate Tellask** is a Dominds specific syntax that triggers communication
|
|
|
91
91
|
|
|
92
92
|
Dialog driving is a **sole backend algorithm**. The frontend/client never drives dialogs. All dialog state transitions, resumption logic, and generation loops execute entirely in backend coroutines. Frontend only subscribes to publish channels (PubChan) for real-time UI updates.
|
|
93
93
|
|
|
94
|
-
### Registry
|
|
94
|
+
### Registry Structure
|
|
95
95
|
|
|
96
96
|
The system maintains three levels of registries for dialog management:
|
|
97
97
|
|
|
98
98
|
**Global Registry (Server-Scoped)**
|
|
99
|
-
A server-wide mapping of `rootId →
|
|
99
|
+
A server-wide mapping of `rootId → MainDialog` objects. This is the single source of truth for all active main dialogs. Backend coroutines scan this registry to find dialogs needing driving.
|
|
100
100
|
|
|
101
|
-
**Local Registry (Per
|
|
102
|
-
A per-root mapping of `selfId → Dialog` objects. This registry contains the
|
|
101
|
+
**Local Registry (Per MainDialog)**
|
|
102
|
+
A per-root mapping of `selfId → Dialog` objects. This registry contains the main dialog itself plus all loaded sideDialogs, enabling O(1) lookup of any dialog within a main dialog tree.
|
|
103
103
|
|
|
104
|
-
**
|
|
105
|
-
A per-root mapping of `agentId!sessionSlug →
|
|
104
|
+
**SideDialog Registry (Per MainDialog)**
|
|
105
|
+
A per-root mapping of `agentId!sessionSlug → SideDialog` objects. This registry tracks TYPE B registered sideDialogs for resumption across multiple interactions. TYPE C transient sideDialogs are never registered.
|
|
106
106
|
|
|
107
107
|
### Per-Dialog Mutex
|
|
108
108
|
|
|
@@ -112,14 +112,14 @@ Each Dialog object carries an exclusive mutex with an associated wait queue. Whe
|
|
|
112
112
|
|
|
113
113
|
Backend coroutines drive dialogs using the following pattern:
|
|
114
114
|
|
|
115
|
-
1. Scan the Global Registry to identify
|
|
116
|
-
2. For each candidate, check resumption conditions (Q4H answered,
|
|
115
|
+
1. Scan the Global Registry to identify main dialogs needing driving
|
|
116
|
+
2. For each candidate, check resumption conditions (Q4H answered, sideDialog completions received)
|
|
117
117
|
3. Acquire the dialog's mutex before driving
|
|
118
118
|
4. Execute the generation loop until suspension point or completion
|
|
119
119
|
5. Release the mutex
|
|
120
120
|
6. Persist all state changes to storage
|
|
121
121
|
|
|
122
|
-
The driving loop continues until a dialog suspends (awaiting Q4H or
|
|
122
|
+
The driving loop continues until a dialog suspends (awaiting Q4H or sideDialog) or completes. When conditions change (user answers Q4H, sideDialog finishes), the backend detects these via storage checks and resumes driving automatically.
|
|
123
123
|
|
|
124
124
|
### Frontend Integration
|
|
125
125
|
|
|
@@ -134,7 +134,7 @@ All driving logic, resumption decisions, and state management remain purely back
|
|
|
134
134
|
|
|
135
135
|
### Global Dialog Event Broadcaster
|
|
136
136
|
|
|
137
|
-
Some dialog events are rtws-global rather than dialog-scoped, including `new_q4h_asked`, `q4h_answered`, `
|
|
137
|
+
Some dialog events are rtws-global rather than dialog-scoped, including `new_q4h_asked`, `q4h_answered`, `sideDialog_created_evt`, and `dlg_touched_evt`.
|
|
138
138
|
|
|
139
139
|
These events require a **global dialog event broadcaster** to be installed during runtime bootstrap before any dialog-driving logic runs. This broadcaster is mandatory infrastructure, not an optional optimization:
|
|
140
140
|
|
|
@@ -149,8 +149,8 @@ Missing broadcaster is therefore a runtime bootstrap invariant violation, not a
|
|
|
149
149
|
Dialog state is persisted to storage at key points:
|
|
150
150
|
|
|
151
151
|
- After each message generation
|
|
152
|
-
- On suspension (Q4H raised,
|
|
153
|
-
- On resumption (Q4H answered,
|
|
152
|
+
- On suspension (Q4H raised, sideDialog created)
|
|
153
|
+
- On resumption (Q4H answered, sideDialog completed)
|
|
154
154
|
- On completion
|
|
155
155
|
|
|
156
156
|
This ensures crash recovery and enables the backend to resume from any persisted state without depending on frontend state.
|
|
@@ -177,7 +177,7 @@ After the user clicks `Continue`, the backend MUST re-evaluate fresh persistence
|
|
|
177
177
|
- **Case 1: the dialog no longer has a reply obligation**
|
|
178
178
|
If there is also no blocker, the dialog should simply continue driving. If it has already become ordinary idle-waiting-user, then `resume_dialog` is no longer actually resumable.
|
|
179
179
|
- **Case 2: the dialog still has a reply obligation and is still suspended**
|
|
180
|
-
Typical examples are pending Q4H or pending
|
|
180
|
+
Typical examples are pending Q4H or pending sideDialogs. In this case, `Continue` should exit the interjection-paused projection and restore the true `blocked` state.
|
|
181
181
|
- **Case 3: the dialog still has a reply obligation but is no longer suspended and is eligible to proceed**
|
|
182
182
|
For example, the blocker has disappeared, or a queued prompt provides a valid continuation path. In this case, `Continue` must not first fall back to an intermediate placeholder `blocked/idle` state; it should keep driving immediately.
|
|
183
183
|
|
|
@@ -212,44 +212,38 @@ This section documents the three distinct types of teammate Tellasks in the Domi
|
|
|
212
212
|
|
|
213
213
|
```mermaid
|
|
214
214
|
flowchart TD
|
|
215
|
-
M["LLM emits tellaskSessionless(...)"] --> Q{"Is this a
|
|
215
|
+
M["LLM emits tellaskSessionless(...)"] --> Q{"Is this a sideDialog Tellasking its direct askerDialog (tellasker for TYPE A)?"}
|
|
216
216
|
Q -- yes --> A["TYPE A: TellaskBack<br/>(TellaskBack)<br/>Primary: tellaskBack(...) (NO sessionSlug)"]
|
|
217
217
|
Q -- no --> T{Is sessionSlug present?}
|
|
218
|
-
T -- yes --> B["TYPE B: Registered
|
|
219
|
-
T -- no --> C["TYPE C: Transient
|
|
218
|
+
T -- yes --> B["TYPE B: Registered sideDialog Tellask<br/>(Tellask Session / Registered Session Tellask)<br/>tellask(..., sessionSlug=...)"]
|
|
219
|
+
T -- no --> C["TYPE C: Transient sideDialog Tellask<br/>(Fresh Tellask / One-shot Tellask)<br/>tellaskSessionless(...)"]
|
|
220
220
|
```
|
|
221
221
|
|
|
222
222
|
### TYPE A: TellaskBack (Type A / `TellaskBack`)
|
|
223
223
|
|
|
224
224
|
**Primary syntax**: `tellaskBack({ tellaskContent: "..." })` (NO `sessionSlug`) — `tellaskBack({ tellaskContent: "..." }) sessionSlug ...` is a **syntax error**
|
|
225
225
|
|
|
226
|
-
**Tolerated fallback**: `tellaskBack({ tellaskContent: "..." })` (NO `sessionSlug`)
|
|
227
|
-
|
|
228
226
|
**Behavior**:
|
|
229
227
|
|
|
230
|
-
1. Current
|
|
231
|
-
2. Driver switches to drive the **tellasker
|
|
232
|
-
3. Tellasker
|
|
233
|
-
4.
|
|
228
|
+
1. Current sideDialog **suspends**
|
|
229
|
+
2. Driver switches to drive the **tellasker** (direct askerDialog for TYPE A; uses `sideDialog.askerDialog` reference)
|
|
230
|
+
3. Tellasker response flows back to the sideDialog
|
|
231
|
+
4. SideDialog **resumes** with tellasker's response in context
|
|
234
232
|
|
|
235
233
|
**Key Characteristics**:
|
|
236
234
|
|
|
237
|
-
- Uses `
|
|
238
|
-
- No registration -
|
|
239
|
-
-
|
|
235
|
+
- Uses `sideDialog.askerDialog` reference (no registry lookup)
|
|
236
|
+
- No registration - askerDialog relationship is inherent
|
|
237
|
+
- TYPE A always targets the direct askerDialog (the tellasker for that Tellask).
|
|
240
238
|
- `tellaskBack({ tellaskContent: "..." })` is the canonical Type A syntax: it always routes to the tellasker (the dialog that issued the current Tellask).
|
|
241
|
-
- This matters especially when the supdialog’s `agentId` is identical to the subdialog’s `agentId` (common when a sideline
|
|
242
|
-
is created via `freshBootsReasoning({ tellaskContent: "..." })`), where an explicit `tellaskBack({ tellaskContent: "..." })` is easier to get wrong by accident.
|
|
243
|
-
- The explicit `tellaskBack({ tellaskContent: "..." })` form is accepted as a semantic fallback for backwards compatibility, but is more
|
|
244
|
-
error-prone in FBR/self-subdialog cases.
|
|
245
239
|
|
|
246
|
-
**
|
|
240
|
+
**Side Dialog delivery rule (normative)**:
|
|
247
241
|
|
|
248
|
-
- If a
|
|
249
|
-
- Runtime treats that direct reply as the completion delivery to the tellasker
|
|
242
|
+
- If a Side Dialog has completed all assigned goals and can deliver the final result, it MUST reply directly with the response body; do not use `tellaskBack` to send final delivery.
|
|
243
|
+
- Runtime treats that direct reply as the completion delivery to the tellasker and injects the work-language marker automatically (`【Completed】` in English work language, `【最终完成】` in Chinese work language).
|
|
250
244
|
- If the work is unfinished, do not default to `tellaskBack`; first use team SOP / role ownership to judge whether a responsible owner is already clear, and if yes for execution work, directly use `tellask` / `tellaskSessionless` for that owner.
|
|
251
|
-
- Use `tellaskBack({ tellaskContent: "..." })` only when the
|
|
252
|
-
- **FBR exception**: FBR
|
|
245
|
+
- Use `tellaskBack({ tellaskContent: "..." })` only when the tellasker must clarify the request, decide a tradeoff, confirm acceptance criteria, provide missing input, or current SOP cannot determine ownership.
|
|
246
|
+
- **FBR exception**: FBR Side Dialogs forbid all tellask calls (including `tellaskBack` / `tellask` / `tellaskSessionless` / `askHuman`); they must list missing context and return.
|
|
253
247
|
|
|
254
248
|
**Inter-dialog transfer and markers (normative)**:
|
|
255
249
|
|
|
@@ -257,20 +251,20 @@ flowchart TD
|
|
|
257
251
|
- First-line markers are runtime-injected into that transfer payload by semantics; agents must not hand-write them:
|
|
258
252
|
- English work language:
|
|
259
253
|
- Ask-back reply: `【TellaskBack】`
|
|
260
|
-
- Regular completed
|
|
261
|
-
- FBR
|
|
254
|
+
- Regular completed Side Dialog reply: `【Completed】`
|
|
255
|
+
- FBR Side Dialog reply: `【FBR-Direct Reply】` or `【FBR-Reasoning Only】`
|
|
262
256
|
- Chinese work language:
|
|
263
257
|
- Ask-back reply: `【回问诉请】`
|
|
264
|
-
- Regular completed
|
|
265
|
-
- FBR
|
|
266
|
-
- If the
|
|
258
|
+
- Regular completed Side Dialog reply: `【最终完成】`
|
|
259
|
+
- FBR Side Dialog reply: `【FBR-直接回复】` or `【FBR-仅推理】`
|
|
260
|
+
- If the tellasker defines a “reply/delivery format” inside the tellask body, keep it to the business delivery structure; do not require tellaskee-side hand-written markers, because runtime injects those markers automatically.
|
|
267
261
|
- Source-dialog model raw is naturally preserved in source-dialog persistence; inter-dialog transfer must not rewrite or overwrite that source raw.
|
|
268
262
|
- Template-wrapped transfer is allowed: a model output from one dialog may be embedded into a runtime template and sent as the body to another dialog.
|
|
269
263
|
|
|
270
264
|
**Protocol clarification**:
|
|
271
265
|
|
|
272
|
-
- When you truly need to ask
|
|
273
|
-
- A direct plain-text reply is correct when the
|
|
266
|
+
- When you truly need to ask the tellasker back, emit it via `tellaskBack({ tellaskContent: "..." })`; first judge whether team SOP already identifies another responsible owner. Do not post plain-text intermediate status updates while unfinished.
|
|
267
|
+
- A direct plain-text reply is correct when the Side Dialog is already complete and is delivering the final result to the tellasker.
|
|
274
268
|
|
|
275
269
|
Note: no extra "Status: ..." line is required; the first-line marker is the stage reminder.
|
|
276
270
|
|
|
@@ -278,7 +272,7 @@ Note: no extra "Status: ..." line is required; the first-line marker is the stag
|
|
|
278
272
|
|
|
279
273
|
```
|
|
280
274
|
Current dialog: sub-001 (agentId: "backend-dev")
|
|
281
|
-
|
|
275
|
+
Tellasker: "orchestrator" (agentId)
|
|
282
276
|
|
|
283
277
|
LLM emits: tellaskSessionless({ targetAgentId: "orchestrator", tellaskContent: "..." }) How should I handle the database migration?
|
|
284
278
|
|
|
@@ -289,7 +283,7 @@ Result:
|
|
|
289
283
|
- sub-001 resumes with orchestrator's response
|
|
290
284
|
```
|
|
291
285
|
|
|
292
|
-
### TYPE B: Registered
|
|
286
|
+
### TYPE B: Registered SideDialog Tellask (Type B / `Tellask Session` / Registered Session Tellask)
|
|
293
287
|
|
|
294
288
|
**Syntax**: `tellask({ targetAgentId: "<anyAgentId>", sessionSlug: "<tellaskSession>", tellaskContent: "..." })` (note the space before `sessionSlug`)
|
|
295
289
|
|
|
@@ -307,58 +301,58 @@ headline text is ignored for tellaskSession parsing.
|
|
|
307
301
|
|
|
308
302
|
**Behavior**:
|
|
309
303
|
|
|
310
|
-
1. Check registry for existing
|
|
311
|
-
2. **If exists**: Resume the registered
|
|
312
|
-
3. **If not exists**: Create NEW
|
|
313
|
-
4.
|
|
314
|
-
5.
|
|
315
|
-
6.
|
|
304
|
+
1. Check registry for existing sideDialog with key `agentId!sessionSlug`
|
|
305
|
+
2. **If exists**: Resume the registered sideDialog
|
|
306
|
+
3. **If not exists**: Create NEW sideDialog AND register it with key `agentId!sessionSlug`
|
|
307
|
+
4. Tellasker **suspends** while sideDialog runs
|
|
308
|
+
5. SideDialog response flows back to the tellasker
|
|
309
|
+
6. Tellasker **resumes** with sideDialog's response
|
|
316
310
|
|
|
317
|
-
**Current
|
|
311
|
+
**Current Tellasker Tracking (important for reuse):**
|
|
318
312
|
|
|
319
|
-
When a registered
|
|
313
|
+
When a registered sideDialog is Tellasked again (same `agentId!sessionSlug`), the tellasker can be a **different dialog** (main dialog or another Side Dialog). On every Type B Tellask, the sideDialog’s metadata is updated with:
|
|
320
314
|
|
|
321
|
-
- The **current
|
|
315
|
+
- The **current tellasker ID** (so responses route back to the _latest_ tellasker)
|
|
322
316
|
- The **Tellask info** (headline/body, origin role, origin member, callId)
|
|
323
317
|
|
|
324
|
-
This makes Type B
|
|
318
|
+
This makes Type B sideDialogs reusable across multiple Tellask sites without losing correct response routing.
|
|
325
319
|
|
|
326
320
|
**Tellask Context on Resume**:
|
|
327
321
|
|
|
328
|
-
- On every TYPE B Tellask (new or resumed), the
|
|
329
|
-
is appended to the
|
|
330
|
-
This ensures the
|
|
322
|
+
- On every TYPE B Tellask (new or resumed), the tellasker-provided `mentionList`/`tellaskContent`
|
|
323
|
+
is appended to the sideDialog as a new user message before the sideDialog is driven.
|
|
324
|
+
This ensures the sideDialog receives the latest request context for each Tellask.
|
|
331
325
|
- System-injected resume prompts are context only and are **not parsed** for teammate/tool Tellasks.
|
|
332
326
|
|
|
333
327
|
**Updated Tellask While an Earlier Round Is Still Waiting (normative)**:
|
|
334
328
|
|
|
335
|
-
- For a registered
|
|
329
|
+
- For a registered Side Dialog (`same agentId!sessionSlug`), runtime maintains one current waiting tellasker round.
|
|
336
330
|
- If a newer TYPE B Tellask arrives before the earlier round replies, runtime immediately closes the earlier waiting round with a system-generated failed Tellask result. The wording must describe the conversation fact in business terms, not protocol jargon.
|
|
337
|
-
- The
|
|
331
|
+
- The tellaskee is not force-stopped. Instead, its next runtime prompt explains that the work request has been updated, explicitly says not to send a standalone acknowledgement, and includes the latest full assignment.
|
|
338
332
|
- Delivery of that updated assignment prompt is queued in-order at the next safe turn boundary. Runtime must not reject the update merely because another normal queued prompt already exists; queued prompts are ordered work, not a single overwrite slot.
|
|
339
|
-
- A
|
|
333
|
+
- A Side Dialog reply produced before that updated assignment prompt is rendered locally MUST NOT be delivered to the tellasker as the newer round's result.
|
|
340
334
|
|
|
341
335
|
**Key Characteristics**:
|
|
342
336
|
|
|
343
337
|
- Registry lookup is performed on each Tellask
|
|
344
|
-
- Enables **resumption** of previous
|
|
345
|
-
- Registered
|
|
346
|
-
- Registry is
|
|
338
|
+
- Enables **resumption** of previous sideDialogs
|
|
339
|
+
- Registered sideDialogs persist in the registry until main dialog completion
|
|
340
|
+
- Registry is main-dialog scoped (not accessible to sideDialogs)
|
|
347
341
|
|
|
348
342
|
**Example**:
|
|
349
343
|
|
|
350
344
|
```
|
|
351
|
-
|
|
345
|
+
Main dialog: orchestrator
|
|
352
346
|
Registry: {} (empty)
|
|
353
347
|
|
|
354
348
|
LLM emits: tellask({ targetAgentId: "researcher", sessionSlug: "market-analysis", tellaskContent: "..." })
|
|
355
349
|
|
|
356
350
|
Result (first call):
|
|
357
351
|
- Registry lookup: no "researcher!market-analysis" exists
|
|
358
|
-
- Create new
|
|
359
|
-
- Register it in
|
|
352
|
+
- Create new sideDialog "researcher!market-analysis"
|
|
353
|
+
- Register it in main dialog's registry
|
|
360
354
|
- orchestrator suspends
|
|
361
|
-
- Drive researcher
|
|
355
|
+
- Drive researcher sideDialog
|
|
362
356
|
- Response flows back to orchestrator
|
|
363
357
|
- orchestrator resumes
|
|
364
358
|
|
|
@@ -366,41 +360,41 @@ LLM emits again: tellask({ targetAgentId: "researcher", sessionSlug: "market-ana
|
|
|
366
360
|
|
|
367
361
|
Result (second call):
|
|
368
362
|
- Registry lookup: "researcher!market-analysis" exists
|
|
369
|
-
- Resume existing
|
|
363
|
+
- Resume existing sideDialog
|
|
370
364
|
- orchestrator suspends
|
|
371
|
-
- Drive existing researcher
|
|
365
|
+
- Drive existing researcher sideDialog from where it left off
|
|
372
366
|
- Response flows back to orchestrator
|
|
373
367
|
- orchestrator resumes
|
|
374
368
|
```
|
|
375
369
|
|
|
376
|
-
### TYPE C: Transient
|
|
370
|
+
### TYPE C: Transient SideDialog Tellask (Type C / `Fresh Tellask` / One-shot Tellask)
|
|
377
371
|
|
|
378
|
-
**Syntax**: `tellaskSessionless({ targetAgentId: "<
|
|
372
|
+
**Syntax**: `tellaskSessionless({ targetAgentId: "<nonAskerDialogAgentId>", tellaskContent: "..." })` (NO `sessionSlug`)
|
|
379
373
|
|
|
380
374
|
**Fresh Boots Reasoning (FBR) self-tellask syntax (default; most common)**: `freshBootsReasoning({ tellaskContent: "..." })`
|
|
381
375
|
|
|
382
|
-
- `freshBootsReasoning({ tellaskContent: "..." })` targets the current dialog’s agentId and creates a **new ephemeral
|
|
383
|
-
- The
|
|
376
|
+
- `freshBootsReasoning({ tellaskContent: "..." })` targets the current dialog’s agentId and creates a **new ephemeral sideDialog** routed to the same agentId.
|
|
377
|
+
- The Side Dialog created by `freshBootsReasoning({ tellaskContent: "..." })` is FBR and is driven under a stricter, tool-less policy; see [`fbr.md`](./fbr.md).
|
|
384
378
|
- Use this for most Fresh Boots Reasoning sessions: isolate a single sub-problem, produce an answer, and return.
|
|
385
379
|
|
|
386
380
|
**Behavior**:
|
|
387
381
|
|
|
388
382
|
1. Current dialog **suspends**
|
|
389
|
-
2. Create **NEW
|
|
390
|
-
3. Drive the new
|
|
391
|
-
- For general Type C, the
|
|
383
|
+
2. Create **NEW sideDialog** with the specified agentId
|
|
384
|
+
3. Drive the new sideDialog:
|
|
385
|
+
- For general Type C, the sideDialog is full-fledged (TellaskBack, teammate Tellasks, tools per config).
|
|
392
386
|
- For `freshBootsReasoning({ tellaskContent: "..." })`, runtime applies the FBR tool-less policy (no tools; no Tellasks).
|
|
393
|
-
4.
|
|
394
|
-
5.
|
|
387
|
+
4. SideDialog response flows back to the tellasker
|
|
388
|
+
5. Tellasker **resumes** with sideDialog's response
|
|
395
389
|
|
|
396
390
|
**Key Characteristics**:
|
|
397
391
|
|
|
398
|
-
- **No registry lookup** - always creates a new
|
|
392
|
+
- **No registry lookup** - always creates a new sideDialog
|
|
399
393
|
- **Not registered** - no persistence across Tellasks
|
|
400
394
|
- **No assignment-update channel** - once emitted, it cannot be updated in place like Type B
|
|
401
|
-
- Another `tellaskSessionless` creates **another new transient
|
|
395
|
+
- Another `tellaskSessionless` creates **another new transient sideDialog**; it does not update, stop, or tell the earlier Type C Side Dialog to stop
|
|
402
396
|
- If later correction, scope change, or earlier wrap-up may be needed, choose Type B `tellask` with `sessionSlug` from the start
|
|
403
|
-
- The
|
|
397
|
+
- The sideDialog itself is fully capable **except** for `freshBootsReasoning({ tellaskContent: "..." })` FBR, which is tool-less and tellask-free (see `fbr.md`).
|
|
404
398
|
- Only difference from TYPE B: no registry lookup/resume capability
|
|
405
399
|
- Used for one-off, independent tasks
|
|
406
400
|
|
|
@@ -413,8 +407,8 @@ LLM emits: @code-reviewer Please review this PR
|
|
|
413
407
|
|
|
414
408
|
Result:
|
|
415
409
|
- orchestrator suspends
|
|
416
|
-
- Create NEW
|
|
417
|
-
- Drive the code-reviewer
|
|
410
|
+
- Create NEW sideDialog with agentId "code-reviewer"
|
|
411
|
+
- Drive the code-reviewer sideDialog (it can make its own Tellasks, tools, etc.)
|
|
418
412
|
- code-reviewer completes with review findings
|
|
419
413
|
- orchestrator resumes with review in context
|
|
420
414
|
|
|
@@ -422,23 +416,23 @@ LLM emits again: @code-reviewer Review this other PR
|
|
|
422
416
|
|
|
423
417
|
Result:
|
|
424
418
|
- orchestrator suspends
|
|
425
|
-
- Create ANOTHER NEW
|
|
426
|
-
- Drive the new code-reviewer
|
|
419
|
+
- Create ANOTHER NEW sideDialog (not the same as before!)
|
|
420
|
+
- Drive the new code-reviewer sideDialog
|
|
427
421
|
- orchestrator resumes with new review in context
|
|
428
422
|
```
|
|
429
423
|
|
|
430
424
|
### Comparison Summary
|
|
431
425
|
|
|
432
|
-
| Aspect
|
|
433
|
-
|
|
|
434
|
-
| **Syntax**
|
|
435
|
-
| **sessionSlug**
|
|
436
|
-
| **Registry Lookup**
|
|
437
|
-
| **Resumption**
|
|
438
|
-
| **Registration**
|
|
439
|
-
| **
|
|
440
|
-
| **
|
|
441
|
-
| **Use Case**
|
|
426
|
+
| Aspect | TYPE A: AskerDialog Tellask (`TellaskBack`) | TYPE B: Registered SideDialog Tellask (`Tellask Session`) | TYPE C: Transient SideDialog Tellask (`Fresh Tellask`) |
|
|
427
|
+
| --------------------------- | -------------------------------------------- | ---------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
|
|
428
|
+
| **Syntax** | `tellaskBack({ tellaskContent: "..." })` | `tellask({ targetAgentId: "<anyAgentId>", sessionSlug: "<id>", tellaskContent: "..." })` | `tellaskSessionless({ targetAgentId: "<nonAskerDialogAgentId>", tellaskContent: "..." })` |
|
|
429
|
+
| **sessionSlug** | Not allowed | Required | Not allowed |
|
|
430
|
+
| **Registry Lookup** | No (uses `sideDialog.askerDialog`) | Yes (`agentId!sessionSlug`) | No (never registered) |
|
|
431
|
+
| **Resumption** | No (askerDialog not a sideDialog) | Yes (lookup finds existing) | No (always new) |
|
|
432
|
+
| **Registration** | Not applicable | Created AND registered | Never registered |
|
|
433
|
+
| **Tellasker Behavior** | SideDialog suspends | Tellasker suspends | Tellasker suspends |
|
|
434
|
+
| **SideDialog Capabilities** | Full (TellaskBack, teammates, tools) | Full (TellaskBack, teammates, tools) | Full (TellaskBack, teammates, tools) |
|
|
435
|
+
| **Use Case** | Clarification from tellasker (`TellaskBack`) | Resume persistent subtask (`Tellask Session`) | One-off independent task (`Fresh Tellask`) |
|
|
442
436
|
|
|
443
437
|
---
|
|
444
438
|
|
|
@@ -448,7 +442,7 @@ The Dominds dialog system is built on four interconnected core mechanisms that w
|
|
|
448
442
|
|
|
449
443
|
```mermaid
|
|
450
444
|
flowchart TD
|
|
451
|
-
H[Dialog
|
|
445
|
+
H[Dialog relationship<br/>(main ↔ sideDialogs)] <--> S[SideDialog supply<br/>(responses, pending list, registry)]
|
|
452
446
|
H --> Q["Q4H (askHuman(...))<br/>(q4h.yaml index)"]
|
|
453
447
|
S --> Q
|
|
454
448
|
|
|
@@ -458,27 +452,27 @@ flowchart TD
|
|
|
458
452
|
|
|
459
453
|
Clarity[clear_mind] -->|clears| Q
|
|
460
454
|
Clarity -->|preserves| R[Reminders]
|
|
461
|
-
Clarity -->|preserves| Reg[Registry (
|
|
455
|
+
Clarity -->|preserves| Reg[Registry (main only)]
|
|
462
456
|
```
|
|
463
457
|
|
|
464
458
|
### Key Design Principles
|
|
465
459
|
|
|
466
460
|
1. **Q4H Index in `q4h.yaml`**: Q4H questions are indexed in `q4h.yaml` (as an index, not source of truth) and cleared by mental clarity operations. The actual question content is in the dialog's messages where the `askHuman({ tellaskContent: "..." })` Tellask was recorded. They do not survive `clear_mind`.
|
|
467
461
|
|
|
468
|
-
2. **
|
|
462
|
+
2. **Dialog-scoped Q4H**: Any dialog in a Main Dialog / Side Dialog relationship can raise Q4H on its own right. Questions are indexed in the dialog that asked them, not passed upward.
|
|
469
463
|
|
|
470
|
-
3. **
|
|
464
|
+
3. **SideDialog Q4H Autonomy**: SideDialogs can ask Q4H questions directly, not as a proxy for tellasker. User navigates to the sideDialog to answer inline.
|
|
471
465
|
|
|
472
466
|
4. **UI Renders Q4H Like Teammate Tellasks**: The UI treats Q4H similarly to other teammate Tellasks - with navigation linking to the Tellask site in the dialog. The user answers inline using the same input textarea used for regular messages.
|
|
473
467
|
|
|
474
|
-
5. **
|
|
468
|
+
5. **SideDialog Response Supply**: SideDialogs write their responses to the _current tellasker’s_ context via persistence (not callbacks). For TYPE B, each Tellask updates the sideDialog’s `assignmentFromAsker` with the latest tellasker + tellaskInfo, so the response is routed to the most recent tellasker (main dialog or sideDialog). This enables detached operation, reuse, and crash recovery.
|
|
475
469
|
|
|
476
|
-
6. **
|
|
470
|
+
6. **SideDialog Registry**: Registered sideDialogs (TYPE B Tellasks) are tracked in a main-dialog-scoped registry. The registry persists across `clear_mind` operations and is rebuilt on main dialog load.
|
|
477
471
|
|
|
478
472
|
7. **State Preservation Contract**:
|
|
479
473
|
- `clear_mind`: Clears messages, clears Q4H index, preserves reminders, preserves registry
|
|
480
|
-
-
|
|
481
|
-
-
|
|
474
|
+
- SideDialog completion: Writes response to the current tellasker, removes from pending list (registry unchanged)
|
|
475
|
+
- SideDialog declared dead: marks runState dead and removes its Type B registry entry; same slug can be reused as a fresh Side Dialog
|
|
482
476
|
- Q4H answer: Clears the answered question from index, continues the dialog
|
|
483
477
|
|
|
484
478
|
---
|
|
@@ -487,7 +481,7 @@ flowchart TD
|
|
|
487
481
|
|
|
488
482
|
### Overview
|
|
489
483
|
|
|
490
|
-
Q4H (Questions for Human) is the mechanism by which dialogs can suspend execution and request human input. It is a core, integral mechanism that works seamlessly with
|
|
484
|
+
Q4H (Questions for Human) is the mechanism by which dialogs can suspend execution and request human input. It is a core, integral mechanism that works seamlessly with sideDialogs, reminders, and mental clarity tools.
|
|
491
485
|
|
|
492
486
|
### Q4H Data Structure
|
|
493
487
|
|
|
@@ -514,7 +508,7 @@ interface HumanQuestion {
|
|
|
514
508
|
|
|
515
509
|
```mermaid
|
|
516
510
|
sequenceDiagram
|
|
517
|
-
participant D as Dialog (
|
|
511
|
+
participant D as Dialog (main dialog or sideDialog)
|
|
518
512
|
participant P as Persistence (q4h.yaml)
|
|
519
513
|
participant UI as Frontend UI
|
|
520
514
|
participant WS as WebSocket handler
|
|
@@ -532,7 +526,7 @@ sequenceDiagram
|
|
|
532
526
|
|
|
533
527
|
### When Does a Dialog Raise Q4H?
|
|
534
528
|
|
|
535
|
-
Q4H is raised when the `askHuman({ tellaskContent: "..." })` tellask function is invoked by ANY dialog (
|
|
529
|
+
Q4H is raised when the `askHuman({ tellaskContent: "..." })` tellask function is invoked by ANY dialog (main dialog or sideDialog) on its own right:
|
|
536
530
|
|
|
537
531
|
```typescript
|
|
538
532
|
// From main/llm/kernel-driver/tellask-special.ts
|
|
@@ -646,34 +640,34 @@ interface DriveDialogByUserAnswerRequest {
|
|
|
646
640
|
| Backend Action | Just drive dialog | Clear q4h.yaml first → drive dialog |
|
|
647
641
|
| Continuation Type | N/A | `'answer'` |
|
|
648
642
|
|
|
649
|
-
###
|
|
643
|
+
### SideDialog Q4H Handling
|
|
650
644
|
|
|
651
645
|
**Key Principles**:
|
|
652
646
|
|
|
653
|
-
1. Q4H is indexed in the dialog that asked it, not passed upward to the
|
|
654
|
-
2.
|
|
655
|
-
3. User navigates to the
|
|
647
|
+
1. Q4H is indexed in the dialog that asked it, not passed upward to the askerDialog
|
|
648
|
+
2. SideDialogs ask Q4H on their own right (not as proxy for tellasker)
|
|
649
|
+
3. User navigates to the sideDialog to answer inline
|
|
656
650
|
4. The `q4h.yaml` file is an index, not source of truth
|
|
657
651
|
|
|
658
652
|
```mermaid
|
|
659
653
|
sequenceDiagram
|
|
660
|
-
participant
|
|
661
|
-
participant
|
|
654
|
+
participant Asker as AskerDialog
|
|
655
|
+
participant Side as SideDialog
|
|
662
656
|
participant UI as Frontend UI
|
|
663
657
|
participant WS as WebSocket handler
|
|
664
658
|
participant Driver as driveDialogStream
|
|
665
659
|
|
|
666
|
-
|
|
667
|
-
Note over
|
|
660
|
+
Asker->>Side: creates sideDialog (Type B or C)
|
|
661
|
+
Note over Asker: AskerDialog is blocked on pending sideDialogs
|
|
668
662
|
|
|
669
|
-
|
|
663
|
+
Side->>WS: emits askHuman({ tellaskContent: "..." }) question
|
|
670
664
|
WS-->>UI: questions_count_update
|
|
671
|
-
Note over
|
|
665
|
+
Note over Side: SideDialog cannot proceed until answered
|
|
672
666
|
|
|
673
|
-
UI->>WS: drive_dialog_by_user_answer(dialog=
|
|
674
|
-
WS->>Driver: driveDialogStream(
|
|
675
|
-
Driver-->>
|
|
676
|
-
|
|
667
|
+
UI->>WS: drive_dialog_by_user_answer(dialog=sideDialogId, questionId, content)
|
|
668
|
+
WS->>Driver: driveDialogStream(sideDialog, human answer)
|
|
669
|
+
Driver-->>Side: sideDialog resumes
|
|
670
|
+
Side-->>Asker: response supplied (clears pending-sideDialogs)
|
|
677
671
|
```
|
|
678
672
|
|
|
679
673
|
### Q4H and Mental Clarity Operations
|
|
@@ -688,20 +682,20 @@ flowchart LR
|
|
|
688
682
|
|
|
689
683
|
---
|
|
690
684
|
|
|
691
|
-
## Dialog
|
|
685
|
+
## Dialog Relationship & SideDialogs
|
|
692
686
|
|
|
693
|
-
###
|
|
687
|
+
### Relationship Overview
|
|
694
688
|
|
|
695
689
|
```mermaid
|
|
696
690
|
flowchart TD
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
691
|
+
Main[Main dialog] --> S1[SideDialog sub-001]
|
|
692
|
+
Main --> S2[SideDialog sub-002]
|
|
693
|
+
Main --> S3[SideDialog sub-003]
|
|
700
694
|
|
|
701
|
-
S1 --> N1[Nested
|
|
695
|
+
S1 --> N1[Nested sideDialog sub-001-001]
|
|
702
696
|
|
|
703
|
-
|
|
704
|
-
|
|
697
|
+
Main -.-> Reg["registry.yaml<br/>(main-scoped, Type B only)"]
|
|
698
|
+
Main -.-> QRoot[q4h.yaml (root)]
|
|
705
699
|
S1 -.-> QS1[q4h.yaml (sub-001)]
|
|
706
700
|
N1 -.-> QN1[q4h.yaml (sub-001-001)]
|
|
707
701
|
```
|
|
@@ -713,55 +707,57 @@ flowchart TD
|
|
|
713
707
|
- `.dialogs/run/<root-id>/reminders.json`
|
|
714
708
|
- `.dialogs/run/<root-id>/q4h.yaml`
|
|
715
709
|
- `.dialogs/run/<root-id>/course-001.jsonl` (and further courses)
|
|
716
|
-
- `.dialogs/run/<root-id>/
|
|
717
|
-
- `.dialogs/run/<root-id>/
|
|
718
|
-
- `.dialogs/run/<root-id>/registry.yaml` (
|
|
710
|
+
- `.dialogs/run/<root-id>/sideDialogs/<sub-id>/dialog.yaml`
|
|
711
|
+
- `.dialogs/run/<root-id>/sideDialogs/<sub-id>/q4h.yaml`
|
|
712
|
+
- `.dialogs/run/<root-id>/registry.yaml` (main only; Type B registry)
|
|
719
713
|
|
|
720
|
-
###
|
|
714
|
+
### SideDialog Response Supply Mechanism
|
|
721
715
|
|
|
722
|
-
**Core Principle**:
|
|
716
|
+
**Core Principle**: SideDialogs supply responses to the **current tellasker's** context via persistence, not callbacks (the tellasker is the direct askerDialog for TYPE A; for TYPE B/C it may be a different dialog).
|
|
723
717
|
|
|
724
718
|
```mermaid
|
|
725
719
|
sequenceDiagram
|
|
726
|
-
participant
|
|
720
|
+
participant Asker as Tellasker
|
|
727
721
|
participant Driver as Backend driver
|
|
728
|
-
participant
|
|
722
|
+
participant Side as SideDialog
|
|
729
723
|
participant Store as Persistence
|
|
730
724
|
|
|
731
|
-
|
|
732
|
-
Driver->>
|
|
733
|
-
|
|
734
|
-
Driver-->>
|
|
735
|
-
opt
|
|
736
|
-
Driver-->>
|
|
725
|
+
Asker->>Driver: create sideDialog (adds to pending list)
|
|
726
|
+
Driver->>Side: drive sideDialog (detached execution)
|
|
727
|
+
Side-->>Store: persist final response
|
|
728
|
+
Driver-->>Asker: supply response + clear pending-sideDialogs
|
|
729
|
+
opt Asker is root and now unblocked
|
|
730
|
+
Driver-->>Asker: set needsDrive=true (auto-revive)
|
|
737
731
|
end
|
|
738
732
|
```
|
|
739
733
|
|
|
740
|
-
###
|
|
734
|
+
### SideDialog Q4H and AskerDialog Revival
|
|
741
735
|
|
|
742
|
-
When a
|
|
736
|
+
When a sideDialog has raised Q4H and is waiting for human input, the askerDialog's auto-revival logic must handle this:
|
|
743
737
|
|
|
744
738
|
```typescript
|
|
745
|
-
//
|
|
746
|
-
async function
|
|
747
|
-
const pending = await
|
|
739
|
+
// AskerDialog checks sideDialog completion status
|
|
740
|
+
async function checkSideDialogRevival(askerDialog: Dialog): Promise<void> {
|
|
741
|
+
const pending = await loadPendingSideDialogs(askerDialog.id);
|
|
748
742
|
|
|
749
743
|
for (const p of pending) {
|
|
750
|
-
// Check if
|
|
751
|
-
const
|
|
744
|
+
// Check if sideDialog has unresolved Q4H
|
|
745
|
+
const sideDialogQ4H = await DialogPersistence.loadQuestions4HumanState(p.sideDialogId);
|
|
752
746
|
|
|
753
|
-
if (
|
|
754
|
-
//
|
|
747
|
+
if (sideDialogQ4H.length > 0) {
|
|
748
|
+
// SideDialog is waiting for human input
|
|
755
749
|
// Do NOT auto-revive - wait for human to answer Q4H
|
|
756
|
-
log.debug(
|
|
750
|
+
log.debug(
|
|
751
|
+
`SideDialog ${p.sideDialogId} has ${sideDialogQ4H.length} Q4H, skipping auto-revive`,
|
|
752
|
+
);
|
|
757
753
|
continue;
|
|
758
754
|
}
|
|
759
755
|
|
|
760
|
-
//
|
|
761
|
-
const isDone = await
|
|
756
|
+
// SideDialog has no Q4H, check if it's done
|
|
757
|
+
const isDone = await isSideDialogCompleted(p.sideDialogId);
|
|
762
758
|
if (isDone) {
|
|
763
759
|
// Incorporate response and auto-revive
|
|
764
|
-
await
|
|
760
|
+
await incorporateSideDialogResponse(askerDialog, p.sideDialogId);
|
|
765
761
|
}
|
|
766
762
|
}
|
|
767
763
|
}
|
|
@@ -798,22 +794,22 @@ Invoke the function tool `clear_mind` with:
|
|
|
798
794
|
- Clears all dialog messages in the current dialog
|
|
799
795
|
- Preserves all reminders
|
|
800
796
|
- **Clears all Q4H questions** (critical!)
|
|
801
|
-
- Preserves
|
|
802
|
-
- Has no effect on
|
|
797
|
+
- Preserves sideDialog registry (main dialog only)
|
|
798
|
+
- Has no effect on askerDialog
|
|
803
799
|
- Redirects attention to Taskdoc
|
|
804
800
|
- A system-generated new-course prompt is queued and used as the **first `role=user` message** in the new dialog course
|
|
805
801
|
- Starts a new dialog course
|
|
806
802
|
|
|
807
803
|
**Multi-course dialog note**:
|
|
808
804
|
|
|
809
|
-
- The first course is created naturally when a main dialog or
|
|
810
|
-
- Later courses are started by the
|
|
805
|
+
- The first course is created naturally when a main dialog or sideDialog is created.
|
|
806
|
+
- Later courses are started by the Dialog Responder via `clear_mind`.
|
|
811
807
|
- Exception: the system may auto-start a new course as remediation (e.g., context health becomes critical).
|
|
812
808
|
|
|
813
809
|
**Implementation Notes**:
|
|
814
810
|
|
|
815
811
|
- Operation is scoped to the current dialog only
|
|
816
|
-
-
|
|
812
|
+
- SideDialogs are not affected by tellasker's `clear_mind`
|
|
817
813
|
- Taskdoc remains unchanged and accessible
|
|
818
814
|
- Reminders provide continuity across the clarity operation
|
|
819
815
|
|
|
@@ -839,12 +835,12 @@ Invoke the function tool `change_mind` with:
|
|
|
839
835
|
- The updated file immediately becomes available to all dialogs referencing it
|
|
840
836
|
- **Does not start a new dialog course.** If starting a new dialog course is desired, use `clear_mind` separately.
|
|
841
837
|
- Does not clear messages, reminders, Q4H, or registry by itself
|
|
842
|
-
- Affects all participant agents (main and
|
|
838
|
+
- Affects all participant agents (main and sideDialogs) referencing the same Taskdoc
|
|
843
839
|
- Use `progress` for key decisions/status/next steps; use `constraints` for hard rules (don’t leave them only in chat/reminders).
|
|
844
840
|
|
|
845
841
|
**Implementation Notes**:
|
|
846
842
|
|
|
847
|
-
- `change_mind` is only available in
|
|
843
|
+
- `change_mind` is only available in main dialogs (not sideDialogs); sideDialogs must ask the tellasker via a TellaskBack (`tellaskBack({ tellaskContent: "..." })`) to update the shared Taskdoc.
|
|
848
844
|
- For `*.tsk/` Taskdoc packages, the Taskdoc is encapsulated: general file tools must not read/write/list/delete anything under `*.tsk/`. See [`encapsulated-taskdoc.md`](./encapsulated-taskdoc.md).
|
|
849
845
|
|
|
850
846
|
---
|
|
@@ -873,22 +869,22 @@ Invoke the function tool `change_mind` with:
|
|
|
873
869
|
|
|
874
870
|
---
|
|
875
871
|
|
|
876
|
-
##
|
|
872
|
+
## SideDialog Registry
|
|
877
873
|
|
|
878
874
|
### Overview
|
|
879
875
|
|
|
880
|
-
The **
|
|
876
|
+
The **sideDialog registry** is a main-dialog-scoped data structure that maintains persistent references to registered sideDialogs created via TYPE B (Registered SideDialog Tellask / `Tellask Session`) teammate Tellasks.
|
|
881
877
|
|
|
882
878
|
### Key Characteristics
|
|
883
879
|
|
|
884
|
-
| Aspect | Description
|
|
885
|
-
| --------------- |
|
|
886
|
-
| **Scope** |
|
|
887
|
-
| **Key Format** | `agentId!sessionSlug` (single-level Map)
|
|
888
|
-
| **Storage** | `registry.yaml` in
|
|
889
|
-
| **Lifecycle** | Retained during normal runs; dead
|
|
890
|
-
| **Persistence** | Moves with root to `done/` when
|
|
891
|
-
| **Restoration** | Rebuilt on
|
|
880
|
+
| Aspect | Description |
|
|
881
|
+
| --------------- | ---------------------------------------------------------------- |
|
|
882
|
+
| **Scope** | Main dialog only (not accessible to sideDialogs) |
|
|
883
|
+
| **Key Format** | `agentId!sessionSlug` (single-level Map) |
|
|
884
|
+
| **Storage** | `registry.yaml` in main dialog directory |
|
|
885
|
+
| **Lifecycle** | Retained during normal runs; dead sideDialog entries are removed |
|
|
886
|
+
| **Persistence** | Moves with root to `done/` when main dialog completes |
|
|
887
|
+
| **Restoration** | Rebuilt on main dialog load by scanning done/ sideDialog YAMLs |
|
|
892
888
|
|
|
893
889
|
### Registry Operations
|
|
894
890
|
|
|
@@ -896,7 +892,7 @@ Example `registry.yaml` (conceptual):
|
|
|
896
892
|
|
|
897
893
|
```yaml
|
|
898
894
|
researcher!market-analysis:
|
|
899
|
-
|
|
895
|
+
sideDialogId: uuid-123
|
|
900
896
|
agentId: researcher
|
|
901
897
|
tellaskSession: market-analysis
|
|
902
898
|
createdAt: 2025-12-27T10:00:00Z
|
|
@@ -907,43 +903,43 @@ researcher!market-analysis:
|
|
|
907
903
|
flowchart TD
|
|
908
904
|
Tellask["TYPE B Tellask: tellask(..., sessionSlug=...)"] --> Key[Compute key: agentId!sessionSlug]
|
|
909
905
|
Key --> Lookup{Registry hit?}
|
|
910
|
-
Lookup -- yes --> Resume[Restore + drive existing
|
|
911
|
-
Lookup -- no --> Create[Create + register + drive new
|
|
912
|
-
Resume --> Supply[Supply response to
|
|
906
|
+
Lookup -- yes --> Resume[Restore + drive existing sideDialog]
|
|
907
|
+
Lookup -- no --> Create[Create + register + drive new sideDialog]
|
|
908
|
+
Resume --> Supply[Supply response to tellasker]
|
|
913
909
|
Create --> Supply
|
|
914
910
|
```
|
|
915
911
|
|
|
916
|
-
### Class Design:
|
|
912
|
+
### Class Design: MainDialog vs SideDialog
|
|
917
913
|
|
|
918
|
-
**Critical Design Principle**: The
|
|
914
|
+
**Critical Design Principle**: The sideDialog registry is managed exclusively by `MainDialog` and is **not accessible** to `SideDialog` instances.
|
|
919
915
|
|
|
920
916
|
**Responsibilities:**
|
|
921
917
|
|
|
922
|
-
- `
|
|
923
|
-
- Owns the TYPE B
|
|
924
|
-
- Creates/registers/looks up registered
|
|
925
|
-
- `
|
|
926
|
-
- Has a `
|
|
927
|
-
- Cannot access or mutate the
|
|
918
|
+
- `MainDialog`
|
|
919
|
+
- Owns the TYPE B sideDialog registry (`registry.yaml`)
|
|
920
|
+
- Creates/registers/looks up registered sideDialogs (`agentId!sessionSlug`)
|
|
921
|
+
- `SideDialog`
|
|
922
|
+
- Has a `askerDialog` reference (direct askerDialog) and uses it for TYPE A (`tellaskBack({ tellaskContent: "..." })`)
|
|
923
|
+
- Cannot access or mutate the main dialog registry (by design)
|
|
928
924
|
|
|
929
925
|
**Mutex Semantics**:
|
|
930
926
|
|
|
931
|
-
- `locked: true` →
|
|
932
|
-
- `locked: false` → Entry exists but
|
|
927
|
+
- `locked: true` → SideDialog is currently being driven (mutex held)
|
|
928
|
+
- `locked: false` → Entry exists but sideDialog is not locked (can resume)
|
|
933
929
|
- Registry does NOT track: 'active' | 'completed' | 'suspended' lifecycle states
|
|
934
930
|
|
|
935
|
-
**Design Principle**: The registry tracks "locked" (being driven) vs "unlocked" (can resume) state. It does NOT track dialog lifecycle states (active/completed/suspended). Those are Dialog concerns, not Registry concerns. A registered
|
|
931
|
+
**Design Principle**: The registry tracks "locked" (being driven) vs "unlocked" (can resume) state. It does NOT track dialog lifecycle states (active/completed/suspended). Those are Dialog concerns, not Registry concerns. A registered sideDialog may be unlocked (not currently being driven) but still exist as a completed or suspended dialog.
|
|
936
932
|
|
|
937
933
|
### Registry Persistence
|
|
938
934
|
|
|
939
|
-
**File Location**: `<
|
|
935
|
+
**File Location**: `<main-dialog-path>/registry.yaml`
|
|
940
936
|
|
|
941
937
|
**Format**:
|
|
942
938
|
|
|
943
939
|
```typescript
|
|
944
|
-
interface
|
|
940
|
+
interface SideDialogRegistry {
|
|
945
941
|
[key: string]: {
|
|
946
|
-
|
|
942
|
+
sideDialogId: string; // UUID of the sideDialog
|
|
947
943
|
agentId: string; // Agent identifier
|
|
948
944
|
tellaskSession: string; // Tellask session key
|
|
949
945
|
createdAt: string; // ISO timestamp
|
|
@@ -958,8 +954,8 @@ interface SubdialogRegistry {
|
|
|
958
954
|
1. **On Registration**: New entry added to registry, file saved
|
|
959
955
|
2. **On Resume**: `lastAccessed` updated, file saved
|
|
960
956
|
3. **On Clear Mind**: Registry preserved (not cleared)
|
|
961
|
-
4. **On
|
|
962
|
-
5. **On
|
|
957
|
+
4. **On Main Completion**: Registry moves with root to `done/`
|
|
958
|
+
5. **On Main Load**: Registry rebuilt from done/ sideDialog YAMLs
|
|
963
959
|
|
|
964
960
|
---
|
|
965
961
|
|
|
@@ -971,17 +967,17 @@ The complete Dialog class implementation with all methods, properties, and detai
|
|
|
971
967
|
|
|
972
968
|
**Key Components**:
|
|
973
969
|
|
|
974
|
-
- **
|
|
970
|
+
- **Dialog Relationship Support**: Tellask/response relationships for sideDialog management
|
|
975
971
|
- **Memory Management**: Persistent reminders and ephemeral dialog messages
|
|
976
972
|
- **Mental Clarity Operations**: `startNewCourse(newCoursePrompt)` method (clears messages, clears Q4H, increments course, queues new course prompt for the next drive)
|
|
977
|
-
- **
|
|
973
|
+
- **SideDialog Management**: Creation and coordination of specialized subtasks
|
|
978
974
|
- **Q4H Management**: `updateQuestions4Human()` method for question tracking
|
|
979
975
|
- **Memory Access**: Integration with Taskdocs and team/agent memories
|
|
980
|
-
- **Registry Management** (
|
|
976
|
+
- **Registry Management** (MainDialog only): Registration and lookup of sideDialogs
|
|
981
977
|
|
|
982
978
|
### Main Dialog Resolution
|
|
983
979
|
|
|
984
|
-
For
|
|
980
|
+
For sideDialogs needing to communicate with the Main Dialog, see the implementation in `dominds/main/dialog.ts` which provides methods for resolving dialog relationships.
|
|
985
981
|
|
|
986
982
|
### Persistence Layer
|
|
987
983
|
|
|
@@ -991,7 +987,7 @@ The persistence layer handles:
|
|
|
991
987
|
- **Q4H Storage**: `q4h.yaml` per dialog (cleared by clear_mind)
|
|
992
988
|
- **Reminder Storage**: `reminders.json` per dialog
|
|
993
989
|
- **Event Persistence**: Course-based JSONL files
|
|
994
|
-
- **Registry Storage**: `registry.yaml` per
|
|
990
|
+
- **Registry Storage**: `registry.yaml` per main dialog
|
|
995
991
|
|
|
996
992
|
**Q4H Persistence Methods**:
|
|
997
993
|
|
|
@@ -1014,13 +1010,13 @@ static async clearQuestions4HumanState(
|
|
|
1014
1010
|
**Registry Persistence Methods**:
|
|
1015
1011
|
|
|
1016
1012
|
```typescript
|
|
1017
|
-
// In
|
|
1013
|
+
// In MainDialog (dialog.ts)
|
|
1018
1014
|
interface RegistryMethods {
|
|
1019
|
-
loadRegistry(): Promise<
|
|
1020
|
-
saveRegistry(registry:
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
getRegistry():
|
|
1015
|
+
loadRegistry(): Promise<SideDialogRegistry>;
|
|
1016
|
+
saveRegistry(registry: SideDialogRegistry): Promise<void>;
|
|
1017
|
+
registerSideDialog(key: string, metadata: SideDialogMetadata): void;
|
|
1018
|
+
lookupSideDialog(key: string): SideDialogMetadata | undefined;
|
|
1019
|
+
getRegistry(): SideDialogRegistry;
|
|
1024
1020
|
}
|
|
1025
1021
|
```
|
|
1026
1022
|
|
|
@@ -1028,66 +1024,66 @@ interface RegistryMethods {
|
|
|
1028
1024
|
|
|
1029
1025
|
## Dialog Management
|
|
1030
1026
|
|
|
1031
|
-
###
|
|
1027
|
+
### Dialog Relationship Management
|
|
1032
1028
|
|
|
1033
|
-
**Creation**:
|
|
1029
|
+
**Creation**: SideDialogs are created when agents need to delegate specialized tasks or when complex problems require decomposition.
|
|
1034
1030
|
|
|
1035
|
-
**Context Inheritance**: New
|
|
1031
|
+
**Context Inheritance**: New sideDialogs automatically receive:
|
|
1036
1032
|
|
|
1037
1033
|
- Reference to the same rtws (runtime workspace) Taskdoc (recommended: `tasks/feature-auth.tsk/`); `dlg.taskDocPath` is fixed at dialog creation and never reassigned
|
|
1038
|
-
- Tellasker
|
|
1034
|
+
- Tellasker-provided context (mentionList + tellaskContent) explaining their purpose
|
|
1039
1035
|
- Access to shared team memories
|
|
1040
1036
|
- Access to their agent's individual memories
|
|
1041
1037
|
|
|
1042
|
-
###
|
|
1038
|
+
### SideDialog course header (required)
|
|
1043
1039
|
|
|
1044
|
-
At the start of every
|
|
1040
|
+
At the start of every sideDialog course, the runtime must prepend a role header to the assignment prompt:
|
|
1045
1041
|
|
|
1046
|
-
- EN: `You are the
|
|
1042
|
+
- EN: `You are the Dialog Responder for this dialog; the tellasker is @xxx (current tellasker).`
|
|
1047
1043
|
- Chinese variant: see [the Chinese doc](./dialog-system.zh.md) for the corresponding work-language header.
|
|
1048
1044
|
|
|
1049
|
-
**FBR special handling**: FBR is a self-
|
|
1045
|
+
**FBR special handling**: FBR is a self-sideDialog and must keep a dedicated header to avoid confusion:
|
|
1050
1046
|
|
|
1051
|
-
- EN (example): `This is an FBR
|
|
1047
|
+
- EN (example): `This is an FBR Side Dialog; the tellasker is @xxx (may be the same agent).`
|
|
1052
1048
|
- Chinese variant example: see [the Chinese doc](./dialog-system.zh.md) for the corresponding FBR header example.
|
|
1053
1049
|
|
|
1054
|
-
**Insertion point**: prefer a single insertion point by updating `
|
|
1050
|
+
**Insertion point**: prefer a single insertion point by updating `formatAssignmentFromAskerDialog()` (covers `dialog.ts`, `tellask-bridge`).
|
|
1055
1051
|
There is no separate frontend twin anymore; [`main/runtime/inter-dialog-format.ts`](../main/runtime/inter-dialog-format.ts) is the authoritative formatter.
|
|
1056
1052
|
|
|
1057
|
-
**Storage**: All
|
|
1053
|
+
**Storage**: All sideDialogs are stored flat under the main dialog's `sideDialogs/` directory, regardless of nesting depth.
|
|
1058
1054
|
|
|
1059
|
-
**Navigation**: Each
|
|
1055
|
+
**Navigation**: Each sideDialog maintains a reference to its askerDialog, enabling traversal toward the main dialog.
|
|
1060
1056
|
|
|
1061
|
-
**Registry**: Registered
|
|
1057
|
+
**Registry**: Registered sideDialogs (TYPE B Tellasks) are tracked in the main dialog's registry and persist across restarts.
|
|
1062
1058
|
|
|
1063
|
-
###
|
|
1059
|
+
### Main dialog fork
|
|
1064
1060
|
|
|
1065
|
-
An entire
|
|
1061
|
+
An entire main dialog tree can be forked at the start of a chosen root generation into a brand-new main dialog. This is used to preserve prior context while re-running the later Main Dialog/Side Dialog path from a historical branch point.
|
|
1066
1062
|
|
|
1067
1063
|
**Entry points**:
|
|
1068
1064
|
|
|
1069
|
-
- UI shows `Fork dialog` only on generation bubbles of a
|
|
1065
|
+
- UI shows `Fork dialog` only on generation bubbles of a main dialog (`selfId === rootId`)
|
|
1070
1066
|
- Backend API: `POST /api/dialogs/:rootId/fork`
|
|
1071
1067
|
- Request body: `{ course, genseq, status? }`
|
|
1072
1068
|
|
|
1073
1069
|
**Semantics (required)**:
|
|
1074
1070
|
|
|
1075
|
-
- The selected generation bubble is **not** copied into the forked
|
|
1076
|
-
- The copy scope is the **entire
|
|
1077
|
-
- A
|
|
1078
|
-
-
|
|
1071
|
+
- The selected generation bubble is **not** copied into the forked main dialog; the fork point means "branch immediately before this generation starts"
|
|
1072
|
+
- The copy scope is the **entire main dialog tree**, not just one dialog
|
|
1073
|
+
- A sideDialog is included only if the root had already persisted it as created before the cutoff
|
|
1074
|
+
- SideDialog transcript retention is bounded by the root-generation anchor, not by the sideDialog's local `genseq`
|
|
1079
1075
|
|
|
1080
1076
|
**Post-fork actions** (returned by backend to UI):
|
|
1081
1077
|
|
|
1082
1078
|
- `draft_user_text`: if the target generation is a user message, prefill that text into the new dialog input and wait for user confirmation
|
|
1083
|
-
- `restore_pending`: if there were pending Q4H or pending
|
|
1084
|
-
- `auto_continue`: if there is no pending blocker before the cutoff, initialize the new
|
|
1079
|
+
- `restore_pending`: if there were pending Q4H or pending sideDialogs before the cutoff, restore those blocking states in the new main dialog
|
|
1080
|
+
- `auto_continue`: if there is no pending blocker before the cutoff, initialize the new main dialog as `interrupted(system_stop: fork_dialog_continue)` and have UI immediately send `resume_dialog`
|
|
1085
1081
|
|
|
1086
1082
|
**Consistency requirements**:
|
|
1087
1083
|
|
|
1088
1084
|
- Fork must preserve the same Taskdoc reference
|
|
1089
|
-
- The forked
|
|
1090
|
-
- Frontend must not expose this entry for
|
|
1085
|
+
- The forked main dialog and all forked sideDialogs are persisted under `running/` with a new rootId
|
|
1086
|
+
- Frontend must not expose this entry for Side Dialogs; current implementation supports main dialogs only
|
|
1091
1087
|
|
|
1092
1088
|
### Lifecycle Management
|
|
1093
1089
|
|
|
@@ -1097,28 +1093,28 @@ An entire root dialog tree can be forked at the start of a chosen root generatio
|
|
|
1097
1093
|
|
|
1098
1094
|
- Tasks are finished successfully
|
|
1099
1095
|
- Agents explicitly mark them complete
|
|
1100
|
-
-
|
|
1101
|
-
- All pending
|
|
1096
|
+
- AskerDialogs determine subtasks are no longer needed
|
|
1097
|
+
- All pending sideDialogs are complete AND all Q4H are answered
|
|
1102
1098
|
|
|
1103
|
-
**Registry on Completion**: When a
|
|
1099
|
+
**Registry on Completion**: When a main dialog completes, its registry moves with it to the `done/` directory and is preserved for potential restoration.
|
|
1104
1100
|
|
|
1105
1101
|
**Cleanup**: Completed dialogs may be archived or cleaned up based on retention policies.
|
|
1106
1102
|
|
|
1107
1103
|
### Communication Patterns
|
|
1108
1104
|
|
|
1109
|
-
**
|
|
1105
|
+
**Tellasker-Bound Communication**: SideDialogs communicate results, questions, and escalations to their **tellasker**.
|
|
1110
1106
|
|
|
1111
|
-
- **Clarification Requests (TYPE A / `TellaskBack`)**: A
|
|
1112
|
-
- **Subtask Response**: When a
|
|
1113
|
-
- **Q4H Escalation**: If a
|
|
1114
|
-
- **Registered
|
|
1115
|
-
- **Transient
|
|
1107
|
+
- **Clarification Requests (TYPE A / `TellaskBack`)**: A sideDialog may Tellask its tellasker to request clarification while working on its subtask. For TYPE A, the tellasker is the direct askerDialog. The tellasker provides guidance, and the sideDialog continues with updated context.
|
|
1108
|
+
- **Subtask Response**: When a sideDialog produces a final "saying" content block (no pending Q4H), that message is treated as the response to the **current tellasker** recorded in `assignmentFromAsker` (main dialog or another sideDialog). This keeps responses aligned with the most recent Tellask site.
|
|
1109
|
+
- **Q4H Escalation**: If a sideDialog has Q4H, it suspends. The user can answer via the UI, which triggers continuation of the sideDialog only.
|
|
1110
|
+
- **Registered SideDialogs (TYPE B / `Tellask Session`)**: A tellasker can resume a previously created registered sideDialog, enabling ongoing task continuation.
|
|
1111
|
+
- **Transient SideDialogs (TYPE C / `Fresh Tellask`)**: A tellasker can spawn a one-off sideDialog for independent tasks that don't require persistence.
|
|
1116
1112
|
|
|
1117
|
-
**
|
|
1113
|
+
**Side-Bound Communication**: AskerDialogs provide context, objectives, and guidance to sideDialogs.
|
|
1118
1114
|
|
|
1119
|
-
**Lateral Communication**: Sibling
|
|
1115
|
+
**Lateral Communication**: Sibling sideDialogs coordinate through their shared askerDialog.
|
|
1120
1116
|
|
|
1121
|
-
**Broadcast Communication**: Main dialog (
|
|
1117
|
+
**Broadcast Communication**: Main dialog (main dialog) can communicate changes (like rtws Taskdoc file updates) to all dialogs through the Taskdoc reference.
|
|
1122
1118
|
|
|
1123
1119
|
---
|
|
1124
1120
|
|
|
@@ -1132,9 +1128,9 @@ An entire root dialog tree can be forked at the start of a chosen root generatio
|
|
|
1132
1128
|
|
|
1133
1129
|
**Q4H Questions**: Transient questions for human input that are **cleared by mental clarity operations**.
|
|
1134
1130
|
|
|
1135
|
-
**
|
|
1131
|
+
**Tellasker Call Context**: Immutable context explaining why a sideDialog was created.
|
|
1136
1132
|
|
|
1137
|
-
**
|
|
1133
|
+
**SideDialog Registry**: Main-dialog-scoped persistent mapping of registered sideDialogs (survives clarity operations).
|
|
1138
1134
|
|
|
1139
1135
|
### rtws-Persistent Memory
|
|
1140
1136
|
|
|
@@ -1150,7 +1146,7 @@ An entire root dialog tree can be forked at the start of a chosen root generatio
|
|
|
1150
1146
|
|
|
1151
1147
|
**Q4H Persistence**: Q4H questions are persisted when created and cleared atomically when answered or when clear_mind is called.
|
|
1152
1148
|
|
|
1153
|
-
**Registry Persistence**: Registry is persisted after each modification and restored on
|
|
1149
|
+
**Registry Persistence**: Registry is persisted after each modification and restored on main dialog load.
|
|
1154
1150
|
|
|
1155
1151
|
---
|
|
1156
1152
|
|
|
@@ -1164,16 +1160,16 @@ An entire root dialog tree can be forked at the start of a chosen root generatio
|
|
|
1164
1160
|
- `<dialog-root>/latest.yaml` — current course tracking and status
|
|
1165
1161
|
- `<dialog-root>/reminders.json` — persistent reminder storage
|
|
1166
1162
|
- `<dialog-root>/q4h.yaml` — Q4H index (cleared by clarity tools)
|
|
1167
|
-
- `<dialog-root>/registry.yaml` —
|
|
1163
|
+
- `<dialog-root>/registry.yaml` — sideDialog registry (main dialogs only)
|
|
1168
1164
|
- `<dialog-root>/course-001.jsonl` (and further courses) — streamed message files
|
|
1169
|
-
- `<dialog-root>/
|
|
1170
|
-
- `<dialog-root>/
|
|
1165
|
+
- `<dialog-root>/sideDialogs/<sideDialog-id>/dialog.yaml`
|
|
1166
|
+
- `<dialog-root>/sideDialogs/<sideDialog-id>/q4h.yaml` — per-sideDialog Q4H index (cleared by clarity)
|
|
1171
1167
|
|
|
1172
1168
|
**Taskdoc Storage**: Taskdocs are rtws artifacts referenced by dialogs through paths. Taskdocs MUST be encapsulated `*.tsk/` Taskdoc packages.
|
|
1173
1169
|
|
|
1174
1170
|
**Memory Storage**: Team and agent memories are stored in dedicated files within the rtws.
|
|
1175
1171
|
|
|
1176
|
-
**Registry Storage**: The
|
|
1172
|
+
**Registry Storage**: The sideDialog registry (`registry.yaml`) is stored in the main dialog directory and moves to `done/` on main dialog completion.
|
|
1177
1173
|
|
|
1178
1174
|
### Streaming Substream Ordering Contract (Thinking / Saying)
|
|
1179
1175
|
|
|
@@ -1192,8 +1188,8 @@ Dominds persists fine-grained message entries (thinking/saying/tool call/tool re
|
|
|
1192
1188
|
- **Ideal target**: Provider SDKs/protocols should natively support `role='environment'` (or an equivalent mechanism) for runtime-injected environment/system content (e.g. reminders, transient guides), so we don't have to disguise environment content as user messages.
|
|
1193
1189
|
- **Current reality**: Most providers do not support `role='environment'`. Therefore, when projecting Dominds messages into provider request payloads, Dominds must flatten internal message kinds into provider-supported roles.
|
|
1194
1190
|
- Runtime/system notices (`environment_msg`) are projected as `role='user'` text blocks.
|
|
1195
|
-
- Self-authored guides
|
|
1196
|
-
-
|
|
1191
|
+
- Self-authored transient guides (`transient_guide_msg`) are projected as `role='assistant'` text blocks.
|
|
1192
|
+
- Default reminder context wrappers are runtime/system notices: Dominds' built-in and fallback wrappers land on the `user` side with an explicit system notice marker (for example `[System notice]`) and second-person wording to the LLM. Custom reminder owners keep responsibility for the role they emit under their own contract. Regardless of that owner-level role choice, the surrounding reminder block is environment-style runtime context rather than a fresh user instruction or an assistant-authored chat turn. Reminder projections should be inserted before the real dialog messages and wrapped in a paired reminder-block header/footer; the footer must scope the warning to the content between that header and footer, so real user instructions elsewhere in dialog history are not accidentally downgraded.
|
|
1197
1193
|
|
|
1198
1194
|
Additionally, some providers (especially Anthropic-compatible endpoints) enforce stricter validation around **role alternation** and **tool_use/tool_result boundaries**. Dominds' projection layer must assemble internal fine-grained entries into provider-friendly turns (turn assembly), rather than sending a 1:1 mapping of persisted entries.
|
|
1199
1195
|
|
|
@@ -1203,19 +1199,19 @@ Additionally, some providers (especially Anthropic-compatible endpoints) enforce
|
|
|
1203
1199
|
|
|
1204
1200
|
**Tool Invocation**: Mental clarity tools are invoked through CLI commands or agent actions.
|
|
1205
1201
|
|
|
1206
|
-
**Status Monitoring**: Dialog status, pending
|
|
1202
|
+
**Status Monitoring**: Dialog status, pending sideDialogs, Q4H count, and registered sideDialogs can be inspected through CLI tools.
|
|
1207
1203
|
|
|
1208
1204
|
### Agent Integration
|
|
1209
1205
|
|
|
1210
|
-
**Autonomous Operation**: Agents can independently create
|
|
1206
|
+
**Autonomous Operation**: Agents can independently create sideDialogs (TYPE B and C), manage reminders, raise Q4H, and trigger clarity operations.
|
|
1211
1207
|
|
|
1212
|
-
**Context Awareness**: Agents have full access to their dialog context, memories,
|
|
1208
|
+
**Context Awareness**: Agents have full access to their dialog context, memories, dialog relationship position, pending Q4H from sideDialogs, and (for main dialogs) the sideDialog registry.
|
|
1213
1209
|
|
|
1214
1210
|
**Teammate Tellask Capability**: Agents can invoke all three types of teammate Tellasks:
|
|
1215
1211
|
|
|
1216
|
-
- TYPE A / `TellaskBack`: Tellask the tellasker
|
|
1217
|
-
- TYPE B / `Tellask Session`: Tellask/resume registered
|
|
1218
|
-
- TYPE C / `Fresh Tellask`: Spawn transient
|
|
1212
|
+
- TYPE A / `TellaskBack`: Tellask the tellasker for clarification (direct askerDialog for TYPE A)
|
|
1213
|
+
- TYPE B / `Tellask Session`: Tellask/resume registered sideDialogs
|
|
1214
|
+
- TYPE C / `Fresh Tellask`: Spawn transient sideDialogs
|
|
1219
1215
|
|
|
1220
1216
|
**Tool Access**: All mental clarity tools, Q4H capability, and teammate Tellask capability are available to agents for autonomous cognitive management.
|
|
1221
1217
|
|
|
@@ -1226,7 +1222,7 @@ driven is derived from persisted facts:
|
|
|
1226
1222
|
|
|
1227
1223
|
- Persisted status (API/index): `running | completed | archived`
|
|
1228
1224
|
- Persisted `latest.yaml`: `status`, `needsDrive`, `generating`
|
|
1229
|
-
- Derived gates: `hasPendingQ4H()` and `
|
|
1225
|
+
- Derived gates: `hasPendingQ4H()` and `hasPendingSideDialogs()`
|
|
1230
1226
|
|
|
1231
1227
|
**Persisted status lifecycle:**
|
|
1232
1228
|
|
|
@@ -1238,13 +1234,13 @@ stateDiagram-v2
|
|
|
1238
1234
|
completed --> archived: archive
|
|
1239
1235
|
```
|
|
1240
1236
|
|
|
1241
|
-
**
|
|
1237
|
+
**Main driver gating (conceptual):**
|
|
1242
1238
|
|
|
1243
1239
|
```mermaid
|
|
1244
1240
|
flowchart TD
|
|
1245
|
-
A[status=running] --> B{canDrive?\\n(no pending Q4H\\n& no pending
|
|
1246
|
-
B -- no --> S[Suspended\\n(waiting on Q4H and/or
|
|
1247
|
-
S -->|Q4H answered\\nor
|
|
1241
|
+
A[status=running] --> B{canDrive?\\n(no pending Q4H\\n& no pending sideDialogs)}
|
|
1242
|
+
B -- no --> S[Suspended\\n(waiting on Q4H and/or sideDialogs)]
|
|
1243
|
+
S -->|Q4H answered\\nor sideDialog responses supplied| C{needsDrive?}
|
|
1248
1244
|
B -- yes --> C{needsDrive?}
|
|
1249
1245
|
C -- no --> I[Idle\\n(waiting for trigger)]
|
|
1250
1246
|
C -- yes --> D[Drive loop\\n(generating=true while streaming)]
|
|
@@ -1262,58 +1258,58 @@ rendered in different markdown viewers.
|
|
|
1262
1258
|
|
|
1263
1259
|
```mermaid
|
|
1264
1260
|
sequenceDiagram
|
|
1265
|
-
participant
|
|
1261
|
+
participant Side as SideDialog
|
|
1266
1262
|
participant Driver as Backend driver
|
|
1267
|
-
participant
|
|
1263
|
+
participant Asker as Tellasker (direct askerDialog)
|
|
1268
1264
|
|
|
1269
|
-
|
|
1270
|
-
Driver->>
|
|
1271
|
-
|
|
1272
|
-
Driver-->>
|
|
1265
|
+
Side->>Driver: emits `tellaskBack({ tellaskContent: "..." })` + question
|
|
1266
|
+
Driver->>Asker: drive tellasker to answer
|
|
1267
|
+
Asker-->>Driver: response text
|
|
1268
|
+
Driver-->>Side: resume sideDialog with response in context
|
|
1273
1269
|
```
|
|
1274
1270
|
|
|
1275
|
-
#### TYPE B: Registered
|
|
1271
|
+
#### TYPE B: Registered SideDialog Tellask (`Tellask Session`) (`tellask({ targetAgentId: "agentId", sessionSlug: "tellaskSession", tellaskContent: "..." })`)
|
|
1276
1272
|
|
|
1277
1273
|
```mermaid
|
|
1278
1274
|
sequenceDiagram
|
|
1279
|
-
participant
|
|
1275
|
+
participant Tellasker as Tellasker
|
|
1280
1276
|
participant Driver as Backend driver
|
|
1281
|
-
participant Reg as
|
|
1282
|
-
participant
|
|
1277
|
+
participant Reg as Main sideDialog registry
|
|
1278
|
+
participant Side as Registered sideDialog
|
|
1283
1279
|
|
|
1284
|
-
|
|
1280
|
+
Tellasker->>Driver: emits `tellask({ targetAgentId: "agentId", sessionSlug: "tellaskSession", tellaskContent: "..." })`
|
|
1285
1281
|
Driver->>Reg: lookup `agentId!sessionSlug`
|
|
1286
1282
|
alt registry hit
|
|
1287
|
-
Reg-->>Driver: existing
|
|
1283
|
+
Reg-->>Driver: existing sideDialog selfId
|
|
1288
1284
|
opt earlier round still waiting
|
|
1289
|
-
Driver-->>
|
|
1290
|
-
Driver->>
|
|
1285
|
+
Driver-->>Tellasker: close earlier waiting round with system-generated business notice
|
|
1286
|
+
Driver->>Side: queue update notice + latest full assignment
|
|
1291
1287
|
end
|
|
1292
|
-
Driver->>
|
|
1288
|
+
Driver->>Side: restore + drive
|
|
1293
1289
|
else registry miss
|
|
1294
1290
|
Reg-->>Driver: none
|
|
1295
|
-
Driver->>
|
|
1291
|
+
Driver->>Side: create + register + drive
|
|
1296
1292
|
end
|
|
1297
|
-
|
|
1298
|
-
Driver-->>
|
|
1299
|
-
opt
|
|
1300
|
-
Driver-->>
|
|
1293
|
+
Side-->>Driver: final response
|
|
1294
|
+
Driver-->>Tellasker: supply response + clear pending-sideDialogs
|
|
1295
|
+
opt Tellasker is the main dialog and now unblocked
|
|
1296
|
+
Driver-->>Tellasker: set `needsDrive=true` (auto-revive scheduling)
|
|
1301
1297
|
end
|
|
1302
1298
|
```
|
|
1303
1299
|
|
|
1304
|
-
#### TYPE C: Transient
|
|
1300
|
+
#### TYPE C: Transient SideDialog Tellask (`Fresh Tellask`) (`tellaskSessionless({ targetAgentId: "agentId", tellaskContent: "..." })`; `freshBootsReasoning({ tellaskContent: "..." })` is FBR tool-less)
|
|
1305
1301
|
|
|
1306
1302
|
```mermaid
|
|
1307
1303
|
sequenceDiagram
|
|
1308
|
-
participant
|
|
1304
|
+
participant Tellasker as Tellasker
|
|
1309
1305
|
participant Driver as Backend driver
|
|
1310
|
-
participant
|
|
1306
|
+
participant Side as Transient sideDialog
|
|
1311
1307
|
|
|
1312
|
-
|
|
1313
|
-
Driver->>
|
|
1314
|
-
Driver->>
|
|
1315
|
-
|
|
1316
|
-
Driver-->>
|
|
1308
|
+
Tellasker->>Driver: emits `tellaskSessionless({ targetAgentId: "agentId", tellaskContent: "..." })`
|
|
1309
|
+
Driver->>Side: create (NOT registered)
|
|
1310
|
+
Driver->>Side: drive
|
|
1311
|
+
Side-->>Driver: final response
|
|
1312
|
+
Driver-->>Tellasker: supply response (no registry update)
|
|
1317
1313
|
```
|
|
1318
1314
|
|
|
1319
1315
|
### Q4H Lifecycle State
|
|
@@ -1333,31 +1329,31 @@ flowchart TD
|
|
|
1333
1329
|
`q4h.yaml` is treated as an index; the source-of-truth “asked question” content lives in the dialog’s
|
|
1334
1330
|
message stream, referenced by `callSiteRef`.
|
|
1335
1331
|
|
|
1336
|
-
###
|
|
1332
|
+
### SideDialog + Q4H Interaction
|
|
1337
1333
|
|
|
1338
1334
|
```mermaid
|
|
1339
1335
|
sequenceDiagram
|
|
1340
|
-
participant
|
|
1341
|
-
participant
|
|
1336
|
+
participant Asker as AskerDialog
|
|
1337
|
+
participant Side as SideDialog
|
|
1342
1338
|
participant UI as Frontend UI
|
|
1343
1339
|
participant WS as WebSocket handler
|
|
1344
1340
|
participant Driver as driveDialogStream
|
|
1345
1341
|
|
|
1346
|
-
|
|
1347
|
-
Note over
|
|
1348
|
-
|
|
1342
|
+
Asker->>Side: create sideDialog (Type B or C)
|
|
1343
|
+
Note over Asker,Side: AskerDialog becomes blocked on pending sideDialogs
|
|
1344
|
+
Side->>WS: emits askHuman({ tellaskContent: "..." }) question (Q4H)
|
|
1349
1345
|
WS-->>UI: questions_count_update (global)
|
|
1350
1346
|
|
|
1351
|
-
Note over
|
|
1347
|
+
Note over Side: SideDialog cannot proceed until answered
|
|
1352
1348
|
|
|
1353
|
-
UI->>WS: drive_dialog_by_user_answer (dialogId=
|
|
1354
|
-
WS->>
|
|
1355
|
-
WS->>Driver: driveDialogStream(
|
|
1356
|
-
Driver-->>
|
|
1357
|
-
|
|
1349
|
+
UI->>WS: drive_dialog_by_user_answer (dialogId=sideDialogId, questionId, content)
|
|
1350
|
+
WS->>Side: clear q4h.yaml entry
|
|
1351
|
+
WS->>Driver: driveDialogStream(sideDialog, user answer)
|
|
1352
|
+
Driver-->>Side: sideDialog resumes and continues
|
|
1353
|
+
Side-->>Asker: sideDialog response supplied to tellasker (clears pending-sideDialogs)
|
|
1358
1354
|
|
|
1359
|
-
opt
|
|
1360
|
-
|
|
1355
|
+
opt Asker is the main dialog and now unblocked
|
|
1356
|
+
Asker-->>Asker: set needsDrive=true (auto-revive)
|
|
1361
1357
|
end
|
|
1362
1358
|
```
|
|
1363
1359
|
|
|
@@ -1386,50 +1382,50 @@ sequenceDiagram
|
|
|
1386
1382
|
Main-->>Main: driveDialogStream(answer)
|
|
1387
1383
|
```
|
|
1388
1384
|
|
|
1389
|
-
### 2.
|
|
1385
|
+
### 2. SideDialog Raises Q4H, User Answers via Main
|
|
1390
1386
|
|
|
1391
1387
|
```mermaid
|
|
1392
1388
|
sequenceDiagram
|
|
1393
1389
|
participant User as User
|
|
1394
|
-
participant
|
|
1395
|
-
participant
|
|
1396
|
-
participant Store as Persistence (
|
|
1390
|
+
participant Asker as AskerDialog (main)
|
|
1391
|
+
participant Side as SideDialog
|
|
1392
|
+
participant Store as Persistence (side/q4h.yaml, side/response.yaml)
|
|
1397
1393
|
participant UI as Frontend
|
|
1398
1394
|
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
User->>UI: select
|
|
1405
|
-
User->>
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1395
|
+
Asker->>Side: createSideDialog()
|
|
1396
|
+
Side->>Store: recordQuestionForHuman()
|
|
1397
|
+
Side-->>UI: questions_count_update (sideDialog)
|
|
1398
|
+
Asker-->>Asker: suspended (waiting on Q4H/sideDialog)
|
|
1399
|
+
|
|
1400
|
+
User->>UI: select sideDialog Q4H
|
|
1401
|
+
User->>Asker: drive_dialog_by_user_answer(targetSideDialogId)
|
|
1402
|
+
Asker->>Side: handleDriveDialogByUserAnswer(...)
|
|
1403
|
+
Side->>Store: loadQuestions4HumanState()
|
|
1404
|
+
Side->>Store: clearQuestions4HumanState()
|
|
1405
|
+
Side-->>Side: driveDialogStream(answer)
|
|
1406
|
+
Side->>Store: write response.yaml
|
|
1407
|
+
Side-->>Asker: supply response (resume root)
|
|
1412
1408
|
```
|
|
1413
1409
|
|
|
1414
|
-
### 3. Registered
|
|
1410
|
+
### 3. Registered SideDialog Tellask (TYPE B / `Tellask Session` / Registered Session Tellask)
|
|
1415
1411
|
|
|
1416
1412
|
```mermaid
|
|
1417
1413
|
sequenceDiagram
|
|
1418
|
-
participant
|
|
1414
|
+
participant Main as Main Dialog
|
|
1419
1415
|
participant Store as Persistence (registry.yaml + dialogs/)
|
|
1420
|
-
participant
|
|
1416
|
+
participant Side as SideDialog (@researcher sessionSlug market)
|
|
1421
1417
|
|
|
1422
|
-
|
|
1418
|
+
Main->>Store: lookup registry key "researcher!market"
|
|
1423
1419
|
alt not found
|
|
1424
|
-
|
|
1425
|
-
|
|
1420
|
+
Main->>Store: create sideDialog + save registry.yaml
|
|
1421
|
+
Main->>Side: drive (root suspended)
|
|
1426
1422
|
else found
|
|
1427
|
-
|
|
1428
|
-
|
|
1423
|
+
Main->>Store: load sideDialog + update lastAccessed
|
|
1424
|
+
Main->>Side: drive (root suspended)
|
|
1429
1425
|
end
|
|
1430
1426
|
|
|
1431
|
-
|
|
1432
|
-
|
|
1427
|
+
Side->>Store: write response.yaml
|
|
1428
|
+
Side-->>Main: supply response (root resumes)
|
|
1433
1429
|
```
|
|
1434
1430
|
|
|
1435
1431
|
### 4. Clarity Operations Preserve Registry
|
|
@@ -1449,9 +1445,9 @@ sequenceDiagram
|
|
|
1449
1445
|
|
|
1450
1446
|
### Scalability
|
|
1451
1447
|
|
|
1452
|
-
**Flat Storage**:
|
|
1448
|
+
**Flat Storage**: SideDialog flat storage prevents deep directory nesting issues.
|
|
1453
1449
|
|
|
1454
|
-
**Registry Efficiency**: Single-level Map lookup for registered
|
|
1450
|
+
**Registry Efficiency**: Single-level Map lookup for registered sideDialogs is O(1).
|
|
1455
1451
|
|
|
1456
1452
|
**Memory Efficiency**: Shared memories reduce duplication across dialogs.
|
|
1457
1453
|
|
|
@@ -1463,13 +1459,13 @@ sequenceDiagram
|
|
|
1463
1459
|
|
|
1464
1460
|
**Backup and Recovery**: Dialog state can be backed up and restored independently. Registry is restored from done/ on load.
|
|
1465
1461
|
|
|
1466
|
-
**Error Handling**: System
|
|
1462
|
+
**Error Handling**: System loudly reports and quarantines malformed dialog state instead of silently ignoring dialog corruption, missing files, or registry corruption.
|
|
1467
1463
|
|
|
1468
1464
|
### Monitoring
|
|
1469
1465
|
|
|
1470
1466
|
**Performance Metrics**: System tracks dialog creation, completion, registry size, resource usage, and Q4H count.
|
|
1471
1467
|
|
|
1472
|
-
**Health Checks**: Regular validation of dialog
|
|
1468
|
+
**Health Checks**: Regular validation of dialog dialog relationship integrity, Q4H persistence, registry consistency, and memory.
|
|
1473
1469
|
|
|
1474
1470
|
**Debugging Support**: Comprehensive logging and inspection tools for troubleshooting teammate Tellasks, registry operations, and Q4H flows.
|
|
1475
1471
|
|
|
@@ -1477,17 +1473,17 @@ sequenceDiagram
|
|
|
1477
1473
|
|
|
1478
1474
|
## Summary
|
|
1479
1475
|
|
|
1480
|
-
The Dominds dialog system provides a robust framework for
|
|
1476
|
+
The Dominds dialog system provides a robust framework for human-in-the-loop AI collaboration:
|
|
1481
1477
|
|
|
1482
1478
|
### Four Core Mechanisms
|
|
1483
1479
|
|
|
1484
|
-
| Mechanism
|
|
1485
|
-
|
|
|
1486
|
-
| **Dialog
|
|
1487
|
-
| **Q4H**
|
|
1488
|
-
| **Mental Clarity**
|
|
1489
|
-
| **Reminders**
|
|
1490
|
-
| **
|
|
1480
|
+
| Mechanism | Purpose | Survives Clarity | Cleared By |
|
|
1481
|
+
| ----------------------- | ------------------------------------- | ---------------- | --------------------------------------------- |
|
|
1482
|
+
| **Dialog Relationship** | Tellasker/Side Dialog task delegation | N/A | N/A |
|
|
1483
|
+
| **Q4H** | Human input requests | No | clear_mind |
|
|
1484
|
+
| **Mental Clarity** | Context reset tools | N/A | N/A |
|
|
1485
|
+
| **Reminders** | Persistent working memory | Yes | N/A |
|
|
1486
|
+
| **SideDialog Registry** | Registered sideDialog tracking | Yes | dead-entry prune on `declare_sideDialog_dead` |
|
|
1491
1487
|
|
|
1492
1488
|
### Three Types of Teammate Tellasks
|
|
1493
1489
|
|
|
@@ -1499,12 +1495,12 @@ The Dominds dialog system provides a robust framework for hierarchical, human-in
|
|
|
1499
1495
|
|
|
1500
1496
|
### Class Responsibility
|
|
1501
1497
|
|
|
1502
|
-
- **
|
|
1503
|
-
- **
|
|
1498
|
+
- **MainDialog**: Manages registry, can make all three teammate Tellask types
|
|
1499
|
+
- **SideDialog**: Has askerDialog reference, can make TYPE A and TYPE C directly; TYPE B routes through the main dialog registry and updates tellasker context on each Tellask
|
|
1504
1500
|
|
|
1505
1501
|
### Persistence Guarantees
|
|
1506
1502
|
|
|
1507
1503
|
- **Q4H**: Persisted, cleared by clarity operations
|
|
1508
1504
|
- **Reminders**: Persisted, survives clarity operations
|
|
1509
1505
|
- **Registry**: Persisted, survives clarity operations, moves to done/ on completion
|
|
1510
|
-
- **
|
|
1506
|
+
- **SideDialogs**: Registered sideDialogs persist in registry; transient sideDialogs are not registered
|