dominds 1.18.2 → 1.19.3
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/cli/team-definition-audit.d.ts +2 -1
- package/dist/cli/team-definition-audit.js +20 -8
- package/dist/cli/validate-team-def.js +3 -3
- 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 +16 -4
- package/dist/docs/mcp-support.zh.md +10 -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 +16 -5
- package/dist/docs/team_mgmt-toolset.zh.md +13 -4
- 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/docs/tool-availability-protocol.md +4 -2
- 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 +2 -0
- package/dist/mcp/config.js +23 -2
- package/dist/mcp/supervisor.d.ts +9 -1
- package/dist/mcp/supervisor.js +300 -17
- package/dist/minds/builtin/pangu/persona.en.md +4 -4
- package/dist/minds/load.js +11 -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 +2 -1
- package/dist/minds/system-prompt.js +70 -62
- 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/builtins.js +2 -0
- package/dist/tools/ctrl.js +5 -5
- package/dist/tools/env.js +10 -58
- package/dist/tools/manual/render.js +4 -0
- package/dist/tools/mcp.d.ts +1 -0
- package/dist/tools/mcp.js +55 -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/mcp_admin/en/errors.md +0 -14
- package/dist/tools/prompts/mcp_admin/en/index.md +5 -3
- package/dist/tools/prompts/mcp_admin/en/principles.md +11 -5
- package/dist/tools/prompts/mcp_admin/en/scenarios.md +19 -3
- package/dist/tools/prompts/mcp_admin/en/tools.md +85 -21
- package/dist/tools/prompts/mcp_admin/zh/errors.md +0 -14
- package/dist/tools/prompts/mcp_admin/zh/index.md +5 -3
- package/dist/tools/prompts/mcp_admin/zh/principles.md +11 -5
- package/dist/tools/prompts/mcp_admin/zh/scenarios.md +19 -3
- package/dist/tools/prompts/mcp_admin/zh/tools.md +85 -21
- package/dist/tools/prompts/os/en/errors.md +0 -28
- package/dist/tools/prompts/os/en/scenarios.md +1 -1
- package/dist/tools/prompts/os/en/tools.md +8 -17
- package/dist/tools/prompts/os/zh/errors.md +0 -28
- package/dist/tools/prompts/os/zh/scenarios.md +1 -1
- package/dist/tools/prompts/os/zh/tools.md +8 -17
- 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/registry.d.ts +5 -0
- package/dist/tools/team_mgmt-manual.js +2 -2
- package/dist/tools/team_mgmt-mcp-manual.d.ts +2 -2
- package/dist/tools/team_mgmt-mcp-manual.js +67 -16
- package/dist/tools/team_mgmt.js +8 -8
- package/dist/utils/taskdoc.js +12 -12
- package/package.json +3 -3
- package/webapp/dist/assets/{_basePickBy-BPJaiZdW.js → _basePickBy-Dnh413xT.js} +3 -3
- package/webapp/dist/assets/{_basePickBy-BPJaiZdW.js.map → _basePickBy-Dnh413xT.js.map} +1 -1
- package/webapp/dist/assets/{_baseUniq-BEetT15i.js → _baseUniq-DWzYqpN_.js} +2 -2
- package/webapp/dist/assets/{_baseUniq-BEetT15i.js.map → _baseUniq-DWzYqpN_.js.map} +1 -1
- package/webapp/dist/assets/{arc-Dm7Zf36f.js → arc-vfBkNCOx.js} +2 -2
- package/webapp/dist/assets/{arc-Dm7Zf36f.js.map → arc-vfBkNCOx.js.map} +1 -1
- package/webapp/dist/assets/{architectureDiagram-VXUJARFQ-BpTPtkuo.js → architectureDiagram-VXUJARFQ-DiUEBXOa.js} +7 -7
- package/webapp/dist/assets/{architectureDiagram-VXUJARFQ-BpTPtkuo.js.map → architectureDiagram-VXUJARFQ-DiUEBXOa.js.map} +1 -1
- package/webapp/dist/assets/{blockDiagram-VD42YOAC-C8fLN0iu.js → blockDiagram-VD42YOAC-BqK1KM2m.js} +7 -7
- package/webapp/dist/assets/{blockDiagram-VD42YOAC-C8fLN0iu.js.map → blockDiagram-VD42YOAC-BqK1KM2m.js.map} +1 -1
- package/webapp/dist/assets/{c4Diagram-YG6GDRKO-BpPr62CH.js → c4Diagram-YG6GDRKO-ClHNu1Uo.js} +3 -3
- package/webapp/dist/assets/{c4Diagram-YG6GDRKO-BpPr62CH.js.map → c4Diagram-YG6GDRKO-ClHNu1Uo.js.map} +1 -1
- package/webapp/dist/assets/{channel-EMYoPjW3.js → channel-BbWLVc8W.js} +2 -2
- package/webapp/dist/assets/{channel-EMYoPjW3.js.map → channel-BbWLVc8W.js.map} +1 -1
- package/webapp/dist/assets/{chunk-4BX2VUAB-CefNtjWG.js → chunk-4BX2VUAB-CItdSmZH.js} +2 -2
- package/webapp/dist/assets/{chunk-4BX2VUAB-CefNtjWG.js.map → chunk-4BX2VUAB-CItdSmZH.js.map} +1 -1
- package/webapp/dist/assets/{chunk-55IACEB6-C_X7T43V.js → chunk-55IACEB6-DSCX9WCf.js} +2 -2
- package/webapp/dist/assets/{chunk-55IACEB6-C_X7T43V.js.map → chunk-55IACEB6-DSCX9WCf.js.map} +1 -1
- package/webapp/dist/assets/{chunk-B4BG7PRW-BRe3_2oA.js → chunk-B4BG7PRW-5CRXFeD9.js} +5 -5
- package/webapp/dist/assets/{chunk-B4BG7PRW-BRe3_2oA.js.map → chunk-B4BG7PRW-5CRXFeD9.js.map} +1 -1
- package/webapp/dist/assets/{chunk-DI55MBZ5-CbvrsI_w.js → chunk-DI55MBZ5-CRMf6XZu.js} +4 -4
- package/webapp/dist/assets/{chunk-DI55MBZ5-CbvrsI_w.js.map → chunk-DI55MBZ5-CRMf6XZu.js.map} +1 -1
- package/webapp/dist/assets/{chunk-FMBD7UC4-ORmtkrtS.js → chunk-FMBD7UC4-BJ1vT2se.js} +2 -2
- package/webapp/dist/assets/{chunk-FMBD7UC4-ORmtkrtS.js.map → chunk-FMBD7UC4-BJ1vT2se.js.map} +1 -1
- package/webapp/dist/assets/{chunk-QN33PNHL-LTAOVhWu.js → chunk-QN33PNHL-CGyezTSD.js} +2 -2
- package/webapp/dist/assets/{chunk-QN33PNHL-LTAOVhWu.js.map → chunk-QN33PNHL-CGyezTSD.js.map} +1 -1
- package/webapp/dist/assets/{chunk-QZHKN3VN-ZoUM_4u5.js → chunk-QZHKN3VN-9xs15j8C.js} +2 -2
- package/webapp/dist/assets/{chunk-QZHKN3VN-ZoUM_4u5.js.map → chunk-QZHKN3VN-9xs15j8C.js.map} +1 -1
- package/webapp/dist/assets/{chunk-TZMSLE5B-Gao4qrq7.js → chunk-TZMSLE5B-D2g6Tj7Z.js} +2 -2
- package/webapp/dist/assets/{chunk-TZMSLE5B-Gao4qrq7.js.map → chunk-TZMSLE5B-D2g6Tj7Z.js.map} +1 -1
- package/webapp/dist/assets/{classDiagram-2ON5EDUG-uha1vIGN.js → classDiagram-2ON5EDUG-BQFGGJNm.js} +6 -6
- package/webapp/dist/assets/{classDiagram-2ON5EDUG-uha1vIGN.js.map → classDiagram-2ON5EDUG-BQFGGJNm.js.map} +1 -1
- package/webapp/dist/assets/{classDiagram-v2-WZHVMYZB-uha1vIGN.js → classDiagram-v2-WZHVMYZB-BQFGGJNm.js} +6 -6
- package/webapp/dist/assets/{classDiagram-v2-WZHVMYZB-uha1vIGN.js.map → classDiagram-v2-WZHVMYZB-BQFGGJNm.js.map} +1 -1
- package/webapp/dist/assets/{clone-_9Ayb1Gp.js → clone-DOfPd4cz.js} +2 -2
- package/webapp/dist/assets/{clone-_9Ayb1Gp.js.map → clone-DOfPd4cz.js.map} +1 -1
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-C8wDw3NY.js → cose-bilkent-S5V4N54A-BYN-vqm8.js} +2 -2
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-C8wDw3NY.js.map → cose-bilkent-S5V4N54A-BYN-vqm8.js.map} +1 -1
- package/webapp/dist/assets/{dagre-6UL2VRFP-BUSeNot0.js → dagre-6UL2VRFP-ClEaFABE.js} +7 -7
- package/webapp/dist/assets/{dagre-6UL2VRFP-BUSeNot0.js.map → dagre-6UL2VRFP-ClEaFABE.js.map} +1 -1
- package/webapp/dist/assets/{diagram-PSM6KHXK-CMZAksVC.js → diagram-PSM6KHXK-CM4hLE_0.js} +8 -8
- package/webapp/dist/assets/{diagram-PSM6KHXK-CMZAksVC.js.map → diagram-PSM6KHXK-CM4hLE_0.js.map} +1 -1
- package/webapp/dist/assets/{diagram-QEK2KX5R-BQKoRtwy.js → diagram-QEK2KX5R-BZjGFX-2.js} +7 -7
- package/webapp/dist/assets/{diagram-QEK2KX5R-BQKoRtwy.js.map → diagram-QEK2KX5R-BZjGFX-2.js.map} +1 -1
- package/webapp/dist/assets/{diagram-S2PKOQOG-DjMG97kd.js → diagram-S2PKOQOG-Bvw01OOG.js} +7 -7
- package/webapp/dist/assets/{diagram-S2PKOQOG-DjMG97kd.js.map → diagram-S2PKOQOG-Bvw01OOG.js.map} +1 -1
- package/webapp/dist/assets/{erDiagram-Q2GNP2WA-BujwA137.js → erDiagram-Q2GNP2WA-ctHu5zQL.js} +5 -5
- package/webapp/dist/assets/{erDiagram-Q2GNP2WA-BujwA137.js.map → erDiagram-Q2GNP2WA-ctHu5zQL.js.map} +1 -1
- package/webapp/dist/assets/{flowDiagram-NV44I4VS-DgwPjg4y.js → flowDiagram-NV44I4VS-m7ofIhri.js} +6 -6
- package/webapp/dist/assets/{flowDiagram-NV44I4VS-DgwPjg4y.js.map → flowDiagram-NV44I4VS-m7ofIhri.js.map} +1 -1
- package/webapp/dist/assets/{ganttDiagram-JELNMOA3-Db2ykf3E.js → ganttDiagram-JELNMOA3-D9wS5Veb.js} +3 -3
- package/webapp/dist/assets/{ganttDiagram-JELNMOA3-Db2ykf3E.js.map → ganttDiagram-JELNMOA3-D9wS5Veb.js.map} +1 -1
- package/webapp/dist/assets/{gitGraphDiagram-V2S2FVAM-D_gSifkv.js → gitGraphDiagram-V2S2FVAM-B86qqJx7.js} +8 -8
- package/webapp/dist/assets/{gitGraphDiagram-V2S2FVAM-D_gSifkv.js.map → gitGraphDiagram-V2S2FVAM-B86qqJx7.js.map} +1 -1
- package/webapp/dist/assets/{graph-BHjCU5xP.js → graph-u844GGQC.js} +3 -3
- package/webapp/dist/assets/{graph-BHjCU5xP.js.map → graph-u844GGQC.js.map} +1 -1
- package/webapp/dist/assets/{index-xvYYeHuy.css → index-BGdI3lWA.css} +17 -9
- package/webapp/dist/assets/{index-DLajsIDJ.js → index-tinPEZoH.js} +1211 -995
- package/webapp/dist/assets/index-tinPEZoH.js.map +1 -0
- package/webapp/dist/assets/{infoDiagram-HS3SLOUP-BDba5pKs.js → infoDiagram-HS3SLOUP-DwRPUctP.js} +6 -6
- package/webapp/dist/assets/{infoDiagram-HS3SLOUP-BDba5pKs.js.map → infoDiagram-HS3SLOUP-DwRPUctP.js.map} +1 -1
- package/webapp/dist/assets/{journeyDiagram-XKPGCS4Q-CmJAbmlm.js → journeyDiagram-XKPGCS4Q-B91ZO-ec.js} +5 -5
- package/webapp/dist/assets/{journeyDiagram-XKPGCS4Q-CmJAbmlm.js.map → journeyDiagram-XKPGCS4Q-B91ZO-ec.js.map} +1 -1
- package/webapp/dist/assets/{kanban-definition-3W4ZIXB7-DxQeBTDk.js → kanban-definition-3W4ZIXB7-CoogrZ07.js} +3 -3
- package/webapp/dist/assets/{kanban-definition-3W4ZIXB7-DxQeBTDk.js.map → kanban-definition-3W4ZIXB7-CoogrZ07.js.map} +1 -1
- package/webapp/dist/assets/{layout-DteV_yE8.js → layout-BrzQmqFJ.js} +5 -5
- package/webapp/dist/assets/{layout-DteV_yE8.js.map → layout-BrzQmqFJ.js.map} +1 -1
- package/webapp/dist/assets/{linear-zItbPrND.js → linear-C6H7K9Zy.js} +2 -2
- package/webapp/dist/assets/{linear-zItbPrND.js.map → linear-C6H7K9Zy.js.map} +1 -1
- package/webapp/dist/assets/{mindmap-definition-VGOIOE7T-BJXI7UqO.js → mindmap-definition-VGOIOE7T-UDHZQkNZ.js} +4 -4
- package/webapp/dist/assets/{mindmap-definition-VGOIOE7T-BJXI7UqO.js.map → mindmap-definition-VGOIOE7T-UDHZQkNZ.js.map} +1 -1
- package/webapp/dist/assets/{pieDiagram-ADFJNKIX-BpM-aH2p.js → pieDiagram-ADFJNKIX-M81uyQ1J.js} +8 -8
- package/webapp/dist/assets/{pieDiagram-ADFJNKIX-BpM-aH2p.js.map → pieDiagram-ADFJNKIX-M81uyQ1J.js.map} +1 -1
- package/webapp/dist/assets/{quadrantDiagram-AYHSOK5B-NXdIpA15.js → quadrantDiagram-AYHSOK5B-ClzIh9Gb.js} +3 -3
- package/webapp/dist/assets/{quadrantDiagram-AYHSOK5B-NXdIpA15.js.map → quadrantDiagram-AYHSOK5B-ClzIh9Gb.js.map} +1 -1
- package/webapp/dist/assets/{requirementDiagram-UZGBJVZJ-D1AICAA0.js → requirementDiagram-UZGBJVZJ-DLK3A-pn.js} +4 -4
- package/webapp/dist/assets/{requirementDiagram-UZGBJVZJ-D1AICAA0.js.map → requirementDiagram-UZGBJVZJ-DLK3A-pn.js.map} +1 -1
- package/webapp/dist/assets/{sankeyDiagram-TZEHDZUN-WiReDPfo.js → sankeyDiagram-TZEHDZUN-CYqju8I1.js} +2 -2
- package/webapp/dist/assets/{sankeyDiagram-TZEHDZUN-WiReDPfo.js.map → sankeyDiagram-TZEHDZUN-CYqju8I1.js.map} +1 -1
- package/webapp/dist/assets/{sequenceDiagram-WL72ISMW-Cw76oP8t.js → sequenceDiagram-WL72ISMW-2guv6eOd.js} +4 -4
- package/webapp/dist/assets/{sequenceDiagram-WL72ISMW-Cw76oP8t.js.map → sequenceDiagram-WL72ISMW-2guv6eOd.js.map} +1 -1
- package/webapp/dist/assets/{stateDiagram-FKZM4ZOC-QjCeRczs.js → stateDiagram-FKZM4ZOC-iujqSp0X.js} +9 -9
- package/webapp/dist/assets/{stateDiagram-FKZM4ZOC-QjCeRczs.js.map → stateDiagram-FKZM4ZOC-iujqSp0X.js.map} +1 -1
- package/webapp/dist/assets/{stateDiagram-v2-4FDKWEC3-IClqxQ4s.js → stateDiagram-v2-4FDKWEC3-BxzY81ky.js} +5 -5
- package/webapp/dist/assets/{stateDiagram-v2-4FDKWEC3-IClqxQ4s.js.map → stateDiagram-v2-4FDKWEC3-BxzY81ky.js.map} +1 -1
- package/webapp/dist/assets/{timeline-definition-IT6M3QCI-BfyfTY7m.js → timeline-definition-IT6M3QCI-DjCFSC8d.js} +3 -3
- package/webapp/dist/assets/{timeline-definition-IT6M3QCI-BfyfTY7m.js.map → timeline-definition-IT6M3QCI-DjCFSC8d.js.map} +1 -1
- package/webapp/dist/assets/{treemap-GDKQZRPO-C5MiL6--.js → treemap-GDKQZRPO-iaBzDWCP.js} +5 -5
- package/webapp/dist/assets/{treemap-GDKQZRPO-C5MiL6--.js.map → treemap-GDKQZRPO-iaBzDWCP.js.map} +1 -1
- package/webapp/dist/assets/{xychartDiagram-PRI3JC2R-ybaJrSry.js → xychartDiagram-PRI3JC2R-R6Jl1c89.js} +3 -3
- package/webapp/dist/assets/{xychartDiagram-PRI3JC2R-ybaJrSry.js.map → xychartDiagram-PRI3JC2R-R6Jl1c89.js.map} +1 -1
- 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/index-DLajsIDJ.js.map +0 -1
|
@@ -116,7 +116,7 @@ async function buildAppDynamicLayer(params) {
|
|
|
116
116
|
taskDocPath: params.taskDocPath,
|
|
117
117
|
agentId: params.agentId,
|
|
118
118
|
dialogId: params.dialog?.selfId,
|
|
119
|
-
|
|
119
|
+
mainDialogId: params.dialog?.rootId,
|
|
120
120
|
sessionSlug: params.dialog?.sessionSlug,
|
|
121
121
|
});
|
|
122
122
|
if (result.status === 'not_applicable') {
|
|
@@ -5,6 +5,7 @@ exports.ensureAppReminderOwnersRegistered = ensureAppReminderOwnersRegistered;
|
|
|
5
5
|
exports.unregisterAppReminderOwnersForApps = unregisterAppReminderOwnersForApps;
|
|
6
6
|
exports.applyAppReminderRequests = applyAppReminderRequests;
|
|
7
7
|
const evt_registry_1 = require("../evt-registry");
|
|
8
|
+
const log_1 = require("../log");
|
|
8
9
|
const driver_messages_1 = require("../runtime/driver-messages");
|
|
9
10
|
const work_language_1 = require("../runtime/work-language");
|
|
10
11
|
const shared_reminders_1 = require("../shared-reminders");
|
|
@@ -159,8 +160,8 @@ function findOwnedReminderEntries(dlg, descriptor, owner) {
|
|
|
159
160
|
function fallbackRenderedReminder(reminder) {
|
|
160
161
|
const language = (0, work_language_1.getWorkLanguage)();
|
|
161
162
|
return {
|
|
162
|
-
type: '
|
|
163
|
-
role: '
|
|
163
|
+
type: 'environment_msg',
|
|
164
|
+
role: 'user',
|
|
164
165
|
content: (0, driver_messages_1.formatReminderItemGuide)(language, reminder.id, reminder.content, {
|
|
165
166
|
meta: reminder.meta,
|
|
166
167
|
scope: reminder.scope,
|
|
@@ -212,7 +213,13 @@ function createAppReminderOwner(params) {
|
|
|
212
213
|
: reminder.meta,
|
|
213
214
|
};
|
|
214
215
|
}
|
|
215
|
-
catch {
|
|
216
|
+
catch (error) {
|
|
217
|
+
log_1.log.warn('App reminder update failed; keeping existing reminder state', error, {
|
|
218
|
+
appId: descriptor.appId,
|
|
219
|
+
ownerRef: descriptor.ownerRef,
|
|
220
|
+
dialogId: dlg.id.selfId,
|
|
221
|
+
reminderId: reminder.id,
|
|
222
|
+
});
|
|
216
223
|
return { treatment: 'keep' };
|
|
217
224
|
}
|
|
218
225
|
},
|
|
@@ -229,7 +236,13 @@ function createAppReminderOwner(params) {
|
|
|
229
236
|
workLanguage: (0, work_language_1.getWorkLanguage)(),
|
|
230
237
|
});
|
|
231
238
|
}
|
|
232
|
-
catch {
|
|
239
|
+
catch (error) {
|
|
240
|
+
log_1.log.warn('App reminder render failed; using generic reminder rendering', error, {
|
|
241
|
+
appId: descriptor.appId,
|
|
242
|
+
ownerRef: descriptor.ownerRef,
|
|
243
|
+
dialogId: dlg.id.selfId,
|
|
244
|
+
reminderId: reminder.id,
|
|
245
|
+
});
|
|
233
246
|
return fallbackRenderedReminder(reminder);
|
|
234
247
|
}
|
|
235
248
|
},
|
package/dist/tools/builtins.js
CHANGED
|
@@ -81,6 +81,7 @@ function manualSpecFor(toolsetId) {
|
|
|
81
81
|
// MCP tools (local testing/ops)
|
|
82
82
|
(0, registry_1.registerTool)(mcp_1.mcpRestartTool);
|
|
83
83
|
(0, registry_1.registerTool)(mcp_1.mcpReleaseTool);
|
|
84
|
+
(0, registry_1.registerTool)(mcp_1.mcpDisableTool);
|
|
84
85
|
// Memory tools
|
|
85
86
|
(0, registry_1.registerTool)(mem_1.addPersonalMemoryTool);
|
|
86
87
|
(0, registry_1.registerTool)(mem_1.dropPersonalMemoryTool);
|
|
@@ -169,6 +170,7 @@ for (const tool of team_mgmt_1.teamMgmtTools) {
|
|
|
169
170
|
(0, registry_1.registerToolset)('mcp_admin', [
|
|
170
171
|
mcp_1.mcpRestartTool,
|
|
171
172
|
mcp_1.mcpReleaseTool,
|
|
173
|
+
mcp_1.mcpDisableTool,
|
|
172
174
|
env_1.envGetTool,
|
|
173
175
|
env_1.envSetTool,
|
|
174
176
|
env_1.envUnsetTool,
|
package/dist/tools/ctrl.js
CHANGED
|
@@ -634,9 +634,9 @@ exports.clearMindTool = {
|
|
|
634
634
|
exports.changeMindTool = {
|
|
635
635
|
type: 'func',
|
|
636
636
|
name: 'change_mind',
|
|
637
|
-
description: 'Replace one shared Taskdoc section in the
|
|
637
|
+
description: 'Replace one shared Taskdoc section in the Main Dialog.',
|
|
638
638
|
descriptionI18n: {
|
|
639
|
-
en: 'Replace one shared Taskdoc section in the
|
|
639
|
+
en: 'Replace one shared Taskdoc section in the Main Dialog.',
|
|
640
640
|
zh: '在主线对话中替换一段共享差遣牒章节。',
|
|
641
641
|
},
|
|
642
642
|
parameters: {
|
|
@@ -659,13 +659,13 @@ exports.changeMindTool = {
|
|
|
659
659
|
async call(dlg, caller, args) {
|
|
660
660
|
const language = (0, work_language_1.getWorkLanguage)();
|
|
661
661
|
const t = getCtrlMessages(language);
|
|
662
|
-
if (dlg.
|
|
663
|
-
const maintainerId = dlg instanceof dialog_1.
|
|
662
|
+
if (dlg.askerDialog !== undefined) {
|
|
663
|
+
const maintainerId = dlg instanceof dialog_1.SideDialog ? dlg.mainDialog.agentId : dlg.agentId;
|
|
664
664
|
if (language === 'zh') {
|
|
665
665
|
return (0, tool_1.toolFailure)(`错误:\`change_mind\` 仅允许在主线对话中使用(支线对话中不可用)。\n` +
|
|
666
666
|
`请诉请差遣牒维护人 @${maintainerId} 在其对话中执行 \`change_mind\`,并提供你已合并好的“分段全文替换稿”(禁止覆盖/抹掉他人条目)。`);
|
|
667
667
|
}
|
|
668
|
-
return (0, tool_1.toolFailure)(`Error: \`change_mind\` is only available in the
|
|
668
|
+
return (0, tool_1.toolFailure)(`Error: \`change_mind\` is only available in the Main Dialog (not in Side Dialogs).\n` +
|
|
669
669
|
`Ask the Taskdoc maintainer @${maintainerId} to run \`change_mind\` and provide a fully merged full-section replacement draft (do not overwrite/delete other contributors).`);
|
|
670
670
|
}
|
|
671
671
|
const selectorValue = args['selector'];
|
package/dist/tools/env.js
CHANGED
|
@@ -13,47 +13,20 @@ const log_1 = require("../log");
|
|
|
13
13
|
const tool_1 = require("../tool");
|
|
14
14
|
const log = (0, log_1.createLogger)('tools/env');
|
|
15
15
|
const ENV_KEY_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
16
|
-
const DEFAULT_ALLOWED_PREFIXES = ['MCP_', 'UX_', 'DOMINDS_TEST_'];
|
|
17
|
-
const DEFAULT_ALLOWED_EXACT = ['DOMINDS_LOG_LEVEL'];
|
|
18
|
-
function isAllowedEnvKey(key) {
|
|
19
|
-
if (!ENV_KEY_RE.test(key))
|
|
20
|
-
return false;
|
|
21
|
-
if (DEFAULT_ALLOWED_EXACT.includes(key))
|
|
22
|
-
return true;
|
|
23
|
-
for (const p of DEFAULT_ALLOWED_PREFIXES) {
|
|
24
|
-
if (key.startsWith(p))
|
|
25
|
-
return true;
|
|
26
|
-
}
|
|
27
|
-
return false;
|
|
28
|
-
}
|
|
29
|
-
function isSensitiveKeyName(key) {
|
|
30
|
-
const upper = key.toUpperCase();
|
|
31
|
-
return (upper.includes('KEY') ||
|
|
32
|
-
upper.includes('TOKEN') ||
|
|
33
|
-
upper.includes('SECRET') ||
|
|
34
|
-
upper.includes('PASSWORD'));
|
|
35
|
-
}
|
|
36
|
-
function redactValue(value) {
|
|
37
|
-
if (value.length <= 4)
|
|
38
|
-
return '<redacted>';
|
|
39
|
-
return `<redacted len=${value.length} prefix=${JSON.stringify(value.slice(0, 2))} suffix=${JSON.stringify(value.slice(-2))}>`;
|
|
40
|
-
}
|
|
41
16
|
function parseEnvGetArgs(args) {
|
|
42
17
|
const key = args.key;
|
|
43
18
|
if (typeof key !== 'string' || !key.trim()) {
|
|
44
19
|
throw new Error(`env_get.key must be a non-empty string`);
|
|
45
20
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
throw new Error(`env_get.reveal must be a boolean if provided`);
|
|
49
|
-
}
|
|
50
|
-
return { key, reveal: revealVal };
|
|
21
|
+
assertValidEnvKey('env_get', key);
|
|
22
|
+
return { key };
|
|
51
23
|
}
|
|
52
24
|
function parseEnvSetArgs(args) {
|
|
53
25
|
const key = args.key;
|
|
54
26
|
if (typeof key !== 'string' || !key.trim()) {
|
|
55
27
|
throw new Error(`env_set.key must be a non-empty string`);
|
|
56
28
|
}
|
|
29
|
+
assertValidEnvKey('env_set', key);
|
|
57
30
|
const value = args.value;
|
|
58
31
|
if (typeof value !== 'string') {
|
|
59
32
|
throw new Error(`env_set.value must be a string`);
|
|
@@ -65,16 +38,13 @@ function parseEnvUnsetArgs(args) {
|
|
|
65
38
|
if (typeof key !== 'string' || !key.trim()) {
|
|
66
39
|
throw new Error(`env_unset.key must be a non-empty string`);
|
|
67
40
|
}
|
|
41
|
+
assertValidEnvKey('env_unset', key);
|
|
68
42
|
return { key };
|
|
69
43
|
}
|
|
70
44
|
const envGetSchema = {
|
|
71
45
|
type: 'object',
|
|
72
46
|
properties: {
|
|
73
47
|
key: { type: 'string', description: 'Environment variable name to read' },
|
|
74
|
-
reveal: {
|
|
75
|
-
type: 'boolean',
|
|
76
|
-
description: 'When true, returns the raw value. For keys that look like secrets, default is redacted unless reveal=true.',
|
|
77
|
-
},
|
|
78
48
|
},
|
|
79
49
|
required: ['key'],
|
|
80
50
|
additionalProperties: false,
|
|
@@ -96,12 +66,9 @@ const envUnsetSchema = {
|
|
|
96
66
|
required: ['key'],
|
|
97
67
|
additionalProperties: false,
|
|
98
68
|
};
|
|
99
|
-
function
|
|
100
|
-
if (!
|
|
101
|
-
throw new Error(
|
|
102
|
-
...DEFAULT_ALLOWED_EXACT,
|
|
103
|
-
...DEFAULT_ALLOWED_PREFIXES.map((p) => `${p}*`),
|
|
104
|
-
].join(', ')}`);
|
|
69
|
+
function assertValidEnvKey(toolName, key) {
|
|
70
|
+
if (!ENV_KEY_RE.test(key)) {
|
|
71
|
+
throw new Error(`${toolName}.key must be a valid environment variable name matching ${ENV_KEY_RE.source}`);
|
|
105
72
|
}
|
|
106
73
|
}
|
|
107
74
|
exports.envGetTool = {
|
|
@@ -116,7 +83,6 @@ exports.envGetTool = {
|
|
|
116
83
|
argsValidation: 'dominds',
|
|
117
84
|
call: async (_dlg, caller, args) => {
|
|
118
85
|
const parsed = parseEnvGetArgs(args);
|
|
119
|
-
assertAllowedKey(parsed.key);
|
|
120
86
|
const raw = process.env[parsed.key];
|
|
121
87
|
const value = raw === undefined ? undefined : String(raw);
|
|
122
88
|
log.debug('env_get', undefined, {
|
|
@@ -126,10 +92,6 @@ exports.envGetTool = {
|
|
|
126
92
|
});
|
|
127
93
|
if (value === undefined)
|
|
128
94
|
return (0, tool_1.toolSuccess)('(unset)');
|
|
129
|
-
if (parsed.reveal === true)
|
|
130
|
-
return (0, tool_1.toolSuccess)(value);
|
|
131
|
-
if (isSensitiveKeyName(parsed.key))
|
|
132
|
-
return (0, tool_1.toolSuccess)(redactValue(value));
|
|
133
95
|
return (0, tool_1.toolSuccess)(value);
|
|
134
96
|
},
|
|
135
97
|
};
|
|
@@ -145,7 +107,6 @@ exports.envSetTool = {
|
|
|
145
107
|
argsValidation: 'dominds',
|
|
146
108
|
call: async (_dlg, caller, args) => {
|
|
147
109
|
const parsed = parseEnvSetArgs(args);
|
|
148
|
-
assertAllowedKey(parsed.key);
|
|
149
110
|
const prev = process.env[parsed.key];
|
|
150
111
|
process.env[parsed.key] = parsed.value;
|
|
151
112
|
log.warn('env_set', undefined, {
|
|
@@ -154,12 +115,8 @@ exports.envSetTool = {
|
|
|
154
115
|
prevSet: prev !== undefined,
|
|
155
116
|
nextLen: parsed.value.length,
|
|
156
117
|
});
|
|
157
|
-
const prevStr = prev === undefined
|
|
158
|
-
|
|
159
|
-
: isSensitiveKeyName(parsed.key)
|
|
160
|
-
? redactValue(String(prev))
|
|
161
|
-
: String(prev);
|
|
162
|
-
const nextStr = isSensitiveKeyName(parsed.key) ? redactValue(parsed.value) : parsed.value;
|
|
118
|
+
const prevStr = prev === undefined ? '(unset)' : String(prev);
|
|
119
|
+
const nextStr = parsed.value;
|
|
163
120
|
return (0, tool_1.toolSuccess)(`ok: ${parsed.key}\nprev: ${prevStr}\nnext: ${nextStr}`);
|
|
164
121
|
},
|
|
165
122
|
};
|
|
@@ -175,7 +132,6 @@ exports.envUnsetTool = {
|
|
|
175
132
|
argsValidation: 'dominds',
|
|
176
133
|
call: async (_dlg, caller, args) => {
|
|
177
134
|
const parsed = parseEnvUnsetArgs(args);
|
|
178
|
-
assertAllowedKey(parsed.key);
|
|
179
135
|
const prev = process.env[parsed.key];
|
|
180
136
|
delete process.env[parsed.key];
|
|
181
137
|
log.warn('env_unset', undefined, {
|
|
@@ -183,11 +139,7 @@ exports.envUnsetTool = {
|
|
|
183
139
|
key: parsed.key,
|
|
184
140
|
prevSet: prev !== undefined,
|
|
185
141
|
});
|
|
186
|
-
const prevStr = prev === undefined
|
|
187
|
-
? '(unset)'
|
|
188
|
-
: isSensitiveKeyName(parsed.key)
|
|
189
|
-
? redactValue(String(prev))
|
|
190
|
-
: String(prev);
|
|
142
|
+
const prevStr = prev === undefined ? '(unset)' : String(prev);
|
|
191
143
|
return (0, tool_1.toolSuccess)(`ok: ${parsed.key}\nprev: ${prevStr}\nnext: (unset)`);
|
|
192
144
|
},
|
|
193
145
|
};
|
|
@@ -84,6 +84,10 @@ function renderToolsetManual(input) {
|
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
86
|
const sections = [];
|
|
87
|
+
const notice = meta.manualNoticeI18n?.[input.language]?.trim();
|
|
88
|
+
if (notice) {
|
|
89
|
+
sections.push(notice);
|
|
90
|
+
}
|
|
87
91
|
if (missingTopics.length > 0) {
|
|
88
92
|
sections.push(renderMissingTopicsWarning(input.language, input.toolsetId, missingTopics));
|
|
89
93
|
}
|
package/dist/tools/mcp.d.ts
CHANGED
package/dist/tools/mcp.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Local MCP supervisor control tools for testing and operations.
|
|
6
6
|
*/
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
exports.mcpLeaseReminderOwner = exports.mcpReleaseTool = exports.mcpRestartTool = void 0;
|
|
8
|
+
exports.mcpLeaseReminderOwner = exports.mcpDisableTool = exports.mcpReleaseTool = exports.mcpRestartTool = void 0;
|
|
9
9
|
const log_1 = require("../log");
|
|
10
10
|
const supervisor_1 = require("../mcp/supervisor");
|
|
11
11
|
const driver_messages_1 = require("../runtime/driver-messages");
|
|
@@ -27,6 +27,13 @@ function parseMcpReleaseArgs(args) {
|
|
|
27
27
|
}
|
|
28
28
|
return { serverId };
|
|
29
29
|
}
|
|
30
|
+
function parseMcpDisableArgs(args) {
|
|
31
|
+
const serverId = args.serverId;
|
|
32
|
+
if (typeof serverId !== 'string' || !serverId.trim()) {
|
|
33
|
+
throw new Error(`mcp_disable.serverId must be a non-empty string`);
|
|
34
|
+
}
|
|
35
|
+
return { serverId };
|
|
36
|
+
}
|
|
30
37
|
function isMcpLeaseReminderMeta(value) {
|
|
31
38
|
if (!isRecord(value) || Array.isArray(value))
|
|
32
39
|
return false;
|
|
@@ -39,7 +46,7 @@ const mcpRestartSchema = {
|
|
|
39
46
|
properties: {
|
|
40
47
|
serverId: {
|
|
41
48
|
type: 'string',
|
|
42
|
-
description: "MCP server id from `.minds/mcp.yaml` (e.g., 'sdk_stdio').
|
|
49
|
+
description: "MCP server id from `.minds/mcp.yaml` (e.g., 'sdk_stdio'). Enables the server if needed, then restarts this server only.",
|
|
43
50
|
},
|
|
44
51
|
},
|
|
45
52
|
required: ['serverId'],
|
|
@@ -56,13 +63,24 @@ const mcpReleaseSchema = {
|
|
|
56
63
|
required: ['serverId'],
|
|
57
64
|
additionalProperties: false,
|
|
58
65
|
};
|
|
66
|
+
const mcpDisableSchema = {
|
|
67
|
+
type: 'object',
|
|
68
|
+
properties: {
|
|
69
|
+
serverId: {
|
|
70
|
+
type: 'string',
|
|
71
|
+
description: "MCP server id from `.minds/mcp.yaml` (e.g., 'playwright'). Stops any loaded runtime/leases and writes servers.<id>.enabled=false.",
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
required: ['serverId'],
|
|
75
|
+
additionalProperties: false,
|
|
76
|
+
};
|
|
59
77
|
exports.mcpRestartTool = {
|
|
60
78
|
type: 'func',
|
|
61
79
|
name: 'mcp_restart',
|
|
62
|
-
description: '
|
|
80
|
+
description: 'Enable a configured MCP server if needed, then restart it using the current `.minds/mcp.yaml` config.',
|
|
63
81
|
descriptionI18n: {
|
|
64
|
-
en: '
|
|
65
|
-
zh: '
|
|
82
|
+
en: 'Enable a configured MCP server if needed, then restart it using the current `.minds/mcp.yaml` config.',
|
|
83
|
+
zh: '按需启用指定 MCP 服务器,然后使用当前 `.minds/mcp.yaml` 配置重启它。',
|
|
66
84
|
},
|
|
67
85
|
parameters: mcpRestartSchema,
|
|
68
86
|
argsValidation: 'dominds',
|
|
@@ -126,6 +144,38 @@ exports.mcpReleaseTool = {
|
|
|
126
144
|
return (0, tool_1.toolSuccess)(`ok: released ${parsed.serverId} for dialog ${dialogKey}`);
|
|
127
145
|
},
|
|
128
146
|
};
|
|
147
|
+
exports.mcpDisableTool = {
|
|
148
|
+
type: 'func',
|
|
149
|
+
name: 'mcp_disable',
|
|
150
|
+
description: 'Disable a configured MCP server, clear its loaded runtime/leases, and persist enabled=false in `.minds/mcp.yaml`.',
|
|
151
|
+
descriptionI18n: {
|
|
152
|
+
en: 'Disable a configured MCP server, clear its loaded runtime/leases, and persist enabled=false in `.minds/mcp.yaml`.',
|
|
153
|
+
zh: '禁用指定 MCP 服务器,清理其已加载运行时/租约,并在 `.minds/mcp.yaml` 中持久写入 enabled=false。',
|
|
154
|
+
},
|
|
155
|
+
parameters: mcpDisableSchema,
|
|
156
|
+
argsValidation: 'dominds',
|
|
157
|
+
call: async (_dlg, caller, args) => {
|
|
158
|
+
const parsed = parseMcpDisableArgs(args);
|
|
159
|
+
const res = await (0, supervisor_1.requestMcpServerDisable)(parsed.serverId);
|
|
160
|
+
if (res.ok) {
|
|
161
|
+
log.info('mcp_disable', undefined, {
|
|
162
|
+
caller: caller.id,
|
|
163
|
+
serverId: parsed.serverId,
|
|
164
|
+
ok: true,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
log.warn('mcp_disable failed', undefined, {
|
|
169
|
+
caller: caller.id,
|
|
170
|
+
serverId: parsed.serverId,
|
|
171
|
+
ok: false,
|
|
172
|
+
errorText: res.errorText,
|
|
173
|
+
});
|
|
174
|
+
return (0, tool_1.toolFailure)(`error: ${res.errorText}`);
|
|
175
|
+
}
|
|
176
|
+
return (0, tool_1.toolSuccess)(`ok: disabled ${parsed.serverId} and set enabled=false`);
|
|
177
|
+
},
|
|
178
|
+
};
|
|
129
179
|
exports.mcpLeaseReminderOwner = {
|
|
130
180
|
name: 'mcpLease',
|
|
131
181
|
async updateReminder(dlg, reminder) {
|
package/dist/tools/os.js
CHANGED
|
@@ -403,7 +403,7 @@ function stripDaemonLifecyclePhaseSummary(content) {
|
|
|
403
403
|
function getOsToolMessages(language) {
|
|
404
404
|
if (language === 'zh') {
|
|
405
405
|
return {
|
|
406
|
-
daemonStarted: (pid, timeoutSeconds, command) => `🟢 ${command} 已转入后台持续运行(PID: ${pid})\n该进程在 ${timeoutSeconds}
|
|
406
|
+
daemonStarted: (pid, timeoutSeconds, command) => `🟢 ${command} 已转入后台持续运行(PID: ${pid})\n该进程在 ${timeoutSeconds} 秒内未完成,现已作为守护进程继续执行。你将看到同一条生命周期提醒持续刷新:系统维护 / 实时真源 / 不可删除。\n\n需要时可使用 stop_daemon({"pid": ${pid}}) 终止该进程。`,
|
|
407
407
|
commandCompleted: (exitCode, scrollNotice) => `✅ 命令已完成(退出码:${exitCode ?? 'unknown'})${scrollNotice}\n\n`,
|
|
408
408
|
scrolledLinesNotice: (lines) => `\n⚠️ 执行期间有 ${lines} 行已滚出可视范围`,
|
|
409
409
|
stdoutLabel: '📤 stdout:',
|
|
@@ -418,7 +418,7 @@ function getOsToolMessages(language) {
|
|
|
418
418
|
};
|
|
419
419
|
}
|
|
420
420
|
return {
|
|
421
|
-
daemonStarted: (pid, timeoutSeconds, command) => `🟢 ${command} is now running in the background (PID: ${pid})\nThe process did not finish within ${timeoutSeconds} seconds and has transitioned into a daemon. You will see the same lifecycle
|
|
421
|
+
daemonStarted: (pid, timeoutSeconds, command) => `🟢 ${command} is now running in the background (PID: ${pid})\nThe process did not finish within ${timeoutSeconds} seconds and has transitioned into a daemon. You will see the same lifecycle reminder keep updating: system-maintained / live source of truth / not deletable.\n\nUse stop_daemon({"pid": ${pid}}) to terminate it when needed.`,
|
|
422
422
|
commandCompleted: (exitCode, scrollNotice) => `✅ Command completed (exit code: ${exitCode ?? 'unknown'})${scrollNotice}\n\n`,
|
|
423
423
|
scrolledLinesNotice: (lines) => `\n⚠️ ${lines} lines scrolled out of view during execution`,
|
|
424
424
|
stdoutLabel: '📤 stdout:',
|
|
@@ -1171,12 +1171,12 @@ exports.shellCmdReminderOwner = {
|
|
|
1171
1171
|
type: 'environment_msg',
|
|
1172
1172
|
role: 'user',
|
|
1173
1173
|
content: language === 'zh'
|
|
1174
|
-
? `${prefix}
|
|
1175
|
-
|
|
1174
|
+
? `${prefix} 后台进程生命周期提醒 [${reminder.id}]
|
|
1175
|
+
当前运行环境中有一条系统维护的后台进程状态提醒。请把它当成环境信号,不要当成你自己写的工作便签。若它没有实质改变你的判断/计划/风险,则禁止做任何用户可见回应(禁止写“静默吸收”“已收到”等占位语句);只有它实际影响后续动作时,才在下一条有实质内容的回复中体现相关事实。该提醒在进程运行期间会自动更新;进程结束后会保留终态,等待你确认后手动删除。
|
|
1176
1176
|
---
|
|
1177
1177
|
${reminder.content}`
|
|
1178
|
-
: `${prefix} Background process lifecycle
|
|
1179
|
-
|
|
1178
|
+
: `${prefix} Background process lifecycle reminder [${reminder.id}]
|
|
1179
|
+
The current runtime environment has a system-maintained background-process state reminder. Treat it as an environment signal, not as your self-authored work note. If it does not materially change your judgment/plan/risk, make no user-visible reply at all (do not send filler like "silently noted" or "received"); only reflect it inside the next substantive reply when it actually affects the next action. This reminder auto-updates while the process is running; after exit it keeps the terminal state until you delete it manually.
|
|
1180
1180
|
---
|
|
1181
1181
|
${reminder.content}`,
|
|
1182
1182
|
};
|
|
@@ -1193,12 +1193,12 @@ ${reminder.content}`,
|
|
|
1193
1193
|
type: 'environment_msg',
|
|
1194
1194
|
role: 'user',
|
|
1195
1195
|
content: language === 'zh'
|
|
1196
|
-
? `${prefix}
|
|
1197
|
-
|
|
1196
|
+
? `${prefix} 守护进程生命周期提醒 [${reminder.id}] - ${exitedSummary}|PID ${pid}
|
|
1197
|
+
当前运行环境中 daemon 已退出。若需要再核对最后 stdout/stderr,可先按需调用 get_daemon_output({ "pid": ${pid} });若该调用已不可用,则以下是最后一次已知快照。确认已知悉后,请手动删除这条提醒。
|
|
1198
1198
|
---
|
|
1199
1199
|
${reminder.content}`
|
|
1200
|
-
: `${prefix} Daemon lifecycle
|
|
1201
|
-
|
|
1200
|
+
: `${prefix} Daemon lifecycle reminder [${reminder.id}] - ${exitedSummary} | PID ${pid}
|
|
1201
|
+
The current runtime environment shows that this daemon has exited. If you still need to inspect the final stdout/stderr, first call get_daemon_output({ "pid": ${pid} }) if it is still available; otherwise use the last known snapshot below. After you have acknowledged the exit, delete this reminder manually.
|
|
1202
1202
|
---
|
|
1203
1203
|
${reminder.content}`,
|
|
1204
1204
|
};
|
|
@@ -1208,9 +1208,9 @@ ${reminder.content}`,
|
|
|
1208
1208
|
role: 'user',
|
|
1209
1209
|
content: language === 'zh'
|
|
1210
1210
|
? `${prefix} 进程生命周期提醒 [${reminder.id}] - 后台进程已结束(PID ${pid})
|
|
1211
|
-
|
|
1211
|
+
当前运行环境中该后台进程的生命周期已经结束,当前不再运行。`
|
|
1212
1212
|
: `${prefix} Process lifecycle reminder [${reminder.id}] - daemon terminated (PID ${pid})
|
|
1213
|
-
|
|
1213
|
+
The current runtime environment shows that this daemon process has finished its lifecycle and is no longer running.`,
|
|
1214
1214
|
};
|
|
1215
1215
|
}
|
|
1216
1216
|
if (resolved.kind === 'error') {
|
|
@@ -1233,13 +1233,13 @@ This daemon process has finished its lifecycle and is no longer running.`,
|
|
|
1233
1233
|
type: 'environment_msg',
|
|
1234
1234
|
role: 'user',
|
|
1235
1235
|
content: language === 'zh'
|
|
1236
|
-
? `🔄 ${prefix}
|
|
1237
|
-
|
|
1236
|
+
? `🔄 ${prefix} 守护进程生命周期提醒 [${reminder.id}] - ${runningSummary}|PID ${pid},已运行 ${uptimeStr}
|
|
1237
|
+
当前运行环境中 daemon 仍在运行。这是系统维护的状态提醒,不是默认需要单独汇报的事项。若下面的信息没有实质改变你的判断、计划、风险,且不需要调用守护进程相关工具,则禁止做任何用户可见回应;若它有实质影响,只在下一条有实质内容的回复中体现,禁止单独发送“静默吸收”“已收到”等占位语句。
|
|
1238
1238
|
|
|
1239
1239
|
**状态快照:**
|
|
1240
1240
|
${statusInfo}`
|
|
1241
|
-
: `🔄 ${prefix} Daemon lifecycle
|
|
1242
|
-
This is a system-maintained
|
|
1241
|
+
: `🔄 ${prefix} Daemon lifecycle reminder [${reminder.id}] - ${runningSummary} | PID ${pid}, uptime: ${uptimeStr}
|
|
1242
|
+
The current runtime environment shows that this daemon is still running. This is a system-maintained state reminder and not something that normally deserves a standalone mention. If the information below does not materially change your judgment, plan, risk, or require a daemon-management action, make no user-visible reply at all; if it does matter, reflect it only inside the next substantive reply instead of sending filler like "silently noted" or "received".
|
|
1243
1243
|
|
|
1244
1244
|
**State snapshot:**
|
|
1245
1245
|
${statusInfo}`,
|
|
@@ -37,12 +37,12 @@ function isPendingTellaskReminderMeta(value) {
|
|
|
37
37
|
function getPendingTellaskUpdateAltInstruction(language) {
|
|
38
38
|
return language === 'zh'
|
|
39
39
|
? '不要手改这条系统提醒。若要改变某一路诉请,只有长线诉请(`tellask` + `sessionSlug`)才能更新那一路诉请的“任务安排”:复用同一 `sessionSlug` 再发 `tellask`,让对应主理人按最新安排自行最终回复并自然结束。一次性诉请(`tellaskSessionless`)没有这个通道;新开一个 `tellaskSessionless` 只会再创建新的瞬态支线,不能要求旧主理人停止。其余情况等待系统按真实诉请状态自动刷新。'
|
|
40
|
-
: 'Do not hand-edit this system reminder. If you need to change one tellask, only a sessioned tellask (`tellask` + `sessionSlug`) can be updated in place: send another `tellask` with the same `sessionSlug` so the
|
|
40
|
+
: 'Do not hand-edit this system reminder. If you need to change one tellask, only a sessioned tellask (`tellask` + `sessionSlug`) can be updated in place: send another `tellask` with the same `sessionSlug` so the tellaskee can finish naturally under the latest assignment. A one-shot tellask (`tellaskSessionless`) has no such channel; another `tellaskSessionless` only creates a new transient Side Dialog and cannot tell the earlier owner to stop. Otherwise wait for system refresh from real tellask state.';
|
|
41
41
|
}
|
|
42
42
|
function getPendingTellaskDeleteAltInstruction(language) {
|
|
43
43
|
return language === 'zh'
|
|
44
44
|
? '这条系统提醒不可删除。若要改变某一路诉请,只有长线诉请(`tellask` + `sessionSlug`)才能更新那一路诉请的“任务安排”:复用同一 `sessionSlug` 再发 `tellask`,让对应主理人按最新安排自行最终回复并自然结束。一次性诉请(`tellaskSessionless`)没有这个通道;新开一个 `tellaskSessionless` 只会再创建新的瞬态支线,不能要求旧主理人停止。其余情况等待系统按真实诉请状态自动刷新。'
|
|
45
|
-
: 'This system reminder is not deletable. If you need to change one tellask, only a sessioned tellask (`tellask` + `sessionSlug`) can be updated in place: send another `tellask` with the same `sessionSlug` so the
|
|
45
|
+
: 'This system reminder is not deletable. If you need to change one tellask, only a sessioned tellask (`tellask` + `sessionSlug`) can be updated in place: send another `tellask` with the same `sessionSlug` so the tellaskee can finish naturally under the latest assignment. A one-shot tellask (`tellaskSessionless`) has no such channel; another `tellaskSessionless` only creates a new transient Side Dialog and cannot tell the earlier owner to stop. Otherwise wait for system refresh from real tellask state.';
|
|
46
46
|
}
|
|
47
47
|
function callKindLabel(language, view) {
|
|
48
48
|
if (view.callType === 'A') {
|
|
@@ -52,9 +52,7 @@ function callKindLabel(language, view) {
|
|
|
52
52
|
}
|
|
53
53
|
function pendingTargetLabel(language, view) {
|
|
54
54
|
if (view.callType === 'A') {
|
|
55
|
-
return language === 'zh'
|
|
56
|
-
? `上游诉请者 @${view.targetAgentId}`
|
|
57
|
-
: `upstream requester @${view.targetAgentId}`;
|
|
55
|
+
return language === 'zh' ? `诉请者 @${view.targetAgentId}` : `tellasker @${view.targetAgentId}`;
|
|
58
56
|
}
|
|
59
57
|
switch (view.callName) {
|
|
60
58
|
case 'freshBootsReasoning':
|
|
@@ -76,7 +74,14 @@ function summarizeTellask(view) {
|
|
|
76
74
|
}
|
|
77
75
|
function makePendingSignature(pending) {
|
|
78
76
|
return pending
|
|
79
|
-
.map((p) => [
|
|
77
|
+
.map((p) => [
|
|
78
|
+
p.sideDialogId,
|
|
79
|
+
p.targetAgentId,
|
|
80
|
+
p.callType,
|
|
81
|
+
p.callId,
|
|
82
|
+
p.sessionSlug ?? '',
|
|
83
|
+
summarizeTellask(p),
|
|
84
|
+
].join('|'))
|
|
80
85
|
.sort()
|
|
81
86
|
.join('||');
|
|
82
87
|
}
|
|
@@ -117,7 +122,7 @@ function buildReminderContent(language, pending) {
|
|
|
117
122
|
}
|
|
118
123
|
const summary = language === 'zh'
|
|
119
124
|
? '以下诉请仍在执行中;除这些条目外,当前没有其它仍在执行中的诉请。该提醒项只是系统状态窗,不是控制面:自动维护、不可手改,且在非 0 路进行中时不可删除。只有长线诉请(`tellask` + `sessionSlug`)才能更新“任务安排”;一次性诉请(`tellaskSessionless`)没有这个通道。新开一个 `tellaskSessionless` 只会再创建新的瞬态支线,不会影响旧支线继续执行,更不能要求旧主理人停止。若某一路长线诉请的要求变化,才可复用同一 `sessionSlug` 再发 `tellask`,让对应主理人按最新安排自行最终回复并自然结束。误删会被拒绝,并返回同样的引导文案。'
|
|
120
|
-
: 'Only the Tellasks listed below are still in flight; besides them, no other Tellasks are currently executing. This reminder is only a system status window, not a control surface: auto-maintained, not hand-editable, and non-deletable while any tellask is still active. Only a sessioned tellask (`tellask` + `sessionSlug`) has an assignment-update channel; a one-shot tellask (`tellaskSessionless`) does not. Opening another `tellaskSessionless` only creates another transient
|
|
125
|
+
: 'Only the Tellasks listed below are still in flight; besides them, no other Tellasks are currently executing. This reminder is only a system status window, not a control surface: auto-maintained, not hand-editable, and non-deletable while any tellask is still active. Only a sessioned tellask (`tellask` + `sessionSlug`) has an assignment-update channel; a one-shot tellask (`tellaskSessionless`) does not. Opening another `tellaskSessionless` only creates another transient Side Dialog; it does not affect the earlier one and cannot tell the earlier owner to stop. If a sessioned tellask needs to change, reuse the same `sessionSlug` in another `tellask` so the tellaskee can finish naturally under the latest assignment. Mistaken deletion will be rejected with the same guidance.';
|
|
121
126
|
const lines = pending.map((p, idx) => {
|
|
122
127
|
const base = language === 'zh'
|
|
123
128
|
? `${idx + 1}. ${pendingTargetLabel(language, p)} | ${callKindLabel(language, p)} | ${summarizeTellask(p)}`
|
|
@@ -148,17 +153,18 @@ function assertSingleOwnedReminder(dlg) {
|
|
|
148
153
|
return indices[0] ?? null;
|
|
149
154
|
throw new Error(`pendingTellask reminder invariant violated: expected <=1 owner reminder, got ${indices.length} (dialog=${dlg.id.valueOf()})`);
|
|
150
155
|
}
|
|
151
|
-
async function
|
|
152
|
-
const pending = await persistence_1.DialogPersistence.
|
|
156
|
+
async function loadPendingSideDialogView(dlg) {
|
|
157
|
+
const pending = await persistence_1.DialogPersistence.loadPendingSideDialogs(dlg.id, dlg.status);
|
|
153
158
|
return await Promise.all(pending.map(async (p) => {
|
|
154
|
-
const
|
|
155
|
-
const latest = await persistence_1.DialogPersistence.loadDialogLatest(
|
|
159
|
+
const sideDialogId = new dialog_1.DialogID(p.sideDialogId, dlg.id.rootId);
|
|
160
|
+
const latest = await persistence_1.DialogPersistence.loadDialogLatest(sideDialogId, dlg.status);
|
|
156
161
|
return {
|
|
157
|
-
|
|
162
|
+
sideDialogId: p.sideDialogId,
|
|
158
163
|
latestActivityAt: latest?.lastModified ?? p.createdAt,
|
|
159
164
|
mentionList: p.mentionList,
|
|
160
165
|
tellaskContent: p.tellaskContent,
|
|
161
166
|
targetAgentId: p.targetAgentId,
|
|
167
|
+
callId: p.callId,
|
|
162
168
|
callType: p.callType,
|
|
163
169
|
callName: p.callName,
|
|
164
170
|
sessionSlug: p.sessionSlug,
|
|
@@ -172,7 +178,7 @@ async function withDialogLockIfNeeded(dlg, fn) {
|
|
|
172
178
|
return await dlg.withLock(fn);
|
|
173
179
|
}
|
|
174
180
|
async function syncPendingTellaskReminderState(dlg) {
|
|
175
|
-
const pending = await
|
|
181
|
+
const pending = await loadPendingSideDialogView(dlg);
|
|
176
182
|
return await withDialogLockIfNeeded(dlg, async () => {
|
|
177
183
|
const reminderIndex = assertSingleOwnedReminder(dlg);
|
|
178
184
|
const language = (0, work_language_1.getWorkLanguage)();
|
|
@@ -210,7 +216,7 @@ exports.pendingTellaskReminderOwner = {
|
|
|
210
216
|
if (reminder.owner !== exports.pendingTellaskReminderOwner) {
|
|
211
217
|
return { treatment: 'keep' };
|
|
212
218
|
}
|
|
213
|
-
const pending = await
|
|
219
|
+
const pending = await loadPendingSideDialogView(dlg);
|
|
214
220
|
const language = (0, work_language_1.getWorkLanguage)();
|
|
215
221
|
const updatedContent = buildReminderContent(language, pending);
|
|
216
222
|
const currentMeta = isPendingTellaskReminderMeta(reminder.meta) ? reminder.meta : undefined;
|
|
@@ -29,7 +29,7 @@ control is Dominds' **dialog control toolset** for managing dialog state, remind
|
|
|
29
29
|
- **Reminder management**: Two reminder scopes. Default to dialog-local working set; use `personal` only for responsibility-linked notes that you should keep seeing in all later dialogs you lead
|
|
30
30
|
- **Taskdoc operations**: Update task contracts (goals/constraints/progress); within Taskdoc, `progress` is the team-shared, quasi-real-time, scannable task bulletin board
|
|
31
31
|
- **Context maintenance**: Reduce cognitive load without losing key resume state
|
|
32
|
-
- **Reply routing**: Separate `tellaskBack`, `replyTellask*`, and plain text by responsibility in
|
|
32
|
+
- **Reply routing**: Separate `tellaskBack`, `replyTellask*`, and plain text by responsibility in Side Dialog / ask-back flows
|
|
33
33
|
|
|
34
34
|
## Quick Navigation
|
|
35
35
|
|
|
@@ -46,7 +46,7 @@ Default to `dialog`. Use `personal` only when you should keep seeing that note i
|
|
|
46
46
|
| Feature | dialog reminder | personal reminder | personal memory |
|
|
47
47
|
|---------|-----------------|-------------------|-----------------|
|
|
48
48
|
| Persistence | Current dialog only | Across all later dialogs you lead | Long-term / file-backed |
|
|
49
|
-
| Visibility | Current dialog | Current
|
|
49
|
+
| Visibility | Current dialog | Current Dialog Responder | Current agent |
|
|
50
50
|
| Best for | Current next step, blocker, volatile clue | Responsibility-linked operating cue | Stable facts / reusable knowledge |
|
|
51
51
|
|
|
52
52
|
### 1.1 Scope Choice Rule
|
|
@@ -92,21 +92,21 @@ Taskdoc is a **task contract** and the task's **team-shared source of current tr
|
|
|
92
92
|
|
|
93
93
|
### Decision Rules
|
|
94
94
|
|
|
95
|
-
- If the current
|
|
96
|
-
- Call `tellaskBack({ tellaskContent })` only when
|
|
95
|
+
- If the current Side Dialog is unfinished, first judge whether team SOP / role ownership already identifies the responsible owner; if yes and the issue is execution work, directly use `tellask` / `tellaskSessionless` for that owner
|
|
96
|
+
- Call `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
|
|
97
97
|
- If a human must personally perform login / GUI / captcha / high-risk authorization: call `askHuman({ tellaskContent })`
|
|
98
|
-
- If the current
|
|
99
|
-
- If the current
|
|
100
|
-
- If you are answering
|
|
98
|
+
- If the current Side Dialog is complete and the assignment header says `replyTellask`: call `replyTellask({ replyContent })`
|
|
99
|
+
- If the current Side Dialog is complete and the assignment header says `replyTellaskSessionless`: call `replyTellaskSessionless({ replyContent })`
|
|
100
|
+
- If you are answering a tellasker `tellaskBack` follow-up and runtime exposes `replyTellaskBack`: call `replyTellaskBack({ replyContent })`
|
|
101
101
|
- Plain text is not the normal completion channel for inter-dialog delivery; if you emit plain text instead of the reply tool, runtime may temporarily inject a `role=user` reminder telling you to use the correct reply function
|
|
102
102
|
|
|
103
103
|
### Low-Burden Rule
|
|
104
104
|
|
|
105
|
-
- Focus on doing the current task correctly first; use `reply*` only when final
|
|
105
|
+
- Focus on doing the current task correctly first; use `reply*` only when final tellasker delivery is actually ready
|
|
106
106
|
- Do not memorize reply variants by yourself; follow the current assignment header and the function currently exposed by runtime
|
|
107
107
|
- `reply*` tool descriptions are intentionally minimal and spec-like; use this manual's principles / scenarios for situational guidance
|
|
108
108
|
- If runtime exposes only one `reply*`, that is the only correct completion path for the current state
|
|
109
|
-
- `tellaskBack` is
|
|
109
|
+
- `tellaskBack` is valid only when ownership cannot be determined from existing SOP, or when the tellasker must answer; it is not the default first move for every blocked state
|
|
110
110
|
|
|
111
111
|
## Best Practices
|
|
112
112
|
|