@otto-code/server 0.7.2 → 0.7.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/server/server/agent/providers/claude/agent.js +48 -3
- package/dist/server/server/agent/providers/mock-load-test-agent.d.ts +10 -1
- package/dist/server/server/agent/providers/mock-load-test-agent.js +151 -5
- package/dist/server/server/agent/synthetic-conversation.d.ts +18 -0
- package/dist/server/server/agent/synthetic-conversation.js +567 -0
- package/dist/server/server/dotnet-process-registry.d.ts +111 -0
- package/dist/server/server/dotnet-process-registry.js +160 -0
- package/dist/server/server/lsp/connection.d.ts +4 -0
- package/dist/server/server/lsp/connection.js +39 -4
- package/dist/server/server/lsp/pool.js +1 -0
- package/dist/server/server/lsp/registry.d.ts +14 -1
- package/dist/server/server/lsp/registry.js +14 -2
- package/dist/server/server/lsp/service.d.ts +18 -2
- package/dist/server/server/lsp/service.js +14 -2
- package/dist/server/server/process-tree.d.ts +29 -0
- package/dist/server/server/process-tree.js +59 -0
- package/dist/server/server/session/files/workspace-files-session.js +11 -5
- package/dist/server/server/session.d.ts +11 -0
- package/dist/server/server/session.js +23 -0
- package/dist/server/server/solution-model/dotnet/probe.d.ts +2 -0
- package/dist/server/server/solution-model/dotnet/probe.js +33 -14
- package/dist/server/server/websocket-server.js +10 -0
- package/dist/server/server/workspace-git-service.d.ts +36 -0
- package/dist/server/server/workspace-git-service.js +110 -6
- package/dist/server/terminal/shell-integration/zsh/.zshenv +17 -17
- package/dist/server/terminal/shell-integration/zsh/otto-integration.zsh +32 -32
- package/dist/server/terminal/terminal.js +12 -2
- package/dist/server/web-ui/_expo/static/js/web/{__common-6d2299ed037bec2393245a7c0bf1c643.js → __common-8ab6f044d26f0be8899aaf3a990c8b65.js} +1855 -1855
- package/dist/server/web-ui/_expo/static/js/web/__common-8ab6f044d26f0be8899aaf3a990c8b65.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/__common-8ab6f044d26f0be8899aaf3a990c8b65.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{abnfDiagram-VRR7QNED-c3c2ca327b2d7ad9af3caa1cba884908.js → abnfDiagram-VRR7QNED-e33c74fb52c02570f5105b2e70194df6.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/abnfDiagram-VRR7QNED-e33c74fb52c02570f5105b2e70194df6.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/abnfDiagram-VRR7QNED-e33c74fb52c02570f5105b2e70194df6.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{architecture-TIHT7OUA-0cf23d3dc9775f216c01daae4aae250a.js → architecture-TIHT7OUA-cc3220b1ecee09a0e5c0b99fbf886b82.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/{architecture-TIHT7OUA-0cf23d3dc9775f216c01daae4aae250a.js.br → architecture-TIHT7OUA-cc3220b1ecee09a0e5c0b99fbf886b82.js.br} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/architecture-TIHT7OUA-cc3220b1ecee09a0e5c0b99fbf886b82.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{architectureDiagram-ZJ3FMSHR-f3bce96124559dc19faa4d90aca4afd4.js → architectureDiagram-ZJ3FMSHR-551f5e17dd33a890195b5d060cd75ad2.js} +4 -4
- package/dist/server/web-ui/_expo/static/js/web/architectureDiagram-ZJ3FMSHR-551f5e17dd33a890195b5d060cd75ad2.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/architectureDiagram-ZJ3FMSHR-551f5e17dd33a890195b5d060cd75ad2.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{blockDiagram-677ZJIJ3-839486928c0f151128a5e2836aa07080.js → blockDiagram-677ZJIJ3-901d7bbed0b0f6ae3439f6bff861b42f.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/blockDiagram-677ZJIJ3-901d7bbed0b0f6ae3439f6bff861b42f.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{blockDiagram-677ZJIJ3-839486928c0f151128a5e2836aa07080.js.gz → blockDiagram-677ZJIJ3-901d7bbed0b0f6ae3439f6bff861b42f.js.gz} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{c4Diagram-LMCZKHZV-197212c21520a6b659a5649e683619d0.js → c4Diagram-LMCZKHZV-781ca106d0a19454ec9e559bcba3706c.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/c4Diagram-LMCZKHZV-781ca106d0a19454ec9e559bcba3706c.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{c4Diagram-LMCZKHZV-197212c21520a6b659a5649e683619d0.js.gz → c4Diagram-LMCZKHZV-781ca106d0a19454ec9e559bcba3706c.js.gz} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{classDiagram-OUVF2IWQ-a0a0fbefc96d14b6619c84fc4f92a39a.js → classDiagram-OUVF2IWQ-1d00e0cc9165446f1bac84fed1e9bbed.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/classDiagram-OUVF2IWQ-1d00e0cc9165446f1bac84fed1e9bbed.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/classDiagram-OUVF2IWQ-1d00e0cc9165446f1bac84fed1e9bbed.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{classDiagram-v2-EOCWNBFH-e979239c6d160123d5b4847253a8a70e.js → classDiagram-v2-EOCWNBFH-52b658fff2b9f58ece5d8528cb381359.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/classDiagram-v2-EOCWNBFH-52b658fff2b9f58ece5d8528cb381359.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/classDiagram-v2-EOCWNBFH-52b658fff2b9f58ece5d8528cb381359.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{cose-bilkent-JH36ORCC-bbc39a6bb062ba85e433f91becc37a65.js → cose-bilkent-JH36ORCC-9256f0de343b59ecc5775210909c4f8b.js} +4 -4
- package/dist/server/web-ui/_expo/static/js/web/cose-bilkent-JH36ORCC-9256f0de343b59ecc5775210909c4f8b.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/cose-bilkent-JH36ORCC-9256f0de343b59ecc5775210909c4f8b.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{cynefin-VYW2F7L2-ea0e514652627740f5a2ed32b027a164.js → cynefin-VYW2F7L2-feb2750e4e4322ac8e6c6049fcfd73cb.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/cynefin-VYW2F7L2-feb2750e4e4322ac8e6c6049fcfd73cb.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/cynefin-VYW2F7L2-feb2750e4e4322ac8e6c6049fcfd73cb.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{cynefinDiagram-TSTJHNR4-0446f9b57ba778e5883d93e24692ffce.js → cynefinDiagram-TSTJHNR4-b98dc254a5fa6581f997a0809a9e0fc0.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/cynefinDiagram-TSTJHNR4-b98dc254a5fa6581f997a0809a9e0fc0.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/cynefinDiagram-TSTJHNR4-b98dc254a5fa6581f997a0809a9e0fc0.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{dagre-VKFMJZFB-69f7aa52521b06a95874b1ac67508def.js → dagre-VKFMJZFB-ef67573fa401136e68fc41adf07ef447.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/dagre-VKFMJZFB-ef67573fa401136e68fc41adf07ef447.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/dagre-VKFMJZFB-ef67573fa401136e68fc41adf07ef447.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-bridge-0ae8aadd6e53625f59d62eceb1f06ede.js → desktop-attachment-bridge-d6e4f29a78dc1bb5b70d4ef2c440c6c0.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-bridge-0ae8aadd6e53625f59d62eceb1f06ede.js.br → desktop-attachment-bridge-d6e4f29a78dc1bb5b70d4ef2c440c6c0.js.br} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-d6e4f29a78dc1bb5b70d4ef2c440c6c0.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-store-ecd775c6aee79778f49274a5bffadc5a.js → desktop-attachment-store-e2e403c64de4bc638e1800c9b226ede3.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-store-ecd775c6aee79778f49274a5bffadc5a.js.br → desktop-attachment-store-e2e403c64de4bc638e1800c9b226ede3.js.br} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-store-ecd775c6aee79778f49274a5bffadc5a.js.gz → desktop-attachment-store-e2e403c64de4bc638e1800c9b226ede3.js.gz} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{diagram-FQU43EPY-bd0940835ccad031627e285aaba6d5ec.js → diagram-FQU43EPY-c6317fa4c07b63f54be30797f25060c7.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/diagram-FQU43EPY-c6317fa4c07b63f54be30797f25060c7.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{diagram-FQU43EPY-bd0940835ccad031627e285aaba6d5ec.js.gz → diagram-FQU43EPY-c6317fa4c07b63f54be30797f25060c7.js.gz} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{diagram-G47NLZAW-217e2cd3275924bc08fc6ebe79e95e48.js → diagram-G47NLZAW-70713a059ca65ca1241036cc96679bc5.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/diagram-G47NLZAW-70713a059ca65ca1241036cc96679bc5.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/diagram-G47NLZAW-70713a059ca65ca1241036cc96679bc5.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{diagram-NH7WQ7WH-fbd3aa35ca68df15ee378fb63241b333.js → diagram-NH7WQ7WH-1bebddae0fd6a49ff82d7ea2b738823d.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/diagram-NH7WQ7WH-1bebddae0fd6a49ff82d7ea2b738823d.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/diagram-NH7WQ7WH-1bebddae0fd6a49ff82d7ea2b738823d.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{diagram-OA4YK3LP-48ebb0ba6bcb34417649bd55070542ad.js → diagram-OA4YK3LP-bf33c3e1800c9f503dd88e41e97c5974.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/diagram-OA4YK3LP-bf33c3e1800c9f503dd88e41e97c5974.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/diagram-OA4YK3LP-bf33c3e1800c9f503dd88e41e97c5974.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{diagram-WEI45ONY-2be85db5396495fa970419f77587cf14.js → diagram-WEI45ONY-23d90af03030beb514d3a953920e6c9b.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/diagram-WEI45ONY-23d90af03030beb514d3a953920e6c9b.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/diagram-WEI45ONY-23d90af03030beb514d3a953920e6c9b.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{ebnfDiagram-CCIWWBDH-3c5c44cf8340b641d13076adab77967b.js → ebnfDiagram-CCIWWBDH-5119b538047d9c00ae05855ae1cf490f.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/ebnfDiagram-CCIWWBDH-5119b538047d9c00ae05855ae1cf490f.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/ebnfDiagram-CCIWWBDH-5119b538047d9c00ae05855ae1cf490f.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{erDiagram-Q63AITRT-81762a72bd33bf1042e4cad4f688abf2.js → erDiagram-Q63AITRT-6f7e9f420388e6291e5a8ae6da7ab3ad.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/erDiagram-Q63AITRT-6f7e9f420388e6291e5a8ae6da7ab3ad.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/erDiagram-Q63AITRT-6f7e9f420388e6291e5a8ae6da7ab3ad.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{eventmodeling-45OFAUF4-11d7615d746c5304c28d4931ec9ca5f7.js → eventmodeling-45OFAUF4-510d785624b4496077e120d2c12a6b88.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/{eventmodeling-45OFAUF4-11d7615d746c5304c28d4931ec9ca5f7.js.br → eventmodeling-45OFAUF4-510d785624b4496077e120d2c12a6b88.js.br} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/eventmodeling-45OFAUF4-510d785624b4496077e120d2c12a6b88.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{flowDiagram-23GEKE2U-5a2af608a9500bb36da0595c3464a562.js → flowDiagram-23GEKE2U-7bf4721b6de004ef55a0787bbbc6b9ac.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/flowDiagram-23GEKE2U-7bf4721b6de004ef55a0787bbbc6b9ac.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/flowDiagram-23GEKE2U-7bf4721b6de004ef55a0787bbbc6b9ac.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{ganttDiagram-NO4QXBWP-379aae0f5fb2652d90827c7f8b2472d2.js → ganttDiagram-NO4QXBWP-53b4651e7e78eb3212ec05a0d72b8932.js} +5 -5
- package/dist/server/web-ui/_expo/static/js/web/ganttDiagram-NO4QXBWP-53b4651e7e78eb3212ec05a0d72b8932.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{ganttDiagram-NO4QXBWP-379aae0f5fb2652d90827c7f8b2472d2.js.gz → ganttDiagram-NO4QXBWP-53b4651e7e78eb3212ec05a0d72b8932.js.gz} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{gitGraph-TEB2WS4Q-d978b8a2d1fd8fcc132b16ef8d57dd7c.js → gitGraph-TEB2WS4Q-03038b65af81bb0d4755a35c737decf0.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/{gitGraph-TEB2WS4Q-d978b8a2d1fd8fcc132b16ef8d57dd7c.js.br → gitGraph-TEB2WS4Q-03038b65af81bb0d4755a35c737decf0.js.br} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/gitGraph-TEB2WS4Q-03038b65af81bb0d4755a35c737decf0.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{gitGraphDiagram-IHSO6WYX-6cb31a37312da231b8f10f86b0d4de52.js → gitGraphDiagram-IHSO6WYX-49a762c3f7ecc4315bcde2731f090410.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/{gitGraphDiagram-IHSO6WYX-6cb31a37312da231b8f10f86b0d4de52.js.br → gitGraphDiagram-IHSO6WYX-49a762c3f7ecc4315bcde2731f090410.js.br} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{gitGraphDiagram-IHSO6WYX-6cb31a37312da231b8f10f86b0d4de52.js.gz → gitGraphDiagram-IHSO6WYX-49a762c3f7ecc4315bcde2731f090410.js.gz} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{index-4c86d3c14df18b18b3b9a6329b896faf.js → index-6e99d24bcc09db447a2d8b0c747a5263.js} +74 -73
- package/dist/server/web-ui/_expo/static/js/web/index-6e99d24bcc09db447a2d8b0c747a5263.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-6e99d24bcc09db447a2d8b0c747a5263.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{indexeddb-attachment-store-5a90994af83f12740a986d9f1cb55cc9.js → indexeddb-attachment-store-ea6e57606ef25b42cf1e6665a3f5313e.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-ea6e57606ef25b42cf1e6665a3f5313e.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-ea6e57606ef25b42cf1e6665a3f5313e.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{info-DKCQHKI2-b59d0dbb9a30d361ddc796a5cfa7fc41.js → info-DKCQHKI2-61f5b3ca4e5cea885d6254ccef0626c4.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/{info-DKCQHKI2-b59d0dbb9a30d361ddc796a5cfa7fc41.js.br → info-DKCQHKI2-61f5b3ca4e5cea885d6254ccef0626c4.js.br} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/info-DKCQHKI2-61f5b3ca4e5cea885d6254ccef0626c4.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{infoDiagram-FWYZ7A6U-0c4368de61a3bdbfbc73b143423981d9.js → infoDiagram-FWYZ7A6U-f47fe897045bf4e6949ea71abdae89fe.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/infoDiagram-FWYZ7A6U-f47fe897045bf4e6949ea71abdae89fe.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/infoDiagram-FWYZ7A6U-f47fe897045bf4e6949ea71abdae89fe.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{ishikawaDiagram-FXEZZL3T-1474e73532a16148b7944d3b0f896197.js → ishikawaDiagram-FXEZZL3T-bf6597ebf1b0773e1d39dea7fcf8800f.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/ishikawaDiagram-FXEZZL3T-bf6597ebf1b0773e1d39dea7fcf8800f.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{ishikawaDiagram-FXEZZL3T-1474e73532a16148b7944d3b0f896197.js.gz → ishikawaDiagram-FXEZZL3T-bf6597ebf1b0773e1d39dea7fcf8800f.js.gz} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{journeyDiagram-5HDEW3XC-13df6cce9cb7f0e6ffbaa9a614feeee4.js → journeyDiagram-5HDEW3XC-7dc3a04c43574b6aac59a4520d111129.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/journeyDiagram-5HDEW3XC-7dc3a04c43574b6aac59a4520d111129.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{journeyDiagram-5HDEW3XC-13df6cce9cb7f0e6ffbaa9a614feeee4.js.gz → journeyDiagram-5HDEW3XC-7dc3a04c43574b6aac59a4520d111129.js.gz} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{kanban-definition-HUTT4EX6-6b56c0da5302838e7e1c46bf7460ea35.js → kanban-definition-HUTT4EX6-7be647182b1c3291e9330de01d329adf.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/kanban-definition-HUTT4EX6-7be647182b1c3291e9330de01d329adf.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{kanban-definition-HUTT4EX6-6b56c0da5302838e7e1c46bf7460ea35.js.gz → kanban-definition-HUTT4EX6-7be647182b1c3291e9330de01d329adf.js.gz} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{katex-7f6ac23f118e6e9264fdfa96e335134f.js → katex-c0aeb8f935f239b315771d04dc16b1e7.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/katex-c0aeb8f935f239b315771d04dc16b1e7.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{katex-7f6ac23f118e6e9264fdfa96e335134f.js.gz → katex-c0aeb8f935f239b315771d04dc16b1e7.js.gz} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{mermaid-75931b049ce3e66af3cd8ddf01e1cd23.js → mermaid-f4cf4ad300756762c2eed3bd65fecb6c.js} +9 -9
- package/dist/server/web-ui/_expo/static/js/web/mermaid-f4cf4ad300756762c2eed3bd65fecb6c.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{mermaid-75931b049ce3e66af3cd8ddf01e1cd23.js.gz → mermaid-f4cf4ad300756762c2eed3bd65fecb6c.js.gz} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{mindmap-definition-LN4V7U3C-fafde693a329ca39007debdd961134b4.js → mindmap-definition-LN4V7U3C-5a266041ac99a182f60e7d1ade3053a7.js} +21 -21
- package/dist/server/web-ui/_expo/static/js/web/mindmap-definition-LN4V7U3C-5a266041ac99a182f60e7d1ade3053a7.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/mindmap-definition-LN4V7U3C-5a266041ac99a182f60e7d1ade3053a7.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{native-file-attachment-store-645b8ffe39c60c05c0a224e6efcb5a9c.js → native-file-attachment-store-78cca157541c8af3aff9a719f7b951be.js} +3 -3
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-78cca157541c8af3aff9a719f7b951be.js.br +11 -0
- package/dist/server/web-ui/_expo/static/js/web/{native-file-attachment-store-645b8ffe39c60c05c0a224e6efcb5a9c.js.gz → native-file-attachment-store-78cca157541c8af3aff9a719f7b951be.js.gz} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{orchestration-graph-panel-2d117a5764d11c411d707e37fba93a1b.js → orchestration-graph-panel-77d13bf34f0ff1ffed397666b8009b21.js} +5 -5
- package/dist/server/web-ui/_expo/static/js/web/orchestration-graph-panel-77d13bf34f0ff1ffed397666b8009b21.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{orchestration-graph-panel-2d117a5764d11c411d707e37fba93a1b.js.gz → orchestration-graph-panel-77d13bf34f0ff1ffed397666b8009b21.js.gz} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{packet-7NZHBO7P-61a485e09ee448c823fffbdfc588826d.js → packet-7NZHBO7P-8f2693917ef293414f42718be4e1d738.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/{packet-7NZHBO7P-61a485e09ee448c823fffbdfc588826d.js.br → packet-7NZHBO7P-8f2693917ef293414f42718be4e1d738.js.br} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/packet-7NZHBO7P-8f2693917ef293414f42718be4e1d738.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{pegDiagram-2B236MQR-035fe1b93f90f4775e99aea533552b42.js → pegDiagram-2B236MQR-58835705d6a13a27b59f4c85aeaf7012.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/pegDiagram-2B236MQR-58835705d6a13a27b59f4c85aeaf7012.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/pegDiagram-2B236MQR-58835705d6a13a27b59f4c85aeaf7012.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{pie-RZYD4A2V-f6208df18db61d490f4811b192b77dec.js → pie-RZYD4A2V-8b0f157b04de7752354fc779ddbf49a4.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/pie-RZYD4A2V-8b0f157b04de7752354fc779ddbf49a4.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/pie-RZYD4A2V-8b0f157b04de7752354fc779ddbf49a4.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{pieDiagram-ENE6RG2P-c78c82bf26f51acb7b7c44ae51eba9c6.js → pieDiagram-ENE6RG2P-a0061a200414abc917902506915ccabe.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/pieDiagram-ENE6RG2P-a0061a200414abc917902506915ccabe.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{pieDiagram-ENE6RG2P-c78c82bf26f51acb7b7c44ae51eba9c6.js.gz → pieDiagram-ENE6RG2P-a0061a200414abc917902506915ccabe.js.gz} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{quadrantDiagram-ABIIQ3AL-efff1486187742fe8683a966651df92f.js → quadrantDiagram-ABIIQ3AL-ccae11df8eb112141ab52dc3b055366d.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/quadrantDiagram-ABIIQ3AL-ccae11df8eb112141ab52dc3b055366d.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{quadrantDiagram-ABIIQ3AL-efff1486187742fe8683a966651df92f.js.gz → quadrantDiagram-ABIIQ3AL-ccae11df8eb112141ab52dc3b055366d.js.gz} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{radar-I7S5WNFK-0150ed7f0d337fc7ec70638a3656ea06.js → radar-I7S5WNFK-0768be5c16d166cd094d75a4c9fba55a.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/{radar-I7S5WNFK-0150ed7f0d337fc7ec70638a3656ea06.js.br → radar-I7S5WNFK-0768be5c16d166cd094d75a4c9fba55a.js.br} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/radar-I7S5WNFK-0768be5c16d166cd094d75a4c9fba55a.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{railroad-3IZDKUUU-c6e94ec81a88c02cb339de59f29386f5.js → railroad-3IZDKUUU-55b81b14fbc2908aa06995bd62b57b43.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/{railroad-3IZDKUUU-c6e94ec81a88c02cb339de59f29386f5.js.br → railroad-3IZDKUUU-55b81b14fbc2908aa06995bd62b57b43.js.br} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/railroad-3IZDKUUU-55b81b14fbc2908aa06995bd62b57b43.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{railroad-abnf-AHOZXSZD-627ed129da90b5e1d371bd2c3b9db457.js → railroad-abnf-AHOZXSZD-47462203d9c422ed3805bd31ed12d922.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/{railroad-abnf-AHOZXSZD-627ed129da90b5e1d371bd2c3b9db457.js.br → railroad-abnf-AHOZXSZD-47462203d9c422ed3805bd31ed12d922.js.br} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/railroad-abnf-AHOZXSZD-47462203d9c422ed3805bd31ed12d922.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{railroad-ebnf-EBAXGLYW-1b7ec12d3b92be4e181971b21f01f3f8.js → railroad-ebnf-EBAXGLYW-708f5dcce4ca8693b288152f6aa217b1.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/{railroad-ebnf-EBAXGLYW-1b7ec12d3b92be4e181971b21f01f3f8.js.br → railroad-ebnf-EBAXGLYW-708f5dcce4ca8693b288152f6aa217b1.js.br} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/railroad-ebnf-EBAXGLYW-708f5dcce4ca8693b288152f6aa217b1.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{railroad-peg-LSFZ7HO6-8a8e027f4141d16a12c15223da966d7d.js → railroad-peg-LSFZ7HO6-eb7ff4c6b43a9c593b0feac004d52d4e.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/railroad-peg-LSFZ7HO6-eb7ff4c6b43a9c593b0feac004d52d4e.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/railroad-peg-LSFZ7HO6-eb7ff4c6b43a9c593b0feac004d52d4e.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{railroadDiagram-RFXS5EU6-499f36fe78b07e5558063f963a47a474.js → railroadDiagram-RFXS5EU6-c1c534a0f6478078bca1fd806a1ee2ae.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/railroadDiagram-RFXS5EU6-c1c534a0f6478078bca1fd806a1ee2ae.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/railroadDiagram-RFXS5EU6-c1c534a0f6478078bca1fd806a1ee2ae.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{requirementDiagram-TGXJPOKE-9aaddb885fc59873a8f89cd7550c2c43.js → requirementDiagram-TGXJPOKE-5dd7440a5946dde0e06a5afa9e0295a1.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/requirementDiagram-TGXJPOKE-5dd7440a5946dde0e06a5afa9e0295a1.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{requirementDiagram-TGXJPOKE-9aaddb885fc59873a8f89cd7550c2c43.js.gz → requirementDiagram-TGXJPOKE-5dd7440a5946dde0e06a5afa9e0295a1.js.gz} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{sankeyDiagram-HTMAVEWB-3fa66fe414adce7a50e31551c059f99c.js → sankeyDiagram-HTMAVEWB-76b963967a4f7c862f4f2f18492e7c56.js} +120 -120
- package/dist/server/web-ui/_expo/static/js/web/sankeyDiagram-HTMAVEWB-76b963967a4f7c862f4f2f18492e7c56.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/sankeyDiagram-HTMAVEWB-76b963967a4f7c862f4f2f18492e7c56.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{sequenceDiagram-DBY2YBRQ-856a29fb0507a2dcb697a2aa29cd0b7a.js → sequenceDiagram-DBY2YBRQ-d40a3dbcd285c19aa010a697e12f5022.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/sequenceDiagram-DBY2YBRQ-d40a3dbcd285c19aa010a697e12f5022.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{sequenceDiagram-DBY2YBRQ-856a29fb0507a2dcb697a2aa29cd0b7a.js.gz → sequenceDiagram-DBY2YBRQ-d40a3dbcd285c19aa010a697e12f5022.js.gz} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{sizeCapture-X5ZJPWSS-388b849b33073b8202dd9ca50038b1c7.js → sizeCapture-X5ZJPWSS-03ac818220d4ba98bdd2f4f454758263.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/sizeCapture-X5ZJPWSS-03ac818220d4ba98bdd2f4f454758263.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/sizeCapture-X5ZJPWSS-03ac818220d4ba98bdd2f4f454758263.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{stateDiagram-2N3HPSRC-9ca22d078d9922ddcb54ba7bb389c734.js → stateDiagram-2N3HPSRC-ba1e123bf8ce69ae781981f264e90564.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/stateDiagram-2N3HPSRC-ba1e123bf8ce69ae781981f264e90564.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/stateDiagram-2N3HPSRC-ba1e123bf8ce69ae781981f264e90564.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{stateDiagram-v2-6OUMAXLB-4357e7143c73859f6b4858ba72acb5aa.js → stateDiagram-v2-6OUMAXLB-5925b0db81d9a113005bd93c6adbab9d.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/stateDiagram-v2-6OUMAXLB-5925b0db81d9a113005bd93c6adbab9d.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/stateDiagram-v2-6OUMAXLB-5925b0db81d9a113005bd93c6adbab9d.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{swimlanes-5IMT3BWC-d737ca408a7a2b82f7419141456d28e4.js → swimlanes-5IMT3BWC-93c0bb8b5ee84ca6f11d561497ec0ef0.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/swimlanes-5IMT3BWC-93c0bb8b5ee84ca6f11d561497ec0ef0.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{swimlanes-5IMT3BWC-d737ca408a7a2b82f7419141456d28e4.js.gz → swimlanes-5IMT3BWC-93c0bb8b5ee84ca6f11d561497ec0ef0.js.gz} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{swimlanesDiagram-G3AALYLV-0bf2ac58b338c2aeb33213ff1a57983a.js → swimlanesDiagram-G3AALYLV-5f3e335e1800b344e786080955bdb2c5.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/swimlanesDiagram-G3AALYLV-5f3e335e1800b344e786080955bdb2c5.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/swimlanesDiagram-G3AALYLV-5f3e335e1800b344e786080955bdb2c5.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{timeline-definition-FHXFAJF6-1130419ca563266603c98f1b2148a154.js → timeline-definition-FHXFAJF6-ebf6579c1264c7dd88b67d0ecc9313d7.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/timeline-definition-FHXFAJF6-ebf6579c1264c7dd88b67d0ecc9313d7.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/timeline-definition-FHXFAJF6-ebf6579c1264c7dd88b67d0ecc9313d7.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{treeView-QDETBFTQ-4f6ec9b592731c21dee99264fa638554.js → treeView-QDETBFTQ-682ed2be8efc51bd8196ff3320637705.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/{treeView-QDETBFTQ-4f6ec9b592731c21dee99264fa638554.js.br → treeView-QDETBFTQ-682ed2be8efc51bd8196ff3320637705.js.br} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/treeView-QDETBFTQ-682ed2be8efc51bd8196ff3320637705.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{treemap-6X3UGDF4-39eb6ec2c19a5de9242fd28aa26dcf5b.js → treemap-6X3UGDF4-4fb89637583518868012429289715b50.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/{treemap-6X3UGDF4-39eb6ec2c19a5de9242fd28aa26dcf5b.js.br → treemap-6X3UGDF4-4fb89637583518868012429289715b50.js.br} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/treemap-6X3UGDF4-4fb89637583518868012429289715b50.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{vennDiagram-L72KCM5P-4c15b392e9de3fdc472b53cbdf8e7558.js → vennDiagram-L72KCM5P-4a09551e281dc72285c8c56bcd4b04a3.js} +2 -2
- package/dist/server/web-ui/_expo/static/js/web/vennDiagram-L72KCM5P-4a09551e281dc72285c8c56bcd4b04a3.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/vennDiagram-L72KCM5P-4a09551e281dc72285c8c56bcd4b04a3.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{visualizer-bundle-b0af8f4f1ab8d4029f3f21236df43f7f.js → visualizer-bundle-fab344f71166d5645590bda1bab1e0a5.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/visualizer-bundle-fab344f71166d5645590bda1bab1e0a5.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{visualizer-bundle-b0af8f4f1ab8d4029f3f21236df43f7f.js.gz → visualizer-bundle-fab344f71166d5645590bda1bab1e0a5.js.gz} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{visualizer-panel-3fbc1337bb844d7163cbdb418a4dfd53.js → visualizer-panel-bf8e9531071e12cefa8eda4766877aba.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/visualizer-panel-bf8e9531071e12cefa8eda4766877aba.js.br +6 -0
- package/dist/server/web-ui/_expo/static/js/web/{visualizer-panel-3fbc1337bb844d7163cbdb418a4dfd53.js.gz → visualizer-panel-bf8e9531071e12cefa8eda4766877aba.js.gz} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{visualizer-pip-de03996e25ac5d8a11d723ea90b2f9a3.js → visualizer-pip-633730d52ecc119677ce9ecc287c7879.js} +2 -2
- package/dist/server/web-ui/_expo/static/js/web/visualizer-pip-633730d52ecc119677ce9ecc287c7879.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{visualizer-pip-de03996e25ac5d8a11d723ea90b2f9a3.js.gz → visualizer-pip-633730d52ecc119677ce9ecc287c7879.js.gz} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{wardley-OPB4EBWU-b075ee9680ce77acf211a0fb1e63cca8.js → wardley-OPB4EBWU-86a2856822d60f742050c338803f8533.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/wardley-OPB4EBWU-86a2856822d60f742050c338803f8533.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/wardley-OPB4EBWU-86a2856822d60f742050c338803f8533.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{wardleyDiagram-EHGQE667-a93bc6a6a1e80adcb9a740a2ea3d1676.js → wardleyDiagram-EHGQE667-cf65a2e4de30372a177e82834dba571c.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/wardleyDiagram-EHGQE667-cf65a2e4de30372a177e82834dba571c.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/wardleyDiagram-EHGQE667-cf65a2e4de30372a177e82834dba571c.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{xychartDiagram-FW5EYKEG-ec54fa07a12c5792d0bb7b65deaff05b.js → xychartDiagram-FW5EYKEG-d29f0b24141b00d07e99c98d99ac55d4.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/xychartDiagram-FW5EYKEG-d29f0b24141b00d07e99c98d99ac55d4.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/xychartDiagram-FW5EYKEG-d29f0b24141b00d07e99c98d99ac55d4.js.gz +0 -0
- package/dist/server/web-ui/index.html +1 -1
- package/dist/server/web-ui/index.html.br +0 -0
- package/dist/server/web-ui/index.html.gz +0 -0
- package/dist/src/terminal/shell-integration/zsh/.zshenv +17 -17
- package/dist/src/terminal/shell-integration/zsh/otto-integration.zsh +32 -32
- package/package.json +5 -5
- package/dist/server/web-ui/_expo/static/js/web/__common-6d2299ed037bec2393245a7c0bf1c643.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/__common-6d2299ed037bec2393245a7c0bf1c643.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/abnfDiagram-VRR7QNED-c3c2ca327b2d7ad9af3caa1cba884908.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/abnfDiagram-VRR7QNED-c3c2ca327b2d7ad9af3caa1cba884908.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/architecture-TIHT7OUA-0cf23d3dc9775f216c01daae4aae250a.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/architectureDiagram-ZJ3FMSHR-f3bce96124559dc19faa4d90aca4afd4.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/architectureDiagram-ZJ3FMSHR-f3bce96124559dc19faa4d90aca4afd4.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/blockDiagram-677ZJIJ3-839486928c0f151128a5e2836aa07080.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/c4Diagram-LMCZKHZV-197212c21520a6b659a5649e683619d0.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/classDiagram-OUVF2IWQ-a0a0fbefc96d14b6619c84fc4f92a39a.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/classDiagram-OUVF2IWQ-a0a0fbefc96d14b6619c84fc4f92a39a.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/classDiagram-v2-EOCWNBFH-e979239c6d160123d5b4847253a8a70e.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/classDiagram-v2-EOCWNBFH-e979239c6d160123d5b4847253a8a70e.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/cose-bilkent-JH36ORCC-bbc39a6bb062ba85e433f91becc37a65.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/cose-bilkent-JH36ORCC-bbc39a6bb062ba85e433f91becc37a65.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/cynefin-VYW2F7L2-ea0e514652627740f5a2ed32b027a164.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/cynefin-VYW2F7L2-ea0e514652627740f5a2ed32b027a164.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/cynefinDiagram-TSTJHNR4-0446f9b57ba778e5883d93e24692ffce.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/cynefinDiagram-TSTJHNR4-0446f9b57ba778e5883d93e24692ffce.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/dagre-VKFMJZFB-69f7aa52521b06a95874b1ac67508def.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/dagre-VKFMJZFB-69f7aa52521b06a95874b1ac67508def.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-0ae8aadd6e53625f59d62eceb1f06ede.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/diagram-FQU43EPY-bd0940835ccad031627e285aaba6d5ec.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/diagram-G47NLZAW-217e2cd3275924bc08fc6ebe79e95e48.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/diagram-G47NLZAW-217e2cd3275924bc08fc6ebe79e95e48.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/diagram-NH7WQ7WH-fbd3aa35ca68df15ee378fb63241b333.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/diagram-NH7WQ7WH-fbd3aa35ca68df15ee378fb63241b333.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/diagram-OA4YK3LP-48ebb0ba6bcb34417649bd55070542ad.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/diagram-OA4YK3LP-48ebb0ba6bcb34417649bd55070542ad.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/diagram-WEI45ONY-2be85db5396495fa970419f77587cf14.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/diagram-WEI45ONY-2be85db5396495fa970419f77587cf14.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/ebnfDiagram-CCIWWBDH-3c5c44cf8340b641d13076adab77967b.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/ebnfDiagram-CCIWWBDH-3c5c44cf8340b641d13076adab77967b.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/erDiagram-Q63AITRT-81762a72bd33bf1042e4cad4f688abf2.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/erDiagram-Q63AITRT-81762a72bd33bf1042e4cad4f688abf2.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/eventmodeling-45OFAUF4-11d7615d746c5304c28d4931ec9ca5f7.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/flowDiagram-23GEKE2U-5a2af608a9500bb36da0595c3464a562.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/flowDiagram-23GEKE2U-5a2af608a9500bb36da0595c3464a562.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/ganttDiagram-NO4QXBWP-379aae0f5fb2652d90827c7f8b2472d2.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/gitGraph-TEB2WS4Q-d978b8a2d1fd8fcc132b16ef8d57dd7c.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-4c86d3c14df18b18b3b9a6329b896faf.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-4c86d3c14df18b18b3b9a6329b896faf.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-5a90994af83f12740a986d9f1cb55cc9.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-5a90994af83f12740a986d9f1cb55cc9.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/info-DKCQHKI2-b59d0dbb9a30d361ddc796a5cfa7fc41.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/infoDiagram-FWYZ7A6U-0c4368de61a3bdbfbc73b143423981d9.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/infoDiagram-FWYZ7A6U-0c4368de61a3bdbfbc73b143423981d9.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/ishikawaDiagram-FXEZZL3T-1474e73532a16148b7944d3b0f896197.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/journeyDiagram-5HDEW3XC-13df6cce9cb7f0e6ffbaa9a614feeee4.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/kanban-definition-HUTT4EX6-6b56c0da5302838e7e1c46bf7460ea35.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/katex-7f6ac23f118e6e9264fdfa96e335134f.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/mermaid-75931b049ce3e66af3cd8ddf01e1cd23.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/mindmap-definition-LN4V7U3C-fafde693a329ca39007debdd961134b4.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/mindmap-definition-LN4V7U3C-fafde693a329ca39007debdd961134b4.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-645b8ffe39c60c05c0a224e6efcb5a9c.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/orchestration-graph-panel-2d117a5764d11c411d707e37fba93a1b.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/packet-7NZHBO7P-61a485e09ee448c823fffbdfc588826d.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/pegDiagram-2B236MQR-035fe1b93f90f4775e99aea533552b42.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/pegDiagram-2B236MQR-035fe1b93f90f4775e99aea533552b42.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/pie-RZYD4A2V-f6208df18db61d490f4811b192b77dec.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/pie-RZYD4A2V-f6208df18db61d490f4811b192b77dec.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/pieDiagram-ENE6RG2P-c78c82bf26f51acb7b7c44ae51eba9c6.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/quadrantDiagram-ABIIQ3AL-efff1486187742fe8683a966651df92f.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/radar-I7S5WNFK-0150ed7f0d337fc7ec70638a3656ea06.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/railroad-3IZDKUUU-c6e94ec81a88c02cb339de59f29386f5.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/railroad-abnf-AHOZXSZD-627ed129da90b5e1d371bd2c3b9db457.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/railroad-ebnf-EBAXGLYW-1b7ec12d3b92be4e181971b21f01f3f8.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/railroad-peg-LSFZ7HO6-8a8e027f4141d16a12c15223da966d7d.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/railroad-peg-LSFZ7HO6-8a8e027f4141d16a12c15223da966d7d.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/railroadDiagram-RFXS5EU6-499f36fe78b07e5558063f963a47a474.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/railroadDiagram-RFXS5EU6-499f36fe78b07e5558063f963a47a474.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/requirementDiagram-TGXJPOKE-9aaddb885fc59873a8f89cd7550c2c43.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/sankeyDiagram-HTMAVEWB-3fa66fe414adce7a50e31551c059f99c.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/sankeyDiagram-HTMAVEWB-3fa66fe414adce7a50e31551c059f99c.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/sequenceDiagram-DBY2YBRQ-856a29fb0507a2dcb697a2aa29cd0b7a.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/sizeCapture-X5ZJPWSS-388b849b33073b8202dd9ca50038b1c7.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/sizeCapture-X5ZJPWSS-388b849b33073b8202dd9ca50038b1c7.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/stateDiagram-2N3HPSRC-9ca22d078d9922ddcb54ba7bb389c734.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/stateDiagram-2N3HPSRC-9ca22d078d9922ddcb54ba7bb389c734.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/stateDiagram-v2-6OUMAXLB-4357e7143c73859f6b4858ba72acb5aa.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/stateDiagram-v2-6OUMAXLB-4357e7143c73859f6b4858ba72acb5aa.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/swimlanes-5IMT3BWC-d737ca408a7a2b82f7419141456d28e4.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/swimlanesDiagram-G3AALYLV-0bf2ac58b338c2aeb33213ff1a57983a.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/swimlanesDiagram-G3AALYLV-0bf2ac58b338c2aeb33213ff1a57983a.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/timeline-definition-FHXFAJF6-1130419ca563266603c98f1b2148a154.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/timeline-definition-FHXFAJF6-1130419ca563266603c98f1b2148a154.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/treeView-QDETBFTQ-4f6ec9b592731c21dee99264fa638554.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/treemap-6X3UGDF4-39eb6ec2c19a5de9242fd28aa26dcf5b.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/vennDiagram-L72KCM5P-4c15b392e9de3fdc472b53cbdf8e7558.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/vennDiagram-L72KCM5P-4c15b392e9de3fdc472b53cbdf8e7558.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/visualizer-bundle-b0af8f4f1ab8d4029f3f21236df43f7f.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/visualizer-panel-3fbc1337bb844d7163cbdb418a4dfd53.js.br +0 -3
- package/dist/server/web-ui/_expo/static/js/web/visualizer-pip-de03996e25ac5d8a11d723ea90b2f9a3.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/wardley-OPB4EBWU-b075ee9680ce77acf211a0fb1e63cca8.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/wardley-OPB4EBWU-b075ee9680ce77acf211a0fb1e63cca8.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/wardleyDiagram-EHGQE667-a93bc6a6a1e80adcb9a740a2ea3d1676.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/wardleyDiagram-EHGQE667-a93bc6a6a1e80adcb9a740a2ea3d1676.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/xychartDiagram-FW5EYKEG-ec54fa07a12c5792d0bb7b65deaff05b.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/xychartDiagram-FW5EYKEG-ec54fa07a12c5792d0bb7b65deaff05b.js.gz +0 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { spawn as nodeSpawn } from "node:child_process";
|
|
2
|
+
import { killProcessTree, MSBUILD_ENV } from "./process-tree.js";
|
|
3
|
+
export class DotnetProcessLimitError extends Error {
|
|
4
|
+
constructor(limit, running) {
|
|
5
|
+
super(`Otto already has ${running} .NET processes running and the limit is ${limit}. ` +
|
|
6
|
+
`Close a workspace or raise the limit to start another.`);
|
|
7
|
+
this.name = "DotnetProcessLimitError";
|
|
8
|
+
this.limit = limit;
|
|
9
|
+
this.running = running;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export const DEFAULT_MAX_DOTNET_PROCESSES = 4;
|
|
13
|
+
export class DotnetProcessRegistry {
|
|
14
|
+
constructor(options) {
|
|
15
|
+
this.entries = new Set();
|
|
16
|
+
this.logger = options.logger.child({ subsystem: "dotnet-processes" });
|
|
17
|
+
this.spawn = options.spawn ?? nodeSpawn;
|
|
18
|
+
this.killTree = options.killTree ?? killProcessTree;
|
|
19
|
+
this.now = options.now ?? Date.now;
|
|
20
|
+
this.maxProcesses = normalizeLimit(options.maxProcesses);
|
|
21
|
+
}
|
|
22
|
+
get limit() {
|
|
23
|
+
return this.maxProcesses;
|
|
24
|
+
}
|
|
25
|
+
get size() {
|
|
26
|
+
return this.entries.size;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Lowering the limit does not kill anything already running: a process holding a warm
|
|
30
|
+
* project model is expensive to rebuild, and the caller that would be killed has done
|
|
31
|
+
* nothing wrong. The new limit binds the next spawn, and the count drains naturally as
|
|
32
|
+
* pools reap their idle members.
|
|
33
|
+
*/
|
|
34
|
+
setLimit(maxProcesses) {
|
|
35
|
+
this.maxProcesses = normalizeLimit(maxProcesses);
|
|
36
|
+
}
|
|
37
|
+
/** A copy per row, so a caller inspecting the registry cannot mutate what it tracks. */
|
|
38
|
+
running() {
|
|
39
|
+
const rows = [];
|
|
40
|
+
for (const entry of this.entries) {
|
|
41
|
+
rows.push({
|
|
42
|
+
pid: entry.record.pid,
|
|
43
|
+
kind: entry.record.kind,
|
|
44
|
+
label: entry.record.label,
|
|
45
|
+
startedAt: entry.record.startedAt,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return rows;
|
|
49
|
+
}
|
|
50
|
+
hasCapacity() {
|
|
51
|
+
return this.entries.size < this.maxProcesses;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Spawn a .NET process under the cap. Throws {@link DotnetProcessLimitError} rather than
|
|
55
|
+
* queueing: a caller waiting on a slot would hold a request open behind work that may
|
|
56
|
+
* take minutes to finish, and "not right now" is an answer both callers can render.
|
|
57
|
+
*
|
|
58
|
+
* `MSBUILD_ENV` is applied here rather than at each call site so no future caller can
|
|
59
|
+
* forget it and reintroduce resident MSBuild worker nodes.
|
|
60
|
+
*/
|
|
61
|
+
spawnTracked(input) {
|
|
62
|
+
if (!this.hasCapacity()) {
|
|
63
|
+
this.logger.warn({
|
|
64
|
+
kind: input.kind,
|
|
65
|
+
label: input.label,
|
|
66
|
+
running: this.entries.size,
|
|
67
|
+
limit: this.maxProcesses,
|
|
68
|
+
}, "refused to start a .NET process: at the configured limit");
|
|
69
|
+
throw new DotnetProcessLimitError(this.maxProcesses, this.entries.size);
|
|
70
|
+
}
|
|
71
|
+
const child = this.spawn(input.command, [...input.args], {
|
|
72
|
+
...input.options,
|
|
73
|
+
env: { ...(input.options.env ?? process.env), ...MSBUILD_ENV },
|
|
74
|
+
});
|
|
75
|
+
const entry = {
|
|
76
|
+
child,
|
|
77
|
+
record: {
|
|
78
|
+
pid: child.pid,
|
|
79
|
+
kind: input.kind,
|
|
80
|
+
label: input.label,
|
|
81
|
+
startedAt: this.now(),
|
|
82
|
+
},
|
|
83
|
+
released: false,
|
|
84
|
+
};
|
|
85
|
+
this.entries.add(entry);
|
|
86
|
+
// A process that dies on its own must free its slot, or a few crashes would exhaust the
|
|
87
|
+
// cap and the feature would go permanently unavailable with nothing running.
|
|
88
|
+
const forget = () => {
|
|
89
|
+
entry.released = true;
|
|
90
|
+
this.entries.delete(entry);
|
|
91
|
+
};
|
|
92
|
+
child.once("exit", forget);
|
|
93
|
+
child.once("error", forget);
|
|
94
|
+
this.logger.debug({ kind: input.kind, label: input.label, pid: child.pid, running: this.entries.size }, "started a .NET process");
|
|
95
|
+
return {
|
|
96
|
+
child,
|
|
97
|
+
release: () => {
|
|
98
|
+
if (entry.released) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
entry.released = true;
|
|
102
|
+
this.entries.delete(entry);
|
|
103
|
+
this.killTree(child);
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Kill everything still tracked. The shutdown sweep, and the backstop for an owner that
|
|
109
|
+
* dropped its handle without releasing.
|
|
110
|
+
*/
|
|
111
|
+
killAll() {
|
|
112
|
+
const entries = [...this.entries];
|
|
113
|
+
this.entries.clear();
|
|
114
|
+
for (const entry of entries) {
|
|
115
|
+
if (entry.released) {
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
entry.released = true;
|
|
119
|
+
this.killTree(entry.child);
|
|
120
|
+
}
|
|
121
|
+
if (entries.length > 0) {
|
|
122
|
+
this.logger.debug({ count: entries.length }, "killed all tracked .NET processes");
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* The process table is a machine-global resource, and the cap is only a cap if both
|
|
128
|
+
* subsystems that start .NET processes count against the same one. A module-level instance
|
|
129
|
+
* is the honest model for that: threading a handle through the LSP pool, the solution
|
|
130
|
+
* provider and their two connection layers would let a future call site quietly opt out by
|
|
131
|
+
* not being given one.
|
|
132
|
+
*
|
|
133
|
+
* Tests construct `DotnetProcessRegistry` directly instead of touching this.
|
|
134
|
+
*/
|
|
135
|
+
let shared = null;
|
|
136
|
+
export function sharedDotnetProcessRegistry(logger) {
|
|
137
|
+
shared ?? (shared = new DotnetProcessRegistry({ logger }));
|
|
138
|
+
return shared;
|
|
139
|
+
}
|
|
140
|
+
/** Applies the host's configured ceiling. Safe to call before anything has spawned. */
|
|
141
|
+
export function configureSharedDotnetProcessRegistry(input) {
|
|
142
|
+
sharedDotnetProcessRegistry(input.logger).setLimit(input.maxProcesses);
|
|
143
|
+
}
|
|
144
|
+
/** Shutdown sweep: nothing Otto started outlives Otto. */
|
|
145
|
+
export function killAllSharedDotnetProcesses() {
|
|
146
|
+
shared?.killAll();
|
|
147
|
+
}
|
|
148
|
+
export function resetSharedDotnetProcessRegistryForTests() {
|
|
149
|
+
shared?.killAll();
|
|
150
|
+
shared = null;
|
|
151
|
+
}
|
|
152
|
+
function normalizeLimit(value) {
|
|
153
|
+
if (value === undefined || !Number.isFinite(value)) {
|
|
154
|
+
return DEFAULT_MAX_DOTNET_PROCESSES;
|
|
155
|
+
}
|
|
156
|
+
// At least one, or the feature could never run at all and every failure would look like
|
|
157
|
+
// a limit breach rather than a misconfiguration.
|
|
158
|
+
return Math.max(1, Math.trunc(value));
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=dotnet-process-registry.js.map
|
|
@@ -59,6 +59,8 @@ export interface LspServerSpec {
|
|
|
59
59
|
rootPath: string;
|
|
60
60
|
env?: Readonly<Record<string, string>>;
|
|
61
61
|
initializationOptions?: unknown;
|
|
62
|
+
/** Mirrors the registry row; `"dotnet"` routes the spawn through the .NET process cap. */
|
|
63
|
+
runtime?: "dotnet";
|
|
62
64
|
}
|
|
63
65
|
export interface LspExitInfo {
|
|
64
66
|
code: number | null;
|
|
@@ -130,6 +132,8 @@ export declare class LspConnection {
|
|
|
130
132
|
private exitInfo;
|
|
131
133
|
private initializeResult;
|
|
132
134
|
private readonly progressTokens;
|
|
135
|
+
/** Non-null for `runtime: "dotnet"` rows; owns the registry slot and the tree kill. */
|
|
136
|
+
private tracked;
|
|
133
137
|
private readonly reportActivity;
|
|
134
138
|
private readonly reportDiagnostics;
|
|
135
139
|
readonly whenExited: Promise<LspExitInfo>;
|
|
@@ -2,6 +2,8 @@ import { spawn } from "node:child_process";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { CancellationTokenSource, createMessageConnection, StreamMessageReader, StreamMessageWriter, } from "vscode-jsonrpc/node.js";
|
|
4
4
|
import { z } from "zod";
|
|
5
|
+
import { sharedDotnetProcessRegistry, } from "../dotnet-process-registry.js";
|
|
6
|
+
import { killProcessTree, MSBUILD_ENV } from "../process-tree.js";
|
|
5
7
|
import { toFileUri } from "./uri.js";
|
|
6
8
|
/**
|
|
7
9
|
* One live language server: the spawned process, the JSON-RPC channel to it, and
|
|
@@ -134,6 +136,8 @@ export class LspConnection {
|
|
|
134
136
|
this.exitInfo = null;
|
|
135
137
|
this.initializeResult = null;
|
|
136
138
|
this.progressTokens = new Set();
|
|
139
|
+
/** Non-null for `runtime: "dotnet"` rows; owns the registry slot and the tree kill. */
|
|
140
|
+
this.tracked = null;
|
|
137
141
|
this.spec = options.spec;
|
|
138
142
|
this.logger = options.logger.child({ lspServer: options.spec.id });
|
|
139
143
|
this.requestTimeoutMs = options.requestTimeoutMs;
|
|
@@ -161,17 +165,40 @@ export class LspConnection {
|
|
|
161
165
|
static async start(options) {
|
|
162
166
|
const { spec, logger } = options;
|
|
163
167
|
const plan = planLanguageServerSpawn(spec.command, spec.args);
|
|
164
|
-
const
|
|
168
|
+
const spawnOptions = {
|
|
165
169
|
cwd: spec.rootPath,
|
|
166
|
-
|
|
170
|
+
// MSBUILD_ENV applies to every server, not just the .NET ones: a server that has
|
|
171
|
+
// never heard of MSBuild ignores the variables, and gating on the registry id
|
|
172
|
+
// would mean remembering to add each future MSBuild-backed row to a list. See
|
|
173
|
+
// process-tree.ts for why node reuse is the thing being switched off.
|
|
174
|
+
env: { ...process.env, ...MSBUILD_ENV, ...spec.env },
|
|
167
175
|
stdio: ["pipe", "pipe", "pipe"],
|
|
168
176
|
windowsHide: true,
|
|
169
177
|
windowsVerbatimArguments: plan.windowsVerbatimArguments,
|
|
170
|
-
}
|
|
178
|
+
};
|
|
179
|
+
// A .NET server counts against the machine-wide .NET cap alongside the solution
|
|
180
|
+
// sidecar, because they load the same MSBuild machinery on the same machine and a
|
|
181
|
+
// per-subsystem cap can only bound its own half of the total.
|
|
182
|
+
let tracked = null;
|
|
183
|
+
let proc;
|
|
184
|
+
if (spec.runtime === "dotnet") {
|
|
185
|
+
tracked = sharedDotnetProcessRegistry(logger).spawnTracked({
|
|
186
|
+
command: plan.command,
|
|
187
|
+
args: plan.args,
|
|
188
|
+
options: spawnOptions,
|
|
189
|
+
kind: "language-server",
|
|
190
|
+
label: `${spec.id} @ ${spec.rootPath}`,
|
|
191
|
+
});
|
|
192
|
+
proc = tracked.child;
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
proc = spawn(plan.command, [...plan.args], spawnOptions);
|
|
196
|
+
}
|
|
171
197
|
const spawnFailure = new Promise((_resolve, reject) => {
|
|
172
198
|
proc.once("error", (error) => reject(new LspSpawnError(spec.id, spec.command, error)));
|
|
173
199
|
});
|
|
174
200
|
const connection = new LspConnection(options, proc);
|
|
201
|
+
connection.tracked = tracked;
|
|
175
202
|
connection.pipeStderr();
|
|
176
203
|
try {
|
|
177
204
|
await Promise.race([connection.initialize(options.initializeTimeoutMs), spawnFailure]);
|
|
@@ -262,7 +289,15 @@ export class LspConnection {
|
|
|
262
289
|
new Promise((resolve) => setTimeout(() => resolve(false), STOP_GRACE_MS)),
|
|
263
290
|
]);
|
|
264
291
|
if (!exited) {
|
|
265
|
-
this.proc
|
|
292
|
+
// The tree, not the process: a `.cmd` shim makes `this.proc` the shell rather
|
|
293
|
+
// than the server, and an MSBuild-backed server can have workers of its own. A
|
|
294
|
+
// tracked (.NET) server goes back through the registry so its slot is freed too.
|
|
295
|
+
if (this.tracked) {
|
|
296
|
+
this.tracked.release();
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
killProcessTree(this.proc);
|
|
300
|
+
}
|
|
266
301
|
await this.whenExited;
|
|
267
302
|
}
|
|
268
303
|
}
|
|
@@ -191,6 +191,7 @@ export class LspServerPool {
|
|
|
191
191
|
args: resolved.args,
|
|
192
192
|
rootPath,
|
|
193
193
|
initializationOptions: row.initializationOptions,
|
|
194
|
+
...(row.runtime === undefined ? {} : { runtime: row.runtime }),
|
|
194
195
|
},
|
|
195
196
|
logger: this.logger,
|
|
196
197
|
initializeTimeoutMs: this.limits.initializeTimeoutMs,
|
|
@@ -29,6 +29,13 @@ export interface LspServerRow {
|
|
|
29
29
|
defaultEnabled: boolean;
|
|
30
30
|
/** Plain-words index cost, shown next to the toggle so the trade is honest. */
|
|
31
31
|
indexCost: string;
|
|
32
|
+
/**
|
|
33
|
+
* Which runtime this server is, when that changes how Otto must manage the process.
|
|
34
|
+
* `"dotnet"` routes the spawn through the shared .NET process registry, so a C# server
|
|
35
|
+
* counts against the same machine-wide cap as the solution sidecar and is swept with it.
|
|
36
|
+
* Omitted means an ordinary process the LSP pool's own cap is sufficient for.
|
|
37
|
+
*/
|
|
38
|
+
runtime?: "dotnet";
|
|
32
39
|
}
|
|
33
40
|
export interface ResolvedLspServer {
|
|
34
41
|
command: string;
|
|
@@ -45,5 +52,11 @@ export declare function languageIdForPath(filePath: string): string;
|
|
|
45
52
|
export declare function indexRowsByExtension(rows: readonly LspServerRow[]): Map<string, LspServerRow[]>;
|
|
46
53
|
export declare function rowsForExtension(extension: string): readonly LspServerRow[];
|
|
47
54
|
export declare function rowsForPath(filePath: string): readonly LspServerRow[];
|
|
48
|
-
|
|
55
|
+
/**
|
|
56
|
+
* `rootPath` null asks the host-wide question: can this machine supply the server at all?
|
|
57
|
+
* That is what the settings screen asks, since it is a host screen with no workspace in
|
|
58
|
+
* hand. The `workspaceBin` rung is skipped rather than faked, because a project's
|
|
59
|
+
* `node_modules` is the one thing a host-wide answer genuinely cannot know.
|
|
60
|
+
*/
|
|
61
|
+
export declare function resolveServerCommand(row: LspServerRow, rootPath: string | null): Promise<ResolvedLspServer | null>;
|
|
49
62
|
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -40,6 +40,9 @@ export const LSP_SERVER_ROWS = [
|
|
|
40
40
|
args: [],
|
|
41
41
|
discovery: ["path"],
|
|
42
42
|
defaultEnabled: true,
|
|
43
|
+
// A .NET global tool: the process is a `dotnet` host, and it loads projects through
|
|
44
|
+
// MSBuild, which is where the worker nodes come from. Counted and swept accordingly.
|
|
45
|
+
runtime: "dotnet",
|
|
43
46
|
indexCost: "Loads the solution on first use; seconds on a small project, longer on a large one.",
|
|
44
47
|
},
|
|
45
48
|
{
|
|
@@ -133,11 +136,20 @@ export function rowsForExtension(extension) {
|
|
|
133
136
|
export function rowsForPath(filePath) {
|
|
134
137
|
return rowsForExtension(path.extname(filePath));
|
|
135
138
|
}
|
|
139
|
+
/**
|
|
140
|
+
* `rootPath` null asks the host-wide question: can this machine supply the server at all?
|
|
141
|
+
* That is what the settings screen asks, since it is a host screen with no workspace in
|
|
142
|
+
* hand. The `workspaceBin` rung is skipped rather than faked, because a project's
|
|
143
|
+
* `node_modules` is the one thing a host-wide answer genuinely cannot know.
|
|
144
|
+
*/
|
|
136
145
|
export async function resolveServerCommand(row, rootPath) {
|
|
137
146
|
for (const rung of row.discovery) {
|
|
138
|
-
|
|
147
|
+
if (rung === "workspaceBin" && rootPath === null) {
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
const command = await resolveRung(rung, row.bin, rootPath ?? "");
|
|
139
151
|
if (command !== null) {
|
|
140
|
-
return { command, args: substituteRoot(row.args, rootPath), rung };
|
|
152
|
+
return { command, args: substituteRoot(row.args, rootPath ?? ""), rung };
|
|
141
153
|
}
|
|
142
154
|
}
|
|
143
155
|
return null;
|
|
@@ -30,6 +30,14 @@ export interface LspLanguageState {
|
|
|
30
30
|
running: boolean;
|
|
31
31
|
/** Which discovery rung supplied it, or null when nothing did. */
|
|
32
32
|
rung: string | null;
|
|
33
|
+
/**
|
|
34
|
+
* Every rung this row can ever be supplied from. A row whose only rung is `workspaceBin`
|
|
35
|
+
* comes from the project it runs in, so `installed: false` from a host-wide check means
|
|
36
|
+
* the project brings it, not that anything is missing.
|
|
37
|
+
*/
|
|
38
|
+
discovery: string[];
|
|
39
|
+
/** Absolute path to the resolved executable, or null when nothing resolved. */
|
|
40
|
+
path: string | null;
|
|
33
41
|
bin: string;
|
|
34
42
|
extensions: string[];
|
|
35
43
|
indexCost: string;
|
|
@@ -194,8 +202,16 @@ export declare class LspService {
|
|
|
194
202
|
* has to mean off immediately, or the switch is decoration.
|
|
195
203
|
*/
|
|
196
204
|
applySettings(patch: Partial<LspSettings>): Promise<void>;
|
|
197
|
-
/**
|
|
198
|
-
|
|
205
|
+
/**
|
|
206
|
+
* Per-language state for the settings screen.
|
|
207
|
+
*
|
|
208
|
+
* `rootPath` null is the host-wide answer the screen actually wants: every row this
|
|
209
|
+
* daemon knows, resolved against the rungs a host has. Settings is a host screen, so it
|
|
210
|
+
* must be able to state the machine's capabilities without a workspace open. Passing a
|
|
211
|
+
* root additionally probes that project's `node_modules/.bin`, the one rung that is
|
|
212
|
+
* genuinely per-project, and narrows "running" to servers rooted there.
|
|
213
|
+
*/
|
|
214
|
+
languageStates(rootPath: string | null): Promise<LspLanguageState[]>;
|
|
199
215
|
private isRowEnabled;
|
|
200
216
|
/**
|
|
201
217
|
* Record the buffer, then bind it to the servers for its language — spawning them if
|
|
@@ -229,7 +229,15 @@ export class LspService {
|
|
|
229
229
|
}
|
|
230
230
|
}
|
|
231
231
|
}
|
|
232
|
-
/**
|
|
232
|
+
/**
|
|
233
|
+
* Per-language state for the settings screen.
|
|
234
|
+
*
|
|
235
|
+
* `rootPath` null is the host-wide answer the screen actually wants: every row this
|
|
236
|
+
* daemon knows, resolved against the rungs a host has. Settings is a host screen, so it
|
|
237
|
+
* must be able to state the machine's capabilities without a workspace open. Passing a
|
|
238
|
+
* root additionally probes that project's `node_modules/.bin`, the one rung that is
|
|
239
|
+
* genuinely per-project, and narrows "running" to servers rooted there.
|
|
240
|
+
*/
|
|
233
241
|
async languageStates(rootPath) {
|
|
234
242
|
return Promise.all(this.pool.rows().map(async (row) => {
|
|
235
243
|
const resolved = await resolveServerCommand(row, rootPath);
|
|
@@ -237,8 +245,12 @@ export class LspService {
|
|
|
237
245
|
id: row.id,
|
|
238
246
|
enabled: this.isRowEnabled(row),
|
|
239
247
|
installed: resolved !== null,
|
|
240
|
-
running:
|
|
248
|
+
running: rootPath === null
|
|
249
|
+
? this.pool.running().some((entry) => entry.serverId === row.id)
|
|
250
|
+
: this.pool.peek(rootPath, row.id) !== null,
|
|
241
251
|
rung: resolved?.rung ?? null,
|
|
252
|
+
discovery: [...row.discovery],
|
|
253
|
+
path: resolved?.command ?? null,
|
|
242
254
|
bin: row.bin,
|
|
243
255
|
extensions: [...row.extensions],
|
|
244
256
|
indexCost: row.indexCost,
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type ChildProcess } from "node:child_process";
|
|
2
|
+
/**
|
|
3
|
+
* Kill a child process *and everything it spawned*.
|
|
4
|
+
*
|
|
5
|
+
* `ChildProcess.kill()` signals one process. That is enough for a self-contained
|
|
6
|
+
* server, and wrong for anything that shells out: on Windows a `.cmd` shim means the
|
|
7
|
+
* process we hold is `cmd.exe` and the real server is its child, and an MSBuild-backed
|
|
8
|
+
* language server leaves worker nodes of its own. Killing only the named process left
|
|
9
|
+
* those behind with no parent to reap them, which is how a machine ends up with dozens
|
|
10
|
+
* of resident `dotnet` processes after a few workspace visits.
|
|
11
|
+
*
|
|
12
|
+
* Windows has no process groups to signal, so `taskkill /T` is the only way to reach
|
|
13
|
+
* the tree. POSIX keeps the direct signal: our children are not started detached, so
|
|
14
|
+
* they have no group of their own to address, and the subsystems that could orphan
|
|
15
|
+
* grandchildren (see MSBUILD_ENV) are configured not to.
|
|
16
|
+
*/
|
|
17
|
+
export declare function killProcessTree(child: ChildProcess, signal?: NodeJS.Signals): void;
|
|
18
|
+
/**
|
|
19
|
+
* Environment every MSBuild-backed child gets.
|
|
20
|
+
*
|
|
21
|
+
* `MSBUILDDISABLENODEREUSE` is the important one. By default MSBuild keeps its worker
|
|
22
|
+
* nodes alive for 15 minutes after a build so the next build can reuse them, and each
|
|
23
|
+
* node is a separate `dotnet` process. A language server that loads a solution on
|
|
24
|
+
* every workspace visit therefore leaves a growing pile of them behind, outliving the
|
|
25
|
+
* server we reaped and answering to nobody. We trade a slightly slower cold project
|
|
26
|
+
* load for nodes that exit with the work that started them.
|
|
27
|
+
*/
|
|
28
|
+
export declare const MSBUILD_ENV: Readonly<Record<string, string>>;
|
|
29
|
+
//# sourceMappingURL=process-tree.d.ts.map
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
/**
|
|
3
|
+
* Kill a child process *and everything it spawned*.
|
|
4
|
+
*
|
|
5
|
+
* `ChildProcess.kill()` signals one process. That is enough for a self-contained
|
|
6
|
+
* server, and wrong for anything that shells out: on Windows a `.cmd` shim means the
|
|
7
|
+
* process we hold is `cmd.exe` and the real server is its child, and an MSBuild-backed
|
|
8
|
+
* language server leaves worker nodes of its own. Killing only the named process left
|
|
9
|
+
* those behind with no parent to reap them, which is how a machine ends up with dozens
|
|
10
|
+
* of resident `dotnet` processes after a few workspace visits.
|
|
11
|
+
*
|
|
12
|
+
* Windows has no process groups to signal, so `taskkill /T` is the only way to reach
|
|
13
|
+
* the tree. POSIX keeps the direct signal: our children are not started detached, so
|
|
14
|
+
* they have no group of their own to address, and the subsystems that could orphan
|
|
15
|
+
* grandchildren (see MSBUILD_ENV) are configured not to.
|
|
16
|
+
*/
|
|
17
|
+
export function killProcessTree(child, signal = "SIGKILL") {
|
|
18
|
+
const pid = child.pid;
|
|
19
|
+
if (process.platform !== "win32" || pid === undefined) {
|
|
20
|
+
child.kill(signal);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
// Detached with ignored stdio: this is fire-and-forget cleanup, and a taskkill
|
|
25
|
+
// that outlives the caller is better than one that blocks shutdown. `/F` because
|
|
26
|
+
// a language server that missed its shutdown handshake will not leave politely.
|
|
27
|
+
const killer = spawn("taskkill", ["/pid", String(pid), "/T", "/F"], {
|
|
28
|
+
stdio: "ignore",
|
|
29
|
+
windowsHide: true,
|
|
30
|
+
detached: true,
|
|
31
|
+
});
|
|
32
|
+
killer.unref();
|
|
33
|
+
// A failed taskkill (process already gone, or no permission) must not become an
|
|
34
|
+
// unhandled 'error' event on a process nobody is listening to.
|
|
35
|
+
killer.on("error", () => { });
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Fall through to the direct kill below.
|
|
39
|
+
}
|
|
40
|
+
// Always signal directly too: taskkill is asynchronous, and if it cannot run at all
|
|
41
|
+
// this is still the behaviour we had before.
|
|
42
|
+
child.kill(signal);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Environment every MSBuild-backed child gets.
|
|
46
|
+
*
|
|
47
|
+
* `MSBUILDDISABLENODEREUSE` is the important one. By default MSBuild keeps its worker
|
|
48
|
+
* nodes alive for 15 minutes after a build so the next build can reuse them, and each
|
|
49
|
+
* node is a separate `dotnet` process. A language server that loads a solution on
|
|
50
|
+
* every workspace visit therefore leaves a growing pile of them behind, outliving the
|
|
51
|
+
* server we reaped and answering to nobody. We trade a slightly slower cold project
|
|
52
|
+
* load for nodes that exit with the work that started them.
|
|
53
|
+
*/
|
|
54
|
+
export const MSBUILD_ENV = {
|
|
55
|
+
MSBUILDDISABLENODEREUSE: "1",
|
|
56
|
+
DOTNET_CLI_TELEMETRY_OPTOUT: "1",
|
|
57
|
+
DOTNET_NOLOGO: "1",
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=process-tree.js.map
|
|
@@ -816,17 +816,23 @@ export class WorkspaceFilesSession {
|
|
|
816
816
|
}
|
|
817
817
|
}
|
|
818
818
|
async handleLspServersListRequest(request) {
|
|
819
|
-
|
|
819
|
+
// No cwd is the host-wide question the settings screen asks: what can this machine
|
|
820
|
+
// run, and what is up right now. There is no path to authorize in that case, since the
|
|
821
|
+
// workspace check guards reading a directory and host-wide discovery reads none.
|
|
822
|
+
const cwd = request.cwd?.trim() ?? "";
|
|
823
|
+
const scope = cwd.length > 0 ? cwd : null;
|
|
820
824
|
try {
|
|
821
|
-
|
|
825
|
+
if (scope !== null) {
|
|
826
|
+
await this.assertCwdWithinKnownWorkspace(scope);
|
|
827
|
+
}
|
|
822
828
|
const [languages, running] = await Promise.all([
|
|
823
|
-
this.lspService.languageStates(
|
|
829
|
+
this.lspService.languageStates(scope),
|
|
824
830
|
Promise.resolve(this.lspService.running()),
|
|
825
831
|
]);
|
|
826
832
|
this.host.emit({
|
|
827
833
|
type: "lsp.servers.list.response",
|
|
828
834
|
payload: {
|
|
829
|
-
cwd
|
|
835
|
+
cwd,
|
|
830
836
|
languages,
|
|
831
837
|
running: running.map((entry) => ({
|
|
832
838
|
rootPath: entry.rootPath,
|
|
@@ -843,7 +849,7 @@ export class WorkspaceFilesSession {
|
|
|
843
849
|
this.host.emit({
|
|
844
850
|
type: "lsp.servers.list.response",
|
|
845
851
|
payload: {
|
|
846
|
-
cwd
|
|
852
|
+
cwd,
|
|
847
853
|
languages: [],
|
|
848
854
|
running: [],
|
|
849
855
|
error: getErrorMessage(error),
|
|
@@ -531,6 +531,17 @@ export declare class Session {
|
|
|
531
531
|
* Handle client heartbeat for activity tracking
|
|
532
532
|
*/
|
|
533
533
|
private handleClientHeartbeat;
|
|
534
|
+
/**
|
|
535
|
+
* Tell the workspace-scoped subsystems which workspace the client is actually in, so their
|
|
536
|
+
* periodic work follows the user instead of the whole catalogue.
|
|
537
|
+
*
|
|
538
|
+
* Derived from the focused agent's cwd rather than sent explicitly, which keeps this off
|
|
539
|
+
* the wire entirely. Deliberately **sticky**: focus goes null whenever the user moves to a
|
|
540
|
+
* tab that is not a chat (files, terminal, browser), and treating that as "no active
|
|
541
|
+
* workspace" would stop observing the very workspace they are sitting in. Only focusing an
|
|
542
|
+
* agent in a *different* workspace moves it.
|
|
543
|
+
*/
|
|
544
|
+
private syncActiveWorkspaceFromActivity;
|
|
534
545
|
private clearFocusedTerminalAttention;
|
|
535
546
|
/**
|
|
536
547
|
* Handle push token registration
|
|
@@ -4280,6 +4280,29 @@ export class Session {
|
|
|
4280
4280
|
if (msg.appVisible && focusedTerminalId) {
|
|
4281
4281
|
void this.clearFocusedTerminalAttention(focusedTerminalId);
|
|
4282
4282
|
}
|
|
4283
|
+
this.syncActiveWorkspaceFromActivity();
|
|
4284
|
+
}
|
|
4285
|
+
/**
|
|
4286
|
+
* Tell the workspace-scoped subsystems which workspace the client is actually in, so their
|
|
4287
|
+
* periodic work follows the user instead of the whole catalogue.
|
|
4288
|
+
*
|
|
4289
|
+
* Derived from the focused agent's cwd rather than sent explicitly, which keeps this off
|
|
4290
|
+
* the wire entirely. Deliberately **sticky**: focus goes null whenever the user moves to a
|
|
4291
|
+
* tab that is not a chat (files, terminal, browser), and treating that as "no active
|
|
4292
|
+
* workspace" would stop observing the very workspace they are sitting in. Only focusing an
|
|
4293
|
+
* agent in a *different* workspace moves it.
|
|
4294
|
+
*/
|
|
4295
|
+
syncActiveWorkspaceFromActivity() {
|
|
4296
|
+
const focusedAgentId = this.clientActivity?.focusedAgentId;
|
|
4297
|
+
if (!focusedAgentId) {
|
|
4298
|
+
return;
|
|
4299
|
+
}
|
|
4300
|
+
const cwd = this.agentManager.getAgent(focusedAgentId)?.cwd;
|
|
4301
|
+
if (!cwd) {
|
|
4302
|
+
return;
|
|
4303
|
+
}
|
|
4304
|
+
this.workspaceGitService.setActiveWorkspace(cwd);
|
|
4305
|
+
this.lspService.setActiveWorkspace(cwd);
|
|
4283
4306
|
}
|
|
4284
4307
|
async clearFocusedTerminalAttention(terminalId) {
|
|
4285
4308
|
const terminalManager = this.terminalManager;
|
|
@@ -47,6 +47,8 @@ export declare class DotnetProbe {
|
|
|
47
47
|
private handshake;
|
|
48
48
|
/** Settled by the first line the process writes, which must be the handshake. */
|
|
49
49
|
private handshakeWaiter;
|
|
50
|
+
/** Set by `start` immediately after construction; owns the registry slot and the kill. */
|
|
51
|
+
private tracked;
|
|
50
52
|
private constructor();
|
|
51
53
|
/**
|
|
52
54
|
* Spawn and wait for the handshake. The handshake is not decoration: it is where the process
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { spawn } from "node:child_process";
|
|
2
1
|
import { z } from "zod";
|
|
2
|
+
import { sharedDotnetProcessRegistry, } from "../../dotnet-process-registry.js";
|
|
3
3
|
import { SUPPORTED_PROTOCOL_VERSION } from "./bootstrap.js";
|
|
4
4
|
/**
|
|
5
5
|
* One sidecar process: spawn, handshake, newline-delimited JSON framing, per-request timeouts,
|
|
@@ -47,6 +47,8 @@ export class DotnetProbe {
|
|
|
47
47
|
this.handshake = null;
|
|
48
48
|
/** Settled by the first line the process writes, which must be the handshake. */
|
|
49
49
|
this.handshakeWaiter = null;
|
|
50
|
+
/** Set by `start` immediately after construction; owns the registry slot and the kill. */
|
|
51
|
+
this.tracked = null;
|
|
50
52
|
this.child = child;
|
|
51
53
|
this.logger = options.logger;
|
|
52
54
|
this.requestTimeoutMs = options.requestTimeoutMs;
|
|
@@ -75,20 +77,35 @@ export class DotnetProbe {
|
|
|
75
77
|
* is what keeps a stale `dist/` from producing garbled trees rather than a clear failure.
|
|
76
78
|
*/
|
|
77
79
|
static async start(options) {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
80
|
+
// Through the registry, never `spawn` directly: it is what enforces the machine-wide
|
|
81
|
+
// .NET process cap and what guarantees this process is swept on shutdown even if the
|
|
82
|
+
// pool loses track of it. `MSBUILD_ENV` is applied there, for every caller at once.
|
|
83
|
+
const tracked = sharedDotnetProcessRegistry(options.logger).spawnTracked({
|
|
84
|
+
command: options.runtime.dotnetCommand,
|
|
85
|
+
args: [options.runtime.entryPath],
|
|
86
|
+
options: {
|
|
87
|
+
cwd: options.cwd,
|
|
88
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
89
|
+
env: {
|
|
90
|
+
...process.env,
|
|
91
|
+
// MSBuild colours and progress would corrupt the NDJSON stream if anything ever
|
|
92
|
+
// wrote them to stdout, and neither is readable by a machine anyway.
|
|
93
|
+
NO_COLOR: "1",
|
|
94
|
+
},
|
|
88
95
|
},
|
|
96
|
+
kind: "solution-sidecar",
|
|
97
|
+
label: options.cwd,
|
|
89
98
|
});
|
|
90
|
-
const probe = new DotnetProbe(child, options);
|
|
91
|
-
|
|
99
|
+
const probe = new DotnetProbe(tracked.child, options);
|
|
100
|
+
probe.tracked = tracked;
|
|
101
|
+
try {
|
|
102
|
+
await probe.awaitHandshake(options.handshakeTimeoutMs);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
// A sidecar that never reports ready still holds a slot and a live process tree.
|
|
106
|
+
tracked.release();
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
92
109
|
return probe;
|
|
93
110
|
}
|
|
94
111
|
get sdkVersion() {
|
|
@@ -123,7 +140,9 @@ export class DotnetProbe {
|
|
|
123
140
|
}
|
|
124
141
|
this.exited = true;
|
|
125
142
|
this.child.stdin.end();
|
|
126
|
-
|
|
143
|
+
// Release, not kill: the registry owns the tree kill and the slot, so going around it
|
|
144
|
+
// would free the process without freeing the capacity it was holding.
|
|
145
|
+
this.tracked?.release();
|
|
127
146
|
this.rejectAll(new ProbeUnavailableError("Solution sidecar stopped"));
|
|
128
147
|
}
|
|
129
148
|
awaitHandshake(timeoutMs) {
|