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
|
@@ -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/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/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
|
|
|
@@ -51,11 +51,11 @@ delete_reminder({
|
|
|
51
51
|
- If the information should synchronize the whole team's current effective state, put it in Taskdoc `progress` instead
|
|
52
52
|
- If the note is durable knowledge rather than an active working-set cue, move it to `personal_memory` instead
|
|
53
53
|
|
|
54
|
-
## Scenario 2:
|
|
54
|
+
## Scenario 2: Side Dialog is complete, and the assignment header requires replyTellask
|
|
55
55
|
|
|
56
56
|
### Scenario Description
|
|
57
57
|
|
|
58
|
-
The current
|
|
58
|
+
The current Side Dialog is finished, and the assignment header explicitly says "when complete, call `replyTellask`".
|
|
59
59
|
|
|
60
60
|
### Example
|
|
61
61
|
|
|
@@ -72,11 +72,11 @@ replyTellask({
|
|
|
72
72
|
- Put the final deliverable body directly in `replyContent`
|
|
73
73
|
- If the header says `replyTellaskSessionless`, use the same shape with that exact function name
|
|
74
74
|
|
|
75
|
-
## Scenario 3: Work is not finished yet, and
|
|
75
|
+
## Scenario 3: Work is not finished yet, and tellasker clarification is required
|
|
76
76
|
|
|
77
77
|
### Scenario Description
|
|
78
78
|
|
|
79
|
-
The
|
|
79
|
+
The Side Dialog is still blocked or incomplete, so you need to ask the tellasker for missing information.
|
|
80
80
|
|
|
81
81
|
### Example
|
|
82
82
|
|
|
@@ -89,15 +89,15 @@ tellaskBack({
|
|
|
89
89
|
|
|
90
90
|
### Key Points
|
|
91
91
|
|
|
92
|
-
- This example uses `tellaskBack` because
|
|
92
|
+
- This example uses `tellaskBack` because tellasker input is specifically required
|
|
93
93
|
- If team SOP / role ownership already identifies the responsible executor, directly use `tellask` / `tellaskSessionless` for that owner instead of mapping every unfinished state to `tellaskBack`
|
|
94
94
|
- Do not use `replyTellask*` for intermediate clarifications
|
|
95
95
|
|
|
96
|
-
## Scenario 4:
|
|
96
|
+
## Scenario 4: Tellasker answered the ask-back, so use replyTellaskBack to close
|
|
97
97
|
|
|
98
98
|
### Scenario Description
|
|
99
99
|
|
|
100
|
-
You previously sent a `tellaskBack`,
|
|
100
|
+
You previously sent a `tellaskBack`, the tellasker has now replied, and runtime exposes `replyTellaskBack`.
|
|
101
101
|
|
|
102
102
|
### Example
|
|
103
103
|
|
|
@@ -23,16 +23,16 @@
|
|
|
23
23
|
|
|
24
24
|
The **tool descriptions themselves** for these functions intentionally stay minimal and spec-like. This section carries the smallest practical lookup for when they appear and how to choose among them.
|
|
25
25
|
|
|
26
|
-
| Function | Minimal parameter contract | When runtime exposes it
|
|
27
|
-
| ------------------------- | ---------------------------- |
|
|
28
|
-
| `replyTellask` | `{ replyContent: string }` | Current
|
|
29
|
-
| `replyTellaskSessionless` | `{ replyContent: string }` | Current
|
|
30
|
-
| `replyTellaskBack` | `{ replyContent: string }` | Current dialog holds an unresolved `tellaskBack` reply directive
|
|
31
|
-
| `tellaskBack` | `{ tellaskContent: string }` | Current
|
|
26
|
+
| Function | Minimal parameter contract | When runtime exposes it | Effect |
|
|
27
|
+
| ------------------------- | ---------------------------- | ----------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- |
|
|
28
|
+
| `replyTellask` | `{ replyContent: string }` | Current Side Dialog comes from a sessioned `tellask` and is ready for final delivery | Delivers the final result for the current tellask session |
|
|
29
|
+
| `replyTellaskSessionless` | `{ replyContent: string }` | Current Side Dialog comes from a one-shot `tellaskSessionless` and is ready for final delivery | Delivers the final result for the current one-shot tellask |
|
|
30
|
+
| `replyTellaskBack` | `{ replyContent: string }` | Current dialog holds an unresolved `tellaskBack` reply directive | Delivers the final answer to the tellasker ask-back |
|
|
31
|
+
| `tellaskBack` | `{ tellaskContent: string }` | Current Side Dialog must ask the tellasker back, and existing team SOP cannot directly assign another owner | Sends a follow-up request to the tellasker; not final delivery |
|
|
32
32
|
|
|
33
33
|
### Minimal Usage Rules
|
|
34
34
|
|
|
35
|
-
- Focus on doing the current task correctly first; only move into `reply*` closure when final
|
|
35
|
+
- Focus on doing the current task correctly first; only move into `reply*` closure when final tellasker delivery is actually ready
|
|
36
36
|
- Call whichever `reply*` runtime currently exposes; do not switch to another reply variant by yourself
|
|
37
37
|
- If the assignment header explicitly names a reply function, follow that exact name
|
|
38
38
|
- Put only the final deliverable body in `replyContent`; do not wrap it in meta-explanations like "I am now calling replyTellask"
|
|
@@ -93,20 +93,20 @@
|
|
|
93
93
|
### 决策规则
|
|
94
94
|
|
|
95
95
|
- 当前支线未完成时,先判断团队规程 / SOP / 职责卡能否明确负责人;若能明确且属于执行性处理,直接 `tellask` / `tellaskSessionless` 对应负责人
|
|
96
|
-
-
|
|
96
|
+
- 只有当必须向诉请者补需求、澄清目标、裁决取舍、确认验收口径、提供缺失输入,或现有规程无法明确判责时:调用 `tellaskBack({ tellaskContent })`
|
|
97
97
|
- 需要人类亲自登录 / GUI / 验证码 / 高风险授权时:调用 `askHuman({ tellaskContent })`
|
|
98
98
|
- 当前支线已经完成,且当前 assignment 明确要求 `replyTellask`:调用 `replyTellask({ replyContent })`
|
|
99
99
|
- 当前支线已经完成,且当前 assignment 明确要求 `replyTellaskSessionless`:调用 `replyTellaskSessionless({ replyContent })`
|
|
100
|
-
-
|
|
100
|
+
- 当前是在回复一条诉请者发来的 `tellaskBack` 续诉请,且 runtime 暴露了 `replyTellaskBack`:调用 `replyTellaskBack({ replyContent })`
|
|
101
101
|
- 普通文本不是跨对话完成交付通道;如果你直接输出正文而没调 reply 工具,runtime 可能临时插入一条 `role=user` 的提醒要求你改用正确的 reply 函数
|
|
102
102
|
|
|
103
103
|
### 心智负担最小化规则
|
|
104
104
|
|
|
105
|
-
- 先专注把当前任务做对;`reply*`
|
|
105
|
+
- 先专注把当前任务做对;`reply*` 只在最终对诉请者交付时用于收口
|
|
106
106
|
- 不要靠记忆硬选 reply 变体;以当前 assignment 头部和 runtime 当前暴露的函数名为准
|
|
107
107
|
- `reply*` 函数自身说明文案故意保持极简,只承载最小规格;情景判断看本手册的 principles / scenarios
|
|
108
108
|
- 若 runtime 只暴露一个 `reply*`,那就是当前应调用的唯一完成路径
|
|
109
|
-
- `tellaskBack`
|
|
109
|
+
- `tellaskBack` 只在“无法按现有规程明确判责,或必须回问诉请者”时成立,不是所有阻塞的默认第一动作
|
|
110
110
|
|
|
111
111
|
## 最佳实践
|
|
112
112
|
|
|
@@ -71,11 +71,11 @@ replyTellask({
|
|
|
71
71
|
- `replyContent` 直接放最终交付正文
|
|
72
72
|
- 若 assignment 头部写的是 `replyTellaskSessionless`,则同结构替换函数名
|
|
73
73
|
|
|
74
|
-
## 场景 3
|
|
74
|
+
## 场景 3:当前未完成,需要回问诉请者
|
|
75
75
|
|
|
76
76
|
### 场景描述
|
|
77
77
|
|
|
78
|
-
|
|
78
|
+
当前支线仍未完成,因此需要向诉请者补问缺失信息。
|
|
79
79
|
|
|
80
80
|
### 示例
|
|
81
81
|
|
|
@@ -84,12 +84,12 @@ tellaskBack({
|
|
|
84
84
|
tellaskContent: '还缺少生产环境端口与部署入口信息。请补充这两项后我再继续给出最终方案。',
|
|
85
85
|
});
|
|
86
86
|
|
|
87
|
-
//
|
|
87
|
+
// 等诉请者补充后,runtime 会在当前对话里继续推进
|
|
88
88
|
```
|
|
89
89
|
|
|
90
90
|
### 关键点
|
|
91
91
|
|
|
92
|
-
-
|
|
92
|
+
- 这里只是“必须向诉请者补输入”的例子,所以用 `tellaskBack`
|
|
93
93
|
- 若团队规程 / SOP / 职责卡已经能明确执行负责人,应直接 `tellask` / `tellaskSessionless` 对应负责人,而不是机械因为“未完成态”就用 `tellaskBack`
|
|
94
94
|
- `tellaskBack` 只负责把问题问回去,不负责最终交付
|
|
95
95
|
|
|
@@ -97,7 +97,7 @@ tellaskBack({
|
|
|
97
97
|
|
|
98
98
|
### 场景描述
|
|
99
99
|
|
|
100
|
-
你之前发过 `tellaskBack
|
|
100
|
+
你之前发过 `tellaskBack`,诉请者现在补回了所需信息,runtime 暴露了 `replyTellaskBack`。
|
|
101
101
|
|
|
102
102
|
### 示例
|
|
103
103
|
|
|
@@ -27,12 +27,12 @@
|
|
|
27
27
|
| ------------------------- | ---------------------------- | -------------------------------------------------------------------- | ----------------------------------- |
|
|
28
28
|
| `replyTellask` | `{ replyContent: string }` | 当前支线承接的是 sessioned `tellask`,且已进入可交付完成态 | 把最终结果回复给当前 `tellask` 会话 |
|
|
29
29
|
| `replyTellaskSessionless` | `{ replyContent: string }` | 当前支线承接的是 one-shot `tellaskSessionless`,且已进入可交付完成态 | 把最终结果回复给当前一次性诉请 |
|
|
30
|
-
| `replyTellaskBack` | `{ replyContent: string }` | 当前对话持有一条未完成的 `tellaskBack` 回复指令 |
|
|
31
|
-
| `tellaskBack` | `{ tellaskContent: string }` |
|
|
30
|
+
| `replyTellaskBack` | `{ replyContent: string }` | 当前对话持有一条未完成的 `tellaskBack` 回复指令 | 把对上一条回问的最终答复送回诉请者 |
|
|
31
|
+
| `tellaskBack` | `{ tellaskContent: string }` | 当前支线必须回问诉请者,且现有团队规程无法直接判责到其他负责人 | 向诉请者发起续诉请,不算最终交付 |
|
|
32
32
|
|
|
33
33
|
### 最小使用规则
|
|
34
34
|
|
|
35
|
-
-
|
|
35
|
+
- 先专注把当前任务做对;只有真到最终对诉请者交付时,才进入 `reply*` 收口
|
|
36
36
|
- 看见哪一个 `reply*` 被 runtime 暴露,就调用哪一个;不要自行改选别的 reply 变体
|
|
37
37
|
- assignment 头部若已点名 reply 函数名,以那个名字为准
|
|
38
38
|
- `replyContent` 只放最终交付正文,不要再包一层“我现在调用了 replyXXX”
|
|
@@ -103,7 +103,7 @@ Maintain shared terminology and standard wording across the team.
|
|
|
103
103
|
add_team_memory({
|
|
104
104
|
path: 'team/glossary/dialog-terms',
|
|
105
105
|
content:
|
|
106
|
-
'## Dialog Terms\n\n- In user-facing copy, prefer:
|
|
106
|
+
'## Dialog Terms\n\n- In user-facing copy, prefer: Main Dialog / Side Dialog\n- In implementation context, main dialog / sideDialog / askerDialog are acceptable\n- Do not surface implementation terms directly into user-facing copy',
|
|
107
107
|
});
|
|
108
108
|
```
|
|
109
109
|
|
|
@@ -103,7 +103,7 @@ add_team_memory({
|
|
|
103
103
|
add_team_memory({
|
|
104
104
|
path: 'team/glossary/dialog-terms',
|
|
105
105
|
content:
|
|
106
|
-
'## 对话术语\n\n- 用户面向文案优先使用:主线对话 / 支线对话\n- 实现上下文可使用:main dialog /
|
|
106
|
+
'## 对话术语\n\n- 用户面向文案优先使用:主线对话 / 支线对话\n- 实现上下文可使用:main dialog / sideDialog / askerDialog\n- 不要把实现术语直接裸露到用户可见 copy',
|
|
107
107
|
});
|
|
108
108
|
```
|
|
109
109
|
|
|
@@ -114,7 +114,7 @@ async function renderTeamMgmtGuideContent(language, topicsRaw = []) {
|
|
|
114
114
|
'`model_param_options` 可选:用于记录该 provider 支持的 `.minds/team.yaml model_params` 选项(文档用途)。',
|
|
115
115
|
'`apiQuirks` 可选:写在 `providers.<providerKey>.apiQuirks`,类型是 `string|string[]`。它是 provider 级 transport / 网关兼容开关,用来描述“这个供应商/网关的 API 有非标准行为”,不是 `.minds/team.yaml` 的成员参数,也不是 `model_params`。',
|
|
116
116
|
'使用原则:只有在你确认某个上游网关确实偏离了标准协议,而且 Dominds 已为这个偏差实现了命名 quirk 时才配置;不要把它当作随意调参入口。当前实现里,未知 quirk 值通常不会报错,但也不会带来任何效果。',
|
|
117
|
-
'当前已知示例:OpenAI Responses 包装层支持 `apiQuirks: xcode.best`(或数组里包含它)。它一方面会把供应商额外发出的 `keepalive` 流事件识别为 heartbeat,而不是当作异常事件处理;另一方面也会对该网关特有的失败模式做 provider-specific failure handling,包括“同一对话上下文连续返回 empty response”时先做少量临时重试;如果在同一未变化上下文里连续达到阈值,就判定这是 provider 侧 same-context deadlock,而不是普通基础设施抖动:此时继续沿用同一上下文自动重试大概率仍然不会有真实进展,必须引入新的信息或新的指令(例如补充上下文、改写问题、换一个切入方式,或在确实需要人类判断时调用 askHuman)。这类 provider/API retry 状态在同一次 driver 自动续跑链里会继续沿用,不因中途换 course 而自动清零;若当前对话启用了鞭策,driver 也会优先判断是否能按鞭策逻辑直接续跑一次,而不是先落入 stopped,并且一旦 driver 接受这次自动恢复资格,就会立刻记作已消费;这里的恢复语义是“deadlock break”而不是普通空转鞭策,所以即使当前轮次已经登记了在途诉请/支线对话,也不会仅因 pending
|
|
117
|
+
'当前已知示例:OpenAI Responses 包装层支持 `apiQuirks: xcode.best`(或数组里包含它)。它一方面会把供应商额外发出的 `keepalive` 流事件识别为 heartbeat,而不是当作异常事件处理;另一方面也会对该网关特有的失败模式做 provider-specific failure handling,包括“同一对话上下文连续返回 empty response”时先做少量临时重试;如果在同一未变化上下文里连续达到阈值,就判定这是 provider 侧 same-context deadlock,而不是普通基础设施抖动:此时继续沿用同一上下文自动重试大概率仍然不会有真实进展,必须引入新的信息或新的指令(例如补充上下文、改写问题、换一个切入方式,或在确实需要人类判断时调用 askHuman)。这类 provider/API retry 状态在同一次 driver 自动续跑链里会继续沿用,不因中途换 course 而自动清零;若当前对话启用了鞭策,driver 也会优先判断是否能按鞭策逻辑直接续跑一次,而不是先落入 stopped,并且一旦 driver 接受这次自动恢复资格,就会立刻记作已消费;这里的恢复语义是“deadlock break”而不是普通空转鞭策,所以即使当前轮次已经登记了在途诉请/支线对话,也不会仅因 pending sideDialog 就否决这一次恢复;以及把网关返回的 HTML 版 502 Bad Gateway 错误页和 `500 auth_unavailable: no auth available` 这类基础设施失败归类为 conservative 策略重试。最小示例:\n```yaml\nproviders:\n my_gateway:\n apiType: openai\n baseUrl: https://example.invalid/v1\n apiKeyEnvVar: MY_GATEWAY_API_KEY\n apiQuirks: xcode.best\n models:\n my_model: { name: "upstream-model-id" }\n```',
|
|
118
118
|
'边界提醒:`apiQuirks` 只影响实现里显式消费它的 provider/generator。就当前实现看,至少 OpenAI Responses 路径会读取它;不要假设所有 `apiType` 都支持或需要它。若配置后行为仍异常,应继续检查上游网关文档、抓流事件类型,并结合 `team_mgmt_check_provider(...)` / 运行日志排查。',
|
|
119
119
|
])
|
|
120
120
|
: fmtHeader('.minds/llm.yaml') +
|
|
@@ -128,7 +128,7 @@ async function renderTeamMgmtGuideContent(language, topicsRaw = []) {
|
|
|
128
128
|
'Optional: `model_param_options` documents `.minds/team.yaml model_params` knobs (documentation only).',
|
|
129
129
|
'`apiQuirks` is optional under `providers.<providerKey>.apiQuirks`, with type `string|string[]`. It is a provider-level transport / gateway compatibility switch for non-standard upstream API behavior. It is not a `.minds/team.yaml` member field and not part of `model_params`.',
|
|
130
130
|
'Use it only when you have confirmed that an upstream gateway deviates from the expected protocol and Dominds has an explicitly named quirk for that deviation. Do not treat it as a generic tuning field. In the current implementation, unknown quirk values are usually ignored rather than rejected, so a typo may silently do nothing.',
|
|
131
|
-
'Known current example: the OpenAI Responses wrapper supports `apiQuirks: xcode.best` (or an array containing it). It not only treats vendor-emitted `keepalive` stream events as heartbeat events instead of unexpected protocol noise, but also applies provider-specific failure handling for gateway-specific failures, including repeated empty responses in the same unchanged dialog context (a few temporary retries first; once the unchanged-context streak reaches the threshold, Dominds treats it as a provider-side same-context deadlock rather than ordinary infrastructure flakiness, which means repeating the same automatic retry path is no longer expected to make real progress and fresh information or fresh instructions are required, such as adding context, reframing the ask, changing the angle, or calling askHuman when human judgment is genuinely needed; this provider/API retry state intentionally continues across course changes within the same driver auto-continue chain; if Diligence Push is enabled for the dialog, the driver will first see whether it can continue once through that path before falling into stopped, and that recovery budget is considered consumed as soon as the driver accepts that path; this is a deadlock-break recovery rather than the ordinary idle-time Diligence Push, so a pending
|
|
131
|
+
'Known current example: the OpenAI Responses wrapper supports `apiQuirks: xcode.best` (or an array containing it). It not only treats vendor-emitted `keepalive` stream events as heartbeat events instead of unexpected protocol noise, but also applies provider-specific failure handling for gateway-specific failures, including repeated empty responses in the same unchanged dialog context (a few temporary retries first; once the unchanged-context streak reaches the threshold, Dominds treats it as a provider-side same-context deadlock rather than ordinary infrastructure flakiness, which means repeating the same automatic retry path is no longer expected to make real progress and fresh information or fresh instructions are required, such as adding context, reframing the ask, changing the angle, or calling askHuman when human judgment is genuinely needed; this provider/API retry state intentionally continues across course changes within the same driver auto-continue chain; if Diligence Push is enabled for the dialog, the driver will first see whether it can continue once through that path before falling into stopped, and that recovery budget is considered consumed as soon as the driver accepts that path; this is a deadlock-break recovery rather than the ordinary idle-time Diligence Push, so a pending sideDialog alone does not veto that one recovery injection) and gateway-returned HTML 502 Bad Gateway pages plus `500 auth_unavailable: no auth available` infrastructure failures classified into conservative retry. Minimal example:\n```yaml\nproviders:\n my_gateway:\n apiType: openai\n baseUrl: https://example.invalid/v1\n apiKeyEnvVar: MY_GATEWAY_API_KEY\n apiQuirks: xcode.best\n models:\n my_model: { name: "upstream-model-id" }\n```',
|
|
132
132
|
'Boundary reminder: `apiQuirks` only affects providers/generators that explicitly read it in code. In the current implementation, at least the OpenAI Responses path consumes it; do not assume every `apiType` supports or needs it. If behavior is still wrong after setting it, continue with upstream gateway docs, raw stream event inspection, and `team_mgmt_check_provider(...)` / runtime logs.',
|
|
133
133
|
]);
|
|
134
134
|
}
|
|
@@ -484,6 +484,7 @@ async function renderMcpManual(language) {
|
|
|
484
484
|
'支持热重载:编辑 `.minds/mcp.yaml` 后通常无需重启 Dominds;必要时用 `mcp_restart`。',
|
|
485
485
|
'默认按“每个对话租用一个 MCP 运行时实例”运行(更安全):某个对话首次使用该 server 时,可能为它启动/持有一个运行时实例(HTTP 连接或 stdio 进程),并添加 sticky reminder。确认当前对话不再需要该运行时实例后,用 `mcp_release` 释放。租约只表达运行时资源归属,不决定该 server 的全局工具注册/可见性;如确实是无状态服务器,可配置 `truely-stateless: true` 允许跨对话共享。',
|
|
486
486
|
'stdio 配置格式:`command` 必须是字符串(可执行命令),参数放在 `args`(string[],可省略,默认空数组)。`cwd` 可选(字符串):用于固定相对路径解析目录。',
|
|
487
|
+
'HTTP headers 支持三种值:字面量字符串、`{ env: NAME }`、`{ prefix: "Bearer ", env: NAME }`;认证 token 建议从环境变量读取,不要写死在 YAML。',
|
|
487
488
|
'用 `tools.whitelist/blacklist` 控制暴露的工具,用 `transform` 做命名变换。',
|
|
488
489
|
'常见坑:stdio transport 需要可执行命令路径正确,且受成员权限(目录 + 扩展名:`*_dirs/no_*_dirs/*_file_ext_names/no_*_file_ext_names`)约束;HTTP transport 需要服务可达(url/端口/网络)。',
|
|
489
490
|
'高频坑(stdio 路径):若未设置 `cwd`,相对路径按 Dominds 进程工作目录(通常 rtws 根目录)解析;建议显式配置 `cwd` 或直接使用绝对路径。`cwd` 必须存在且是目录。',
|
|
@@ -545,6 +546,10 @@ async function renderMcpManual(language) {
|
|
|
545
546
|
' truely-stateless: false',
|
|
546
547
|
' transport: streamable_http',
|
|
547
548
|
' url: http://127.0.0.1:3000/mcp',
|
|
549
|
+
' # headers:',
|
|
550
|
+
' # Authorization:',
|
|
551
|
+
' # prefix: "Bearer "',
|
|
552
|
+
' # env: MCP_AUTH_TOKEN',
|
|
548
553
|
' tools: { whitelist: [], blacklist: [] }',
|
|
549
554
|
' transform: []',
|
|
550
555
|
' manual:',
|
|
@@ -563,6 +568,7 @@ async function renderMcpManual(language) {
|
|
|
563
568
|
'Hot reload: edits usually apply without restarting Dominds; use `mcp_restart` when needed.',
|
|
564
569
|
"Default is per-dialog MCP runtime leasing (safer): a dialog's first use may start/hold one runtime instance for that server (an HTTP connection or stdio process), and first use adds a sticky reminder. Call `mcp_release` when you're sure the current dialog no longer needs that runtime instance. This lease is about runtime resource ownership only; tool registration/visibility still follows the latest global server instance. If the server is truly stateless, set `truely-stateless: true` to allow cross-dialog sharing.",
|
|
565
570
|
'Stdio shape: `command` must be a string executable; parameters go in `args` (string[], optional, defaults to empty). Optional `cwd` (string) fixes the working directory used for relative paths.',
|
|
571
|
+
'HTTP headers support three value forms: literal strings, `{ env: NAME }`, and `{ prefix: "Bearer ", env: NAME }`; keep auth tokens in env instead of hardcoding them in YAML.',
|
|
566
572
|
'Use `tools.whitelist/blacklist` for exposure control and `transform` for naming transforms.',
|
|
567
573
|
'Common pitfalls: stdio transport needs a correct executable/command path, and is subject to member permissions (directory + extension: `*_dirs/no_*_dirs/*_file_ext_names/no_*_file_ext_names`); HTTP transport requires the server URL to be reachable.',
|
|
568
574
|
'High-frequency pitfall (stdio paths): if `cwd` is omitted, relative paths are resolved from Dominds process cwd (usually rtws root). Prefer setting `cwd` explicitly or use absolute paths. `cwd` must exist and be a directory.',
|
|
@@ -624,6 +630,10 @@ async function renderMcpManual(language) {
|
|
|
624
630
|
' truely-stateless: false',
|
|
625
631
|
' transport: streamable_http',
|
|
626
632
|
' url: http://127.0.0.1:3000/mcp',
|
|
633
|
+
' # headers:',
|
|
634
|
+
' # Authorization:',
|
|
635
|
+
' # prefix: "Bearer "',
|
|
636
|
+
' # env: MCP_AUTH_TOKEN',
|
|
627
637
|
' tools: { whitelist: [], blacklist: [] }',
|
|
628
638
|
' transform: []',
|
|
629
639
|
' manual:',
|