oh-my-opencode 5.0.0-beta.6 → 5.0.0-beta.62

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 (997) hide show
  1. package/.agents/command/publish.md +59 -23
  2. package/.agents/skills/codex-qa/scripts/lsp-e2e.sh +1 -3
  3. package/.agents/skills/opencode-qa/scripts/lsp-e2e.sh +1 -1
  4. package/.agents/skills/pre-publish-review/SKILL.md +9 -12
  5. package/.agents/skills/publish/SKILL.md +59 -23
  6. package/.agents/skills/senpi-qa/SKILL.md +80 -0
  7. package/.agents/skills/senpi-qa/scripts/resolve-evidence-dir.mjs +65 -0
  8. package/.agents/skills/senpi-qa/scripts/resolve-evidence-dir.test.mjs +171 -0
  9. package/.agents/skills/tech-debt-audit/SKILL.md +6 -76
  10. package/.agents/skills/work-with-pr/SKILL.md +37 -23
  11. package/.opencode/command/publish.md +59 -23
  12. package/.opencode/skills/pre-publish-review/SKILL.md +9 -12
  13. package/.opencode/skills/work-with-pr/SKILL.md +37 -23
  14. package/README.ja.md +65 -60
  15. package/README.ko.md +66 -61
  16. package/README.md +65 -72
  17. package/README.ru.md +62 -60
  18. package/README.zh-cn.md +61 -60
  19. package/THIRD-PARTY-NOTICES.md +27 -99
  20. package/dist/agents/atlas/agent.d.ts +0 -1
  21. package/dist/agents/gpt-prompt-identity.d.ts +1 -1
  22. package/dist/agents/sisyphus/grok-4.d.ts +20 -0
  23. package/dist/agents/sisyphus/index.d.ts +2 -0
  24. package/dist/agents/sisyphus-agent-config.d.ts +6 -0
  25. package/dist/agents/sisyphus-agent-factory.d.ts +1 -1
  26. package/dist/agents/sisyphus-runtime-prompt-reconciler.d.ts +15 -4
  27. package/dist/agents/types.d.ts +4 -2
  28. package/dist/cli/config-manager/parse-opencode-config-file.d.ts +2 -1
  29. package/dist/cli/doctor/checks/index.d.ts +2 -0
  30. package/dist/cli/doctor/checks/latest-version.d.ts +11 -0
  31. package/dist/cli/doctor/checks/system-plugin.d.ts +4 -3
  32. package/dist/cli/doctor/framework/constants.d.ts +5 -0
  33. package/dist/cli/doctor/framework/types.d.ts +2 -0
  34. package/dist/cli/fallback-lane-policy.d.ts +1 -0
  35. package/dist/cli/index.js +52548 -60412
  36. package/dist/cli/install-codex/install-codex-test-fixtures.d.ts +1 -1
  37. package/dist/cli/run/on-complete-hook.d.ts +2 -0
  38. package/dist/cli/runtime-commands.d.ts +1 -1
  39. package/dist/cli/worktree-sweep/classify.d.ts +16 -0
  40. package/dist/cli/worktree-sweep/format.d.ts +8 -0
  41. package/dist/cli/worktree-sweep/git.d.ts +19 -0
  42. package/dist/cli/worktree-sweep/index.d.ts +7 -0
  43. package/dist/cli/worktree-sweep/options.d.ts +2 -0
  44. package/dist/cli/worktree-sweep/parse-worktree-list.d.ts +8 -0
  45. package/dist/cli/worktree-sweep/sweep.d.ts +2 -0
  46. package/dist/cli/worktree-sweep/types.d.ts +65 -0
  47. package/dist/cli/worktree-sweep/worktree-sweep.d.ts +2 -0
  48. package/dist/cli-node/index.js +51202 -59043
  49. package/dist/config/index.d.ts +1 -1
  50. package/dist/config/schema/background-task.d.ts +1 -0
  51. package/dist/config/schema/commands.d.ts +1 -1
  52. package/dist/config/schema/hooks.d.ts +1 -2
  53. package/dist/config/schema/oh-my-opencode-config.d.ts +5 -11
  54. package/dist/config/schema/ulw-execute.d.ts +5 -0
  55. package/dist/config/schema.d.ts +0 -1
  56. package/dist/config/validate.d.ts +2 -0
  57. package/dist/create-hooks.d.ts +3 -2
  58. package/dist/features/background-agent/compaction-aware-message-resolver.d.ts +1 -0
  59. package/dist/features/background-agent/constants.d.ts +0 -7
  60. package/dist/features/background-agent/error-classifier.d.ts +1 -0
  61. package/dist/features/background-agent/manager.d.ts +9 -1
  62. package/dist/features/background-agent/parent-wake-dispatched-tracker.d.ts +0 -1
  63. package/dist/features/background-agent/parent-wake-notifier-types.d.ts +1 -1
  64. package/dist/features/background-agent/parent-wake-prompt-dispatch.d.ts +1 -1
  65. package/dist/features/background-agent/parent-wake-session-inspector.d.ts +1 -1
  66. package/dist/features/background-agent/subagent-spawn-limits.d.ts +8 -0
  67. package/dist/features/background-agent/types.d.ts +4 -0
  68. package/dist/features/btw-side/btw-command-draft.d.ts +7 -0
  69. package/dist/features/btw-side/context-injector.d.ts +15 -0
  70. package/dist/features/btw-side/index.d.ts +8 -0
  71. package/dist/features/btw-side/metadata.d.ts +15 -0
  72. package/dist/features/btw-side/parent-context-budget.d.ts +9 -0
  73. package/dist/features/btw-side/server-session-registry.d.ts +8 -0
  74. package/dist/features/btw-side/tui-adoption-cache.d.ts +13 -0
  75. package/dist/features/btw-side/tui-adoption-guard.d.ts +5 -0
  76. package/dist/features/btw-side/tui-controller-types.d.ts +68 -0
  77. package/dist/features/btw-side/tui-controller.d.ts +19 -0
  78. package/dist/features/btw-side/tui-escape-return.d.ts +12 -0
  79. package/dist/features/btw-side/tui-keymap.d.ts +17 -0
  80. package/dist/features/btw-side/tui-parent-validator.d.ts +6 -0
  81. package/dist/features/btw-side/tui-picker-options.d.ts +20 -0
  82. package/dist/features/btw-side/tui-picker.d.ts +9 -0
  83. package/dist/features/btw-side/tui-prompt-queue.d.ts +8 -0
  84. package/dist/features/btw-side/tui-session-bridge.d.ts +11 -0
  85. package/dist/features/btw-side/tui-session-catalog.d.ts +35 -0
  86. package/dist/features/btw-side/tui-side-removal.d.ts +11 -0
  87. package/dist/features/btw-side/tui-side-start.d.ts +9 -0
  88. package/dist/features/btw-side/tui-wiring.d.ts +8 -0
  89. package/dist/features/builtin-commands/templates/ulw-execute.d.ts +1 -0
  90. package/dist/features/builtin-commands/types.d.ts +1 -1
  91. package/dist/features/claude-tasks/storage.d.ts +7 -2
  92. package/dist/features/hook-message-injector/index.d.ts +1 -0
  93. package/dist/features/hook-message-injector/sdk-message-lookup.d.ts +1 -0
  94. package/dist/features/monitor/manager-internals.d.ts +1 -1
  95. package/dist/features/monitor/output-injector-types.d.ts +1 -1
  96. package/dist/features/opengateway-provider/index.d.ts +13 -0
  97. package/dist/features/task-toast-manager/manager.d.ts +0 -24
  98. package/dist/features/team-mode/tools/messaging-fallback-wake.d.ts +17 -0
  99. package/dist/features/team-mode/tools/messaging-live-delivery-recipient.d.ts +3 -0
  100. package/dist/features/team-mode/tools/messaging-runtime.d.ts +7 -0
  101. package/dist/hooks/anthropic-context-window-limit-recovery/message-storage-directory.d.ts +0 -3
  102. package/dist/hooks/anthropic-context-window-limit-recovery/state.d.ts +1 -0
  103. package/dist/hooks/anthropic-context-window-limit-recovery/storage/empty-messages.d.ts +0 -1
  104. package/dist/hooks/anthropic-context-window-limit-recovery/tool-result-storage.d.ts +11 -0
  105. package/dist/hooks/atlas/atlas-hook.d.ts +1 -0
  106. package/dist/hooks/atlas/atlas-lifecycle-store.d.ts +50 -0
  107. package/dist/hooks/atlas/event-handler.d.ts +1 -0
  108. package/dist/hooks/atlas/final-wave-approval-gate.test-support.d.ts +50 -0
  109. package/dist/hooks/atlas/system-reminder-templates.d.ts +0 -1
  110. package/dist/hooks/atlas/tool-execute-before.d.ts +3 -0
  111. package/dist/hooks/atlas/types.d.ts +1 -0
  112. package/dist/hooks/claude-code-hooks/session-hook-state.d.ts +1 -0
  113. package/dist/hooks/claude-code-hooks/stop.d.ts +2 -0
  114. package/dist/hooks/claude-code-hooks/todo.d.ts +0 -1
  115. package/dist/hooks/claude-code-hooks/transcript.d.ts +2 -0
  116. package/dist/hooks/compaction-context-injector/validated-model.d.ts +2 -0
  117. package/dist/hooks/fsync-skip-warning/index.d.ts +4 -0
  118. package/dist/hooks/hashline-edit-diff-enhancer/hook.d.ts +1 -0
  119. package/dist/hooks/hashline-edit-diff-enhancer/pending-captures.d.ts +13 -0
  120. package/dist/hooks/index.d.ts +1 -2
  121. package/dist/hooks/keyword-detector/hook.d.ts +9 -0
  122. package/dist/hooks/keyword-detector/ultrawork/index.d.ts +2 -0
  123. package/dist/hooks/keyword-detector/ultrawork/source-detector.d.ts +0 -1
  124. package/dist/hooks/model-fallback/hook.d.ts +1 -1
  125. package/dist/hooks/prometheus-md-only/agent-resolution.d.ts +2 -2
  126. package/dist/hooks/runtime-fallback/chat-message-handler.d.ts +2 -0
  127. package/dist/hooks/runtime-fallback/retry-model-payload.d.ts +1 -0
  128. package/dist/hooks/runtime-fallback/runtime-model-settings.d.ts +6 -0
  129. package/dist/hooks/runtime-fallback/session-status-handler.d.ts +1 -1
  130. package/dist/hooks/runtime-fallback/types.d.ts +3 -1
  131. package/dist/hooks/sisyphus-junior-notepad/constants.d.ts +1 -1
  132. package/dist/hooks/todo-continuation-enforcer/types.d.ts +1 -0
  133. package/dist/hooks/{start-work → ulw-execute}/context-info-builder.d.ts +1 -1
  134. package/dist/hooks/{start-work → ulw-execute}/index.d.ts +1 -1
  135. package/dist/hooks/ulw-execute/ulw-execute-hook.d.ts +23 -0
  136. package/dist/hooks/unstable-agent-babysitter/task-message-analyzer.d.ts +1 -0
  137. package/dist/index.js +29256 -25391
  138. package/dist/mcp/index.d.ts +0 -4
  139. package/dist/mcp/types.d.ts +0 -1
  140. package/dist/oh-my-opencode.schema.json +21 -47
  141. package/dist/plugin/chat-message/types.d.ts +6 -4
  142. package/dist/plugin/chat-message/ulw-execute-message.d.ts +5 -0
  143. package/dist/plugin/event-session-lifecycle.d.ts +1 -0
  144. package/dist/plugin/hooks/create-core-hooks.d.ts +2 -2
  145. package/dist/plugin/hooks/create-session-hooks.d.ts +2 -3
  146. package/dist/plugin/hooks/create-transform-hooks.d.ts +2 -0
  147. package/dist/plugin/messages-transform.d.ts +1 -0
  148. package/dist/plugin/stop-continuation.d.ts +3 -0
  149. package/dist/plugin/system-transform.d.ts +5 -1
  150. package/dist/plugin-dispose.d.ts +3 -0
  151. package/dist/shared/agent-tool-restrictions.d.ts +0 -1
  152. package/dist/shared/compaction-agent-config-checkpoint.d.ts +1 -0
  153. package/dist/shared/index.d.ts +2 -0
  154. package/dist/shared/legacy-plugin-warning.d.ts +2 -1
  155. package/dist/shared/normalize-sdk-response.d.ts +1 -0
  156. package/dist/shared/omo-process-sweep.d.ts +2 -4
  157. package/dist/shared/plugin-entry-migrator.d.ts +4 -3
  158. package/dist/shared/plugin-entry-shape.d.ts +6 -0
  159. package/dist/shared/runtime-fallback-retry-marker.d.ts +16 -0
  160. package/dist/shared/shell-env.d.ts +1 -1
  161. package/dist/skills/ast-grep/AGENTS.md +51 -0
  162. package/dist/skills/ast-grep/SKILL.md +1 -1
  163. package/dist/skills/coding-agent-sessions/AGENTS.md +62 -0
  164. package/dist/skills/coding-agent-sessions/SKILL.md +1 -1
  165. package/dist/skills/data-scientist/SKILL.md +99 -239
  166. package/dist/skills/data-scientist/references/execution-surfaces.md +91 -0
  167. package/dist/skills/data-scientist/references/placement.md +74 -0
  168. package/dist/skills/data-scientist/references/polars-lane.md +95 -0
  169. package/dist/skills/data-scientist/references/uv-setup.md +1 -1
  170. package/dist/skills/data-scientist/references/visualization.md +64 -0
  171. package/dist/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
  172. package/dist/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
  173. package/dist/skills/debugging/SKILL.md +3 -1
  174. package/dist/skills/debugging/references/methodology/00-setup.md +12 -0
  175. package/dist/skills/debugging/references/methodology/02-investigate.md +21 -0
  176. package/dist/skills/debugging/references/runtimes/go.md +15 -1
  177. package/dist/skills/debugging/references/runtimes/native-binary.md +38 -0
  178. package/dist/skills/debugging/references/runtimes/node.md +25 -0
  179. package/dist/skills/debugging/references/runtimes/python.md +13 -0
  180. package/dist/skills/debugging/references/runtimes/rust.md +41 -0
  181. package/dist/skills/debugging/references/scripts/dap.mjs +267 -0
  182. package/dist/skills/debugging/references/scripts/dap.test.ts +86 -0
  183. package/dist/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
  184. package/dist/skills/debugging/references/tools/dap.md +103 -0
  185. package/dist/skills/debugging/references/tools/frida.md +193 -0
  186. package/dist/skills/frontend/ATTRIBUTION.md +10 -0
  187. package/dist/skills/frontend/SKILL.md +15 -8
  188. package/dist/skills/frontend/references/design/README.md +10 -2
  189. package/dist/skills/frontend/references/design/_INDEX.md +2 -0
  190. package/dist/skills/frontend/references/design/ambience-skill.md +145 -0
  191. package/dist/skills/frontend/references/design/interaction-skill.md +2 -0
  192. package/dist/skills/frontend/references/design/print-paged-media.md +76 -0
  193. package/dist/skills/frontend/references/design/stylegallery.md +80 -0
  194. package/dist/skills/frontend/references/designpowers/README.md +1 -1
  195. package/dist/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
  196. package/dist/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
  197. package/dist/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
  198. package/dist/skills/frontend/references/designpowers/orchestration.md +1 -1
  199. package/dist/skills/frontend/references/designpowers/routing.md +5 -5
  200. package/dist/skills/git-master/SKILL.md +1 -1
  201. package/dist/skills/init-deep/SKILL.md +14 -14
  202. package/dist/skills/lsp-setup/SKILL.md +1 -1
  203. package/dist/skills/programming/SKILL.md +1 -1
  204. package/dist/skills/refactor/SKILL.md +4 -4
  205. package/dist/skills/remove-ai-slops/SKILL.md +1 -1
  206. package/dist/skills/review-work/SKILL.md +101 -419
  207. package/dist/skills/ultimate-browsing/ATTRIBUTION.md +38 -11
  208. package/dist/skills/ultimate-browsing/SKILL.md +26 -9
  209. package/dist/skills/ultimate-browsing/engine/AGENTS.md +110 -0
  210. package/dist/skills/ultimate-browsing/engine/templates/package.json +1 -1
  211. package/dist/skills/ultimate-browsing/references/chrome-stealth.md +23 -18
  212. package/dist/skills/ultimate-browsing/references/insane-search/README.md +9 -2
  213. package/dist/skills/{start-work → ulw-execute}/SKILL.md +20 -19
  214. package/dist/skills/ulw-plan/SKILL.md +7 -8
  215. package/dist/skills/ulw-plan/references/full-workflow.md +31 -7
  216. package/dist/skills/ulw-plan/references/intent-clear.md +2 -1
  217. package/dist/skills/ulw-plan/references/intent-unclear.md +5 -5
  218. package/dist/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -1
  219. package/dist/skills/ulw-research/SKILL.md +8 -3
  220. package/dist/skills/visual-qa/AGENTS.md +58 -0
  221. package/dist/skills/visual-qa/SKILL.md +4 -3
  222. package/dist/tools/delegate-task/builtin-categories.d.ts +3 -1
  223. package/dist/tools/delegate-task/builtin-category-definition.d.ts +2 -1
  224. package/dist/tools/delegate-task/constants.d.ts +2 -2
  225. package/dist/tools/delegate-task/openai-categories.d.ts +7 -2
  226. package/dist/tools/delegate-task/sync-session-cleanup.d.ts +3 -0
  227. package/dist/tools/delegate-task/sync-session-poller.d.ts +1 -0
  228. package/dist/tools/delegate-task/tool-description.d.ts +3 -1
  229. package/dist/tools/delegate-task/types.d.ts +4 -0
  230. package/dist/tools/session-manager/directory-filter.d.ts +2 -0
  231. package/dist/tui.d.ts +12 -0
  232. package/dist/tui.js +37048 -46599
  233. package/package.json +47 -41
  234. package/packages/git-bash-mcp/dist/cli.js +6 -1
  235. package/packages/git-bash-mcp/package.json +1 -1
  236. package/packages/lsp-core/src/index.ts +1 -0
  237. package/packages/lsp-core/src/lsp/client-diagnostics-concurrency.integration.test.ts +44 -0
  238. package/packages/lsp-core/src/lsp/client-diagnostics-freshness.integration.test.ts +57 -48
  239. package/packages/lsp-core/src/lsp/client-diagnostics-pull-timeout.test.ts +64 -0
  240. package/packages/lsp-core/src/lsp/client-wrapper-outside-cwd.test.ts +78 -0
  241. package/packages/lsp-core/src/lsp/client-wrapper.test.ts +103 -6
  242. package/packages/lsp-core/src/lsp/client-wrapper.ts +50 -16
  243. package/packages/lsp-core/src/lsp/client.ts +32 -3
  244. package/packages/lsp-core/src/lsp/connection.ts +16 -0
  245. package/packages/lsp-core/src/lsp/constants.ts +6 -0
  246. package/packages/lsp-core/src/lsp/controlled-clock-test-support.ts +61 -0
  247. package/packages/lsp-core/src/lsp/errors.ts +15 -0
  248. package/packages/lsp-core/src/lsp/fixtures/workspace-edit-server.mjs +10 -3
  249. package/packages/lsp-core/src/lsp/format-document.test.ts +143 -0
  250. package/packages/lsp-core/src/lsp/format-document.ts +90 -0
  251. package/packages/lsp-core/src/lsp/json-rpc-connection.ts +11 -6
  252. package/packages/lsp-core/src/lsp/manager-lifecycle.test.ts +262 -0
  253. package/packages/lsp-core/src/lsp/manager-max-clients.test.ts +151 -0
  254. package/packages/lsp-core/src/lsp/manager.ts +138 -12
  255. package/packages/lsp-core/src/lsp/outside-context-workspace.ts +33 -0
  256. package/packages/lsp-core/src/lsp/server-definitions.ts +29 -0
  257. package/packages/lsp-core/src/lsp/server-installation.test.ts +376 -0
  258. package/packages/lsp-core/src/lsp/server-installation.ts +200 -27
  259. package/packages/lsp-core/src/lsp/server-resolution-local-binary.test.ts +170 -0
  260. package/packages/lsp-core/src/lsp/server-resolution.ts +18 -5
  261. package/packages/lsp-core/src/lsp/timer-provider.ts +13 -0
  262. package/packages/lsp-core/src/lsp/transport-request-timeout.test.ts +73 -0
  263. package/packages/lsp-core/src/lsp/transport.ts +16 -2
  264. package/packages/lsp-core/src/lsp/types.ts +8 -0
  265. package/packages/lsp-core/src/lsp/workspace-apply-edit-test-support.ts +29 -1
  266. package/packages/lsp-core/src/lsp/workspace-document-state.test.ts +84 -1
  267. package/packages/lsp-core/src/lsp/workspace-document-state.ts +30 -11
  268. package/packages/lsp-core/src/lsp/workspace-markers.ts +18 -0
  269. package/packages/lsp-core/src/mcp.ts +3 -0
  270. package/packages/lsp-core/src/request-context.test.ts +29 -0
  271. package/packages/lsp-core/src/request-context.ts +1 -1
  272. package/packages/lsp-core/src/tool-surface.test.ts +13 -1
  273. package/packages/lsp-core/src/tools/definitions.ts +14 -0
  274. package/packages/lsp-core/src/tools/format.test.ts +56 -0
  275. package/packages/lsp-core/src/tools/format.ts +56 -0
  276. package/packages/lsp-core/src/tools/index.ts +1 -0
  277. package/packages/lsp-core/src/tools/parameters.test.ts +51 -0
  278. package/packages/lsp-core/src/tools/types.ts +10 -0
  279. package/packages/lsp-daemon/dist/cli.js +902 -479
  280. package/packages/lsp-daemon/dist/client.d.ts +10 -0
  281. package/packages/lsp-daemon/dist/client.js +920 -493
  282. package/packages/lsp-daemon/dist/daemon-client.d.ts +1 -0
  283. package/packages/lsp-daemon/dist/daemon-client.js +3 -0
  284. package/packages/lsp-daemon/dist/ensure-daemon.d.ts +6 -1
  285. package/packages/lsp-daemon/dist/ensure-daemon.js +10 -2
  286. package/packages/lsp-daemon/dist/index.js +824 -402
  287. package/packages/lsp-daemon/dist/ownership.js +2 -2
  288. package/packages/lsp-daemon/dist/proxy.js +3 -0
  289. package/packages/lsp-daemon/dist/version-reap.js +1 -1
  290. package/packages/lsp-daemon/package.json +1 -1
  291. package/packages/lsp-tools-mcp/dist/cli.js +762 -341
  292. package/packages/lsp-tools-mcp/dist/lsp/manager.js +272 -138
  293. package/packages/lsp-tools-mcp/dist/mcp.js +787 -368
  294. package/packages/lsp-tools-mcp/dist/request-context.js +12 -13
  295. package/packages/lsp-tools-mcp/dist/tools.js +717 -302
  296. package/packages/lsp-tools-mcp/package.json +1 -1
  297. package/packages/omo-codex/THIRD-PARTY-NOTICES.md +4 -21
  298. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +4 -6
  299. package/packages/omo-codex/plugin/.mcp.json +0 -6
  300. package/packages/omo-codex/plugin/AGENTS.md +47 -0
  301. package/packages/omo-codex/plugin/README.md +6 -2
  302. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +7093 -408
  303. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  304. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  305. package/packages/omo-codex/plugin/components/bootstrap/src/hook.ts +1 -0
  306. package/packages/omo-codex/plugin/components/bootstrap/src/setup.ts +7 -1
  307. package/packages/omo-codex/plugin/components/comment-checker/AGENTS.md +9 -0
  308. package/packages/omo-codex/plugin/components/comment-checker/biome.json +2 -2
  309. package/packages/omo-codex/plugin/components/comment-checker/dist/cli.js +2 -1
  310. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  311. package/packages/omo-codex/plugin/components/comment-checker/package.json +5 -5
  312. package/packages/omo-codex/plugin/components/comment-checker/src/apply-patch.ts +2 -8
  313. package/packages/omo-codex/plugin/components/comment-checker/src/core.ts +1 -2
  314. package/packages/omo-codex/plugin/components/comment-checker/src/request-extractor.ts +1 -1
  315. package/packages/omo-codex/plugin/components/comment-checker/src/runner.ts +1 -0
  316. package/packages/omo-codex/plugin/components/git-bash/AGENTS.md +1 -1
  317. package/packages/omo-codex/plugin/components/git-bash/dist/cli.js +1 -1
  318. package/packages/omo-codex/plugin/components/git-bash/dist/codex-hook.js +2 -1
  319. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  320. package/packages/omo-codex/plugin/components/git-bash/package.json +3 -4
  321. package/packages/omo-codex/plugin/components/git-bash/src/codex-hook.ts +2 -1
  322. package/packages/omo-codex/plugin/components/git-bash/test/codex-hook.test.ts +6 -7
  323. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/AGENTS.md +2 -2
  324. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/biome.json +2 -2
  325. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/directive.md +2 -0
  326. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/cli.js +36 -29
  327. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/codex-hook.js +32 -26
  328. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/types.d.ts +3 -0
  329. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  330. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +5 -5
  331. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/codex-hook.ts +32 -28
  332. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/types.ts +3 -0
  333. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/cli.test.ts +1 -1
  334. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +137 -28
  335. package/packages/omo-codex/plugin/components/lcx/skills/lcx-doctor/SKILL.md +4 -2
  336. package/packages/omo-codex/plugin/components/lsp/AGENTS.md +30 -15
  337. package/packages/omo-codex/plugin/components/lsp/biome.json +2 -2
  338. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +4 -4
  339. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +941 -540
  340. package/packages/omo-codex/plugin/components/lsp/dist/daemon-cli-path.js +1 -1
  341. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  342. package/packages/omo-codex/plugin/components/lsp/package.json +5 -5
  343. package/packages/omo-codex/plugin/components/lsp/src/cli.ts +1 -1
  344. package/packages/omo-codex/plugin/components/lsp/src/codex-hook.ts +1 -1
  345. package/packages/omo-codex/plugin/components/lsp/src/daemon-cli-path.ts +1 -5
  346. package/packages/omo-codex/plugin/components/lsp/test/codex-hook-unavailable.test.ts +6 -7
  347. package/packages/omo-codex/plugin/components/lsp/test/codex-hook.test.ts +1 -2
  348. package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +11 -1
  349. package/packages/omo-codex/plugin/components/rules/AGENTS.md +12 -0
  350. package/packages/omo-codex/plugin/components/rules/README.md +2 -0
  351. package/packages/omo-codex/plugin/components/rules/biome.json +2 -2
  352. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-6.md +123 -0
  353. package/packages/omo-codex/plugin/components/rules/dist/cli.js +91 -68
  354. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  355. package/packages/omo-codex/plugin/components/rules/package.json +7 -7
  356. package/packages/omo-codex/plugin/components/rules/src/config.ts +1 -2
  357. package/packages/omo-codex/plugin/components/rules/src/persistent-cache.ts +1 -2
  358. package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +15 -5
  359. package/packages/omo-codex/plugin/components/rules/src/rules-engine-factory.ts +1 -4
  360. package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +4 -9
  361. package/packages/omo-codex/plugin/components/rules/test/bundled-rules-priority.test.ts +11 -16
  362. package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +17 -25
  363. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +9 -7
  364. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +0 -6
  365. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-dedup.test.ts +6 -4
  366. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-directive.test.ts +12 -9
  367. package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +28 -37
  368. package/packages/omo-codex/plugin/components/rules/test/dynamic-target-fingerprints.test.ts +1 -2
  369. package/packages/omo-codex/plugin/components/rules/test/engine.test.ts +7 -4
  370. package/packages/omo-codex/plugin/components/rules/test/finder.test.ts +2 -3
  371. package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +39 -72
  372. package/packages/omo-codex/plugin/components/rules/test/hephaestus-model-variant.test.ts +38 -3
  373. package/packages/omo-codex/plugin/components/rules/test/hook-output.test.ts +2 -3
  374. package/packages/omo-codex/plugin/components/rules/test/matcher.test.ts +2 -3
  375. package/packages/omo-codex/plugin/components/rules/test/package-smoke.test.ts +1 -1
  376. package/packages/omo-codex/plugin/components/rules/test/parser.test.ts +1 -2
  377. package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +29 -6
  378. package/packages/omo-codex/plugin/components/rules/test/rules-engine-consumption.test.ts +3 -6
  379. package/packages/omo-codex/plugin/components/rules/test/scanner.test.ts +1 -2
  380. package/packages/omo-codex/plugin/components/rules/test/sources.test.ts +2 -5
  381. package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +2 -17
  382. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  383. package/packages/omo-codex/plugin/components/teammode/package.json +5 -5
  384. package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +4 -10
  385. package/packages/omo-codex/plugin/components/telemetry/AGENTS.md +8 -0
  386. package/packages/omo-codex/plugin/components/telemetry/biome.json +2 -2
  387. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +2407 -684
  388. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +2411 -689
  389. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  390. package/packages/omo-codex/plugin/components/telemetry/package.json +5 -5
  391. package/packages/omo-codex/plugin/components/telemetry/src/codex-hook.ts +1 -4
  392. package/packages/omo-codex/plugin/components/telemetry/src/posthog.ts +4 -14
  393. package/packages/omo-codex/plugin/components/telemetry/src/product-identity.ts +1 -1
  394. package/packages/omo-codex/plugin/components/telemetry/test/diagnostics.test.ts +2 -5
  395. package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +10 -4
  396. package/packages/omo-codex/plugin/components/ultrawork/README.md +2 -0
  397. package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +1 -1
  398. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-clone-fidelity-reviewer.toml +1 -1
  399. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-code-reviewer.toml +1 -1
  400. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-gate-reviewer.toml +1 -1
  401. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-qa-executor.toml +1 -1
  402. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-high.toml +1 -1
  403. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-low.toml +1 -1
  404. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-medium.toml +1 -1
  405. package/packages/omo-codex/plugin/components/ultrawork/agents/librarian.toml +1 -1
  406. package/packages/omo-codex/plugin/components/ultrawork/agents/metis.toml +1 -1
  407. package/packages/omo-codex/plugin/components/ultrawork/agents/momus.toml +1 -1
  408. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +1 -1
  409. package/packages/omo-codex/plugin/components/ultrawork/biome.json +2 -2
  410. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +499 -4
  411. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  412. package/packages/omo-codex/plugin/components/ultrawork/package.json +5 -6
  413. package/packages/omo-codex/plugin/components/ultrawork/scripts/sync-directive.mjs +30 -14
  414. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +6 -7
  415. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +31 -7
  416. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-clear.md +2 -1
  417. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +5 -5
  418. package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +4 -0
  419. package/packages/omo-codex/plugin/components/ultrawork/src/directive.ts +5 -2
  420. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook-trigger-policy.test.ts +9 -1
  421. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +0 -136
  422. package/packages/omo-codex/plugin/components/ultrawork/test/directive-source.test.ts +14 -8
  423. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +12 -1
  424. package/packages/omo-codex/plugin/components/ultrawork/test/skill-pointer.test.ts +0 -2
  425. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/AGENTS.md +4 -4
  426. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/NOTICE +1 -1
  427. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/README.md +6 -6
  428. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/biome.json +2 -2
  429. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/directive.md +10 -10
  430. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/dist/cli.js +16 -16
  431. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +16 -0
  432. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/package.json +12 -12
  433. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/boulder-reader.ts +1 -1
  434. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/cli.ts +1 -1
  435. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/codex-hook.ts +4 -4
  436. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/directive.ts +1 -1
  437. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/index.ts +1 -1
  438. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/types.ts +1 -1
  439. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/boulder-reader.test.ts +3 -3
  440. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/cli.test.ts +4 -11
  441. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/codex-hook.test.ts +24 -22
  442. package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +19 -0
  443. package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +3 -1
  444. package/packages/omo-codex/plugin/components/ulw-loop/README.md +12 -1
  445. package/packages/omo-codex/plugin/components/ulw-loop/biome.json +2 -2
  446. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +46 -24
  447. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.d.ts +16 -0
  448. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.js +25 -0
  449. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-continuation.js +10 -4
  450. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.d.ts +2 -5
  451. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.js +5 -78
  452. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.d.ts +12 -0
  453. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.js +114 -0
  454. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.d.ts +7 -1
  455. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +50 -42
  456. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-arg-parser.js +2 -2
  457. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.js +21 -8
  458. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +2 -1
  459. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +12 -1
  460. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.d.ts +1 -1
  461. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.js +40 -37
  462. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +1468 -535
  463. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.d.ts +2 -0
  464. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +28 -8
  465. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.d.ts +2 -5
  466. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.js +24 -20
  467. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.d.ts +1 -0
  468. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.js +1 -0
  469. package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +17 -9
  470. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.d.ts +1 -0
  471. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +13 -4
  472. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.d.ts +1 -0
  473. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +34 -4
  474. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.d.ts +14 -0
  475. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.js +29 -0
  476. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.d.ts +7 -0
  477. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.js +9 -0
  478. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.d.ts +12 -0
  479. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.js +104 -0
  480. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.d.ts +13 -1
  481. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.js +65 -9
  482. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.js +5 -1
  483. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.d.ts +4 -2
  484. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +72 -117
  485. package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.d.ts +2 -0
  486. package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.js +16 -7
  487. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/factory.d.ts +2 -0
  488. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/factory.js +141 -0
  489. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/manifest.d.ts +46 -0
  490. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/manifest.js +28 -0
  491. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/types.d.ts +127 -0
  492. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/types.js +1 -0
  493. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk.d.ts +3 -0
  494. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk.js +3 -0
  495. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.d.ts +7 -1
  496. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +216 -33
  497. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-role-guard.d.ts +2 -0
  498. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-role-guard.js +22 -0
  499. package/packages/omo-codex/plugin/components/ulw-loop/dist/state-lock.d.ts +9 -0
  500. package/packages/omo-codex/plugin/components/ulw-loop/dist/state-lock.js +227 -0
  501. package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.d.ts +6 -0
  502. package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.js +33 -0
  503. package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +20 -6
  504. package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.d.ts +19 -0
  505. package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.js +75 -0
  506. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +18 -5
  507. package/packages/omo-codex/plugin/components/ulw-loop/package.json +6 -6
  508. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +10 -4
  509. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/define-goal.md +108 -0
  510. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +32 -8
  511. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-codex-validation.ts +40 -0
  512. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-continuation.ts +8 -6
  513. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-reconciliation.ts +5 -98
  514. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-template.ts +134 -0
  515. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +52 -73
  516. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-arg-parser.ts +10 -4
  517. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +24 -8
  518. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts +14 -1
  519. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-subcommands.ts +52 -46
  520. package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +8 -6
  521. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +35 -7
  522. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-snapshot.ts +34 -28
  523. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +3 -1
  524. package/packages/omo-codex/plugin/components/ulw-loop/src/constants.ts +1 -0
  525. package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +19 -9
  526. package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +25 -4
  527. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts +39 -4
  528. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-missing-recovery.ts +38 -0
  529. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-aggregate.ts +11 -0
  530. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-artifacts.ts +123 -0
  531. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-fields.ts +71 -15
  532. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-verdicts.ts +6 -1
  533. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +92 -136
  534. package/packages/omo-codex/plugin/components/ulw-loop/src/review-blockers.ts +29 -8
  535. package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/factory.ts +183 -0
  536. package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/manifest.ts +42 -0
  537. package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/types.ts +140 -0
  538. package/packages/omo-codex/plugin/components/ulw-loop/src/sdk.ts +3 -0
  539. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +226 -31
  540. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-role-guard.ts +22 -0
  541. package/packages/omo-codex/plugin/components/ulw-loop/src/state-lock.ts +239 -0
  542. package/packages/omo-codex/plugin/components/ulw-loop/src/status-next-actions.ts +36 -0
  543. package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +19 -6
  544. package/packages/omo-codex/plugin/components/ulw-loop/src/surface.ts +107 -0
  545. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-continuation.test.ts +0 -1
  546. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-final.test.ts +131 -82
  547. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-template.test.ts +147 -0
  548. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint.test.ts +16 -22
  549. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-checkpoint-continuation.test.ts +4 -2
  550. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-checkpoint.test.ts +31 -2
  551. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-commands.test.ts +2 -0
  552. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-complete-goals.test.ts +3 -1
  553. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-create-goals.test.ts +35 -8
  554. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +38 -4
  555. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-json-errors.test.ts +27 -0
  556. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-scope-required.test.ts +144 -0
  557. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-status-next-actions.test.ts +185 -0
  558. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering-batch.test.ts +8 -3
  559. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-validation-batch.test.ts +6 -0
  560. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +37 -2
  561. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-snapshot.test.ts +52 -11
  562. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +0 -3
  563. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/cli-session.ts +4 -0
  564. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/quality-gate-builder.ts +9 -4
  565. package/packages/omo-codex/plugin/components/ulw-loop/test/guided-recovery.test.ts +67 -0
  566. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +5 -37
  567. package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +9 -0
  568. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io-cross-process.test.ts +106 -0
  569. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io.test.ts +36 -2
  570. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-aggregate-basics.test.ts +258 -0
  571. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-cap-and-dedupe.test.ts +22 -0
  572. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-fields-messages.test.ts +98 -0
  573. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-lazycodex-surface.test.ts +93 -0
  574. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-poisoning-cascades.test.ts +97 -0
  575. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-roles.test.ts +51 -2
  576. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-senpi-surface.test.ts +131 -0
  577. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-single-report.test.ts +241 -0
  578. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +58 -3
  579. package/packages/omo-codex/plugin/components/ulw-loop/test/review-blockers.test.ts +9 -7
  580. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-contract.test.ts +137 -0
  581. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-driver-states.test.ts +145 -0
  582. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-session-context.test.ts +148 -0
  583. package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +450 -7
  584. package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-role-matrix.test.ts +113 -0
  585. package/packages/omo-codex/plugin/components/ulw-loop/test/state-lock.test.ts +218 -0
  586. package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +8 -5
  587. package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +1 -1
  588. package/packages/omo-codex/plugin/components/ulw-loop/test/surface.test.ts +74 -0
  589. package/packages/omo-codex/plugin/components/ulw-loop/test/ultrawork-directive.test.ts +13 -8
  590. package/packages/omo-codex/plugin/components/ulw-loop/vitest.config.ts +1 -0
  591. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  592. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  593. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  594. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  595. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  596. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  597. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  598. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +18 -0
  599. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  600. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  601. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  602. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  603. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  604. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  605. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  606. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +17 -0
  607. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  608. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  609. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  610. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  611. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  612. package/packages/omo-codex/plugin/model-catalog.json +16 -7
  613. package/packages/omo-codex/plugin/package-lock.json +676 -524
  614. package/packages/omo-codex/plugin/package.json +2 -3
  615. package/packages/omo-codex/plugin/scripts/AGENTS.md +39 -0
  616. package/packages/omo-codex/plugin/scripts/auto-update-plan.mjs +1 -2
  617. package/packages/omo-codex/plugin/scripts/auto-update.mjs +0 -9
  618. package/packages/omo-codex/plugin/scripts/canonical-ultrawork-directive.mjs +17 -0
  619. package/packages/omo-codex/plugin/scripts/hook-status-message.mjs +0 -1
  620. package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +16 -7
  621. package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +8 -4
  622. package/packages/omo-codex/plugin/scripts/migrate-codex-config/subagent-limit-guard.mjs +19 -90
  623. package/packages/omo-codex/plugin/scripts/migrate-codex-config/toml-section-editor.mjs +1 -1
  624. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +96 -57
  625. package/packages/omo-codex/plugin/shared/package.json +3 -4
  626. package/packages/omo-codex/plugin/shared/src/config-loader.ts +2 -102
  627. package/packages/omo-codex/plugin/shared/src/config-migration.ts +0 -1
  628. package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +41 -130
  629. package/packages/omo-codex/plugin/skills/ast-grep/AGENTS.md +51 -0
  630. package/packages/omo-codex/plugin/skills/ast-grep/SKILL.md +1 -1
  631. package/packages/omo-codex/plugin/skills/coding-agent-sessions/AGENTS.md +62 -0
  632. package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +1 -1
  633. package/packages/omo-codex/plugin/skills/data-scientist/SKILL.md +99 -239
  634. package/packages/omo-codex/plugin/skills/data-scientist/references/execution-surfaces.md +91 -0
  635. package/packages/omo-codex/plugin/skills/data-scientist/references/placement.md +74 -0
  636. package/packages/omo-codex/plugin/skills/data-scientist/references/polars-lane.md +95 -0
  637. package/packages/omo-codex/plugin/skills/data-scientist/references/uv-setup.md +1 -1
  638. package/packages/omo-codex/plugin/skills/data-scientist/references/visualization.md +64 -0
  639. package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
  640. package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
  641. package/packages/omo-codex/plugin/skills/debugging/SKILL.md +3 -1
  642. package/packages/omo-codex/plugin/skills/debugging/references/methodology/00-setup.md +12 -0
  643. package/packages/omo-codex/plugin/skills/debugging/references/methodology/02-investigate.md +21 -0
  644. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/go.md +15 -1
  645. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/native-binary.md +38 -0
  646. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/node.md +25 -0
  647. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/python.md +13 -0
  648. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/rust.md +41 -0
  649. package/packages/omo-codex/plugin/skills/debugging/references/scripts/dap.mjs +267 -0
  650. package/packages/omo-codex/plugin/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
  651. package/packages/omo-codex/plugin/skills/debugging/references/tools/dap.md +103 -0
  652. package/packages/omo-codex/plugin/skills/debugging/references/tools/frida.md +193 -0
  653. package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +10 -0
  654. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +15 -8
  655. package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +10 -2
  656. package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +2 -0
  657. package/packages/omo-codex/plugin/skills/frontend/references/design/ambience-skill.md +145 -0
  658. package/packages/omo-codex/plugin/skills/frontend/references/design/interaction-skill.md +2 -0
  659. package/packages/omo-codex/plugin/skills/frontend/references/design/print-paged-media.md +76 -0
  660. package/packages/omo-codex/plugin/skills/frontend/references/design/stylegallery.md +80 -0
  661. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/README.md +1 -1
  662. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
  663. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
  664. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
  665. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/orchestration.md +1 -1
  666. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/routing.md +5 -5
  667. package/packages/omo-codex/plugin/skills/git-master/SKILL.md +1 -1
  668. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +20 -18
  669. package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +4 -2
  670. package/packages/omo-codex/plugin/skills/lsp-setup/SKILL.md +1 -1
  671. package/packages/omo-codex/plugin/skills/programming/SKILL.md +1 -1
  672. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +10 -8
  673. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +7 -5
  674. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +116 -424
  675. package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +38 -11
  676. package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +26 -9
  677. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +110 -0
  678. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +1 -1
  679. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +23 -18
  680. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +9 -2
  681. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +46 -24
  682. package/packages/omo-codex/plugin/skills/{start-work → ulw-execute}/SKILL.md +31 -33
  683. package/packages/omo-codex/plugin/skills/ulw-execute/agents/openai.yaml +2 -0
  684. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +34 -4
  685. package/packages/omo-codex/plugin/skills/ulw-loop/references/define-goal.md +108 -0
  686. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +32 -8
  687. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +6 -7
  688. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +31 -7
  689. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-clear.md +2 -1
  690. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +5 -5
  691. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +14 -7
  692. package/packages/omo-codex/plugin/skills/visual-qa/AGENTS.md +58 -0
  693. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +10 -7
  694. package/packages/omo-codex/plugin/test/AGENTS.md +47 -0
  695. package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +19 -173
  696. package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +16 -51
  697. package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +2 -3
  698. package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +2 -7
  699. package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +14 -4
  700. package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +175 -13
  701. package/packages/omo-codex/plugin/test/aggregate.test.mjs +78 -2
  702. package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +19 -33
  703. package/packages/omo-codex/plugin/test/auto-update.test.mjs +4 -29
  704. package/packages/omo-codex/plugin/test/bootstrap-default-role.test.mjs +66 -0
  705. package/packages/omo-codex/plugin/test/bootstrap-setup.test.mjs +0 -31
  706. package/packages/omo-codex/plugin/test/canonical-ultrawork-directive.test.mjs +53 -0
  707. package/packages/omo-codex/plugin/test/component-bin-names.test.mjs +2 -2
  708. package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +1 -51
  709. package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +100 -2
  710. package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +5 -6
  711. package/packages/omo-codex/plugin/test/lcx-contribute-bug-fix-template.test.mjs +21 -27
  712. package/packages/omo-codex/plugin/test/mcp-research-servers.test.mjs +1 -3
  713. package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +35 -35
  714. package/packages/omo-codex/plugin/test/multi-agent-v2-regression.test.mjs +1 -1
  715. package/packages/omo-codex/plugin/test/scaffold-plan.test.mjs +0 -36
  716. package/packages/omo-codex/plugin/test/subagent-limit-migration.test.mjs +107 -15
  717. package/packages/omo-codex/plugin/test/sync-skills-codex-compatibility.test.mjs +168 -0
  718. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +54 -24
  719. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +18 -119
  720. package/packages/omo-codex/plugin/test/teammode-archive-ambiguity.test.mjs +0 -40
  721. package/packages/omo-codex/plugin/test/teammode-communication.test.mjs +6 -62
  722. package/packages/omo-codex/plugin/test/teammode-thread-links.test.mjs +3 -36
  723. package/packages/omo-codex/plugin/test/teammode-transport.test.mjs +0 -44
  724. package/packages/omo-codex/plugin/test/teammode-worktree.test.mjs +2 -6
  725. package/packages/omo-codex/plugin/test/ultrawork-skill-pointer.test.mjs +5 -5
  726. package/packages/omo-codex/plugin/test/ulw-plan-review-state-contract.test.mjs +0 -3
  727. package/packages/omo-codex/scripts/AGENTS.md +36 -0
  728. package/packages/omo-codex/scripts/check-model-catalog-parity.mjs +42 -0
  729. package/packages/omo-codex/scripts/install-cache-copy.test.mjs +27 -1
  730. package/packages/omo-codex/scripts/install-config-autonomous-features.test.mjs +1 -1
  731. package/packages/omo-codex/scripts/install-config-autonomous.test.mjs +2 -1
  732. package/packages/omo-codex/scripts/install-config-git-bash.test.mjs +0 -23
  733. package/packages/omo-codex/scripts/install-config-reasoning.test.mjs +5 -5
  734. package/packages/omo-codex/scripts/install-config.test.mjs +15 -17
  735. package/packages/omo-codex/scripts/install-dist/install-local.mjs +9652 -1394
  736. package/packages/omo-codex/scripts/install-generated-bundle.test.mjs +3 -4
  737. package/packages/omo-codex/scripts/install-git-bash-mcp-env.test.mjs +1 -25
  738. package/packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs +7 -2
  739. package/packages/omo-codex/scripts/install-mcp-runtime.test.mjs +0 -36
  740. package/packages/omo-codex/scripts/install-packaged-local.test.mjs +1 -6
  741. package/packages/{omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md → prompts-core/prompts/ultrawork/codex.md} +46 -31
  742. package/packages/shared-skills/package.json +7 -1
  743. package/packages/shared-skills/skill-source-filter.d.ts +16 -0
  744. package/packages/shared-skills/skill-source-filter.mjs +44 -0
  745. package/packages/shared-skills/skills/ast-grep/AGENTS.md +51 -0
  746. package/packages/shared-skills/skills/ast-grep/SKILL.md +1 -1
  747. package/packages/shared-skills/skills/coding-agent-sessions/AGENTS.md +62 -0
  748. package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +1 -1
  749. package/packages/shared-skills/skills/data-scientist/SKILL.md +99 -239
  750. package/packages/shared-skills/skills/data-scientist/references/execution-surfaces.md +91 -0
  751. package/packages/shared-skills/skills/data-scientist/references/placement.md +74 -0
  752. package/packages/shared-skills/skills/data-scientist/references/polars-lane.md +95 -0
  753. package/packages/shared-skills/skills/data-scientist/references/uv-setup.md +1 -1
  754. package/packages/shared-skills/skills/data-scientist/references/visualization.md +64 -0
  755. package/packages/shared-skills/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
  756. package/packages/shared-skills/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
  757. package/packages/shared-skills/skills/debugging/SKILL.md +3 -1
  758. package/packages/shared-skills/skills/debugging/references/methodology/00-setup.md +12 -0
  759. package/packages/shared-skills/skills/debugging/references/methodology/02-investigate.md +21 -0
  760. package/packages/shared-skills/skills/debugging/references/runtimes/go.md +15 -1
  761. package/packages/shared-skills/skills/debugging/references/runtimes/native-binary.md +38 -0
  762. package/packages/shared-skills/skills/debugging/references/runtimes/node.md +25 -0
  763. package/packages/shared-skills/skills/debugging/references/runtimes/python.md +13 -0
  764. package/packages/shared-skills/skills/debugging/references/runtimes/rust.md +41 -0
  765. package/packages/shared-skills/skills/debugging/references/scripts/dap.mjs +267 -0
  766. package/packages/shared-skills/skills/debugging/references/scripts/dap.test.ts +86 -0
  767. package/packages/shared-skills/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
  768. package/packages/shared-skills/skills/debugging/references/tools/dap.md +103 -0
  769. package/packages/shared-skills/skills/debugging/references/tools/frida.md +193 -0
  770. package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +10 -0
  771. package/packages/shared-skills/skills/frontend/SKILL.md +15 -8
  772. package/packages/shared-skills/skills/frontend/references/design/README.md +10 -2
  773. package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +2 -0
  774. package/packages/shared-skills/skills/frontend/references/design/ambience-skill.md +145 -0
  775. package/packages/shared-skills/skills/frontend/references/design/interaction-skill.md +2 -0
  776. package/packages/shared-skills/skills/frontend/references/design/print-paged-media.md +76 -0
  777. package/packages/shared-skills/skills/frontend/references/design/stylegallery.md +80 -0
  778. package/packages/shared-skills/skills/frontend/references/designpowers/README.md +1 -1
  779. package/packages/shared-skills/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
  780. package/packages/shared-skills/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
  781. package/packages/shared-skills/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
  782. package/packages/shared-skills/skills/frontend/references/designpowers/orchestration.md +1 -1
  783. package/packages/shared-skills/skills/frontend/references/designpowers/routing.md +5 -5
  784. package/packages/shared-skills/skills/git-master/SKILL.md +1 -1
  785. package/packages/shared-skills/skills/init-deep/SKILL.md +14 -14
  786. package/packages/shared-skills/skills/lsp-setup/SKILL.md +1 -1
  787. package/packages/shared-skills/skills/programming/SKILL.md +1 -1
  788. package/packages/shared-skills/skills/refactor/SKILL.md +4 -4
  789. package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +1 -1
  790. package/packages/shared-skills/skills/review-work/SKILL.md +101 -419
  791. package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +38 -11
  792. package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +26 -9
  793. package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +110 -0
  794. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +1 -1
  795. package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +23 -18
  796. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +9 -2
  797. package/packages/shared-skills/skills/{start-work → ulw-execute}/SKILL.md +20 -19
  798. package/packages/shared-skills/skills/ulw-plan/SKILL.md +7 -8
  799. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +31 -7
  800. package/packages/shared-skills/skills/ulw-plan/references/intent-clear.md +2 -1
  801. package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +5 -5
  802. package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -1
  803. package/packages/shared-skills/skills/ulw-research/SKILL.md +8 -3
  804. package/packages/shared-skills/skills/visual-qa/AGENTS.md +58 -0
  805. package/packages/shared-skills/skills/visual-qa/SKILL.md +4 -3
  806. package/postinstall.mjs +2 -0
  807. package/script/qa/web-terminal-visual-qa.mjs +2 -0
  808. package/script/qa/xterm-live-terminal.mjs +18 -2
  809. package/dist/config/schema/codegraph.d.ts +0 -12
  810. package/dist/config/schema/start-work.d.ts +0 -5
  811. package/dist/features/builtin-commands/templates/start-work.d.ts +0 -1
  812. package/dist/features/builtin-skills/index.d.ts +0 -1
  813. package/dist/features/builtin-skills/skill-file-loader.d.ts +0 -1
  814. package/dist/features/builtin-skills/skills/agent-browser-skill.d.ts +0 -1
  815. package/dist/features/builtin-skills/skills/agent-browser-template.d.ts +0 -1
  816. package/dist/features/builtin-skills/skills/debugging.d.ts +0 -1
  817. package/dist/features/builtin-skills/skills/dev-browser.d.ts +0 -1
  818. package/dist/features/builtin-skills/skills/frontend.d.ts +0 -1
  819. package/dist/features/builtin-skills/skills/git-master-sections/commit-atomic-planning.d.ts +0 -1
  820. package/dist/features/builtin-skills/skills/git-master-sections/commit-context-analysis.d.ts +0 -1
  821. package/dist/features/builtin-skills/skills/git-master-sections/commit-execution-verification.d.ts +0 -1
  822. package/dist/features/builtin-skills/skills/git-master-sections/commit-workflow.d.ts +0 -1
  823. package/dist/features/builtin-skills/skills/git-master-sections/history-search-workflow.d.ts +0 -1
  824. package/dist/features/builtin-skills/skills/git-master-sections/overview.d.ts +0 -1
  825. package/dist/features/builtin-skills/skills/git-master-sections/quick-reference.d.ts +0 -1
  826. package/dist/features/builtin-skills/skills/git-master-sections/rebase-workflow.d.ts +0 -1
  827. package/dist/features/builtin-skills/skills/git-master-skill-metadata.d.ts +0 -1
  828. package/dist/features/builtin-skills/skills/git-master.d.ts +0 -1
  829. package/dist/features/builtin-skills/skills/index.d.ts +0 -1
  830. package/dist/features/builtin-skills/skills/init-deep.d.ts +0 -1
  831. package/dist/features/builtin-skills/skills/playwright-cli.d.ts +0 -1
  832. package/dist/features/builtin-skills/skills/playwright-mcp-skill.d.ts +0 -1
  833. package/dist/features/builtin-skills/skills/playwright.d.ts +0 -1
  834. package/dist/features/builtin-skills/skills/remove-ai-slops.d.ts +0 -1
  835. package/dist/features/builtin-skills/skills/review-work.d.ts +0 -1
  836. package/dist/features/builtin-skills/skills/security-research.d.ts +0 -1
  837. package/dist/features/builtin-skills/skills/security-review.d.ts +0 -1
  838. package/dist/features/builtin-skills/skills/team-mode.d.ts +0 -1
  839. package/dist/features/builtin-skills/skills/visual-qa.d.ts +0 -1
  840. package/dist/features/builtin-skills/skills.d.ts +0 -1
  841. package/dist/features/builtin-skills/types.d.ts +0 -1
  842. package/dist/features/claude-code-plugin-loader/agent-loader.d.ts +0 -1
  843. package/dist/features/claude-code-plugin-loader/command-loader.d.ts +0 -1
  844. package/dist/features/claude-code-plugin-loader/discovery-core.d.ts +0 -1
  845. package/dist/features/claude-code-plugin-loader/discovery-paths.d.ts +0 -1
  846. package/dist/features/claude-code-plugin-loader/discovery.d.ts +0 -1
  847. package/dist/features/claude-code-plugin-loader/hook-loader.d.ts +0 -1
  848. package/dist/features/claude-code-plugin-loader/index.d.ts +0 -1
  849. package/dist/features/claude-code-plugin-loader/install-path-resolver.d.ts +0 -1
  850. package/dist/features/claude-code-plugin-loader/installed-plugin-database.d.ts +0 -1
  851. package/dist/features/claude-code-plugin-loader/loaded-plugin.d.ts +0 -1
  852. package/dist/features/claude-code-plugin-loader/loader.d.ts +0 -1
  853. package/dist/features/claude-code-plugin-loader/mcp-server-loader.d.ts +0 -1
  854. package/dist/features/claude-code-plugin-loader/plugin-key.d.ts +0 -1
  855. package/dist/features/claude-code-plugin-loader/plugin-manifest.d.ts +0 -1
  856. package/dist/features/claude-code-plugin-loader/plugin-path-resolver.d.ts +0 -1
  857. package/dist/features/claude-code-plugin-loader/plugin-settings.d.ts +0 -1
  858. package/dist/features/claude-code-plugin-loader/scope-filter.d.ts +0 -1
  859. package/dist/features/claude-code-plugin-loader/skill-loader.d.ts +0 -1
  860. package/dist/features/claude-code-plugin-loader/types.d.ts +0 -1
  861. package/dist/hooks/codegraph-bootstrap/command-runner.d.ts +0 -17
  862. package/dist/hooks/codegraph-bootstrap/hook.d.ts +0 -35
  863. package/dist/hooks/codegraph-bootstrap/index.d.ts +0 -1
  864. package/dist/hooks/codegraph-bootstrap/project-root.d.ts +0 -1
  865. package/dist/hooks/codegraph-bootstrap/status.d.ts +0 -11
  866. package/dist/hooks/ralph-loop/completion-promise-detector-test-input.d.ts +0 -11
  867. package/dist/hooks/ralph-loop/loop-session-recovery.d.ts +0 -7
  868. package/dist/hooks/start-work/start-work-hook.d.ts +0 -23
  869. package/dist/mcp/codegraph.d.ts +0 -16
  870. package/dist/plugin/chat-message/start-work-message.d.ts +0 -5
  871. package/dist/shared/prompt-async-gate/message-inspection-error.d.ts +0 -1
  872. package/dist/shared/prompt-async-gate/pending-tool-turn.d.ts +0 -1
  873. package/dist/shared/prompt-async-gate/prompt-message-state.d.ts +0 -1
  874. package/dist/shared/prompt-async-gate/queue.d.ts +0 -1
  875. package/dist/shared/prompt-async-gate/recent-dispatches.d.ts +0 -1
  876. package/dist/shared/prompt-async-gate/reservations.d.ts +0 -1
  877. package/dist/shared/prompt-async-gate/semantic-dedupe.d.ts +0 -1
  878. package/dist/shared/prompt-async-gate/session-idle-dispatch.d.ts +0 -1
  879. package/dist/shared/prompt-async-gate/timing.d.ts +0 -1
  880. package/dist/shared/prompt-async-gate/types.d.ts +0 -1
  881. package/dist/skills/data-scientist/references/common-scenarios.md +0 -176
  882. package/dist/skills/data-scientist/references/execution-templates.md +0 -197
  883. package/dist/skills/data-scientist/references/integration-patterns.md +0 -153
  884. package/dist/skills/data-scientist/references/performance-benchmarks.md +0 -37
  885. package/dist/tools/call-omo-agent/background-agent-executor.d.ts +0 -5
  886. package/dist/tools/call-omo-agent/message-storage-directory.d.ts +0 -1
  887. package/dist/tools/delegate-task/anthropic-categories.d.ts +0 -2
  888. package/dist/tools/delegate-task/model-string-parser.d.ts +0 -1
  889. package/packages/lsp-tools-mcp/dist/lsp/cleanup-errors.d.ts +0 -1
  890. package/packages/lsp-tools-mcp/dist/lsp/constants.d.ts +0 -1
  891. package/packages/lsp-tools-mcp/dist/lsp/language-mappings.d.ts +0 -1
  892. package/packages/lsp-tools-mcp/dist/lsp/process-signal-cleanup.d.ts +0 -1
  893. package/packages/lsp-tools-mcp/dist/missing-dependency-result.d.ts +0 -1
  894. package/packages/omo-codex/plugin/components/codegraph/AGENTS.md +0 -58
  895. package/packages/omo-codex/plugin/components/codegraph/NODE-RUNTIME-LICENSES.md +0 -2951
  896. package/packages/omo-codex/plugin/components/codegraph/NOTICE +0 -16
  897. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +0 -12149
  898. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +0 -9747
  899. package/packages/omo-codex/plugin/components/codegraph/package.json +0 -33
  900. package/packages/omo-codex/plugin/components/codegraph/src/cache-gc.ts +0 -29
  901. package/packages/omo-codex/plugin/components/codegraph/src/cli.ts +0 -79
  902. package/packages/omo-codex/plugin/components/codegraph/src/hook-input.ts +0 -33
  903. package/packages/omo-codex/plugin/components/codegraph/src/hook-sweep.ts +0 -25
  904. package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +0 -131
  905. package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +0 -258
  906. package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +0 -309
  907. package/packages/omo-codex/plugin/components/codegraph/src/mcp-unavailable.ts +0 -80
  908. package/packages/omo-codex/plugin/components/codegraph/src/post-tool-use-hook.ts +0 -34
  909. package/packages/omo-codex/plugin/components/codegraph/src/serve-invocation.ts +0 -29
  910. package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +0 -263
  911. package/packages/omo-codex/plugin/components/codegraph/src/session-start-command.ts +0 -106
  912. package/packages/omo-codex/plugin/components/codegraph/src/session-start-cooldown.ts +0 -145
  913. package/packages/omo-codex/plugin/components/codegraph/src/session-start-hook-runtime.ts +0 -21
  914. package/packages/omo-codex/plugin/components/codegraph/src/session-start-lock.ts +0 -139
  915. package/packages/omo-codex/plugin/components/codegraph/src/session-start-outcome.ts +0 -15
  916. package/packages/omo-codex/plugin/components/codegraph/src/session-start-paths.ts +0 -32
  917. package/packages/omo-codex/plugin/components/codegraph/src/session-start-project.ts +0 -109
  918. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker-result.ts +0 -148
  919. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +0 -175
  920. package/packages/omo-codex/plugin/components/codegraph/src/sweep-cli.ts +0 -81
  921. package/packages/omo-codex/plugin/components/codegraph/test/cache-gc.test.ts +0 -34
  922. package/packages/omo-codex/plugin/components/codegraph/test/hook-exclusion.test.ts +0 -112
  923. package/packages/omo-codex/plugin/components/codegraph/test/hook-registration.test.ts +0 -26
  924. package/packages/omo-codex/plugin/components/codegraph/test/hook-session-start-guard.test.ts +0 -160
  925. package/packages/omo-codex/plugin/components/codegraph/test/hook-store-upgrade.test.ts +0 -50
  926. package/packages/omo-codex/plugin/components/codegraph/test/hook-sweep.test.ts +0 -29
  927. package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +0 -320
  928. package/packages/omo-codex/plugin/components/codegraph/test/mcp-bridge-fixtures.ts +0 -172
  929. package/packages/omo-codex/plugin/components/codegraph/test/package-runtime.test.ts +0 -91
  930. package/packages/omo-codex/plugin/components/codegraph/test/provisioned-node-guard.test.ts +0 -100
  931. package/packages/omo-codex/plugin/components/codegraph/test/serve-built-wrapper.test.ts +0 -76
  932. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge-lifecycle.test.ts +0 -133
  933. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +0 -245
  934. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-facade.test.ts +0 -69
  935. package/packages/omo-codex/plugin/components/codegraph/test/serve-node-support.test.ts +0 -43
  936. package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +0 -147
  937. package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable.test.ts +0 -175
  938. package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +0 -385
  939. package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts +0 -206
  940. package/packages/omo-codex/plugin/components/codegraph/test/session-start-project.test.ts +0 -58
  941. package/packages/omo-codex/plugin/components/codegraph/test/session-start-state.test.ts +0 -104
  942. package/packages/omo-codex/plugin/components/codegraph/test/session-start-trust-boundary.test.ts +0 -65
  943. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-availability.test.ts +0 -106
  944. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-cooldown.test.ts +0 -116
  945. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +0 -258
  946. package/packages/omo-codex/plugin/components/codegraph/test/sweep-cli.test.ts +0 -56
  947. package/packages/omo-codex/plugin/components/codegraph/tsconfig.build.json +0 -13
  948. package/packages/omo-codex/plugin/components/codegraph/tsconfig.json +0 -25
  949. package/packages/omo-codex/plugin/components/start-work-continuation/LICENSE +0 -21
  950. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +0 -28
  951. package/packages/omo-codex/plugin/components/ultrawork/directive.md +0 -471
  952. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +0 -18
  953. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +0 -17
  954. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +0 -17
  955. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +0 -17
  956. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/editor.mjs +0 -125
  957. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/jsonc.mjs +0 -43
  958. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/scaffold.mjs +0 -29
  959. package/packages/omo-codex/plugin/scripts/migrate-omo-sot.mjs +0 -121
  960. package/packages/omo-codex/plugin/skills/data-scientist/references/common-scenarios.md +0 -176
  961. package/packages/omo-codex/plugin/skills/data-scientist/references/execution-templates.md +0 -197
  962. package/packages/omo-codex/plugin/skills/data-scientist/references/integration-patterns.md +0 -153
  963. package/packages/omo-codex/plugin/skills/data-scientist/references/performance-benchmarks.md +0 -37
  964. package/packages/omo-codex/plugin/skills/start-work/agents/openai.yaml +0 -2
  965. package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +0 -92
  966. package/packages/omo-codex/plugin/test/component-codegraph-mcp-smoke.test.mjs +0 -76
  967. package/packages/omo-codex/plugin/test/migrate-omo-sot.test.mjs +0 -179
  968. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +0 -314
  969. package/packages/omo-codex/plugin/test/ulw-plan-scope-contract.test.mjs +0 -24
  970. package/packages/shared-skills/skills/data-scientist/references/common-scenarios.md +0 -176
  971. package/packages/shared-skills/skills/data-scientist/references/execution-templates.md +0 -197
  972. package/packages/shared-skills/skills/data-scientist/references/integration-patterns.md +0 -153
  973. package/packages/shared-skills/skills/data-scientist/references/performance-benchmarks.md +0 -37
  974. /package/dist/hooks/{start-work → ulw-execute}/context-info-formatters.d.ts +0 -0
  975. /package/dist/hooks/{start-work → ulw-execute}/explicit-plan-context.d.ts +0 -0
  976. /package/dist/hooks/{start-work → ulw-execute}/notepad-scaffold.d.ts +0 -0
  977. /package/dist/hooks/{start-work → ulw-execute}/parse-user-request.d.ts +0 -0
  978. /package/dist/hooks/{start-work → ulw-execute}/plan-discovery-context.d.ts +0 -0
  979. /package/dist/hooks/{start-work → ulw-execute}/plan-selection.d.ts +0 -0
  980. /package/dist/hooks/{start-work → ulw-execute}/session-plan-affinity.d.ts +0 -0
  981. /package/dist/hooks/{start-work → ulw-execute}/work-initializer.d.ts +0 -0
  982. /package/dist/hooks/{start-work → ulw-execute}/worktree-block.d.ts +0 -0
  983. /package/dist/hooks/{start-work → ulw-execute}/worktree-detector.d.ts +0 -0
  984. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/.gitattributes +0 -0
  985. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/CHANGELOG.md +0 -0
  986. /package/packages/omo-codex/plugin/components/{codegraph → ulw-execute-continuation}/LICENSE +0 -0
  987. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/plan-checklist.ts +0 -0
  988. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-completed.json +0 -0
  989. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-mixed-platforms.json +0 -0
  990. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-single-codex-work.json +0 -0
  991. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-all-done.md +0 -0
  992. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-scaffold.md +0 -0
  993. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-nested-checkboxes.md +0 -0
  994. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-unchecked.md +0 -0
  995. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.build.json +0 -0
  996. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.json +0 -0
  997. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/vitest.config.ts +0 -0
