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
|
@@ -1,23 +1,39 @@
|
|
|
1
1
|
import type { DialogDisplayState, DialogInterruptionReason } from '@longrun-ai/kernel/types/display-state';
|
|
2
|
-
import type { DialogDiligencePrompt, DialogPrompt, DialogRunControlSpec, DialogRuntimeGuidePrompt, DialogRuntimePrompt, DialogRuntimeReplyPrompt,
|
|
2
|
+
import type { DialogDiligencePrompt, DialogPrompt, DialogRunControlSpec, DialogRuntimeGuidePrompt, DialogRuntimePrompt, DialogRuntimeReplyPrompt, DialogRuntimeSideDialogPrompt, DialogUserPrompt } from '@longrun-ai/kernel/types/drive-intent';
|
|
3
3
|
import type { Dialog, DialogID } from '../../dialog';
|
|
4
4
|
export type KernelDriverRunControl = DialogRunControlSpec;
|
|
5
|
-
export type KernelDriverDriveSource = 'unspecified' | 'ws_user_message' | 'ws_user_answer' | 'ws_diligence_push' | 'ws_resume_dialog' | 'ws_resume_all' | 'kernel_driver_backend_loop' | 'kernel_driver_follow_up' | '
|
|
5
|
+
export type KernelDriverDriveSource = 'unspecified' | 'ws_user_message' | 'ws_user_answer' | 'ws_diligence_push' | 'ws_resume_dialog' | 'ws_resume_all' | 'kernel_driver_backend_loop' | 'kernel_driver_follow_up' | 'kernel_driver_sideDialog_init' | 'kernel_driver_sideDialog_resume' | 'kernel_driver_fbr_sideDialog_round' | 'kernel_driver_type_a_askerDialog_call' | 'kernel_driver_supply_response_parent_revive';
|
|
6
6
|
export type KernelDriverDriveOptions = Readonly<{
|
|
7
7
|
suppressDiligencePush?: boolean;
|
|
8
8
|
allowResumeFromInterrupted?: boolean;
|
|
9
|
-
|
|
9
|
+
noPromptSideDialogResumeEntitlement?: Readonly<{
|
|
10
10
|
ownerDialogId: string;
|
|
11
|
-
reason: '
|
|
12
|
-
|
|
11
|
+
reason: 'reply_tellask_back_delivered';
|
|
12
|
+
sideDialogId?: string;
|
|
13
13
|
callType?: 'A' | 'B' | 'C';
|
|
14
14
|
callId?: string;
|
|
15
|
+
}> | Readonly<{
|
|
16
|
+
ownerDialogId: string;
|
|
17
|
+
reason: 'replaced_pending_sideDialog_reply';
|
|
18
|
+
sideDialogId?: string;
|
|
19
|
+
callType?: 'A' | 'B' | 'C';
|
|
20
|
+
callId?: string;
|
|
21
|
+
}> | Readonly<{
|
|
22
|
+
ownerDialogId: string;
|
|
23
|
+
reason: 'resolved_pending_sideDialog_reply';
|
|
24
|
+
sideDialogId?: string;
|
|
25
|
+
callType?: 'A' | 'B' | 'C';
|
|
26
|
+
callId?: string;
|
|
27
|
+
callSiteCourse: number;
|
|
28
|
+
callSiteGenseq: number;
|
|
29
|
+
resolvedCallIds?: readonly string[];
|
|
30
|
+
triggerCallId?: string;
|
|
15
31
|
}>;
|
|
16
32
|
runControl?: KernelDriverRunControl;
|
|
17
33
|
source: KernelDriverDriveSource;
|
|
18
34
|
reason: string;
|
|
19
35
|
}>;
|
|
20
|
-
export type
|
|
36
|
+
export type KernelDriverSideDialogReplyTarget = {
|
|
21
37
|
ownerDialogId: string;
|
|
22
38
|
callType: 'A' | 'B' | 'C';
|
|
23
39
|
callId: string;
|
|
@@ -29,7 +45,7 @@ export type KernelDriverUserPrompt = KernelDriverPromptWithRunControl<DialogUser
|
|
|
29
45
|
export type KernelDriverDiligencePrompt = KernelDriverPromptWithRunControl<DialogDiligencePrompt>;
|
|
30
46
|
export type KernelDriverRuntimeGuidePrompt = KernelDriverPromptWithRunControl<DialogRuntimeGuidePrompt>;
|
|
31
47
|
export type KernelDriverRuntimeReplyPrompt = KernelDriverPromptWithRunControl<DialogRuntimeReplyPrompt>;
|
|
32
|
-
export type
|
|
48
|
+
export type KernelDriverRuntimeSideDialogPrompt = KernelDriverPromptWithRunControl<DialogRuntimeSideDialogPrompt>;
|
|
33
49
|
export type KernelDriverRuntimePrompt = KernelDriverPromptWithRunControl<DialogRuntimePrompt>;
|
|
34
50
|
export type KernelDriverPrompt = KernelDriverPromptWithRunControl<DialogPrompt>;
|
|
35
51
|
export type KernelDriverDriveCallOptions = Readonly<{
|
|
@@ -63,7 +79,7 @@ export type KernelDriverEmitSayingArgs = [dlg: Dialog, content: string];
|
|
|
63
79
|
export type KernelDriverEmitSayingResult = Promise<void>;
|
|
64
80
|
export type KernelDriverSupplyResponseArgs = [
|
|
65
81
|
parentDialog: Dialog,
|
|
66
|
-
|
|
82
|
+
sideDialogId: DialogID,
|
|
67
83
|
responseText: string,
|
|
68
84
|
callType: 'A' | 'B' | 'C',
|
|
69
85
|
callId?: string,
|
|
@@ -86,7 +102,7 @@ export type KernelDriverCoreResult = {
|
|
|
86
102
|
lastAssistantSayingContent: string | null;
|
|
87
103
|
lastAssistantSayingGenseq: number | null;
|
|
88
104
|
lastFunctionCallGenseq: number | null;
|
|
89
|
-
lastAssistantReplyTarget?:
|
|
105
|
+
lastAssistantReplyTarget?: KernelDriverSideDialogReplyTarget;
|
|
90
106
|
fbrConclusion?: {
|
|
91
107
|
responseText: string;
|
|
92
108
|
responseGenseq: number;
|
package/dist/mcp/config.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ export type McpHeaderValue = {
|
|
|
12
12
|
} | {
|
|
13
13
|
kind: 'from_env';
|
|
14
14
|
env: string;
|
|
15
|
+
prefix: string;
|
|
15
16
|
};
|
|
16
17
|
export type McpTransport = 'stdio' | 'streamable_http';
|
|
17
18
|
type McpServerConfigBase = {
|
|
@@ -61,6 +62,7 @@ export type McpConfigLoadResult = {
|
|
|
61
62
|
}>;
|
|
62
63
|
serverIdsInYamlOrder: ReadonlyArray<string>;
|
|
63
64
|
validServerIdsInYamlOrder: ReadonlyArray<string>;
|
|
65
|
+
disabledServerIdsInYamlOrder: ReadonlyArray<string>;
|
|
64
66
|
rawText: string;
|
|
65
67
|
} | {
|
|
66
68
|
ok: false;
|
package/dist/mcp/config.js
CHANGED
|
@@ -26,6 +26,7 @@ function parseMcpYaml(rawText) {
|
|
|
26
26
|
invalidServers: res.invalidServers,
|
|
27
27
|
serverIdsInYamlOrder: res.serverIdsInYamlOrder,
|
|
28
28
|
validServerIdsInYamlOrder: res.validServerIdsInYamlOrder,
|
|
29
|
+
disabledServerIdsInYamlOrder: res.disabledServerIdsInYamlOrder,
|
|
29
30
|
rawText,
|
|
30
31
|
};
|
|
31
32
|
}
|
|
@@ -45,9 +46,14 @@ function parseWorkspaceConfig(value) {
|
|
|
45
46
|
const invalidServers = [];
|
|
46
47
|
const serverIdsInYamlOrder = [];
|
|
47
48
|
const validServerIdsInYamlOrder = [];
|
|
49
|
+
const disabledServerIdsInYamlOrder = [];
|
|
48
50
|
for (const [serverId, serverRaw] of Object.entries(serversRecord)) {
|
|
49
51
|
serverIdsInYamlOrder.push(serverId);
|
|
50
52
|
try {
|
|
53
|
+
if (isDisabledServerConfig(serverId, serverRaw)) {
|
|
54
|
+
disabledServerIdsInYamlOrder.push(serverId);
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
51
57
|
servers[serverId] = parseServerConfig(serverId, serverRaw);
|
|
52
58
|
validServerIdsInYamlOrder.push(serverId);
|
|
53
59
|
}
|
|
@@ -63,8 +69,18 @@ function parseWorkspaceConfig(value) {
|
|
|
63
69
|
invalidServers,
|
|
64
70
|
serverIdsInYamlOrder,
|
|
65
71
|
validServerIdsInYamlOrder,
|
|
72
|
+
disabledServerIdsInYamlOrder,
|
|
66
73
|
};
|
|
67
74
|
}
|
|
75
|
+
function isDisabledServerConfig(serverId, value) {
|
|
76
|
+
const obj = asRecord(value, `servers.${serverId}`);
|
|
77
|
+
const enabled = obj.enabled;
|
|
78
|
+
if (enabled === undefined || enabled === true)
|
|
79
|
+
return false;
|
|
80
|
+
if (enabled === false)
|
|
81
|
+
return true;
|
|
82
|
+
throw new Error(`Invalid mcp.yaml: servers.${serverId}.enabled must be a boolean`);
|
|
83
|
+
}
|
|
68
84
|
function parseServerConfig(serverId, value) {
|
|
69
85
|
const obj = asRecord(value, `servers.${serverId}`);
|
|
70
86
|
const truelyStatelessVal = obj['truely-stateless'];
|
|
@@ -168,9 +184,14 @@ function parseServerConfig(serverId, value) {
|
|
|
168
184
|
const mapped = asRecord(v, `servers.${serverId}.headers.${k}`);
|
|
169
185
|
const fromEnv = mapped.env;
|
|
170
186
|
if (typeof fromEnv !== 'string' || !fromEnv.trim()) {
|
|
171
|
-
throw new Error(`Invalid mcp.yaml: servers.${serverId}.headers.${k} must be a string or { env: 'NAME' }`);
|
|
187
|
+
throw new Error(`Invalid mcp.yaml: servers.${serverId}.headers.${k} must be a string, { env: 'NAME' }, or { prefix: 'Bearer ', env: 'NAME' }`);
|
|
188
|
+
}
|
|
189
|
+
const prefixVal = mapped.prefix;
|
|
190
|
+
if (prefixVal !== undefined && typeof prefixVal !== 'string') {
|
|
191
|
+
throw new Error(`Invalid mcp.yaml: servers.${serverId}.headers.${k}.prefix must be a string`);
|
|
172
192
|
}
|
|
173
|
-
|
|
193
|
+
const prefix = prefixVal ?? '';
|
|
194
|
+
headers[k] = { kind: 'from_env', env: fromEnv, prefix };
|
|
174
195
|
}
|
|
175
196
|
const sessionIdVal = obj.sessionId;
|
|
176
197
|
const sessionId = sessionIdVal === undefined
|
package/dist/mcp/supervisor.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import type { McpStreamableHttpServerConfig } from './config';
|
|
1
2
|
export type McpDeclaredServerRuntimeStatus = Readonly<{
|
|
2
3
|
serverId: string;
|
|
3
4
|
transport: 'stdio' | 'streamable_http' | 'invalid' | 'unknown';
|
|
4
|
-
status: 'loaded' | 'temporarily_unavailable' | 'config_invalid';
|
|
5
|
+
status: 'loaded' | 'temporarily_unavailable' | 'config_invalid' | 'disabled';
|
|
5
6
|
errorText?: string;
|
|
6
7
|
}>;
|
|
7
8
|
export declare function isMcpToolsetLeasedToDialog(serverId: string, dialogKey: string): boolean;
|
|
@@ -25,9 +26,16 @@ export declare function requestMcpServerRestart(serverId: string): Promise<{
|
|
|
25
26
|
ok: false;
|
|
26
27
|
errorText: string;
|
|
27
28
|
}>;
|
|
29
|
+
export declare function requestMcpServerDisable(serverId: string): Promise<{
|
|
30
|
+
ok: true;
|
|
31
|
+
} | {
|
|
32
|
+
ok: false;
|
|
33
|
+
errorText: string;
|
|
34
|
+
}>;
|
|
28
35
|
export declare function requestMcpConfigReload(reason?: string): Promise<{
|
|
29
36
|
ok: true;
|
|
30
37
|
} | {
|
|
31
38
|
ok: false;
|
|
32
39
|
errorText: string;
|
|
33
40
|
}>;
|
|
41
|
+
export declare function buildHttpHeaders(cfg: McpStreamableHttpServerConfig, serverId: string): Record<string, string>;
|
package/dist/mcp/supervisor.js
CHANGED
|
@@ -40,11 +40,14 @@ exports.getMcpDeclaredServerRuntimeStatuses = getMcpDeclaredServerRuntimeStatuse
|
|
|
40
40
|
exports.startMcpSupervisor = startMcpSupervisor;
|
|
41
41
|
exports.stopMcpSupervisor = stopMcpSupervisor;
|
|
42
42
|
exports.requestMcpServerRestart = requestMcpServerRestart;
|
|
43
|
+
exports.requestMcpServerDisable = requestMcpServerDisable;
|
|
43
44
|
exports.requestMcpConfigReload = requestMcpConfigReload;
|
|
45
|
+
exports.buildHttpHeaders = buildHttpHeaders;
|
|
44
46
|
const time_1 = require("@longrun-ai/kernel/utils/time");
|
|
45
47
|
const fs = __importStar(require("fs"));
|
|
46
48
|
const node_crypto_1 = require("node:crypto");
|
|
47
49
|
const path = __importStar(require("path"));
|
|
50
|
+
const yaml_1 = __importStar(require("yaml"));
|
|
48
51
|
const log_1 = require("../log");
|
|
49
52
|
const persistence_1 = require("../persistence");
|
|
50
53
|
const problems_1 = require("../problems");
|
|
@@ -150,6 +153,7 @@ class McpServerDispatch {
|
|
|
150
153
|
for (const rt of this.leasesByDialogKey.values()) {
|
|
151
154
|
rt.requestStop({ forceKillAfterMs: 3000 });
|
|
152
155
|
}
|
|
156
|
+
this.leasesByDialogKey.clear();
|
|
153
157
|
for (const [dialogKey, init] of this.leaseInitByDialogKey.entries()) {
|
|
154
158
|
this.canceledLeaseDialogs.add(dialogKey);
|
|
155
159
|
void init
|
|
@@ -158,6 +162,7 @@ class McpServerDispatch {
|
|
|
158
162
|
// ignore
|
|
159
163
|
});
|
|
160
164
|
}
|
|
165
|
+
this.leaseInitByDialogKey.clear();
|
|
161
166
|
}
|
|
162
167
|
async callToolForDialog(dlg, mcpToolName, args) {
|
|
163
168
|
const serverId = this.serverId;
|
|
@@ -322,6 +327,13 @@ function getMcpDeclaredServerRuntimeStatuses() {
|
|
|
322
327
|
errorText: catalogEntry.configErrorText,
|
|
323
328
|
};
|
|
324
329
|
}
|
|
330
|
+
if (catalogEntry?.disabled) {
|
|
331
|
+
return {
|
|
332
|
+
serverId,
|
|
333
|
+
transport: catalogEntry.transport,
|
|
334
|
+
status: 'disabled',
|
|
335
|
+
};
|
|
336
|
+
}
|
|
325
337
|
if (serverStateById.has(serverId)) {
|
|
326
338
|
return {
|
|
327
339
|
serverId,
|
|
@@ -434,6 +446,27 @@ function requestMcpServerRestart(serverId) {
|
|
|
434
446
|
});
|
|
435
447
|
});
|
|
436
448
|
}
|
|
449
|
+
function requestMcpServerDisable(serverId) {
|
|
450
|
+
return new Promise((resolve) => {
|
|
451
|
+
reloadChain = reloadChain
|
|
452
|
+
.then(async () => {
|
|
453
|
+
try {
|
|
454
|
+
const res = await disableServerNow(serverId);
|
|
455
|
+
resolve(res);
|
|
456
|
+
}
|
|
457
|
+
catch (err) {
|
|
458
|
+
const errorText = err instanceof Error ? err.message : String(err);
|
|
459
|
+
log.warn(`MCP server disable failed`, err, { serverId });
|
|
460
|
+
resolve({ ok: false, errorText });
|
|
461
|
+
}
|
|
462
|
+
})
|
|
463
|
+
.catch((err) => {
|
|
464
|
+
const errorText = err instanceof Error ? err.message : String(err);
|
|
465
|
+
log.warn(`MCP server disable enqueue failed`, err, { serverId });
|
|
466
|
+
resolve({ ok: false, errorText });
|
|
467
|
+
});
|
|
468
|
+
});
|
|
469
|
+
}
|
|
437
470
|
function requestMcpConfigReload(reason = 'manual') {
|
|
438
471
|
const normalizedReason = reason.trim() === '' ? 'manual' : reason.trim();
|
|
439
472
|
return new Promise((resolve) => {
|
|
@@ -553,7 +586,7 @@ async function reloadNow(reason) {
|
|
|
553
586
|
const code = isRecord(err) && 'code' in err ? err.code : undefined;
|
|
554
587
|
if (code === 'ENOENT') {
|
|
555
588
|
// Deletion is treated as empty config.
|
|
556
|
-
await applyWorkspaceConfig({ version: 1, servers: {} }, [], [], [], `missing file (${reason})`);
|
|
589
|
+
await applyWorkspaceConfig({ version: 1, servers: {} }, [], [], [], [], null, `missing file (${reason})`);
|
|
557
590
|
clearWorkspaceConfigProblem();
|
|
558
591
|
await reconcileMcpManualProblemsForRuntime([], null);
|
|
559
592
|
return;
|
|
@@ -571,10 +604,19 @@ async function reloadNow(reason) {
|
|
|
571
604
|
return;
|
|
572
605
|
}
|
|
573
606
|
clearWorkspaceConfigProblem();
|
|
574
|
-
await applyWorkspaceConfig(parsed.config, parsed.invalidServers, parsed.serverIdsInYamlOrder, parsed.validServerIdsInYamlOrder, reason);
|
|
607
|
+
await applyWorkspaceConfig(parsed.config, parsed.invalidServers, parsed.serverIdsInYamlOrder, parsed.validServerIdsInYamlOrder, parsed.disabledServerIdsInYamlOrder, rawText, reason);
|
|
575
608
|
await reconcileMcpManualProblemsForRuntime(parsed.serverIdsInYamlOrder, rawText);
|
|
576
609
|
}
|
|
577
610
|
async function restartServerNow(serverId) {
|
|
611
|
+
let removedPlaceholder = false;
|
|
612
|
+
const notifyPlaceholderRemovalOnFailure = (trigger) => {
|
|
613
|
+
if (!removedPlaceholder)
|
|
614
|
+
return;
|
|
615
|
+
(0, tool_availability_updates_1.notifyToolAvailabilityRegistryMaybeChanged)({
|
|
616
|
+
reason: 'registry_changed',
|
|
617
|
+
trigger,
|
|
618
|
+
});
|
|
619
|
+
};
|
|
578
620
|
let rawText;
|
|
579
621
|
try {
|
|
580
622
|
rawText = await fs.promises.readFile(MCP_YAML_PATH, 'utf8');
|
|
@@ -591,23 +633,51 @@ async function restartServerNow(serverId) {
|
|
|
591
633
|
upsertWorkspaceConfigProblem(`Failed to read ${MCP_YAML_PATH}: ${String(err)}`);
|
|
592
634
|
return { ok: false, errorText: `Failed to read ${MCP_YAML_PATH}: ${String(err)}` };
|
|
593
635
|
}
|
|
594
|
-
|
|
636
|
+
let activeRawText = rawText;
|
|
637
|
+
let parsed = (0, config_1.parseMcpYaml)(activeRawText);
|
|
595
638
|
if (!parsed.ok) {
|
|
596
639
|
await reconcileMcpManualProblemsForRuntime([], null);
|
|
597
640
|
upsertWorkspaceConfigProblem(parsed.errorText);
|
|
598
641
|
return { ok: false, errorText: parsed.errorText };
|
|
599
642
|
}
|
|
600
643
|
clearWorkspaceConfigProblem();
|
|
644
|
+
const disabledServer = parsed.serverIdsInYamlOrder.includes(serverId) &&
|
|
645
|
+
parsed.invalidServers.every((s) => s.serverId !== serverId) &&
|
|
646
|
+
parsed.config.servers[serverId] === undefined;
|
|
647
|
+
if (disabledServer) {
|
|
648
|
+
const enableRes = setServerEnabledInMcpYaml(rawText, serverId, true);
|
|
649
|
+
if (!enableRes.ok) {
|
|
650
|
+
await reconcileMcpManualProblemsForRuntime(parsed.serverIdsInYamlOrder, rawText);
|
|
651
|
+
return { ok: false, errorText: enableRes.errorText };
|
|
652
|
+
}
|
|
653
|
+
if (enableRes.changed) {
|
|
654
|
+
await fs.promises.writeFile(MCP_YAML_PATH, enableRes.rawText, 'utf8');
|
|
655
|
+
lastSeenMcpYamlSig = await readMcpYamlSig();
|
|
656
|
+
removedPlaceholder = unregisterMcpToolsetPlaceholder(serverId) || removedPlaceholder;
|
|
657
|
+
}
|
|
658
|
+
activeRawText = enableRes.rawText;
|
|
659
|
+
parsed = (0, config_1.parseMcpYaml)(activeRawText);
|
|
660
|
+
if (!parsed.ok) {
|
|
661
|
+
clearDeclaredServerRuntimeCatalog();
|
|
662
|
+
await reconcileMcpManualProblemsForRuntime([], null);
|
|
663
|
+
upsertWorkspaceConfigProblem(parsed.errorText);
|
|
664
|
+
notifyPlaceholderRemovalOnFailure(`mcp:restart:${serverId}:parse-failed`);
|
|
665
|
+
return { ok: false, errorText: parsed.errorText };
|
|
666
|
+
}
|
|
667
|
+
clearWorkspaceConfigProblem();
|
|
668
|
+
}
|
|
601
669
|
const invalid = parsed.invalidServers.find((s) => s.serverId === serverId);
|
|
602
670
|
if (invalid) {
|
|
603
|
-
replaceDeclaredServerRuntimeCatalog(parsed.config, parsed.invalidServers, parsed.serverIdsInYamlOrder);
|
|
604
|
-
await reconcileMcpManualProblemsForRuntime(parsed.serverIdsInYamlOrder,
|
|
671
|
+
replaceDeclaredServerRuntimeCatalog(parsed.config, parsed.invalidServers, parsed.serverIdsInYamlOrder, parsed.disabledServerIdsInYamlOrder);
|
|
672
|
+
await reconcileMcpManualProblemsForRuntime(parsed.serverIdsInYamlOrder, activeRawText);
|
|
605
673
|
upsertMcpServerConfigInvalidProblem(serverId, invalid.errorText);
|
|
674
|
+
notifyPlaceholderRemovalOnFailure(`mcp:restart:${serverId}:config-invalid`);
|
|
606
675
|
return { ok: false, errorText: invalid.errorText };
|
|
607
676
|
}
|
|
608
677
|
const serverCfg = parsed.config.servers[serverId];
|
|
609
678
|
if (!serverCfg) {
|
|
610
|
-
await reconcileMcpManualProblemsForRuntime(parsed.serverIdsInYamlOrder,
|
|
679
|
+
await reconcileMcpManualProblemsForRuntime(parsed.serverIdsInYamlOrder, activeRawText);
|
|
680
|
+
notifyPlaceholderRemovalOnFailure(`mcp:restart:${serverId}:not-configured`);
|
|
611
681
|
return {
|
|
612
682
|
ok: false,
|
|
613
683
|
errorText: `MCP server '${serverId}' is not configured in ${MCP_YAML_PATH}`,
|
|
@@ -617,25 +687,28 @@ async function restartServerNow(serverId) {
|
|
|
617
687
|
const fingerprint = fingerprintServerConfig(serverCfg);
|
|
618
688
|
const existing = serverStateById.get(serverId);
|
|
619
689
|
const runtimeLeaseChanged = existing !== undefined;
|
|
620
|
-
replaceDeclaredServerRuntimeCatalog(parsed.config, parsed.invalidServers, parsed.serverIdsInYamlOrder);
|
|
690
|
+
replaceDeclaredServerRuntimeCatalog(parsed.config, parsed.invalidServers, parsed.serverIdsInYamlOrder, parsed.disabledServerIdsInYamlOrder);
|
|
691
|
+
if (!existing) {
|
|
692
|
+
removedPlaceholder = unregisterMcpToolsetPlaceholder(serverId) || removedPlaceholder;
|
|
693
|
+
}
|
|
621
694
|
const res = await tryBuildServerState(serverCfg, desiredToolsetName, fingerprint);
|
|
622
695
|
if (!res.ok) {
|
|
623
|
-
await reconcileMcpManualProblemsForRuntime(parsed.serverIdsInYamlOrder,
|
|
696
|
+
await reconcileMcpManualProblemsForRuntime(parsed.serverIdsInYamlOrder, activeRawText);
|
|
624
697
|
upsertDeclaredServerRuntimeError(serverId, res.errorText);
|
|
625
698
|
upsertMcpServerRuntimeUnavailableProblem(serverId, res.errorText, res.detailTextI18n);
|
|
699
|
+
notifyPlaceholderRemovalOnFailure(`mcp:restart:${serverId}:runtime-unavailable`);
|
|
626
700
|
return { ok: false, errorText: res.errorText };
|
|
627
701
|
}
|
|
628
702
|
clearDeclaredServerRuntimeError(serverId);
|
|
629
703
|
(0, problems_1.removeProblemsByPrefix)(`${problemPrefixForServer(serverId)}server_error`);
|
|
630
704
|
if (existing) {
|
|
631
|
-
|
|
632
|
-
existing.dispatch.requestStop();
|
|
705
|
+
stopLoadedServer(serverId);
|
|
633
706
|
}
|
|
634
707
|
registerServer(res.state);
|
|
635
708
|
serverStateById.set(serverId, res.state);
|
|
636
709
|
(0, problems_1.reconcileProblemsByPrefix)(problemPrefixForServer(serverId), res.state.problems);
|
|
637
710
|
reorderMcpToolsetsInRegistry(parsed.serverIdsInYamlOrder);
|
|
638
|
-
await reconcileMcpManualProblemsForRuntime(parsed.serverIdsInYamlOrder,
|
|
711
|
+
await reconcileMcpManualProblemsForRuntime(parsed.serverIdsInYamlOrder, activeRawText);
|
|
639
712
|
(0, tool_availability_updates_1.notifyToolAvailabilityRegistryMaybeChanged)({
|
|
640
713
|
reason: 'registry_changed',
|
|
641
714
|
trigger: `mcp:restart:${serverId}`,
|
|
@@ -645,6 +718,119 @@ async function restartServerNow(serverId) {
|
|
|
645
718
|
}
|
|
646
719
|
return { ok: true };
|
|
647
720
|
}
|
|
721
|
+
async function disableServerNow(serverId) {
|
|
722
|
+
const stoppedExisting = stopLoadedServer(serverId);
|
|
723
|
+
let rawText;
|
|
724
|
+
try {
|
|
725
|
+
rawText = await fs.promises.readFile(MCP_YAML_PATH, 'utf8');
|
|
726
|
+
}
|
|
727
|
+
catch (err) {
|
|
728
|
+
const code = isRecord(err) && 'code' in err ? err.code : undefined;
|
|
729
|
+
if (stoppedExisting) {
|
|
730
|
+
(0, tool_availability_updates_1.notifyToolAvailabilityRegistryMaybeChanged)({
|
|
731
|
+
reason: 'registry_changed',
|
|
732
|
+
trigger: `mcp:disable:${serverId}:read-failed`,
|
|
733
|
+
});
|
|
734
|
+
(0, tool_availability_updates_1.notifyToolAvailabilityRuntimeLeaseChanged)(`mcp:disable:${serverId}:read-failed`);
|
|
735
|
+
}
|
|
736
|
+
if (code === 'ENOENT') {
|
|
737
|
+
return { ok: false, errorText: `Cannot disable '${serverId}': ${MCP_YAML_PATH} is missing` };
|
|
738
|
+
}
|
|
739
|
+
return { ok: false, errorText: `Failed to read ${MCP_YAML_PATH}: ${String(err)}` };
|
|
740
|
+
}
|
|
741
|
+
const disableRes = setServerEnabledInMcpYaml(rawText, serverId, false);
|
|
742
|
+
if (!disableRes.ok) {
|
|
743
|
+
if (stoppedExisting) {
|
|
744
|
+
(0, tool_availability_updates_1.notifyToolAvailabilityRegistryMaybeChanged)({
|
|
745
|
+
reason: 'registry_changed',
|
|
746
|
+
trigger: `mcp:disable:${serverId}:disable-failed`,
|
|
747
|
+
});
|
|
748
|
+
(0, tool_availability_updates_1.notifyToolAvailabilityRuntimeLeaseChanged)(`mcp:disable:${serverId}:disable-failed`);
|
|
749
|
+
}
|
|
750
|
+
return { ok: false, errorText: disableRes.errorText };
|
|
751
|
+
}
|
|
752
|
+
if (disableRes.changed) {
|
|
753
|
+
await fs.promises.writeFile(MCP_YAML_PATH, disableRes.rawText, 'utf8');
|
|
754
|
+
lastSeenMcpYamlSig = await readMcpYamlSig();
|
|
755
|
+
}
|
|
756
|
+
const parsed = (0, config_1.parseMcpYaml)(disableRes.rawText);
|
|
757
|
+
if (!parsed.ok) {
|
|
758
|
+
clearDeclaredServerRuntimeCatalog();
|
|
759
|
+
await reconcileMcpManualProblemsForRuntime([], null);
|
|
760
|
+
upsertWorkspaceConfigProblem(parsed.errorText);
|
|
761
|
+
if (stoppedExisting) {
|
|
762
|
+
(0, tool_availability_updates_1.notifyToolAvailabilityRegistryMaybeChanged)({
|
|
763
|
+
reason: 'registry_changed',
|
|
764
|
+
trigger: `mcp:disable:${serverId}:parse-failed`,
|
|
765
|
+
});
|
|
766
|
+
(0, tool_availability_updates_1.notifyToolAvailabilityRuntimeLeaseChanged)(`mcp:disable:${serverId}:parse-failed`);
|
|
767
|
+
}
|
|
768
|
+
return { ok: false, errorText: parsed.errorText };
|
|
769
|
+
}
|
|
770
|
+
clearWorkspaceConfigProblem();
|
|
771
|
+
await applyWorkspaceConfig(parsed.config, parsed.invalidServers, parsed.serverIdsInYamlOrder, parsed.validServerIdsInYamlOrder, parsed.disabledServerIdsInYamlOrder, disableRes.rawText, `mcp_disable:${serverId}`);
|
|
772
|
+
await reconcileMcpManualProblemsForRuntime(parsed.serverIdsInYamlOrder, disableRes.rawText);
|
|
773
|
+
if (stoppedExisting) {
|
|
774
|
+
(0, tool_availability_updates_1.notifyToolAvailabilityRuntimeLeaseChanged)(`mcp:disable:${serverId}`);
|
|
775
|
+
}
|
|
776
|
+
return { ok: true };
|
|
777
|
+
}
|
|
778
|
+
function setServerEnabledInMcpYaml(rawText, serverId, enabled) {
|
|
779
|
+
const doc = yaml_1.default.parseDocument(rawText, { prettyErrors: true });
|
|
780
|
+
if (doc.errors.length > 0) {
|
|
781
|
+
return { ok: false, errorText: doc.errors.map((e) => String(e)).join('\n') };
|
|
782
|
+
}
|
|
783
|
+
const parsed = doc.toJS();
|
|
784
|
+
if (!isRecord(parsed)) {
|
|
785
|
+
return { ok: false, errorText: `Invalid mcp.yaml: expected object at mcp.yaml root` };
|
|
786
|
+
}
|
|
787
|
+
if (parsed.version !== 1) {
|
|
788
|
+
return { ok: false, errorText: `Invalid mcp.yaml: expected version: 1` };
|
|
789
|
+
}
|
|
790
|
+
const servers = parsed.servers;
|
|
791
|
+
const server = isRecord(servers) ? servers[serverId] : undefined;
|
|
792
|
+
if (!isRecord(server)) {
|
|
793
|
+
return {
|
|
794
|
+
ok: false,
|
|
795
|
+
errorText: `MCP server '${serverId}' is not configured in ${MCP_YAML_PATH}`,
|
|
796
|
+
};
|
|
797
|
+
}
|
|
798
|
+
const currentEnabled = server.enabled;
|
|
799
|
+
if (currentEnabled !== undefined && typeof currentEnabled !== 'boolean') {
|
|
800
|
+
return {
|
|
801
|
+
ok: false,
|
|
802
|
+
errorText: `Invalid mcp.yaml: servers.${serverId}.enabled must be a boolean`,
|
|
803
|
+
};
|
|
804
|
+
}
|
|
805
|
+
if (currentEnabled === enabled) {
|
|
806
|
+
return { ok: true, rawText, changed: false };
|
|
807
|
+
}
|
|
808
|
+
const serverNode = doc.getIn(['servers', serverId], true);
|
|
809
|
+
if (!(0, yaml_1.isMap)(serverNode)) {
|
|
810
|
+
return {
|
|
811
|
+
ok: false,
|
|
812
|
+
errorText: `Invalid mcp.yaml: servers.${serverId} must be an object`,
|
|
813
|
+
};
|
|
814
|
+
}
|
|
815
|
+
const existingEnabledPair = serverNode.items.find((pair) => (0, yaml_1.isScalar)(pair.key) && pair.key.value === 'enabled');
|
|
816
|
+
if (existingEnabledPair) {
|
|
817
|
+
existingEnabledPair.value = doc.createNode(enabled);
|
|
818
|
+
}
|
|
819
|
+
else {
|
|
820
|
+
serverNode.items.unshift(doc.createPair('enabled', enabled));
|
|
821
|
+
}
|
|
822
|
+
return { ok: true, rawText: String(doc), changed: true };
|
|
823
|
+
}
|
|
824
|
+
function stopLoadedServer(serverId) {
|
|
825
|
+
const existing = serverStateById.get(serverId);
|
|
826
|
+
if (!existing)
|
|
827
|
+
return false;
|
|
828
|
+
unregisterServer(existing);
|
|
829
|
+
existing.dispatch.requestStop();
|
|
830
|
+
serverStateById.delete(serverId);
|
|
831
|
+
(0, problems_1.reconcileProblemsByPrefix)(problemPrefixForServer(serverId), []);
|
|
832
|
+
return true;
|
|
833
|
+
}
|
|
648
834
|
async function reconcileMcpManualProblemsForRuntime(serverIdsInYamlOrder, rawText) {
|
|
649
835
|
const manualInfo = rawText === null ? (0, manual_problems_1.emptyMcpToolsetManualByServer)() : (0, manual_problems_1.parseMcpManualByServer)(rawText);
|
|
650
836
|
await (0, manual_problems_1.reconcileMcpToolsetManualProblems)({
|
|
@@ -710,13 +896,15 @@ function upsertMcpToolCallProblem(args) {
|
|
|
710
896
|
const hintLines = workLanguage === 'zh'
|
|
711
897
|
? [
|
|
712
898
|
'建议排查:',
|
|
713
|
-
`-
|
|
899
|
+
`- 如果需要全局重建该 MCP server,直接调用 mcp_restart({"serverId":"${args.serverId}"});它成功后会清理旧 runtime 的全部 lease`,
|
|
900
|
+
`- 如果只想丢弃当前对话的连接,再调用 mcp_release({"serverId":"${args.serverId}"})`,
|
|
714
901
|
`- 重新打开/关闭浏览器窗口,避免 Playwright persistent context 残留`,
|
|
715
902
|
`- 查看 ${MCP_YAML_PATH} 是否已加载且配置正确(Problems 面板 / 后端日志)`,
|
|
716
903
|
]
|
|
717
904
|
: [
|
|
718
905
|
'Suggested checks:',
|
|
719
|
-
`-
|
|
906
|
+
`- To rebuild this MCP server globally, call mcp_restart({"serverId":"${args.serverId}"}) directly; a successful restart clears all leases on the old runtime`,
|
|
907
|
+
`- To discard only this dialog's connection, call mcp_release({"serverId":"${args.serverId}"})`,
|
|
720
908
|
`- Close/reopen browser windows to avoid leftover Playwright persistent contexts`,
|
|
721
909
|
`- Verify ${MCP_YAML_PATH} is loaded and valid (Problems panel / backend logs)`,
|
|
722
910
|
];
|
|
@@ -745,12 +933,13 @@ function upsertMcpToolCallProblem(args) {
|
|
|
745
933
|
function clearMcpToolCallProblem(serverId) {
|
|
746
934
|
(0, problems_1.removeProblemsByPrefix)(`${MCP_TOOL_CALL_PROBLEM_PREFIX}${sanitizePathSegment(serverId)}`);
|
|
747
935
|
}
|
|
748
|
-
async function applyWorkspaceConfig(config, invalidServers, serverIdsInYamlOrder, validServerIdsInYamlOrder, reason) {
|
|
936
|
+
async function applyWorkspaceConfig(config, invalidServers, serverIdsInYamlOrder, validServerIdsInYamlOrder, disabledServerIdsInYamlOrder, rawText, reason) {
|
|
749
937
|
log.info(`Applying MCP rtws config (${reason})`);
|
|
750
|
-
replaceDeclaredServerRuntimeCatalog(config, invalidServers, serverIdsInYamlOrder);
|
|
938
|
+
replaceDeclaredServerRuntimeCatalog(config, invalidServers, serverIdsInYamlOrder, disabledServerIdsInYamlOrder);
|
|
751
939
|
let runtimeLeaseChanged = false;
|
|
752
940
|
const invalidIds = new Set(invalidServers.map((s) => s.serverId));
|
|
753
941
|
const desiredIds = new Set([...Object.keys(config.servers), ...invalidIds]);
|
|
942
|
+
const declaredIds = new Set(serverIdsInYamlOrder);
|
|
754
943
|
// Remove deleted servers first.
|
|
755
944
|
for (const [serverId, state] of serverStateById.entries()) {
|
|
756
945
|
if (desiredIds.has(serverId))
|
|
@@ -761,8 +950,18 @@ async function applyWorkspaceConfig(config, invalidServers, serverIdsInYamlOrder
|
|
|
761
950
|
serverStateById.delete(serverId);
|
|
762
951
|
(0, problems_1.reconcileProblemsByPrefix)(problemPrefixForServer(serverId), []);
|
|
763
952
|
}
|
|
953
|
+
// Remove disabled/deleted MCP placeholders that are no longer declared.
|
|
954
|
+
for (const [toolsetName, owner] of Array.from(toolsetOwnerByName.entries())) {
|
|
955
|
+
if (owner.kind !== 'mcp')
|
|
956
|
+
continue;
|
|
957
|
+
if (declaredIds.has(owner.serverId))
|
|
958
|
+
continue;
|
|
959
|
+
(0, registry_1.unregisterToolset)(toolsetName);
|
|
960
|
+
toolsetOwnerByName.delete(toolsetName);
|
|
961
|
+
}
|
|
764
962
|
// Surface invalid server config errors (while keeping last-known-good runtimes registered).
|
|
765
963
|
for (const s of invalidServers) {
|
|
964
|
+
unregisterMcpToolsetPlaceholder(s.serverId);
|
|
766
965
|
upsertMcpServerConfigInvalidProblem(s.serverId, s.errorText);
|
|
767
966
|
}
|
|
768
967
|
// Apply desired servers independently (deterministic order).
|
|
@@ -774,6 +973,9 @@ async function applyWorkspaceConfig(config, invalidServers, serverIdsInYamlOrder
|
|
|
774
973
|
const fingerprint = fingerprintServerConfig(serverCfg);
|
|
775
974
|
const existing = serverStateById.get(serverId);
|
|
776
975
|
if (!existing || existing.configFingerprint !== fingerprint) {
|
|
976
|
+
if (!existing) {
|
|
977
|
+
unregisterMcpToolsetPlaceholder(serverId);
|
|
978
|
+
}
|
|
777
979
|
const res = await tryBuildServerState(serverCfg, desiredToolsetName, fingerprint);
|
|
778
980
|
if (!res.ok) {
|
|
779
981
|
upsertDeclaredServerRuntimeError(serverId, res.errorText);
|
|
@@ -826,6 +1028,11 @@ async function applyWorkspaceConfig(config, invalidServers, serverIdsInYamlOrder
|
|
|
826
1028
|
if (!changed)
|
|
827
1029
|
break;
|
|
828
1030
|
}
|
|
1031
|
+
const manualInfo = rawText === null ? (0, manual_problems_1.emptyMcpToolsetManualByServer)() : (0, manual_problems_1.parseMcpManualByServer)(rawText);
|
|
1032
|
+
for (const serverId of disabledServerIdsInYamlOrder) {
|
|
1033
|
+
(0, problems_1.reconcileProblemsByPrefix)(problemPrefixForServer(serverId), []);
|
|
1034
|
+
registerDisabledServerToolset(serverId, manualInfo);
|
|
1035
|
+
}
|
|
829
1036
|
reorderMcpToolsetsInRegistry(serverIdsInYamlOrder);
|
|
830
1037
|
(0, tool_availability_updates_1.notifyToolAvailabilityRegistryMaybeChanged)({
|
|
831
1038
|
reason: 'registry_changed',
|
|
@@ -848,7 +1055,7 @@ function clearDeclaredServerRuntimeCatalog() {
|
|
|
848
1055
|
declaredServerIdsInYamlOrder = [];
|
|
849
1056
|
declaredServerRuntimeCatalogById.clear();
|
|
850
1057
|
}
|
|
851
|
-
function replaceDeclaredServerRuntimeCatalog(config, invalidServers, serverIdsInYamlOrder) {
|
|
1058
|
+
function replaceDeclaredServerRuntimeCatalog(config, invalidServers, serverIdsInYamlOrder, disabledServerIdsInYamlOrder) {
|
|
852
1059
|
const previousRuntimeErrors = new Map();
|
|
853
1060
|
for (const [serverId, entry] of declaredServerRuntimeCatalogById.entries()) {
|
|
854
1061
|
if (typeof entry.runtimeErrorText === 'string' && entry.runtimeErrorText.trim() !== '') {
|
|
@@ -857,7 +1064,15 @@ function replaceDeclaredServerRuntimeCatalog(config, invalidServers, serverIdsIn
|
|
|
857
1064
|
}
|
|
858
1065
|
declaredServerIdsInYamlOrder = [...serverIdsInYamlOrder];
|
|
859
1066
|
declaredServerRuntimeCatalogById.clear();
|
|
1067
|
+
const disabledIds = new Set(disabledServerIdsInYamlOrder);
|
|
860
1068
|
for (const serverId of serverIdsInYamlOrder) {
|
|
1069
|
+
if (disabledIds.has(serverId)) {
|
|
1070
|
+
declaredServerRuntimeCatalogById.set(serverId, {
|
|
1071
|
+
transport: 'unknown',
|
|
1072
|
+
disabled: true,
|
|
1073
|
+
});
|
|
1074
|
+
continue;
|
|
1075
|
+
}
|
|
861
1076
|
const cfg = config.servers[serverId];
|
|
862
1077
|
if (!cfg)
|
|
863
1078
|
continue;
|
|
@@ -944,6 +1159,74 @@ function registerServer(state) {
|
|
|
944
1159
|
});
|
|
945
1160
|
toolsetOwnerByName.set(state.toolsetName, { kind: 'mcp', serverId: state.serverId });
|
|
946
1161
|
}
|
|
1162
|
+
function registerDisabledServerToolset(serverId, manualInfo) {
|
|
1163
|
+
const existingToolset = registry_1.toolsetsRegistry.get(serverId);
|
|
1164
|
+
const existingOwner = toolsetOwnerByName.get(serverId);
|
|
1165
|
+
if (existingToolset && (!existingOwner || existingOwner.serverId !== serverId)) {
|
|
1166
|
+
upsertMcpServerConfigInvalidProblem(serverId, `Toolset name collision: ${serverId}`);
|
|
1167
|
+
return;
|
|
1168
|
+
}
|
|
1169
|
+
(0, registry_1.registerToolset)(serverId, []);
|
|
1170
|
+
const manual = manualInfo.manualByServerId.get(serverId);
|
|
1171
|
+
const manualSpec = manual?.contentFile
|
|
1172
|
+
? (0, spec_1.buildMcpManualSpec)(manual.contentFile)
|
|
1173
|
+
: {
|
|
1174
|
+
topics: ['index'],
|
|
1175
|
+
warnOnMissing: false,
|
|
1176
|
+
includeSchemaToolsSection: false,
|
|
1177
|
+
};
|
|
1178
|
+
const inlineManual = manual ? renderInlineMcpToolsetManual(manual) : '';
|
|
1179
|
+
const disabledNoticeEn = [
|
|
1180
|
+
`This MCP server is configured but disabled in \`.minds/mcp.yaml\` (\`enabled: false\`).`,
|
|
1181
|
+
`It intentionally exposes zero tools until an MCP administrator enables it with \`mcp_restart({"serverId":"${serverId}"})\`.`,
|
|
1182
|
+
inlineManual,
|
|
1183
|
+
]
|
|
1184
|
+
.filter((part) => part.trim() !== '')
|
|
1185
|
+
.join('\n\n');
|
|
1186
|
+
const disabledNoticeZh = [
|
|
1187
|
+
`该 MCP server 已在 \`.minds/mcp.yaml\` 中配置,但当前为禁用状态(\`enabled: false\`)。`,
|
|
1188
|
+
`它会刻意暴露为 0 工具的 toolset;需要 MCP 排障/管理员用 \`mcp_restart({"serverId":"${serverId}"})\` 启用后才会加载工具。`,
|
|
1189
|
+
inlineManual,
|
|
1190
|
+
]
|
|
1191
|
+
.filter((part) => part.trim() !== '')
|
|
1192
|
+
.join('\n\n');
|
|
1193
|
+
(0, registry_1.setToolsetMeta)(serverId, {
|
|
1194
|
+
source: 'mcp',
|
|
1195
|
+
descriptionI18n: {
|
|
1196
|
+
en: `MCP server: ${serverId} (disabled)`,
|
|
1197
|
+
zh: `MCP 服务器:${serverId}(已禁用)`,
|
|
1198
|
+
},
|
|
1199
|
+
manualNoticeI18n: {
|
|
1200
|
+
en: disabledNoticeEn,
|
|
1201
|
+
zh: disabledNoticeZh,
|
|
1202
|
+
},
|
|
1203
|
+
...(manualSpec !== undefined ? { manualSpec } : {}),
|
|
1204
|
+
});
|
|
1205
|
+
toolsetOwnerByName.set(serverId, { kind: 'mcp', serverId });
|
|
1206
|
+
}
|
|
1207
|
+
function renderInlineMcpToolsetManual(manual) {
|
|
1208
|
+
const parts = [];
|
|
1209
|
+
if (manual.content) {
|
|
1210
|
+
parts.push(manual.content);
|
|
1211
|
+
}
|
|
1212
|
+
for (const section of manual.sections) {
|
|
1213
|
+
parts.push(`#### ${section.title}\n\n${section.content}`);
|
|
1214
|
+
}
|
|
1215
|
+
return parts.join('\n\n');
|
|
1216
|
+
}
|
|
1217
|
+
function unregisterMcpToolsetPlaceholder(serverId) {
|
|
1218
|
+
if (serverStateById.has(serverId))
|
|
1219
|
+
return false;
|
|
1220
|
+
const owner = toolsetOwnerByName.get(serverId);
|
|
1221
|
+
if (owner?.kind !== 'mcp' || owner.serverId !== serverId)
|
|
1222
|
+
return false;
|
|
1223
|
+
const tools = registry_1.toolsetsRegistry.get(serverId);
|
|
1224
|
+
if (tools && tools.length > 0)
|
|
1225
|
+
return false;
|
|
1226
|
+
(0, registry_1.unregisterToolset)(serverId);
|
|
1227
|
+
toolsetOwnerByName.delete(serverId);
|
|
1228
|
+
return true;
|
|
1229
|
+
}
|
|
947
1230
|
function unregisterServer(state) {
|
|
948
1231
|
// Unregister toolset first so Team.Member.listTools doesn't resolve stale tools.
|
|
949
1232
|
if (toolsetOwnerByName.get(state.toolsetName)?.serverId === state.serverId) {
|
|
@@ -1417,7 +1700,7 @@ function buildHttpHeaders(cfg, serverId) {
|
|
|
1417
1700
|
if (val === undefined) {
|
|
1418
1701
|
throw new Error(`MCP server '${serverId}' missing required host env var '${v.env}' (for headers.${k})`);
|
|
1419
1702
|
}
|
|
1420
|
-
headers[k] = val
|
|
1703
|
+
headers[k] = `${v.prefix}${val}`;
|
|
1421
1704
|
break;
|
|
1422
1705
|
}
|
|
1423
1706
|
default: {
|