oh-my-opencode 5.0.0-beta.8 → 5.0.0-beta.80

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 (1229) hide show
  1. package/.agents/command/publish.md +59 -23
  2. package/.agents/command/remove-deadcode.md +1 -1
  3. package/.agents/skills/codex-qa/scripts/lsp-e2e.sh +1 -3
  4. package/.agents/skills/hyperplan/SKILL.md +5 -5
  5. package/.agents/skills/opencode-qa/scripts/lsp-e2e.sh +1 -1
  6. package/.agents/skills/pre-publish-review/SKILL.md +9 -12
  7. package/.agents/skills/publish/SKILL.md +59 -23
  8. package/.agents/skills/remove-deadcode/SKILL.md +1 -1
  9. package/.agents/skills/security-research/SKILL.md +4 -4
  10. package/.agents/skills/senpi-qa/SKILL.md +80 -0
  11. package/.agents/skills/senpi-qa/scripts/resolve-evidence-dir.mjs +65 -0
  12. package/.agents/skills/senpi-qa/scripts/resolve-evidence-dir.test.mjs +171 -0
  13. package/.agents/skills/tech-debt-audit/SKILL.md +6 -76
  14. package/.opencode/command/publish.md +59 -23
  15. package/.opencode/skills/pre-publish-review/SKILL.md +9 -12
  16. package/README.ja.md +66 -61
  17. package/README.ko.md +67 -62
  18. package/README.md +108 -182
  19. package/README.ru.md +63 -61
  20. package/README.zh-cn.md +62 -61
  21. package/THIRD-PARTY-NOTICES.md +35 -105
  22. package/dist/agents/atlas/agent.d.ts +0 -1
  23. package/dist/agents/gpt-prompt-identity.d.ts +1 -1
  24. package/dist/agents/sisyphus-runtime-prompt-reconciler.d.ts +15 -4
  25. package/dist/agents/types.d.ts +4 -2
  26. package/dist/cli/config-manager/parse-opencode-config-file.d.ts +2 -1
  27. package/dist/cli/doctor/checks/browser-provider.d.ts +2 -0
  28. package/dist/cli/doctor/checks/index.d.ts +2 -0
  29. package/dist/cli/doctor/checks/latest-version.d.ts +11 -0
  30. package/dist/cli/doctor/checks/system-plugin.d.ts +4 -3
  31. package/dist/cli/doctor/framework/constants.d.ts +5 -0
  32. package/dist/cli/doctor/framework/types.d.ts +2 -0
  33. package/dist/cli/fallback-lane-policy.d.ts +1 -0
  34. package/dist/cli/index.js +50191 -58043
  35. package/dist/cli/install-codex/install-codex-test-fixtures.d.ts +1 -1
  36. package/dist/cli/run/on-complete-hook.d.ts +2 -0
  37. package/dist/cli/runtime-commands.d.ts +1 -1
  38. package/dist/cli/worktree-sweep/classify.d.ts +16 -0
  39. package/dist/cli/worktree-sweep/format.d.ts +8 -0
  40. package/dist/cli/worktree-sweep/git.d.ts +19 -0
  41. package/dist/cli/worktree-sweep/index.d.ts +7 -0
  42. package/dist/cli/worktree-sweep/options.d.ts +2 -0
  43. package/dist/cli/worktree-sweep/parse-worktree-list.d.ts +8 -0
  44. package/dist/cli/worktree-sweep/sweep.d.ts +2 -0
  45. package/dist/cli/worktree-sweep/types.d.ts +65 -0
  46. package/dist/cli/worktree-sweep/worktree-sweep.d.ts +2 -0
  47. package/dist/cli-node/index.js +51708 -59537
  48. package/dist/config/index.d.ts +1 -1
  49. package/dist/config/schema/agent-names.d.ts +0 -1
  50. package/dist/config/schema/background-task.d.ts +1 -0
  51. package/dist/config/schema/browser-automation.d.ts +0 -2
  52. package/dist/config/schema/commands.d.ts +1 -1
  53. package/dist/config/schema/hooks.d.ts +1 -2
  54. package/dist/config/schema/oh-my-opencode-config.d.ts +5 -12
  55. package/dist/config/schema/ulw-execute.d.ts +5 -0
  56. package/dist/config/schema.d.ts +0 -1
  57. package/dist/config/validate.d.ts +2 -0
  58. package/dist/config-migration/category-deep-split.d.ts +3 -0
  59. package/dist/config-migration/migration-plans.d.ts +1 -0
  60. package/dist/create-hooks.d.ts +3 -2
  61. package/dist/features/background-agent/compaction-aware-message-resolver.d.ts +1 -0
  62. package/dist/features/background-agent/constants.d.ts +0 -7
  63. package/dist/features/background-agent/error-classifier.d.ts +1 -0
  64. package/dist/features/background-agent/manager.d.ts +9 -1
  65. package/dist/features/background-agent/parent-wake-dispatched-tracker.d.ts +0 -1
  66. package/dist/features/background-agent/parent-wake-notifier-types.d.ts +1 -1
  67. package/dist/features/background-agent/parent-wake-prompt-dispatch.d.ts +1 -1
  68. package/dist/features/background-agent/parent-wake-session-inspector.d.ts +1 -1
  69. package/dist/features/background-agent/subagent-spawn-limits.d.ts +8 -0
  70. package/dist/features/background-agent/types.d.ts +4 -0
  71. package/dist/features/boulder-state/storage.d.ts +1 -1
  72. package/dist/features/btw-side/btw-command-draft.d.ts +7 -0
  73. package/dist/features/btw-side/context-injector.d.ts +15 -0
  74. package/dist/features/btw-side/index.d.ts +8 -0
  75. package/dist/features/btw-side/metadata.d.ts +15 -0
  76. package/dist/features/btw-side/parent-context-budget.d.ts +9 -0
  77. package/dist/features/btw-side/server-session-registry.d.ts +8 -0
  78. package/dist/features/btw-side/tui-adoption-cache.d.ts +13 -0
  79. package/dist/features/btw-side/tui-adoption-guard.d.ts +5 -0
  80. package/dist/features/btw-side/tui-controller-types.d.ts +68 -0
  81. package/dist/features/btw-side/tui-controller.d.ts +19 -0
  82. package/dist/features/btw-side/tui-escape-return.d.ts +12 -0
  83. package/dist/features/btw-side/tui-keymap.d.ts +17 -0
  84. package/dist/features/btw-side/tui-parent-validator.d.ts +6 -0
  85. package/dist/features/btw-side/tui-picker-options.d.ts +20 -0
  86. package/dist/features/btw-side/tui-picker.d.ts +9 -0
  87. package/dist/features/btw-side/tui-prompt-queue.d.ts +8 -0
  88. package/dist/features/btw-side/tui-session-bridge.d.ts +11 -0
  89. package/dist/features/btw-side/tui-session-catalog.d.ts +35 -0
  90. package/dist/features/btw-side/tui-side-removal.d.ts +11 -0
  91. package/dist/features/btw-side/tui-side-start.d.ts +9 -0
  92. package/dist/features/btw-side/tui-wiring.d.ts +8 -0
  93. package/dist/features/builtin-commands/templates/hyperplan.d.ts +1 -1
  94. package/dist/features/builtin-commands/templates/refactor-sections/team-mode-addendum.d.ts +1 -1
  95. package/dist/features/builtin-commands/templates/remove-ai-slops.d.ts +1 -1
  96. package/dist/features/builtin-commands/templates/ulw-execute.d.ts +1 -0
  97. package/dist/features/builtin-commands/types.d.ts +1 -1
  98. package/dist/features/claude-tasks/storage.d.ts +7 -2
  99. package/dist/features/hook-message-injector/index.d.ts +1 -0
  100. package/dist/features/hook-message-injector/sdk-message-lookup.d.ts +1 -0
  101. package/dist/features/monitor/manager-internals.d.ts +1 -1
  102. package/dist/features/monitor/output-injector-types.d.ts +1 -1
  103. package/dist/features/opengateway-provider/index.d.ts +13 -0
  104. package/dist/features/task-toast-manager/manager.d.ts +0 -24
  105. package/dist/features/team-mode/tools/messaging-fallback-wake.d.ts +17 -0
  106. package/dist/features/team-mode/tools/messaging-live-delivery-recipient.d.ts +3 -0
  107. package/dist/features/team-mode/tools/messaging-runtime.d.ts +7 -0
  108. package/dist/hooks/anthropic-context-window-limit-recovery/message-storage-directory.d.ts +0 -3
  109. package/dist/hooks/anthropic-context-window-limit-recovery/state.d.ts +1 -0
  110. package/dist/hooks/anthropic-context-window-limit-recovery/storage/empty-messages.d.ts +0 -1
  111. package/dist/hooks/anthropic-context-window-limit-recovery/tool-result-storage.d.ts +11 -0
  112. package/dist/hooks/atlas/atlas-hook.d.ts +1 -0
  113. package/dist/hooks/atlas/atlas-lifecycle-store.d.ts +50 -0
  114. package/dist/hooks/atlas/event-handler.d.ts +1 -0
  115. package/dist/hooks/atlas/final-wave-approval-gate.test-support.d.ts +50 -0
  116. package/dist/hooks/atlas/system-reminder-templates.d.ts +0 -1
  117. package/dist/hooks/atlas/tool-execute-before.d.ts +3 -0
  118. package/dist/hooks/atlas/types.d.ts +1 -0
  119. package/dist/hooks/claude-code-hooks/session-hook-state.d.ts +1 -0
  120. package/dist/hooks/claude-code-hooks/stop.d.ts +2 -0
  121. package/dist/hooks/claude-code-hooks/todo.d.ts +0 -1
  122. package/dist/hooks/claude-code-hooks/transcript.d.ts +2 -0
  123. package/dist/hooks/comment-checker/__fixtures__/download-probe.fixture.d.ts +1 -0
  124. package/dist/hooks/compaction-context-injector/validated-model.d.ts +2 -0
  125. package/dist/hooks/fsync-skip-warning/index.d.ts +4 -0
  126. package/dist/hooks/hashline-edit-diff-enhancer/hook.d.ts +1 -0
  127. package/dist/hooks/hashline-edit-diff-enhancer/pending-captures.d.ts +13 -0
  128. package/dist/hooks/index.d.ts +1 -2
  129. package/dist/hooks/keyword-detector/hook.d.ts +9 -0
  130. package/dist/hooks/keyword-detector/ultrawork/index.d.ts +2 -0
  131. package/dist/hooks/keyword-detector/ultrawork/source-detector.d.ts +0 -1
  132. package/dist/hooks/model-fallback/hook.d.ts +1 -1
  133. package/dist/hooks/plan-format-validator/hook.d.ts +19 -0
  134. package/dist/hooks/prometheus-md-only/agent-resolution.d.ts +2 -2
  135. package/dist/hooks/runtime-fallback/chat-message-handler.d.ts +2 -0
  136. package/dist/hooks/runtime-fallback/retry-model-payload.d.ts +1 -0
  137. package/dist/hooks/runtime-fallback/runtime-model-settings.d.ts +6 -0
  138. package/dist/hooks/runtime-fallback/session-status-handler.d.ts +1 -1
  139. package/dist/hooks/runtime-fallback/types.d.ts +3 -1
  140. package/dist/hooks/sisyphus-junior-notepad/constants.d.ts +1 -1
  141. package/dist/hooks/todo-continuation-enforcer/types.d.ts +1 -0
  142. package/dist/hooks/{start-work → ulw-execute}/context-info-builder.d.ts +1 -1
  143. package/dist/hooks/{start-work → ulw-execute}/index.d.ts +1 -1
  144. package/dist/hooks/ulw-execute/ulw-execute-hook.d.ts +23 -0
  145. package/dist/hooks/unstable-agent-babysitter/task-message-analyzer.d.ts +1 -0
  146. package/dist/index.js +30870 -27341
  147. package/dist/mcp/index.d.ts +0 -4
  148. package/dist/mcp/types.d.ts +0 -1
  149. package/dist/oh-my-opencode.schema.json +25 -52
  150. package/dist/plugin/chat-message/types.d.ts +6 -4
  151. package/dist/plugin/chat-message/ulw-execute-message.d.ts +5 -0
  152. package/dist/plugin/event-session-lifecycle.d.ts +1 -0
  153. package/dist/plugin/hooks/create-core-hooks.d.ts +2 -2
  154. package/dist/plugin/hooks/create-session-hooks.d.ts +2 -3
  155. package/dist/plugin/hooks/create-transform-hooks.d.ts +2 -0
  156. package/dist/plugin/messages-transform.d.ts +1 -0
  157. package/dist/plugin/stop-continuation.d.ts +3 -0
  158. package/dist/plugin/system-transform.d.ts +5 -1
  159. package/dist/plugin-config/omo-config-chain.d.ts +1 -0
  160. package/dist/plugin-dispose.d.ts +3 -0
  161. package/dist/shared/agent-tool-restrictions.d.ts +0 -1
  162. package/dist/shared/compaction-agent-config-checkpoint.d.ts +1 -0
  163. package/dist/shared/index.d.ts +2 -0
  164. package/dist/shared/legacy-plugin-warning.d.ts +2 -1
  165. package/dist/shared/omo-process-sweep.d.ts +2 -4
  166. package/dist/shared/plugin-entry-migrator.d.ts +4 -3
  167. package/dist/shared/plugin-entry-shape.d.ts +6 -0
  168. package/dist/shared/runtime-fallback-retry-marker.d.ts +16 -0
  169. package/dist/shared/shell-env.d.ts +1 -1
  170. package/dist/skills/ast-grep/AGENTS.md +51 -0
  171. package/dist/skills/ast-grep/SKILL.md +13 -1
  172. package/dist/skills/coding-agent-sessions/AGENTS.md +62 -0
  173. package/dist/skills/coding-agent-sessions/SKILL.md +1 -1
  174. package/dist/skills/data-scientist/SKILL.md +99 -239
  175. package/dist/skills/data-scientist/references/execution-surfaces.md +91 -0
  176. package/dist/skills/data-scientist/references/placement.md +74 -0
  177. package/dist/skills/data-scientist/references/polars-lane.md +95 -0
  178. package/dist/skills/data-scientist/references/uv-setup.md +1 -1
  179. package/dist/skills/data-scientist/references/visualization.md +64 -0
  180. package/dist/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
  181. package/dist/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
  182. package/dist/skills/debugging/SKILL.md +3 -1
  183. package/dist/skills/debugging/references/methodology/00-setup.md +12 -0
  184. package/dist/skills/debugging/references/methodology/02-investigate.md +26 -5
  185. package/dist/skills/debugging/references/runtimes/go.md +15 -1
  186. package/dist/skills/debugging/references/runtimes/native-binary.md +38 -0
  187. package/dist/skills/debugging/references/runtimes/node.md +25 -0
  188. package/dist/skills/debugging/references/runtimes/python.md +13 -0
  189. package/dist/skills/debugging/references/runtimes/rust.md +41 -0
  190. package/dist/skills/debugging/references/scripts/dap.mjs +267 -0
  191. package/dist/skills/debugging/references/scripts/dap.test.ts +86 -0
  192. package/dist/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
  193. package/dist/skills/debugging/references/tools/dap.md +103 -0
  194. package/dist/skills/debugging/references/tools/frida.md +193 -0
  195. package/dist/skills/debugging/references/tools/playwright-cli.md +79 -161
  196. package/dist/skills/frontend/ATTRIBUTION.md +10 -0
  197. package/dist/skills/frontend/SKILL.md +7 -3
  198. package/dist/skills/frontend/references/design/README.md +10 -2
  199. package/dist/skills/frontend/references/design/_INDEX.md +1 -0
  200. package/dist/skills/frontend/references/design/ambience-skill.md +145 -0
  201. package/dist/skills/frontend/references/design/aside.md +1 -1
  202. package/dist/skills/frontend/references/design/clone-from-url.md +1 -1
  203. package/dist/skills/frontend/references/design/interaction-skill.md +2 -0
  204. package/dist/skills/frontend/references/design/print-paged-media.md +76 -0
  205. package/dist/skills/frontend/references/designpowers/README.md +1 -1
  206. package/dist/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
  207. package/dist/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
  208. package/dist/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
  209. package/dist/skills/frontend/references/designpowers/orchestration.md +1 -1
  210. package/dist/skills/frontend/references/designpowers/routing.md +5 -5
  211. package/dist/skills/frontend/scripts/perfection/lighthouse-audit.py +2 -2
  212. package/dist/skills/git-master/SKILL.md +1 -1
  213. package/dist/skills/init-deep/SKILL.md +14 -14
  214. package/dist/skills/lsp-setup/SKILL.md +1 -1
  215. package/dist/skills/programming/SKILL.md +1 -1
  216. package/dist/skills/refactor/SKILL.md +5 -5
  217. package/dist/skills/remove-ai-slops/SKILL.md +5 -5
  218. package/dist/skills/review-work/SKILL.md +101 -419
  219. package/dist/skills/ultimate-browsing/ATTRIBUTION.md +32 -86
  220. package/dist/skills/ultimate-browsing/SKILL.md +32 -27
  221. package/dist/skills/ultimate-browsing/engine/AGENTS.md +111 -0
  222. package/dist/skills/ultimate-browsing/engine/templates/package.json +2 -2
  223. package/dist/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +5 -2
  224. package/dist/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +8 -6
  225. package/dist/skills/ultimate-browsing/engine/tests/test_playwright_stealth.py +86 -0
  226. package/dist/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +4 -7
  227. package/dist/skills/ultimate-browsing/references/chrome-stealth.md +86 -95
  228. package/dist/skills/ultimate-browsing/references/insane-search/README.md +18 -5
  229. package/dist/skills/ultimate-browsing/references/insane-search/playwright.md +16 -13
  230. package/dist/skills/ultimate-browsing/scripts/extract_cookies.py +3 -3
  231. package/dist/skills/{start-work → ulw-execute}/SKILL.md +24 -22
  232. package/dist/skills/ulw-plan/SKILL.md +5 -6
  233. package/dist/skills/ulw-plan/references/full-workflow.md +6 -5
  234. package/dist/skills/ulw-plan/references/intent-unclear.md +2 -2
  235. package/dist/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -1
  236. package/dist/skills/ulw-research/SKILL.md +10 -5
  237. package/dist/skills/visual-qa/AGENTS.md +58 -0
  238. package/dist/skills/visual-qa/SKILL.md +4 -3
  239. package/dist/skills/visual-qa/references/browser-setup.md +75 -0
  240. package/dist/tools/delegate-task/builtin-categories.d.ts +3 -1
  241. package/dist/tools/delegate-task/builtin-category-definition.d.ts +2 -1
  242. package/dist/tools/delegate-task/constants.d.ts +2 -2
  243. package/dist/tools/delegate-task/openai-categories.d.ts +10 -3
  244. package/dist/tools/delegate-task/sync-session-cleanup.d.ts +3 -0
  245. package/dist/tools/delegate-task/sync-session-poller.d.ts +1 -0
  246. package/dist/tools/delegate-task/tool-description.d.ts +3 -1
  247. package/dist/tools/delegate-task/types.d.ts +4 -0
  248. package/dist/tools/session-manager/directory-filter.d.ts +2 -0
  249. package/dist/tui.d.ts +12 -0
  250. package/dist/tui.js +37073 -46672
  251. package/package.json +44 -45
  252. package/packages/git-bash-mcp/dist/cli.js +6 -1
  253. package/packages/git-bash-mcp/package.json +1 -1
  254. package/packages/lsp-core/src/index.ts +1 -0
  255. package/packages/lsp-core/src/lsp/client-diagnostics-concurrency.integration.test.ts +9 -1
  256. package/packages/lsp-core/src/lsp/client-diagnostics-freshness.integration.test.ts +100 -28
  257. package/packages/lsp-core/src/lsp/client-diagnostics-pull-timeout.test.ts +64 -0
  258. package/packages/lsp-core/src/lsp/client-wrapper-outside-cwd.test.ts +78 -0
  259. package/packages/lsp-core/src/lsp/client-wrapper.test.ts +103 -6
  260. package/packages/lsp-core/src/lsp/client-wrapper.ts +50 -16
  261. package/packages/lsp-core/src/lsp/client.ts +32 -3
  262. package/packages/lsp-core/src/lsp/connection.ts +16 -0
  263. package/packages/lsp-core/src/lsp/constants.ts +6 -0
  264. package/packages/lsp-core/src/lsp/controlled-clock-test-support.ts +90 -0
  265. package/packages/lsp-core/src/lsp/errors.ts +15 -0
  266. package/packages/lsp-core/src/lsp/fixtures/workspace-edit-server.mjs +10 -3
  267. package/packages/lsp-core/src/lsp/format-document.test.ts +143 -0
  268. package/packages/lsp-core/src/lsp/format-document.ts +90 -0
  269. package/packages/lsp-core/src/lsp/json-rpc-connection.ts +11 -6
  270. package/packages/lsp-core/src/lsp/manager-lifecycle.test.ts +262 -0
  271. package/packages/lsp-core/src/lsp/manager-max-clients.test.ts +151 -0
  272. package/packages/lsp-core/src/lsp/manager.ts +138 -12
  273. package/packages/lsp-core/src/lsp/outside-context-workspace.ts +33 -0
  274. package/packages/lsp-core/src/lsp/server-definitions.ts +29 -0
  275. package/packages/lsp-core/src/lsp/server-installation.test.ts +376 -0
  276. package/packages/lsp-core/src/lsp/server-installation.ts +200 -27
  277. package/packages/lsp-core/src/lsp/server-resolution-local-binary.test.ts +170 -0
  278. package/packages/lsp-core/src/lsp/server-resolution.ts +18 -5
  279. package/packages/lsp-core/src/lsp/timer-provider.ts +13 -0
  280. package/packages/lsp-core/src/lsp/transport-request-timeout.test.ts +73 -0
  281. package/packages/lsp-core/src/lsp/transport.ts +16 -2
  282. package/packages/lsp-core/src/lsp/types.ts +8 -0
  283. package/packages/lsp-core/src/lsp/workspace-apply-edit-test-support.ts +29 -1
  284. package/packages/lsp-core/src/lsp/workspace-document-state.test.ts +84 -1
  285. package/packages/lsp-core/src/lsp/workspace-document-state.ts +35 -11
  286. package/packages/lsp-core/src/lsp/workspace-markers.ts +18 -0
  287. package/packages/lsp-core/src/mcp.ts +3 -0
  288. package/packages/lsp-core/src/request-context.test.ts +29 -0
  289. package/packages/lsp-core/src/request-context.ts +1 -1
  290. package/packages/lsp-core/src/tool-surface.test.ts +13 -1
  291. package/packages/lsp-core/src/tools/definitions.ts +14 -0
  292. package/packages/lsp-core/src/tools/format.test.ts +56 -0
  293. package/packages/lsp-core/src/tools/format.ts +56 -0
  294. package/packages/lsp-core/src/tools/index.ts +1 -0
  295. package/packages/lsp-core/src/tools/parameters.test.ts +51 -0
  296. package/packages/lsp-core/src/tools/types.ts +10 -0
  297. package/packages/lsp-daemon/dist/cli.js +904 -479
  298. package/packages/lsp-daemon/dist/client.d.ts +10 -0
  299. package/packages/lsp-daemon/dist/client.js +922 -493
  300. package/packages/lsp-daemon/dist/daemon-client.d.ts +1 -0
  301. package/packages/lsp-daemon/dist/daemon-client.js +3 -0
  302. package/packages/lsp-daemon/dist/ensure-daemon.d.ts +6 -1
  303. package/packages/lsp-daemon/dist/ensure-daemon.js +10 -2
  304. package/packages/lsp-daemon/dist/index.js +826 -402
  305. package/packages/lsp-daemon/dist/ownership.js +2 -2
  306. package/packages/lsp-daemon/dist/proxy.js +3 -0
  307. package/packages/lsp-daemon/dist/version-reap.js +1 -1
  308. package/packages/lsp-daemon/package.json +1 -1
  309. package/packages/lsp-tools-mcp/dist/cli.js +764 -341
  310. package/packages/lsp-tools-mcp/dist/lsp/manager.js +274 -138
  311. package/packages/lsp-tools-mcp/dist/mcp.js +789 -368
  312. package/packages/lsp-tools-mcp/dist/request-context.js +12 -13
  313. package/packages/lsp-tools-mcp/dist/tools.js +719 -302
  314. package/packages/lsp-tools-mcp/package.json +1 -1
  315. package/packages/omo-codex/THIRD-PARTY-NOTICES.md +4 -21
  316. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +4 -6
  317. package/packages/omo-codex/plugin/.mcp.json +0 -6
  318. package/packages/omo-codex/plugin/AGENTS.md +47 -0
  319. package/packages/omo-codex/plugin/README.md +6 -2
  320. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +7175 -408
  321. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  322. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  323. package/packages/omo-codex/plugin/components/bootstrap/src/hook.ts +1 -0
  324. package/packages/omo-codex/plugin/components/bootstrap/src/setup.ts +7 -1
  325. package/packages/omo-codex/plugin/components/comment-checker/AGENTS.md +9 -0
  326. package/packages/omo-codex/plugin/components/comment-checker/biome.json +2 -2
  327. package/packages/omo-codex/plugin/components/comment-checker/dist/cli.js +2 -1
  328. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  329. package/packages/omo-codex/plugin/components/comment-checker/package.json +5 -5
  330. package/packages/omo-codex/plugin/components/comment-checker/src/apply-patch.ts +2 -8
  331. package/packages/omo-codex/plugin/components/comment-checker/src/core.ts +1 -2
  332. package/packages/omo-codex/plugin/components/comment-checker/src/request-extractor.ts +1 -1
  333. package/packages/omo-codex/plugin/components/comment-checker/src/runner.ts +1 -0
  334. package/packages/omo-codex/plugin/components/git-bash/AGENTS.md +1 -1
  335. package/packages/omo-codex/plugin/components/git-bash/dist/cli.js +1 -1
  336. package/packages/omo-codex/plugin/components/git-bash/dist/codex-hook.js +2 -1
  337. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  338. package/packages/omo-codex/plugin/components/git-bash/package.json +3 -4
  339. package/packages/omo-codex/plugin/components/git-bash/src/codex-hook.ts +2 -1
  340. package/packages/omo-codex/plugin/components/git-bash/test/codex-hook.test.ts +6 -7
  341. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/AGENTS.md +2 -2
  342. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/biome.json +2 -2
  343. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/directive.md +2 -0
  344. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/cli.js +36 -29
  345. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/codex-hook.js +32 -26
  346. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/types.d.ts +3 -0
  347. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  348. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +5 -5
  349. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/codex-hook.ts +32 -28
  350. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/types.ts +3 -0
  351. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/cli.test.ts +1 -1
  352. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +137 -28
  353. package/packages/omo-codex/plugin/components/lcx/skills/lcx-doctor/SKILL.md +4 -2
  354. package/packages/omo-codex/plugin/components/lsp/AGENTS.md +30 -15
  355. package/packages/omo-codex/plugin/components/lsp/biome.json +2 -2
  356. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +4 -4
  357. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +943 -540
  358. package/packages/omo-codex/plugin/components/lsp/dist/daemon-cli-path.js +1 -1
  359. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  360. package/packages/omo-codex/plugin/components/lsp/package.json +5 -5
  361. package/packages/omo-codex/plugin/components/lsp/src/cli.ts +1 -1
  362. package/packages/omo-codex/plugin/components/lsp/src/codex-hook.ts +1 -1
  363. package/packages/omo-codex/plugin/components/lsp/src/daemon-cli-path.ts +1 -5
  364. package/packages/omo-codex/plugin/components/lsp/test/codex-hook-unavailable.test.ts +6 -7
  365. package/packages/omo-codex/plugin/components/lsp/test/codex-hook.test.ts +1 -2
  366. package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +11 -1
  367. package/packages/omo-codex/plugin/components/rules/AGENTS.md +12 -0
  368. package/packages/omo-codex/plugin/components/rules/README.md +2 -0
  369. package/packages/omo-codex/plugin/components/rules/biome.json +2 -2
  370. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-6.md +123 -0
  371. package/packages/omo-codex/plugin/components/rules/dist/cli.js +91 -68
  372. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  373. package/packages/omo-codex/plugin/components/rules/package.json +7 -7
  374. package/packages/omo-codex/plugin/components/rules/src/config.ts +1 -2
  375. package/packages/omo-codex/plugin/components/rules/src/persistent-cache.ts +1 -2
  376. package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +15 -5
  377. package/packages/omo-codex/plugin/components/rules/src/rules-engine-factory.ts +1 -4
  378. package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +4 -9
  379. package/packages/omo-codex/plugin/components/rules/test/bundled-rules-priority.test.ts +11 -16
  380. package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +17 -25
  381. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +9 -7
  382. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +0 -6
  383. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-dedup.test.ts +6 -4
  384. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-directive.test.ts +12 -9
  385. package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +28 -37
  386. package/packages/omo-codex/plugin/components/rules/test/dynamic-target-fingerprints.test.ts +1 -2
  387. package/packages/omo-codex/plugin/components/rules/test/engine.test.ts +7 -4
  388. package/packages/omo-codex/plugin/components/rules/test/finder.test.ts +2 -3
  389. package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +39 -72
  390. package/packages/omo-codex/plugin/components/rules/test/hephaestus-model-variant.test.ts +38 -3
  391. package/packages/omo-codex/plugin/components/rules/test/hook-output.test.ts +2 -3
  392. package/packages/omo-codex/plugin/components/rules/test/matcher.test.ts +2 -3
  393. package/packages/omo-codex/plugin/components/rules/test/package-smoke.test.ts +1 -1
  394. package/packages/omo-codex/plugin/components/rules/test/parser.test.ts +1 -2
  395. package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +29 -6
  396. package/packages/omo-codex/plugin/components/rules/test/rules-engine-consumption.test.ts +3 -6
  397. package/packages/omo-codex/plugin/components/rules/test/scanner.test.ts +1 -2
  398. package/packages/omo-codex/plugin/components/rules/test/sources.test.ts +2 -5
  399. package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +2 -17
  400. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  401. package/packages/omo-codex/plugin/components/teammode/package.json +5 -5
  402. package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +4 -10
  403. package/packages/omo-codex/plugin/components/telemetry/AGENTS.md +8 -0
  404. package/packages/omo-codex/plugin/components/telemetry/biome.json +2 -2
  405. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +2470 -701
  406. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +2488 -720
  407. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  408. package/packages/omo-codex/plugin/components/telemetry/package.json +5 -5
  409. package/packages/omo-codex/plugin/components/telemetry/src/codex-hook.ts +1 -4
  410. package/packages/omo-codex/plugin/components/telemetry/src/posthog.ts +4 -14
  411. package/packages/omo-codex/plugin/components/telemetry/src/product-identity.ts +1 -1
  412. package/packages/omo-codex/plugin/components/telemetry/test/diagnostics.test.ts +2 -5
  413. package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +10 -4
  414. package/packages/omo-codex/plugin/components/ultrawork/README.md +2 -0
  415. package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +1 -1
  416. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-clone-fidelity-reviewer.toml +1 -1
  417. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-code-reviewer.toml +1 -1
  418. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-gate-reviewer.toml +1 -1
  419. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-qa-executor.toml +1 -1
  420. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-high.toml +1 -1
  421. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-low.toml +1 -1
  422. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-medium.toml +1 -1
  423. package/packages/omo-codex/plugin/components/ultrawork/agents/librarian.toml +1 -1
  424. package/packages/omo-codex/plugin/components/ultrawork/agents/metis.toml +1 -1
  425. package/packages/omo-codex/plugin/components/ultrawork/agents/momus.toml +1 -1
  426. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +4 -4
  427. package/packages/omo-codex/plugin/components/ultrawork/biome.json +2 -2
  428. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +500 -4
  429. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  430. package/packages/omo-codex/plugin/components/ultrawork/package.json +5 -6
  431. package/packages/omo-codex/plugin/components/ultrawork/scripts/sync-directive.mjs +30 -14
  432. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +4 -5
  433. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +5 -5
  434. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +2 -2
  435. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -0
  436. package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +4 -0
  437. package/packages/omo-codex/plugin/components/ultrawork/src/directive.ts +5 -2
  438. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook-trigger-policy.test.ts +9 -1
  439. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +0 -136
  440. package/packages/omo-codex/plugin/components/ultrawork/test/directive-source.test.ts +14 -8
  441. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +12 -1
  442. package/packages/omo-codex/plugin/components/ultrawork/test/skill-pointer.test.ts +0 -2
  443. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/AGENTS.md +4 -4
  444. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/NOTICE +1 -1
  445. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/README.md +6 -6
  446. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/biome.json +2 -2
  447. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/directive.md +11 -11
  448. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/dist/cli.js +16 -16
  449. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +16 -0
  450. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/package.json +12 -12
  451. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/boulder-reader.ts +1 -1
  452. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/cli.ts +1 -1
  453. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/codex-hook.ts +4 -4
  454. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/directive.ts +1 -1
  455. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/index.ts +1 -1
  456. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/types.ts +1 -1
  457. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/boulder-reader.test.ts +3 -3
  458. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/cli.test.ts +4 -11
  459. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/codex-hook.test.ts +24 -22
  460. package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +19 -0
  461. package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +17 -1
  462. package/packages/omo-codex/plugin/components/ulw-loop/README.md +12 -1
  463. package/packages/omo-codex/plugin/components/ulw-loop/biome.json +2 -2
  464. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +44 -27
  465. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.d.ts +18 -0
  466. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.js +30 -0
  467. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-continuation.js +10 -4
  468. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.d.ts +2 -5
  469. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.js +5 -78
  470. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.d.ts +12 -0
  471. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.js +114 -0
  472. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.d.ts +7 -1
  473. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +57 -46
  474. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-arg-parser.js +2 -2
  475. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.js +21 -8
  476. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +2 -1
  477. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +12 -1
  478. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.d.ts +1 -1
  479. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.js +40 -37
  480. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +2191 -737
  481. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.d.ts +2 -0
  482. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +28 -8
  483. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.d.ts +8 -5
  484. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.js +35 -23
  485. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.d.ts +1 -0
  486. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.js +1 -0
  487. package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +25 -9
  488. package/packages/omo-codex/plugin/components/ulw-loop/dist/driver-objective-ack.d.ts +4 -0
  489. package/packages/omo-codex/plugin/components/ulw-loop/dist/driver-objective-ack.js +18 -0
  490. package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence-artifacts.d.ts +1 -0
  491. package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence-artifacts.js +37 -0
  492. package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence.d.ts +1 -0
  493. package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence.js +24 -12
  494. package/packages/omo-codex/plugin/components/ulw-loop/dist/ledger.d.ts +4 -0
  495. package/packages/omo-codex/plugin/components/ulw-loop/dist/ledger.js +39 -0
  496. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.d.ts +2 -0
  497. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +19 -4
  498. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-commit.d.ts +19 -0
  499. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-commit.js +108 -0
  500. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.d.ts +6 -2
  501. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.js +54 -25
  502. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-goal-factory.d.ts +10 -3
  503. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-goal-factory.js +38 -31
  504. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.d.ts +10 -7
  505. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +121 -100
  506. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-log.d.ts +16 -0
  507. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-log.js +115 -0
  508. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.d.ts +18 -0
  509. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.js +41 -0
  510. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.d.ts +7 -0
  511. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.js +9 -0
  512. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.d.ts +12 -0
  513. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.js +104 -0
  514. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.d.ts +13 -1
  515. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.js +65 -9
  516. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.js +5 -1
  517. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.d.ts +4 -2
  518. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +72 -117
  519. package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.d.ts +2 -0
  520. package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.js +25 -13
  521. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/factory.d.ts +2 -0
  522. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/factory.js +157 -0
  523. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/manifest.d.ts +381 -0
  524. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/manifest.js +127 -0
  525. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/types.d.ts +130 -0
  526. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/types.js +1 -0
  527. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk.d.ts +3 -0
  528. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk.js +3 -0
  529. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-budget-io.d.ts +5 -0
  530. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-budget-io.js +67 -0
  531. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.d.ts +7 -1
  532. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +188 -59
  533. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-role-guard.d.ts +2 -0
  534. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-role-guard.js +22 -0
  535. package/packages/omo-codex/plugin/components/ulw-loop/dist/state-lock.d.ts +19 -0
  536. package/packages/omo-codex/plugin/components/ulw-loop/dist/state-lock.js +259 -0
  537. package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.d.ts +7 -0
  538. package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.js +41 -0
  539. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-batch.js +4 -4
  540. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-mutations.d.ts +3 -2
  541. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-mutations.js +4 -4
  542. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-types.d.ts +9 -1
  543. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.d.ts +3 -2
  544. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.js +11 -11
  545. package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +28 -23
  546. package/packages/omo-codex/plugin/components/ulw-loop/dist/success-criteria-input.d.ts +9 -0
  547. package/packages/omo-codex/plugin/components/ulw-loop/dist/success-criteria-input.js +41 -0
  548. package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.d.ts +19 -0
  549. package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.js +83 -0
  550. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +18 -5
  551. package/packages/omo-codex/plugin/components/ulw-loop/package.json +6 -6
  552. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +7 -2
  553. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +33 -10
  554. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-codex-validation.ts +52 -0
  555. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-continuation.ts +8 -6
  556. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-reconciliation.ts +5 -98
  557. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-template.ts +134 -0
  558. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +59 -77
  559. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-arg-parser.ts +10 -4
  560. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +24 -8
  561. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts +14 -1
  562. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-subcommands.ts +52 -46
  563. package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +8 -6
  564. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +35 -7
  565. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-snapshot.ts +51 -33
  566. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +3 -1
  567. package/packages/omo-codex/plugin/components/ulw-loop/src/constants.ts +1 -0
  568. package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +27 -9
  569. package/packages/omo-codex/plugin/components/ulw-loop/src/driver-objective-ack.ts +20 -0
  570. package/packages/omo-codex/plugin/components/ulw-loop/src/evidence-artifacts.ts +45 -0
  571. package/packages/omo-codex/plugin/components/ulw-loop/src/evidence.ts +23 -16
  572. package/packages/omo-codex/plugin/components/ulw-loop/src/ledger.ts +38 -0
  573. package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +32 -4
  574. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-commit.ts +132 -0
  575. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +67 -54
  576. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-goal-factory.ts +63 -31
  577. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts +140 -119
  578. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-log.ts +112 -0
  579. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-missing-recovery.ts +61 -0
  580. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-aggregate.ts +11 -0
  581. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-artifacts.ts +123 -0
  582. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-fields.ts +71 -15
  583. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-verdicts.ts +6 -1
  584. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +92 -136
  585. package/packages/omo-codex/plugin/components/ulw-loop/src/review-blockers.ts +38 -13
  586. package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/factory.ts +218 -0
  587. package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/manifest.ts +156 -0
  588. package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/types.ts +143 -0
  589. package/packages/omo-codex/plugin/components/ulw-loop/src/sdk.ts +3 -0
  590. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-budget-io.ts +59 -0
  591. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +196 -52
  592. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-role-guard.ts +22 -0
  593. package/packages/omo-codex/plugin/components/ulw-loop/src/state-lock.ts +257 -0
  594. package/packages/omo-codex/plugin/components/ulw-loop/src/status-next-actions.ts +45 -0
  595. package/packages/omo-codex/plugin/components/ulw-loop/src/steering-batch.ts +4 -4
  596. package/packages/omo-codex/plugin/components/ulw-loop/src/steering-mutations.ts +5 -4
  597. package/packages/omo-codex/plugin/components/ulw-loop/src/steering-types.ts +13 -1
  598. package/packages/omo-codex/plugin/components/ulw-loop/src/steering.ts +12 -10
  599. package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +27 -22
  600. package/packages/omo-codex/plugin/components/ulw-loop/src/success-criteria-input.ts +56 -0
  601. package/packages/omo-codex/plugin/components/ulw-loop/src/surface.ts +115 -0
  602. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-continuation.test.ts +0 -1
  603. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-final.test.ts +131 -82
  604. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-template.test.ts +147 -0
  605. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint.test.ts +16 -22
  606. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-checkpoint-continuation.test.ts +4 -2
  607. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-checkpoint.test.ts +31 -2
  608. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-commands.test.ts +2 -0
  609. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-complete-goals.test.ts +3 -1
  610. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-create-goals.test.ts +35 -8
  611. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +38 -4
  612. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-json-errors.test.ts +27 -0
  613. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-scope-required.test.ts +144 -0
  614. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-status-next-actions.test.ts +185 -0
  615. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering-batch.test.ts +8 -3
  616. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-validation-batch.test.ts +6 -0
  617. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +37 -2
  618. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-snapshot.test.ts +88 -11
  619. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +0 -3
  620. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/barrier.ts +13 -0
  621. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/cli-session.ts +4 -0
  622. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-child.ts +65 -0
  623. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-cli-qa.mjs +76 -0
  624. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-crash.ts +23 -0
  625. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-mutations.mjs +58 -0
  626. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-writer.ts +65 -0
  627. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/lease-clock.ts +23 -0
  628. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/quality-gate-builder.ts +9 -4
  629. package/packages/omo-codex/plugin/components/ulw-loop/test/guided-recovery.test.ts +67 -0
  630. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +5 -37
  631. package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +9 -0
  632. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-commit-log.test.ts +252 -0
  633. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-commit-recovery.test.ts +190 -0
  634. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io-cross-process.test.ts +106 -0
  635. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io.test.ts +74 -25
  636. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-log-legacy-projection.test.ts +228 -0
  637. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-log-newest.test.ts +72 -0
  638. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-aggregate-basics.test.ts +258 -0
  639. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-cap-and-dedupe.test.ts +22 -0
  640. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-fields-messages.test.ts +98 -0
  641. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-lazycodex-surface.test.ts +93 -0
  642. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-poisoning-cascades.test.ts +97 -0
  643. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-roles.test.ts +51 -2
  644. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-senpi-surface.test.ts +131 -0
  645. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-single-report.test.ts +241 -0
  646. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +58 -3
  647. package/packages/omo-codex/plugin/components/ulw-loop/test/review-blockers.test.ts +9 -7
  648. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-completed-plan.test.ts +43 -0
  649. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-contract.test.ts +137 -0
  650. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-driver-states.test.ts +174 -0
  651. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-dx.test.ts +219 -0
  652. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-session-context.test.ts +169 -0
  653. package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +450 -7
  654. package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-role-matrix.test.ts +113 -0
  655. package/packages/omo-codex/plugin/components/ulw-loop/test/state-lock.test.ts +310 -0
  656. package/packages/omo-codex/plugin/components/ulw-loop/test/status-next-actions-surface.test.ts +133 -0
  657. package/packages/omo-codex/plugin/components/ulw-loop/test/steering-batch.test.ts +12 -12
  658. package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +12 -6
  659. package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +1 -1
  660. package/packages/omo-codex/plugin/components/ulw-loop/test/surface.test.ts +74 -0
  661. package/packages/omo-codex/plugin/components/ulw-loop/test/ultrawork-directive.test.ts +13 -8
  662. package/packages/omo-codex/plugin/components/ulw-loop/vitest.config.ts +1 -0
  663. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  664. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  665. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  666. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  667. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  668. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  669. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  670. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +18 -0
  671. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  672. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  673. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  674. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  675. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  676. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  677. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  678. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +17 -0
  679. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  680. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  681. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  682. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  683. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  684. package/packages/omo-codex/plugin/model-catalog.json +16 -7
  685. package/packages/omo-codex/plugin/package-lock.json +676 -524
  686. package/packages/omo-codex/plugin/package.json +2 -3
  687. package/packages/omo-codex/plugin/scripts/AGENTS.md +39 -0
  688. package/packages/omo-codex/plugin/scripts/auto-update-plan.mjs +1 -2
  689. package/packages/omo-codex/plugin/scripts/auto-update.mjs +0 -9
  690. package/packages/omo-codex/plugin/scripts/canonical-ultrawork-directive.mjs +17 -0
  691. package/packages/omo-codex/plugin/scripts/hook-status-message.mjs +0 -1
  692. package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +16 -7
  693. package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +8 -4
  694. package/packages/omo-codex/plugin/scripts/migrate-codex-config/subagent-limit-guard.mjs +19 -90
  695. package/packages/omo-codex/plugin/scripts/migrate-codex-config/toml-section-editor.mjs +1 -1
  696. package/packages/omo-codex/plugin/scripts/sync-skills.d.mts +4 -0
  697. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +111 -64
  698. package/packages/omo-codex/plugin/shared/package.json +3 -4
  699. package/packages/omo-codex/plugin/shared/src/config-loader.ts +2 -102
  700. package/packages/omo-codex/plugin/shared/src/config-migration.ts +0 -1
  701. package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +41 -130
  702. package/packages/omo-codex/plugin/skills/ast-grep/AGENTS.md +51 -0
  703. package/packages/omo-codex/plugin/skills/ast-grep/SKILL.md +13 -1
  704. package/packages/omo-codex/plugin/skills/coding-agent-sessions/AGENTS.md +62 -0
  705. package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +1 -1
  706. package/packages/omo-codex/plugin/skills/data-scientist/SKILL.md +99 -239
  707. package/packages/omo-codex/plugin/skills/data-scientist/references/execution-surfaces.md +91 -0
  708. package/packages/omo-codex/plugin/skills/data-scientist/references/placement.md +74 -0
  709. package/packages/omo-codex/plugin/skills/data-scientist/references/polars-lane.md +95 -0
  710. package/packages/omo-codex/plugin/skills/data-scientist/references/uv-setup.md +1 -1
  711. package/packages/omo-codex/plugin/skills/data-scientist/references/visualization.md +64 -0
  712. package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
  713. package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
  714. package/packages/omo-codex/plugin/skills/debugging/SKILL.md +3 -1
  715. package/packages/omo-codex/plugin/skills/debugging/references/methodology/00-setup.md +12 -0
  716. package/packages/omo-codex/plugin/skills/debugging/references/methodology/02-investigate.md +26 -5
  717. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/go.md +15 -1
  718. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/native-binary.md +38 -0
  719. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/node.md +25 -0
  720. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/python.md +13 -0
  721. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/rust.md +41 -0
  722. package/packages/omo-codex/plugin/skills/debugging/references/scripts/dap.mjs +267 -0
  723. package/packages/omo-codex/plugin/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
  724. package/packages/omo-codex/plugin/skills/debugging/references/tools/dap.md +103 -0
  725. package/packages/omo-codex/plugin/skills/debugging/references/tools/frida.md +193 -0
  726. package/packages/omo-codex/plugin/skills/debugging/references/tools/playwright-cli.md +79 -161
  727. package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +10 -0
  728. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +7 -3
  729. package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +10 -2
  730. package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +1 -0
  731. package/packages/omo-codex/plugin/skills/frontend/references/design/ambience-skill.md +145 -0
  732. package/packages/omo-codex/plugin/skills/frontend/references/design/aside.md +1 -1
  733. package/packages/omo-codex/plugin/skills/frontend/references/design/clone-from-url.md +1 -1
  734. package/packages/omo-codex/plugin/skills/frontend/references/design/interaction-skill.md +2 -0
  735. package/packages/omo-codex/plugin/skills/frontend/references/design/print-paged-media.md +76 -0
  736. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/README.md +1 -1
  737. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
  738. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
  739. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
  740. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/orchestration.md +1 -1
  741. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/routing.md +5 -5
  742. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/lighthouse-audit.py +2 -2
  743. package/packages/omo-codex/plugin/skills/git-master/SKILL.md +1 -1
  744. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +20 -18
  745. package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +4 -2
  746. package/packages/omo-codex/plugin/skills/lsp-setup/SKILL.md +1 -1
  747. package/packages/omo-codex/plugin/skills/programming/SKILL.md +1 -1
  748. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +11 -9
  749. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +11 -9
  750. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +116 -424
  751. package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +32 -86
  752. package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +32 -27
  753. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +111 -0
  754. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +2 -2
  755. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +5 -2
  756. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +8 -6
  757. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_playwright_stealth.py +86 -0
  758. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +4 -7
  759. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +86 -95
  760. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +18 -5
  761. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/playwright.md +16 -13
  762. package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/extract_cookies.py +3 -3
  763. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +44 -27
  764. package/packages/omo-codex/plugin/skills/{start-work → ulw-execute}/SKILL.md +35 -36
  765. package/packages/omo-codex/plugin/skills/ulw-execute/agents/openai.yaml +2 -0
  766. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +31 -2
  767. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +33 -10
  768. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +4 -5
  769. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +5 -5
  770. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +2 -2
  771. package/packages/omo-codex/plugin/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -0
  772. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +16 -9
  773. package/packages/omo-codex/plugin/skills/visual-qa/AGENTS.md +58 -0
  774. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +10 -7
  775. package/packages/omo-codex/plugin/skills/visual-qa/references/browser-setup.md +75 -0
  776. package/packages/omo-codex/plugin/test/AGENTS.md +47 -0
  777. package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +19 -173
  778. package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +16 -51
  779. package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +2 -3
  780. package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +2 -7
  781. package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +14 -4
  782. package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +175 -13
  783. package/packages/omo-codex/plugin/test/aggregate.test.mjs +78 -2
  784. package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +19 -33
  785. package/packages/omo-codex/plugin/test/auto-update.test.mjs +4 -29
  786. package/packages/omo-codex/plugin/test/bootstrap-default-role.test.mjs +66 -0
  787. package/packages/omo-codex/plugin/test/bootstrap-setup.test.mjs +0 -31
  788. package/packages/omo-codex/plugin/test/canonical-ultrawork-directive.test.mjs +53 -0
  789. package/packages/omo-codex/plugin/test/component-bin-names.test.mjs +2 -2
  790. package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +1 -51
  791. package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +100 -2
  792. package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +5 -6
  793. package/packages/omo-codex/plugin/test/lcx-contribute-bug-fix-template.test.mjs +21 -27
  794. package/packages/omo-codex/plugin/test/mcp-research-servers.test.mjs +1 -3
  795. package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +35 -35
  796. package/packages/omo-codex/plugin/test/multi-agent-v2-regression.test.mjs +1 -1
  797. package/packages/omo-codex/plugin/test/scaffold-plan.test.mjs +0 -36
  798. package/packages/omo-codex/plugin/test/subagent-limit-migration.test.mjs +107 -15
  799. package/packages/omo-codex/plugin/test/sync-skills-codex-compatibility.test.mjs +168 -0
  800. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +54 -24
  801. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +18 -119
  802. package/packages/omo-codex/plugin/test/teammode-archive-ambiguity.test.mjs +0 -40
  803. package/packages/omo-codex/plugin/test/teammode-communication.test.mjs +6 -62
  804. package/packages/omo-codex/plugin/test/teammode-thread-links.test.mjs +3 -36
  805. package/packages/omo-codex/plugin/test/teammode-transport.test.mjs +0 -44
  806. package/packages/omo-codex/plugin/test/teammode-worktree.test.mjs +2 -6
  807. package/packages/omo-codex/plugin/test/ultrawork-skill-pointer.test.mjs +5 -5
  808. package/packages/omo-codex/plugin/test/ulw-plan-review-state-contract.test.mjs +0 -3
  809. package/packages/omo-codex/scripts/AGENTS.md +36 -0
  810. package/packages/omo-codex/scripts/check-model-catalog-parity.mjs +42 -0
  811. package/packages/omo-codex/scripts/install-cache-copy.test.mjs +27 -1
  812. package/packages/omo-codex/scripts/install-config-autonomous-features.test.mjs +1 -1
  813. package/packages/omo-codex/scripts/install-config-autonomous.test.mjs +2 -1
  814. package/packages/omo-codex/scripts/install-config-git-bash.test.mjs +0 -23
  815. package/packages/omo-codex/scripts/install-config-reasoning.test.mjs +5 -5
  816. package/packages/omo-codex/scripts/install-config.test.mjs +15 -17
  817. package/packages/omo-codex/scripts/install-dist/install-local.mjs +9832 -1445
  818. package/packages/omo-codex/scripts/install-generated-bundle.test.mjs +3 -4
  819. package/packages/omo-codex/scripts/install-git-bash-mcp-env.test.mjs +1 -25
  820. package/packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs +7 -2
  821. package/packages/omo-codex/scripts/install-mcp-runtime.test.mjs +0 -36
  822. package/packages/omo-codex/scripts/install-packaged-local.test.mjs +1 -6
  823. package/packages/{omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md → prompts-core/prompts/ultrawork/codex.md} +44 -34
  824. package/packages/shared-skills/package.json +7 -1
  825. package/packages/shared-skills/skill-source-filter.d.ts +16 -0
  826. package/packages/shared-skills/skill-source-filter.mjs +44 -0
  827. package/packages/shared-skills/skills/ast-grep/AGENTS.md +51 -0
  828. package/packages/shared-skills/skills/ast-grep/SKILL.md +13 -1
  829. package/packages/shared-skills/skills/coding-agent-sessions/AGENTS.md +62 -0
  830. package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +1 -1
  831. package/packages/shared-skills/skills/data-scientist/SKILL.md +99 -239
  832. package/packages/shared-skills/skills/data-scientist/references/execution-surfaces.md +91 -0
  833. package/packages/shared-skills/skills/data-scientist/references/placement.md +74 -0
  834. package/packages/shared-skills/skills/data-scientist/references/polars-lane.md +95 -0
  835. package/packages/shared-skills/skills/data-scientist/references/uv-setup.md +1 -1
  836. package/packages/shared-skills/skills/data-scientist/references/visualization.md +64 -0
  837. package/packages/shared-skills/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
  838. package/packages/shared-skills/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
  839. package/packages/shared-skills/skills/debugging/SKILL.md +3 -1
  840. package/packages/shared-skills/skills/debugging/references/methodology/00-setup.md +12 -0
  841. package/packages/shared-skills/skills/debugging/references/methodology/02-investigate.md +26 -5
  842. package/packages/shared-skills/skills/debugging/references/runtimes/go.md +15 -1
  843. package/packages/shared-skills/skills/debugging/references/runtimes/native-binary.md +38 -0
  844. package/packages/shared-skills/skills/debugging/references/runtimes/node.md +25 -0
  845. package/packages/shared-skills/skills/debugging/references/runtimes/python.md +13 -0
  846. package/packages/shared-skills/skills/debugging/references/runtimes/rust.md +41 -0
  847. package/packages/shared-skills/skills/debugging/references/scripts/dap.mjs +267 -0
  848. package/packages/shared-skills/skills/debugging/references/scripts/dap.test.ts +86 -0
  849. package/packages/shared-skills/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
  850. package/packages/shared-skills/skills/debugging/references/tools/dap.md +103 -0
  851. package/packages/shared-skills/skills/debugging/references/tools/frida.md +193 -0
  852. package/packages/shared-skills/skills/debugging/references/tools/playwright-cli.md +79 -161
  853. package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +10 -0
  854. package/packages/shared-skills/skills/frontend/SKILL.md +7 -3
  855. package/packages/shared-skills/skills/frontend/references/design/README.md +10 -2
  856. package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +1 -0
  857. package/packages/shared-skills/skills/frontend/references/design/ambience-skill.md +145 -0
  858. package/packages/shared-skills/skills/frontend/references/design/aside.md +1 -1
  859. package/packages/shared-skills/skills/frontend/references/design/clone-from-url.md +1 -1
  860. package/packages/shared-skills/skills/frontend/references/design/interaction-skill.md +2 -0
  861. package/packages/shared-skills/skills/frontend/references/design/print-paged-media.md +76 -0
  862. package/packages/shared-skills/skills/frontend/references/designpowers/README.md +1 -1
  863. package/packages/shared-skills/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
  864. package/packages/shared-skills/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
  865. package/packages/shared-skills/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
  866. package/packages/shared-skills/skills/frontend/references/designpowers/orchestration.md +1 -1
  867. package/packages/shared-skills/skills/frontend/references/designpowers/routing.md +5 -5
  868. package/packages/shared-skills/skills/frontend/scripts/perfection/lighthouse-audit.py +2 -2
  869. package/packages/shared-skills/skills/git-master/SKILL.md +1 -1
  870. package/packages/shared-skills/skills/init-deep/SKILL.md +14 -14
  871. package/packages/shared-skills/skills/lsp-setup/SKILL.md +1 -1
  872. package/packages/shared-skills/skills/programming/SKILL.md +1 -1
  873. package/packages/shared-skills/skills/refactor/SKILL.md +5 -5
  874. package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +5 -5
  875. package/packages/shared-skills/skills/review-work/SKILL.md +101 -419
  876. package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +32 -86
  877. package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +32 -27
  878. package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +111 -0
  879. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +2 -2
  880. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +5 -2
  881. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +8 -6
  882. package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_playwright_stealth.py +86 -0
  883. package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +4 -7
  884. package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +86 -95
  885. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +18 -5
  886. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/playwright.md +16 -13
  887. package/packages/shared-skills/skills/ultimate-browsing/scripts/extract_cookies.py +3 -3
  888. package/packages/shared-skills/skills/{start-work → ulw-execute}/SKILL.md +24 -22
  889. package/packages/shared-skills/skills/ulw-plan/SKILL.md +5 -6
  890. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +6 -5
  891. package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +2 -2
  892. package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -1
  893. package/packages/shared-skills/skills/ulw-research/SKILL.md +10 -5
  894. package/packages/shared-skills/skills/visual-qa/AGENTS.md +58 -0
  895. package/packages/shared-skills/skills/visual-qa/SKILL.md +4 -3
  896. package/packages/shared-skills/skills/visual-qa/references/browser-setup.md +75 -0
  897. package/postinstall.mjs +2 -0
  898. package/script/qa/web-terminal-visual-qa.mjs +2 -0
  899. package/script/qa/xterm-live-terminal.mjs +18 -2
  900. package/.agents/skills/work-with-pr-workspace/evals/evals.json +0 -76
  901. package/.agents/skills/work-with-pr-workspace/iteration-1/benchmark.json +0 -138
  902. package/.agents/skills/work-with-pr-workspace/iteration-1/benchmark.md +0 -42
  903. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/eval_metadata.json +0 -57
  904. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/grading.json +0 -15
  905. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/code-changes.md +0 -454
  906. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/execution-plan.md +0 -136
  907. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/pr-description.md +0 -47
  908. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/verification-strategy.md +0 -163
  909. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/timing.json +0 -1
  910. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/grading.json +0 -15
  911. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/code-changes.md +0 -615
  912. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/execution-plan.md +0 -99
  913. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/pr-description.md +0 -50
  914. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/verification-strategy.md +0 -111
  915. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/timing.json +0 -1
  916. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/eval_metadata.json +0 -37
  917. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/grading.json +0 -11
  918. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/code-changes.md +0 -205
  919. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/execution-plan.md +0 -78
  920. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/pr-description.md +0 -42
  921. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/verification-strategy.md +0 -87
  922. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/timing.json +0 -1
  923. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/grading.json +0 -11
  924. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/code-changes.md +0 -334
  925. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/execution-plan.md +0 -86
  926. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/pr-description.md +0 -23
  927. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/verification-strategy.md +0 -119
  928. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/timing.json +0 -1
  929. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/eval_metadata.json +0 -32
  930. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/grading.json +0 -10
  931. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/code-changes.md +0 -221
  932. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/execution-plan.md +0 -104
  933. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/pr-description.md +0 -41
  934. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/verification-strategy.md +0 -84
  935. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/timing.json +0 -1
  936. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/grading.json +0 -10
  937. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/code-changes.md +0 -342
  938. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/execution-plan.md +0 -131
  939. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/pr-description.md +0 -39
  940. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/verification-strategy.md +0 -128
  941. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/timing.json +0 -1
  942. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/eval_metadata.json +0 -32
  943. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/grading.json +0 -10
  944. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/code-changes.md +0 -143
  945. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/execution-plan.md +0 -82
  946. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/pr-description.md +0 -51
  947. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/verification-strategy.md +0 -69
  948. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/timing.json +0 -1
  949. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/grading.json +0 -10
  950. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/code-changes.md +0 -252
  951. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/execution-plan.md +0 -83
  952. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/pr-description.md +0 -33
  953. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/verification-strategy.md +0 -101
  954. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/timing.json +0 -1
  955. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/eval_metadata.json +0 -32
  956. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/grading.json +0 -10
  957. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/code-changes.md +0 -387
  958. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/execution-plan.md +0 -112
  959. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/pr-description.md +0 -51
  960. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/verification-strategy.md +0 -75
  961. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/timing.json +0 -1
  962. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/grading.json +0 -10
  963. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/code-changes.md +0 -529
  964. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/execution-plan.md +0 -127
  965. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/pr-description.md +0 -42
  966. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/verification-strategy.md +0 -120
  967. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/timing.json +0 -1
  968. package/.agents/skills/work-with-pr-workspace/iteration-1/review.html +0 -1326
  969. package/.opencode/skills/work-with-pr-workspace/evals/evals.json +0 -76
  970. package/.opencode/skills/work-with-pr-workspace/iteration-1/benchmark.json +0 -138
  971. package/.opencode/skills/work-with-pr-workspace/iteration-1/benchmark.md +0 -42
  972. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/eval_metadata.json +0 -57
  973. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/grading.json +0 -15
  974. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/code-changes.md +0 -454
  975. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/execution-plan.md +0 -136
  976. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/pr-description.md +0 -47
  977. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/verification-strategy.md +0 -163
  978. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/timing.json +0 -1
  979. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/grading.json +0 -15
  980. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/code-changes.md +0 -615
  981. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/execution-plan.md +0 -99
  982. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/pr-description.md +0 -50
  983. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/verification-strategy.md +0 -111
  984. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/timing.json +0 -1
  985. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/eval_metadata.json +0 -37
  986. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/grading.json +0 -11
  987. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/code-changes.md +0 -205
  988. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/execution-plan.md +0 -78
  989. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/pr-description.md +0 -42
  990. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/verification-strategy.md +0 -87
  991. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/timing.json +0 -1
  992. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/grading.json +0 -11
  993. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/code-changes.md +0 -334
  994. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/execution-plan.md +0 -86
  995. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/pr-description.md +0 -23
  996. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/verification-strategy.md +0 -119
  997. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/timing.json +0 -1
  998. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/eval_metadata.json +0 -32
  999. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/grading.json +0 -10
  1000. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/code-changes.md +0 -221
  1001. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/execution-plan.md +0 -104
  1002. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/pr-description.md +0 -41
  1003. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/verification-strategy.md +0 -84
  1004. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/timing.json +0 -1
  1005. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/grading.json +0 -10
  1006. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/code-changes.md +0 -342
  1007. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/execution-plan.md +0 -131
  1008. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/pr-description.md +0 -39
  1009. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/verification-strategy.md +0 -128
  1010. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/timing.json +0 -1
  1011. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/eval_metadata.json +0 -32
  1012. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/grading.json +0 -10
  1013. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/code-changes.md +0 -143
  1014. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/execution-plan.md +0 -82
  1015. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/pr-description.md +0 -51
  1016. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/verification-strategy.md +0 -69
  1017. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/timing.json +0 -1
  1018. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/grading.json +0 -10
  1019. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/code-changes.md +0 -252
  1020. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/execution-plan.md +0 -83
  1021. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/pr-description.md +0 -33
  1022. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/verification-strategy.md +0 -101
  1023. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/timing.json +0 -1
  1024. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/eval_metadata.json +0 -32
  1025. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/grading.json +0 -10
  1026. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/code-changes.md +0 -387
  1027. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/execution-plan.md +0 -112
  1028. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/pr-description.md +0 -51
  1029. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/verification-strategy.md +0 -75
  1030. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/timing.json +0 -1
  1031. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/grading.json +0 -10
  1032. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/code-changes.md +0 -529
  1033. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/execution-plan.md +0 -127
  1034. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/pr-description.md +0 -42
  1035. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/verification-strategy.md +0 -120
  1036. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/timing.json +0 -1
  1037. package/.opencode/skills/work-with-pr-workspace/iteration-1/review.html +0 -1326
  1038. package/dist/config/schema/codegraph.d.ts +0 -12
  1039. package/dist/config/schema/start-work.d.ts +0 -5
  1040. package/dist/features/builtin-commands/templates/start-work.d.ts +0 -1
  1041. package/dist/features/builtin-skills/index.d.ts +0 -1
  1042. package/dist/features/builtin-skills/skill-file-loader.d.ts +0 -1
  1043. package/dist/features/builtin-skills/skills/agent-browser-skill.d.ts +0 -1
  1044. package/dist/features/builtin-skills/skills/agent-browser-template.d.ts +0 -1
  1045. package/dist/features/builtin-skills/skills/debugging.d.ts +0 -1
  1046. package/dist/features/builtin-skills/skills/dev-browser.d.ts +0 -1
  1047. package/dist/features/builtin-skills/skills/frontend.d.ts +0 -1
  1048. package/dist/features/builtin-skills/skills/git-master-sections/commit-atomic-planning.d.ts +0 -1
  1049. package/dist/features/builtin-skills/skills/git-master-sections/commit-context-analysis.d.ts +0 -1
  1050. package/dist/features/builtin-skills/skills/git-master-sections/commit-execution-verification.d.ts +0 -1
  1051. package/dist/features/builtin-skills/skills/git-master-sections/commit-workflow.d.ts +0 -1
  1052. package/dist/features/builtin-skills/skills/git-master-sections/history-search-workflow.d.ts +0 -1
  1053. package/dist/features/builtin-skills/skills/git-master-sections/overview.d.ts +0 -1
  1054. package/dist/features/builtin-skills/skills/git-master-sections/quick-reference.d.ts +0 -1
  1055. package/dist/features/builtin-skills/skills/git-master-sections/rebase-workflow.d.ts +0 -1
  1056. package/dist/features/builtin-skills/skills/git-master-skill-metadata.d.ts +0 -1
  1057. package/dist/features/builtin-skills/skills/git-master.d.ts +0 -1
  1058. package/dist/features/builtin-skills/skills/index.d.ts +0 -1
  1059. package/dist/features/builtin-skills/skills/init-deep.d.ts +0 -1
  1060. package/dist/features/builtin-skills/skills/playwright-cli.d.ts +0 -1
  1061. package/dist/features/builtin-skills/skills/playwright-mcp-skill.d.ts +0 -1
  1062. package/dist/features/builtin-skills/skills/playwright.d.ts +0 -1
  1063. package/dist/features/builtin-skills/skills/remove-ai-slops.d.ts +0 -1
  1064. package/dist/features/builtin-skills/skills/review-work.d.ts +0 -1
  1065. package/dist/features/builtin-skills/skills/security-research.d.ts +0 -1
  1066. package/dist/features/builtin-skills/skills/security-review.d.ts +0 -1
  1067. package/dist/features/builtin-skills/skills/team-mode.d.ts +0 -1
  1068. package/dist/features/builtin-skills/skills/visual-qa.d.ts +0 -1
  1069. package/dist/features/builtin-skills/skills.d.ts +0 -1
  1070. package/dist/features/builtin-skills/types.d.ts +0 -1
  1071. package/dist/features/claude-code-plugin-loader/agent-loader.d.ts +0 -1
  1072. package/dist/features/claude-code-plugin-loader/command-loader.d.ts +0 -1
  1073. package/dist/features/claude-code-plugin-loader/discovery-core.d.ts +0 -1
  1074. package/dist/features/claude-code-plugin-loader/discovery-paths.d.ts +0 -1
  1075. package/dist/features/claude-code-plugin-loader/discovery.d.ts +0 -1
  1076. package/dist/features/claude-code-plugin-loader/hook-loader.d.ts +0 -1
  1077. package/dist/features/claude-code-plugin-loader/index.d.ts +0 -1
  1078. package/dist/features/claude-code-plugin-loader/install-path-resolver.d.ts +0 -1
  1079. package/dist/features/claude-code-plugin-loader/installed-plugin-database.d.ts +0 -1
  1080. package/dist/features/claude-code-plugin-loader/loaded-plugin.d.ts +0 -1
  1081. package/dist/features/claude-code-plugin-loader/loader.d.ts +0 -1
  1082. package/dist/features/claude-code-plugin-loader/mcp-server-loader.d.ts +0 -1
  1083. package/dist/features/claude-code-plugin-loader/plugin-key.d.ts +0 -1
  1084. package/dist/features/claude-code-plugin-loader/plugin-manifest.d.ts +0 -1
  1085. package/dist/features/claude-code-plugin-loader/plugin-path-resolver.d.ts +0 -1
  1086. package/dist/features/claude-code-plugin-loader/plugin-settings.d.ts +0 -1
  1087. package/dist/features/claude-code-plugin-loader/scope-filter.d.ts +0 -1
  1088. package/dist/features/claude-code-plugin-loader/skill-loader.d.ts +0 -1
  1089. package/dist/features/claude-code-plugin-loader/types.d.ts +0 -1
  1090. package/dist/hooks/codegraph-bootstrap/command-runner.d.ts +0 -17
  1091. package/dist/hooks/codegraph-bootstrap/hook.d.ts +0 -35
  1092. package/dist/hooks/codegraph-bootstrap/index.d.ts +0 -1
  1093. package/dist/hooks/codegraph-bootstrap/project-root.d.ts +0 -1
  1094. package/dist/hooks/codegraph-bootstrap/status.d.ts +0 -11
  1095. package/dist/hooks/ralph-loop/completion-promise-detector-test-input.d.ts +0 -11
  1096. package/dist/hooks/ralph-loop/loop-session-recovery.d.ts +0 -7
  1097. package/dist/hooks/start-work/start-work-hook.d.ts +0 -23
  1098. package/dist/mcp/codegraph.d.ts +0 -16
  1099. package/dist/plugin/chat-message/start-work-message.d.ts +0 -5
  1100. package/dist/shared/prompt-async-gate/message-inspection-error.d.ts +0 -1
  1101. package/dist/shared/prompt-async-gate/pending-tool-turn.d.ts +0 -1
  1102. package/dist/shared/prompt-async-gate/prompt-message-state.d.ts +0 -1
  1103. package/dist/shared/prompt-async-gate/queue.d.ts +0 -1
  1104. package/dist/shared/prompt-async-gate/recent-dispatches.d.ts +0 -1
  1105. package/dist/shared/prompt-async-gate/reservations.d.ts +0 -1
  1106. package/dist/shared/prompt-async-gate/semantic-dedupe.d.ts +0 -1
  1107. package/dist/shared/prompt-async-gate/session-idle-dispatch.d.ts +0 -1
  1108. package/dist/shared/prompt-async-gate/timing.d.ts +0 -1
  1109. package/dist/shared/prompt-async-gate/types.d.ts +0 -1
  1110. package/dist/skills/data-scientist/references/common-scenarios.md +0 -176
  1111. package/dist/skills/data-scientist/references/execution-templates.md +0 -197
  1112. package/dist/skills/data-scientist/references/integration-patterns.md +0 -153
  1113. package/dist/skills/data-scientist/references/performance-benchmarks.md +0 -37
  1114. package/dist/skills/visual-qa/references/agent-browser-setup.md +0 -45
  1115. package/dist/tools/call-omo-agent/background-agent-executor.d.ts +0 -5
  1116. package/dist/tools/call-omo-agent/message-storage-directory.d.ts +0 -1
  1117. package/dist/tools/delegate-task/anthropic-categories.d.ts +0 -2
  1118. package/dist/tools/delegate-task/model-string-parser.d.ts +0 -1
  1119. package/packages/lsp-tools-mcp/dist/lsp/cleanup-errors.d.ts +0 -1
  1120. package/packages/lsp-tools-mcp/dist/lsp/constants.d.ts +0 -1
  1121. package/packages/lsp-tools-mcp/dist/lsp/language-mappings.d.ts +0 -1
  1122. package/packages/lsp-tools-mcp/dist/lsp/process-signal-cleanup.d.ts +0 -1
  1123. package/packages/lsp-tools-mcp/dist/missing-dependency-result.d.ts +0 -1
  1124. package/packages/omo-codex/plugin/components/codegraph/AGENTS.md +0 -58
  1125. package/packages/omo-codex/plugin/components/codegraph/NODE-RUNTIME-LICENSES.md +0 -2951
  1126. package/packages/omo-codex/plugin/components/codegraph/NOTICE +0 -16
  1127. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +0 -12244
  1128. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +0 -9842
  1129. package/packages/omo-codex/plugin/components/codegraph/package.json +0 -33
  1130. package/packages/omo-codex/plugin/components/codegraph/src/cache-gc.ts +0 -29
  1131. package/packages/omo-codex/plugin/components/codegraph/src/cli.ts +0 -79
  1132. package/packages/omo-codex/plugin/components/codegraph/src/hook-input.ts +0 -33
  1133. package/packages/omo-codex/plugin/components/codegraph/src/hook-sweep.ts +0 -25
  1134. package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +0 -131
  1135. package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +0 -258
  1136. package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +0 -309
  1137. package/packages/omo-codex/plugin/components/codegraph/src/mcp-unavailable.ts +0 -80
  1138. package/packages/omo-codex/plugin/components/codegraph/src/post-tool-use-hook.ts +0 -34
  1139. package/packages/omo-codex/plugin/components/codegraph/src/serve-invocation.ts +0 -29
  1140. package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +0 -263
  1141. package/packages/omo-codex/plugin/components/codegraph/src/session-start-command.ts +0 -106
  1142. package/packages/omo-codex/plugin/components/codegraph/src/session-start-cooldown.ts +0 -145
  1143. package/packages/omo-codex/plugin/components/codegraph/src/session-start-hook-runtime.ts +0 -21
  1144. package/packages/omo-codex/plugin/components/codegraph/src/session-start-lock.ts +0 -139
  1145. package/packages/omo-codex/plugin/components/codegraph/src/session-start-outcome.ts +0 -15
  1146. package/packages/omo-codex/plugin/components/codegraph/src/session-start-paths.ts +0 -32
  1147. package/packages/omo-codex/plugin/components/codegraph/src/session-start-project.ts +0 -109
  1148. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker-result.ts +0 -148
  1149. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +0 -175
  1150. package/packages/omo-codex/plugin/components/codegraph/src/sweep-cli.ts +0 -81
  1151. package/packages/omo-codex/plugin/components/codegraph/test/cache-gc.test.ts +0 -34
  1152. package/packages/omo-codex/plugin/components/codegraph/test/hook-exclusion.test.ts +0 -112
  1153. package/packages/omo-codex/plugin/components/codegraph/test/hook-registration.test.ts +0 -26
  1154. package/packages/omo-codex/plugin/components/codegraph/test/hook-session-start-guard.test.ts +0 -160
  1155. package/packages/omo-codex/plugin/components/codegraph/test/hook-store-upgrade.test.ts +0 -50
  1156. package/packages/omo-codex/plugin/components/codegraph/test/hook-sweep.test.ts +0 -29
  1157. package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +0 -320
  1158. package/packages/omo-codex/plugin/components/codegraph/test/mcp-bridge-fixtures.ts +0 -172
  1159. package/packages/omo-codex/plugin/components/codegraph/test/package-runtime.test.ts +0 -91
  1160. package/packages/omo-codex/plugin/components/codegraph/test/provisioned-node-guard.test.ts +0 -100
  1161. package/packages/omo-codex/plugin/components/codegraph/test/serve-built-wrapper.test.ts +0 -76
  1162. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge-lifecycle.test.ts +0 -133
  1163. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +0 -245
  1164. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-facade.test.ts +0 -69
  1165. package/packages/omo-codex/plugin/components/codegraph/test/serve-node-support.test.ts +0 -43
  1166. package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +0 -147
  1167. package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable.test.ts +0 -175
  1168. package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +0 -385
  1169. package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts +0 -206
  1170. package/packages/omo-codex/plugin/components/codegraph/test/session-start-project.test.ts +0 -58
  1171. package/packages/omo-codex/plugin/components/codegraph/test/session-start-state.test.ts +0 -104
  1172. package/packages/omo-codex/plugin/components/codegraph/test/session-start-trust-boundary.test.ts +0 -65
  1173. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-availability.test.ts +0 -106
  1174. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-cooldown.test.ts +0 -116
  1175. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +0 -258
  1176. package/packages/omo-codex/plugin/components/codegraph/test/sweep-cli.test.ts +0 -56
  1177. package/packages/omo-codex/plugin/components/codegraph/tsconfig.build.json +0 -13
  1178. package/packages/omo-codex/plugin/components/codegraph/tsconfig.json +0 -25
  1179. package/packages/omo-codex/plugin/components/start-work-continuation/LICENSE +0 -21
  1180. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +0 -28
  1181. package/packages/omo-codex/plugin/components/ultrawork/directive.md +0 -477
  1182. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +0 -18
  1183. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +0 -17
  1184. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +0 -17
  1185. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +0 -17
  1186. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/editor.mjs +0 -125
  1187. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/jsonc.mjs +0 -43
  1188. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/scaffold.mjs +0 -29
  1189. package/packages/omo-codex/plugin/scripts/migrate-omo-sot.mjs +0 -121
  1190. package/packages/omo-codex/plugin/skills/data-scientist/references/common-scenarios.md +0 -176
  1191. package/packages/omo-codex/plugin/skills/data-scientist/references/execution-templates.md +0 -197
  1192. package/packages/omo-codex/plugin/skills/data-scientist/references/integration-patterns.md +0 -153
  1193. package/packages/omo-codex/plugin/skills/data-scientist/references/performance-benchmarks.md +0 -37
  1194. package/packages/omo-codex/plugin/skills/start-work/agents/openai.yaml +0 -2
  1195. package/packages/omo-codex/plugin/skills/visual-qa/references/agent-browser-setup.md +0 -45
  1196. package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +0 -92
  1197. package/packages/omo-codex/plugin/test/component-codegraph-mcp-smoke.test.mjs +0 -76
  1198. package/packages/omo-codex/plugin/test/migrate-omo-sot.test.mjs +0 -179
  1199. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +0 -314
  1200. package/packages/omo-codex/plugin/test/ulw-plan-scope-contract.test.mjs +0 -24
  1201. package/packages/shared-skills/skills/data-scientist/references/common-scenarios.md +0 -176
  1202. package/packages/shared-skills/skills/data-scientist/references/execution-templates.md +0 -197
  1203. package/packages/shared-skills/skills/data-scientist/references/integration-patterns.md +0 -153
  1204. package/packages/shared-skills/skills/data-scientist/references/performance-benchmarks.md +0 -37
  1205. package/packages/shared-skills/skills/visual-qa/references/agent-browser-setup.md +0 -45
  1206. /package/dist/hooks/{start-work → ulw-execute}/context-info-formatters.d.ts +0 -0
  1207. /package/dist/hooks/{start-work → ulw-execute}/explicit-plan-context.d.ts +0 -0
  1208. /package/dist/hooks/{start-work → ulw-execute}/notepad-scaffold.d.ts +0 -0
  1209. /package/dist/hooks/{start-work → ulw-execute}/parse-user-request.d.ts +0 -0
  1210. /package/dist/hooks/{start-work → ulw-execute}/plan-discovery-context.d.ts +0 -0
  1211. /package/dist/hooks/{start-work → ulw-execute}/plan-selection.d.ts +0 -0
  1212. /package/dist/hooks/{start-work → ulw-execute}/session-plan-affinity.d.ts +0 -0
  1213. /package/dist/hooks/{start-work → ulw-execute}/work-initializer.d.ts +0 -0
  1214. /package/dist/hooks/{start-work → ulw-execute}/worktree-block.d.ts +0 -0
  1215. /package/dist/hooks/{start-work → ulw-execute}/worktree-detector.d.ts +0 -0
  1216. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/.gitattributes +0 -0
  1217. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/CHANGELOG.md +0 -0
  1218. /package/packages/omo-codex/plugin/components/{codegraph → ulw-execute-continuation}/LICENSE +0 -0
  1219. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/plan-checklist.ts +0 -0
  1220. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-completed.json +0 -0
  1221. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-mixed-platforms.json +0 -0
  1222. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-single-codex-work.json +0 -0
  1223. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-all-done.md +0 -0
  1224. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-scaffold.md +0 -0
  1225. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-nested-checkboxes.md +0 -0
  1226. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-unchecked.md +0 -0
  1227. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.build.json +0 -0
  1228. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.json +0 -0
  1229. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/vitest.config.ts +0 -0