@@ -1,6 +1,6 @@
1
1
  // ../lsp-core/src/lsp/client-wrapper.ts
2
- import { existsSync as existsSync9, realpathSync as realpathSync4, statSync as statSync3 } from "node:fs";
3
- import { basename as basename3, dirname as dirname6, join as join4, resolve as resolve7 } from "node:path";
2
+ import { existsSync as existsSync10, realpathSync as realpathSync5, statSync as statSync3 } from "node:fs";
3
+ import { basename as basename3, dirname as dirname8, join as join5, resolve as resolve8 } from "node:path";
4
4
 
5
5
  // ../lsp-core/src/request-context.ts
6
6
  import { AsyncLocalStorage } from "node:async_hooks";
@@ -9,18 +9,17 @@ import { homedir } from "node:os";
9
9
  import { basename, delimiter, dirname, isAbsolute, join, relative, resolve } from "node:path";
10
10
 
11
11
  class LspRequestContextParseError extends Error {
12
- code;
13
- name = "LspRequestContextParseError";
14
12
  constructor(code, message) {
15
13
  super(message);
16
14
  this.code = code;
15
+ this.name = "LspRequestContextParseError";
17
16
  }
18
17
  }
19
18
 
20
19
  class LspRequestContextUnavailableError extends Error {
21
- name = "LspRequestContextUnavailableError";
22
20
  constructor() {
23
21
  super("LSP request context is required. Standalone MCP startup must install one with runWithRequestContext(createStandaloneMcpRequestContext()).");
22
+ this.name = "LspRequestContextUnavailableError";
24
23
  }
25
24
  }
