@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.
Files changed (333) hide show
  1. package/dist/server/server/agent/providers/claude/agent.js +48 -3
  2. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts +10 -1
  3. package/dist/server/server/agent/providers/mock-load-test-agent.js +151 -5
  4. package/dist/server/server/agent/synthetic-conversation.d.ts +18 -0
  5. package/dist/server/server/agent/synthetic-conversation.js +567 -0
  6. package/dist/server/server/dotnet-process-registry.d.ts +111 -0
  7. package/dist/server/server/dotnet-process-registry.js +160 -0
  8. package/dist/server/server/lsp/connection.d.ts +4 -0
  9. package/dist/server/server/lsp/connection.js +39 -4
  10. package/dist/server/server/lsp/pool.js +1 -0
  11. package/dist/server/server/lsp/registry.d.ts +14 -1
  12. package/dist/server/server/lsp/registry.js +14 -2
  13. package/dist/server/server/lsp/service.d.ts +18 -2
  14. package/dist/server/server/lsp/service.js +14 -2
  15. package/dist/server/server/process-tree.d.ts +29 -0
  16. package/dist/server/server/process-tree.js +59 -0
  17. package/dist/server/server/session/files/workspace-files-session.js +11 -5
  18. package/dist/server/server/session.d.ts +11 -0
  19. package/dist/server/server/session.js +23 -0
  20. package/dist/server/server/solution-model/dotnet/probe.d.ts +2 -0
  21. package/dist/server/server/solution-model/dotnet/probe.js +33 -14
  22. package/dist/server/server/websocket-server.js +10 -0
  23. package/dist/server/server/workspace-git-service.d.ts +36 -0
  24. package/dist/server/server/workspace-git-service.js +110 -6
  25. package/dist/server/terminal/shell-integration/zsh/.zshenv +17 -17
  26. package/dist/server/terminal/shell-integration/zsh/otto-integration.zsh +32 -32
  27. package/dist/server/terminal/terminal.js +12 -2
  28. package/dist/server/web-ui/_expo/static/js/web/{__common-6d2299ed037bec2393245a7c0bf1c643.js → __common-8ab6f044d26f0be8899aaf3a990c8b65.js} +1855 -1855
  29. package/dist/server/web-ui/_expo/static/js/web/__common-8ab6f044d26f0be8899aaf3a990c8b65.js.br +0 -0
  30. package/dist/server/web-ui/_expo/static/js/web/__common-8ab6f044d26f0be8899aaf3a990c8b65.js.gz +0 -0
  31. package/dist/server/web-ui/_expo/static/js/web/{abnfDiagram-VRR7QNED-c3c2ca327b2d7ad9af3caa1cba884908.js → abnfDiagram-VRR7QNED-e33c74fb52c02570f5105b2e70194df6.js} +1 -1
  32. package/dist/server/web-ui/_expo/static/js/web/abnfDiagram-VRR7QNED-e33c74fb52c02570f5105b2e70194df6.js.br +0 -0
  33. package/dist/server/web-ui/_expo/static/js/web/abnfDiagram-VRR7QNED-e33c74fb52c02570f5105b2e70194df6.js.gz +0 -0
  34. package/dist/server/web-ui/_expo/static/js/web/{architecture-TIHT7OUA-0cf23d3dc9775f216c01daae4aae250a.js → architecture-TIHT7OUA-cc3220b1ecee09a0e5c0b99fbf886b82.js} +1 -1
  35. package/dist/server/web-ui/_expo/static/js/web/{architecture-TIHT7OUA-0cf23d3dc9775f216c01daae4aae250a.js.br → architecture-TIHT7OUA-cc3220b1ecee09a0e5c0b99fbf886b82.js.br} +0 -0
  36. package/dist/server/web-ui/_expo/static/js/web/architecture-TIHT7OUA-cc3220b1ecee09a0e5c0b99fbf886b82.js.gz +0 -0
  37. package/dist/server/web-ui/_expo/static/js/web/{architectureDiagram-ZJ3FMSHR-f3bce96124559dc19faa4d90aca4afd4.js → architectureDiagram-ZJ3FMSHR-551f5e17dd33a890195b5d060cd75ad2.js} +4 -4
  38. package/dist/server/web-ui/_expo/static/js/web/architectureDiagram-ZJ3FMSHR-551f5e17dd33a890195b5d060cd75ad2.js.br +0 -0
  39. package/dist/server/web-ui/_expo/static/js/web/architectureDiagram-ZJ3FMSHR-551f5e17dd33a890195b5d060cd75ad2.js.gz +0 -0
  40. package/dist/server/web-ui/_expo/static/js/web/{blockDiagram-677ZJIJ3-839486928c0f151128a5e2836aa07080.js → blockDiagram-677ZJIJ3-901d7bbed0b0f6ae3439f6bff861b42f.js} +1 -1
  41. package/dist/server/web-ui/_expo/static/js/web/blockDiagram-677ZJIJ3-901d7bbed0b0f6ae3439f6bff861b42f.js.br +0 -0
  42. package/dist/server/web-ui/_expo/static/js/web/{blockDiagram-677ZJIJ3-839486928c0f151128a5e2836aa07080.js.gz → blockDiagram-677ZJIJ3-901d7bbed0b0f6ae3439f6bff861b42f.js.gz} +0 -0
  43. package/dist/server/web-ui/_expo/static/js/web/{c4Diagram-LMCZKHZV-197212c21520a6b659a5649e683619d0.js → c4Diagram-LMCZKHZV-781ca106d0a19454ec9e559bcba3706c.js} +1 -1
  44. package/dist/server/web-ui/_expo/static/js/web/c4Diagram-LMCZKHZV-781ca106d0a19454ec9e559bcba3706c.js.br +0 -0
  45. package/dist/server/web-ui/_expo/static/js/web/{c4Diagram-LMCZKHZV-197212c21520a6b659a5649e683619d0.js.gz → c4Diagram-LMCZKHZV-781ca106d0a19454ec9e559bcba3706c.js.gz} +0 -0
  46. package/dist/server/web-ui/_expo/static/js/web/{classDiagram-OUVF2IWQ-a0a0fbefc96d14b6619c84fc4f92a39a.js → classDiagram-OUVF2IWQ-1d00e0cc9165446f1bac84fed1e9bbed.js} +1 -1
  47. package/dist/server/web-ui/_expo/static/js/web/classDiagram-OUVF2IWQ-1d00e0cc9165446f1bac84fed1e9bbed.js.br +0 -0
  48. package/dist/server/web-ui/_expo/static/js/web/classDiagram-OUVF2IWQ-1d00e0cc9165446f1bac84fed1e9bbed.js.gz +0 -0
  49. package/dist/server/web-ui/_expo/static/js/web/{classDiagram-v2-EOCWNBFH-e979239c6d160123d5b4847253a8a70e.js → classDiagram-v2-EOCWNBFH-52b658fff2b9f58ece5d8528cb381359.js} +1 -1
  50. package/dist/server/web-ui/_expo/static/js/web/classDiagram-v2-EOCWNBFH-52b658fff2b9f58ece5d8528cb381359.js.br +0 -0
  51. package/dist/server/web-ui/_expo/static/js/web/classDiagram-v2-EOCWNBFH-52b658fff2b9f58ece5d8528cb381359.js.gz +0 -0
  52. package/dist/server/web-ui/_expo/static/js/web/{cose-bilkent-JH36ORCC-bbc39a6bb062ba85e433f91becc37a65.js → cose-bilkent-JH36ORCC-9256f0de343b59ecc5775210909c4f8b.js} +4 -4
  53. package/dist/server/web-ui/_expo/static/js/web/cose-bilkent-JH36ORCC-9256f0de343b59ecc5775210909c4f8b.js.br +0 -0
  54. package/dist/server/web-ui/_expo/static/js/web/cose-bilkent-JH36ORCC-9256f0de343b59ecc5775210909c4f8b.js.gz +0 -0
  55. package/dist/server/web-ui/_expo/static/js/web/{cynefin-VYW2F7L2-ea0e514652627740f5a2ed32b027a164.js → cynefin-VYW2F7L2-feb2750e4e4322ac8e6c6049fcfd73cb.js} +1 -1
  56. package/dist/server/web-ui/_expo/static/js/web/cynefin-VYW2F7L2-feb2750e4e4322ac8e6c6049fcfd73cb.js.br +0 -0
  57. package/dist/server/web-ui/_expo/static/js/web/cynefin-VYW2F7L2-feb2750e4e4322ac8e6c6049fcfd73cb.js.gz +0 -0
  58. package/dist/server/web-ui/_expo/static/js/web/{cynefinDiagram-TSTJHNR4-0446f9b57ba778e5883d93e24692ffce.js → cynefinDiagram-TSTJHNR4-b98dc254a5fa6581f997a0809a9e0fc0.js} +1 -1
  59. package/dist/server/web-ui/_expo/static/js/web/cynefinDiagram-TSTJHNR4-b98dc254a5fa6581f997a0809a9e0fc0.js.br +0 -0
  60. package/dist/server/web-ui/_expo/static/js/web/cynefinDiagram-TSTJHNR4-b98dc254a5fa6581f997a0809a9e0fc0.js.gz +0 -0
  61. package/dist/server/web-ui/_expo/static/js/web/{dagre-VKFMJZFB-69f7aa52521b06a95874b1ac67508def.js → dagre-VKFMJZFB-ef67573fa401136e68fc41adf07ef447.js} +1 -1
  62. package/dist/server/web-ui/_expo/static/js/web/dagre-VKFMJZFB-ef67573fa401136e68fc41adf07ef447.js.br +0 -0
  63. package/dist/server/web-ui/_expo/static/js/web/dagre-VKFMJZFB-ef67573fa401136e68fc41adf07ef447.js.gz +0 -0
  64. package/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-bridge-0ae8aadd6e53625f59d62eceb1f06ede.js → desktop-attachment-bridge-d6e4f29a78dc1bb5b70d4ef2c440c6c0.js} +1 -1
  65. package/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-bridge-0ae8aadd6e53625f59d62eceb1f06ede.js.br → desktop-attachment-bridge-d6e4f29a78dc1bb5b70d4ef2c440c6c0.js.br} +0 -0
  66. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-d6e4f29a78dc1bb5b70d4ef2c440c6c0.js.gz +0 -0
  67. package/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-store-ecd775c6aee79778f49274a5bffadc5a.js → desktop-attachment-store-e2e403c64de4bc638e1800c9b226ede3.js} +1 -1
  68. package/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-store-ecd775c6aee79778f49274a5bffadc5a.js.br → desktop-attachment-store-e2e403c64de4bc638e1800c9b226ede3.js.br} +0 -0
  69. package/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-store-ecd775c6aee79778f49274a5bffadc5a.js.gz → desktop-attachment-store-e2e403c64de4bc638e1800c9b226ede3.js.gz} +0 -0
  70. package/dist/server/web-ui/_expo/static/js/web/{diagram-FQU43EPY-bd0940835ccad031627e285aaba6d5ec.js → diagram-FQU43EPY-c6317fa4c07b63f54be30797f25060c7.js} +1 -1
  71. package/dist/server/web-ui/_expo/static/js/web/diagram-FQU43EPY-c6317fa4c07b63f54be30797f25060c7.js.br +0 -0
  72. package/dist/server/web-ui/_expo/static/js/web/{diagram-FQU43EPY-bd0940835ccad031627e285aaba6d5ec.js.gz → diagram-FQU43EPY-c6317fa4c07b63f54be30797f25060c7.js.gz} +0 -0
  73. package/dist/server/web-ui/_expo/static/js/web/{diagram-G47NLZAW-217e2cd3275924bc08fc6ebe79e95e48.js → diagram-G47NLZAW-70713a059ca65ca1241036cc96679bc5.js} +1 -1
  74. package/dist/server/web-ui/_expo/static/js/web/diagram-G47NLZAW-70713a059ca65ca1241036cc96679bc5.js.br +0 -0
  75. package/dist/server/web-ui/_expo/static/js/web/diagram-G47NLZAW-70713a059ca65ca1241036cc96679bc5.js.gz +0 -0
  76. package/dist/server/web-ui/_expo/static/js/web/{diagram-NH7WQ7WH-fbd3aa35ca68df15ee378fb63241b333.js → diagram-NH7WQ7WH-1bebddae0fd6a49ff82d7ea2b738823d.js} +1 -1
  77. package/dist/server/web-ui/_expo/static/js/web/diagram-NH7WQ7WH-1bebddae0fd6a49ff82d7ea2b738823d.js.br +0 -0
  78. package/dist/server/web-ui/_expo/static/js/web/diagram-NH7WQ7WH-1bebddae0fd6a49ff82d7ea2b738823d.js.gz +0 -0
  79. package/dist/server/web-ui/_expo/static/js/web/{diagram-OA4YK3LP-48ebb0ba6bcb34417649bd55070542ad.js → diagram-OA4YK3LP-bf33c3e1800c9f503dd88e41e97c5974.js} +1 -1
  80. package/dist/server/web-ui/_expo/static/js/web/diagram-OA4YK3LP-bf33c3e1800c9f503dd88e41e97c5974.js.br +0 -0
  81. package/dist/server/web-ui/_expo/static/js/web/diagram-OA4YK3LP-bf33c3e1800c9f503dd88e41e97c5974.js.gz +0 -0
  82. package/dist/server/web-ui/_expo/static/js/web/{diagram-WEI45ONY-2be85db5396495fa970419f77587cf14.js → diagram-WEI45ONY-23d90af03030beb514d3a953920e6c9b.js} +1 -1
  83. package/dist/server/web-ui/_expo/static/js/web/diagram-WEI45ONY-23d90af03030beb514d3a953920e6c9b.js.br +0 -0
  84. package/dist/server/web-ui/_expo/static/js/web/diagram-WEI45ONY-23d90af03030beb514d3a953920e6c9b.js.gz +0 -0
  85. package/dist/server/web-ui/_expo/static/js/web/{ebnfDiagram-CCIWWBDH-3c5c44cf8340b641d13076adab77967b.js → ebnfDiagram-CCIWWBDH-5119b538047d9c00ae05855ae1cf490f.js} +1 -1
  86. package/dist/server/web-ui/_expo/static/js/web/ebnfDiagram-CCIWWBDH-5119b538047d9c00ae05855ae1cf490f.js.br +0 -0
  87. package/dist/server/web-ui/_expo/static/js/web/ebnfDiagram-CCIWWBDH-5119b538047d9c00ae05855ae1cf490f.js.gz +0 -0
  88. package/dist/server/web-ui/_expo/static/js/web/{erDiagram-Q63AITRT-81762a72bd33bf1042e4cad4f688abf2.js → erDiagram-Q63AITRT-6f7e9f420388e6291e5a8ae6da7ab3ad.js} +1 -1
  89. package/dist/server/web-ui/_expo/static/js/web/erDiagram-Q63AITRT-6f7e9f420388e6291e5a8ae6da7ab3ad.js.br +0 -0
  90. package/dist/server/web-ui/_expo/static/js/web/erDiagram-Q63AITRT-6f7e9f420388e6291e5a8ae6da7ab3ad.js.gz +0 -0
  91. package/dist/server/web-ui/_expo/static/js/web/{eventmodeling-45OFAUF4-11d7615d746c5304c28d4931ec9ca5f7.js → eventmodeling-45OFAUF4-510d785624b4496077e120d2c12a6b88.js} +1 -1
  92. package/dist/server/web-ui/_expo/static/js/web/{eventmodeling-45OFAUF4-11d7615d746c5304c28d4931ec9ca5f7.js.br → eventmodeling-45OFAUF4-510d785624b4496077e120d2c12a6b88.js.br} +0 -0
  93. package/dist/server/web-ui/_expo/static/js/web/eventmodeling-45OFAUF4-510d785624b4496077e120d2c12a6b88.js.gz +0 -0
  94. package/dist/server/web-ui/_expo/static/js/web/{flowDiagram-23GEKE2U-5a2af608a9500bb36da0595c3464a562.js → flowDiagram-23GEKE2U-7bf4721b6de004ef55a0787bbbc6b9ac.js} +1 -1
  95. package/dist/server/web-ui/_expo/static/js/web/flowDiagram-23GEKE2U-7bf4721b6de004ef55a0787bbbc6b9ac.js.br +0 -0
  96. package/dist/server/web-ui/_expo/static/js/web/flowDiagram-23GEKE2U-7bf4721b6de004ef55a0787bbbc6b9ac.js.gz +0 -0
  97. package/dist/server/web-ui/_expo/static/js/web/{ganttDiagram-NO4QXBWP-379aae0f5fb2652d90827c7f8b2472d2.js → ganttDiagram-NO4QXBWP-53b4651e7e78eb3212ec05a0d72b8932.js} +5 -5
  98. package/dist/server/web-ui/_expo/static/js/web/ganttDiagram-NO4QXBWP-53b4651e7e78eb3212ec05a0d72b8932.js.br +0 -0
  99. package/dist/server/web-ui/_expo/static/js/web/{ganttDiagram-NO4QXBWP-379aae0f5fb2652d90827c7f8b2472d2.js.gz → ganttDiagram-NO4QXBWP-53b4651e7e78eb3212ec05a0d72b8932.js.gz} +0 -0
  100. package/dist/server/web-ui/_expo/static/js/web/{gitGraph-TEB2WS4Q-d978b8a2d1fd8fcc132b16ef8d57dd7c.js → gitGraph-TEB2WS4Q-03038b65af81bb0d4755a35c737decf0.js} +1 -1
  101. package/dist/server/web-ui/_expo/static/js/web/{gitGraph-TEB2WS4Q-d978b8a2d1fd8fcc132b16ef8d57dd7c.js.br → gitGraph-TEB2WS4Q-03038b65af81bb0d4755a35c737decf0.js.br} +0 -0
  102. package/dist/server/web-ui/_expo/static/js/web/gitGraph-TEB2WS4Q-03038b65af81bb0d4755a35c737decf0.js.gz +0 -0
  103. package/dist/server/web-ui/_expo/static/js/web/{gitGraphDiagram-IHSO6WYX-6cb31a37312da231b8f10f86b0d4de52.js → gitGraphDiagram-IHSO6WYX-49a762c3f7ecc4315bcde2731f090410.js} +1 -1
  104. package/dist/server/web-ui/_expo/static/js/web/{gitGraphDiagram-IHSO6WYX-6cb31a37312da231b8f10f86b0d4de52.js.br → gitGraphDiagram-IHSO6WYX-49a762c3f7ecc4315bcde2731f090410.js.br} +0 -0
  105. package/dist/server/web-ui/_expo/static/js/web/{gitGraphDiagram-IHSO6WYX-6cb31a37312da231b8f10f86b0d4de52.js.gz → gitGraphDiagram-IHSO6WYX-49a762c3f7ecc4315bcde2731f090410.js.gz} +0 -0
  106. package/dist/server/web-ui/_expo/static/js/web/{index-4c86d3c14df18b18b3b9a6329b896faf.js → index-6e99d24bcc09db447a2d8b0c747a5263.js} +74 -73
  107. package/dist/server/web-ui/_expo/static/js/web/index-6e99d24bcc09db447a2d8b0c747a5263.js.br +0 -0
  108. package/dist/server/web-ui/_expo/static/js/web/index-6e99d24bcc09db447a2d8b0c747a5263.js.gz +0 -0
  109. package/dist/server/web-ui/_expo/static/js/web/{indexeddb-attachment-store-5a90994af83f12740a986d9f1cb55cc9.js → indexeddb-attachment-store-ea6e57606ef25b42cf1e6665a3f5313e.js} +1 -1
  110. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-ea6e57606ef25b42cf1e6665a3f5313e.js.br +0 -0
  111. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-ea6e57606ef25b42cf1e6665a3f5313e.js.gz +0 -0
  112. package/dist/server/web-ui/_expo/static/js/web/{info-DKCQHKI2-b59d0dbb9a30d361ddc796a5cfa7fc41.js → info-DKCQHKI2-61f5b3ca4e5cea885d6254ccef0626c4.js} +1 -1
  113. package/dist/server/web-ui/_expo/static/js/web/{info-DKCQHKI2-b59d0dbb9a30d361ddc796a5cfa7fc41.js.br → info-DKCQHKI2-61f5b3ca4e5cea885d6254ccef0626c4.js.br} +0 -0
  114. package/dist/server/web-ui/_expo/static/js/web/info-DKCQHKI2-61f5b3ca4e5cea885d6254ccef0626c4.js.gz +0 -0
  115. package/dist/server/web-ui/_expo/static/js/web/{infoDiagram-FWYZ7A6U-0c4368de61a3bdbfbc73b143423981d9.js → infoDiagram-FWYZ7A6U-f47fe897045bf4e6949ea71abdae89fe.js} +1 -1
  116. package/dist/server/web-ui/_expo/static/js/web/infoDiagram-FWYZ7A6U-f47fe897045bf4e6949ea71abdae89fe.js.br +0 -0
  117. package/dist/server/web-ui/_expo/static/js/web/infoDiagram-FWYZ7A6U-f47fe897045bf4e6949ea71abdae89fe.js.gz +0 -0
  118. package/dist/server/web-ui/_expo/static/js/web/{ishikawaDiagram-FXEZZL3T-1474e73532a16148b7944d3b0f896197.js → ishikawaDiagram-FXEZZL3T-bf6597ebf1b0773e1d39dea7fcf8800f.js} +1 -1
  119. package/dist/server/web-ui/_expo/static/js/web/ishikawaDiagram-FXEZZL3T-bf6597ebf1b0773e1d39dea7fcf8800f.js.br +0 -0
  120. package/dist/server/web-ui/_expo/static/js/web/{ishikawaDiagram-FXEZZL3T-1474e73532a16148b7944d3b0f896197.js.gz → ishikawaDiagram-FXEZZL3T-bf6597ebf1b0773e1d39dea7fcf8800f.js.gz} +0 -0
  121. package/dist/server/web-ui/_expo/static/js/web/{journeyDiagram-5HDEW3XC-13df6cce9cb7f0e6ffbaa9a614feeee4.js → journeyDiagram-5HDEW3XC-7dc3a04c43574b6aac59a4520d111129.js} +1 -1
  122. package/dist/server/web-ui/_expo/static/js/web/journeyDiagram-5HDEW3XC-7dc3a04c43574b6aac59a4520d111129.js.br +0 -0
  123. package/dist/server/web-ui/_expo/static/js/web/{journeyDiagram-5HDEW3XC-13df6cce9cb7f0e6ffbaa9a614feeee4.js.gz → journeyDiagram-5HDEW3XC-7dc3a04c43574b6aac59a4520d111129.js.gz} +0 -0
  124. package/dist/server/web-ui/_expo/static/js/web/{kanban-definition-HUTT4EX6-6b56c0da5302838e7e1c46bf7460ea35.js → kanban-definition-HUTT4EX6-7be647182b1c3291e9330de01d329adf.js} +1 -1
  125. package/dist/server/web-ui/_expo/static/js/web/kanban-definition-HUTT4EX6-7be647182b1c3291e9330de01d329adf.js.br +0 -0
  126. package/dist/server/web-ui/_expo/static/js/web/{kanban-definition-HUTT4EX6-6b56c0da5302838e7e1c46bf7460ea35.js.gz → kanban-definition-HUTT4EX6-7be647182b1c3291e9330de01d329adf.js.gz} +0 -0
  127. package/dist/server/web-ui/_expo/static/js/web/{katex-7f6ac23f118e6e9264fdfa96e335134f.js → katex-c0aeb8f935f239b315771d04dc16b1e7.js} +1 -1
  128. package/dist/server/web-ui/_expo/static/js/web/katex-c0aeb8f935f239b315771d04dc16b1e7.js.br +0 -0
  129. package/dist/server/web-ui/_expo/static/js/web/{katex-7f6ac23f118e6e9264fdfa96e335134f.js.gz → katex-c0aeb8f935f239b315771d04dc16b1e7.js.gz} +0 -0
  130. package/dist/server/web-ui/_expo/static/js/web/{mermaid-75931b049ce3e66af3cd8ddf01e1cd23.js → mermaid-f4cf4ad300756762c2eed3bd65fecb6c.js} +9 -9
  131. package/dist/server/web-ui/_expo/static/js/web/mermaid-f4cf4ad300756762c2eed3bd65fecb6c.js.br +0 -0
  132. package/dist/server/web-ui/_expo/static/js/web/{mermaid-75931b049ce3e66af3cd8ddf01e1cd23.js.gz → mermaid-f4cf4ad300756762c2eed3bd65fecb6c.js.gz} +0 -0
  133. package/dist/server/web-ui/_expo/static/js/web/{mindmap-definition-LN4V7U3C-fafde693a329ca39007debdd961134b4.js → mindmap-definition-LN4V7U3C-5a266041ac99a182f60e7d1ade3053a7.js} +21 -21
  134. package/dist/server/web-ui/_expo/static/js/web/mindmap-definition-LN4V7U3C-5a266041ac99a182f60e7d1ade3053a7.js.br +0 -0
  135. package/dist/server/web-ui/_expo/static/js/web/mindmap-definition-LN4V7U3C-5a266041ac99a182f60e7d1ade3053a7.js.gz +0 -0
  136. package/dist/server/web-ui/_expo/static/js/web/{native-file-attachment-store-645b8ffe39c60c05c0a224e6efcb5a9c.js → native-file-attachment-store-78cca157541c8af3aff9a719f7b951be.js} +3 -3
  137. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-78cca157541c8af3aff9a719f7b951be.js.br +11 -0
  138. 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
  139. package/dist/server/web-ui/_expo/static/js/web/{orchestration-graph-panel-2d117a5764d11c411d707e37fba93a1b.js → orchestration-graph-panel-77d13bf34f0ff1ffed397666b8009b21.js} +5 -5
  140. package/dist/server/web-ui/_expo/static/js/web/orchestration-graph-panel-77d13bf34f0ff1ffed397666b8009b21.js.br +0 -0
  141. package/dist/server/web-ui/_expo/static/js/web/{orchestration-graph-panel-2d117a5764d11c411d707e37fba93a1b.js.gz → orchestration-graph-panel-77d13bf34f0ff1ffed397666b8009b21.js.gz} +0 -0
  142. package/dist/server/web-ui/_expo/static/js/web/{packet-7NZHBO7P-61a485e09ee448c823fffbdfc588826d.js → packet-7NZHBO7P-8f2693917ef293414f42718be4e1d738.js} +1 -1
  143. package/dist/server/web-ui/_expo/static/js/web/{packet-7NZHBO7P-61a485e09ee448c823fffbdfc588826d.js.br → packet-7NZHBO7P-8f2693917ef293414f42718be4e1d738.js.br} +1 -1
  144. package/dist/server/web-ui/_expo/static/js/web/packet-7NZHBO7P-8f2693917ef293414f42718be4e1d738.js.gz +0 -0
  145. package/dist/server/web-ui/_expo/static/js/web/{pegDiagram-2B236MQR-035fe1b93f90f4775e99aea533552b42.js → pegDiagram-2B236MQR-58835705d6a13a27b59f4c85aeaf7012.js} +1 -1
  146. package/dist/server/web-ui/_expo/static/js/web/pegDiagram-2B236MQR-58835705d6a13a27b59f4c85aeaf7012.js.br +0 -0
  147. package/dist/server/web-ui/_expo/static/js/web/pegDiagram-2B236MQR-58835705d6a13a27b59f4c85aeaf7012.js.gz +0 -0
  148. package/dist/server/web-ui/_expo/static/js/web/{pie-RZYD4A2V-f6208df18db61d490f4811b192b77dec.js → pie-RZYD4A2V-8b0f157b04de7752354fc779ddbf49a4.js} +1 -1
  149. package/dist/server/web-ui/_expo/static/js/web/pie-RZYD4A2V-8b0f157b04de7752354fc779ddbf49a4.js.br +0 -0
  150. package/dist/server/web-ui/_expo/static/js/web/pie-RZYD4A2V-8b0f157b04de7752354fc779ddbf49a4.js.gz +0 -0
  151. package/dist/server/web-ui/_expo/static/js/web/{pieDiagram-ENE6RG2P-c78c82bf26f51acb7b7c44ae51eba9c6.js → pieDiagram-ENE6RG2P-a0061a200414abc917902506915ccabe.js} +1 -1
  152. package/dist/server/web-ui/_expo/static/js/web/pieDiagram-ENE6RG2P-a0061a200414abc917902506915ccabe.js.br +0 -0
  153. package/dist/server/web-ui/_expo/static/js/web/{pieDiagram-ENE6RG2P-c78c82bf26f51acb7b7c44ae51eba9c6.js.gz → pieDiagram-ENE6RG2P-a0061a200414abc917902506915ccabe.js.gz} +0 -0
  154. package/dist/server/web-ui/_expo/static/js/web/{quadrantDiagram-ABIIQ3AL-efff1486187742fe8683a966651df92f.js → quadrantDiagram-ABIIQ3AL-ccae11df8eb112141ab52dc3b055366d.js} +1 -1
  155. package/dist/server/web-ui/_expo/static/js/web/quadrantDiagram-ABIIQ3AL-ccae11df8eb112141ab52dc3b055366d.js.br +0 -0
  156. package/dist/server/web-ui/_expo/static/js/web/{quadrantDiagram-ABIIQ3AL-efff1486187742fe8683a966651df92f.js.gz → quadrantDiagram-ABIIQ3AL-ccae11df8eb112141ab52dc3b055366d.js.gz} +0 -0
  157. package/dist/server/web-ui/_expo/static/js/web/{radar-I7S5WNFK-0150ed7f0d337fc7ec70638a3656ea06.js → radar-I7S5WNFK-0768be5c16d166cd094d75a4c9fba55a.js} +1 -1
  158. package/dist/server/web-ui/_expo/static/js/web/{radar-I7S5WNFK-0150ed7f0d337fc7ec70638a3656ea06.js.br → radar-I7S5WNFK-0768be5c16d166cd094d75a4c9fba55a.js.br} +0 -0
  159. package/dist/server/web-ui/_expo/static/js/web/radar-I7S5WNFK-0768be5c16d166cd094d75a4c9fba55a.js.gz +0 -0
  160. package/dist/server/web-ui/_expo/static/js/web/{railroad-3IZDKUUU-c6e94ec81a88c02cb339de59f29386f5.js → railroad-3IZDKUUU-55b81b14fbc2908aa06995bd62b57b43.js} +1 -1
  161. package/dist/server/web-ui/_expo/static/js/web/{railroad-3IZDKUUU-c6e94ec81a88c02cb339de59f29386f5.js.br → railroad-3IZDKUUU-55b81b14fbc2908aa06995bd62b57b43.js.br} +1 -1
  162. package/dist/server/web-ui/_expo/static/js/web/railroad-3IZDKUUU-55b81b14fbc2908aa06995bd62b57b43.js.gz +0 -0
  163. package/dist/server/web-ui/_expo/static/js/web/{railroad-abnf-AHOZXSZD-627ed129da90b5e1d371bd2c3b9db457.js → railroad-abnf-AHOZXSZD-47462203d9c422ed3805bd31ed12d922.js} +1 -1
  164. package/dist/server/web-ui/_expo/static/js/web/{railroad-abnf-AHOZXSZD-627ed129da90b5e1d371bd2c3b9db457.js.br → railroad-abnf-AHOZXSZD-47462203d9c422ed3805bd31ed12d922.js.br} +1 -1
  165. package/dist/server/web-ui/_expo/static/js/web/railroad-abnf-AHOZXSZD-47462203d9c422ed3805bd31ed12d922.js.gz +0 -0
  166. package/dist/server/web-ui/_expo/static/js/web/{railroad-ebnf-EBAXGLYW-1b7ec12d3b92be4e181971b21f01f3f8.js → railroad-ebnf-EBAXGLYW-708f5dcce4ca8693b288152f6aa217b1.js} +1 -1
  167. package/dist/server/web-ui/_expo/static/js/web/{railroad-ebnf-EBAXGLYW-1b7ec12d3b92be4e181971b21f01f3f8.js.br → railroad-ebnf-EBAXGLYW-708f5dcce4ca8693b288152f6aa217b1.js.br} +1 -1
  168. package/dist/server/web-ui/_expo/static/js/web/railroad-ebnf-EBAXGLYW-708f5dcce4ca8693b288152f6aa217b1.js.gz +0 -0
  169. package/dist/server/web-ui/_expo/static/js/web/{railroad-peg-LSFZ7HO6-8a8e027f4141d16a12c15223da966d7d.js → railroad-peg-LSFZ7HO6-eb7ff4c6b43a9c593b0feac004d52d4e.js} +1 -1
  170. package/dist/server/web-ui/_expo/static/js/web/railroad-peg-LSFZ7HO6-eb7ff4c6b43a9c593b0feac004d52d4e.js.br +0 -0
  171. package/dist/server/web-ui/_expo/static/js/web/railroad-peg-LSFZ7HO6-eb7ff4c6b43a9c593b0feac004d52d4e.js.gz +0 -0
  172. package/dist/server/web-ui/_expo/static/js/web/{railroadDiagram-RFXS5EU6-499f36fe78b07e5558063f963a47a474.js → railroadDiagram-RFXS5EU6-c1c534a0f6478078bca1fd806a1ee2ae.js} +1 -1
  173. package/dist/server/web-ui/_expo/static/js/web/railroadDiagram-RFXS5EU6-c1c534a0f6478078bca1fd806a1ee2ae.js.br +0 -0
  174. package/dist/server/web-ui/_expo/static/js/web/railroadDiagram-RFXS5EU6-c1c534a0f6478078bca1fd806a1ee2ae.js.gz +0 -0
  175. package/dist/server/web-ui/_expo/static/js/web/{requirementDiagram-TGXJPOKE-9aaddb885fc59873a8f89cd7550c2c43.js → requirementDiagram-TGXJPOKE-5dd7440a5946dde0e06a5afa9e0295a1.js} +1 -1
  176. package/dist/server/web-ui/_expo/static/js/web/requirementDiagram-TGXJPOKE-5dd7440a5946dde0e06a5afa9e0295a1.js.br +0 -0
  177. package/dist/server/web-ui/_expo/static/js/web/{requirementDiagram-TGXJPOKE-9aaddb885fc59873a8f89cd7550c2c43.js.gz → requirementDiagram-TGXJPOKE-5dd7440a5946dde0e06a5afa9e0295a1.js.gz} +0 -0
  178. package/dist/server/web-ui/_expo/static/js/web/{sankeyDiagram-HTMAVEWB-3fa66fe414adce7a50e31551c059f99c.js → sankeyDiagram-HTMAVEWB-76b963967a4f7c862f4f2f18492e7c56.js} +120 -120
  179. package/dist/server/web-ui/_expo/static/js/web/sankeyDiagram-HTMAVEWB-76b963967a4f7c862f4f2f18492e7c56.js.br +0 -0
  180. package/dist/server/web-ui/_expo/static/js/web/sankeyDiagram-HTMAVEWB-76b963967a4f7c862f4f2f18492e7c56.js.gz +0 -0
  181. package/dist/server/web-ui/_expo/static/js/web/{sequenceDiagram-DBY2YBRQ-856a29fb0507a2dcb697a2aa29cd0b7a.js → sequenceDiagram-DBY2YBRQ-d40a3dbcd285c19aa010a697e12f5022.js} +1 -1
  182. package/dist/server/web-ui/_expo/static/js/web/sequenceDiagram-DBY2YBRQ-d40a3dbcd285c19aa010a697e12f5022.js.br +0 -0
  183. package/dist/server/web-ui/_expo/static/js/web/{sequenceDiagram-DBY2YBRQ-856a29fb0507a2dcb697a2aa29cd0b7a.js.gz → sequenceDiagram-DBY2YBRQ-d40a3dbcd285c19aa010a697e12f5022.js.gz} +0 -0
  184. package/dist/server/web-ui/_expo/static/js/web/{sizeCapture-X5ZJPWSS-388b849b33073b8202dd9ca50038b1c7.js → sizeCapture-X5ZJPWSS-03ac818220d4ba98bdd2f4f454758263.js} +1 -1
  185. package/dist/server/web-ui/_expo/static/js/web/sizeCapture-X5ZJPWSS-03ac818220d4ba98bdd2f4f454758263.js.br +0 -0
  186. package/dist/server/web-ui/_expo/static/js/web/sizeCapture-X5ZJPWSS-03ac818220d4ba98bdd2f4f454758263.js.gz +0 -0
  187. package/dist/server/web-ui/_expo/static/js/web/{stateDiagram-2N3HPSRC-9ca22d078d9922ddcb54ba7bb389c734.js → stateDiagram-2N3HPSRC-ba1e123bf8ce69ae781981f264e90564.js} +1 -1
  188. package/dist/server/web-ui/_expo/static/js/web/stateDiagram-2N3HPSRC-ba1e123bf8ce69ae781981f264e90564.js.br +0 -0
  189. package/dist/server/web-ui/_expo/static/js/web/stateDiagram-2N3HPSRC-ba1e123bf8ce69ae781981f264e90564.js.gz +0 -0
  190. package/dist/server/web-ui/_expo/static/js/web/{stateDiagram-v2-6OUMAXLB-4357e7143c73859f6b4858ba72acb5aa.js → stateDiagram-v2-6OUMAXLB-5925b0db81d9a113005bd93c6adbab9d.js} +1 -1
  191. package/dist/server/web-ui/_expo/static/js/web/stateDiagram-v2-6OUMAXLB-5925b0db81d9a113005bd93c6adbab9d.js.br +0 -0
  192. package/dist/server/web-ui/_expo/static/js/web/stateDiagram-v2-6OUMAXLB-5925b0db81d9a113005bd93c6adbab9d.js.gz +0 -0
  193. package/dist/server/web-ui/_expo/static/js/web/{swimlanes-5IMT3BWC-d737ca408a7a2b82f7419141456d28e4.js → swimlanes-5IMT3BWC-93c0bb8b5ee84ca6f11d561497ec0ef0.js} +1 -1
  194. package/dist/server/web-ui/_expo/static/js/web/swimlanes-5IMT3BWC-93c0bb8b5ee84ca6f11d561497ec0ef0.js.br +0 -0
  195. package/dist/server/web-ui/_expo/static/js/web/{swimlanes-5IMT3BWC-d737ca408a7a2b82f7419141456d28e4.js.gz → swimlanes-5IMT3BWC-93c0bb8b5ee84ca6f11d561497ec0ef0.js.gz} +0 -0
  196. package/dist/server/web-ui/_expo/static/js/web/{swimlanesDiagram-G3AALYLV-0bf2ac58b338c2aeb33213ff1a57983a.js → swimlanesDiagram-G3AALYLV-5f3e335e1800b344e786080955bdb2c5.js} +1 -1
  197. package/dist/server/web-ui/_expo/static/js/web/swimlanesDiagram-G3AALYLV-5f3e335e1800b344e786080955bdb2c5.js.br +0 -0
  198. package/dist/server/web-ui/_expo/static/js/web/swimlanesDiagram-G3AALYLV-5f3e335e1800b344e786080955bdb2c5.js.gz +0 -0
  199. package/dist/server/web-ui/_expo/static/js/web/{timeline-definition-FHXFAJF6-1130419ca563266603c98f1b2148a154.js → timeline-definition-FHXFAJF6-ebf6579c1264c7dd88b67d0ecc9313d7.js} +1 -1
  200. package/dist/server/web-ui/_expo/static/js/web/timeline-definition-FHXFAJF6-ebf6579c1264c7dd88b67d0ecc9313d7.js.br +0 -0
  201. package/dist/server/web-ui/_expo/static/js/web/timeline-definition-FHXFAJF6-ebf6579c1264c7dd88b67d0ecc9313d7.js.gz +0 -0
  202. package/dist/server/web-ui/_expo/static/js/web/{treeView-QDETBFTQ-4f6ec9b592731c21dee99264fa638554.js → treeView-QDETBFTQ-682ed2be8efc51bd8196ff3320637705.js} +1 -1
  203. package/dist/server/web-ui/_expo/static/js/web/{treeView-QDETBFTQ-4f6ec9b592731c21dee99264fa638554.js.br → treeView-QDETBFTQ-682ed2be8efc51bd8196ff3320637705.js.br} +0 -0
  204. package/dist/server/web-ui/_expo/static/js/web/treeView-QDETBFTQ-682ed2be8efc51bd8196ff3320637705.js.gz +0 -0
  205. package/dist/server/web-ui/_expo/static/js/web/{treemap-6X3UGDF4-39eb6ec2c19a5de9242fd28aa26dcf5b.js → treemap-6X3UGDF4-4fb89637583518868012429289715b50.js} +1 -1
  206. package/dist/server/web-ui/_expo/static/js/web/{treemap-6X3UGDF4-39eb6ec2c19a5de9242fd28aa26dcf5b.js.br → treemap-6X3UGDF4-4fb89637583518868012429289715b50.js.br} +0 -0
  207. package/dist/server/web-ui/_expo/static/js/web/treemap-6X3UGDF4-4fb89637583518868012429289715b50.js.gz +0 -0
  208. package/dist/server/web-ui/_expo/static/js/web/{vennDiagram-L72KCM5P-4c15b392e9de3fdc472b53cbdf8e7558.js → vennDiagram-L72KCM5P-4a09551e281dc72285c8c56bcd4b04a3.js} +2 -2
  209. package/dist/server/web-ui/_expo/static/js/web/vennDiagram-L72KCM5P-4a09551e281dc72285c8c56bcd4b04a3.js.br +0 -0
  210. package/dist/server/web-ui/_expo/static/js/web/vennDiagram-L72KCM5P-4a09551e281dc72285c8c56bcd4b04a3.js.gz +0 -0
  211. package/dist/server/web-ui/_expo/static/js/web/{visualizer-bundle-b0af8f4f1ab8d4029f3f21236df43f7f.js → visualizer-bundle-fab344f71166d5645590bda1bab1e0a5.js} +1 -1
  212. package/dist/server/web-ui/_expo/static/js/web/visualizer-bundle-fab344f71166d5645590bda1bab1e0a5.js.br +0 -0
  213. package/dist/server/web-ui/_expo/static/js/web/{visualizer-bundle-b0af8f4f1ab8d4029f3f21236df43f7f.js.gz → visualizer-bundle-fab344f71166d5645590bda1bab1e0a5.js.gz} +0 -0
  214. package/dist/server/web-ui/_expo/static/js/web/{visualizer-panel-3fbc1337bb844d7163cbdb418a4dfd53.js → visualizer-panel-bf8e9531071e12cefa8eda4766877aba.js} +1 -1
  215. package/dist/server/web-ui/_expo/static/js/web/visualizer-panel-bf8e9531071e12cefa8eda4766877aba.js.br +6 -0
  216. package/dist/server/web-ui/_expo/static/js/web/{visualizer-panel-3fbc1337bb844d7163cbdb418a4dfd53.js.gz → visualizer-panel-bf8e9531071e12cefa8eda4766877aba.js.gz} +0 -0
  217. package/dist/server/web-ui/_expo/static/js/web/{visualizer-pip-de03996e25ac5d8a11d723ea90b2f9a3.js → visualizer-pip-633730d52ecc119677ce9ecc287c7879.js} +2 -2
  218. package/dist/server/web-ui/_expo/static/js/web/visualizer-pip-633730d52ecc119677ce9ecc287c7879.js.br +0 -0
  219. package/dist/server/web-ui/_expo/static/js/web/{visualizer-pip-de03996e25ac5d8a11d723ea90b2f9a3.js.gz → visualizer-pip-633730d52ecc119677ce9ecc287c7879.js.gz} +0 -0
  220. package/dist/server/web-ui/_expo/static/js/web/{wardley-OPB4EBWU-b075ee9680ce77acf211a0fb1e63cca8.js → wardley-OPB4EBWU-86a2856822d60f742050c338803f8533.js} +1 -1
  221. package/dist/server/web-ui/_expo/static/js/web/wardley-OPB4EBWU-86a2856822d60f742050c338803f8533.js.br +0 -0
  222. package/dist/server/web-ui/_expo/static/js/web/wardley-OPB4EBWU-86a2856822d60f742050c338803f8533.js.gz +0 -0
  223. package/dist/server/web-ui/_expo/static/js/web/{wardleyDiagram-EHGQE667-a93bc6a6a1e80adcb9a740a2ea3d1676.js → wardleyDiagram-EHGQE667-cf65a2e4de30372a177e82834dba571c.js} +1 -1
  224. package/dist/server/web-ui/_expo/static/js/web/wardleyDiagram-EHGQE667-cf65a2e4de30372a177e82834dba571c.js.br +0 -0
  225. package/dist/server/web-ui/_expo/static/js/web/wardleyDiagram-EHGQE667-cf65a2e4de30372a177e82834dba571c.js.gz +0 -0
  226. package/dist/server/web-ui/_expo/static/js/web/{xychartDiagram-FW5EYKEG-ec54fa07a12c5792d0bb7b65deaff05b.js → xychartDiagram-FW5EYKEG-d29f0b24141b00d07e99c98d99ac55d4.js} +1 -1
  227. package/dist/server/web-ui/_expo/static/js/web/xychartDiagram-FW5EYKEG-d29f0b24141b00d07e99c98d99ac55d4.js.br +0 -0
  228. package/dist/server/web-ui/_expo/static/js/web/xychartDiagram-FW5EYKEG-d29f0b24141b00d07e99c98d99ac55d4.js.gz +0 -0
  229. package/dist/server/web-ui/index.html +1 -1
  230. package/dist/server/web-ui/index.html.br +0 -0
  231. package/dist/server/web-ui/index.html.gz +0 -0
  232. package/dist/src/terminal/shell-integration/zsh/.zshenv +17 -17
  233. package/dist/src/terminal/shell-integration/zsh/otto-integration.zsh +32 -32
  234. package/package.json +5 -5
  235. package/dist/server/web-ui/_expo/static/js/web/__common-6d2299ed037bec2393245a7c0bf1c643.js.br +0 -0
  236. package/dist/server/web-ui/_expo/static/js/web/__common-6d2299ed037bec2393245a7c0bf1c643.js.gz +0 -0
  237. package/dist/server/web-ui/_expo/static/js/web/abnfDiagram-VRR7QNED-c3c2ca327b2d7ad9af3caa1cba884908.js.br +0 -0
  238. package/dist/server/web-ui/_expo/static/js/web/abnfDiagram-VRR7QNED-c3c2ca327b2d7ad9af3caa1cba884908.js.gz +0 -0
  239. package/dist/server/web-ui/_expo/static/js/web/architecture-TIHT7OUA-0cf23d3dc9775f216c01daae4aae250a.js.gz +0 -0
  240. package/dist/server/web-ui/_expo/static/js/web/architectureDiagram-ZJ3FMSHR-f3bce96124559dc19faa4d90aca4afd4.js.br +0 -0
  241. package/dist/server/web-ui/_expo/static/js/web/architectureDiagram-ZJ3FMSHR-f3bce96124559dc19faa4d90aca4afd4.js.gz +0 -0
  242. package/dist/server/web-ui/_expo/static/js/web/blockDiagram-677ZJIJ3-839486928c0f151128a5e2836aa07080.js.br +0 -0
  243. package/dist/server/web-ui/_expo/static/js/web/c4Diagram-LMCZKHZV-197212c21520a6b659a5649e683619d0.js.br +0 -0
  244. package/dist/server/web-ui/_expo/static/js/web/classDiagram-OUVF2IWQ-a0a0fbefc96d14b6619c84fc4f92a39a.js.br +0 -0
  245. package/dist/server/web-ui/_expo/static/js/web/classDiagram-OUVF2IWQ-a0a0fbefc96d14b6619c84fc4f92a39a.js.gz +0 -0
  246. package/dist/server/web-ui/_expo/static/js/web/classDiagram-v2-EOCWNBFH-e979239c6d160123d5b4847253a8a70e.js.br +0 -0
  247. package/dist/server/web-ui/_expo/static/js/web/classDiagram-v2-EOCWNBFH-e979239c6d160123d5b4847253a8a70e.js.gz +0 -0
  248. package/dist/server/web-ui/_expo/static/js/web/cose-bilkent-JH36ORCC-bbc39a6bb062ba85e433f91becc37a65.js.br +0 -0
  249. package/dist/server/web-ui/_expo/static/js/web/cose-bilkent-JH36ORCC-bbc39a6bb062ba85e433f91becc37a65.js.gz +0 -0
  250. package/dist/server/web-ui/_expo/static/js/web/cynefin-VYW2F7L2-ea0e514652627740f5a2ed32b027a164.js.br +0 -0
  251. package/dist/server/web-ui/_expo/static/js/web/cynefin-VYW2F7L2-ea0e514652627740f5a2ed32b027a164.js.gz +0 -0
  252. package/dist/server/web-ui/_expo/static/js/web/cynefinDiagram-TSTJHNR4-0446f9b57ba778e5883d93e24692ffce.js.br +0 -0
  253. package/dist/server/web-ui/_expo/static/js/web/cynefinDiagram-TSTJHNR4-0446f9b57ba778e5883d93e24692ffce.js.gz +0 -0
  254. package/dist/server/web-ui/_expo/static/js/web/dagre-VKFMJZFB-69f7aa52521b06a95874b1ac67508def.js.br +0 -0
  255. package/dist/server/web-ui/_expo/static/js/web/dagre-VKFMJZFB-69f7aa52521b06a95874b1ac67508def.js.gz +0 -0
  256. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-0ae8aadd6e53625f59d62eceb1f06ede.js.gz +0 -0
  257. package/dist/server/web-ui/_expo/static/js/web/diagram-FQU43EPY-bd0940835ccad031627e285aaba6d5ec.js.br +0 -0
  258. package/dist/server/web-ui/_expo/static/js/web/diagram-G47NLZAW-217e2cd3275924bc08fc6ebe79e95e48.js.br +0 -0
  259. package/dist/server/web-ui/_expo/static/js/web/diagram-G47NLZAW-217e2cd3275924bc08fc6ebe79e95e48.js.gz +0 -0
  260. package/dist/server/web-ui/_expo/static/js/web/diagram-NH7WQ7WH-fbd3aa35ca68df15ee378fb63241b333.js.br +0 -0
  261. package/dist/server/web-ui/_expo/static/js/web/diagram-NH7WQ7WH-fbd3aa35ca68df15ee378fb63241b333.js.gz +0 -0
  262. package/dist/server/web-ui/_expo/static/js/web/diagram-OA4YK3LP-48ebb0ba6bcb34417649bd55070542ad.js.br +0 -0
  263. package/dist/server/web-ui/_expo/static/js/web/diagram-OA4YK3LP-48ebb0ba6bcb34417649bd55070542ad.js.gz +0 -0
  264. package/dist/server/web-ui/_expo/static/js/web/diagram-WEI45ONY-2be85db5396495fa970419f77587cf14.js.br +0 -0
  265. package/dist/server/web-ui/_expo/static/js/web/diagram-WEI45ONY-2be85db5396495fa970419f77587cf14.js.gz +0 -0
  266. package/dist/server/web-ui/_expo/static/js/web/ebnfDiagram-CCIWWBDH-3c5c44cf8340b641d13076adab77967b.js.br +0 -0
  267. package/dist/server/web-ui/_expo/static/js/web/ebnfDiagram-CCIWWBDH-3c5c44cf8340b641d13076adab77967b.js.gz +0 -0
  268. package/dist/server/web-ui/_expo/static/js/web/erDiagram-Q63AITRT-81762a72bd33bf1042e4cad4f688abf2.js.br +0 -0
  269. package/dist/server/web-ui/_expo/static/js/web/erDiagram-Q63AITRT-81762a72bd33bf1042e4cad4f688abf2.js.gz +0 -0
  270. package/dist/server/web-ui/_expo/static/js/web/eventmodeling-45OFAUF4-11d7615d746c5304c28d4931ec9ca5f7.js.gz +0 -0
  271. package/dist/server/web-ui/_expo/static/js/web/flowDiagram-23GEKE2U-5a2af608a9500bb36da0595c3464a562.js.br +0 -0
  272. package/dist/server/web-ui/_expo/static/js/web/flowDiagram-23GEKE2U-5a2af608a9500bb36da0595c3464a562.js.gz +0 -0
  273. package/dist/server/web-ui/_expo/static/js/web/ganttDiagram-NO4QXBWP-379aae0f5fb2652d90827c7f8b2472d2.js.br +0 -0
  274. package/dist/server/web-ui/_expo/static/js/web/gitGraph-TEB2WS4Q-d978b8a2d1fd8fcc132b16ef8d57dd7c.js.gz +0 -0
  275. package/dist/server/web-ui/_expo/static/js/web/index-4c86d3c14df18b18b3b9a6329b896faf.js.br +0 -0
  276. package/dist/server/web-ui/_expo/static/js/web/index-4c86d3c14df18b18b3b9a6329b896faf.js.gz +0 -0
  277. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-5a90994af83f12740a986d9f1cb55cc9.js.br +0 -0
  278. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-5a90994af83f12740a986d9f1cb55cc9.js.gz +0 -0
  279. package/dist/server/web-ui/_expo/static/js/web/info-DKCQHKI2-b59d0dbb9a30d361ddc796a5cfa7fc41.js.gz +0 -0
  280. package/dist/server/web-ui/_expo/static/js/web/infoDiagram-FWYZ7A6U-0c4368de61a3bdbfbc73b143423981d9.js.br +0 -0
  281. package/dist/server/web-ui/_expo/static/js/web/infoDiagram-FWYZ7A6U-0c4368de61a3bdbfbc73b143423981d9.js.gz +0 -0
  282. package/dist/server/web-ui/_expo/static/js/web/ishikawaDiagram-FXEZZL3T-1474e73532a16148b7944d3b0f896197.js.br +0 -0
  283. package/dist/server/web-ui/_expo/static/js/web/journeyDiagram-5HDEW3XC-13df6cce9cb7f0e6ffbaa9a614feeee4.js.br +0 -0
  284. package/dist/server/web-ui/_expo/static/js/web/kanban-definition-HUTT4EX6-6b56c0da5302838e7e1c46bf7460ea35.js.br +0 -0
  285. package/dist/server/web-ui/_expo/static/js/web/katex-7f6ac23f118e6e9264fdfa96e335134f.js.br +0 -0
  286. package/dist/server/web-ui/_expo/static/js/web/mermaid-75931b049ce3e66af3cd8ddf01e1cd23.js.br +0 -0
  287. package/dist/server/web-ui/_expo/static/js/web/mindmap-definition-LN4V7U3C-fafde693a329ca39007debdd961134b4.js.br +0 -0
  288. package/dist/server/web-ui/_expo/static/js/web/mindmap-definition-LN4V7U3C-fafde693a329ca39007debdd961134b4.js.gz +0 -0
  289. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-645b8ffe39c60c05c0a224e6efcb5a9c.js.br +0 -0
  290. package/dist/server/web-ui/_expo/static/js/web/orchestration-graph-panel-2d117a5764d11c411d707e37fba93a1b.js.br +0 -0
  291. package/dist/server/web-ui/_expo/static/js/web/packet-7NZHBO7P-61a485e09ee448c823fffbdfc588826d.js.gz +0 -0
  292. package/dist/server/web-ui/_expo/static/js/web/pegDiagram-2B236MQR-035fe1b93f90f4775e99aea533552b42.js.br +0 -0
  293. package/dist/server/web-ui/_expo/static/js/web/pegDiagram-2B236MQR-035fe1b93f90f4775e99aea533552b42.js.gz +0 -0
  294. package/dist/server/web-ui/_expo/static/js/web/pie-RZYD4A2V-f6208df18db61d490f4811b192b77dec.js.br +0 -0
  295. package/dist/server/web-ui/_expo/static/js/web/pie-RZYD4A2V-f6208df18db61d490f4811b192b77dec.js.gz +0 -0
  296. package/dist/server/web-ui/_expo/static/js/web/pieDiagram-ENE6RG2P-c78c82bf26f51acb7b7c44ae51eba9c6.js.br +0 -0
  297. package/dist/server/web-ui/_expo/static/js/web/quadrantDiagram-ABIIQ3AL-efff1486187742fe8683a966651df92f.js.br +0 -0
  298. package/dist/server/web-ui/_expo/static/js/web/radar-I7S5WNFK-0150ed7f0d337fc7ec70638a3656ea06.js.gz +0 -0
  299. package/dist/server/web-ui/_expo/static/js/web/railroad-3IZDKUUU-c6e94ec81a88c02cb339de59f29386f5.js.gz +0 -0
  300. package/dist/server/web-ui/_expo/static/js/web/railroad-abnf-AHOZXSZD-627ed129da90b5e1d371bd2c3b9db457.js.gz +0 -0
  301. package/dist/server/web-ui/_expo/static/js/web/railroad-ebnf-EBAXGLYW-1b7ec12d3b92be4e181971b21f01f3f8.js.gz +0 -0
  302. package/dist/server/web-ui/_expo/static/js/web/railroad-peg-LSFZ7HO6-8a8e027f4141d16a12c15223da966d7d.js.br +0 -0
  303. package/dist/server/web-ui/_expo/static/js/web/railroad-peg-LSFZ7HO6-8a8e027f4141d16a12c15223da966d7d.js.gz +0 -0
  304. package/dist/server/web-ui/_expo/static/js/web/railroadDiagram-RFXS5EU6-499f36fe78b07e5558063f963a47a474.js.br +0 -0
  305. package/dist/server/web-ui/_expo/static/js/web/railroadDiagram-RFXS5EU6-499f36fe78b07e5558063f963a47a474.js.gz +0 -0
  306. package/dist/server/web-ui/_expo/static/js/web/requirementDiagram-TGXJPOKE-9aaddb885fc59873a8f89cd7550c2c43.js.br +0 -0
  307. package/dist/server/web-ui/_expo/static/js/web/sankeyDiagram-HTMAVEWB-3fa66fe414adce7a50e31551c059f99c.js.br +0 -0
  308. package/dist/server/web-ui/_expo/static/js/web/sankeyDiagram-HTMAVEWB-3fa66fe414adce7a50e31551c059f99c.js.gz +0 -0
  309. package/dist/server/web-ui/_expo/static/js/web/sequenceDiagram-DBY2YBRQ-856a29fb0507a2dcb697a2aa29cd0b7a.js.br +0 -0
  310. package/dist/server/web-ui/_expo/static/js/web/sizeCapture-X5ZJPWSS-388b849b33073b8202dd9ca50038b1c7.js.br +0 -0
  311. package/dist/server/web-ui/_expo/static/js/web/sizeCapture-X5ZJPWSS-388b849b33073b8202dd9ca50038b1c7.js.gz +0 -0
  312. package/dist/server/web-ui/_expo/static/js/web/stateDiagram-2N3HPSRC-9ca22d078d9922ddcb54ba7bb389c734.js.br +0 -0
  313. package/dist/server/web-ui/_expo/static/js/web/stateDiagram-2N3HPSRC-9ca22d078d9922ddcb54ba7bb389c734.js.gz +0 -0
  314. package/dist/server/web-ui/_expo/static/js/web/stateDiagram-v2-6OUMAXLB-4357e7143c73859f6b4858ba72acb5aa.js.br +0 -0
  315. package/dist/server/web-ui/_expo/static/js/web/stateDiagram-v2-6OUMAXLB-4357e7143c73859f6b4858ba72acb5aa.js.gz +0 -0
  316. package/dist/server/web-ui/_expo/static/js/web/swimlanes-5IMT3BWC-d737ca408a7a2b82f7419141456d28e4.js.br +0 -0
  317. package/dist/server/web-ui/_expo/static/js/web/swimlanesDiagram-G3AALYLV-0bf2ac58b338c2aeb33213ff1a57983a.js.br +0 -0
  318. package/dist/server/web-ui/_expo/static/js/web/swimlanesDiagram-G3AALYLV-0bf2ac58b338c2aeb33213ff1a57983a.js.gz +0 -0
  319. package/dist/server/web-ui/_expo/static/js/web/timeline-definition-FHXFAJF6-1130419ca563266603c98f1b2148a154.js.br +0 -0
  320. package/dist/server/web-ui/_expo/static/js/web/timeline-definition-FHXFAJF6-1130419ca563266603c98f1b2148a154.js.gz +0 -0
  321. package/dist/server/web-ui/_expo/static/js/web/treeView-QDETBFTQ-4f6ec9b592731c21dee99264fa638554.js.gz +0 -0
  322. package/dist/server/web-ui/_expo/static/js/web/treemap-6X3UGDF4-39eb6ec2c19a5de9242fd28aa26dcf5b.js.gz +0 -0
  323. package/dist/server/web-ui/_expo/static/js/web/vennDiagram-L72KCM5P-4c15b392e9de3fdc472b53cbdf8e7558.js.br +0 -0
  324. package/dist/server/web-ui/_expo/static/js/web/vennDiagram-L72KCM5P-4c15b392e9de3fdc472b53cbdf8e7558.js.gz +0 -0
  325. package/dist/server/web-ui/_expo/static/js/web/visualizer-bundle-b0af8f4f1ab8d4029f3f21236df43f7f.js.br +0 -0
  326. package/dist/server/web-ui/_expo/static/js/web/visualizer-panel-3fbc1337bb844d7163cbdb418a4dfd53.js.br +0 -3
  327. package/dist/server/web-ui/_expo/static/js/web/visualizer-pip-de03996e25ac5d8a11d723ea90b2f9a3.js.br +0 -0
  328. package/dist/server/web-ui/_expo/static/js/web/wardley-OPB4EBWU-b075ee9680ce77acf211a0fb1e63cca8.js.br +0 -0
  329. package/dist/server/web-ui/_expo/static/js/web/wardley-OPB4EBWU-b075ee9680ce77acf211a0fb1e63cca8.js.gz +0 -0
  330. package/dist/server/web-ui/_expo/static/js/web/wardleyDiagram-EHGQE667-a93bc6a6a1e80adcb9a740a2ea3d1676.js.br +0 -0
  331. package/dist/server/web-ui/_expo/static/js/web/wardleyDiagram-EHGQE667-a93bc6a6a1e80adcb9a740a2ea3d1676.js.gz +0 -0
  332. package/dist/server/web-ui/_expo/static/js/web/xychartDiagram-FW5EYKEG-ec54fa07a12c5792d0bb7b65deaff05b.js.br +0 -0
  333. 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 proc = spawn(plan.command, [...plan.args], {
168
+ const spawnOptions = {
165
169
  cwd: spec.rootPath,
166
- env: spec.env ? { ...process.env, ...spec.env } : process.env,
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.kill("SIGKILL");
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
- export declare function resolveServerCommand(row: LspServerRow, rootPath: string): Promise<ResolvedLspServer | null>;
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
- const command = await resolveRung(rung, row.bin, rootPath);
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
- /** Per-language state for the settings screen, resolved against a real workspace. */
198
- languageStates(rootPath: string): Promise<LspLanguageState[]>;
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
- /** Per-language state for the settings screen, resolved against a real workspace. */
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: this.pool.peek(rootPath, row.id) !== null,
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
- const cwd = request.cwd.trim();
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
- await this.assertCwdWithinKnownWorkspace(cwd);
825
+ if (scope !== null) {
826
+ await this.assertCwdWithinKnownWorkspace(scope);
827
+ }
822
828
  const [languages, running] = await Promise.all([
823
- this.lspService.languageStates(cwd),
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: request.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: request.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
- const child = spawn(options.runtime.dotnetCommand, [options.runtime.entryPath], {
79
- cwd: options.cwd,
80
- stdio: ["pipe", "pipe", "pipe"],
81
- env: {
82
- ...process.env,
83
- // MSBuild colours and progress would corrupt the NDJSON stream if anything ever wrote
84
- // them to stdout, and neither is readable by a machine anyway.
85
- DOTNET_NOLOGO: "1",
86
- DOTNET_CLI_TELEMETRY_OPTOUT: "1",
87
- NO_COLOR: "1",
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
- await probe.awaitHandshake(options.handshakeTimeoutMs);
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
- this.child.kill();
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) {