@@ -175,6 +175,7 @@ async function runJsonRpcStdioServer(config) {
175
175
  const idleTimer = createIdleTimer(idleTimeoutMs, log, () => {
176
176
  isClosed = true;
177
177
  config.onIdleTimeout?.();
178
+ config.input.destroy();
178
179
  });
179
180
  const watchdog = createParentWatchdog(config.parentWatchdog, (parentPid, pollIntervalMs) => {
180
181
  isClosed = true;
@@ -271,7 +272,11 @@ function createParentWatchdog(config, onDeadParent) {
271
272
  const probeAlive = config.probeAlive ?? isProcessAlive;
272
273
  let fired = false;
273
274
  const timer = setInterval(() => {
274
- if (fired || probeAlive(parentPid))
275
+ if (fired)
276
+ return;
277
+ const alive = probeAlive(parentPid);
278
+ config.onPoll?.(alive);
279
+ if (alive)
275
280
  return;
276
281
  fired = true;
277
282
  onDeadParent(parentPid, pollIntervalMs);
@@ -306,8 +311,8 @@ function createIdleTimer(idleTimeoutMs, log, onTimeout) {
306
311
  };
307
312
  }
308
313
  // ../lsp-core/src/lsp/client-wrapper.ts
309
- import { existsSync as existsSync9, realpathSync as realpathSync4, statSync as statSync3 } from "node:fs";
310
- import { basename as basename3, dirname as dirname6, join as join4, resolve as resolve7 } from "node:path";
314
+ import { existsSync as existsSync10, realpathSync as realpathSync5, statSync as statSync3 } from "node:fs";
315
+ import { basename as basename3, dirname as dirname8, join as join5, resolve as resolve8 } from "node:path";
311
316
 
312
317
  // ../lsp-core/src/request-context.ts
313
318
  import { AsyncLocalStorage } from "node:async_hooks";
@@ -316,18 +321,17 @@ import { homedir } from "node:os";
316
321
  import { basename, delimiter, dirname, isAbsolute, join, relative, resolve } from "node:path";
317
322
 
318
323
  class LspRequestContextParseError extends Error {
319
- code;
320
- name = "LspRequestContextParseError";
321
324
  constructor(code, message) {
322
325
  super(message);
323
326
  this.code = code;
327
+ this.name = "LspRequestContextParseError";
324
328
  }
325
329
  }
326
330
 
327
331
  class LspRequestContextUnavailableError extends Error {
328
- name = "LspRequestContextUnavailableError";
329
332
  constructor() {
330
333
  super("LSP request context is required. Standalone MCP startup must install one with runWithRequestContext(createStandaloneMcpRequestContext()).");
334
+ this.name = "LspRequestContextUnavailableError";
331
335
  }
332
336
  }
333
337
  var storage = new AsyncLocalStorage;
@@ -357,7 +361,7 @@ function contextEnv(key) {
357
361
  }
358
362
  function createStandaloneMcpRequestContext(input = {}) {
359
363
  const env = input.env ?? process.env;
360
- const cwd = canonicalCwd(input.cwd ?? process.cwd());
364
+ const cwd = canonicalCwd(input.cwd ?? env["LSP_TOOLS_MCP_CWD"] ?? process.cwd());
361
365
  const home = input.homeDir ?? homedir();
362
366
  const projectConfigPaths = translateProjectConfigEnv(env["LSP_TOOLS_MCP_PROJECT_CONFIG"], cwd);
363
367
  const userConfigPath = translateHomeConfigEnv(env["LSP_TOOLS_MCP_USER_CONFIG"], home, ".codex/lsp-client.json");
@@ -500,22 +504,15 @@ function effectiveExtension(filePath) {
500
504
 
501
505
  // ../lsp-core/src/lsp/errors.ts
502
506
  class LspConnectionClosedError extends Error {
503
- serverId;
504
- root;
505
- name = "LspConnectionClosedError";
506
507
  constructor(serverId, root, message) {
507
508
  super(message ?? `LSP connection closed for ${serverId} at ${root}`);
508
509
  this.serverId = serverId;
509
510
  this.root = root;
511
+ this.name = "LspConnectionClosedError";
510
512
  }
511
513
  }
512
514
 
513
515
  class LspProcessExitedError extends Error {
514
- serverId;
515
- root;
516
- exitCode;
517
- stderrTail;
518
- name = "LspProcessExitedError";
519
516
  constructor(serverId, root, exitCode, stderrTail) {
520
517
  const stderrSuffix = stderrTail ? `
521
518
  stderr tail: ${stderrTail}` : "";
@@ -524,46 +521,59 @@ stderr tail: ${stderrTail}` : "";
524
521
  this.root = root;
525
522
  this.exitCode = exitCode;
526
523
  this.stderrTail = stderrTail;
524
+ this.name = "LspProcessExitedError";
527
525
  }
528
526
  }
529
527
 
530
528
  class LspRequestTimeoutError extends Error {
531
- method;
532
- stderrTail;
533
- name = "LspRequestTimeoutError";
534
529
  constructor(method, stderrTail) {
535
530
  const stderrSuffix = stderrTail ? `
536
531
  recent stderr: ${stderrTail}` : "";
537
532
  super(`LSP request timeout (method: ${method})${stderrSuffix}`);
538
533
  this.method = method;
539
534
  this.stderrTail = stderrTail;
535
+ this.name = "LspRequestTimeoutError";
540
536
  }
541
537
  }
542
538
 
543
539
  class LspInvalidPathError extends Error {
544
- name = "LspInvalidPathError";
540
+ constructor() {
541
+ super(...arguments);
542
+ this.name = "LspInvalidPathError";
543
+ }
545
544
  }
546
545
 
547
546
  class LspServerLookupError extends Error {
548
- lookup;
549
- name = "LspServerLookupError";
550
547
  constructor(message, lookup) {
551
548
  super(message);
552
549
  this.lookup = lookup;
550
+ this.name = "LspServerLookupError";
553
551
  }
554
552
  }
555
553
 
556
554
  class LspServerInitializingError extends Error {
557
- originalError;
558
- name = "LspServerInitializingError";
559
555
  constructor(originalError) {
560
556
  super(`LSP server is still initializing. Please retry in a few seconds. Original error: ${originalError.message}`);
561
557
  this.originalError = originalError;
558
+ this.name = "LspServerInitializingError";
562
559
  }
563
560
  }
564
561
 
565
562
  class LspProcessSpawnError extends Error {
566
- name = "LspProcessSpawnError";
563
+ constructor() {
564
+ super(...arguments);
565
+ this.name = "LspProcessSpawnError";
566
+ }
567
+ }
568
+
569
+ class LspClientRespawnBudgetExceededError extends Error {
570
+ constructor(serverId, root, retryLimit) {
571
+ super(`LSP server ${serverId} at ${root} failed to stay alive; respawn budget exhausted ` + `(${retryLimit} consecutive dead generations). Retrying after the cooldown may succeed.`);
572
+ this.serverId = serverId;
573
+ this.root = root;
574
+ this.retryLimit = retryLimit;
575
+ this.name = "LspClientRespawnBudgetExceededError";
576
+ }
567
577
  }
568
578
  function isLspDeadConnectionError(err) {
569
579
  return err instanceof LspConnectionClosedError || err instanceof LspProcessExitedError;
@@ -586,6 +596,13 @@ import { pathToFileURL as pathToFileURL3 } from "node:url";
586
596
  // ../lsp-core/src/lsp/connection.ts
587
597
  import { pathToFileURL } from "node:url";
588
598
 
599
+ // ../lsp-core/src/lsp/timer-provider.ts
600
+ var realTimerProvider = {
601
+ now: () => Date.now(),
602
+ setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
603
+ clearTimeout: (handle) => clearTimeout(handle)
604
+ };
605
+
589
606
  // ../lsp-core/src/lsp/constants.ts
590
607
  var DEFAULT_MAX_REFERENCES = 200;
591
608
  var DEFAULT_MAX_SYMBOLS = 200;
@@ -594,9 +611,12 @@ var DEFAULT_MAX_DIRECTORY_FILES = 50;
594
611
  var REQUEST_TIMEOUT_MS = 15000;
595
612
  var INIT_TIMEOUT_MS = 60000;
596
613
  var IDLE_TIMEOUT_MS = 5 * 60000;
614
+ var MAX_RESIDENT_CLIENTS = 6;
597
615
  var REAPER_INTERVAL_MS = 60000;
598
616
  var STOP_HARD_KILL_TIMEOUT_MS = 5000;
599
617
  var STOP_SIGKILL_GRACE_MS = 1000;
618
+ var CLIENT_RESPAWN_RETRY_LIMIT = 2;
619
+ var CLIENT_RESPAWN_COOLDOWN_MS = 60000;
600
620
 
601
621
  // ../lsp-core/src/lsp/json-rpc-connection.ts
602
622
  var HEADER_SEPARATOR2 = `\r
@@ -608,20 +628,31 @@ var METHOD_NOT_FOUND = -32601;
608
628
  var INTERNAL_ERROR = -32603;
609
629
 
610
630
  class JsonRpcConnection {
611
- reader;
612
- writer;
613
- pendingRequests = new Map;
614
- notificationHandlers = new Map;
615
- requestHandlers = new Map;
616
- closeHandlers = [];
617
- errorHandlers = [];
618
- inputBuffer = Buffer.alloc(0);
619
- nextRequestId = 1;
620
- listening = false;
621
- disposed = false;
622
631
  constructor(reader, writer) {
623
632
  this.reader = reader;
624
633
  this.writer = writer;
634
+ this.pendingRequests = new Map;
635
+ this.notificationHandlers = new Map;
636
+ this.requestHandlers = new Map;
637
+ this.closeHandlers = [];
638
+ this.errorHandlers = [];
639
+ this.inputBuffer = Buffer.alloc(0);
640
+ this.nextRequestId = 1;
641
+ this.listening = false;
642
+ this.disposed = false;
643
+ this.handleData = (chunk) => {
644
+ const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf8");
645
+ this.inputBuffer = Buffer.concat([this.inputBuffer, chunkBuffer]);
646
+ this.drainInputBuffer();
647
+ };
648
+ this.handleClose = () => {
649
+ for (const handler of this.closeHandlers) {
650
+ handler();
651
+ }
652
+ };
653
+ this.handleStreamError = (error) => {
654
+ this.emitError(error);
655
+ };
625
656
  }
626
657
  listen() {
627
658
  if (this.listening)
@@ -656,7 +687,8 @@ class JsonRpcConnection {
656
687
  let cancelAfterWrite = false;
657
688
  let settled = false;
658
689
  const writeCancel = () => this.writeMessage({ jsonrpc: "2.0", method: "$/cancelRequest", params: { id } });
659
- const responsePromise = new Promise((resolve2, reject) => {
690
+ let rejectAfterCancelWrite;
691
+ const responsePromise = new Promise((resolve, reject) => {
660
692
  const cleanup = () => {
661
693
  options.signal?.removeEventListener("abort", onAbort);
662
694
  };
@@ -667,22 +699,26 @@ class JsonRpcConnection {
667
699
  this.pendingRequests.delete(key);
668
700
  cleanup();
669
701
  const rejectCancelled = () => reject(abortError(options.signal));
702
+ rejectAfterCancelWrite = async () => {
703
+ try {
704
+ await writeCancel();
705
+ } catch (error) {
706
+ this.emitError(toError(error));
707
+ }
708
+ rejectCancelled();
709
+ };
670
710
  if (!requestWritten) {
671
711
  cancelAfterWrite = true;
672
- rejectCancelled();
673
712
  return;
674
713
  }
675
- writeCancel().then(rejectCancelled, (error) => {
676
- this.emitError(toError(error));
677
- rejectCancelled();
678
- });
714
+ rejectAfterCancelWrite();
679
715
  };
680
716
  const onAbort = () => settleCancel();
681
717
  this.pendingRequests.set(key, {
682
718
  resolve(result) {
683
719
  settled = true;
684
720
  cleanup();
685
- resolve2(result);
721
+ resolve(result);
686
722
  },
687
723
  reject(error) {
688
724
  settled = true;
@@ -703,7 +739,7 @@ class JsonRpcConnection {
703
739
  await this.writeMessage(message);
704
740
  requestWritten = true;
705
741
  if (cancelAfterWrite)
706
- await writeCancel();
742
+ await rejectAfterCancelWrite?.();
707
743
  } catch (error) {
708
744
  if (settled)
709
745
  return responsePromise;
@@ -742,19 +778,6 @@ class JsonRpcConnection {
742
778
  this.notificationHandlers.clear();
743
779
  this.requestHandlers.clear();
744
780
  }
745
- handleData = (chunk) => {
746
- const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf8");
747
- this.inputBuffer = Buffer.concat([this.inputBuffer, chunkBuffer]);
748
- this.drainInputBuffer();
749
- };
750
- handleClose = () => {
751
- for (const handler of this.closeHandlers) {
752
- handler();
753
- }
754
- };
755
- handleStreamError = (error) => {
756
- this.emitError(error);
757
- };
758
781
  drainInputBuffer() {
759
782
  while (true) {
760
783
  const headerEnd = this.inputBuffer.indexOf(HEADER_SEPARATOR2);
@@ -854,13 +877,13 @@ class JsonRpcConnection {
854
877
  const payload = `Content-Length: ${Buffer.byteLength(body, "utf8")}\r
855
878
  \r
856
879
  ${body}`;
857
- return new Promise((resolve2, reject) => {
880
+ return new Promise((resolve, reject) => {
858
881
  this.writer.write(payload, (error) => {
859
882
  if (error) {
860
883
  reject(error);
861
884
  return;
862
885
  }
863
- resolve2();
886
+ resolve();
864
887
  });
865
888
  });
866
889
  }
@@ -947,9 +970,9 @@ function validateCwd(cwd) {
947
970
  }
948
971
  }
949
972
  function wrap(proc) {
950
- const exitedPromise = new Promise((resolve2) => {
951
- proc.once("close", (code) => resolve2(code ?? 0));
952
- proc.once("error", () => resolve2(1));
973
+ const exitedPromise = new Promise((resolve) => {
974
+ proc.once("close", (code) => resolve(code ?? 0));
975
+ proc.once("error", () => resolve(1));
953
976
  });
954
977
  if (!proc.stdin || !proc.stdout || !proc.stderr) {
955
978
  throw new LspProcessSpawnError("Spawned process is missing one of stdin/stdout/stderr pipes");
@@ -1102,33 +1125,29 @@ function isPosition(value) {
1102
1125
 
1103
1126
  // ../lsp-core/src/lsp/transport.ts
1104
1127
  class LspClientNotStartedError extends Error {
1105
- serverId;
1106
- root;
1107
- name = "LspClientNotStartedError";
1108
1128
  constructor(serverId, root) {
1109
1129
  super("LSP client not started");
1110
1130
  this.serverId = serverId;
1111
1131
  this.root = root;
1132
+ this.name = "LspClientNotStartedError";
1112
1133
  }
1113
1134
  }
1114
1135
 
1115
1136
  class LspClientTransport {
1116
- root;
1117
- server;
1118
- proc = null;
1119
- connection = null;
1120
- stderrBuffer = [];
1121
- processExited = false;
1122
- diagnosticsStore = new Map;
1123
- requestTimeoutMs;
1124
- initializeTimeoutMs;
1125
- workspaceApplyEditHandler = null;
1126
- diagnosticPullSupported = false;
1127
- constructor(root, server2, timeouts = {}) {
1137
+ constructor(root, server, timeouts = {}) {
1128
1138
  this.root = root;
1129
- this.server = server2;
1139
+ this.server = server;
1140
+ this.proc = null;
1141
+ this.connection = null;
1142
+ this.stderrBuffer = [];
1143
+ this.processExited = false;
1144
+ this.diagnosticsStore = new Map;
1145
+ this.workspaceApplyEditHandler = null;
1146
+ this.diagnosticPullSupported = false;
1147
+ this.documentFormattingSupported = false;
1130
1148
  this.requestTimeoutMs = timeouts.requestTimeoutMs ?? REQUEST_TIMEOUT_MS;
1131
1149
  this.initializeTimeoutMs = timeouts.initializeTimeoutMs ?? INIT_TIMEOUT_MS;
1150
+ this.timerProvider = timeouts.timerProvider ?? realTimerProvider;
1132
1151
  }
1133
1152
  pid() {
1134
1153
  return this.proc?.pid;
@@ -1148,6 +1167,12 @@ class LspClientTransport {
1148
1167
  isDiagnosticPullSupported() {
1149
1168
  return this.diagnosticPullSupported;
1150
1169
  }
1170
+ setDocumentFormattingSupported(supported) {
1171
+ this.documentFormattingSupported = supported;
1172
+ }
1173
+ isDocumentFormattingSupported() {
1174
+ return this.documentFormattingSupported;
1175
+ }
1151
1176
  handlePublishDiagnostics(params) {
1152
1177
  this.diagnosticsStore.set(params.uri, [...params.diagnostics]);
1153
1178
  }
@@ -1223,7 +1248,7 @@ class LspClientTransport {
1223
1248
  const options = args[1];
1224
1249
  const timeoutMs = options?.timeoutMs ?? this.requestTimeoutMs;
1225
1250
  const timeoutController = new AbortController;
1226
- const timeoutHandle = setTimeout(() => {
1251
+ const timeoutHandle = this.timerProvider.setTimeout(() => {
1227
1252
  const stderrTail = this.stderrBuffer.slice(-5).join(`
1228
1253
  `);
1229
1254
  timeoutController.abort(new LspRequestTimeoutError(method, stderrTail || undefined));
@@ -1242,7 +1267,7 @@ class LspClientTransport {
1242
1267
  }
1243
1268
  throw error;
1244
1269
  } finally {
1245
- clearTimeout(timeoutHandle);
1270
+ this.timerProvider.clearTimeout(timeoutHandle);
1246
1271
  combinedSignal.dispose();
1247
1272
  }
1248
1273
  }
@@ -1293,8 +1318,8 @@ class LspClientTransport {
1293
1318
  try {
1294
1319
  proc.kill();
1295
1320
  let timeoutId;
1296
- const timeoutPromise = new Promise((resolve2) => {
1297
- timeoutId = setTimeout(resolve2, STOP_HARD_KILL_TIMEOUT_MS);
1321
+ const timeoutPromise = new Promise((resolve) => {
1322
+ timeoutId = setTimeout(resolve, STOP_HARD_KILL_TIMEOUT_MS);
1298
1323
  });
1299
1324
  await Promise.race([
1300
1325
  proc.exited.then(() => {
@@ -1310,7 +1335,7 @@ class LspClientTransport {
1310
1335
  proc.kill("SIGKILL");
1311
1336
  await Promise.race([
1312
1337
  proc.exited,
1313
- new Promise((resolve2) => setTimeout(resolve2, STOP_SIGKILL_GRACE_MS))
1338
+ new Promise((resolve) => setTimeout(resolve, STOP_SIGKILL_GRACE_MS))
1314
1339
  ]);
1315
1340
  } catch (error) {
1316
1341
  reportBestEffortCleanupError("hard process kill", error instanceof Error ? error : String(error));
@@ -1361,6 +1386,14 @@ function supportsDiagnosticPull(capabilities) {
1361
1386
  return false;
1362
1387
  return Object.hasOwn(capabilities, "diagnosticProvider");
1363
1388
  }
1389
+ function supportsDocumentFormatting(capabilities) {
1390
+ if (capabilities === undefined)
1391
+ return false;
1392
+ const provider = capabilities.documentFormattingProvider;
1393
+ if (provider === undefined || provider === null || provider === false)
1394
+ return false;
1395
+ return provider === true || typeof provider === "object";
1396
+ }
1364
1397
 
1365
1398
  class LspClientConnection extends LspClientTransport {
1366
1399
  async initialize() {
@@ -1377,6 +1410,7 @@ class LspClientConnection extends LspClientTransport {
1377
1410
  references: {},
1378
1411
  documentSymbol: { hierarchicalDocumentSymbolSupport: true },
1379
1412
  publishDiagnostics: {},
1413
+ formatting: { dynamicRegistration: false },
1380
1414
  rename: {
1381
1415
  prepareSupport: true,
1382
1416
  prepareSupportDefaultBehavior: 1
@@ -1418,6 +1452,7 @@ class LspClientConnection extends LspClientTransport {
1418
1452
  initializationOptions: this.server.initialization
1419
1453
  }, { timeoutMs: this.initializeTimeoutMs });
1420
1454
  this.setDiagnosticPullSupported(supportsDiagnosticPull(result?.capabilities));
1455
+ this.setDocumentFormattingSupported(supportsDocumentFormatting(result?.capabilities));
1421
1456
  await this.sendNotification("initialized", {});
1422
1457
  await this.sendNotification("workspace/didChangeConfiguration", {
1423
1458
  settings: { json: { validate: { enable: true } } }
@@ -1613,6 +1648,17 @@ function canonicalPath(filePath) {
1613
1648
  return absolute;
1614
1649
  }
1615
1650
  }
1651
+ function normalizeDocumentUri(uri) {
1652
+ let decoded = uri;
1653
+ try {
1654
+ decoded = decodeURIComponent(uri);
1655
+ } catch {
1656
+ decoded = uri;
1657
+ }
1658
+ if (process.platform !== "win32")
1659
+ return decoded;
1660
+ return decoded.replace(/^(file:\/\/\/)([a-z]):/, (_match, prefix, drive) => `${prefix}${drive.toUpperCase()}:`);
1661
+ }
1616
1662
  function isSameOrDescendant(candidate, parent) {
1617
1663
  const suffix = relative2(parent, candidate);
1618
1664
  return suffix === "" || !suffix.startsWith("..") && suffix !== "..";
@@ -1623,17 +1669,18 @@ function movedPath(candidate, oldPath, newPath) {
1623
1669
  }
1624
1670
 
1625
1671
  class WorkspaceDocumentState {
1626
- sendNotification;
1627
- clearDiagnostics;
1628
- openDocuments = new Map;
1629
- openByUri = new Map;
1630
- openPromises = new Map;
1631
- now;
1632
- versionlessPublishQuiescenceMs;
1633
1672
  constructor(sendNotification, clearDiagnostics, options = {}) {
1634
1673
  this.sendNotification = sendNotification;
1635
1674
  this.clearDiagnostics = clearDiagnostics;
1636
- this.now = options.now ?? (() => Date.now());
1675
+ this.openDocuments = new Map;
1676
+ this.openByUri = new Map;
1677
+ this.openPromises = new Map;
1678
+ this.timerProvider = options.timerProvider ?? {
1679
+ now: options.now ?? (() => Date.now()),
1680
+ setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
1681
+ clearTimeout: (handle) => clearTimeout(handle)
1682
+ };
1683
+ this.now = () => this.timerProvider.now();
1637
1684
  this.versionlessPublishQuiescenceMs = options.versionlessPublishQuiescenceMs ?? DEFAULT_VERSIONLESS_PUBLISH_QUIESCENCE_MS;
1638
1685
  }
1639
1686
  async openFile(filePath) {
@@ -1655,7 +1702,7 @@ class WorkspaceDocumentState {
1655
1702
  return this.openDocuments.get(canonicalPath(filePath))?.version;
1656
1703
  }
1657
1704
  getStoredDiagnostics(uri) {
1658
- const state = this.openByUri.get(uri);
1705
+ const state = this.openByUri.get(normalizeDocumentUri(uri));
1659
1706
  if (!state)
1660
1707
  return [];
1661
1708
  return state.lastPublish?.diagnostics ?? state.pullCache?.diagnostics ?? [];
@@ -1677,13 +1724,13 @@ class WorkspaceDocumentState {
1677
1724
  return state !== undefined && state.uri === snapshot.uri && state.version === snapshot.version && state.generation === snapshot.documentGeneration;
1678
1725
  }
1679
1726
  getPullCache(snapshot) {
1680
- const state = this.openByUri.get(snapshot.uri);
1727
+ const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
1681
1728
  if (!state?.pullCache || state.pullCache.documentVersion !== snapshot.version)
1682
1729
  return null;
1683
1730
  return state.pullCache;
1684
1731
  }
1685
1732
  recordPullDiagnostics(snapshot, report) {
1686
- const state = this.openByUri.get(snapshot.uri);
1733
+ const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
1687
1734
  if (!state)
1688
1735
  return;
1689
1736
  state.pullCache = {
@@ -1693,7 +1740,7 @@ class WorkspaceDocumentState {
1693
1740
  };
1694
1741
  }
1695
1742
  recordPublishedDiagnostics(params) {
1696
- const state = this.openByUri.get(params.uri);
1743
+ const state = this.openByUri.get(normalizeDocumentUri(params.uri));
1697
1744
  if (!state)
1698
1745
  return;
1699
1746
  state.publishGeneration += 1;
@@ -1707,7 +1754,7 @@ class WorkspaceDocumentState {
1707
1754
  this.notifyWaiters(state);
1708
1755
  }
1709
1756
  resolvePushDiagnostics(snapshot) {
1710
- const state = this.openByUri.get(snapshot.uri);
1757
+ const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
1711
1758
  if (!state?.lastPublish)
1712
1759
  return { status: "missing" };
1713
1760
  const publish = state.lastPublish;
@@ -1721,20 +1768,22 @@ class WorkspaceDocumentState {
1721
1768
  return waitMs === 0 ? { status: "ready", diagnostics: publish.diagnostics } : { status: "wait", waitMs };
1722
1769
  }
1723
1770
  waitForDiagnosticsActivity(snapshot, timeoutMs) {
1724
- const state = this.openByUri.get(snapshot.uri);
1771
+ const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
1725
1772
  if (!state || timeoutMs <= 0)
1726
1773
  return Promise.resolve();
1774
+ if (state.publishGeneration !== snapshot.publishGeneration)
1775
+ return Promise.resolve();
1727
1776
  return new Promise((resolveActivity) => {
1728
1777
  let settled = false;
1729
1778
  const finish = () => {
1730
1779
  if (settled)
1731
1780
  return;
1732
1781
  settled = true;
1733
- clearTimeout(timer);
1782
+ this.timerProvider.clearTimeout(timer);
1734
1783
  state.waiters.delete(finish);
1735
1784
  resolveActivity();
1736
1785
  };
1737
- const timer = setTimeout(finish, timeoutMs);
1786
+ const timer = this.timerProvider.setTimeout(finish, timeoutMs);
1738
1787
  if (typeof timer.unref === "function")
1739
1788
  timer.unref();
1740
1789
  state.waiters.add(finish);
@@ -1842,7 +1891,7 @@ class WorkspaceDocumentState {
1842
1891
  waiters: new Set
1843
1892
  };
1844
1893
  this.openDocuments.set(path, state);
1845
- this.openByUri.set(state.uri, state);
1894
+ this.openByUri.set(normalizeDocumentUri(state.uri), state);
1846
1895
  this.notifyWaiters(state);
1847
1896
  await this.sendNotification("textDocument/didOpen", {
1848
1897
  textDocument: { uri: state.uri, languageId: state.languageId, version: state.version, text }
@@ -1867,7 +1916,7 @@ class WorkspaceDocumentState {
1867
1916
  }
1868
1917
  async closeDocument(state) {
1869
1918
  this.openDocuments.delete(state.path);
1870
- this.openByUri.delete(state.uri);
1919
+ this.openByUri.delete(normalizeDocumentUri(state.uri));
1871
1920
  this.clearDiagnostics(state.uri);
1872
1921
  this.notifyWaiters(state);
1873
1922
  await this.sendNotification("textDocument/didClose", { textDocument: { uri: state.uri } });
@@ -1896,13 +1945,11 @@ import { dirname as dirname2, isAbsolute as isAbsolute2, relative as relative3,
1896
1945
  import { fileURLToPath } from "node:url";
1897
1946
 
1898
1947
  class WorkspaceEditPathError extends Error {
1899
- path;
1900
- detail;
1901
- name = "WorkspaceEditPathError";
1902
1948
  constructor(path, detail) {
1903
1949
  super(`${detail}: ${path}`);
1904
1950
  this.path = path;
1905
1951
  this.detail = detail;
1952
+ this.name = "WorkspaceEditPathError";
1906
1953
  }
1907
1954
  }
1908
1955
  function isPathInsideWorkspace(filePath, workspaceRoot) {
@@ -2194,13 +2241,11 @@ function canonicalFingerprint(operations) {
2194
2241
 
2195
2242
  // ../lsp-core/src/lsp/workspace-edit-types.ts
2196
2243
  class WorkspaceEditValidationError extends Error {
2197
- changeIndex;
2198
- detail;
2199
- name = "WorkspaceEditValidationError";
2200
2244
  constructor(changeIndex, detail) {
2201
2245
  super(`change ${changeIndex}: ${detail}`);
2202
2246
  this.changeIndex = changeIndex;
2203
2247
  this.detail = detail;
2248
+ this.name = "WorkspaceEditValidationError";
2204
2249
  }
2205
2250
  }
2206
2251
 
@@ -2286,14 +2331,14 @@ function parseSinglePathResource(input, kind) {
2286
2331
  return;
2287
2332
  }
2288
2333
  if (kind === "create") {
2289
- const options2 = parseOptions(change["options"], ["overwrite", "ignoreIfExists"], changeIndex);
2334
+ const options = parseOptions(change["options"], ["overwrite", "ignoreIfExists"], changeIndex);
2290
2335
  target.operations.push({
2291
2336
  kind,
2292
2337
  changeIndex,
2293
2338
  path: resolvedPath.path,
2294
2339
  reportedPath: resolvedPath.requestedPath,
2295
- overwrite: options2["overwrite"] ?? false,
2296
- ignoreIfExists: options2["ignoreIfExists"] ?? false,
2340
+ overwrite: options["overwrite"] ?? false,
2341
+ ignoreIfExists: options["ignoreIfExists"] ?? false,
2297
2342
  followedSymbolicLink: resolvedPath.followedSymbolicLink
2298
2343
  });
2299
2344
  return;
@@ -2698,10 +2743,9 @@ function simulateDelete(operation, virtual) {
2698
2743
  import { existsSync as existsSync5, lstatSync as lstatSync3, readdirSync as readdirSync2 } from "node:fs";
2699
2744
  import { dirname as dirname4, resolve as resolve5 } from "node:path";
2700
2745
  class WorkspaceSnapshotBuilder {
2701
- workspaceRoot;
2702
- snapshots = new Map;
2703
2746
  constructor(workspaceRoot) {
2704
2747
  this.workspaceRoot = workspaceRoot;
2748
+ this.snapshots = new Map;
2705
2749
  }
2706
2750
  build(operations) {
2707
2751
  this.add(this.workspaceRoot, false);
@@ -2745,8 +2789,10 @@ function snapshotOperations(operations, workspaceRoot) {
2745
2789
 
2746
2790
  // ../lsp-core/src/lsp/workspace-edit-plan.ts
2747
2791
  class PlanPathIndex {
2748
- firstChangeByPath = new Map;
2749
- reportedPathByCanonical = new Map;
2792
+ constructor() {
2793
+ this.firstChangeByPath = new Map;
2794
+ this.reportedPathByCanonical = new Map;
2795
+ }
2750
2796
  build(operations) {
2751
2797
  for (const operation of operations) {
2752
2798
  switch (operation.kind) {
@@ -2762,11 +2808,11 @@ class PlanPathIndex {
2762
2808
  }
2763
2809
  }
2764
2810
  }
2765
- add(path, reportedPath2, changeIndex) {
2811
+ add(path, reportedPath, changeIndex) {
2766
2812
  if (!this.firstChangeByPath.has(path))
2767
2813
  this.firstChangeByPath.set(path, changeIndex);
2768
2814
  if (!this.reportedPathByCanonical.has(path))
2769
- this.reportedPathByCanonical.set(path, reportedPath2);
2815
+ this.reportedPathByCanonical.set(path, reportedPath);
2770
2816
  }
2771
2817
  }
2772
2818
  function fingerprintWorkspaceEdit(edit, workspaceRoot) {
@@ -2835,14 +2881,11 @@ function isRecord4(value) {
2835
2881
  }
2836
2882
 
2837
2883
  class WorkspaceMutationController {
2838
- workspaceRoot;
2839
- documents;
2840
- activeLease = null;
2841
- nextLeaseId = 1;
2842
- io;
2843
2884
  constructor(workspaceRoot, documents) {
2844
2885
  this.workspaceRoot = workspaceRoot;
2845
2886
  this.documents = documents;
2887
+ this.activeLease = null;
2888
+ this.nextLeaseId = 1;
2846
2889
  }
2847
2890
  setIo(io) {
2848
2891
  this.io = io;
@@ -2881,15 +2924,15 @@ class WorkspaceMutationController {
2881
2924
  };
2882
2925
  }
2883
2926
  lease.phase = "applying";
2884
- lease.applyCompletion = new Promise((resolve6) => {
2885
- lease.resolveApply = resolve6;
2927
+ lease.applyCompletion = new Promise((resolve) => {
2928
+ lease.resolveApply = resolve;
2886
2929
  });
2887
2930
  const edit = isRecord4(params) ? params["edit"] : undefined;
2888
- const record2 = edit === undefined ? { fingerprint: null, result: failure("workspace/applyEdit params.edit is required", 0) } : await this.applyEdit(edit, lease);
2889
- lease.serverApply = record2;
2931
+ const record = edit === undefined ? { fingerprint: null, result: failure("workspace/applyEdit params.edit is required", 0) } : await this.applyEdit(edit, lease);
2932
+ lease.serverApply = record;
2890
2933
  lease.phase = "settled";
2891
2934
  lease.resolveApply?.();
2892
- return responseFor(record2.result);
2935
+ return responseFor(record.result);
2893
2936
  }
2894
2937
  async reconcileRename(leaseToken, edit) {
2895
2938
  const lease = this.requireActiveLease(leaseToken);
@@ -2905,16 +2948,16 @@ class WorkspaceMutationController {
2905
2948
  const applied = await this.applyEdit(edit, lease);
2906
2949
  return { edit, apply: applied.result };
2907
2950
  }
2908
- reconcileServerApply(record2, edit) {
2951
+ reconcileServerApply(record, edit) {
2909
2952
  if (!edit)
2910
- return { edit, apply: record2.result };
2953
+ return { edit, apply: record.result };
2911
2954
  const fingerprint = fingerprintWorkspaceEdit(edit, this.workspaceRoot);
2912
- if (fingerprint.success && record2.fingerprint !== null && fingerprint.fingerprint === record2.fingerprint) {
2913
- return { edit, apply: record2.result };
2955
+ if (fingerprint.success && record.fingerprint !== null && fingerprint.fingerprint === record.fingerprint) {
2956
+ return { edit, apply: record.result };
2914
2957
  }
2915
2958
  return {
2916
2959
  edit,
2917
- apply: failure("rename result conflicts with server-applied workspace edit", 0, record2.result)
2960
+ apply: failure("rename result conflicts with server-applied workspace edit", 0, record.result)
2918
2961
  };
2919
2962
  }
2920
2963
  async applyEdit(edit, lease) {
@@ -2955,14 +2998,12 @@ var DIAGNOSTICS_FRESHNESS_TIMEOUT_MS = 3000;
2955
2998
  var VERSIONLESS_PUBLISH_QUIESCENCE_MS = 250;
2956
2999
 
2957
3000
  class LspClient extends LspClientConnection {
2958
- diagnosticPullErrors = [];
2959
- documents;
2960
- workspaceMutations;
2961
- diagnosticsFreshnessTimeoutMs;
2962
- constructor(root, server2, options = {}) {
2963
- super(root, server2, options);
3001
+ constructor(root, server, options = {}) {
3002
+ super(root, server, options);
3003
+ this.diagnosticPullErrors = [];
2964
3004
  this.diagnosticsFreshnessTimeoutMs = options.diagnosticsFreshnessTimeoutMs ?? DIAGNOSTICS_FRESHNESS_TIMEOUT_MS;
2965
3005
  this.documents = new WorkspaceDocumentState((method, params) => this.sendNotification(method, params), (uri) => this.diagnosticsStore.delete(uri), {
3006
+ timerProvider: this.timerProvider,
2966
3007
  versionlessPublishQuiescenceMs: options.versionlessPublishQuiescenceMs ?? VERSIONLESS_PUBLISH_QUIESCENCE_MS
2967
3008
  });
2968
3009
  this.workspaceMutations = new WorkspaceMutationController(root, this.documents);
@@ -3015,6 +3056,18 @@ class LspClient extends LspClientConnection {
3015
3056
  textDocument: { uri: pathToFileURL3(absPath).href }
3016
3057
  }, options);
3017
3058
  }
3059
+ async formatDocument(filePath, options, signal) {
3060
+ if (!this.isDocumentFormattingSupported())
3061
+ return null;
3062
+ const absPath = this.resolveWorkspacePath(filePath);
3063
+ await this.openFile(absPath);
3064
+ const requestOptions = signal === undefined ? {} : { signal };
3065
+ const edits = await this.sendRequest("textDocument/formatting", {
3066
+ textDocument: { uri: pathToFileURL3(absPath).href },
3067
+ options
3068
+ }, requestOptions);
3069
+ return edits ?? [];
3070
+ }
3018
3071
  async workspaceSymbols(query, signal) {
3019
3072
  const options = signal === undefined ? {} : { signal };
3020
3073
  return this.sendRequest("workspace/symbol", { query }, options);
@@ -3054,7 +3107,7 @@ class LspClient extends LspClientConnection {
3054
3107
  const absPath = this.resolveWorkspacePath(filePath);
3055
3108
  const uri = pathToFileURL3(absPath).href;
3056
3109
  await this.openFile(absPath);
3057
- const deadlineAt = Date.now() + this.diagnosticsFreshnessTimeoutMs;
3110
+ const deadlineAt = this.timerProvider.now() + this.diagnosticsFreshnessTimeoutMs;
3058
3111
  for (;; ) {
3059
3112
  signal?.throwIfAborted();
3060
3113
  const snapshot = this.documents.captureDiagnosticSnapshot(absPath);
@@ -3067,13 +3120,13 @@ class LspClient extends LspClientConnection {
3067
3120
  if (!pushFallbackOnly) {
3068
3121
  const cached = this.documents.getPullCache(snapshot);
3069
3122
  try {
3070
- const remainingMs2 = deadlineAt - Date.now();
3071
- if (remainingMs2 <= 0)
3123
+ const remainingMs = deadlineAt - this.timerProvider.now();
3124
+ if (remainingMs <= 0)
3072
3125
  return this.freshnessTimeout(absPath);
3073
3126
  const result = await this.sendRequest("textDocument/diagnostic", {
3074
3127
  textDocument: { uri },
3075
3128
  ...cached?.resultId === undefined ? {} : { previousResultId: cached.resultId }
3076
- }, { timeoutMs: remainingMs2, ...signal === undefined ? {} : { signal } });
3129
+ }, { timeoutMs: remainingMs, ...signal === undefined ? {} : { signal } });
3077
3130
  if (!this.documents.isCurrentSnapshot(snapshot))
3078
3131
  continue;
3079
3132
  const report = this.parseDiagnosticPullReport(result);
@@ -3102,7 +3155,7 @@ class LspClient extends LspClientConnection {
3102
3155
  }
3103
3156
  if (!pushFallbackOnly)
3104
3157
  continue;
3105
- const remainingMs = deadlineAt - Date.now();
3158
+ const remainingMs = deadlineAt - this.timerProvider.now();
3106
3159
  if (remainingMs <= 0) {
3107
3160
  if (!this.isDiagnosticPullSupported() && snapshot.publishGeneration === 0) {
3108
3161
  const cached = this.documents.getPullCache(snapshot);
@@ -3154,7 +3207,7 @@ function waitForDiagnosticsActivity(wait, signal) {
3154
3207
  return wait;
3155
3208
  if (signal.aborted)
3156
3209
  return Promise.reject(abortError2(signal));
3157
- return new Promise((resolve7, reject) => {
3210
+ return new Promise((resolve, reject) => {
3158
3211
  const onAbort = () => {
3159
3212
  signal.removeEventListener("abort", onAbort);
3160
3213
  reject(abortError2(signal));
@@ -3162,7 +3215,7 @@ function waitForDiagnosticsActivity(wait, signal) {
3162
3215
  signal.addEventListener("abort", onAbort, { once: true });
3163
3216
  wait.then(() => {
3164
3217
  signal.removeEventListener("abort", onAbort);
3165
- resolve7();
3218
+ resolve();
3166
3219
  }, (error) => {
3167
3220
  signal.removeEventListener("abort", onAbort);
3168
3221
  reject(error);
@@ -3230,7 +3283,7 @@ async function stopClientBestEffort(client) {
3230
3283
  function awaitWithSignal(promise, signal) {
3231
3284
  if (!signal)
3232
3285
  return promise;
3233
- return new Promise((resolve7, reject) => {
3286
+ return new Promise((resolve, reject) => {
3234
3287
  let settled = false;
3235
3288
  const onAbort = () => {
3236
3289
  if (settled)
@@ -3248,7 +3301,7 @@ function awaitWithSignal(promise, signal) {
3248
3301
  return;
3249
3302
  settled = true;
3250
3303
  signal.removeEventListener("abort", onAbort);
3251
- resolve7(value);
3304
+ resolve(value);
3252
3305
  }, (err) => {
3253
3306
  if (settled)
3254
3307
  return;
@@ -3260,20 +3313,18 @@ function awaitWithSignal(promise, signal) {
3260
3313
  }
3261
3314
 
3262
3315
  class LspManager {
3263
- clients = new Map;
3264
- reaperHandle = null;
3265
- signalDisposer = null;
3266
- disposed = false;
3267
- idleTimeoutMs;
3268
- initTimeoutMs;
3269
- reaperIntervalMs;
3270
- clientFactory;
3271
- now;
3272
3316
  constructor(options = {}) {
3317
+ this.clients = new Map;
3318
+ this.pendingStops = new Map;
3319
+ this.respawnBudgets = new Map;
3320
+ this.reaperHandle = null;
3321
+ this.signalDisposer = null;
3322
+ this.disposed = false;
3273
3323
  this.idleTimeoutMs = options.idleTimeoutMs ?? IDLE_TIMEOUT_MS;
3274
3324
  this.initTimeoutMs = options.initTimeoutMs ?? INIT_TIMEOUT_MS;
3325
+ this.maxResidentClients = options.maxResidentClients ?? MAX_RESIDENT_CLIENTS;
3275
3326
  this.reaperIntervalMs = options.reaperIntervalMs ?? REAPER_INTERVAL_MS;
3276
- this.clientFactory = options.clientFactory ?? ((root, server2) => new LspClient(root, server2));
3327
+ this.clientFactory = options.clientFactory ?? ((root, server) => new LspClient(root, server));
3277
3328
  this.now = options.now ?? (() => Date.now());
3278
3329
  this.startReaper();
3279
3330
  this.signalDisposer = installProcessSignalCleanup(() => this.stopAll());
@@ -3291,38 +3342,103 @@ class LspManager {
3291
3342
  getKey(root, serverId) {
3292
3343
  return `${root}::${serverId}`;
3293
3344
  }
3345
+ tombstoneStop(key, client) {
3346
+ const stop = stopClientBestEffort(client);
3347
+ this.pendingStops.set(key, stop);
3348
+ stop.finally(() => {
3349
+ if (this.pendingStops.get(key) === stop) {
3350
+ this.pendingStops.delete(key);
3351
+ }
3352
+ });
3353
+ return stop;
3354
+ }
3355
+ recordDeadGeneration(key) {
3356
+ let budget = this.respawnBudgets.get(key);
3357
+ if (budget === undefined) {
3358
+ budget = { deadGenerations: 0, exhaustedAt: null };
3359
+ this.respawnBudgets.set(key, budget);
3360
+ }
3361
+ budget.deadGenerations += 1;
3362
+ }
3363
+ markHealthyGeneration(key) {
3364
+ this.respawnBudgets.delete(key);
3365
+ }
3366
+ ensureRespawnAllowed(key, root, serverId) {
3367
+ const budget = this.respawnBudgets.get(key);
3368
+ if (budget === undefined || budget.deadGenerations < CLIENT_RESPAWN_RETRY_LIMIT)
3369
+ return;
3370
+ if (budget.exhaustedAt === null) {
3371
+ budget.exhaustedAt = this.now();
3372
+ throw new LspClientRespawnBudgetExceededError(serverId, root, CLIENT_RESPAWN_RETRY_LIMIT);
3373
+ }
3374
+ if (this.now() - budget.exhaustedAt < CLIENT_RESPAWN_COOLDOWN_MS) {
3375
+ throw new LspClientRespawnBudgetExceededError(serverId, root, CLIENT_RESPAWN_RETRY_LIMIT);
3376
+ }
3377
+ budget.deadGenerations = 0;
3378
+ budget.exhaustedAt = null;
3379
+ }
3294
3380
  reapStale() {
3295
3381
  const t = this.now();
3296
3382
  for (const [key, managed] of this.clients) {
3297
3383
  if (managed.isInitializing && managed.initializingSince !== null && t - managed.initializingSince > this.initTimeoutMs) {
3298
- stopClientBestEffort(managed.client);
3299
3384
  this.clients.delete(key);
3385
+ this.tombstoneStop(key, managed.client);
3300
3386
  continue;
3301
3387
  }
3302
3388
  if (!managed.isInitializing && managed.refCount === 0 && managed.pendingWaiters === 0 && t - managed.lastUsedAt > this.idleTimeoutMs) {
3303
- stopClientBestEffort(managed.client);
3304
3389
  this.clients.delete(key);
3390
+ this.tombstoneStop(key, managed.client);
3391
+ }
3392
+ }
3393
+ }
3394
+ evictForAdmission() {
3395
+ while (this.clients.size >= this.maxResidentClients) {
3396
+ const victim = this.leastRecentlyUsedIdleClient();
3397
+ if (!victim)
3398
+ return;
3399
+ this.clients.delete(victim.key);
3400
+ this.tombstoneStop(victim.key, victim.managed.client);
3401
+ }
3402
+ }
3403
+ leastRecentlyUsedIdleClient() {
3404
+ let candidate = null;
3405
+ for (const [key, managed] of this.clients) {
3406
+ if (managed.refCount > 0 || managed.pendingWaiters > 0 || managed.isInitializing)
3407
+ continue;
3408
+ if (candidate === null || managed.lastUsedAt < candidate.managed.lastUsedAt) {
3409
+ candidate = { key, managed };
3305
3410
  }
3306
3411
  }
3412
+ return candidate;
3307
3413
  }
3308
3414
  async tryDeleteIfOrphaned(key, managed) {
3309
3415
  if (managed.refCount === 0 && managed.pendingWaiters === 0 && !managed.isInitializing && this.clients.get(key) === managed) {
3310
3416
  this.clients.delete(key);
3311
- await stopClientBestEffort(managed.client);
3417
+ await this.tombstoneStop(key, managed.client);
3312
3418
  }
3313
3419
  }
3314
- async getClient(root, server2, signal) {
3420
+ async getClient(root, server, signal) {
3315
3421
  if (this.disposed) {
3316
3422
  throw new Error("LspManager has been disposed");
3317
3423
  }
3318
3424
  signal?.throwIfAborted();
3319
- const key = this.getKey(root, server2.id);
3425
+ const key = this.getKey(root, server.id);
3426
+ for (;; ) {
3427
+ const pendingStop = this.pendingStops.get(key);
3428
+ if (pendingStop === undefined)
3429
+ break;
3430
+ await awaitWithSignal(pendingStop, signal);
3431
+ signal?.throwIfAborted();
3432
+ }
3433
+ if (this.disposed) {
3434
+ throw new Error("LspManager has been disposed");
3435
+ }
3320
3436
  let managed = this.clients.get(key);
3321
3437
  if (managed) {
3322
3438
  const t = this.now();
3323
3439
  if (managed.isInitializing && managed.initializingSince !== null && t - managed.initializingSince > this.initTimeoutMs) {
3324
- await stopClientBestEffort(managed.client);
3325
3440
  this.clients.delete(key);
3441
+ await this.tombstoneStop(key, managed.client);
3326
3442
  managed = undefined;
3327
3443
  }
3328
3444
  }
@@ -3343,15 +3459,21 @@ class LspManager {
3343
3459
  signal.throwIfAborted();
3344
3460
  }
3345
3461
  if (!managed.client.isAlive()) {
3346
- await stopClientBestEffort(managed.client);
3347
- this.clients.delete(key);
3348
- return this.getClient(root, server2, signal);
3462
+ this.recordDeadGeneration(key);
3463
+ if (this.clients.get(key) === managed) {
3464
+ this.clients.delete(key);
3465
+ }
3466
+ await this.tombstoneStop(key, managed.client);
3467
+ return this.getClient(root, server, signal);
3349
3468
  }
3469
+ this.markHealthyGeneration(key);
3350
3470
  managed.refCount++;
3351
3471
  managed.lastUsedAt = this.now();
3352
3472
  return managed.client;
3353
3473
  }
3354
- const client = this.clientFactory(root, server2);
3474
+ this.evictForAdmission();
3475
+ this.ensureRespawnAllowed(key, root, server.id);
3476
+ const client = this.clientFactory(root, server);
3355
3477
  const initStartedAt = this.now();
3356
3478
  const initPromise = (async () => {
3357
3479
  await client.start();
@@ -3374,7 +3496,7 @@ class LspManager {
3374
3496
  if (this.clients.get(key) === newManaged) {
3375
3497
  this.clients.delete(key);
3376
3498
  }
3377
- await stopClientBestEffort(client);
3499
+ await this.tombstoneStop(key, client);
3378
3500
  throw err;
3379
3501
  }
3380
3502
  newManaged.pendingWaiters--;
@@ -3385,6 +3507,15 @@ class LspManager {
3385
3507
  await this.tryDeleteIfOrphaned(key, newManaged);
3386
3508
  signal.throwIfAborted();
3387
3509
  }
3510
+ if (!client.isAlive()) {
3511
+ this.recordDeadGeneration(key);
3512
+ if (this.clients.get(key) === newManaged) {
3513
+ this.clients.delete(key);
3514
+ }
3515
+ await this.tombstoneStop(key, client);
3516
+ return this.getClient(root, server, signal);
3517
+ }
3518
+ this.markHealthyGeneration(key);
3388
3519
  newManaged.refCount++;
3389
3520
  newManaged.lastUsedAt = this.now();
3390
3521
  return client;
@@ -3405,15 +3536,21 @@ class LspManager {
3405
3536
  if (client && managed.client !== client)
3406
3537
  return;
3407
3538
  this.clients.delete(key);
3408
- stopClientBestEffort(managed.client);
3539
+ this.tombstoneStop(key, managed.client);
3409
3540
  }
3410
- warmupClient(root, server2) {
3541
+ warmupClient(root, server) {
3411
3542
  if (this.disposed)
3412
3543
  return;
3413
- const key = this.getKey(root, server2.id);
3414
- if (this.clients.has(key))
3544
+ const key = this.getKey(root, server.id);
3545
+ if (this.clients.has(key) || this.pendingStops.has(key))
3546
+ return;
3547
+ this.evictForAdmission();
3548
+ try {
3549
+ this.ensureRespawnAllowed(key, root, server.id);
3550
+ } catch {
3415
3551
  return;
3416
- const client = this.clientFactory(root, server2);
3552
+ }
3553
+ const client = this.clientFactory(root, server);
3417
3554
  const initStartedAt = this.now();
3418
3555
  const initPromise = (async () => {
3419
3556
  await client.start();
@@ -3438,7 +3575,7 @@ class LspManager {
3438
3575
  if (this.clients.get(key) === managed) {
3439
3576
  this.clients.delete(key);
3440
3577
  }
3441
- stopClientBestEffort(client);
3578
+ this.tombstoneStop(key, client);
3442
3579
  });
3443
3580
  }
3444
3581
  isServerInitializing(root, serverId) {
@@ -3482,8 +3619,11 @@ class LspManager {
3482
3619
  for (const managed of this.clients.values()) {
3483
3620
  stopPromises.push(stopClientBestEffort(managed.client));
3484
3621
  }
3622
+ const tombstonedStops = [...this.pendingStops.values()];
3485
3623
  this.clients.clear();
3486
- await Promise.allSettled(stopPromises);
3624
+ this.respawnBudgets.clear();
3625
+ await Promise.allSettled([...stopPromises, ...tombstonedStops]);
3626
+ this.pendingStops.clear();
3487
3627
  }
3488
3628
  }
3489
3629
  var _defaultInstance = null;
@@ -3501,57 +3641,52 @@ async function disposeDefaultLspManager() {
3501
3641
  }
3502
3642
  }
3503
3643
 
3504
- // ../lsp-core/src/lsp/server-install-state.ts
3505
- import { existsSync as existsSync6, mkdirSync, readFileSync as readFileSync3, renameSync as renameSync2, writeFileSync as writeFileSync2 } from "node:fs";
3506
- import { dirname as dirname5 } from "node:path";
3507
- function getInstallDecisionsPath() {
3508
- return lspRequestContext().installDecisionsPath;
3509
- }
3510
- function loadInstallDecisions() {
3511
- const path = getInstallDecisionsPath();
3512
- if (!existsSync6(path))
3513
- return {};
3514
- try {
3515
- const parsed = JSON.parse(readFileSync3(path, "utf8"));
3516
- return isInstallDecisions(parsed) ? parsed : {};
3517
- } catch {
3518
- return {};
3644
+ // ../lsp-core/src/lsp/outside-context-workspace.ts
3645
+ import { existsSync as existsSync6, realpathSync as realpathSync4 } from "node:fs";
3646
+ import { dirname as dirname5, join as join3 } from "node:path";
3647
+
3648
+ // ../lsp-core/src/lsp/workspace-markers.ts
3649
+ var GIT_WORKSPACE_MARKER = ".git";
3650
+ var PROJECT_WORKSPACE_MARKERS = [
3651
+ "package.json",
3652
+ "pyproject.toml",
3653
+ "Cargo.toml",
3654
+ "go.mod",
3655
+ "pom.xml",
3656
+ "build.gradle"
3657
+ ];
3658
+ var WORKSPACE_MARKERS = [GIT_WORKSPACE_MARKER, ...PROJECT_WORKSPACE_MARKERS];
3659
+
3660
+ // ../lsp-core/src/lsp/outside-context-workspace.ts
3661
+ function findWorkspaceRootOutsideContext(directory) {
3662
+ const marked = nearestMarkedAncestor(directory);
3663
+ if (marked !== undefined)
3664
+ return marked;
3665
+ return realpathSync4(nearestExistingAncestor(directory));
3666
+ }
3667
+ function nearestMarkedAncestor(directory) {
3668
+ let current = directory;
3669
+ for (;; ) {
3670
+ if (existsSync6(current) && WORKSPACE_MARKERS.some((marker) => existsSync6(join3(current, marker)))) {
3671
+ return realpathSync4(current);
3672
+ }
3673
+ const parent = dirname5(current);
3674
+ if (parent === current)
3675
+ return;
3676
+ current = parent;
3519
3677
  }
3520
3678
  }
3521
- function loadInstallDecision(serverId) {
3522
- return loadInstallDecisions()[serverId];
3523
- }
3524
- function recordInstallDecision(serverId, decision, decidedAt = new Date().toISOString()) {
3525
- const decisions = loadInstallDecisions();
3526
- decisions[serverId] = { decision, decidedAt };
3527
- writeInstallDecisions(decisions);
3528
- }
3529
- function isInstallDecision(value) {
3530
- return value === "declined" || value === "allowed";
3531
- }
3532
- function writeInstallDecisions(decisions) {
3533
- const path = getInstallDecisionsPath();
3534
- mkdirSync(dirname5(path), { recursive: true });
3535
- const tmpPath = `${path}.tmp`;
3536
- writeFileSync2(tmpPath, `${JSON.stringify(decisions, null, 2)}
3537
- `, "utf8");
3538
- renameSync2(tmpPath, path);
3539
- }
3540
- function isInstallDecisions(value) {
3541
- return isRecord5(value) && Object.values(value).every(isInstallDecisionRecord);
3542
- }
3543
- function isInstallDecisionRecord(value) {
3544
- if (!isRecord5(value))
3545
- return false;
3546
- return isInstallDecision(value["decision"]) && typeof value["decidedAt"] === "string";
3547
- }
3548
- function isRecord5(value) {
3549
- return typeof value === "object" && value !== null && !Array.isArray(value);
3679
+ function nearestExistingAncestor(directory) {
3680
+ let current = directory;
3681
+ while (!existsSync6(current)) {
3682
+ const parent = dirname5(current);
3683
+ if (parent === current)
3684
+ return current;
3685
+ current = parent;
3686
+ }
3687
+ return current;
3550
3688
  }
3551
3689
 
3552
- // ../lsp-core/src/lsp/config-loader.ts
3553
- import { existsSync as existsSync7, readFileSync as readFileSync4 } from "node:fs";
3554
-
3555
3690
  // ../lsp-core/src/lsp/server-definitions.ts
3556
3691
  var LSP_INSTALL_HINTS = {
3557
3692
  typescript: "npm install -g typescript-language-server typescript",
@@ -3597,6 +3732,26 @@ var LSP_INSTALL_HINTS = {
3597
3732
  julials: `julia -e 'using Pkg; Pkg.add("LanguageServer")'`,
3598
3733
  razor: "Razor runs through the Roslyn language server (cohosting). " + "Install: dotnet tool install -g roslyn-language-server --prerelease (requires v5.8.0+). See https://github.com/dotnet/razor"
3599
3734
  };
3735
+ var LSP_LOCAL_INSTALL_HINTS = {
3736
+ typescript: "bun add -d typescript-language-server typescript",
3737
+ vue: "bun add -d @vue/language-server",
3738
+ eslint: "bun add -d vscode-langservers-extracted",
3739
+ oxlint: "bun add -d oxlint",
3740
+ biome: "bun add -d @biomejs/biome",
3741
+ svelte: "bun add -d svelte-language-server",
3742
+ astro: "bun add -d @astrojs/language-server",
3743
+ bash: "bun add -d bash-language-server",
3744
+ "bash-ls": "bun add -d bash-language-server",
3745
+ "yaml-ls": "bun add -d yaml-language-server",
3746
+ php: "bun add -d intelephense",
3747
+ prisma: "bun add -d prisma",
3748
+ dockerfile: "bun add -d dockerfile-language-server-nodejs",
3749
+ pyright: "uv add --dev pyright",
3750
+ basedpyright: "uv add --dev basedpyright",
3751
+ ruff: "uv add --dev ruff",
3752
+ ty: "uv add --dev ty",
3753
+ "ruby-lsp": "bundle add ruby-lsp --group development"
3754
+ };
3600
3755
  var BUILTIN_SERVERS = {
3601
3756
  typescript: {
3602
3757
  command: ["typescript-language-server", "--stdio"],
@@ -3699,7 +3854,56 @@ var BUILTIN_SERVERS = {
3699
3854
  }
3700
3855
  };
3701
3856
 
3857
+ // ../lsp-core/src/lsp/server-install-state.ts
3858
+ import { existsSync as existsSync7, mkdirSync, readFileSync as readFileSync3, renameSync as renameSync2, writeFileSync as writeFileSync2 } from "node:fs";
3859
+ import { dirname as dirname6 } from "node:path";
3860
+ function getInstallDecisionsPath() {
3861
+ return lspRequestContext().installDecisionsPath;
3862
+ }
3863
+ function loadInstallDecisions() {
3864
+ const path = getInstallDecisionsPath();
3865
+ if (!existsSync7(path))
3866
+ return {};
3867
+ try {
3868
+ const parsed = JSON.parse(readFileSync3(path, "utf8"));
3869
+ return isInstallDecisions(parsed) ? parsed : {};
3870
+ } catch {
3871
+ return {};
3872
+ }
3873
+ }
3874
+ function loadInstallDecision(serverId) {
3875
+ return loadInstallDecisions()[serverId];
3876
+ }
3877
+ function recordInstallDecision(serverId, decision, decidedAt = new Date().toISOString()) {
3878
+ const decisions = loadInstallDecisions();
3879
+ decisions[serverId] = { decision, decidedAt };
3880
+ writeInstallDecisions(decisions);
3881
+ }
3882
+ function isInstallDecision(value) {
3883
+ return value === "declined" || value === "allowed";
3884
+ }
3885
+ function writeInstallDecisions(decisions) {
3886
+ const path = getInstallDecisionsPath();
3887
+ mkdirSync(dirname6(path), { recursive: true });
3888
+ const tmpPath = `${path}.tmp`;
3889
+ writeFileSync2(tmpPath, `${JSON.stringify(decisions, null, 2)}
3890
+ `, "utf8");
3891
+ renameSync2(tmpPath, path);
3892
+ }
3893
+ function isInstallDecisions(value) {
3894
+ return isRecord5(value) && Object.values(value).every(isInstallDecisionRecord);
3895
+ }
3896
+ function isInstallDecisionRecord(value) {
3897
+ if (!isRecord5(value))
3898
+ return false;
3899
+ return isInstallDecision(value["decision"]) && typeof value["decidedAt"] === "string";
3900
+ }
3901
+ function isRecord5(value) {
3902
+ return typeof value === "object" && value !== null && !Array.isArray(value);
3903
+ }
3904
+
3702
3905
  // ../lsp-core/src/lsp/config-loader.ts
3906
+ import { existsSync as existsSync8, readFileSync as readFileSync4 } from "node:fs";
3703
3907
  function getProjectConfigPaths() {
3704
3908
  return lspRequestContext().projectConfigPaths;
3705
3909
  }
@@ -3707,7 +3911,7 @@ function getUserConfigPath() {
3707
3911
  return lspRequestContext().userConfigPath;
3708
3912
  }
3709
3913
  function loadJsonFile(path) {
3710
- if (!existsSync7(path))
3914
+ if (!existsSync8(path))
3711
3915
  return null;
3712
3916
  try {
3713
3917
  const parsed = JSON.parse(readFileSync4(path, "utf-8"));
@@ -3754,10 +3958,10 @@ function getMergedServers() {
3754
3958
  }
3755
3959
  if (seen.has(id))
3756
3960
  continue;
3757
- const server2 = createServerFromEntry(id, entry, source);
3758
- if (!server2)
3961
+ const server = createServerFromEntry(id, entry, source);
3962
+ if (!server)
3759
3963
  continue;
3760
- servers.push(server2);
3964
+ servers.push(server);
3761
3965
  seen.add(id);
3762
3966
  }
3763
3967
  }
@@ -3789,7 +3993,7 @@ function createServerFromEntry(id, entry, source) {
3789
3993
  if (source === "project") {
3790
3994
  if (!builtin)
3791
3995
  return null;
3792
- const server3 = createServer({
3996
+ const server = createServer({
3793
3997
  id,
3794
3998
  command: builtin.command,
3795
3999
  extensions: entry.extensions ?? builtin.extensions,
@@ -3797,35 +4001,35 @@ function createServerFromEntry(id, entry, source) {
3797
4001
  source
3798
4002
  });
3799
4003
  if (entry.initialization !== undefined) {
3800
- server3.initialization = entry.initialization;
4004
+ server.initialization = entry.initialization;
3801
4005
  }
3802
- return server3;
4006
+ return server;
3803
4007
  }
3804
4008
  if (entry.command && entry.extensions) {
3805
- const server3 = createServer({
4009
+ const server = createServer({
3806
4010
  id,
3807
4011
  command: entry.command,
3808
4012
  extensions: entry.extensions,
3809
4013
  priority: entry.priority ?? 0,
3810
4014
  source
3811
4015
  });
3812
- applyOptionalServerFields(server3, entry);
3813
- return server3;
4016
+ applyOptionalServerFields(server, entry);
4017
+ return server;
3814
4018
  }
3815
4019
  if (!builtin)
3816
4020
  return null;
3817
- const server2 = createServer({
4021
+ const server = createServer({
3818
4022
  id,
3819
4023
  command: entry.command ?? builtin.command,
3820
4024
  extensions: entry.extensions ?? builtin.extensions,
3821
4025
  priority: entry.priority ?? 0,
3822
4026
  source
3823
4027
  });
3824
- applyOptionalServerFields(server2, entry);
3825
- return server2;
4028
+ applyOptionalServerFields(server, entry);
4029
+ return server;
3826
4030
  }
3827
4031
  function createServer(input) {
3828
- const server2 = {
4032
+ const server = {
3829
4033
  id: input.id,
3830
4034
  command: input.command,
3831
4035
  extensions: input.extensions,
@@ -3833,19 +4037,19 @@ function createServer(input) {
3833
4037
  source: input.source
3834
4038
  };
3835
4039
  if (input.env !== undefined) {
3836
- server2.env = input.env;
4040
+ server.env = input.env;
3837
4041
  }
3838
4042
  if (input.initialization !== undefined) {
3839
- server2.initialization = input.initialization;
4043
+ server.initialization = input.initialization;
3840
4044
  }
3841
- return server2;
4045
+ return server;
3842
4046
  }
3843
- function applyOptionalServerFields(server2, entry) {
4047
+ function applyOptionalServerFields(server, entry) {
3844
4048
  if (entry.env !== undefined) {
3845
- server2.env = entry.env;
4049
+ server.env = entry.env;
3846
4050
  }
3847
4051
  if (entry.initialization !== undefined) {
3848
- server2.initialization = entry.initialization;
4052
+ server.initialization = entry.initialization;
3849
4053
  }
3850
4054
  }
3851
4055
  function isConfigJson(value) {
@@ -3895,64 +4099,165 @@ function getDisabledServerIds() {
3895
4099
  }
3896
4100
 
3897
4101
  // ../lsp-core/src/lsp/server-installation.ts
3898
- import { existsSync as existsSync8 } from "node:fs";
3899
- import { delimiter as delimiter3, join as join3 } from "node:path";
3900
- function isServerInstalled(command, _workingDirectory) {
3901
- if (command.length === 0)
3902
- return false;
3903
- const [cmd] = command;
3904
- if (!cmd)
3905
- return false;
3906
- if (cmd.includes("/") || cmd.includes("\\")) {
3907
- if (existsSync8(cmd))
3908
- return true;
4102
+ import { existsSync as existsSync9 } from "node:fs";
4103
+ import { delimiter as delimiter3, dirname as dirname7, isAbsolute as isAbsolute3, join as join4, resolve as resolve7 } from "node:path";
4104
+ var LOCAL_BIN_RULES = [
4105
+ {
4106
+ markers: ["package.json", "bun.lock", "bun.lockb", "package-lock.json", "yarn.lock", "pnpm-lock.yaml"],
4107
+ binDirs: [join4("node_modules", ".bin")]
4108
+ },
4109
+ {
4110
+ markers: [
4111
+ "pyproject.toml",
4112
+ "ty.toml",
4113
+ "requirements.txt",
4114
+ "setup.py",
4115
+ "setup.cfg",
4116
+ "Pipfile",
4117
+ "pyrightconfig.json",
4118
+ "ruff.toml",
4119
+ ".ruff.toml"
4120
+ ],
4121
+ binDirs: [
4122
+ join4(".venv", "bin"),
4123
+ join4(".venv", "Scripts"),
4124
+ join4("venv", "bin"),
4125
+ join4("venv", "Scripts"),
4126
+ join4(".env", "bin"),
4127
+ join4(".env", "Scripts")
4128
+ ]
4129
+ },
4130
+ {
4131
+ markers: ["Gemfile", "Gemfile.lock"],
4132
+ binDirs: [join4("vendor", "bundle", "bin"), "bin"]
4133
+ },
4134
+ {
4135
+ markers: ["go.mod", "go.sum", "go.work"],
4136
+ binDirs: ["bin"]
4137
+ }
4138
+ ];
4139
+ var resolutionCache = new Map;
4140
+ var probeCount = 0;
4141
+ function probe(path) {
4142
+ probeCount += 1;
4143
+ return existsSync9(path);
4144
+ }
4145
+ function executableSuffixes(platform, pathExt) {
4146
+ if (platform !== "win32")
4147
+ return [""];
4148
+ const configured = pathExt ?? process.env["PATHEXT"] ?? "";
4149
+ const systemExts = configured.split(";").filter((entry) => entry.length > 0).map((entry) => entry.toLowerCase());
4150
+ return [...new Set(["", ...systemExts, ".exe", ".cmd", ".bat", ".ps1"])];
4151
+ }
4152
+ function probeWithSuffixes(directory, command, suffixes) {
4153
+ for (const suffix of suffixes) {
4154
+ const candidate = join4(directory, command + suffix);
4155
+ if (probe(candidate))
4156
+ return candidate;
3909
4157
  }
3910
- const isWindows = process.platform === "win32";
3911
- let exts = [""];
3912
- if (isWindows) {
3913
- const pathExt = process.env["PATHEXT"] ?? "";
3914
- if (pathExt) {
3915
- const systemExts = pathExt.split(";").filter(Boolean);
3916
- exts = [...new Set([...exts, ...systemExts, ".exe", ".cmd", ".bat", ".ps1"])];
3917
- } else {
3918
- exts = ["", ".exe", ".cmd", ".bat", ".ps1"];
4158
+ return null;
4159
+ }
4160
+ function resolveLocal(command, workingDirectory, suffixes, stopAt) {
4161
+ const boundary = stopAt === undefined ? undefined : resolve7(stopAt);
4162
+ let current = resolve7(workingDirectory);
4163
+ while (true) {
4164
+ for (const rule of LOCAL_BIN_RULES) {
4165
+ if (!rule.markers.some((marker) => probe(join4(current, marker))))
4166
+ continue;
4167
+ for (const binDir of rule.binDirs) {
4168
+ const found = probeWithSuffixes(join4(current, binDir), command, suffixes);
4169
+ if (found !== null)
4170
+ return found;
4171
+ }
3919
4172
  }
4173
+ if (probe(join4(current, ".git")))
4174
+ return null;
4175
+ if (boundary !== undefined && current === boundary)
4176
+ return null;
4177
+ const parent = dirname7(current);
4178
+ if (parent === current)
4179
+ return null;
4180
+ current = parent;
3920
4181
  }
3921
- let pathEnv = process.env["PATH"] ?? "";
3922
- if (isWindows && !pathEnv) {
4182
+ }
4183
+ function resolveFromPath(command, suffixes, platform, pathEnvOverride) {
4184
+ let pathEnv = pathEnvOverride ?? process.env["PATH"] ?? "";
4185
+ if (platform === "win32" && !pathEnv) {
3923
4186
  pathEnv = process.env["Path"] ?? "";
3924
4187
  }
3925
- const paths = pathEnv.split(delimiter3);
3926
- for (const p of paths) {
3927
- for (const suffix of exts) {
3928
- if (existsSync8(join3(p, cmd + suffix))) {
3929
- return true;
3930
- }
3931
- }
4188
+ for (const entry of pathEnv.split(delimiter3)) {
4189
+ if (entry.length === 0)
4190
+ continue;
4191
+ const found = probeWithSuffixes(entry, command, suffixes);
4192
+ if (found !== null)
4193
+ return found;
3932
4194
  }
3933
- if (cmd === "node")
3934
- return true;
3935
- return false;
4195
+ return null;
4196
+ }
4197
+ function resolveServerBinary(command, workingDirectory, options = {}) {
4198
+ if (command.length === 0)
4199
+ return null;
4200
+ const [cmd] = command;
4201
+ if (cmd === undefined || cmd.length === 0)
4202
+ return null;
4203
+ const platform = options.platform ?? process.platform;
4204
+ const suffixes = executableSuffixes(platform, options.pathExt);
4205
+ if (cmd.includes("/") || cmd.includes("\\")) {
4206
+ const explicit = isAbsolute3(cmd) ? cmd : resolve7(workingDirectory ?? process.cwd(), cmd);
4207
+ return probe(explicit) ? explicit : null;
4208
+ }
4209
+ const cacheKey = JSON.stringify([
4210
+ workingDirectory ?? "",
4211
+ cmd,
4212
+ platform,
4213
+ options.stopAt ?? "",
4214
+ options.pathExt ?? "",
4215
+ options.pathEnv ?? process.env["PATH"] ?? ""
4216
+ ]);
4217
+ const cached = resolutionCache.get(cacheKey);
4218
+ if (cached !== undefined)
4219
+ return cached;
4220
+ let resolved = null;
4221
+ if (workingDirectory !== undefined && workingDirectory.length > 0) {
4222
+ resolved = resolveLocal(cmd, workingDirectory, suffixes, options.stopAt);
4223
+ }
4224
+ resolved ??= resolveFromPath(cmd, suffixes, platform, options.pathEnv);
4225
+ if (resolved === null && cmd === "node")
4226
+ resolved = cmd;
4227
+ resolutionCache.set(cacheKey, resolved);
4228
+ return resolved;
4229
+ }
4230
+ function isServerInstalled(command, workingDirectory, options = {}) {
4231
+ if (command.length === 0)
4232
+ return false;
4233
+ return resolveServerBinary(command, workingDirectory, options) !== null;
3936
4234
  }
3937
4235
 
3938
4236
  // ../lsp-core/src/lsp/server-resolution.ts
4237
+ function withResolvedCommand(command, binaryPath) {
4238
+ return [binaryPath, ...command.slice(1)];
4239
+ }
3939
4240
  function findServerForExtension(ext) {
3940
4241
  const servers = getMergedServers();
3941
- for (const server2 of servers) {
3942
- if (server2.extensions.includes(ext) && isServerInstalled(server2.command)) {
4242
+ const workingDirectory = contextCwd();
4243
+ for (const server of servers) {
4244
+ if (!server.extensions.includes(ext))
4245
+ continue;
4246
+ const binaryPath = resolveServerBinary(server.command, workingDirectory);
4247
+ if (binaryPath !== null) {
3943
4248
  const resolvedServer = {
3944
- id: server2.id,
3945
- command: server2.command,
3946
- extensions: server2.extensions,
3947
- priority: server2.priority
4249
+ id: server.id,
4250
+ command: withResolvedCommand(server.command, binaryPath),
4251
+ extensions: server.extensions,
4252
+ priority: server.priority
3948
4253
  };
3949
- if (server2.env !== undefined) {
4254
+ if (server.env !== undefined) {
3950
4255
  return {
3951
4256
  status: "found",
3952
4257
  server: {
3953
4258
  ...resolvedServer,
3954
- env: server2.env,
3955
- ...server2.initialization === undefined ? {} : { initialization: server2.initialization }
4259
+ env: server.env,
4260
+ ...server.initialization === undefined ? {} : { initialization: server.initialization }
3956
4261
  }
3957
4262
  };
3958
4263
  }
@@ -3960,20 +4265,20 @@ function findServerForExtension(ext) {
3960
4265
  status: "found",
3961
4266
  server: {
3962
4267
  ...resolvedServer,
3963
- ...server2.initialization === undefined ? {} : { initialization: server2.initialization }
4268
+ ...server.initialization === undefined ? {} : { initialization: server.initialization }
3964
4269
  }
3965
4270
  };
3966
4271
  }
3967
4272
  }
3968
- for (const server2 of servers) {
3969
- if (server2.extensions.includes(ext)) {
3970
- const installHint = LSP_INSTALL_HINTS[server2.id] ?? `Install '${server2.command[0]}' and ensure it's in your PATH`;
4273
+ for (const server of servers) {
4274
+ if (server.extensions.includes(ext)) {
4275
+ const installHint = LSP_INSTALL_HINTS[server.id] ?? `Install '${server.command[0]}' and ensure it's in your PATH`;
3971
4276
  return {
3972
4277
  status: "not_installed",
3973
4278
  server: {
3974
- id: server2.id,
3975
- command: server2.command,
3976
- extensions: server2.extensions
4279
+ id: server.id,
4280
+ command: server.command,
4281
+ extensions: server.extensions
3977
4282
  },
3978
4283
  installHint
3979
4284
  };
@@ -3989,20 +4294,21 @@ function findServerForExtension(ext) {
3989
4294
  function getAllServers() {
3990
4295
  const servers = getMergedServers();
3991
4296
  const disabled = getDisabledServerIds();
4297
+ const workingDirectory = contextCwd();
3992
4298
  const result = [];
3993
4299
  const seen = new Set;
3994
- for (const server2 of servers) {
3995
- if (seen.has(server2.id))
4300
+ for (const server of servers) {
4301
+ if (seen.has(server.id))
3996
4302
  continue;
3997
4303
  result.push({
3998
- id: server2.id,
3999
- installed: isServerInstalled(server2.command),
4000
- extensions: server2.extensions,
4304
+ id: server.id,
4305
+ installed: isServerInstalled(server.command, workingDirectory),
4306
+ extensions: server.extensions,
4001
4307
  disabled: false,
4002
- source: server2.source,
4003
- priority: server2.priority
4308
+ source: server.source,
4309
+ priority: server.priority
4004
4310
  });
4005
- seen.add(server2.id);
4311
+ seen.add(server.id);
4006
4312
  }
4007
4313
  for (const id of disabled) {
4008
4314
  if (seen.has(id))
@@ -4010,7 +4316,7 @@ function getAllServers() {
4010
4316
  const builtin = BUILTIN_SERVERS[id];
4011
4317
  result.push({
4012
4318
  id,
4013
- installed: builtin ? isServerInstalled(builtin.command) : false,
4319
+ installed: builtin ? isServerInstalled(builtin.command, workingDirectory) : false,
4014
4320
  extensions: builtin?.extensions ?? [],
4015
4321
  disabled: true,
4016
4322
  source: "disabled",
@@ -4021,7 +4327,6 @@ function getAllServers() {
4021
4327
  }
4022
4328
 
4023
4329
  // ../lsp-core/src/lsp/client-wrapper.ts
4024
- var WORKSPACE_MARKERS = [".git", "package.json", "pyproject.toml", "Cargo.toml", "go.mod", "pom.xml", "build.gradle"];
4025
4330
  function isDirectoryPath(filePath) {
4026
4331
  try {
4027
4332
  return statSync3(filePath).isDirectory();
@@ -4034,36 +4339,40 @@ function findWorkspaceRoot(filePath) {
4034
4339
  const abs = resolveReadablePathInsideContext(filePath);
4035
4340
  let dir = abs;
4036
4341
  if (!isDirectoryPath(dir)) {
4037
- dir = dirname6(dir);
4342
+ dir = dirname8(dir);
4038
4343
  }
4344
+ if (!isPathInside(cwd, abs))
4345
+ return findWorkspaceRootOutsideContext(dir);
4039
4346
  const fallbackRoot = nearestExistingDirectoryInsideContext(dir, cwd) ?? cwd;
4347
+ let nearestPackageRoot;
4040
4348
  while (isPathInside(cwd, dir)) {
4041
4349
  const canonicalDir = existingDirectoryInsideContext(dir, cwd);
4042
4350
  if (canonicalDir !== undefined) {
4043
- for (const marker of WORKSPACE_MARKERS) {
4044
- if (existsSync9(join4(dir, marker))) {
4045
- return canonicalDir;
4046
- }
4351
+ if (existsSync10(join5(dir, GIT_WORKSPACE_MARKER))) {
4352
+ return canonicalDir;
4353
+ }
4354
+ if (nearestPackageRoot === undefined && hasProjectWorkspaceMarker(dir)) {
4355
+ nearestPackageRoot = canonicalDir;
4047
4356
  }
4048
4357
  }
4049
4358
  if (dir === cwd)
4050
4359
  break;
4051
- dir = dirname6(dir);
4360
+ dir = dirname8(dir);
4052
4361
  }
4053
- return fallbackRoot;
4362
+ return nearestPackageRoot ?? fallbackRoot;
4363
+ }
4364
+ function hasProjectWorkspaceMarker(directory) {
4365
+ return PROJECT_WORKSPACE_MARKERS.some((marker) => existsSync10(join5(directory, marker)));
4054
4366
  }
4055
4367
  function resolveReadablePathInsideContext(filePath) {
4056
4368
  const cwd = contextCwd();
4057
- const abs = resolve7(cwd, filePath);
4369
+ const abs = resolve8(cwd, filePath);
4058
4370
  if (isPathInside(cwd, abs))
4059
4371
  return abs;
4060
4372
  const rebased = rebaseThroughCanonicalAncestor(abs, cwd);
4061
4373
  if (rebased !== undefined)
4062
4374
  return rebased;
4063
- const canonical = canonicalizeExistingOrNearestAncestor(abs);
4064
- if (isPathInside(cwd, canonical))
4065
- return canonical;
4066
- throw new LspInvalidPathError(`LSP file path must be inside request cwd: ${filePath}`);
4375
+ return canonicalizeExistingOrNearestAncestor(abs);
4067
4376
  }
4068
4377
  function resolvePathInsideContext(filePath) {
4069
4378
  const cwd = contextCwd();
@@ -4078,12 +4387,12 @@ function rebaseThroughCanonicalAncestor(path, cwd) {
4078
4387
  let current = path;
4079
4388
  const suffix = [];
4080
4389
  while (true) {
4081
- if (existsSync9(current)) {
4082
- const canonical = realpathSync4(current);
4390
+ if (existsSync10(current)) {
4391
+ const canonical = realpathSync5(current);
4083
4392
  if (isPathInside(cwd, canonical))
4084
- return suffix.length === 0 ? canonical : join4(canonical, ...suffix);
4393
+ return suffix.length === 0 ? canonical : join5(canonical, ...suffix);
4085
4394
  }
4086
- const parent = dirname6(current);
4395
+ const parent = dirname8(current);
4087
4396
  if (parent === current)
4088
4397
  return;
4089
4398
  suffix.unshift(basename3(current));
@@ -4091,9 +4400,9 @@ function rebaseThroughCanonicalAncestor(path, cwd) {
4091
4400
  }
4092
4401
  }
4093
4402
  function existingDirectoryInsideContext(directory, cwd) {
4094
- if (!existsSync9(directory))
4403
+ if (!existsSync10(directory))
4095
4404
  return;
4096
- const canonical = realpathSync4(directory);
4405
+ const canonical = realpathSync5(directory);
4097
4406
  if (!statSync3(canonical).isDirectory())
4098
4407
  return;
4099
4408
  return isPathInside(cwd, canonical) ? canonical : undefined;
@@ -4106,7 +4415,7 @@ function nearestExistingDirectoryInsideContext(directory, cwd) {
4106
4415
  return canonical;
4107
4416
  if (current === cwd)
4108
4417
  return;
4109
- current = dirname6(current);
4418
+ current = dirname8(current);
4110
4419
  }
4111
4420
  return;
4112
4421
  }
@@ -4133,33 +4442,46 @@ function formatServerLookupError(result) {
4133
4442
  ].join(`
4134
4443
  `);
4135
4444
  }
4445
+ function formatInstallOptions(serverId, installHint) {
4446
+ const localHint = LSP_LOCAL_INSTALL_HINTS[serverId];
4447
+ if (localHint === undefined) {
4448
+ return ["To install, run:", ` ${installHint}`];
4449
+ }
4450
+ return [
4451
+ "To install in THIS repository (preferred — no global install needed):",
4452
+ ` ${localHint}`,
4453
+ "",
4454
+ "Or install it globally:",
4455
+ ` ${installHint}`
4456
+ ];
4457
+ }
4136
4458
  function formatNotInstalled(result) {
4137
- const { server: server2, installHint } = result;
4138
- const extensions = server2.extensions.join(", ");
4139
- const decision = loadInstallDecision(server2.id)?.decision;
4459
+ const { server, installHint } = result;
4460
+ const extensions = server.extensions.join(", ");
4461
+ const decision = loadInstallDecision(server.id)?.decision;
4140
4462
  const context = lspRequestContext();
4141
4463
  if (decision === "declined") {
4142
- return `LSP server '${server2.id}' (${extensions}) is NOT INSTALLED; user previously declined installation — proceed without LSP.`;
4464
+ return `LSP server '${server.id}' (${extensions}) is NOT INSTALLED; user previously declined installation — proceed without LSP.`;
4143
4465
  }
4144
4466
  const header = [
4145
- `LSP server '${server2.id}' for ${extensions} is NOT INSTALLED.`,
4467
+ `LSP server '${server.id}' for ${extensions} is NOT INSTALLED.`,
4146
4468
  "",
4147
- `Command not found: ${server2.command[0]}`,
4469
+ `Command not found: ${server.command[0]}`,
4148
4470
  ""
4149
4471
  ];
4472
+ const installOptions = formatInstallOptions(server.id, installHint);
4150
4473
  if (decision === "allowed") {
4151
4474
  return [
4152
4475
  ...header,
4153
4476
  "The user has pre-authorized LSP installation. Run the install command, then retry this tool:",
4154
- ` ${installHint}`
4477
+ ...installOptions.slice(1)
4155
4478
  ].join(`
4156
4479
  `);
4157
4480
  }
4158
4481
  if (!context.capabilities.installDecisionTool) {
4159
4482
  return [
4160
4483
  ...header,
4161
- "To install, run:",
4162
- ` ${installHint}`,
4484
+ ...installOptions,
4163
4485
  "",
4164
4486
  "ACTION REQUIRED — ASK THE USER whether to install this LSP server.",
4165
4487
  "Install-decision recording is unavailable in this harness; proceed without LSP if the user declines."
@@ -4168,13 +4490,12 @@ function formatNotInstalled(result) {
4168
4490
  }
4169
4491
  return [
4170
4492
  ...header,
4171
- "To install, run:",
4172
- ` ${installHint}`,
4493
+ ...installOptions,
4173
4494
  "",
4174
4495
  "ACTION REQUIRED — ASK THE USER whether to install this LSP server.",
4175
4496
  "- If the user agrees: run the install command above, then retry this tool.",
4176
4497
  "- If the user declines, OR has NOT explicitly asked for LSP installation:",
4177
- ` call lsp_install_decision { server_id: "${server2.id}", decision: "declined" },`,
4498
+ ` call lsp_install_decision { server_id: "${server.id}", decision: "declined" },`,
4178
4499
  ` which writes to ${context.installDecisionsPath},`,
4179
4500
  " then ignore this message and proceed WITHOUT LSP."
4180
4501
  ].join(`
@@ -4198,34 +4519,34 @@ async function withLspClient(filePath, fn, toolName, options = {}) {
4198
4519
  if (result.status !== "found") {
4199
4520
  throw new LspServerLookupError(formatServerLookupError(result), result);
4200
4521
  }
4201
- const server2 = result.server;
4522
+ const server = result.server;
4202
4523
  const root = findWorkspaceRoot(absPath);
4203
4524
  const manager = options.manager ?? getLspManager();
4204
4525
  const acquireAndCall = async (allowRetry) => {
4205
- const client = await manager.getClient(root, server2, options.signal);
4526
+ const client = await manager.getClient(root, server, options.signal);
4206
4527
  try {
4207
4528
  return await fn(client, root, absPath);
4208
4529
  } catch (err) {
4209
4530
  if (allowRetry && READ_ONLY_TOOLS.has(toolName) && isLspDeadConnectionError(err)) {
4210
- manager.invalidateClient(root, server2.id, client);
4531
+ manager.invalidateClient(root, server.id, client);
4211
4532
  return acquireAndCall(false);
4212
4533
  }
4213
4534
  if (err instanceof LspRequestTimeoutError) {
4214
- if (manager.isServerInitializing(root, server2.id)) {
4535
+ if (manager.isServerInitializing(root, server.id)) {
4215
4536
  throw new LspServerInitializingError(err);
4216
4537
  }
4217
4538
  }
4218
4539
  throw err;
4219
4540
  } finally {
4220
- manager.releaseClient(root, server2.id);
4541
+ manager.releaseClient(root, server.id);
4221
4542
  }
4222
4543
  };
4223
4544
  return acquireAndCall(true);
4224
4545
  }
4225
4546
 
4226
4547
  // ../lsp-core/src/lsp/directory-diagnostics.ts
4227
- import { existsSync as existsSync10, lstatSync as lstatSync4, readdirSync as readdirSync3 } from "node:fs";
4228
- import { join as join5, resolve as resolve8 } from "node:path";
4548
+ import { existsSync as existsSync11, lstatSync as lstatSync4, readdirSync as readdirSync3 } from "node:fs";
4549
+ import { join as join6, resolve as resolve9 } from "node:path";
4229
4550
 
4230
4551
  // ../lsp-core/src/lsp/formatters.ts
4231
4552
  import { fileURLToPath as fileURLToPath2 } from "node:url";
@@ -4240,10 +4561,10 @@ function uriToPath(uri) {
4240
4561
  }
4241
4562
  function formatLocation(loc) {
4242
4563
  if ("targetUri" in loc) {
4243
- const uri2 = uriToPath(loc.targetUri);
4244
- const line2 = loc.targetRange.start.line + 1;
4245
- const char2 = loc.targetRange.start.character;
4246
- return `${uri2}:${line2}:${char2}`;
4564
+ const uri = uriToPath(loc.targetUri);
4565
+ const line = loc.targetRange.start.line + 1;
4566
+ const char = loc.targetRange.start.character;
4567
+ return `${uri}:${line}:${char}`;
4247
4568
  }
4248
4569
  const uri = uriToPath(loc.uri);
4249
4570
  const line = loc.range.start.line + 1;
@@ -4355,7 +4676,7 @@ function collectFilesWithExtension(dir, extension, maxFiles) {
4355
4676
  for (const entry of entries) {
4356
4677
  if (files.length >= maxFiles)
4357
4678
  return;
4358
- const fullPath = join5(currentDir, entry);
4679
+ const fullPath = join6(currentDir, entry);
4359
4680
  let stat;
4360
4681
  try {
4361
4682
  stat = lstatSync4(fullPath);
@@ -4380,15 +4701,15 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
4380
4701
  if (!extension.startsWith(".")) {
4381
4702
  throw new LspInvalidPathError(`Extension must start with a dot (e.g., ".ts", not "${extension}"). Use ".${extension}" instead.`);
4382
4703
  }
4383
- const absDir = resolve8(options.workspaceRoot ?? contextCwd(), directory);
4384
- if (!existsSync10(absDir)) {
4704
+ const absDir = resolve9(options.workspaceRoot ?? contextCwd(), directory);
4705
+ if (!existsSync11(absDir)) {
4385
4706
  throw new LspInvalidPathError(`Directory does not exist: ${absDir}`);
4386
4707
  }
4387
4708
  const serverResult = options.server === undefined ? findServerForExtension(extension) : { status: "found", server: options.server };
4388
4709
  if (serverResult.status !== "found") {
4389
4710
  throw new LspServerLookupError(formatServerLookupError(serverResult));
4390
4711
  }
4391
- const server2 = serverResult.server;
4712
+ const server = serverResult.server;
4392
4713
  const allFiles = (options.listFiles ?? collectFilesWithExtension)(absDir, extension, maxFiles + 1);
4393
4714
  const wasCapped = allFiles.length > maxFiles;
4394
4715
  const filesToProcess = allFiles.slice(0, maxFiles);
@@ -4408,7 +4729,7 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
4408
4729
  const fileErrors = [];
4409
4730
  const maxConcurrency = Math.max(1, options.maxConcurrency ?? DIRECTORY_DIAGNOSTICS_MAX_CONCURRENCY);
4410
4731
  options.signal?.throwIfAborted();
4411
- const client = await manager.getClient(root, server2, options.signal);
4732
+ const client = await manager.getClient(root, server, options.signal);
4412
4733
  try {
4413
4734
  let nextIndex = 0;
4414
4735
  const workers = Array.from({ length: Math.min(maxConcurrency, filesToProcess.length) }, async () => {
@@ -4436,7 +4757,7 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
4436
4757
  });
4437
4758
  await Promise.all(workers);
4438
4759
  } finally {
4439
- manager.releaseClient(root, server2.id);
4760
+ manager.releaseClient(root, server.id);
4440
4761
  }
4441
4762
  const displayDiagnostics = allDiagnostics.slice(0, DEFAULT_MAX_DIAGNOSTICS);
4442
4763
  const wasDiagCapped = allDiagnostics.length > DEFAULT_MAX_DIAGNOSTICS;
@@ -4468,7 +4789,7 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
4468
4789
 
4469
4790
  // ../lsp-core/src/lsp/infer-extension.ts
4470
4791
  import { lstatSync as lstatSync5, readdirSync as readdirSync4 } from "node:fs";
4471
- import { join as join6 } from "node:path";
4792
+ import { join as join7 } from "node:path";
4472
4793
  var SKIP_DIRECTORIES2 = new Set(["node_modules", ".git", "dist", "build", ".next", "out"]);
4473
4794
  var MAX_SCAN_ENTRIES = 500;
4474
4795
  function inferExtensionFromDirectory(directory) {
@@ -4486,7 +4807,7 @@ function inferExtensionFromDirectory(directory) {
4486
4807
  for (const entry of entries) {
4487
4808
  if (scanned >= MAX_SCAN_ENTRIES)
4488
4809
  return;
4489
- const fullPath = join6(dir, entry);
4810
+ const fullPath = join7(dir, entry);
4490
4811
  let stat;
4491
4812
  try {
4492
4813
  stat = lstatSync5(fullPath);
@@ -4645,8 +4966,8 @@ function clientOptions(signal) {
4645
4966
  }
4646
4967
 
4647
4968
  // ../lsp-core/src/tools/result.ts
4648
- function text(text2, details, isError = false) {
4649
- return { content: [{ type: "text", text: text2 }], details, isError };
4969
+ function text(text, details, isError = false) {
4970
+ return { content: [{ type: "text", text }], details, isError };
4650
4971
  }
4651
4972
 
4652
4973
  // ../lsp-core/src/tools/diagnostics.ts
@@ -4666,7 +4987,7 @@ async function executeLspDiagnostics(params, signal) {
4666
4987
  const extension = inferExtensionFromDirectory(absPath);
4667
4988
  if (!extension) {
4668
4989
  const message = `No supported source files found in directory: ${absPath}`;
4669
- const details3 = {
4990
+ const details = {
4670
4991
  filePath,
4671
4992
  severity,
4672
4993
  mode: "directory",
@@ -4676,24 +4997,24 @@ async function executeLspDiagnostics(params, signal) {
4676
4997
  error: message,
4677
4998
  errorKind: "no_files"
4678
4999
  };
4679
- return text(message, details3);
5000
+ return text(message, details);
4680
5001
  }
4681
- const output2 = await aggregateDiagnosticsForDirectory(absPath, extension, severity, undefined, signal === undefined ? {} : { signal });
4682
- const details2 = {
5002
+ const output = await aggregateDiagnosticsForDirectory(absPath, extension, severity, undefined, signal === undefined ? {} : { signal });
5003
+ const details = {
4683
5004
  filePath,
4684
5005
  severity,
4685
5006
  mode: "directory",
4686
5007
  diagnostics: [],
4687
- totalDiagnostics: output2.totalDiagnostics,
5008
+ totalDiagnostics: output.totalDiagnostics,
4688
5009
  truncated: false,
4689
- fileFailures: [...output2.fileFailures]
5010
+ fileFailures: [...output.fileFailures]
4690
5011
  };
4691
- return text(output2.output, details2);
5012
+ return text(output.output, details);
4692
5013
  }
4693
5014
  const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.diagnostics(resolvedFilePath, signal), "diagnostics", clientOptions(signal));
4694
5015
  if (result.transientError) {
4695
5016
  const message = result.transientError.message;
4696
- const details2 = {
5017
+ const details = {
4697
5018
  filePath,
4698
5019
  severity,
4699
5020
  mode: "file",
@@ -4703,7 +5024,7 @@ async function executeLspDiagnostics(params, signal) {
4703
5024
  error: message,
4704
5025
  errorKind: result.transientError.kind
4705
5026
  };
4706
- return text(message, details2, true);
5027
+ return text(message, details, true);
4707
5028
  }
4708
5029
  const diagnostics = filterDiagnosticsBySeverity(asDiagnosticArray(result), severity);
4709
5030
  const total = diagnostics.length;
@@ -4737,6 +5058,96 @@ async function executeLspDiagnostics(params, signal) {
4737
5058
  throw error;
4738
5059
  }
4739
5060
  }
5061
+ // ../lsp-core/src/lsp/format-document.ts
5062
+ import { readFileSync as readFileSync5, renameSync as renameSync3, unlinkSync, writeFileSync as writeFileSync3 } from "node:fs";
5063
+ var DEFAULT_FORMATTING_OPTIONS = {
5064
+ tabSize: 4,
5065
+ insertSpaces: false,
5066
+ trimTrailingWhitespace: true,
5067
+ insertFinalNewline: true,
5068
+ trimFinalNewlines: true
5069
+ };
5070
+ var UNCHANGED = { status: "unchanged", linesAdded: 0, linesRemoved: 0 };
5071
+ async function formatDocumentWithClient(client, filePath, options = {}) {
5072
+ const edits = await client.formatDocument(filePath, options.formattingOptions ?? DEFAULT_FORMATTING_OPTIONS, options.signal);
5073
+ if (edits === null)
5074
+ return { status: "unavailable", reason: "capability_not_advertised" };
5075
+ if (edits.length === 0)
5076
+ return UNCHANGED;
5077
+ const before = readFileSync5(filePath, "utf-8");
5078
+ const normalized = normalizeTextEdits(before, edits, 0);
5079
+ if (normalized.text === before)
5080
+ return UNCHANGED;
5081
+ writeAtomically(filePath, normalized.text);
5082
+ await client.openFile(filePath);
5083
+ return {
5084
+ status: "formatted",
5085
+ ...lineDelta(normalized.edits)
5086
+ };
5087
+ }
5088
+ function lineDelta(edits) {
5089
+ let linesAdded = 0;
5090
+ let linesRemoved = 0;
5091
+ for (const edit of edits) {
5092
+ linesRemoved += edit.range.end.line - edit.range.start.line + 1;
5093
+ linesAdded += edit.newText.split(`
5094
+ `).length;
5095
+ }
5096
+ return { linesAdded, linesRemoved };
5097
+ }
5098
+ function writeAtomically(filePath, content) {
5099
+ const tempPath = `${filePath}.omo-format.tmp`;
5100
+ writeFileSync3(tempPath, content, "utf-8");
5101
+ try {
5102
+ renameSync3(tempPath, filePath);
5103
+ } catch (error) {
5104
+ try {
5105
+ unlinkSync(tempPath);
5106
+ } catch {}
5107
+ throw error;
5108
+ }
5109
+ }
5110
+
5111
+ // ../lsp-core/src/tools/format.ts
5112
+ async function executeLspFormat(params, signal) {
5113
+ const filePath = requireString(params, "filePath");
5114
+ try {
5115
+ const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => formatDocumentWithClient(client, resolvedFilePath, signal === undefined ? {} : { signal }), "format", clientOptions(signal));
5116
+ return text(describeResult(filePath, result), formatDetails(filePath, result));
5117
+ } catch (error) {
5118
+ const missingDependency = missingDependencyResult(error, {
5119
+ filePath,
5120
+ status: "unavailable",
5121
+ reason: "server_unavailable",
5122
+ linesAdded: 0,
5123
+ linesRemoved: 0
5124
+ });
5125
+ if (missingDependency)
5126
+ return missingDependency;
5127
+ throw error;
5128
+ }
5129
+ }
5130
+ function formatDetails(filePath, result) {
5131
+ if (result.status === "unavailable") {
5132
+ return { filePath, status: "unavailable", reason: result.reason, linesAdded: 0, linesRemoved: 0 };
5133
+ }
5134
+ return {
5135
+ filePath,
5136
+ status: result.status,
5137
+ linesAdded: result.linesAdded,
5138
+ linesRemoved: result.linesRemoved
5139
+ };
5140
+ }
5141
+ function describeResult(filePath, result) {
5142
+ if (result.status === "unavailable") {
5143
+ return `Formatting unavailable for ${filePath}: the language server does not advertise documentFormattingProvider.`;
5144
+ }
5145
+ if (result.status === "unchanged") {
5146
+ return `Already formatted: ${filePath}`;
5147
+ }
5148
+ return `Formatted ${filePath} (+${result.linesAdded}/-${result.linesRemoved} lines)`;
5149
+ }
5150
+
4740
5151
  // ../lsp-core/src/tools/install-decision.ts
4741
5152
  async function executeLspInstallDecision(params) {
4742
5153
  const serverId = requireString(params, "server_id");
@@ -4744,7 +5155,7 @@ async function executeLspInstallDecision(params) {
4744
5155
  if (!isInstallDecision(decision)) {
4745
5156
  return text(`Invalid decision '${String(decision)}'. Expected "declined" or "allowed".`, { serverId, errorKind: "invalid_decision" }, true);
4746
5157
  }
4747
- const serverIds = [...new Set(getMergedServers().map((server2) => server2.id))];
5158
+ const serverIds = [...new Set(getMergedServers().map((server) => server.id))];
4748
5159
  if (!serverIds.includes(serverId)) {
4749
5160
  const preview = serverIds.slice(0, 20).join(", ");
4750
5161
  return text(`Unknown LSP server '${serverId}'. Known servers: ${preview}${serverIds.length > 20 ? "..." : ""}`, { serverId, errorKind: "unknown_server" }, true);
@@ -4884,10 +5295,10 @@ function objectSchema(properties, required = []) {
4884
5295
  async function executeLspStatus() {
4885
5296
  const servers = getAllServers();
4886
5297
  const snapshots = getLspManager().getSnapshot();
4887
- const installed = servers.filter((server2) => server2.installed && !server2.disabled);
4888
- const configuredLines = servers.map((server2) => {
4889
- const state = server2.disabled ? "disabled" : server2.installed ? "installed" : "missing";
4890
- return `- ${server2.id}: ${state}; source=${server2.source}; extensions=${server2.extensions.join(", ")}`;
5298
+ const installed = servers.filter((server) => server.installed && !server.disabled);
5299
+ const configuredLines = servers.map((server) => {
5300
+ const state = server.disabled ? "disabled" : server.installed ? "installed" : "missing";
5301
+ return `- ${server.id}: ${state}; source=${server.source}; extensions=${server.extensions.join(", ")}`;
4891
5302
  });
4892
5303
  const activeLines = snapshots.map((snapshot) => {
4893
5304
  const state = snapshot.alive ? snapshot.isInitializing ? "initializing" : "alive" : "dead";
@@ -4930,8 +5341,8 @@ async function executeLspSymbols(params, signal) {
4930
5341
  errorKind: "missing_query"
4931
5342
  });
4932
5343
  }
4933
- const symbols2 = await withLspClient(filePath, async (client) => client.workspaceSymbols(query, signal), "workspaceSymbols", clientOptions(signal));
4934
- return formatSymbolsResult(filePath, scope, symbols2, limit, query);
5344
+ const symbols = await withLspClient(filePath, async (client) => client.workspaceSymbols(query, signal), "workspaceSymbols", clientOptions(signal));
5345
+ return formatSymbolsResult(filePath, scope, symbols, limit, query);
4935
5346
  }
4936
5347
  const symbols = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.documentSymbols(resolvedFilePath, signal), "documentSymbols", clientOptions(signal));
4937
5348
  return formatSymbolsResult(filePath, scope, symbols, limit);
@@ -5069,6 +5480,16 @@ var LSP_MCP_TOOLS = [
5069
5480
  }, ["filePath", "line", "character", "newName"]),
5070
5481
  execute: executeLspRename
5071
5482
  },
5483
+ {
5484
+ name: "format",
5485
+ aliases: ["lsp_format"],
5486
+ title: "LSP Format",
5487
+ description: "Format a source file with its language server and write the returned edits to disk.",
5488
+ inputSchema: objectSchema({
5489
+ filePath: { type: "string", description: "Source file path to format." }
5490
+ }, ["filePath"]),
5491
+ execute: executeLspFormat
5492
+ },
5072
5493
  {
5073
5494
  name: "install_decision",
5074
5495
  aliases: ["lsp_install_decision"],
@@ -5176,6 +5597,6 @@ function requestedProtocolVersion(params) {
5176
5597
  return params["protocolVersion"];
5177
5598
  }
5178
5599
  export {
5179
- runMcpStdioServer,
5180
- handleLspMcpRequest
5600
+ handleLspMcpRequest,
5601
+ runMcpStdioServer
5181
5602
  };