26
25
  var storage = new AsyncLocalStorage;
@@ -50,7 +49,7 @@ function contextEnv(key) {
50
49
  }
51
50
  function createStandaloneMcpRequestContext(input = {}) {
52
51
  const env = input.env ?? process.env;
53
- const cwd = canonicalCwd(input.cwd ?? process.cwd());
52
+ const cwd = canonicalCwd(input.cwd ?? env["LSP_TOOLS_MCP_CWD"] ?? process.cwd());
54
53
  const home = input.homeDir ?? homedir();
55
54
  const projectConfigPaths = translateProjectConfigEnv(env["LSP_TOOLS_MCP_PROJECT_CONFIG"], cwd);
56
55
  const userConfigPath = translateHomeConfigEnv(env["LSP_TOOLS_MCP_USER_CONFIG"], home, ".codex/lsp-client.json");
@@ -193,22 +192,15 @@ function effectiveExtension(filePath) {
193
192
 
194
193
  // ../lsp-core/src/lsp/errors.ts
195
194
  class LspConnectionClosedError extends Error {
196
- serverId;
197
- root;
198
- name = "LspConnectionClosedError";
199
195
  constructor(serverId, root, message) {
200
196
  super(message ?? `LSP connection closed for ${serverId} at ${root}`);
201
197
  this.serverId = serverId;
202
198
  this.root = root;
199
+ this.name = "LspConnectionClosedError";
203
200
  }
204
201
  }
205
202
 
206
203
  class LspProcessExitedError extends Error {
207
- serverId;
208
- root;
209
- exitCode;
210
- stderrTail;
211
- name = "LspProcessExitedError";
212
204
  constructor(serverId, root, exitCode, stderrTail) {
213
205
  const stderrSuffix = stderrTail ? `
214
206
  stderr tail: ${stderrTail}` : "";
@@ -217,46 +209,59 @@ stderr tail: ${stderrTail}` : "";
217
209
  this.root = root;
218
210
  this.exitCode = exitCode;
219
211
  this.stderrTail = stderrTail;
212
+ this.name = "LspProcessExitedError";
220
213
  }
221
214
  }
222
215
 
223
216
  class LspRequestTimeoutError extends Error {
224
- method;
225
- stderrTail;
226
- name = "LspRequestTimeoutError";
227
217
  constructor(method, stderrTail) {
228
218
  const stderrSuffix = stderrTail ? `
229
219
  recent stderr: ${stderrTail}` : "";
230
220
  super(`LSP request timeout (method: ${method})${stderrSuffix}`);
231
221
  this.method = method;
232
222
  this.stderrTail = stderrTail;
223
+ this.name = "LspRequestTimeoutError";
233
224
  }
234
225
  }
235
226
 
236
227
  class LspInvalidPathError extends Error {
237
- name = "LspInvalidPathError";
228
+ constructor() {
229
+ super(...arguments);
230
+ this.name = "LspInvalidPathError";
231
+ }
238
232
  }
239
233
 
240
234
  class LspServerLookupError extends Error {
241
- lookup;
242
- name = "LspServerLookupError";
243
235
  constructor(message, lookup) {
244
236
  super(message);
245
237
  this.lookup = lookup;
238
+ this.name = "LspServerLookupError";
246
239
  }
247
240
  }
248
241
 
249
242
  class LspServerInitializingError extends Error {
250
- originalError;
251
- name = "LspServerInitializingError";
252
243
  constructor(originalError) {
253
244
  super(`LSP server is still initializing. Please retry in a few seconds. Original error: ${originalError.message}`);
254
245
  this.originalError = originalError;
246
+ this.name = "LspServerInitializingError";
255
247
  }
256
248
  }
257
249
 
258
250
  class LspProcessSpawnError extends Error {
259
- name = "LspProcessSpawnError";
251
+ constructor() {
252
+ super(...arguments);
253
+ this.name = "LspProcessSpawnError";
254
+ }
255
+ }
256
+
257
+ class LspClientRespawnBudgetExceededError extends Error {
258
+ constructor(serverId, root, retryLimit) {
259
+ super(`LSP server ${serverId} at ${root} failed to stay alive; respawn budget exhausted ` + `(${retryLimit} consecutive dead generations). Retrying after the cooldown may succeed.`);
260
+ this.serverId = serverId;
261
+ this.root = root;
262
+ this.retryLimit = retryLimit;
263
+ this.name = "LspClientRespawnBudgetExceededError";
264
+ }
260
265
  }
261
266
  function isLspDeadConnectionError(err) {
262
267
  return err instanceof LspConnectionClosedError || err instanceof LspProcessExitedError;
@@ -279,6 +284,13 @@ import { pathToFileURL as pathToFileURL3 } from "node:url";
279
284
  // ../lsp-core/src/lsp/connection.ts
280
285
  import { pathToFileURL } from "node:url";
281
286
 
287
+ // ../lsp-core/src/lsp/timer-provider.ts
288
+ var realTimerProvider = {
289
+ now: () => Date.now(),
290
+ setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
291
+ clearTimeout: (handle) => clearTimeout(handle)
292
+ };
293
+
282
294
  // ../lsp-core/src/lsp/constants.ts
283
295
  var DEFAULT_MAX_REFERENCES = 200;
284
296
  var DEFAULT_MAX_SYMBOLS = 200;
@@ -287,9 +299,12 @@ var DEFAULT_MAX_DIRECTORY_FILES = 50;
287
299
  var REQUEST_TIMEOUT_MS = 15000;
288
300
  var INIT_TIMEOUT_MS = 60000;
289
301
  var IDLE_TIMEOUT_MS = 5 * 60000;
302
+ var MAX_RESIDENT_CLIENTS = 6;
290
303
  var REAPER_INTERVAL_MS = 60000;
291
304
  var STOP_HARD_KILL_TIMEOUT_MS = 5000;
292
305
  var STOP_SIGKILL_GRACE_MS = 1000;
306
+ var CLIENT_RESPAWN_RETRY_LIMIT = 2;
307
+ var CLIENT_RESPAWN_COOLDOWN_MS = 60000;
293
308
 
294
309
  // ../lsp-core/src/lsp/json-rpc-connection.ts
295
310
  var HEADER_SEPARATOR = `\r
@@ -301,20 +316,31 @@ var METHOD_NOT_FOUND = -32601;
301
316
  var INTERNAL_ERROR = -32603;
302
317
 
303
318
  class JsonRpcConnection {
304
- reader;
305
- writer;
306
- pendingRequests = new Map;
307
- notificationHandlers = new Map;
308
- requestHandlers = new Map;
309
- closeHandlers = [];
310
- errorHandlers = [];
311
- inputBuffer = Buffer.alloc(0);
312
- nextRequestId = 1;
313
- listening = false;
314
- disposed = false;
315
319
  constructor(reader, writer) {
316
320
  this.reader = reader;
317
321
  this.writer = writer;
322
+ this.pendingRequests = new Map;
323
+ this.notificationHandlers = new Map;
324
+ this.requestHandlers = new Map;
325
+ this.closeHandlers = [];
326
+ this.errorHandlers = [];
327
+ this.inputBuffer = Buffer.alloc(0);
328
+ this.nextRequestId = 1;
329
+ this.listening = false;
330
+ this.disposed = false;
331
+ this.handleData = (chunk) => {
332
+ const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf8");
333
+ this.inputBuffer = Buffer.concat([this.inputBuffer, chunkBuffer]);
334
+ this.drainInputBuffer();
335
+ };
336
+ this.handleClose = () => {
337
+ for (const handler of this.closeHandlers) {
338
+ handler();
339
+ }
340
+ };
341
+ this.handleStreamError = (error) => {
342
+ this.emitError(error);
343
+ };
318
344
  }
319
345
  listen() {
320
346
  if (this.listening)
@@ -349,7 +375,8 @@ class JsonRpcConnection {
349
375
  let cancelAfterWrite = false;
350
376
  let settled = false;
351
377
  const writeCancel = () => this.writeMessage({ jsonrpc: "2.0", method: "$/cancelRequest", params: { id } });
352
- const responsePromise = new Promise((resolve2, reject) => {
378
+ let rejectAfterCancelWrite;
379
+ const responsePromise = new Promise((resolve, reject) => {
353
380
  const cleanup = () => {
354
381
  options.signal?.removeEventListener("abort", onAbort);
355
382
  };
@@ -360,22 +387,26 @@ class JsonRpcConnection {
360
387
  this.pendingRequests.delete(key);
361
388
  cleanup();
362
389
  const rejectCancelled = () => reject(abortError(options.signal));
390
+ rejectAfterCancelWrite = async () => {
391
+ try {
392
+ await writeCancel();
393
+ } catch (error) {
394
+ this.emitError(toError(error));
395
+ }
396
+ rejectCancelled();
397
+ };
363
398
  if (!requestWritten) {
364
399
  cancelAfterWrite = true;
365
- rejectCancelled();
366
400
  return;
367
401
  }
368
- writeCancel().then(rejectCancelled, (error) => {
369
- this.emitError(toError(error));
370
- rejectCancelled();
371
- });
402
+ rejectAfterCancelWrite();
372
403
  };
373
404
  const onAbort = () => settleCancel();
374
405
  this.pendingRequests.set(key, {
375
406
  resolve(result) {
376
407
  settled = true;
377
408
  cleanup();
378
- resolve2(result);
409
+ resolve(result);
379
410
  },
380
411
  reject(error) {
381
412
  settled = true;
@@ -396,7 +427,7 @@ class JsonRpcConnection {
396
427
  await this.writeMessage(message);
397
428
  requestWritten = true;
398
429
  if (cancelAfterWrite)
399
- await writeCancel();
430
+ await rejectAfterCancelWrite?.();
400
431
  } catch (error) {
401
432
  if (settled)
402
433
  return responsePromise;
@@ -435,19 +466,6 @@ class JsonRpcConnection {
435
466
  this.notificationHandlers.clear();
436
467
  this.requestHandlers.clear();
437
468
  }
438
- handleData = (chunk) => {
439
- const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf8");
440
- this.inputBuffer = Buffer.concat([this.inputBuffer, chunkBuffer]);
441
- this.drainInputBuffer();
442
- };
443
- handleClose = () => {
444
- for (const handler of this.closeHandlers) {
445
- handler();
446
- }
447
- };
448
- handleStreamError = (error) => {
449
- this.emitError(error);
450
- };
451
469
  drainInputBuffer() {
452
470
  while (true) {
453
471
  const headerEnd = this.inputBuffer.indexOf(HEADER_SEPARATOR);
@@ -547,13 +565,13 @@ class JsonRpcConnection {
547
565
  const payload = `Content-Length: ${Buffer.byteLength(body, "utf8")}\r
548
566
  \r
549
567
  ${body}`;
550
- return new Promise((resolve2, reject) => {
568
+ return new Promise((resolve, reject) => {
551
569
  this.writer.write(payload, (error) => {
552
570
  if (error) {
553
571
  reject(error);
554
572
  return;
555
573
  }
556
- resolve2();
574
+ resolve();
557
575
  });
558
576
  });
559
577
  }
@@ -640,9 +658,9 @@ function validateCwd(cwd) {
640
658
  }
641
659
  }
642
660
  function wrap(proc) {
643
- const exitedPromise = new Promise((resolve2) => {
644
- proc.once("close", (code) => resolve2(code ?? 0));
645
- proc.once("error", () => resolve2(1));
661
+ const exitedPromise = new Promise((resolve) => {
662
+ proc.once("close", (code) => resolve(code ?? 0));
663
+ proc.once("error", () => resolve(1));
646
664
  });
647
665
  if (!proc.stdin || !proc.stdout || !proc.stderr) {
648
666
  throw new LspProcessSpawnError("Spawned process is missing one of stdin/stdout/stderr pipes");
@@ -795,33 +813,29 @@ function isPosition(value) {
795
813
 
796
814
  // ../lsp-core/src/lsp/transport.ts
797
815
  class LspClientNotStartedError extends Error {
798
- serverId;
799
- root;
800
- name = "LspClientNotStartedError";
801
816
  constructor(serverId, root) {
802
817
  super("LSP client not started");
803
818
  this.serverId = serverId;
804
819
  this.root = root;
820
+ this.name = "LspClientNotStartedError";
805
821
  }
806
822
  }
807
823
 
808
824
  class LspClientTransport {
809
- root;
810
- server;
811
- proc = null;
812
- connection = null;
813
- stderrBuffer = [];
814
- processExited = false;
815
- diagnosticsStore = new Map;
816
- requestTimeoutMs;
817
- initializeTimeoutMs;
818
- workspaceApplyEditHandler = null;
819
- diagnosticPullSupported = false;
820
825
  constructor(root, server, timeouts = {}) {
821
826
  this.root = root;
822
827
  this.server = server;
828
+ this.proc = null;
829
+ this.connection = null;
830
+ this.stderrBuffer = [];
831
+ this.processExited = false;
832
+ this.diagnosticsStore = new Map;
833
+ this.workspaceApplyEditHandler = null;
834
+ this.diagnosticPullSupported = false;
835
+ this.documentFormattingSupported = false;
823
836
  this.requestTimeoutMs = timeouts.requestTimeoutMs ?? REQUEST_TIMEOUT_MS;
824
837
  this.initializeTimeoutMs = timeouts.initializeTimeoutMs ?? INIT_TIMEOUT_MS;
838
+ this.timerProvider = timeouts.timerProvider ?? realTimerProvider;
825
839
  }
826
840
  pid() {
827
841
  return this.proc?.pid;
@@ -841,6 +855,12 @@ class LspClientTransport {
841
855
  isDiagnosticPullSupported() {
842
856
  return this.diagnosticPullSupported;
843
857
  }
858
+ setDocumentFormattingSupported(supported) {
859
+ this.documentFormattingSupported = supported;
860
+ }
861
+ isDocumentFormattingSupported() {
862
+ return this.documentFormattingSupported;
863
+ }
844
864
  handlePublishDiagnostics(params) {
845
865
  this.diagnosticsStore.set(params.uri, [...params.diagnostics]);
846
866
  }
@@ -916,7 +936,7 @@ class LspClientTransport {
916
936
  const options = args[1];
917
937
  const timeoutMs = options?.timeoutMs ?? this.requestTimeoutMs;
918
938
  const timeoutController = new AbortController;
919
- const timeoutHandle = setTimeout(() => {
939
+ const timeoutHandle = this.timerProvider.setTimeout(() => {
920
940
  const stderrTail = this.stderrBuffer.slice(-5).join(`
921
941
  `);
922
942
  timeoutController.abort(new LspRequestTimeoutError(method, stderrTail || undefined));
@@ -935,7 +955,7 @@ class LspClientTransport {
935
955
  }
936
956
  throw error;
937
957
  } finally {
938
- clearTimeout(timeoutHandle);
958
+ this.timerProvider.clearTimeout(timeoutHandle);
939
959
  combinedSignal.dispose();
940
960
  }
941
961
  }
@@ -986,8 +1006,8 @@ class LspClientTransport {
986
1006
  try {
987
1007
  proc.kill();
988
1008
  let timeoutId;
989
- const timeoutPromise = new Promise((resolve2) => {
990
- timeoutId = setTimeout(resolve2, STOP_HARD_KILL_TIMEOUT_MS);
1009
+ const timeoutPromise = new Promise((resolve) => {
1010
+ timeoutId = setTimeout(resolve, STOP_HARD_KILL_TIMEOUT_MS);
991
1011
  });
992
1012
  await Promise.race([
993
1013
  proc.exited.then(() => {
@@ -1003,7 +1023,7 @@ class LspClientTransport {
1003
1023
  proc.kill("SIGKILL");
1004
1024
  await Promise.race([
1005
1025
  proc.exited,
1006
- new Promise((resolve2) => setTimeout(resolve2, STOP_SIGKILL_GRACE_MS))
1026
+ new Promise((resolve) => setTimeout(resolve, STOP_SIGKILL_GRACE_MS))
1007
1027
  ]);
1008
1028
  } catch (error) {
1009
1029
  reportBestEffortCleanupError("hard process kill", error instanceof Error ? error : String(error));
@@ -1054,6 +1074,14 @@ function supportsDiagnosticPull(capabilities) {
1054
1074
  return false;
1055
1075
  return Object.hasOwn(capabilities, "diagnosticProvider");
1056
1076
  }
1077
+ function supportsDocumentFormatting(capabilities) {
1078
+ if (capabilities === undefined)
1079
+ return false;
1080
+ const provider = capabilities.documentFormattingProvider;
1081
+ if (provider === undefined || provider === null || provider === false)
1082
+ return false;
1083
+ return provider === true || typeof provider === "object";
1084
+ }
1057
1085
 
1058
1086
  class LspClientConnection extends LspClientTransport {
1059
1087
  async initialize() {
@@ -1070,6 +1098,7 @@ class LspClientConnection extends LspClientTransport {
1070
1098
  references: {},
1071
1099
  documentSymbol: { hierarchicalDocumentSymbolSupport: true },
1072
1100
  publishDiagnostics: {},
1101
+ formatting: { dynamicRegistration: false },
1073
1102
  rename: {
1074
1103
  prepareSupport: true,
1075
1104
  prepareSupportDefaultBehavior: 1
@@ -1111,6 +1140,7 @@ class LspClientConnection extends LspClientTransport {
1111
1140
  initializationOptions: this.server.initialization
1112
1141
  }, { timeoutMs: this.initializeTimeoutMs });
1113
1142
  this.setDiagnosticPullSupported(supportsDiagnosticPull(result?.capabilities));
1143
+ this.setDocumentFormattingSupported(supportsDocumentFormatting(result?.capabilities));
1114
1144
  await this.sendNotification("initialized", {});
1115
1145
  await this.sendNotification("workspace/didChangeConfiguration", {
1116
1146
  settings: { json: { validate: { enable: true } } }
@@ -1306,6 +1336,17 @@ function canonicalPath(filePath) {
1306
1336
  return absolute;
1307
1337
  }
1308
1338
  }
1339
+ function normalizeDocumentUri(uri) {
1340
+ let decoded = uri;
1341
+ try {
1342
+ decoded = decodeURIComponent(uri);
1343
+ } catch {
1344
+ decoded = uri;
1345
+ }
1346
+ if (process.platform !== "win32")
1347
+ return decoded;
1348
+ return decoded.replace(/^(file:\/\/\/)([a-z]):/, (_match, prefix, drive) => `${prefix}${drive.toUpperCase()}:`);
1349
+ }
1309
1350
  function isSameOrDescendant(candidate, parent) {
1310
1351
  const suffix = relative2(parent, candidate);
1311
1352
  return suffix === "" || !suffix.startsWith("..") && suffix !== "..";
@@ -1316,17 +1357,18 @@ function movedPath(candidate, oldPath, newPath) {
1316
1357
  }
1317
1358
 
1318
1359
  class WorkspaceDocumentState {
1319
- sendNotification;
1320
- clearDiagnostics;
1321
- openDocuments = new Map;
1322
- openByUri = new Map;
1323
- openPromises = new Map;
1324
- now;
1325
- versionlessPublishQuiescenceMs;
1326
1360
  constructor(sendNotification, clearDiagnostics, options = {}) {
1327
1361
  this.sendNotification = sendNotification;
1328
1362
  this.clearDiagnostics = clearDiagnostics;
1329
- this.now = options.now ?? (() => Date.now());
1363
+ this.openDocuments = new Map;
1364
+ this.openByUri = new Map;
1365
+ this.openPromises = new Map;
1366
+ this.timerProvider = options.timerProvider ?? {
1367
+ now: options.now ?? (() => Date.now()),
1368
+ setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
1369
+ clearTimeout: (handle) => clearTimeout(handle)
1370
+ };
1371
+ this.now = () => this.timerProvider.now();
1330
1372
  this.versionlessPublishQuiescenceMs = options.versionlessPublishQuiescenceMs ?? DEFAULT_VERSIONLESS_PUBLISH_QUIESCENCE_MS;
1331
1373
  }
1332
1374
  async openFile(filePath) {
@@ -1348,7 +1390,7 @@ class WorkspaceDocumentState {
1348
1390
  return this.openDocuments.get(canonicalPath(filePath))?.version;
1349
1391
  }
1350
1392
  getStoredDiagnostics(uri) {
1351
- const state = this.openByUri.get(uri);
1393
+ const state = this.openByUri.get(normalizeDocumentUri(uri));
1352
1394
  if (!state)
1353
1395
  return [];
1354
1396
  return state.lastPublish?.diagnostics ?? state.pullCache?.diagnostics ?? [];
@@ -1370,13 +1412,13 @@ class WorkspaceDocumentState {
1370
1412
  return state !== undefined && state.uri === snapshot.uri && state.version === snapshot.version && state.generation === snapshot.documentGeneration;
1371
1413
  }
1372
1414
  getPullCache(snapshot) {
1373
- const state = this.openByUri.get(snapshot.uri);
1415
+ const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
1374
1416
  if (!state?.pullCache || state.pullCache.documentVersion !== snapshot.version)
1375
1417
  return null;
1376
1418
  return state.pullCache;
1377
1419
  }
1378
1420
  recordPullDiagnostics(snapshot, report) {
1379
- const state = this.openByUri.get(snapshot.uri);
1421
+ const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
1380
1422
  if (!state)
1381
1423
  return;
1382
1424
  state.pullCache = {
@@ -1386,7 +1428,7 @@ class WorkspaceDocumentState {
1386
1428
  };
1387
1429
  }
1388
1430
  recordPublishedDiagnostics(params) {
1389
- const state = this.openByUri.get(params.uri);
1431
+ const state = this.openByUri.get(normalizeDocumentUri(params.uri));
1390
1432
  if (!state)
1391
1433
  return;
1392
1434
  state.publishGeneration += 1;
@@ -1400,7 +1442,7 @@ class WorkspaceDocumentState {
1400
1442
  this.notifyWaiters(state);
1401
1443
  }
1402
1444
  resolvePushDiagnostics(snapshot) {
1403
- const state = this.openByUri.get(snapshot.uri);
1445
+ const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
1404
1446
  if (!state?.lastPublish)
1405
1447
  return { status: "missing" };
1406
1448
  const publish = state.lastPublish;
@@ -1414,7 +1456,7 @@ class WorkspaceDocumentState {
1414
1456
  return waitMs === 0 ? { status: "ready", diagnostics: publish.diagnostics } : { status: "wait", waitMs };
1415
1457
  }
1416
1458
  waitForDiagnosticsActivity(snapshot, timeoutMs) {
1417
- const state = this.openByUri.get(snapshot.uri);
1459
+ const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
1418
1460
  if (!state || timeoutMs <= 0)
1419
1461
  return Promise.resolve();
1420
1462
  return new Promise((resolveActivity) => {
@@ -1423,11 +1465,11 @@ class WorkspaceDocumentState {
1423
1465
  if (settled)
1424
1466
  return;
1425
1467
  settled = true;
1426
- clearTimeout(timer);
1468
+ this.timerProvider.clearTimeout(timer);
1427
1469
  state.waiters.delete(finish);
1428
1470
  resolveActivity();
1429
1471
  };
1430
- const timer = setTimeout(finish, timeoutMs);
1472
+ const timer = this.timerProvider.setTimeout(finish, timeoutMs);
1431
1473
  if (typeof timer.unref === "function")
1432
1474
  timer.unref();
1433
1475
  state.waiters.add(finish);
@@ -1535,7 +1577,7 @@ class WorkspaceDocumentState {
1535
1577
  waiters: new Set
1536
1578
  };
1537
1579
  this.openDocuments.set(path, state);
1538
- this.openByUri.set(state.uri, state);
1580
+ this.openByUri.set(normalizeDocumentUri(state.uri), state);
1539
1581
  this.notifyWaiters(state);
1540
1582
  await this.sendNotification("textDocument/didOpen", {
1541
1583
  textDocument: { uri: state.uri, languageId: state.languageId, version: state.version, text }
@@ -1560,7 +1602,7 @@ class WorkspaceDocumentState {
1560
1602
  }
1561
1603
  async closeDocument(state) {
1562
1604
  this.openDocuments.delete(state.path);
1563
- this.openByUri.delete(state.uri);
1605
+ this.openByUri.delete(normalizeDocumentUri(state.uri));
1564
1606
  this.clearDiagnostics(state.uri);
1565
1607
  this.notifyWaiters(state);
1566
1608
  await this.sendNotification("textDocument/didClose", { textDocument: { uri: state.uri } });
@@ -1589,13 +1631,11 @@ import { dirname as dirname2, isAbsolute as isAbsolute2, relative as relative3,
1589
1631
  import { fileURLToPath } from "node:url";
1590
1632
 
1591
1633
  class WorkspaceEditPathError extends Error {
1592
- path;
1593
- detail;
1594
- name = "WorkspaceEditPathError";
1595
1634
  constructor(path, detail) {
1596
1635
  super(`${detail}: ${path}`);
1597
1636
  this.path = path;
1598
1637
  this.detail = detail;
1638
+ this.name = "WorkspaceEditPathError";
1599
1639
  }
1600
1640
  }
1601
1641
  function isPathInsideWorkspace(filePath, workspaceRoot) {
@@ -1887,13 +1927,11 @@ function canonicalFingerprint(operations) {
1887
1927
 
1888
1928
  // ../lsp-core/src/lsp/workspace-edit-types.ts
1889
1929
  class WorkspaceEditValidationError extends Error {
1890
- changeIndex;
1891
- detail;
1892
- name = "WorkspaceEditValidationError";
1893
1930
  constructor(changeIndex, detail) {
1894
1931
  super(`change ${changeIndex}: ${detail}`);
1895
1932
  this.changeIndex = changeIndex;
1896
1933
  this.detail = detail;
1934
+ this.name = "WorkspaceEditValidationError";
1897
1935
  }
1898
1936
  }
1899
1937
 
@@ -1979,14 +2017,14 @@ function parseSinglePathResource(input, kind) {
1979
2017
  return;
1980
2018
  }
1981
2019
  if (kind === "create") {
1982
- const options2 = parseOptions(change["options"], ["overwrite", "ignoreIfExists"], changeIndex);
2020
+ const options = parseOptions(change["options"], ["overwrite", "ignoreIfExists"], changeIndex);
1983
2021
  target.operations.push({
1984
2022
  kind,
1985
2023
  changeIndex,
1986
2024
  path: resolvedPath.path,
1987
2025
  reportedPath: resolvedPath.requestedPath,
1988
- overwrite: options2["overwrite"] ?? false,
1989
- ignoreIfExists: options2["ignoreIfExists"] ?? false,
2026
+ overwrite: options["overwrite"] ?? false,
2027
+ ignoreIfExists: options["ignoreIfExists"] ?? false,
1990
2028
  followedSymbolicLink: resolvedPath.followedSymbolicLink
1991
2029
  });
1992
2030
  return;
@@ -2391,10 +2429,9 @@ function simulateDelete(operation, virtual) {
2391
2429
  import { existsSync as existsSync5, lstatSync as lstatSync3, readdirSync as readdirSync2 } from "node:fs";
2392
2430
  import { dirname as dirname4, resolve as resolve5 } from "node:path";
2393
2431
  class WorkspaceSnapshotBuilder {
2394
- workspaceRoot;
2395
- snapshots = new Map;
2396
2432
  constructor(workspaceRoot) {
2397
2433
  this.workspaceRoot = workspaceRoot;
2434
+ this.snapshots = new Map;
2398
2435
  }
2399
2436
  build(operations) {
2400
2437
  this.add(this.workspaceRoot, false);
@@ -2438,8 +2475,10 @@ function snapshotOperations(operations, workspaceRoot) {
2438
2475
 
2439
2476
  // ../lsp-core/src/lsp/workspace-edit-plan.ts
2440
2477
  class PlanPathIndex {
2441
- firstChangeByPath = new Map;
2442
- reportedPathByCanonical = new Map;
2478
+ constructor() {
2479
+ this.firstChangeByPath = new Map;
2480
+ this.reportedPathByCanonical = new Map;
2481
+ }
2443
2482
  build(operations) {
2444
2483
  for (const operation of operations) {
2445
2484
  switch (operation.kind) {
@@ -2455,11 +2494,11 @@ class PlanPathIndex {
2455
2494
  }
2456
2495
  }
2457
2496
  }
2458
- add(path, reportedPath2, changeIndex) {
2497
+ add(path, reportedPath, changeIndex) {
2459
2498
  if (!this.firstChangeByPath.has(path))
2460
2499
  this.firstChangeByPath.set(path, changeIndex);
2461
2500
  if (!this.reportedPathByCanonical.has(path))
2462
- this.reportedPathByCanonical.set(path, reportedPath2);
2501
+ this.reportedPathByCanonical.set(path, reportedPath);
2463
2502
  }
2464
2503
  }
2465
2504
  function fingerprintWorkspaceEdit(edit, workspaceRoot) {
@@ -2528,14 +2567,11 @@ function isRecord4(value) {
2528
2567
  }
2529
2568
 
2530
2569
  class WorkspaceMutationController {
2531
- workspaceRoot;
2532
- documents;
2533
- activeLease = null;
2534
- nextLeaseId = 1;
2535
- io;
2536
2570
  constructor(workspaceRoot, documents) {
2537
2571
  this.workspaceRoot = workspaceRoot;
2538
2572
  this.documents = documents;
2573
+ this.activeLease = null;
2574
+ this.nextLeaseId = 1;
2539
2575
  }
2540
2576
  setIo(io) {
2541
2577
  this.io = io;
@@ -2574,8 +2610,8 @@ class WorkspaceMutationController {
2574
2610
  };
2575
2611
  }
2576
2612
  lease.phase = "applying";
2577
- lease.applyCompletion = new Promise((resolve6) => {
2578
- lease.resolveApply = resolve6;
2613
+ lease.applyCompletion = new Promise((resolve) => {
2614
+ lease.resolveApply = resolve;
2579
2615
  });
2580
2616
  const edit = isRecord4(params) ? params["edit"] : undefined;
2581
2617
  const record = edit === undefined ? { fingerprint: null, result: failure("workspace/applyEdit params.edit is required", 0) } : await this.applyEdit(edit, lease);
@@ -2648,14 +2684,12 @@ var DIAGNOSTICS_FRESHNESS_TIMEOUT_MS = 3000;
2648
2684
  var VERSIONLESS_PUBLISH_QUIESCENCE_MS = 250;
2649
2685
 
2650
2686
  class LspClient extends LspClientConnection {
2651
- diagnosticPullErrors = [];
2652
- documents;
2653
- workspaceMutations;
2654
- diagnosticsFreshnessTimeoutMs;
2655
2687
  constructor(root, server, options = {}) {
2656
2688
  super(root, server, options);
2689
+ this.diagnosticPullErrors = [];
2657
2690
  this.diagnosticsFreshnessTimeoutMs = options.diagnosticsFreshnessTimeoutMs ?? DIAGNOSTICS_FRESHNESS_TIMEOUT_MS;
2658
2691
  this.documents = new WorkspaceDocumentState((method, params) => this.sendNotification(method, params), (uri) => this.diagnosticsStore.delete(uri), {
2692
+ timerProvider: this.timerProvider,
2659
2693
  versionlessPublishQuiescenceMs: options.versionlessPublishQuiescenceMs ?? VERSIONLESS_PUBLISH_QUIESCENCE_MS
2660
2694
  });
2661
2695
  this.workspaceMutations = new WorkspaceMutationController(root, this.documents);
@@ -2708,6 +2742,18 @@ class LspClient extends LspClientConnection {
2708
2742
  textDocument: { uri: pathToFileURL3(absPath).href }
2709
2743
  }, options);
2710
2744
  }
2745
+ async formatDocument(filePath, options, signal) {
2746
+ if (!this.isDocumentFormattingSupported())
2747
+ return null;
2748
+ const absPath = this.resolveWorkspacePath(filePath);
2749
+ await this.openFile(absPath);
2750
+ const requestOptions = signal === undefined ? {} : { signal };
2751
+ const edits = await this.sendRequest("textDocument/formatting", {
2752
+ textDocument: { uri: pathToFileURL3(absPath).href },
2753
+ options
2754
+ }, requestOptions);
2755
+ return edits ?? [];
2756
+ }
2711
2757
  async workspaceSymbols(query, signal) {
2712
2758
  const options = signal === undefined ? {} : { signal };
2713
2759
  return this.sendRequest("workspace/symbol", { query }, options);
@@ -2747,7 +2793,7 @@ class LspClient extends LspClientConnection {
2747
2793
  const absPath = this.resolveWorkspacePath(filePath);
2748
2794
  const uri = pathToFileURL3(absPath).href;
2749
2795
  await this.openFile(absPath);
2750
- const deadlineAt = Date.now() + this.diagnosticsFreshnessTimeoutMs;
2796
+ const deadlineAt = this.timerProvider.now() + this.diagnosticsFreshnessTimeoutMs;
2751
2797
  for (;; ) {
2752
2798
  signal?.throwIfAborted();
2753
2799
  const snapshot = this.documents.captureDiagnosticSnapshot(absPath);
@@ -2760,13 +2806,13 @@ class LspClient extends LspClientConnection {
2760
2806
  if (!pushFallbackOnly) {
2761
2807
  const cached = this.documents.getPullCache(snapshot);
2762
2808
  try {
2763
- const remainingMs2 = deadlineAt - Date.now();
2764
- if (remainingMs2 <= 0)
2809
+ const remainingMs = deadlineAt - this.timerProvider.now();
2810
+ if (remainingMs <= 0)
2765
2811
  return this.freshnessTimeout(absPath);
2766
2812
  const result = await this.sendRequest("textDocument/diagnostic", {
2767
2813
  textDocument: { uri },
2768
2814
  ...cached?.resultId === undefined ? {} : { previousResultId: cached.resultId }
2769
- }, { timeoutMs: remainingMs2, ...signal === undefined ? {} : { signal } });
2815
+ }, { timeoutMs: remainingMs, ...signal === undefined ? {} : { signal } });
2770
2816
  if (!this.documents.isCurrentSnapshot(snapshot))
2771
2817
  continue;
2772
2818
  const report = this.parseDiagnosticPullReport(result);
@@ -2795,7 +2841,7 @@ class LspClient extends LspClientConnection {
2795
2841
  }
2796
2842
  if (!pushFallbackOnly)
2797
2843
  continue;
2798
- const remainingMs = deadlineAt - Date.now();
2844
+ const remainingMs = deadlineAt - this.timerProvider.now();
2799
2845
  if (remainingMs <= 0) {
2800
2846
  if (!this.isDiagnosticPullSupported() && snapshot.publishGeneration === 0) {
2801
2847
  const cached = this.documents.getPullCache(snapshot);
@@ -2847,7 +2893,7 @@ function waitForDiagnosticsActivity(wait, signal) {
2847
2893
  return wait;
2848
2894
  if (signal.aborted)
2849
2895
  return Promise.reject(abortError2(signal));
2850
- return new Promise((resolve7, reject) => {
2896
+ return new Promise((resolve, reject) => {
2851
2897
  const onAbort = () => {
2852
2898
  signal.removeEventListener("abort", onAbort);
2853
2899
  reject(abortError2(signal));
@@ -2855,7 +2901,7 @@ function waitForDiagnosticsActivity(wait, signal) {
2855
2901
  signal.addEventListener("abort", onAbort, { once: true });
2856
2902
  wait.then(() => {
2857
2903
  signal.removeEventListener("abort", onAbort);
2858
- resolve7();
2904
+ resolve();
2859
2905
  }, (error) => {
2860
2906
  signal.removeEventListener("abort", onAbort);
2861
2907
  reject(error);
@@ -2923,7 +2969,7 @@ async function stopClientBestEffort(client) {
2923
2969
  function awaitWithSignal(promise, signal) {
2924
2970
  if (!signal)
2925
2971
  return promise;
2926
- return new Promise((resolve7, reject) => {
2972
+ return new Promise((resolve, reject) => {
2927
2973
  let settled = false;
2928
2974
  const onAbort = () => {
2929
2975
  if (settled)
@@ -2941,7 +2987,7 @@ function awaitWithSignal(promise, signal) {
2941
2987
  return;
2942
2988
  settled = true;
2943
2989
  signal.removeEventListener("abort", onAbort);
2944
- resolve7(value);
2990
+ resolve(value);
2945
2991
  }, (err) => {
2946
2992
  if (settled)
2947
2993
  return;
@@ -2953,18 +2999,16 @@ function awaitWithSignal(promise, signal) {
2953
2999
  }
2954
3000
 
2955
3001
  class LspManager {
2956
- clients = new Map;
2957
- reaperHandle = null;
2958
- signalDisposer = null;
2959
- disposed = false;
2960
- idleTimeoutMs;
2961
- initTimeoutMs;
2962
- reaperIntervalMs;
2963
- clientFactory;
2964
- now;
2965
3002
  constructor(options = {}) {
3003
+ this.clients = new Map;
3004
+ this.pendingStops = new Map;
3005
+ this.respawnBudgets = new Map;
3006
+ this.reaperHandle = null;
3007
+ this.signalDisposer = null;
3008
+ this.disposed = false;
2966
3009
  this.idleTimeoutMs = options.idleTimeoutMs ?? IDLE_TIMEOUT_MS;
2967
3010
  this.initTimeoutMs = options.initTimeoutMs ?? INIT_TIMEOUT_MS;
3011
+ this.maxResidentClients = options.maxResidentClients ?? MAX_RESIDENT_CLIENTS;
2968
3012
  this.reaperIntervalMs = options.reaperIntervalMs ?? REAPER_INTERVAL_MS;
2969
3013
  this.clientFactory = options.clientFactory ?? ((root, server) => new LspClient(root, server));
2970
3014
  this.now = options.now ?? (() => Date.now());
@@ -2984,24 +3028,79 @@ class LspManager {
2984
3028
  getKey(root, serverId) {
2985
3029
  return `${root}::${serverId}`;
2986
3030
  }
3031
+ tombstoneStop(key, client) {
3032
+ const stop = stopClientBestEffort(client);
3033
+ this.pendingStops.set(key, stop);
3034
+ stop.finally(() => {
3035
+ if (this.pendingStops.get(key) === stop) {
3036
+ this.pendingStops.delete(key);
3037
+ }
3038
+ });
3039
+ return stop;
3040
+ }
3041
+ recordDeadGeneration(key) {
3042
+ let budget = this.respawnBudgets.get(key);
3043
+ if (budget === undefined) {
3044
+ budget = { deadGenerations: 0, exhaustedAt: null };
3045
+ this.respawnBudgets.set(key, budget);
3046
+ }
3047
+ budget.deadGenerations += 1;
3048
+ }
3049
+ markHealthyGeneration(key) {
3050
+ this.respawnBudgets.delete(key);
3051
+ }
3052
+ ensureRespawnAllowed(key, root, serverId) {
3053
+ const budget = this.respawnBudgets.get(key);
3054
+ if (budget === undefined || budget.deadGenerations < CLIENT_RESPAWN_RETRY_LIMIT)
3055
+ return;
3056
+ if (budget.exhaustedAt === null) {
3057
+ budget.exhaustedAt = this.now();
3058
+ throw new LspClientRespawnBudgetExceededError(serverId, root, CLIENT_RESPAWN_RETRY_LIMIT);
3059
+ }
3060
+ if (this.now() - budget.exhaustedAt < CLIENT_RESPAWN_COOLDOWN_MS) {
3061
+ throw new LspClientRespawnBudgetExceededError(serverId, root, CLIENT_RESPAWN_RETRY_LIMIT);
3062
+ }
3063
+ budget.deadGenerations = 0;
3064
+ budget.exhaustedAt = null;
3065
+ }
2987
3066
  reapStale() {
2988
3067
  const t = this.now();
2989
3068
  for (const [key, managed] of this.clients) {
2990
3069
  if (managed.isInitializing && managed.initializingSince !== null && t - managed.initializingSince > this.initTimeoutMs) {
2991
- stopClientBestEffort(managed.client);
2992
3070
  this.clients.delete(key);
3071
+ this.tombstoneStop(key, managed.client);
2993
3072
  continue;
2994
3073
  }
2995
3074
  if (!managed.isInitializing && managed.refCount === 0 && managed.pendingWaiters === 0 && t - managed.lastUsedAt > this.idleTimeoutMs) {
2996
- stopClientBestEffort(managed.client);
2997
3075
  this.clients.delete(key);
3076
+ this.tombstoneStop(key, managed.client);
3077
+ }
3078
+ }
3079
+ }
3080
+ evictForAdmission() {
3081
+ while (this.clients.size >= this.maxResidentClients) {
3082
+ const victim = this.leastRecentlyUsedIdleClient();
3083
+ if (!victim)
3084
+ return;
3085
+ this.clients.delete(victim.key);
3086
+ this.tombstoneStop(victim.key, victim.managed.client);
3087
+ }
3088
+ }
3089
+ leastRecentlyUsedIdleClient() {
3090
+ let candidate = null;
3091
+ for (const [key, managed] of this.clients) {
3092
+ if (managed.refCount > 0 || managed.pendingWaiters > 0 || managed.isInitializing)
3093
+ continue;
3094
+ if (candidate === null || managed.lastUsedAt < candidate.managed.lastUsedAt) {
3095
+ candidate = { key, managed };
2998
3096
  }
2999
3097
  }
3098
+ return candidate;
3000
3099
  }
3001
3100
  async tryDeleteIfOrphaned(key, managed) {
3002
3101
  if (managed.refCount === 0 && managed.pendingWaiters === 0 && !managed.isInitializing && this.clients.get(key) === managed) {
3003
3102
  this.clients.delete(key);
3004
- await stopClientBestEffort(managed.client);
3103
+ await this.tombstoneStop(key, managed.client);
3005
3104
  }
3006
3105
  }
3007
3106
  async getClient(root, server, signal) {
@@ -3010,12 +3109,22 @@ class LspManager {
3010
3109
  }
3011
3110
  signal?.throwIfAborted();
3012
3111
  const key = this.getKey(root, server.id);
3112
+ for (;; ) {
3113
+ const pendingStop = this.pendingStops.get(key);
3114
+ if (pendingStop === undefined)
3115
+ break;
3116
+ await awaitWithSignal(pendingStop, signal);
3117
+ signal?.throwIfAborted();
3118
+ }
3119
+ if (this.disposed) {
3120
+ throw new Error("LspManager has been disposed");
3121
+ }
3013
3122
  let managed = this.clients.get(key);
3014
3123
  if (managed) {
3015
3124
  const t = this.now();
3016
3125
  if (managed.isInitializing && managed.initializingSince !== null && t - managed.initializingSince > this.initTimeoutMs) {
3017
- await stopClientBestEffort(managed.client);
3018
3126
  this.clients.delete(key);
3127
+ await this.tombstoneStop(key, managed.client);
3019
3128
  managed = undefined;
3020
3129
  }
3021
3130
  }
@@ -3036,14 +3145,20 @@ class LspManager {
3036
3145
  signal.throwIfAborted();
3037
3146
  }
3038
3147
  if (!managed.client.isAlive()) {
3039
- await stopClientBestEffort(managed.client);
3040
- this.clients.delete(key);
3148
+ this.recordDeadGeneration(key);
3149
+ if (this.clients.get(key) === managed) {
3150
+ this.clients.delete(key);
3151
+ }
3152
+ await this.tombstoneStop(key, managed.client);
3041
3153
  return this.getClient(root, server, signal);
3042
3154
  }
3155
+ this.markHealthyGeneration(key);
3043
3156
  managed.refCount++;
3044
3157
  managed.lastUsedAt = this.now();
3045
3158
  return managed.client;
3046
3159
  }
3160
+ this.evictForAdmission();
3161
+ this.ensureRespawnAllowed(key, root, server.id);
3047
3162
  const client = this.clientFactory(root, server);
3048
3163
  const initStartedAt = this.now();
3049
3164
  const initPromise = (async () => {
@@ -3067,7 +3182,7 @@ class LspManager {
3067
3182
  if (this.clients.get(key) === newManaged) {
3068
3183
  this.clients.delete(key);
3069
3184
  }
3070
- await stopClientBestEffort(client);
3185
+ await this.tombstoneStop(key, client);
3071
3186
  throw err;
3072
3187
  }
3073
3188
  newManaged.pendingWaiters--;
@@ -3078,6 +3193,15 @@ class LspManager {
3078
3193
  await this.tryDeleteIfOrphaned(key, newManaged);
3079
3194
  signal.throwIfAborted();
3080
3195
  }
3196
+ if (!client.isAlive()) {
3197
+ this.recordDeadGeneration(key);
3198
+ if (this.clients.get(key) === newManaged) {
3199
+ this.clients.delete(key);
3200
+ }
3201
+ await this.tombstoneStop(key, client);
3202
+ return this.getClient(root, server, signal);
3203
+ }
3204
+ this.markHealthyGeneration(key);
3081
3205
  newManaged.refCount++;
3082
3206
  newManaged.lastUsedAt = this.now();
3083
3207
  return client;
@@ -3098,14 +3222,20 @@ class LspManager {
3098
3222
  if (client && managed.client !== client)
3099
3223
  return;
3100
3224
  this.clients.delete(key);
3101
- stopClientBestEffort(managed.client);
3225
+ this.tombstoneStop(key, managed.client);
3102
3226
  }
3103
3227
  warmupClient(root, server) {
3104
3228
  if (this.disposed)
3105
3229
  return;
3106
3230
  const key = this.getKey(root, server.id);
3107
- if (this.clients.has(key))
3231
+ if (this.clients.has(key) || this.pendingStops.has(key))
3108
3232
  return;
3233
+ this.evictForAdmission();
3234
+ try {
3235
+ this.ensureRespawnAllowed(key, root, server.id);
3236
+ } catch {
3237
+ return;
3238
+ }
3109
3239
  const client = this.clientFactory(root, server);
3110
3240
  const initStartedAt = this.now();
3111
3241
  const initPromise = (async () => {
@@ -3131,7 +3261,7 @@ class LspManager {
3131
3261
  if (this.clients.get(key) === managed) {
3132
3262
  this.clients.delete(key);
3133
3263
  }
3134
- stopClientBestEffort(client);
3264
+ this.tombstoneStop(key, client);
3135
3265
  });
3136
3266
  }
3137
3267
  isServerInitializing(root, serverId) {
@@ -3175,8 +3305,11 @@ class LspManager {
3175
3305
  for (const managed of this.clients.values()) {
3176
3306
  stopPromises.push(stopClientBestEffort(managed.client));
3177
3307
  }
3308
+ const tombstonedStops = [...this.pendingStops.values()];
3178
3309
  this.clients.clear();
3179
- await Promise.allSettled(stopPromises);
3310
+ this.respawnBudgets.clear();
3311
+ await Promise.allSettled([...stopPromises, ...tombstonedStops]);
3312
+ this.pendingStops.clear();
3180
3313
  }
3181
3314
  }
3182
3315
  var _defaultInstance = null;
@@ -3194,57 +3327,52 @@ async function disposeDefaultLspManager() {
3194
3327
  }
3195
3328
  }
3196
3329
 
3197
- // ../lsp-core/src/lsp/server-install-state.ts
3198
- import { existsSync as existsSync6, mkdirSync, readFileSync as readFileSync3, renameSync as renameSync2, writeFileSync as writeFileSync2 } from "node:fs";
3199
- import { dirname as dirname5 } from "node:path";
3200
- function getInstallDecisionsPath() {
3201
- return lspRequestContext().installDecisionsPath;
3202
- }
3203
- function loadInstallDecisions() {
3204
- const path = getInstallDecisionsPath();
3205
- if (!existsSync6(path))
3206
- return {};
3207
- try {
3208
- const parsed = JSON.parse(readFileSync3(path, "utf8"));
3209
- return isInstallDecisions(parsed) ? parsed : {};
3210
- } catch {
3211
- return {};
3330
+ // ../lsp-core/src/lsp/outside-context-workspace.ts
3331
+ import { existsSync as existsSync6, realpathSync as realpathSync4 } from "node:fs";
3332
+ import { dirname as dirname5, join as join3 } from "node:path";
3333
+
3334
+ // ../lsp-core/src/lsp/workspace-markers.ts
3335
+ var GIT_WORKSPACE_MARKER = ".git";
3336
+ var PROJECT_WORKSPACE_MARKERS = [
3337
+ "package.json",
3338
+ "pyproject.toml",
3339
+ "Cargo.toml",
3340
+ "go.mod",
3341
+ "pom.xml",
3342
+ "build.gradle"
3343
+ ];
3344
+ var WORKSPACE_MARKERS = [GIT_WORKSPACE_MARKER, ...PROJECT_WORKSPACE_MARKERS];
3345
+
3346
+ // ../lsp-core/src/lsp/outside-context-workspace.ts
3347
+ function findWorkspaceRootOutsideContext(directory) {
3348
+ const marked = nearestMarkedAncestor(directory);
3349
+ if (marked !== undefined)
3350
+ return marked;
3351
+ return realpathSync4(nearestExistingAncestor(directory));
3352
+ }
3353
+ function nearestMarkedAncestor(directory) {
3354
+ let current = directory;
3355
+ for (;; ) {
3356
+ if (existsSync6(current) && WORKSPACE_MARKERS.some((marker) => existsSync6(join3(current, marker)))) {
3357
+ return realpathSync4(current);
3358
+ }
3359
+ const parent = dirname5(current);
3360
+ if (parent === current)
3361
+ return;
3362
+ current = parent;
3212
3363
  }
3213
3364
  }
3214
- function loadInstallDecision(serverId) {
3215
- return loadInstallDecisions()[serverId];
3216
- }
3217
- function recordInstallDecision(serverId, decision, decidedAt = new Date().toISOString()) {
3218
- const decisions = loadInstallDecisions();
3219
- decisions[serverId] = { decision, decidedAt };
3220
- writeInstallDecisions(decisions);
3221
- }
3222
- function isInstallDecision(value) {
3223
- return value === "declined" || value === "allowed";
3224
- }
3225
- function writeInstallDecisions(decisions) {
3226
- const path = getInstallDecisionsPath();
3227
- mkdirSync(dirname5(path), { recursive: true });
3228
- const tmpPath = `${path}.tmp`;
3229
- writeFileSync2(tmpPath, `${JSON.stringify(decisions, null, 2)}
3230
- `, "utf8");
3231
- renameSync2(tmpPath, path);
3232
- }
3233
- function isInstallDecisions(value) {
3234
- return isRecord5(value) && Object.values(value).every(isInstallDecisionRecord);
3235
- }
3236
- function isInstallDecisionRecord(value) {
3237
- if (!isRecord5(value))
3238
- return false;
3239
- return isInstallDecision(value["decision"]) && typeof value["decidedAt"] === "string";
3240
- }
3241
- function isRecord5(value) {
3242
- return typeof value === "object" && value !== null && !Array.isArray(value);
3365
+ function nearestExistingAncestor(directory) {
3366
+ let current = directory;
3367
+ while (!existsSync6(current)) {
3368
+ const parent = dirname5(current);
3369
+ if (parent === current)
3370
+ return current;
3371
+ current = parent;
3372
+ }
3373
+ return current;
3243
3374
  }
3244
3375
 
3245
- // ../lsp-core/src/lsp/config-loader.ts
3246
- import { existsSync as existsSync7, readFileSync as readFileSync4 } from "node:fs";
3247
-
3248
3376
  // ../lsp-core/src/lsp/server-definitions.ts
3249
3377
  var LSP_INSTALL_HINTS = {
3250
3378
  typescript: "npm install -g typescript-language-server typescript",
@@ -3290,6 +3418,26 @@ var LSP_INSTALL_HINTS = {
3290
3418
  julials: `julia -e 'using Pkg; Pkg.add("LanguageServer")'`,
3291
3419
  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"
3292
3420
  };
3421
+ var LSP_LOCAL_INSTALL_HINTS = {
3422
+ typescript: "bun add -d typescript-language-server typescript",
3423
+ vue: "bun add -d @vue/language-server",
3424
+ eslint: "bun add -d vscode-langservers-extracted",
3425
+ oxlint: "bun add -d oxlint",
3426
+ biome: "bun add -d @biomejs/biome",
3427
+ svelte: "bun add -d svelte-language-server",
3428
+ astro: "bun add -d @astrojs/language-server",
3429
+ bash: "bun add -d bash-language-server",
3430
+ "bash-ls": "bun add -d bash-language-server",
3431
+ "yaml-ls": "bun add -d yaml-language-server",
3432
+ php: "bun add -d intelephense",
3433
+ prisma: "bun add -d prisma",
3434
+ dockerfile: "bun add -d dockerfile-language-server-nodejs",
3435
+ pyright: "uv add --dev pyright",
3436
+ basedpyright: "uv add --dev basedpyright",
3437
+ ruff: "uv add --dev ruff",
3438
+ ty: "uv add --dev ty",
3439
+ "ruby-lsp": "bundle add ruby-lsp --group development"
3440
+ };
3293
3441
  var BUILTIN_SERVERS = {
3294
3442
  typescript: {
3295
3443
  command: ["typescript-language-server", "--stdio"],
@@ -3392,7 +3540,56 @@ var BUILTIN_SERVERS = {
3392
3540
  }
3393
3541
  };
3394
3542
 
3543
+ // ../lsp-core/src/lsp/server-install-state.ts
3544
+ import { existsSync as existsSync7, mkdirSync, readFileSync as readFileSync3, renameSync as renameSync2, writeFileSync as writeFileSync2 } from "node:fs";
3545
+ import { dirname as dirname6 } from "node:path";
3546
+ function getInstallDecisionsPath() {
3547
+ return lspRequestContext().installDecisionsPath;
3548
+ }
3549
+ function loadInstallDecisions() {
3550
+ const path = getInstallDecisionsPath();
3551
+ if (!existsSync7(path))
3552
+ return {};
3553
+ try {
3554
+ const parsed = JSON.parse(readFileSync3(path, "utf8"));
3555
+ return isInstallDecisions(parsed) ? parsed : {};
3556
+ } catch {
3557
+ return {};
3558
+ }
3559
+ }
3560
+ function loadInstallDecision(serverId) {
3561
+ return loadInstallDecisions()[serverId];
3562
+ }
3563
+ function recordInstallDecision(serverId, decision, decidedAt = new Date().toISOString()) {
3564
+ const decisions = loadInstallDecisions();
3565
+ decisions[serverId] = { decision, decidedAt };
3566
+ writeInstallDecisions(decisions);
3567
+ }
3568
+ function isInstallDecision(value) {
3569
+ return value === "declined" || value === "allowed";
3570
+ }
3571
+ function writeInstallDecisions(decisions) {
3572
+ const path = getInstallDecisionsPath();
3573
+ mkdirSync(dirname6(path), { recursive: true });
3574
+ const tmpPath = `${path}.tmp`;
3575
+ writeFileSync2(tmpPath, `${JSON.stringify(decisions, null, 2)}
3576
+ `, "utf8");
3577
+ renameSync2(tmpPath, path);
3578
+ }
3579
+ function isInstallDecisions(value) {
3580
+ return isRecord5(value) && Object.values(value).every(isInstallDecisionRecord);
3581
+ }
3582
+ function isInstallDecisionRecord(value) {
3583
+ if (!isRecord5(value))
3584
+ return false;
3585
+ return isInstallDecision(value["decision"]) && typeof value["decidedAt"] === "string";
3586
+ }
3587
+ function isRecord5(value) {
3588
+ return typeof value === "object" && value !== null && !Array.isArray(value);
3589
+ }
3590
+
3395
3591
  // ../lsp-core/src/lsp/config-loader.ts
3592
+ import { existsSync as existsSync8, readFileSync as readFileSync4 } from "node:fs";
3396
3593
  function getProjectConfigPaths() {
3397
3594
  return lspRequestContext().projectConfigPaths;
3398
3595
  }
@@ -3400,7 +3597,7 @@ function getUserConfigPath() {
3400
3597
  return lspRequestContext().userConfigPath;
3401
3598
  }
3402
3599
  function loadJsonFile(path) {
3403
- if (!existsSync7(path))
3600
+ if (!existsSync8(path))
3404
3601
  return null;
3405
3602
  try {
3406
3603
  const parsed = JSON.parse(readFileSync4(path, "utf-8"));
@@ -3482,7 +3679,7 @@ function createServerFromEntry(id, entry, source) {
3482
3679
  if (source === "project") {
3483
3680
  if (!builtin)
3484
3681
  return null;
3485
- const server2 = createServer({
3682
+ const server = createServer({
3486
3683
  id,
3487
3684
  command: builtin.command,
3488
3685
  extensions: entry.extensions ?? builtin.extensions,
@@ -3490,20 +3687,20 @@ function createServerFromEntry(id, entry, source) {
3490
3687
  source
3491
3688
  });
3492
3689
  if (entry.initialization !== undefined) {
3493
- server2.initialization = entry.initialization;
3690
+ server.initialization = entry.initialization;
3494
3691
  }
3495
- return server2;
3692
+ return server;
3496
3693
  }
3497
3694
  if (entry.command && entry.extensions) {
3498
- const server2 = createServer({
3695
+ const server = createServer({
3499
3696
  id,
3500
3697
  command: entry.command,
3501
3698
  extensions: entry.extensions,
3502
3699
  priority: entry.priority ?? 0,
3503
3700
  source
3504
3701
  });
3505
- applyOptionalServerFields(server2, entry);
3506
- return server2;
3702
+ applyOptionalServerFields(server, entry);
3703
+ return server;
3507
3704
  }
3508
3705
  if (!builtin)
3509
3706
  return null;
@@ -3588,54 +3785,155 @@ function getDisabledServerIds() {
3588
3785
  }
3589
3786
 
3590
3787
  // ../lsp-core/src/lsp/server-installation.ts
3591
- import { existsSync as existsSync8 } from "node:fs";
3592
- import { delimiter as delimiter3, join as join3 } from "node:path";
3593
- function isServerInstalled(command, _workingDirectory) {
3594
- if (command.length === 0)
3595
- return false;
3596
- const [cmd] = command;
3597
- if (!cmd)
3598
- return false;
3599
- if (cmd.includes("/") || cmd.includes("\\")) {
3600
- if (existsSync8(cmd))
3601
- return true;
3788
+ import { existsSync as existsSync9 } from "node:fs";
3789
+ import { delimiter as delimiter3, dirname as dirname7, isAbsolute as isAbsolute3, join as join4, resolve as resolve7 } from "node:path";
3790
+ var LOCAL_BIN_RULES = [
3791
+ {
3792
+ markers: ["package.json", "bun.lock", "bun.lockb", "package-lock.json", "yarn.lock", "pnpm-lock.yaml"],
3793
+ binDirs: [join4("node_modules", ".bin")]
3794
+ },
3795
+ {
3796
+ markers: [
3797
+ "pyproject.toml",
3798
+ "ty.toml",
3799
+ "requirements.txt",
3800
+ "setup.py",
3801
+ "setup.cfg",
3802
+ "Pipfile",
3803
+ "pyrightconfig.json",
3804
+ "ruff.toml",
3805
+ ".ruff.toml"
3806
+ ],
3807
+ binDirs: [
3808
+ join4(".venv", "bin"),
3809
+ join4(".venv", "Scripts"),
3810
+ join4("venv", "bin"),
3811
+ join4("venv", "Scripts"),
3812
+ join4(".env", "bin"),
3813
+ join4(".env", "Scripts")
3814
+ ]
3815
+ },
3816
+ {
3817
+ markers: ["Gemfile", "Gemfile.lock"],
3818
+ binDirs: [join4("vendor", "bundle", "bin"), "bin"]
3819
+ },
3820
+ {
3821
+ markers: ["go.mod", "go.sum", "go.work"],
3822
+ binDirs: ["bin"]
3823
+ }
3824
+ ];
3825
+ var resolutionCache = new Map;
3826
+ var probeCount = 0;
3827
+ function probe(path) {
3828
+ probeCount += 1;
3829
+ return existsSync9(path);
3830
+ }
3831
+ function executableSuffixes(platform, pathExt) {
3832
+ if (platform !== "win32")
3833
+ return [""];
3834
+ const configured = pathExt ?? process.env["PATHEXT"] ?? "";
3835
+ const systemExts = configured.split(";").filter((entry) => entry.length > 0).map((entry) => entry.toLowerCase());
3836
+ return [...new Set(["", ...systemExts, ".exe", ".cmd", ".bat", ".ps1"])];
3837
+ }
3838
+ function probeWithSuffixes(directory, command, suffixes) {
3839
+ for (const suffix of suffixes) {
3840
+ const candidate = join4(directory, command + suffix);
3841
+ if (probe(candidate))
3842
+ return candidate;
3602
3843
  }
3603
- const isWindows = process.platform === "win32";
3604
- let exts = [""];
3605
- if (isWindows) {
3606
- const pathExt = process.env["PATHEXT"] ?? "";
3607
- if (pathExt) {
3608
- const systemExts = pathExt.split(";").filter(Boolean);
3609
- exts = [...new Set([...exts, ...systemExts, ".exe", ".cmd", ".bat", ".ps1"])];
3610
- } else {
3611
- exts = ["", ".exe", ".cmd", ".bat", ".ps1"];
3844
+ return null;
3845
+ }
3846
+ function resolveLocal(command, workingDirectory, suffixes, stopAt) {
3847
+ const boundary = stopAt === undefined ? undefined : resolve7(stopAt);
3848
+ let current = resolve7(workingDirectory);
3849
+ while (true) {
3850
+ for (const rule of LOCAL_BIN_RULES) {
3851
+ if (!rule.markers.some((marker) => probe(join4(current, marker))))
3852
+ continue;
3853
+ for (const binDir of rule.binDirs) {
3854
+ const found = probeWithSuffixes(join4(current, binDir), command, suffixes);
3855
+ if (found !== null)
3856
+ return found;
3857
+ }
3612
3858
  }
3859
+ if (probe(join4(current, ".git")))
3860
+ return null;
3861
+ if (boundary !== undefined && current === boundary)
3862
+ return null;
3863
+ const parent = dirname7(current);
3864
+ if (parent === current)
3865
+ return null;
3866
+ current = parent;
3613
3867
  }
3614
- let pathEnv = process.env["PATH"] ?? "";
3615
- if (isWindows && !pathEnv) {
3868
+ }
3869
+ function resolveFromPath(command, suffixes, platform, pathEnvOverride) {
3870
+ let pathEnv = pathEnvOverride ?? process.env["PATH"] ?? "";
3871
+ if (platform === "win32" && !pathEnv) {
3616
3872
  pathEnv = process.env["Path"] ?? "";
3617
3873
  }
3618
- const paths = pathEnv.split(delimiter3);
3619
- for (const p of paths) {
3620
- for (const suffix of exts) {
3621
- if (existsSync8(join3(p, cmd + suffix))) {
3622
- return true;
3623
- }
3624
- }
3874
+ for (const entry of pathEnv.split(delimiter3)) {
3875
+ if (entry.length === 0)
3876
+ continue;
3877
+ const found = probeWithSuffixes(entry, command, suffixes);
3878
+ if (found !== null)
3879
+ return found;
3625
3880
  }
3626
- if (cmd === "node")
3627
- return true;
3628
- return false;
3881
+ return null;
3882
+ }
3883
+ function resolveServerBinary(command, workingDirectory, options = {}) {
3884
+ if (command.length === 0)
3885
+ return null;
3886
+ const [cmd] = command;
3887
+ if (cmd === undefined || cmd.length === 0)
3888
+ return null;
3889
+ const platform = options.platform ?? process.platform;
3890
+ const suffixes = executableSuffixes(platform, options.pathExt);
3891
+ if (cmd.includes("/") || cmd.includes("\\")) {
3892
+ const explicit = isAbsolute3(cmd) ? cmd : resolve7(workingDirectory ?? process.cwd(), cmd);
3893
+ return probe(explicit) ? explicit : null;
3894
+ }
3895
+ const cacheKey = JSON.stringify([
3896
+ workingDirectory ?? "",
3897
+ cmd,
3898
+ platform,
3899
+ options.stopAt ?? "",
3900
+ options.pathExt ?? "",
3901
+ options.pathEnv ?? process.env["PATH"] ?? ""
3902
+ ]);
3903
+ const cached = resolutionCache.get(cacheKey);
3904
+ if (cached !== undefined)
3905
+ return cached;
3906
+ let resolved = null;
3907
+ if (workingDirectory !== undefined && workingDirectory.length > 0) {
3908
+ resolved = resolveLocal(cmd, workingDirectory, suffixes, options.stopAt);
3909
+ }
3910
+ resolved ??= resolveFromPath(cmd, suffixes, platform, options.pathEnv);
3911
+ if (resolved === null && cmd === "node")
3912
+ resolved = cmd;
3913
+ resolutionCache.set(cacheKey, resolved);
3914
+ return resolved;
3915
+ }
3916
+ function isServerInstalled(command, workingDirectory, options = {}) {
3917
+ if (command.length === 0)
3918
+ return false;
3919
+ return resolveServerBinary(command, workingDirectory, options) !== null;
3629
3920
  }
3630
3921
 
3631
3922
  // ../lsp-core/src/lsp/server-resolution.ts
3923
+ function withResolvedCommand(command, binaryPath) {
3924
+ return [binaryPath, ...command.slice(1)];
3925
+ }
3632
3926
  function findServerForExtension(ext) {
3633
3927
  const servers = getMergedServers();
3928
+ const workingDirectory = contextCwd();
3634
3929
  for (const server of servers) {
3635
- if (server.extensions.includes(ext) && isServerInstalled(server.command)) {
3930
+ if (!server.extensions.includes(ext))
3931
+ continue;
3932
+ const binaryPath = resolveServerBinary(server.command, workingDirectory);
3933
+ if (binaryPath !== null) {
3636
3934
  const resolvedServer = {
3637
3935
  id: server.id,
3638
- command: server.command,
3936
+ command: withResolvedCommand(server.command, binaryPath),
3639
3937
  extensions: server.extensions,
3640
3938
  priority: server.priority
3641
3939
  };
@@ -3682,6 +3980,7 @@ function findServerForExtension(ext) {
3682
3980
  function getAllServers() {
3683
3981
  const servers = getMergedServers();
3684
3982
  const disabled = getDisabledServerIds();
3983
+ const workingDirectory = contextCwd();
3685
3984
  const result = [];
3686
3985
  const seen = new Set;
3687
3986
  for (const server of servers) {
@@ -3689,7 +3988,7 @@ function getAllServers() {
3689
3988
  continue;
3690
3989
  result.push({
3691
3990
  id: server.id,
3692
- installed: isServerInstalled(server.command),
3991
+ installed: isServerInstalled(server.command, workingDirectory),
3693
3992
  extensions: server.extensions,
3694
3993
  disabled: false,
3695
3994
  source: server.source,
@@ -3703,7 +4002,7 @@ function getAllServers() {
3703
4002
  const builtin = BUILTIN_SERVERS[id];
3704
4003
  result.push({
3705
4004
  id,
3706
- installed: builtin ? isServerInstalled(builtin.command) : false,
4005
+ installed: builtin ? isServerInstalled(builtin.command, workingDirectory) : false,
3707
4006
  extensions: builtin?.extensions ?? [],
3708
4007
  disabled: true,
3709
4008
  source: "disabled",
@@ -3714,7 +4013,6 @@ function getAllServers() {
3714
4013
  }
3715
4014
 
3716
4015
  // ../lsp-core/src/lsp/client-wrapper.ts
3717
- var WORKSPACE_MARKERS = [".git", "package.json", "pyproject.toml", "Cargo.toml", "go.mod", "pom.xml", "build.gradle"];
3718
4016
  function isDirectoryPath(filePath) {
3719
4017
  try {
3720
4018
  return statSync3(filePath).isDirectory();
@@ -3727,36 +4025,40 @@ function findWorkspaceRoot(filePath) {
3727
4025
  const abs = resolveReadablePathInsideContext(filePath);
3728
4026
  let dir = abs;
3729
4027
  if (!isDirectoryPath(dir)) {
3730
- dir = dirname6(dir);
4028
+ dir = dirname8(dir);
3731
4029
  }
4030
+ if (!isPathInside(cwd, abs))
4031
+ return findWorkspaceRootOutsideContext(dir);
3732
4032
  const fallbackRoot = nearestExistingDirectoryInsideContext(dir, cwd) ?? cwd;
4033
+ let nearestPackageRoot;
3733
4034
  while (isPathInside(cwd, dir)) {
3734
4035
  const canonicalDir = existingDirectoryInsideContext(dir, cwd);
3735
4036
  if (canonicalDir !== undefined) {
3736
- for (const marker of WORKSPACE_MARKERS) {
3737
- if (existsSync9(join4(dir, marker))) {
3738
- return canonicalDir;
3739
- }
4037
+ if (existsSync10(join5(dir, GIT_WORKSPACE_MARKER))) {
4038
+ return canonicalDir;
4039
+ }
4040
+ if (nearestPackageRoot === undefined && hasProjectWorkspaceMarker(dir)) {
4041
+ nearestPackageRoot = canonicalDir;
3740
4042
  }
3741
4043
  }
3742
4044
  if (dir === cwd)
3743
4045
  break;
3744
- dir = dirname6(dir);
4046
+ dir = dirname8(dir);
3745
4047
  }
3746
- return fallbackRoot;
4048
+ return nearestPackageRoot ?? fallbackRoot;
4049
+ }
4050
+ function hasProjectWorkspaceMarker(directory) {
4051
+ return PROJECT_WORKSPACE_MARKERS.some((marker) => existsSync10(join5(directory, marker)));
3747
4052
  }
3748
4053
  function resolveReadablePathInsideContext(filePath) {
3749
4054
  const cwd = contextCwd();
3750
- const abs = resolve7(cwd, filePath);
4055
+ const abs = resolve8(cwd, filePath);
3751
4056
  if (isPathInside(cwd, abs))
3752
4057
  return abs;
3753
4058
  const rebased = rebaseThroughCanonicalAncestor(abs, cwd);
3754
4059
  if (rebased !== undefined)
3755
4060
  return rebased;
3756
- const canonical = canonicalizeExistingOrNearestAncestor(abs);
3757
- if (isPathInside(cwd, canonical))
3758
- return canonical;
3759
- throw new LspInvalidPathError(`LSP file path must be inside request cwd: ${filePath}`);
4061
+ return canonicalizeExistingOrNearestAncestor(abs);
3760
4062
  }
3761
4063
  function resolvePathInsideContext(filePath) {
3762
4064
  const cwd = contextCwd();
@@ -3771,12 +4073,12 @@ function rebaseThroughCanonicalAncestor(path, cwd) {
3771
4073
  let current = path;
3772
4074
  const suffix = [];
3773
4075
  while (true) {
3774
- if (existsSync9(current)) {
3775
- const canonical = realpathSync4(current);
4076
+ if (existsSync10(current)) {
4077
+ const canonical = realpathSync5(current);
3776
4078
  if (isPathInside(cwd, canonical))
3777
- return suffix.length === 0 ? canonical : join4(canonical, ...suffix);
4079
+ return suffix.length === 0 ? canonical : join5(canonical, ...suffix);
3778
4080
  }
3779
- const parent = dirname6(current);
4081
+ const parent = dirname8(current);
3780
4082
  if (parent === current)
3781
4083
  return;
3782
4084
  suffix.unshift(basename3(current));
@@ -3784,9 +4086,9 @@ function rebaseThroughCanonicalAncestor(path, cwd) {
3784
4086
  }
3785
4087
  }
3786
4088
  function existingDirectoryInsideContext(directory, cwd) {
3787
- if (!existsSync9(directory))
4089
+ if (!existsSync10(directory))
3788
4090
  return;
3789
- const canonical = realpathSync4(directory);
4091
+ const canonical = realpathSync5(directory);
3790
4092
  if (!statSync3(canonical).isDirectory())
3791
4093
  return;
3792
4094
  return isPathInside(cwd, canonical) ? canonical : undefined;
@@ -3799,7 +4101,7 @@ function nearestExistingDirectoryInsideContext(directory, cwd) {
3799
4101
  return canonical;
3800
4102
  if (current === cwd)
3801
4103
  return;
3802
- current = dirname6(current);
4104
+ current = dirname8(current);
3803
4105
  }
3804
4106
  return;
3805
4107
  }
@@ -3826,6 +4128,19 @@ function formatServerLookupError(result) {
3826
4128
  ].join(`
3827
4129
  `);
3828
4130
  }
4131
+ function formatInstallOptions(serverId, installHint) {
4132
+ const localHint = LSP_LOCAL_INSTALL_HINTS[serverId];
4133
+ if (localHint === undefined) {
4134
+ return ["To install, run:", ` ${installHint}`];
4135
+ }
4136
+ return [
4137
+ "To install in THIS repository (preferred — no global install needed):",
4138
+ ` ${localHint}`,
4139
+ "",
4140
+ "Or install it globally:",
4141
+ ` ${installHint}`
4142
+ ];
4143
+ }
3829
4144
  function formatNotInstalled(result) {
3830
4145
  const { server, installHint } = result;
3831
4146
  const extensions = server.extensions.join(", ");
@@ -3840,19 +4155,19 @@ function formatNotInstalled(result) {
3840
4155
  `Command not found: ${server.command[0]}`,
3841
4156
  ""
3842
4157
  ];
4158
+ const installOptions = formatInstallOptions(server.id, installHint);
3843
4159
  if (decision === "allowed") {
3844
4160
  return [
3845
4161
  ...header,
3846
4162
  "The user has pre-authorized LSP installation. Run the install command, then retry this tool:",
3847
- ` ${installHint}`
4163
+ ...installOptions.slice(1)
3848
4164
  ].join(`
3849
4165
  `);
3850
4166
  }
3851
4167
  if (!context.capabilities.installDecisionTool) {
3852
4168
  return [
3853
4169
  ...header,
3854
- "To install, run:",
3855
- ` ${installHint}`,
4170
+ ...installOptions,
3856
4171
  "",
3857
4172
  "ACTION REQUIRED — ASK THE USER whether to install this LSP server.",
3858
4173
  "Install-decision recording is unavailable in this harness; proceed without LSP if the user declines."
@@ -3861,8 +4176,7 @@ function formatNotInstalled(result) {
3861
4176
  }
3862
4177
  return [
3863
4178
  ...header,
3864
- "To install, run:",
3865
- ` ${installHint}`,
4179
+ ...installOptions,
3866
4180
  "",
3867
4181
  "ACTION REQUIRED — ASK THE USER whether to install this LSP server.",
3868
4182
  "- If the user agrees: run the install command above, then retry this tool.",
@@ -3917,8 +4231,8 @@ async function withLspClient(filePath, fn, toolName, options = {}) {
3917
4231
  }
3918
4232
 
3919
4233
  // ../lsp-core/src/lsp/directory-diagnostics.ts
3920
- import { existsSync as existsSync10, lstatSync as lstatSync4, readdirSync as readdirSync3 } from "node:fs";
3921
- import { join as join5, resolve as resolve8 } from "node:path";
4234
+ import { existsSync as existsSync11, lstatSync as lstatSync4, readdirSync as readdirSync3 } from "node:fs";
4235
+ import { join as join6, resolve as resolve9 } from "node:path";
3922
4236
 
3923
4237
  // ../lsp-core/src/lsp/formatters.ts
3924
4238
  import { fileURLToPath as fileURLToPath2 } from "node:url";
@@ -3933,10 +4247,10 @@ function uriToPath(uri) {
3933
4247
  }
3934
4248
  function formatLocation(loc) {
3935
4249
  if ("targetUri" in loc) {
3936
- const uri2 = uriToPath(loc.targetUri);
3937
- const line2 = loc.targetRange.start.line + 1;
3938
- const char2 = loc.targetRange.start.character;
3939
- return `${uri2}:${line2}:${char2}`;
4250
+ const uri = uriToPath(loc.targetUri);
4251
+ const line = loc.targetRange.start.line + 1;
4252
+ const char = loc.targetRange.start.character;
4253
+ return `${uri}:${line}:${char}`;
3940
4254
  }
3941
4255
  const uri = uriToPath(loc.uri);
3942
4256
  const line = loc.range.start.line + 1;
@@ -4048,7 +4362,7 @@ function collectFilesWithExtension(dir, extension, maxFiles) {
4048
4362
  for (const entry of entries) {
4049
4363
  if (files.length >= maxFiles)
4050
4364
  return;
4051
- const fullPath = join5(currentDir, entry);
4365
+ const fullPath = join6(currentDir, entry);
4052
4366
  let stat;
4053
4367
  try {
4054
4368
  stat = lstatSync4(fullPath);
@@ -4073,8 +4387,8 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
4073
4387
  if (!extension.startsWith(".")) {
4074
4388
  throw new LspInvalidPathError(`Extension must start with a dot (e.g., ".ts", not "${extension}"). Use ".${extension}" instead.`);
4075
4389
  }
4076
- const absDir = resolve8(options.workspaceRoot ?? contextCwd(), directory);
4077
- if (!existsSync10(absDir)) {
4390
+ const absDir = resolve9(options.workspaceRoot ?? contextCwd(), directory);
4391
+ if (!existsSync11(absDir)) {
4078
4392
  throw new LspInvalidPathError(`Directory does not exist: ${absDir}`);
4079
4393
  }
4080
4394
  const serverResult = options.server === undefined ? findServerForExtension(extension) : { status: "found", server: options.server };
@@ -4161,7 +4475,7 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
4161
4475
 
4162
4476
  // ../lsp-core/src/lsp/infer-extension.ts
4163
4477
  import { lstatSync as lstatSync5, readdirSync as readdirSync4 } from "node:fs";
4164
- import { join as join6 } from "node:path";
4478
+ import { join as join7 } from "node:path";
4165
4479
  var SKIP_DIRECTORIES2 = new Set(["node_modules", ".git", "dist", "build", ".next", "out"]);
4166
4480
  var MAX_SCAN_ENTRIES = 500;
4167
4481
  function inferExtensionFromDirectory(directory) {
@@ -4179,7 +4493,7 @@ function inferExtensionFromDirectory(directory) {
4179
4493
  for (const entry of entries) {
4180
4494
  if (scanned >= MAX_SCAN_ENTRIES)
4181
4495
  return;
4182
- const fullPath = join6(dir, entry);
4496
+ const fullPath = join7(dir, entry);
4183
4497
  let stat;
4184
4498
  try {
4185
4499
  stat = lstatSync5(fullPath);
@@ -4338,8 +4652,8 @@ function clientOptions(signal) {
4338
4652
  }
4339
4653
 
4340
4654
  // ../lsp-core/src/tools/result.ts
4341
- function text(text2, details, isError = false) {
4342
- return { content: [{ type: "text", text: text2 }], details, isError };
4655
+ function text(text, details, isError = false) {
4656
+ return { content: [{ type: "text", text }], details, isError };
4343
4657
  }
4344
4658
 
4345
4659
  // ../lsp-core/src/tools/diagnostics.ts
@@ -4359,7 +4673,7 @@ async function executeLspDiagnostics(params, signal) {
4359
4673
  const extension = inferExtensionFromDirectory(absPath);
4360
4674
  if (!extension) {
4361
4675
  const message = `No supported source files found in directory: ${absPath}`;
4362
- const details3 = {
4676
+ const details = {
4363
4677
  filePath,
4364
4678
  severity,
4365
4679
  mode: "directory",
@@ -4369,24 +4683,24 @@ async function executeLspDiagnostics(params, signal) {
4369
4683
  error: message,
4370
4684
  errorKind: "no_files"
4371
4685
  };
4372
- return text(message, details3);
4686
+ return text(message, details);
4373
4687
  }
4374
- const output2 = await aggregateDiagnosticsForDirectory(absPath, extension, severity, undefined, signal === undefined ? {} : { signal });
4375
- const details2 = {
4688
+ const output = await aggregateDiagnosticsForDirectory(absPath, extension, severity, undefined, signal === undefined ? {} : { signal });
4689
+ const details = {
4376
4690
  filePath,
4377
4691
  severity,
4378
4692
  mode: "directory",
4379
4693
  diagnostics: [],
4380
- totalDiagnostics: output2.totalDiagnostics,
4694
+ totalDiagnostics: output.totalDiagnostics,
4381
4695
  truncated: false,
4382
- fileFailures: [...output2.fileFailures]
4696
+ fileFailures: [...output.fileFailures]
4383
4697
  };
4384
- return text(output2.output, details2);
4698
+ return text(output.output, details);
4385
4699
  }
4386
4700
  const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.diagnostics(resolvedFilePath, signal), "diagnostics", clientOptions(signal));
4387
4701
  if (result.transientError) {
4388
4702
  const message = result.transientError.message;
4389
- const details2 = {
4703
+ const details = {
4390
4704
  filePath,
4391
4705
  severity,
4392
4706
  mode: "file",
@@ -4396,7 +4710,7 @@ async function executeLspDiagnostics(params, signal) {
4396
4710
  error: message,
4397
4711
  errorKind: result.transientError.kind
4398
4712
  };
4399
- return text(message, details2, true);
4713
+ return text(message, details, true);
4400
4714
  }
4401
4715
  const diagnostics = filterDiagnosticsBySeverity(asDiagnosticArray(result), severity);
4402
4716
  const total = diagnostics.length;
@@ -4430,6 +4744,96 @@ async function executeLspDiagnostics(params, signal) {
4430
4744
  throw error;
4431
4745
  }
4432
4746
  }
4747
+ // ../lsp-core/src/lsp/format-document.ts
4748
+ import { readFileSync as readFileSync5, renameSync as renameSync3, unlinkSync, writeFileSync as writeFileSync3 } from "node:fs";
4749
+ var DEFAULT_FORMATTING_OPTIONS = {
4750
+ tabSize: 4,
4751
+ insertSpaces: false,
4752
+ trimTrailingWhitespace: true,
4753
+ insertFinalNewline: true,
4754
+ trimFinalNewlines: true
4755
+ };
4756
+ var UNCHANGED = { status: "unchanged", linesAdded: 0, linesRemoved: 0 };
4757
+ async function formatDocumentWithClient(client, filePath, options = {}) {
4758
+ const edits = await client.formatDocument(filePath, options.formattingOptions ?? DEFAULT_FORMATTING_OPTIONS, options.signal);
4759
+ if (edits === null)
4760
+ return { status: "unavailable", reason: "capability_not_advertised" };
4761
+ if (edits.length === 0)
4762
+ return UNCHANGED;
4763
+ const before = readFileSync5(filePath, "utf-8");
4764
+ const normalized = normalizeTextEdits(before, edits, 0);
4765
+ if (normalized.text === before)
4766
+ return UNCHANGED;
4767
+ writeAtomically(filePath, normalized.text);
4768
+ await client.openFile(filePath);
4769
+ return {
4770
+ status: "formatted",
4771
+ ...lineDelta(normalized.edits)
4772
+ };
4773
+ }
4774
+ function lineDelta(edits) {
4775
+ let linesAdded = 0;
4776
+ let linesRemoved = 0;
4777
+ for (const edit of edits) {
4778
+ linesRemoved += edit.range.end.line - edit.range.start.line + 1;
4779
+ linesAdded += edit.newText.split(`
4780
+ `).length;
4781
+ }
4782
+ return { linesAdded, linesRemoved };
4783
+ }
4784
+ function writeAtomically(filePath, content) {
4785
+ const tempPath = `${filePath}.omo-format.tmp`;
4786
+ writeFileSync3(tempPath, content, "utf-8");
4787
+ try {
4788
+ renameSync3(tempPath, filePath);
4789
+ } catch (error) {
4790
+ try {
4791
+ unlinkSync(tempPath);
4792
+ } catch {}
4793
+ throw error;
4794
+ }
4795
+ }
4796
+
4797
+ // ../lsp-core/src/tools/format.ts
4798
+ async function executeLspFormat(params, signal) {
4799
+ const filePath = requireString(params, "filePath");
4800
+ try {
4801
+ const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => formatDocumentWithClient(client, resolvedFilePath, signal === undefined ? {} : { signal }), "format", clientOptions(signal));
4802
+ return text(describeResult(filePath, result), formatDetails(filePath, result));
4803
+ } catch (error) {
4804
+ const missingDependency = missingDependencyResult(error, {
4805
+ filePath,
4806
+ status: "unavailable",
4807
+ reason: "server_unavailable",
4808
+ linesAdded: 0,
4809
+ linesRemoved: 0
4810
+ });
4811
+ if (missingDependency)
4812
+ return missingDependency;
4813
+ throw error;
4814
+ }
4815
+ }
4816
+ function formatDetails(filePath, result) {
4817
+ if (result.status === "unavailable") {
4818
+ return { filePath, status: "unavailable", reason: result.reason, linesAdded: 0, linesRemoved: 0 };
4819
+ }
4820
+ return {
4821
+ filePath,
4822
+ status: result.status,
4823
+ linesAdded: result.linesAdded,
4824
+ linesRemoved: result.linesRemoved
4825
+ };
4826
+ }
4827
+ function describeResult(filePath, result) {
4828
+ if (result.status === "unavailable") {
4829
+ return `Formatting unavailable for ${filePath}: the language server does not advertise documentFormattingProvider.`;
4830
+ }
4831
+ if (result.status === "unchanged") {
4832
+ return `Already formatted: ${filePath}`;
4833
+ }
4834
+ return `Formatted ${filePath} (+${result.linesAdded}/-${result.linesRemoved} lines)`;
4835
+ }
4836
+
4433
4837
  // ../lsp-core/src/tools/install-decision.ts
4434
4838
  async function executeLspInstallDecision(params) {
4435
4839
  const serverId = requireString(params, "server_id");
@@ -4623,8 +5027,8 @@ async function executeLspSymbols(params, signal) {
4623
5027
  errorKind: "missing_query"
4624
5028
  });
4625
5029
  }
4626
- const symbols2 = await withLspClient(filePath, async (client) => client.workspaceSymbols(query, signal), "workspaceSymbols", clientOptions(signal));
4627
- return formatSymbolsResult(filePath, scope, symbols2, limit, query);
5030
+ const symbols = await withLspClient(filePath, async (client) => client.workspaceSymbols(query, signal), "workspaceSymbols", clientOptions(signal));
5031
+ return formatSymbolsResult(filePath, scope, symbols, limit, query);
4628
5032
  }
4629
5033
  const symbols = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.documentSymbols(resolvedFilePath, signal), "documentSymbols", clientOptions(signal));
4630
5034
  return formatSymbolsResult(filePath, scope, symbols, limit);
@@ -4762,6 +5166,16 @@ var LSP_MCP_TOOLS = [
4762
5166
  }, ["filePath", "line", "character", "newName"]),
4763
5167
  execute: executeLspRename
4764
5168
  },
5169
+ {
5170
+ name: "format",
5171
+ aliases: ["lsp_format"],
5172
+ title: "LSP Format",
5173
+ description: "Format a source file with its language server and write the returned edits to disk.",
5174
+ inputSchema: objectSchema({
5175
+ filePath: { type: "string", description: "Source file path to format." }
5176
+ }, ["filePath"]),
5177
+ execute: executeLspFormat
5178
+ },
4765
5179
  {
4766
5180
  name: "install_decision",
4767
5181
  aliases: ["lsp_install_decision"],
@@ -4795,16 +5209,17 @@ function coerceToolArguments(value) {
4795
5209
  return isRecord7(value) ? value : {};
4796
5210
  }
4797
5211
  export {
4798
- isRecord7 as isRecord,
4799
- executeLspTool,
4800
- executeLspSymbols,
4801
- executeLspStatus,
4802
- executeLspRename,
4803
- executeLspPrepareRename,
4804
- executeLspInstallDecision,
4805
- executeLspGotoDefinition,
4806
- executeLspFindReferences,
4807
- executeLspDiagnostics,
5212
+ LSP_MCP_TOOLS,
4808
5213
  coerceToolArguments,
4809
- LSP_MCP_TOOLS
5214
+ executeLspDiagnostics,
5215
+ executeLspFindReferences,
5216
+ executeLspFormat,
5217
+ executeLspGotoDefinition,
5218
+ executeLspInstallDecision,
5219
+ executeLspPrepareRename,
5220
+ executeLspRename,
5221
+ executeLspStatus,
5222
+ executeLspSymbols,
5223
+ executeLspTool,
5224
+ isRecord7 as isRecord
4810
5225
  };