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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1229) hide show
  1. package/.agents/command/publish.md +59 -23
  2. package/.agents/command/remove-deadcode.md +1 -1
  3. package/.agents/skills/codex-qa/scripts/lsp-e2e.sh +1 -3
  4. package/.agents/skills/hyperplan/SKILL.md +5 -5
  5. package/.agents/skills/opencode-qa/scripts/lsp-e2e.sh +1 -1
  6. package/.agents/skills/pre-publish-review/SKILL.md +9 -12
  7. package/.agents/skills/publish/SKILL.md +59 -23
  8. package/.agents/skills/remove-deadcode/SKILL.md +1 -1
  9. package/.agents/skills/security-research/SKILL.md +4 -4
  10. package/.agents/skills/senpi-qa/SKILL.md +80 -0
  11. package/.agents/skills/senpi-qa/scripts/resolve-evidence-dir.mjs +65 -0
  12. package/.agents/skills/senpi-qa/scripts/resolve-evidence-dir.test.mjs +171 -0
  13. package/.agents/skills/tech-debt-audit/SKILL.md +6 -76
  14. package/.opencode/command/publish.md +59 -23
  15. package/.opencode/skills/pre-publish-review/SKILL.md +9 -12
  16. package/README.ja.md +66 -61
  17. package/README.ko.md +67 -62
  18. package/README.md +108 -182
  19. package/README.ru.md +63 -61
  20. package/README.zh-cn.md +62 -61
  21. package/THIRD-PARTY-NOTICES.md +35 -105
  22. package/dist/agents/atlas/agent.d.ts +0 -1
  23. package/dist/agents/gpt-prompt-identity.d.ts +1 -1
  24. package/dist/agents/sisyphus-runtime-prompt-reconciler.d.ts +15 -4
  25. package/dist/agents/types.d.ts +4 -2
  26. package/dist/cli/config-manager/parse-opencode-config-file.d.ts +2 -1
  27. package/dist/cli/doctor/checks/browser-provider.d.ts +2 -0
  28. package/dist/cli/doctor/checks/index.d.ts +2 -0
  29. package/dist/cli/doctor/checks/latest-version.d.ts +11 -0
  30. package/dist/cli/doctor/checks/system-plugin.d.ts +4 -3
  31. package/dist/cli/doctor/framework/constants.d.ts +5 -0
  32. package/dist/cli/doctor/framework/types.d.ts +2 -0
  33. package/dist/cli/fallback-lane-policy.d.ts +1 -0
  34. package/dist/cli/index.js +50191 -58043
  35. package/dist/cli/install-codex/install-codex-test-fixtures.d.ts +1 -1
  36. package/dist/cli/run/on-complete-hook.d.ts +2 -0
  37. package/dist/cli/runtime-commands.d.ts +1 -1
  38. package/dist/cli/worktree-sweep/classify.d.ts +16 -0
  39. package/dist/cli/worktree-sweep/format.d.ts +8 -0
  40. package/dist/cli/worktree-sweep/git.d.ts +19 -0
  41. package/dist/cli/worktree-sweep/index.d.ts +7 -0
  42. package/dist/cli/worktree-sweep/options.d.ts +2 -0
  43. package/dist/cli/worktree-sweep/parse-worktree-list.d.ts +8 -0
  44. package/dist/cli/worktree-sweep/sweep.d.ts +2 -0
  45. package/dist/cli/worktree-sweep/types.d.ts +65 -0
  46. package/dist/cli/worktree-sweep/worktree-sweep.d.ts +2 -0
  47. package/dist/cli-node/index.js +51708 -59537
  48. package/dist/config/index.d.ts +1 -1
  49. package/dist/config/schema/agent-names.d.ts +0 -1
  50. package/dist/config/schema/background-task.d.ts +1 -0
  51. package/dist/config/schema/browser-automation.d.ts +0 -2
  52. package/dist/config/schema/commands.d.ts +1 -1
  53. package/dist/config/schema/hooks.d.ts +1 -2
  54. package/dist/config/schema/oh-my-opencode-config.d.ts +5 -12
  55. package/dist/config/schema/ulw-execute.d.ts +5 -0
  56. package/dist/config/schema.d.ts +0 -1
  57. package/dist/config/validate.d.ts +2 -0
  58. package/dist/config-migration/category-deep-split.d.ts +3 -0
  59. package/dist/config-migration/migration-plans.d.ts +1 -0
  60. package/dist/create-hooks.d.ts +3 -2
  61. package/dist/features/background-agent/compaction-aware-message-resolver.d.ts +1 -0
  62. package/dist/features/background-agent/constants.d.ts +0 -7
  63. package/dist/features/background-agent/error-classifier.d.ts +1 -0
  64. package/dist/features/background-agent/manager.d.ts +9 -1
  65. package/dist/features/background-agent/parent-wake-dispatched-tracker.d.ts +0 -1
  66. package/dist/features/background-agent/parent-wake-notifier-types.d.ts +1 -1
  67. package/dist/features/background-agent/parent-wake-prompt-dispatch.d.ts +1 -1
  68. package/dist/features/background-agent/parent-wake-session-inspector.d.ts +1 -1
  69. package/dist/features/background-agent/subagent-spawn-limits.d.ts +8 -0
  70. package/dist/features/background-agent/types.d.ts +4 -0
  71. package/dist/features/boulder-state/storage.d.ts +1 -1
  72. package/dist/features/btw-side/btw-command-draft.d.ts +7 -0
  73. package/dist/features/btw-side/context-injector.d.ts +15 -0
  74. package/dist/features/btw-side/index.d.ts +8 -0
  75. package/dist/features/btw-side/metadata.d.ts +15 -0
  76. package/dist/features/btw-side/parent-context-budget.d.ts +9 -0
  77. package/dist/features/btw-side/server-session-registry.d.ts +8 -0
  78. package/dist/features/btw-side/tui-adoption-cache.d.ts +13 -0
  79. package/dist/features/btw-side/tui-adoption-guard.d.ts +5 -0
  80. package/dist/features/btw-side/tui-controller-types.d.ts +68 -0
  81. package/dist/features/btw-side/tui-controller.d.ts +19 -0
  82. package/dist/features/btw-side/tui-escape-return.d.ts +12 -0
  83. package/dist/features/btw-side/tui-keymap.d.ts +17 -0
  84. package/dist/features/btw-side/tui-parent-validator.d.ts +6 -0
  85. package/dist/features/btw-side/tui-picker-options.d.ts +20 -0
  86. package/dist/features/btw-side/tui-picker.d.ts +9 -0
  87. package/dist/features/btw-side/tui-prompt-queue.d.ts +8 -0
  88. package/dist/features/btw-side/tui-session-bridge.d.ts +11 -0
  89. package/dist/features/btw-side/tui-session-catalog.d.ts +35 -0
  90. package/dist/features/btw-side/tui-side-removal.d.ts +11 -0
  91. package/dist/features/btw-side/tui-side-start.d.ts +9 -0
  92. package/dist/features/btw-side/tui-wiring.d.ts +8 -0
  93. package/dist/features/builtin-commands/templates/hyperplan.d.ts +1 -1
  94. package/dist/features/builtin-commands/templates/refactor-sections/team-mode-addendum.d.ts +1 -1
  95. package/dist/features/builtin-commands/templates/remove-ai-slops.d.ts +1 -1
  96. package/dist/features/builtin-commands/templates/ulw-execute.d.ts +1 -0
  97. package/dist/features/builtin-commands/types.d.ts +1 -1
  98. package/dist/features/claude-tasks/storage.d.ts +7 -2
  99. package/dist/features/hook-message-injector/index.d.ts +1 -0
  100. package/dist/features/hook-message-injector/sdk-message-lookup.d.ts +1 -0
  101. package/dist/features/monitor/manager-internals.d.ts +1 -1
  102. package/dist/features/monitor/output-injector-types.d.ts +1 -1
  103. package/dist/features/opengateway-provider/index.d.ts +13 -0
  104. package/dist/features/task-toast-manager/manager.d.ts +0 -24
  105. package/dist/features/team-mode/tools/messaging-fallback-wake.d.ts +17 -0
  106. package/dist/features/team-mode/tools/messaging-live-delivery-recipient.d.ts +3 -0
  107. package/dist/features/team-mode/tools/messaging-runtime.d.ts +7 -0
  108. package/dist/hooks/anthropic-context-window-limit-recovery/message-storage-directory.d.ts +0 -3
  109. package/dist/hooks/anthropic-context-window-limit-recovery/state.d.ts +1 -0
  110. package/dist/hooks/anthropic-context-window-limit-recovery/storage/empty-messages.d.ts +0 -1
  111. package/dist/hooks/anthropic-context-window-limit-recovery/tool-result-storage.d.ts +11 -0
  112. package/dist/hooks/atlas/atlas-hook.d.ts +1 -0
  113. package/dist/hooks/atlas/atlas-lifecycle-store.d.ts +50 -0
  114. package/dist/hooks/atlas/event-handler.d.ts +1 -0
  115. package/dist/hooks/atlas/final-wave-approval-gate.test-support.d.ts +50 -0
  116. package/dist/hooks/atlas/system-reminder-templates.d.ts +0 -1
  117. package/dist/hooks/atlas/tool-execute-before.d.ts +3 -0
  118. package/dist/hooks/atlas/types.d.ts +1 -0
  119. package/dist/hooks/claude-code-hooks/session-hook-state.d.ts +1 -0
  120. package/dist/hooks/claude-code-hooks/stop.d.ts +2 -0
  121. package/dist/hooks/claude-code-hooks/todo.d.ts +0 -1
  122. package/dist/hooks/claude-code-hooks/transcript.d.ts +2 -0
  123. package/dist/hooks/comment-checker/__fixtures__/download-probe.fixture.d.ts +1 -0
  124. package/dist/hooks/compaction-context-injector/validated-model.d.ts +2 -0
  125. package/dist/hooks/fsync-skip-warning/index.d.ts +4 -0
  126. package/dist/hooks/hashline-edit-diff-enhancer/hook.d.ts +1 -0
  127. package/dist/hooks/hashline-edit-diff-enhancer/pending-captures.d.ts +13 -0
  128. package/dist/hooks/index.d.ts +1 -2
  129. package/dist/hooks/keyword-detector/hook.d.ts +9 -0
  130. package/dist/hooks/keyword-detector/ultrawork/index.d.ts +2 -0
  131. package/dist/hooks/keyword-detector/ultrawork/source-detector.d.ts +0 -1
  132. package/dist/hooks/model-fallback/hook.d.ts +1 -1
  133. package/dist/hooks/plan-format-validator/hook.d.ts +19 -0
  134. package/dist/hooks/prometheus-md-only/agent-resolution.d.ts +2 -2
  135. package/dist/hooks/runtime-fallback/chat-message-handler.d.ts +2 -0
  136. package/dist/hooks/runtime-fallback/retry-model-payload.d.ts +1 -0
  137. package/dist/hooks/runtime-fallback/runtime-model-settings.d.ts +6 -0
  138. package/dist/hooks/runtime-fallback/session-status-handler.d.ts +1 -1
  139. package/dist/hooks/runtime-fallback/types.d.ts +3 -1
  140. package/dist/hooks/sisyphus-junior-notepad/constants.d.ts +1 -1
  141. package/dist/hooks/todo-continuation-enforcer/types.d.ts +1 -0
  142. package/dist/hooks/{start-work → ulw-execute}/context-info-builder.d.ts +1 -1
  143. package/dist/hooks/{start-work → ulw-execute}/index.d.ts +1 -1
  144. package/dist/hooks/ulw-execute/ulw-execute-hook.d.ts +23 -0
  145. package/dist/hooks/unstable-agent-babysitter/task-message-analyzer.d.ts +1 -0
  146. package/dist/index.js +30870 -27341
  147. package/dist/mcp/index.d.ts +0 -4
  148. package/dist/mcp/types.d.ts +0 -1
  149. package/dist/oh-my-opencode.schema.json +25 -52
  150. package/dist/plugin/chat-message/types.d.ts +6 -4
  151. package/dist/plugin/chat-message/ulw-execute-message.d.ts +5 -0
  152. package/dist/plugin/event-session-lifecycle.d.ts +1 -0
  153. package/dist/plugin/hooks/create-core-hooks.d.ts +2 -2
  154. package/dist/plugin/hooks/create-session-hooks.d.ts +2 -3
  155. package/dist/plugin/hooks/create-transform-hooks.d.ts +2 -0
  156. package/dist/plugin/messages-transform.d.ts +1 -0
  157. package/dist/plugin/stop-continuation.d.ts +3 -0
  158. package/dist/plugin/system-transform.d.ts +5 -1
  159. package/dist/plugin-config/omo-config-chain.d.ts +1 -0
  160. package/dist/plugin-dispose.d.ts +3 -0
  161. package/dist/shared/agent-tool-restrictions.d.ts +0 -1
  162. package/dist/shared/compaction-agent-config-checkpoint.d.ts +1 -0
  163. package/dist/shared/index.d.ts +2 -0
  164. package/dist/shared/legacy-plugin-warning.d.ts +2 -1
  165. package/dist/shared/omo-process-sweep.d.ts +2 -4
  166. package/dist/shared/plugin-entry-migrator.d.ts +4 -3
  167. package/dist/shared/plugin-entry-shape.d.ts +6 -0
  168. package/dist/shared/runtime-fallback-retry-marker.d.ts +16 -0
  169. package/dist/shared/shell-env.d.ts +1 -1
  170. package/dist/skills/ast-grep/AGENTS.md +51 -0
  171. package/dist/skills/ast-grep/SKILL.md +13 -1
  172. package/dist/skills/coding-agent-sessions/AGENTS.md +62 -0
  173. package/dist/skills/coding-agent-sessions/SKILL.md +1 -1
  174. package/dist/skills/data-scientist/SKILL.md +99 -239
  175. package/dist/skills/data-scientist/references/execution-surfaces.md +91 -0
  176. package/dist/skills/data-scientist/references/placement.md +74 -0
  177. package/dist/skills/data-scientist/references/polars-lane.md +95 -0
  178. package/dist/skills/data-scientist/references/uv-setup.md +1 -1
  179. package/dist/skills/data-scientist/references/visualization.md +64 -0
  180. package/dist/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
  181. package/dist/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
  182. package/dist/skills/debugging/SKILL.md +3 -1
  183. package/dist/skills/debugging/references/methodology/00-setup.md +12 -0
  184. package/dist/skills/debugging/references/methodology/02-investigate.md +26 -5
  185. package/dist/skills/debugging/references/runtimes/go.md +15 -1
  186. package/dist/skills/debugging/references/runtimes/native-binary.md +38 -0
  187. package/dist/skills/debugging/references/runtimes/node.md +25 -0
  188. package/dist/skills/debugging/references/runtimes/python.md +13 -0
  189. package/dist/skills/debugging/references/runtimes/rust.md +41 -0
  190. package/dist/skills/debugging/references/scripts/dap.mjs +267 -0
  191. package/dist/skills/debugging/references/scripts/dap.test.ts +86 -0
  192. package/dist/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
  193. package/dist/skills/debugging/references/tools/dap.md +103 -0
  194. package/dist/skills/debugging/references/tools/frida.md +193 -0
  195. package/dist/skills/debugging/references/tools/playwright-cli.md +79 -161
  196. package/dist/skills/frontend/ATTRIBUTION.md +10 -0
  197. package/dist/skills/frontend/SKILL.md +7 -3
  198. package/dist/skills/frontend/references/design/README.md +10 -2
  199. package/dist/skills/frontend/references/design/_INDEX.md +1 -0
  200. package/dist/skills/frontend/references/design/ambience-skill.md +145 -0
  201. package/dist/skills/frontend/references/design/aside.md +1 -1
  202. package/dist/skills/frontend/references/design/clone-from-url.md +1 -1
  203. package/dist/skills/frontend/references/design/interaction-skill.md +2 -0
  204. package/dist/skills/frontend/references/design/print-paged-media.md +76 -0
  205. package/dist/skills/frontend/references/designpowers/README.md +1 -1
  206. package/dist/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
  207. package/dist/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
  208. package/dist/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
  209. package/dist/skills/frontend/references/designpowers/orchestration.md +1 -1
  210. package/dist/skills/frontend/references/designpowers/routing.md +5 -5
  211. package/dist/skills/frontend/scripts/perfection/lighthouse-audit.py +2 -2
  212. package/dist/skills/git-master/SKILL.md +1 -1
  213. package/dist/skills/init-deep/SKILL.md +14 -14
  214. package/dist/skills/lsp-setup/SKILL.md +1 -1
  215. package/dist/skills/programming/SKILL.md +1 -1
  216. package/dist/skills/refactor/SKILL.md +5 -5
  217. package/dist/skills/remove-ai-slops/SKILL.md +5 -5
  218. package/dist/skills/review-work/SKILL.md +101 -419
  219. package/dist/skills/ultimate-browsing/ATTRIBUTION.md +32 -86
  220. package/dist/skills/ultimate-browsing/SKILL.md +32 -27
  221. package/dist/skills/ultimate-browsing/engine/AGENTS.md +111 -0
  222. package/dist/skills/ultimate-browsing/engine/templates/package.json +2 -2
  223. package/dist/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +5 -2
  224. package/dist/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +8 -6
  225. package/dist/skills/ultimate-browsing/engine/tests/test_playwright_stealth.py +86 -0
  226. package/dist/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +4 -7
  227. package/dist/skills/ultimate-browsing/references/chrome-stealth.md +86 -95
  228. package/dist/skills/ultimate-browsing/references/insane-search/README.md +18 -5
  229. package/dist/skills/ultimate-browsing/references/insane-search/playwright.md +16 -13
  230. package/dist/skills/ultimate-browsing/scripts/extract_cookies.py +3 -3
  231. package/dist/skills/{start-work → ulw-execute}/SKILL.md +24 -22
  232. package/dist/skills/ulw-plan/SKILL.md +5 -6
  233. package/dist/skills/ulw-plan/references/full-workflow.md +6 -5
  234. package/dist/skills/ulw-plan/references/intent-unclear.md +2 -2
  235. package/dist/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -1
  236. package/dist/skills/ulw-research/SKILL.md +10 -5
  237. package/dist/skills/visual-qa/AGENTS.md +58 -0
  238. package/dist/skills/visual-qa/SKILL.md +4 -3
  239. package/dist/skills/visual-qa/references/browser-setup.md +75 -0
  240. package/dist/tools/delegate-task/builtin-categories.d.ts +3 -1
  241. package/dist/tools/delegate-task/builtin-category-definition.d.ts +2 -1
  242. package/dist/tools/delegate-task/constants.d.ts +2 -2
  243. package/dist/tools/delegate-task/openai-categories.d.ts +10 -3
  244. package/dist/tools/delegate-task/sync-session-cleanup.d.ts +3 -0
  245. package/dist/tools/delegate-task/sync-session-poller.d.ts +1 -0
  246. package/dist/tools/delegate-task/tool-description.d.ts +3 -1
  247. package/dist/tools/delegate-task/types.d.ts +4 -0
  248. package/dist/tools/session-manager/directory-filter.d.ts +2 -0
  249. package/dist/tui.d.ts +12 -0
  250. package/dist/tui.js +37073 -46672
  251. package/package.json +44 -45
  252. package/packages/git-bash-mcp/dist/cli.js +6 -1
  253. package/packages/git-bash-mcp/package.json +1 -1
  254. package/packages/lsp-core/src/index.ts +1 -0
  255. package/packages/lsp-core/src/lsp/client-diagnostics-concurrency.integration.test.ts +9 -1
  256. package/packages/lsp-core/src/lsp/client-diagnostics-freshness.integration.test.ts +100 -28
  257. package/packages/lsp-core/src/lsp/client-diagnostics-pull-timeout.test.ts +64 -0
  258. package/packages/lsp-core/src/lsp/client-wrapper-outside-cwd.test.ts +78 -0
  259. package/packages/lsp-core/src/lsp/client-wrapper.test.ts +103 -6
  260. package/packages/lsp-core/src/lsp/client-wrapper.ts +50 -16
  261. package/packages/lsp-core/src/lsp/client.ts +32 -3
  262. package/packages/lsp-core/src/lsp/connection.ts +16 -0
  263. package/packages/lsp-core/src/lsp/constants.ts +6 -0
  264. package/packages/lsp-core/src/lsp/controlled-clock-test-support.ts +90 -0
  265. package/packages/lsp-core/src/lsp/errors.ts +15 -0
  266. package/packages/lsp-core/src/lsp/fixtures/workspace-edit-server.mjs +10 -3
  267. package/packages/lsp-core/src/lsp/format-document.test.ts +143 -0
  268. package/packages/lsp-core/src/lsp/format-document.ts +90 -0
  269. package/packages/lsp-core/src/lsp/json-rpc-connection.ts +11 -6
  270. package/packages/lsp-core/src/lsp/manager-lifecycle.test.ts +262 -0
  271. package/packages/lsp-core/src/lsp/manager-max-clients.test.ts +151 -0
  272. package/packages/lsp-core/src/lsp/manager.ts +138 -12
  273. package/packages/lsp-core/src/lsp/outside-context-workspace.ts +33 -0
  274. package/packages/lsp-core/src/lsp/server-definitions.ts +29 -0
  275. package/packages/lsp-core/src/lsp/server-installation.test.ts +376 -0
  276. package/packages/lsp-core/src/lsp/server-installation.ts +200 -27
  277. package/packages/lsp-core/src/lsp/server-resolution-local-binary.test.ts +170 -0
  278. package/packages/lsp-core/src/lsp/server-resolution.ts +18 -5
  279. package/packages/lsp-core/src/lsp/timer-provider.ts +13 -0
  280. package/packages/lsp-core/src/lsp/transport-request-timeout.test.ts +73 -0
  281. package/packages/lsp-core/src/lsp/transport.ts +16 -2
  282. package/packages/lsp-core/src/lsp/types.ts +8 -0
  283. package/packages/lsp-core/src/lsp/workspace-apply-edit-test-support.ts +29 -1
  284. package/packages/lsp-core/src/lsp/workspace-document-state.test.ts +84 -1
  285. package/packages/lsp-core/src/lsp/workspace-document-state.ts +35 -11
  286. package/packages/lsp-core/src/lsp/workspace-markers.ts +18 -0
  287. package/packages/lsp-core/src/mcp.ts +3 -0
  288. package/packages/lsp-core/src/request-context.test.ts +29 -0
  289. package/packages/lsp-core/src/request-context.ts +1 -1
  290. package/packages/lsp-core/src/tool-surface.test.ts +13 -1
  291. package/packages/lsp-core/src/tools/definitions.ts +14 -0
  292. package/packages/lsp-core/src/tools/format.test.ts +56 -0
  293. package/packages/lsp-core/src/tools/format.ts +56 -0
  294. package/packages/lsp-core/src/tools/index.ts +1 -0
  295. package/packages/lsp-core/src/tools/parameters.test.ts +51 -0
  296. package/packages/lsp-core/src/tools/types.ts +10 -0
  297. package/packages/lsp-daemon/dist/cli.js +904 -479
  298. package/packages/lsp-daemon/dist/client.d.ts +10 -0
  299. package/packages/lsp-daemon/dist/client.js +922 -493
  300. package/packages/lsp-daemon/dist/daemon-client.d.ts +1 -0
  301. package/packages/lsp-daemon/dist/daemon-client.js +3 -0
  302. package/packages/lsp-daemon/dist/ensure-daemon.d.ts +6 -1
  303. package/packages/lsp-daemon/dist/ensure-daemon.js +10 -2
  304. package/packages/lsp-daemon/dist/index.js +826 -402
  305. package/packages/lsp-daemon/dist/ownership.js +2 -2
  306. package/packages/lsp-daemon/dist/proxy.js +3 -0
  307. package/packages/lsp-daemon/dist/version-reap.js +1 -1
  308. package/packages/lsp-daemon/package.json +1 -1
  309. package/packages/lsp-tools-mcp/dist/cli.js +764 -341
  310. package/packages/lsp-tools-mcp/dist/lsp/manager.js +274 -138
  311. package/packages/lsp-tools-mcp/dist/mcp.js +789 -368
  312. package/packages/lsp-tools-mcp/dist/request-context.js +12 -13
  313. package/packages/lsp-tools-mcp/dist/tools.js +719 -302
  314. package/packages/lsp-tools-mcp/package.json +1 -1
  315. package/packages/omo-codex/THIRD-PARTY-NOTICES.md +4 -21
  316. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +4 -6
  317. package/packages/omo-codex/plugin/.mcp.json +0 -6
  318. package/packages/omo-codex/plugin/AGENTS.md +47 -0
  319. package/packages/omo-codex/plugin/README.md +6 -2
  320. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +7175 -408
  321. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  322. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  323. package/packages/omo-codex/plugin/components/bootstrap/src/hook.ts +1 -0
  324. package/packages/omo-codex/plugin/components/bootstrap/src/setup.ts +7 -1
  325. package/packages/omo-codex/plugin/components/comment-checker/AGENTS.md +9 -0
  326. package/packages/omo-codex/plugin/components/comment-checker/biome.json +2 -2
  327. package/packages/omo-codex/plugin/components/comment-checker/dist/cli.js +2 -1
  328. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  329. package/packages/omo-codex/plugin/components/comment-checker/package.json +5 -5
  330. package/packages/omo-codex/plugin/components/comment-checker/src/apply-patch.ts +2 -8
  331. package/packages/omo-codex/plugin/components/comment-checker/src/core.ts +1 -2
  332. package/packages/omo-codex/plugin/components/comment-checker/src/request-extractor.ts +1 -1
  333. package/packages/omo-codex/plugin/components/comment-checker/src/runner.ts +1 -0
  334. package/packages/omo-codex/plugin/components/git-bash/AGENTS.md +1 -1
  335. package/packages/omo-codex/plugin/components/git-bash/dist/cli.js +1 -1
  336. package/packages/omo-codex/plugin/components/git-bash/dist/codex-hook.js +2 -1
  337. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  338. package/packages/omo-codex/plugin/components/git-bash/package.json +3 -4
  339. package/packages/omo-codex/plugin/components/git-bash/src/codex-hook.ts +2 -1
  340. package/packages/omo-codex/plugin/components/git-bash/test/codex-hook.test.ts +6 -7
  341. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/AGENTS.md +2 -2
  342. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/biome.json +2 -2
  343. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/directive.md +2 -0
  344. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/cli.js +36 -29
  345. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/codex-hook.js +32 -26
  346. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/types.d.ts +3 -0
  347. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  348. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +5 -5
  349. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/codex-hook.ts +32 -28
  350. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/types.ts +3 -0
  351. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/cli.test.ts +1 -1
  352. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +137 -28
  353. package/packages/omo-codex/plugin/components/lcx/skills/lcx-doctor/SKILL.md +4 -2
  354. package/packages/omo-codex/plugin/components/lsp/AGENTS.md +30 -15
  355. package/packages/omo-codex/plugin/components/lsp/biome.json +2 -2
  356. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +4 -4
  357. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +943 -540
  358. package/packages/omo-codex/plugin/components/lsp/dist/daemon-cli-path.js +1 -1
  359. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  360. package/packages/omo-codex/plugin/components/lsp/package.json +5 -5
  361. package/packages/omo-codex/plugin/components/lsp/src/cli.ts +1 -1
  362. package/packages/omo-codex/plugin/components/lsp/src/codex-hook.ts +1 -1
  363. package/packages/omo-codex/plugin/components/lsp/src/daemon-cli-path.ts +1 -5
  364. package/packages/omo-codex/plugin/components/lsp/test/codex-hook-unavailable.test.ts +6 -7
  365. package/packages/omo-codex/plugin/components/lsp/test/codex-hook.test.ts +1 -2
  366. package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +11 -1
  367. package/packages/omo-codex/plugin/components/rules/AGENTS.md +12 -0
  368. package/packages/omo-codex/plugin/components/rules/README.md +2 -0
  369. package/packages/omo-codex/plugin/components/rules/biome.json +2 -2
  370. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-6.md +123 -0
  371. package/packages/omo-codex/plugin/components/rules/dist/cli.js +91 -68
  372. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  373. package/packages/omo-codex/plugin/components/rules/package.json +7 -7
  374. package/packages/omo-codex/plugin/components/rules/src/config.ts +1 -2
  375. package/packages/omo-codex/plugin/components/rules/src/persistent-cache.ts +1 -2
  376. package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +15 -5
  377. package/packages/omo-codex/plugin/components/rules/src/rules-engine-factory.ts +1 -4
  378. package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +4 -9
  379. package/packages/omo-codex/plugin/components/rules/test/bundled-rules-priority.test.ts +11 -16
  380. package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +17 -25
  381. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +9 -7
  382. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +0 -6
  383. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-dedup.test.ts +6 -4
  384. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-directive.test.ts +12 -9
  385. package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +28 -37
  386. package/packages/omo-codex/plugin/components/rules/test/dynamic-target-fingerprints.test.ts +1 -2
  387. package/packages/omo-codex/plugin/components/rules/test/engine.test.ts +7 -4
  388. package/packages/omo-codex/plugin/components/rules/test/finder.test.ts +2 -3
  389. package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +39 -72
  390. package/packages/omo-codex/plugin/components/rules/test/hephaestus-model-variant.test.ts +38 -3
  391. package/packages/omo-codex/plugin/components/rules/test/hook-output.test.ts +2 -3
  392. package/packages/omo-codex/plugin/components/rules/test/matcher.test.ts +2 -3
  393. package/packages/omo-codex/plugin/components/rules/test/package-smoke.test.ts +1 -1
  394. package/packages/omo-codex/plugin/components/rules/test/parser.test.ts +1 -2
  395. package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +29 -6
  396. package/packages/omo-codex/plugin/components/rules/test/rules-engine-consumption.test.ts +3 -6
  397. package/packages/omo-codex/plugin/components/rules/test/scanner.test.ts +1 -2
  398. package/packages/omo-codex/plugin/components/rules/test/sources.test.ts +2 -5
  399. package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +2 -17
  400. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  401. package/packages/omo-codex/plugin/components/teammode/package.json +5 -5
  402. package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +4 -10
  403. package/packages/omo-codex/plugin/components/telemetry/AGENTS.md +8 -0
  404. package/packages/omo-codex/plugin/components/telemetry/biome.json +2 -2
  405. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +2470 -701
  406. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +2488 -720
  407. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  408. package/packages/omo-codex/plugin/components/telemetry/package.json +5 -5
  409. package/packages/omo-codex/plugin/components/telemetry/src/codex-hook.ts +1 -4
  410. package/packages/omo-codex/plugin/components/telemetry/src/posthog.ts +4 -14
  411. package/packages/omo-codex/plugin/components/telemetry/src/product-identity.ts +1 -1
  412. package/packages/omo-codex/plugin/components/telemetry/test/diagnostics.test.ts +2 -5
  413. package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +10 -4
  414. package/packages/omo-codex/plugin/components/ultrawork/README.md +2 -0
  415. package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +1 -1
  416. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-clone-fidelity-reviewer.toml +1 -1
  417. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-code-reviewer.toml +1 -1
  418. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-gate-reviewer.toml +1 -1
  419. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-qa-executor.toml +1 -1
  420. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-high.toml +1 -1
  421. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-low.toml +1 -1
  422. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-medium.toml +1 -1
  423. package/packages/omo-codex/plugin/components/ultrawork/agents/librarian.toml +1 -1
  424. package/packages/omo-codex/plugin/components/ultrawork/agents/metis.toml +1 -1
  425. package/packages/omo-codex/plugin/components/ultrawork/agents/momus.toml +1 -1
  426. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +4 -4
  427. package/packages/omo-codex/plugin/components/ultrawork/biome.json +2 -2
  428. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +500 -4
  429. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  430. package/packages/omo-codex/plugin/components/ultrawork/package.json +5 -6
  431. package/packages/omo-codex/plugin/components/ultrawork/scripts/sync-directive.mjs +30 -14
  432. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +4 -5
  433. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +5 -5
  434. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +2 -2
  435. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -0
  436. package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +4 -0
  437. package/packages/omo-codex/plugin/components/ultrawork/src/directive.ts +5 -2
  438. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook-trigger-policy.test.ts +9 -1
  439. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +0 -136
  440. package/packages/omo-codex/plugin/components/ultrawork/test/directive-source.test.ts +14 -8
  441. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +12 -1
  442. package/packages/omo-codex/plugin/components/ultrawork/test/skill-pointer.test.ts +0 -2
  443. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/AGENTS.md +4 -4
  444. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/NOTICE +1 -1
  445. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/README.md +6 -6
  446. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/biome.json +2 -2
  447. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/directive.md +11 -11
  448. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/dist/cli.js +16 -16
  449. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +16 -0
  450. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/package.json +12 -12
  451. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/boulder-reader.ts +1 -1
  452. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/cli.ts +1 -1
  453. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/codex-hook.ts +4 -4
  454. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/directive.ts +1 -1
  455. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/index.ts +1 -1
  456. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/types.ts +1 -1
  457. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/boulder-reader.test.ts +3 -3
  458. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/cli.test.ts +4 -11
  459. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/codex-hook.test.ts +24 -22
  460. package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +19 -0
  461. package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +17 -1
  462. package/packages/omo-codex/plugin/components/ulw-loop/README.md +12 -1
  463. package/packages/omo-codex/plugin/components/ulw-loop/biome.json +2 -2
  464. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +44 -27
  465. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.d.ts +18 -0
  466. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.js +30 -0
  467. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-continuation.js +10 -4
  468. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.d.ts +2 -5
  469. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.js +5 -78
  470. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.d.ts +12 -0
  471. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.js +114 -0
  472. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.d.ts +7 -1
  473. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +57 -46
  474. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-arg-parser.js +2 -2
  475. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.js +21 -8
  476. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +2 -1
  477. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +12 -1
  478. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.d.ts +1 -1
  479. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.js +40 -37
  480. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +2191 -737
  481. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.d.ts +2 -0
  482. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +28 -8
  483. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.d.ts +8 -5
  484. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.js +35 -23
  485. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.d.ts +1 -0
  486. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.js +1 -0
  487. package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +25 -9
  488. package/packages/omo-codex/plugin/components/ulw-loop/dist/driver-objective-ack.d.ts +4 -0
  489. package/packages/omo-codex/plugin/components/ulw-loop/dist/driver-objective-ack.js +18 -0
  490. package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence-artifacts.d.ts +1 -0
  491. package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence-artifacts.js +37 -0
  492. package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence.d.ts +1 -0
  493. package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence.js +24 -12
  494. package/packages/omo-codex/plugin/components/ulw-loop/dist/ledger.d.ts +4 -0
  495. package/packages/omo-codex/plugin/components/ulw-loop/dist/ledger.js +39 -0
  496. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.d.ts +2 -0
  497. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +19 -4
  498. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-commit.d.ts +19 -0
  499. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-commit.js +108 -0
  500. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.d.ts +6 -2
  501. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.js +54 -25
  502. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-goal-factory.d.ts +10 -3
  503. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-goal-factory.js +38 -31
  504. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.d.ts +10 -7
  505. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +121 -100
  506. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-log.d.ts +16 -0
  507. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-log.js +115 -0
  508. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.d.ts +18 -0
  509. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.js +41 -0
  510. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.d.ts +7 -0
  511. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.js +9 -0
  512. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.d.ts +12 -0
  513. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.js +104 -0
  514. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.d.ts +13 -1
  515. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.js +65 -9
  516. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.js +5 -1
  517. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.d.ts +4 -2
  518. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +72 -117
  519. package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.d.ts +2 -0
  520. package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.js +25 -13
  521. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/factory.d.ts +2 -0
  522. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/factory.js +157 -0
  523. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/manifest.d.ts +381 -0
  524. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/manifest.js +127 -0
  525. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/types.d.ts +130 -0
  526. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/types.js +1 -0
  527. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk.d.ts +3 -0
  528. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk.js +3 -0
  529. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-budget-io.d.ts +5 -0
  530. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-budget-io.js +67 -0
  531. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.d.ts +7 -1
  532. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +188 -59
  533. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-role-guard.d.ts +2 -0
  534. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-role-guard.js +22 -0
  535. package/packages/omo-codex/plugin/components/ulw-loop/dist/state-lock.d.ts +19 -0
  536. package/packages/omo-codex/plugin/components/ulw-loop/dist/state-lock.js +259 -0
  537. package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.d.ts +7 -0
  538. package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.js +41 -0
  539. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-batch.js +4 -4
  540. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-mutations.d.ts +3 -2
  541. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-mutations.js +4 -4
  542. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-types.d.ts +9 -1
  543. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.d.ts +3 -2
  544. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.js +11 -11
  545. package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +28 -23
  546. package/packages/omo-codex/plugin/components/ulw-loop/dist/success-criteria-input.d.ts +9 -0
  547. package/packages/omo-codex/plugin/components/ulw-loop/dist/success-criteria-input.js +41 -0
  548. package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.d.ts +19 -0
  549. package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.js +83 -0
  550. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +18 -5
  551. package/packages/omo-codex/plugin/components/ulw-loop/package.json +6 -6
  552. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +7 -2
  553. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +33 -10
  554. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-codex-validation.ts +52 -0
  555. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-continuation.ts +8 -6
  556. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-reconciliation.ts +5 -98
  557. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-template.ts +134 -0
  558. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +59 -77
  559. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-arg-parser.ts +10 -4
  560. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +24 -8
  561. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts +14 -1
  562. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-subcommands.ts +52 -46
  563. package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +8 -6
  564. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +35 -7
  565. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-snapshot.ts +51 -33
  566. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +3 -1
  567. package/packages/omo-codex/plugin/components/ulw-loop/src/constants.ts +1 -0
  568. package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +27 -9
  569. package/packages/omo-codex/plugin/components/ulw-loop/src/driver-objective-ack.ts +20 -0
  570. package/packages/omo-codex/plugin/components/ulw-loop/src/evidence-artifacts.ts +45 -0
  571. package/packages/omo-codex/plugin/components/ulw-loop/src/evidence.ts +23 -16
  572. package/packages/omo-codex/plugin/components/ulw-loop/src/ledger.ts +38 -0
  573. package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +32 -4
  574. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-commit.ts +132 -0
  575. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +67 -54
  576. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-goal-factory.ts +63 -31
  577. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts +140 -119
  578. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-log.ts +112 -0
  579. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-missing-recovery.ts +61 -0
  580. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-aggregate.ts +11 -0
  581. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-artifacts.ts +123 -0
  582. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-fields.ts +71 -15
  583. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-verdicts.ts +6 -1
  584. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +92 -136
  585. package/packages/omo-codex/plugin/components/ulw-loop/src/review-blockers.ts +38 -13
  586. package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/factory.ts +218 -0
  587. package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/manifest.ts +156 -0
  588. package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/types.ts +143 -0
  589. package/packages/omo-codex/plugin/components/ulw-loop/src/sdk.ts +3 -0
  590. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-budget-io.ts +59 -0
  591. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +196 -52
  592. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-role-guard.ts +22 -0
  593. package/packages/omo-codex/plugin/components/ulw-loop/src/state-lock.ts +257 -0
  594. package/packages/omo-codex/plugin/components/ulw-loop/src/status-next-actions.ts +45 -0
  595. package/packages/omo-codex/plugin/components/ulw-loop/src/steering-batch.ts +4 -4
  596. package/packages/omo-codex/plugin/components/ulw-loop/src/steering-mutations.ts +5 -4
  597. package/packages/omo-codex/plugin/components/ulw-loop/src/steering-types.ts +13 -1
  598. package/packages/omo-codex/plugin/components/ulw-loop/src/steering.ts +12 -10
  599. package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +27 -22
  600. package/packages/omo-codex/plugin/components/ulw-loop/src/success-criteria-input.ts +56 -0
  601. package/packages/omo-codex/plugin/components/ulw-loop/src/surface.ts +115 -0
  602. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-continuation.test.ts +0 -1
  603. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-final.test.ts +131 -82
  604. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-template.test.ts +147 -0
  605. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint.test.ts +16 -22
  606. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-checkpoint-continuation.test.ts +4 -2
  607. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-checkpoint.test.ts +31 -2
  608. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-commands.test.ts +2 -0
  609. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-complete-goals.test.ts +3 -1
  610. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-create-goals.test.ts +35 -8
  611. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +38 -4
  612. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-json-errors.test.ts +27 -0
  613. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-scope-required.test.ts +144 -0
  614. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-status-next-actions.test.ts +185 -0
  615. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering-batch.test.ts +8 -3
  616. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-validation-batch.test.ts +6 -0
  617. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +37 -2
  618. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-snapshot.test.ts +88 -11
  619. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +0 -3
  620. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/barrier.ts +13 -0
  621. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/cli-session.ts +4 -0
  622. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-child.ts +65 -0
  623. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-cli-qa.mjs +76 -0
  624. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-crash.ts +23 -0
  625. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-mutations.mjs +58 -0
  626. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-writer.ts +65 -0
  627. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/lease-clock.ts +23 -0
  628. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/quality-gate-builder.ts +9 -4
  629. package/packages/omo-codex/plugin/components/ulw-loop/test/guided-recovery.test.ts +67 -0
  630. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +5 -37
  631. package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +9 -0
  632. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-commit-log.test.ts +252 -0
  633. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-commit-recovery.test.ts +190 -0
  634. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io-cross-process.test.ts +106 -0
  635. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io.test.ts +74 -25
  636. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-log-legacy-projection.test.ts +228 -0
  637. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-log-newest.test.ts +72 -0
  638. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-aggregate-basics.test.ts +258 -0
  639. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-cap-and-dedupe.test.ts +22 -0
  640. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-fields-messages.test.ts +98 -0
  641. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-lazycodex-surface.test.ts +93 -0
  642. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-poisoning-cascades.test.ts +97 -0
  643. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-roles.test.ts +51 -2
  644. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-senpi-surface.test.ts +131 -0
  645. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-single-report.test.ts +241 -0
  646. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +58 -3
  647. package/packages/omo-codex/plugin/components/ulw-loop/test/review-blockers.test.ts +9 -7
  648. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-completed-plan.test.ts +43 -0
  649. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-contract.test.ts +137 -0
  650. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-driver-states.test.ts +174 -0
  651. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-dx.test.ts +219 -0
  652. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-session-context.test.ts +169 -0
  653. package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +450 -7
  654. package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-role-matrix.test.ts +113 -0
  655. package/packages/omo-codex/plugin/components/ulw-loop/test/state-lock.test.ts +310 -0
  656. package/packages/omo-codex/plugin/components/ulw-loop/test/status-next-actions-surface.test.ts +133 -0
  657. package/packages/omo-codex/plugin/components/ulw-loop/test/steering-batch.test.ts +12 -12
  658. package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +12 -6
  659. package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +1 -1
  660. package/packages/omo-codex/plugin/components/ulw-loop/test/surface.test.ts +74 -0
  661. package/packages/omo-codex/plugin/components/ulw-loop/test/ultrawork-directive.test.ts +13 -8
  662. package/packages/omo-codex/plugin/components/ulw-loop/vitest.config.ts +1 -0
  663. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  664. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  665. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  666. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  667. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  668. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  669. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  670. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +18 -0
  671. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  672. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  673. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  674. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  675. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  676. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  677. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  678. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +17 -0
  679. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  680. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  681. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  682. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  683. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  684. package/packages/omo-codex/plugin/model-catalog.json +16 -7
  685. package/packages/omo-codex/plugin/package-lock.json +676 -524
  686. package/packages/omo-codex/plugin/package.json +2 -3
  687. package/packages/omo-codex/plugin/scripts/AGENTS.md +39 -0
  688. package/packages/omo-codex/plugin/scripts/auto-update-plan.mjs +1 -2
  689. package/packages/omo-codex/plugin/scripts/auto-update.mjs +0 -9
  690. package/packages/omo-codex/plugin/scripts/canonical-ultrawork-directive.mjs +17 -0
  691. package/packages/omo-codex/plugin/scripts/hook-status-message.mjs +0 -1
  692. package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +16 -7
  693. package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +8 -4
  694. package/packages/omo-codex/plugin/scripts/migrate-codex-config/subagent-limit-guard.mjs +19 -90
  695. package/packages/omo-codex/plugin/scripts/migrate-codex-config/toml-section-editor.mjs +1 -1
  696. package/packages/omo-codex/plugin/scripts/sync-skills.d.mts +4 -0
  697. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +111 -64
  698. package/packages/omo-codex/plugin/shared/package.json +3 -4
  699. package/packages/omo-codex/plugin/shared/src/config-loader.ts +2 -102
  700. package/packages/omo-codex/plugin/shared/src/config-migration.ts +0 -1
  701. package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +41 -130
  702. package/packages/omo-codex/plugin/skills/ast-grep/AGENTS.md +51 -0
  703. package/packages/omo-codex/plugin/skills/ast-grep/SKILL.md +13 -1
  704. package/packages/omo-codex/plugin/skills/coding-agent-sessions/AGENTS.md +62 -0
  705. package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +1 -1
  706. package/packages/omo-codex/plugin/skills/data-scientist/SKILL.md +99 -239
  707. package/packages/omo-codex/plugin/skills/data-scientist/references/execution-surfaces.md +91 -0
  708. package/packages/omo-codex/plugin/skills/data-scientist/references/placement.md +74 -0
  709. package/packages/omo-codex/plugin/skills/data-scientist/references/polars-lane.md +95 -0
  710. package/packages/omo-codex/plugin/skills/data-scientist/references/uv-setup.md +1 -1
  711. package/packages/omo-codex/plugin/skills/data-scientist/references/visualization.md +64 -0
  712. package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
  713. package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
  714. package/packages/omo-codex/plugin/skills/debugging/SKILL.md +3 -1
  715. package/packages/omo-codex/plugin/skills/debugging/references/methodology/00-setup.md +12 -0
  716. package/packages/omo-codex/plugin/skills/debugging/references/methodology/02-investigate.md +26 -5
  717. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/go.md +15 -1
  718. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/native-binary.md +38 -0
  719. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/node.md +25 -0
  720. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/python.md +13 -0
  721. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/rust.md +41 -0
  722. package/packages/omo-codex/plugin/skills/debugging/references/scripts/dap.mjs +267 -0
  723. package/packages/omo-codex/plugin/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
  724. package/packages/omo-codex/plugin/skills/debugging/references/tools/dap.md +103 -0
  725. package/packages/omo-codex/plugin/skills/debugging/references/tools/frida.md +193 -0
  726. package/packages/omo-codex/plugin/skills/debugging/references/tools/playwright-cli.md +79 -161
  727. package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +10 -0
  728. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +7 -3
  729. package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +10 -2
  730. package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +1 -0
  731. package/packages/omo-codex/plugin/skills/frontend/references/design/ambience-skill.md +145 -0
  732. package/packages/omo-codex/plugin/skills/frontend/references/design/aside.md +1 -1
  733. package/packages/omo-codex/plugin/skills/frontend/references/design/clone-from-url.md +1 -1
  734. package/packages/omo-codex/plugin/skills/frontend/references/design/interaction-skill.md +2 -0
  735. package/packages/omo-codex/plugin/skills/frontend/references/design/print-paged-media.md +76 -0
  736. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/README.md +1 -1
  737. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
  738. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
  739. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
  740. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/orchestration.md +1 -1
  741. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/routing.md +5 -5
  742. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/lighthouse-audit.py +2 -2
  743. package/packages/omo-codex/plugin/skills/git-master/SKILL.md +1 -1
  744. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +20 -18
  745. package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +4 -2
  746. package/packages/omo-codex/plugin/skills/lsp-setup/SKILL.md +1 -1
  747. package/packages/omo-codex/plugin/skills/programming/SKILL.md +1 -1
  748. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +11 -9
  749. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +11 -9
  750. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +116 -424
  751. package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +32 -86
  752. package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +32 -27
  753. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +111 -0
  754. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +2 -2
  755. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +5 -2
  756. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +8 -6
  757. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_playwright_stealth.py +86 -0
  758. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +4 -7
  759. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +86 -95
  760. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +18 -5
  761. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/playwright.md +16 -13
  762. package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/extract_cookies.py +3 -3
  763. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +44 -27
  764. package/packages/omo-codex/plugin/skills/{start-work → ulw-execute}/SKILL.md +35 -36
  765. package/packages/omo-codex/plugin/skills/ulw-execute/agents/openai.yaml +2 -0
  766. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +31 -2
  767. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +33 -10
  768. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +4 -5
  769. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +5 -5
  770. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +2 -2
  771. package/packages/omo-codex/plugin/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -0
  772. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +16 -9
  773. package/packages/omo-codex/plugin/skills/visual-qa/AGENTS.md +58 -0
  774. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +10 -7
  775. package/packages/omo-codex/plugin/skills/visual-qa/references/browser-setup.md +75 -0
  776. package/packages/omo-codex/plugin/test/AGENTS.md +47 -0
  777. package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +19 -173
  778. package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +16 -51
  779. package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +2 -3
  780. package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +2 -7
  781. package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +14 -4
  782. package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +175 -13
  783. package/packages/omo-codex/plugin/test/aggregate.test.mjs +78 -2
  784. package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +19 -33
  785. package/packages/omo-codex/plugin/test/auto-update.test.mjs +4 -29
  786. package/packages/omo-codex/plugin/test/bootstrap-default-role.test.mjs +66 -0
  787. package/packages/omo-codex/plugin/test/bootstrap-setup.test.mjs +0 -31
  788. package/packages/omo-codex/plugin/test/canonical-ultrawork-directive.test.mjs +53 -0
  789. package/packages/omo-codex/plugin/test/component-bin-names.test.mjs +2 -2
  790. package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +1 -51
  791. package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +100 -2
  792. package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +5 -6
  793. package/packages/omo-codex/plugin/test/lcx-contribute-bug-fix-template.test.mjs +21 -27
  794. package/packages/omo-codex/plugin/test/mcp-research-servers.test.mjs +1 -3
  795. package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +35 -35
  796. package/packages/omo-codex/plugin/test/multi-agent-v2-regression.test.mjs +1 -1
  797. package/packages/omo-codex/plugin/test/scaffold-plan.test.mjs +0 -36
  798. package/packages/omo-codex/plugin/test/subagent-limit-migration.test.mjs +107 -15
  799. package/packages/omo-codex/plugin/test/sync-skills-codex-compatibility.test.mjs +168 -0
  800. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +54 -24
  801. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +18 -119
  802. package/packages/omo-codex/plugin/test/teammode-archive-ambiguity.test.mjs +0 -40
  803. package/packages/omo-codex/plugin/test/teammode-communication.test.mjs +6 -62
  804. package/packages/omo-codex/plugin/test/teammode-thread-links.test.mjs +3 -36
  805. package/packages/omo-codex/plugin/test/teammode-transport.test.mjs +0 -44
  806. package/packages/omo-codex/plugin/test/teammode-worktree.test.mjs +2 -6
  807. package/packages/omo-codex/plugin/test/ultrawork-skill-pointer.test.mjs +5 -5
  808. package/packages/omo-codex/plugin/test/ulw-plan-review-state-contract.test.mjs +0 -3
  809. package/packages/omo-codex/scripts/AGENTS.md +36 -0
  810. package/packages/omo-codex/scripts/check-model-catalog-parity.mjs +42 -0
  811. package/packages/omo-codex/scripts/install-cache-copy.test.mjs +27 -1
  812. package/packages/omo-codex/scripts/install-config-autonomous-features.test.mjs +1 -1
  813. package/packages/omo-codex/scripts/install-config-autonomous.test.mjs +2 -1
  814. package/packages/omo-codex/scripts/install-config-git-bash.test.mjs +0 -23
  815. package/packages/omo-codex/scripts/install-config-reasoning.test.mjs +5 -5
  816. package/packages/omo-codex/scripts/install-config.test.mjs +15 -17
  817. package/packages/omo-codex/scripts/install-dist/install-local.mjs +9832 -1445
  818. package/packages/omo-codex/scripts/install-generated-bundle.test.mjs +3 -4
  819. package/packages/omo-codex/scripts/install-git-bash-mcp-env.test.mjs +1 -25
  820. package/packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs +7 -2
  821. package/packages/omo-codex/scripts/install-mcp-runtime.test.mjs +0 -36
  822. package/packages/omo-codex/scripts/install-packaged-local.test.mjs +1 -6
  823. package/packages/{omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md → prompts-core/prompts/ultrawork/codex.md} +44 -34
  824. package/packages/shared-skills/package.json +7 -1
  825. package/packages/shared-skills/skill-source-filter.d.ts +16 -0
  826. package/packages/shared-skills/skill-source-filter.mjs +44 -0
  827. package/packages/shared-skills/skills/ast-grep/AGENTS.md +51 -0
  828. package/packages/shared-skills/skills/ast-grep/SKILL.md +13 -1
  829. package/packages/shared-skills/skills/coding-agent-sessions/AGENTS.md +62 -0
  830. package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +1 -1
  831. package/packages/shared-skills/skills/data-scientist/SKILL.md +99 -239
  832. package/packages/shared-skills/skills/data-scientist/references/execution-surfaces.md +91 -0
  833. package/packages/shared-skills/skills/data-scientist/references/placement.md +74 -0
  834. package/packages/shared-skills/skills/data-scientist/references/polars-lane.md +95 -0
  835. package/packages/shared-skills/skills/data-scientist/references/uv-setup.md +1 -1
  836. package/packages/shared-skills/skills/data-scientist/references/visualization.md +64 -0
  837. package/packages/shared-skills/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
  838. package/packages/shared-skills/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
  839. package/packages/shared-skills/skills/debugging/SKILL.md +3 -1
  840. package/packages/shared-skills/skills/debugging/references/methodology/00-setup.md +12 -0
  841. package/packages/shared-skills/skills/debugging/references/methodology/02-investigate.md +26 -5
  842. package/packages/shared-skills/skills/debugging/references/runtimes/go.md +15 -1
  843. package/packages/shared-skills/skills/debugging/references/runtimes/native-binary.md +38 -0
  844. package/packages/shared-skills/skills/debugging/references/runtimes/node.md +25 -0
  845. package/packages/shared-skills/skills/debugging/references/runtimes/python.md +13 -0
  846. package/packages/shared-skills/skills/debugging/references/runtimes/rust.md +41 -0
  847. package/packages/shared-skills/skills/debugging/references/scripts/dap.mjs +267 -0
  848. package/packages/shared-skills/skills/debugging/references/scripts/dap.test.ts +86 -0
  849. package/packages/shared-skills/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
  850. package/packages/shared-skills/skills/debugging/references/tools/dap.md +103 -0
  851. package/packages/shared-skills/skills/debugging/references/tools/frida.md +193 -0
  852. package/packages/shared-skills/skills/debugging/references/tools/playwright-cli.md +79 -161
  853. package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +10 -0
  854. package/packages/shared-skills/skills/frontend/SKILL.md +7 -3
  855. package/packages/shared-skills/skills/frontend/references/design/README.md +10 -2
  856. package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +1 -0
  857. package/packages/shared-skills/skills/frontend/references/design/ambience-skill.md +145 -0
  858. package/packages/shared-skills/skills/frontend/references/design/aside.md +1 -1
  859. package/packages/shared-skills/skills/frontend/references/design/clone-from-url.md +1 -1
  860. package/packages/shared-skills/skills/frontend/references/design/interaction-skill.md +2 -0
  861. package/packages/shared-skills/skills/frontend/references/design/print-paged-media.md +76 -0
  862. package/packages/shared-skills/skills/frontend/references/designpowers/README.md +1 -1
  863. package/packages/shared-skills/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
  864. package/packages/shared-skills/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
  865. package/packages/shared-skills/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
  866. package/packages/shared-skills/skills/frontend/references/designpowers/orchestration.md +1 -1
  867. package/packages/shared-skills/skills/frontend/references/designpowers/routing.md +5 -5
  868. package/packages/shared-skills/skills/frontend/scripts/perfection/lighthouse-audit.py +2 -2
  869. package/packages/shared-skills/skills/git-master/SKILL.md +1 -1
  870. package/packages/shared-skills/skills/init-deep/SKILL.md +14 -14
  871. package/packages/shared-skills/skills/lsp-setup/SKILL.md +1 -1
  872. package/packages/shared-skills/skills/programming/SKILL.md +1 -1
  873. package/packages/shared-skills/skills/refactor/SKILL.md +5 -5
  874. package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +5 -5
  875. package/packages/shared-skills/skills/review-work/SKILL.md +101 -419
  876. package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +32 -86
  877. package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +32 -27
  878. package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +111 -0
  879. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +2 -2
  880. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +5 -2
  881. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +8 -6
  882. package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_playwright_stealth.py +86 -0
  883. package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +4 -7
  884. package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +86 -95
  885. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +18 -5
  886. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/playwright.md +16 -13
  887. package/packages/shared-skills/skills/ultimate-browsing/scripts/extract_cookies.py +3 -3
  888. package/packages/shared-skills/skills/{start-work → ulw-execute}/SKILL.md +24 -22
  889. package/packages/shared-skills/skills/ulw-plan/SKILL.md +5 -6
  890. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +6 -5
  891. package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +2 -2
  892. package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -1
  893. package/packages/shared-skills/skills/ulw-research/SKILL.md +10 -5
  894. package/packages/shared-skills/skills/visual-qa/AGENTS.md +58 -0
  895. package/packages/shared-skills/skills/visual-qa/SKILL.md +4 -3
  896. package/packages/shared-skills/skills/visual-qa/references/browser-setup.md +75 -0
  897. package/postinstall.mjs +2 -0
  898. package/script/qa/web-terminal-visual-qa.mjs +2 -0
  899. package/script/qa/xterm-live-terminal.mjs +18 -2
  900. package/.agents/skills/work-with-pr-workspace/evals/evals.json +0 -76
  901. package/.agents/skills/work-with-pr-workspace/iteration-1/benchmark.json +0 -138
  902. package/.agents/skills/work-with-pr-workspace/iteration-1/benchmark.md +0 -42
  903. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/eval_metadata.json +0 -57
  904. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/grading.json +0 -15
  905. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/code-changes.md +0 -454
  906. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/execution-plan.md +0 -136
  907. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/pr-description.md +0 -47
  908. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/verification-strategy.md +0 -163
  909. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/timing.json +0 -1
  910. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/grading.json +0 -15
  911. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/code-changes.md +0 -615
  912. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/execution-plan.md +0 -99
  913. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/pr-description.md +0 -50
  914. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/verification-strategy.md +0 -111
  915. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/timing.json +0 -1
  916. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/eval_metadata.json +0 -37
  917. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/grading.json +0 -11
  918. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/code-changes.md +0 -205
  919. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/execution-plan.md +0 -78
  920. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/pr-description.md +0 -42
  921. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/verification-strategy.md +0 -87
  922. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/timing.json +0 -1
  923. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/grading.json +0 -11
  924. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/code-changes.md +0 -334
  925. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/execution-plan.md +0 -86
  926. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/pr-description.md +0 -23
  927. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/verification-strategy.md +0 -119
  928. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/timing.json +0 -1
  929. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/eval_metadata.json +0 -32
  930. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/grading.json +0 -10
  931. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/code-changes.md +0 -221
  932. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/execution-plan.md +0 -104
  933. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/pr-description.md +0 -41
  934. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/verification-strategy.md +0 -84
  935. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/timing.json +0 -1
  936. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/grading.json +0 -10
  937. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/code-changes.md +0 -342
  938. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/execution-plan.md +0 -131
  939. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/pr-description.md +0 -39
  940. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/verification-strategy.md +0 -128
  941. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/timing.json +0 -1
  942. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/eval_metadata.json +0 -32
  943. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/grading.json +0 -10
  944. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/code-changes.md +0 -143
  945. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/execution-plan.md +0 -82
  946. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/pr-description.md +0 -51
  947. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/verification-strategy.md +0 -69
  948. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/timing.json +0 -1
  949. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/grading.json +0 -10
  950. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/code-changes.md +0 -252
  951. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/execution-plan.md +0 -83
  952. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/pr-description.md +0 -33
  953. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/verification-strategy.md +0 -101
  954. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/timing.json +0 -1
  955. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/eval_metadata.json +0 -32
  956. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/grading.json +0 -10
  957. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/code-changes.md +0 -387
  958. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/execution-plan.md +0 -112
  959. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/pr-description.md +0 -51
  960. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/verification-strategy.md +0 -75
  961. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/timing.json +0 -1
  962. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/grading.json +0 -10
  963. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/code-changes.md +0 -529
  964. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/execution-plan.md +0 -127
  965. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/pr-description.md +0 -42
  966. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/verification-strategy.md +0 -120
  967. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/timing.json +0 -1
  968. package/.agents/skills/work-with-pr-workspace/iteration-1/review.html +0 -1326
  969. package/.opencode/skills/work-with-pr-workspace/evals/evals.json +0 -76
  970. package/.opencode/skills/work-with-pr-workspace/iteration-1/benchmark.json +0 -138
  971. package/.opencode/skills/work-with-pr-workspace/iteration-1/benchmark.md +0 -42
  972. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/eval_metadata.json +0 -57
  973. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/grading.json +0 -15
  974. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/code-changes.md +0 -454
  975. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/execution-plan.md +0 -136
  976. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/pr-description.md +0 -47
  977. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/verification-strategy.md +0 -163
  978. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/timing.json +0 -1
  979. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/grading.json +0 -15
  980. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/code-changes.md +0 -615
  981. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/execution-plan.md +0 -99
  982. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/pr-description.md +0 -50
  983. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/verification-strategy.md +0 -111
  984. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/timing.json +0 -1
  985. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/eval_metadata.json +0 -37
  986. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/grading.json +0 -11
  987. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/code-changes.md +0 -205
  988. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/execution-plan.md +0 -78
  989. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/pr-description.md +0 -42
  990. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/verification-strategy.md +0 -87
  991. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/timing.json +0 -1
  992. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/grading.json +0 -11
  993. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/code-changes.md +0 -334
  994. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/execution-plan.md +0 -86
  995. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/pr-description.md +0 -23
  996. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/verification-strategy.md +0 -119
  997. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/timing.json +0 -1
  998. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/eval_metadata.json +0 -32
  999. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/grading.json +0 -10
  1000. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/code-changes.md +0 -221
  1001. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/execution-plan.md +0 -104
  1002. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/pr-description.md +0 -41
  1003. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/verification-strategy.md +0 -84
  1004. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/timing.json +0 -1
  1005. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/grading.json +0 -10
  1006. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/code-changes.md +0 -342
  1007. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/execution-plan.md +0 -131
  1008. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/pr-description.md +0 -39
  1009. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/verification-strategy.md +0 -128
  1010. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/timing.json +0 -1
  1011. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/eval_metadata.json +0 -32
  1012. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/grading.json +0 -10
  1013. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/code-changes.md +0 -143
  1014. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/execution-plan.md +0 -82
  1015. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/pr-description.md +0 -51
  1016. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/verification-strategy.md +0 -69
  1017. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/timing.json +0 -1
  1018. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/grading.json +0 -10
  1019. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/code-changes.md +0 -252
  1020. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/execution-plan.md +0 -83
  1021. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/pr-description.md +0 -33
  1022. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/verification-strategy.md +0 -101
  1023. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/timing.json +0 -1
  1024. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/eval_metadata.json +0 -32
  1025. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/grading.json +0 -10
  1026. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/code-changes.md +0 -387
  1027. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/execution-plan.md +0 -112
  1028. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/pr-description.md +0 -51
  1029. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/verification-strategy.md +0 -75
  1030. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/timing.json +0 -1
  1031. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/grading.json +0 -10
  1032. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/code-changes.md +0 -529
  1033. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/execution-plan.md +0 -127
  1034. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/pr-description.md +0 -42
  1035. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/verification-strategy.md +0 -120
  1036. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/timing.json +0 -1
  1037. package/.opencode/skills/work-with-pr-workspace/iteration-1/review.html +0 -1326
  1038. package/dist/config/schema/codegraph.d.ts +0 -12
  1039. package/dist/config/schema/start-work.d.ts +0 -5
  1040. package/dist/features/builtin-commands/templates/start-work.d.ts +0 -1
  1041. package/dist/features/builtin-skills/index.d.ts +0 -1
  1042. package/dist/features/builtin-skills/skill-file-loader.d.ts +0 -1
  1043. package/dist/features/builtin-skills/skills/agent-browser-skill.d.ts +0 -1
  1044. package/dist/features/builtin-skills/skills/agent-browser-template.d.ts +0 -1
  1045. package/dist/features/builtin-skills/skills/debugging.d.ts +0 -1
  1046. package/dist/features/builtin-skills/skills/dev-browser.d.ts +0 -1
  1047. package/dist/features/builtin-skills/skills/frontend.d.ts +0 -1
  1048. package/dist/features/builtin-skills/skills/git-master-sections/commit-atomic-planning.d.ts +0 -1
  1049. package/dist/features/builtin-skills/skills/git-master-sections/commit-context-analysis.d.ts +0 -1
  1050. package/dist/features/builtin-skills/skills/git-master-sections/commit-execution-verification.d.ts +0 -1
  1051. package/dist/features/builtin-skills/skills/git-master-sections/commit-workflow.d.ts +0 -1
  1052. package/dist/features/builtin-skills/skills/git-master-sections/history-search-workflow.d.ts +0 -1
  1053. package/dist/features/builtin-skills/skills/git-master-sections/overview.d.ts +0 -1
  1054. package/dist/features/builtin-skills/skills/git-master-sections/quick-reference.d.ts +0 -1
  1055. package/dist/features/builtin-skills/skills/git-master-sections/rebase-workflow.d.ts +0 -1
  1056. package/dist/features/builtin-skills/skills/git-master-skill-metadata.d.ts +0 -1
  1057. package/dist/features/builtin-skills/skills/git-master.d.ts +0 -1
  1058. package/dist/features/builtin-skills/skills/index.d.ts +0 -1
  1059. package/dist/features/builtin-skills/skills/init-deep.d.ts +0 -1
  1060. package/dist/features/builtin-skills/skills/playwright-cli.d.ts +0 -1
  1061. package/dist/features/builtin-skills/skills/playwright-mcp-skill.d.ts +0 -1
  1062. package/dist/features/builtin-skills/skills/playwright.d.ts +0 -1
  1063. package/dist/features/builtin-skills/skills/remove-ai-slops.d.ts +0 -1
  1064. package/dist/features/builtin-skills/skills/review-work.d.ts +0 -1
  1065. package/dist/features/builtin-skills/skills/security-research.d.ts +0 -1
  1066. package/dist/features/builtin-skills/skills/security-review.d.ts +0 -1
  1067. package/dist/features/builtin-skills/skills/team-mode.d.ts +0 -1
  1068. package/dist/features/builtin-skills/skills/visual-qa.d.ts +0 -1
  1069. package/dist/features/builtin-skills/skills.d.ts +0 -1
  1070. package/dist/features/builtin-skills/types.d.ts +0 -1
  1071. package/dist/features/claude-code-plugin-loader/agent-loader.d.ts +0 -1
  1072. package/dist/features/claude-code-plugin-loader/command-loader.d.ts +0 -1
  1073. package/dist/features/claude-code-plugin-loader/discovery-core.d.ts +0 -1
  1074. package/dist/features/claude-code-plugin-loader/discovery-paths.d.ts +0 -1
  1075. package/dist/features/claude-code-plugin-loader/discovery.d.ts +0 -1
  1076. package/dist/features/claude-code-plugin-loader/hook-loader.d.ts +0 -1
  1077. package/dist/features/claude-code-plugin-loader/index.d.ts +0 -1
  1078. package/dist/features/claude-code-plugin-loader/install-path-resolver.d.ts +0 -1
  1079. package/dist/features/claude-code-plugin-loader/installed-plugin-database.d.ts +0 -1
  1080. package/dist/features/claude-code-plugin-loader/loaded-plugin.d.ts +0 -1
  1081. package/dist/features/claude-code-plugin-loader/loader.d.ts +0 -1
  1082. package/dist/features/claude-code-plugin-loader/mcp-server-loader.d.ts +0 -1
  1083. package/dist/features/claude-code-plugin-loader/plugin-key.d.ts +0 -1
  1084. package/dist/features/claude-code-plugin-loader/plugin-manifest.d.ts +0 -1
  1085. package/dist/features/claude-code-plugin-loader/plugin-path-resolver.d.ts +0 -1
  1086. package/dist/features/claude-code-plugin-loader/plugin-settings.d.ts +0 -1
  1087. package/dist/features/claude-code-plugin-loader/scope-filter.d.ts +0 -1
  1088. package/dist/features/claude-code-plugin-loader/skill-loader.d.ts +0 -1
  1089. package/dist/features/claude-code-plugin-loader/types.d.ts +0 -1
  1090. package/dist/hooks/codegraph-bootstrap/command-runner.d.ts +0 -17
  1091. package/dist/hooks/codegraph-bootstrap/hook.d.ts +0 -35
  1092. package/dist/hooks/codegraph-bootstrap/index.d.ts +0 -1
  1093. package/dist/hooks/codegraph-bootstrap/project-root.d.ts +0 -1
  1094. package/dist/hooks/codegraph-bootstrap/status.d.ts +0 -11
  1095. package/dist/hooks/ralph-loop/completion-promise-detector-test-input.d.ts +0 -11
  1096. package/dist/hooks/ralph-loop/loop-session-recovery.d.ts +0 -7
  1097. package/dist/hooks/start-work/start-work-hook.d.ts +0 -23
  1098. package/dist/mcp/codegraph.d.ts +0 -16
  1099. package/dist/plugin/chat-message/start-work-message.d.ts +0 -5
  1100. package/dist/shared/prompt-async-gate/message-inspection-error.d.ts +0 -1
  1101. package/dist/shared/prompt-async-gate/pending-tool-turn.d.ts +0 -1
  1102. package/dist/shared/prompt-async-gate/prompt-message-state.d.ts +0 -1
  1103. package/dist/shared/prompt-async-gate/queue.d.ts +0 -1
  1104. package/dist/shared/prompt-async-gate/recent-dispatches.d.ts +0 -1
  1105. package/dist/shared/prompt-async-gate/reservations.d.ts +0 -1
  1106. package/dist/shared/prompt-async-gate/semantic-dedupe.d.ts +0 -1
  1107. package/dist/shared/prompt-async-gate/session-idle-dispatch.d.ts +0 -1
  1108. package/dist/shared/prompt-async-gate/timing.d.ts +0 -1
  1109. package/dist/shared/prompt-async-gate/types.d.ts +0 -1
  1110. package/dist/skills/data-scientist/references/common-scenarios.md +0 -176
  1111. package/dist/skills/data-scientist/references/execution-templates.md +0 -197
  1112. package/dist/skills/data-scientist/references/integration-patterns.md +0 -153
  1113. package/dist/skills/data-scientist/references/performance-benchmarks.md +0 -37
  1114. package/dist/skills/visual-qa/references/agent-browser-setup.md +0 -45
  1115. package/dist/tools/call-omo-agent/background-agent-executor.d.ts +0 -5
  1116. package/dist/tools/call-omo-agent/message-storage-directory.d.ts +0 -1
  1117. package/dist/tools/delegate-task/anthropic-categories.d.ts +0 -2
  1118. package/dist/tools/delegate-task/model-string-parser.d.ts +0 -1
  1119. package/packages/lsp-tools-mcp/dist/lsp/cleanup-errors.d.ts +0 -1
  1120. package/packages/lsp-tools-mcp/dist/lsp/constants.d.ts +0 -1
  1121. package/packages/lsp-tools-mcp/dist/lsp/language-mappings.d.ts +0 -1
  1122. package/packages/lsp-tools-mcp/dist/lsp/process-signal-cleanup.d.ts +0 -1
  1123. package/packages/lsp-tools-mcp/dist/missing-dependency-result.d.ts +0 -1
  1124. package/packages/omo-codex/plugin/components/codegraph/AGENTS.md +0 -58
  1125. package/packages/omo-codex/plugin/components/codegraph/NODE-RUNTIME-LICENSES.md +0 -2951
  1126. package/packages/omo-codex/plugin/components/codegraph/NOTICE +0 -16
  1127. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +0 -12244
  1128. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +0 -9842
  1129. package/packages/omo-codex/plugin/components/codegraph/package.json +0 -33
  1130. package/packages/omo-codex/plugin/components/codegraph/src/cache-gc.ts +0 -29
  1131. package/packages/omo-codex/plugin/components/codegraph/src/cli.ts +0 -79
  1132. package/packages/omo-codex/plugin/components/codegraph/src/hook-input.ts +0 -33
  1133. package/packages/omo-codex/plugin/components/codegraph/src/hook-sweep.ts +0 -25
  1134. package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +0 -131
  1135. package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +0 -258
  1136. package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +0 -309
  1137. package/packages/omo-codex/plugin/components/codegraph/src/mcp-unavailable.ts +0 -80
  1138. package/packages/omo-codex/plugin/components/codegraph/src/post-tool-use-hook.ts +0 -34
  1139. package/packages/omo-codex/plugin/components/codegraph/src/serve-invocation.ts +0 -29
  1140. package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +0 -263
  1141. package/packages/omo-codex/plugin/components/codegraph/src/session-start-command.ts +0 -106
  1142. package/packages/omo-codex/plugin/components/codegraph/src/session-start-cooldown.ts +0 -145
  1143. package/packages/omo-codex/plugin/components/codegraph/src/session-start-hook-runtime.ts +0 -21
  1144. package/packages/omo-codex/plugin/components/codegraph/src/session-start-lock.ts +0 -139
  1145. package/packages/omo-codex/plugin/components/codegraph/src/session-start-outcome.ts +0 -15
  1146. package/packages/omo-codex/plugin/components/codegraph/src/session-start-paths.ts +0 -32
  1147. package/packages/omo-codex/plugin/components/codegraph/src/session-start-project.ts +0 -109
  1148. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker-result.ts +0 -148
  1149. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +0 -175
  1150. package/packages/omo-codex/plugin/components/codegraph/src/sweep-cli.ts +0 -81
  1151. package/packages/omo-codex/plugin/components/codegraph/test/cache-gc.test.ts +0 -34
  1152. package/packages/omo-codex/plugin/components/codegraph/test/hook-exclusion.test.ts +0 -112
  1153. package/packages/omo-codex/plugin/components/codegraph/test/hook-registration.test.ts +0 -26
  1154. package/packages/omo-codex/plugin/components/codegraph/test/hook-session-start-guard.test.ts +0 -160
  1155. package/packages/omo-codex/plugin/components/codegraph/test/hook-store-upgrade.test.ts +0 -50
  1156. package/packages/omo-codex/plugin/components/codegraph/test/hook-sweep.test.ts +0 -29
  1157. package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +0 -320
  1158. package/packages/omo-codex/plugin/components/codegraph/test/mcp-bridge-fixtures.ts +0 -172
  1159. package/packages/omo-codex/plugin/components/codegraph/test/package-runtime.test.ts +0 -91
  1160. package/packages/omo-codex/plugin/components/codegraph/test/provisioned-node-guard.test.ts +0 -100
  1161. package/packages/omo-codex/plugin/components/codegraph/test/serve-built-wrapper.test.ts +0 -76
  1162. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge-lifecycle.test.ts +0 -133
  1163. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +0 -245
  1164. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-facade.test.ts +0 -69
  1165. package/packages/omo-codex/plugin/components/codegraph/test/serve-node-support.test.ts +0 -43
  1166. package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +0 -147
  1167. package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable.test.ts +0 -175
  1168. package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +0 -385
  1169. package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts +0 -206
  1170. package/packages/omo-codex/plugin/components/codegraph/test/session-start-project.test.ts +0 -58
  1171. package/packages/omo-codex/plugin/components/codegraph/test/session-start-state.test.ts +0 -104
  1172. package/packages/omo-codex/plugin/components/codegraph/test/session-start-trust-boundary.test.ts +0 -65
  1173. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-availability.test.ts +0 -106
  1174. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-cooldown.test.ts +0 -116
  1175. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +0 -258
  1176. package/packages/omo-codex/plugin/components/codegraph/test/sweep-cli.test.ts +0 -56
  1177. package/packages/omo-codex/plugin/components/codegraph/tsconfig.build.json +0 -13
  1178. package/packages/omo-codex/plugin/components/codegraph/tsconfig.json +0 -25
  1179. package/packages/omo-codex/plugin/components/start-work-continuation/LICENSE +0 -21
  1180. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +0 -28
  1181. package/packages/omo-codex/plugin/components/ultrawork/directive.md +0 -477
  1182. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +0 -18
  1183. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +0 -17
  1184. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +0 -17
  1185. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +0 -17
  1186. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/editor.mjs +0 -125
  1187. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/jsonc.mjs +0 -43
  1188. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/scaffold.mjs +0 -29
  1189. package/packages/omo-codex/plugin/scripts/migrate-omo-sot.mjs +0 -121
  1190. package/packages/omo-codex/plugin/skills/data-scientist/references/common-scenarios.md +0 -176
  1191. package/packages/omo-codex/plugin/skills/data-scientist/references/execution-templates.md +0 -197
  1192. package/packages/omo-codex/plugin/skills/data-scientist/references/integration-patterns.md +0 -153
  1193. package/packages/omo-codex/plugin/skills/data-scientist/references/performance-benchmarks.md +0 -37
  1194. package/packages/omo-codex/plugin/skills/start-work/agents/openai.yaml +0 -2
  1195. package/packages/omo-codex/plugin/skills/visual-qa/references/agent-browser-setup.md +0 -45
  1196. package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +0 -92
  1197. package/packages/omo-codex/plugin/test/component-codegraph-mcp-smoke.test.mjs +0 -76
  1198. package/packages/omo-codex/plugin/test/migrate-omo-sot.test.mjs +0 -179
  1199. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +0 -314
  1200. package/packages/omo-codex/plugin/test/ulw-plan-scope-contract.test.mjs +0 -24
  1201. package/packages/shared-skills/skills/data-scientist/references/common-scenarios.md +0 -176
  1202. package/packages/shared-skills/skills/data-scientist/references/execution-templates.md +0 -197
  1203. package/packages/shared-skills/skills/data-scientist/references/integration-patterns.md +0 -153
  1204. package/packages/shared-skills/skills/data-scientist/references/performance-benchmarks.md +0 -37
  1205. package/packages/shared-skills/skills/visual-qa/references/agent-browser-setup.md +0 -45
  1206. /package/dist/hooks/{start-work → ulw-execute}/context-info-formatters.d.ts +0 -0
  1207. /package/dist/hooks/{start-work → ulw-execute}/explicit-plan-context.d.ts +0 -0
  1208. /package/dist/hooks/{start-work → ulw-execute}/notepad-scaffold.d.ts +0 -0
  1209. /package/dist/hooks/{start-work → ulw-execute}/parse-user-request.d.ts +0 -0
  1210. /package/dist/hooks/{start-work → ulw-execute}/plan-discovery-context.d.ts +0 -0
  1211. /package/dist/hooks/{start-work → ulw-execute}/plan-selection.d.ts +0 -0
  1212. /package/dist/hooks/{start-work → ulw-execute}/session-plan-affinity.d.ts +0 -0
  1213. /package/dist/hooks/{start-work → ulw-execute}/work-initializer.d.ts +0 -0
  1214. /package/dist/hooks/{start-work → ulw-execute}/worktree-block.d.ts +0 -0
  1215. /package/dist/hooks/{start-work → ulw-execute}/worktree-detector.d.ts +0 -0
  1216. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/.gitattributes +0 -0
  1217. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/CHANGELOG.md +0 -0
  1218. /package/packages/omo-codex/plugin/components/{codegraph → ulw-execute-continuation}/LICENSE +0 -0
  1219. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/plan-checklist.ts +0 -0
  1220. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-completed.json +0 -0
  1221. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-mixed-platforms.json +0 -0
  1222. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-single-codex-work.json +0 -0
  1223. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-all-done.md +0 -0
  1224. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-scaffold.md +0 -0
  1225. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-nested-checkboxes.md +0 -0
  1226. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-unchecked.md +0 -0
  1227. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.build.json +0 -0
  1228. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.json +0 -0
  1229. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/vitest.config.ts +0 -0
@@ -15,6 +15,13 @@ import { pathToFileURL as pathToFileURL3 } from "node:url";
15
15
  // ../lsp-core/src/lsp/connection.ts
16
16
  import { pathToFileURL } from "node:url";
17
17
 
18
+ // ../lsp-core/src/lsp/timer-provider.ts
19
+ var realTimerProvider = {
20
+ now: () => Date.now(),
21
+ setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
22
+ clearTimeout: (handle) => clearTimeout(handle)
23
+ };
24
+
18
25
  // ../lsp-core/src/lsp/constants.ts
19
26
  var DEFAULT_MAX_REFERENCES = 200;
20
27
  var DEFAULT_MAX_SYMBOLS = 200;
@@ -23,28 +30,24 @@ var DEFAULT_MAX_DIRECTORY_FILES = 50;
23
30
  var REQUEST_TIMEOUT_MS = 15000;
24
31
  var INIT_TIMEOUT_MS = 60000;
25
32
  var IDLE_TIMEOUT_MS = 5 * 60000;
33
+ var MAX_RESIDENT_CLIENTS = 6;
26
34
  var REAPER_INTERVAL_MS = 60000;
27
35
  var STOP_HARD_KILL_TIMEOUT_MS = 5000;
28
36
  var STOP_SIGKILL_GRACE_MS = 1000;
37
+ var CLIENT_RESPAWN_RETRY_LIMIT = 2;
38
+ var CLIENT_RESPAWN_COOLDOWN_MS = 60000;
29
39
 
30
40
  // ../lsp-core/src/lsp/errors.ts
31
41
  class LspConnectionClosedError extends Error {
32
- serverId;
33
- root;
34
- name = "LspConnectionClosedError";
35
42
  constructor(serverId, root, message) {
36
43
  super(message ?? `LSP connection closed for ${serverId} at ${root}`);
37
44
  this.serverId = serverId;
38
45
  this.root = root;
46
+ this.name = "LspConnectionClosedError";
39
47
  }
40
48
  }
41
49
 
42
50
  class LspProcessExitedError extends Error {
43
- serverId;
44
- root;
45
- exitCode;
46
- stderrTail;
47
- name = "LspProcessExitedError";
48
51
  constructor(serverId, root, exitCode, stderrTail) {
49
52
  const stderrSuffix = stderrTail ? `
50
53
  stderr tail: ${stderrTail}` : "";
@@ -53,46 +56,59 @@ stderr tail: ${stderrTail}` : "";
53
56
  this.root = root;
54
57
  this.exitCode = exitCode;
55
58
  this.stderrTail = stderrTail;
59
+ this.name = "LspProcessExitedError";
56
60
  }
57
61
  }
58
62
 
59
63
  class LspRequestTimeoutError extends Error {
60
- method;
61
- stderrTail;
62
- name = "LspRequestTimeoutError";
63
64
  constructor(method, stderrTail) {
64
65
  const stderrSuffix = stderrTail ? `
65
66
  recent stderr: ${stderrTail}` : "";
66
67
  super(`LSP request timeout (method: ${method})${stderrSuffix}`);
67
68
  this.method = method;
68
69
  this.stderrTail = stderrTail;
70
+ this.name = "LspRequestTimeoutError";
69
71
  }
70
72
  }
71
73
 
72
74
  class LspInvalidPathError extends Error {
73
- name = "LspInvalidPathError";
75
+ constructor() {
76
+ super(...arguments);
77
+ this.name = "LspInvalidPathError";
78
+ }
74
79
  }
75
80
 
76
81
  class LspServerLookupError extends Error {
77
- lookup;
78
- name = "LspServerLookupError";
79
82
  constructor(message, lookup) {
80
83
  super(message);
81
84
  this.lookup = lookup;
85
+ this.name = "LspServerLookupError";
82
86
  }
83
87
  }
84
88
 
85
89
  class LspServerInitializingError extends Error {
86
- originalError;
87
- name = "LspServerInitializingError";
88
90
  constructor(originalError) {
89
91
  super(`LSP server is still initializing. Please retry in a few seconds. Original error: ${originalError.message}`);
90
92
  this.originalError = originalError;
93
+ this.name = "LspServerInitializingError";
91
94
  }
92
95
  }
93
96
 
94
97
  class LspProcessSpawnError extends Error {
95
- name = "LspProcessSpawnError";
98
+ constructor() {
99
+ super(...arguments);
100
+ this.name = "LspProcessSpawnError";
101
+ }
102
+ }
103
+
104
+ class LspClientRespawnBudgetExceededError extends Error {
105
+ constructor(serverId, root, retryLimit) {
106
+ super(`LSP server ${serverId} at ${root} failed to stay alive; respawn budget exhausted ` + `(${retryLimit} consecutive dead generations). Retrying after the cooldown may succeed.`);
107
+ this.serverId = serverId;
108
+ this.root = root;
109
+ this.retryLimit = retryLimit;
110
+ this.name = "LspClientRespawnBudgetExceededError";
111
+ }
96
112
  }
97
113
  function isLspDeadConnectionError(err) {
98
114
  return err instanceof LspConnectionClosedError || err instanceof LspProcessExitedError;
@@ -108,20 +124,31 @@ var METHOD_NOT_FOUND = -32601;
108
124
  var INTERNAL_ERROR = -32603;
109
125
 
110
126
  class JsonRpcConnection {
111
- reader;
112
- writer;
113
- pendingRequests = new Map;
114
- notificationHandlers = new Map;
115
- requestHandlers = new Map;
116
- closeHandlers = [];
117
- errorHandlers = [];
118
- inputBuffer = Buffer.alloc(0);
119
- nextRequestId = 1;
120
- listening = false;
121
- disposed = false;
122
127
  constructor(reader, writer) {
123
128
  this.reader = reader;
124
129
  this.writer = writer;
130
+ this.pendingRequests = new Map;
131
+ this.notificationHandlers = new Map;
132
+ this.requestHandlers = new Map;
133
+ this.closeHandlers = [];
134
+ this.errorHandlers = [];
135
+ this.inputBuffer = Buffer.alloc(0);
136
+ this.nextRequestId = 1;
137
+ this.listening = false;
138
+ this.disposed = false;
139
+ this.handleData = (chunk) => {
140
+ const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf8");
141
+ this.inputBuffer = Buffer.concat([this.inputBuffer, chunkBuffer]);
142
+ this.drainInputBuffer();
143
+ };
144
+ this.handleClose = () => {
145
+ for (const handler of this.closeHandlers) {
146
+ handler();
147
+ }
148
+ };
149
+ this.handleStreamError = (error) => {
150
+ this.emitError(error);
151
+ };
125
152
  }
126
153
  listen() {
127
154
  if (this.listening)
@@ -156,6 +183,7 @@ class JsonRpcConnection {
156
183
  let cancelAfterWrite = false;
157
184
  let settled = false;
158
185
  const writeCancel = () => this.writeMessage({ jsonrpc: "2.0", method: "$/cancelRequest", params: { id } });
186
+ let rejectAfterCancelWrite;
159
187
  const responsePromise = new Promise((resolve, reject) => {
160
188
  const cleanup = () => {
161
189
  options.signal?.removeEventListener("abort", onAbort);
@@ -167,15 +195,19 @@ class JsonRpcConnection {
167
195
  this.pendingRequests.delete(key);
168
196
  cleanup();
169
197
  const rejectCancelled = () => reject(abortError(options.signal));
198
+ rejectAfterCancelWrite = async () => {
199
+ try {
200
+ await writeCancel();
201
+ } catch (error) {
202
+ this.emitError(toError(error));
203
+ }
204
+ rejectCancelled();
205
+ };
170
206
  if (!requestWritten) {
171
207
  cancelAfterWrite = true;
172
- rejectCancelled();
173
208
  return;
174
209
  }
175
- writeCancel().then(rejectCancelled, (error) => {
176
- this.emitError(toError(error));
177
- rejectCancelled();
178
- });
210
+ rejectAfterCancelWrite();
179
211
  };
180
212
  const onAbort = () => settleCancel();
181
213
  this.pendingRequests.set(key, {
@@ -203,7 +235,7 @@ class JsonRpcConnection {
203
235
  await this.writeMessage(message);
204
236
  requestWritten = true;
205
237
  if (cancelAfterWrite)
206
- await writeCancel();
238
+ await rejectAfterCancelWrite?.();
207
239
  } catch (error) {
208
240
  if (settled)
209
241
  return responsePromise;
@@ -242,19 +274,6 @@ class JsonRpcConnection {
242
274
  this.notificationHandlers.clear();
243
275
  this.requestHandlers.clear();
244
276
  }
245
- handleData = (chunk) => {
246
- const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf8");
247
- this.inputBuffer = Buffer.concat([this.inputBuffer, chunkBuffer]);
248
- this.drainInputBuffer();
249
- };
250
- handleClose = () => {
251
- for (const handler of this.closeHandlers) {
252
- handler();
253
- }
254
- };
255
- handleStreamError = (error) => {
256
- this.emitError(error);
257
- };
258
277
  drainInputBuffer() {
259
278
  while (true) {
260
279
  const headerEnd = this.inputBuffer.indexOf(HEADER_SEPARATOR);
@@ -602,33 +621,29 @@ function isPosition(value) {
602
621
 
603
622
  // ../lsp-core/src/lsp/transport.ts
604
623
  class LspClientNotStartedError extends Error {
605
- serverId;
606
- root;
607
- name = "LspClientNotStartedError";
608
624
  constructor(serverId, root) {
609
625
  super("LSP client not started");
610
626
  this.serverId = serverId;
611
627
  this.root = root;
628
+ this.name = "LspClientNotStartedError";
612
629
  }
613
630
  }
614
631
 
615
632
  class LspClientTransport {
616
- root;
617
- server;
618
- proc = null;
619
- connection = null;
620
- stderrBuffer = [];
621
- processExited = false;
622
- diagnosticsStore = new Map;
623
- requestTimeoutMs;
624
- initializeTimeoutMs;
625
- workspaceApplyEditHandler = null;
626
- diagnosticPullSupported = false;
627
633
  constructor(root, server, timeouts = {}) {
628
634
  this.root = root;
629
635
  this.server = server;
636
+ this.proc = null;
637
+ this.connection = null;
638
+ this.stderrBuffer = [];
639
+ this.processExited = false;
640
+ this.diagnosticsStore = new Map;
641
+ this.workspaceApplyEditHandler = null;
642
+ this.diagnosticPullSupported = false;
643
+ this.documentFormattingSupported = false;
630
644
  this.requestTimeoutMs = timeouts.requestTimeoutMs ?? REQUEST_TIMEOUT_MS;
631
645
  this.initializeTimeoutMs = timeouts.initializeTimeoutMs ?? INIT_TIMEOUT_MS;
646
+ this.timerProvider = timeouts.timerProvider ?? realTimerProvider;
632
647
  }
633
648
  pid() {
634
649
  return this.proc?.pid;
@@ -648,6 +663,12 @@ class LspClientTransport {
648
663
  isDiagnosticPullSupported() {
649
664
  return this.diagnosticPullSupported;
650
665
  }
666
+ setDocumentFormattingSupported(supported) {
667
+ this.documentFormattingSupported = supported;
668
+ }
669
+ isDocumentFormattingSupported() {
670
+ return this.documentFormattingSupported;
671
+ }
651
672
  handlePublishDiagnostics(params) {
652
673
  this.diagnosticsStore.set(params.uri, [...params.diagnostics]);
653
674
  }
@@ -723,7 +744,7 @@ class LspClientTransport {
723
744
  const options = args[1];
724
745
  const timeoutMs = options?.timeoutMs ?? this.requestTimeoutMs;
725
746
  const timeoutController = new AbortController;
726
- const timeoutHandle = setTimeout(() => {
747
+ const timeoutHandle = this.timerProvider.setTimeout(() => {
727
748
  const stderrTail = this.stderrBuffer.slice(-5).join(`
728
749
  `);
729
750
  timeoutController.abort(new LspRequestTimeoutError(method, stderrTail || undefined));
@@ -742,7 +763,7 @@ class LspClientTransport {
742
763
  }
743
764
  throw error;
744
765
  } finally {
745
- clearTimeout(timeoutHandle);
766
+ this.timerProvider.clearTimeout(timeoutHandle);
746
767
  combinedSignal.dispose();
747
768
  }
748
769
  }
@@ -861,6 +882,14 @@ function supportsDiagnosticPull(capabilities) {
861
882
  return false;
862
883
  return Object.hasOwn(capabilities, "diagnosticProvider");
863
884
  }
885
+ function supportsDocumentFormatting(capabilities) {
886
+ if (capabilities === undefined)
887
+ return false;
888
+ const provider = capabilities.documentFormattingProvider;
889
+ if (provider === undefined || provider === null || provider === false)
890
+ return false;
891
+ return provider === true || typeof provider === "object";
892
+ }
864
893
 
865
894
  class LspClientConnection extends LspClientTransport {
866
895
  async initialize() {
@@ -877,6 +906,7 @@ class LspClientConnection extends LspClientTransport {
877
906
  references: {},
878
907
  documentSymbol: { hierarchicalDocumentSymbolSupport: true },
879
908
  publishDiagnostics: {},
909
+ formatting: { dynamicRegistration: false },
880
910
  rename: {
881
911
  prepareSupport: true,
882
912
  prepareSupportDefaultBehavior: 1
@@ -918,6 +948,7 @@ class LspClientConnection extends LspClientTransport {
918
948
  initializationOptions: this.server.initialization
919
949
  }, { timeoutMs: this.initializeTimeoutMs });
920
950
  this.setDiagnosticPullSupported(supportsDiagnosticPull(result?.capabilities));
951
+ this.setDocumentFormattingSupported(supportsDocumentFormatting(result?.capabilities));
921
952
  await this.sendNotification("initialized", {});
922
953
  await this.sendNotification("workspace/didChangeConfiguration", {
923
954
  settings: { json: { validate: { enable: true } } }
@@ -1123,6 +1154,17 @@ function canonicalPath(filePath) {
1123
1154
  return absolute;
1124
1155
  }
1125
1156
  }
1157
+ function normalizeDocumentUri(uri) {
1158
+ let decoded = uri;
1159
+ try {
1160
+ decoded = decodeURIComponent(uri);
1161
+ } catch {
1162
+ decoded = uri;
1163
+ }
1164
+ if (process.platform !== "win32")
1165
+ return decoded;
1166
+ return decoded.replace(/^(file:\/\/\/)([a-z]):/, (_match, prefix, drive) => `${prefix}${drive.toUpperCase()}:`);
1167
+ }
1126
1168
  function isSameOrDescendant(candidate, parent) {
1127
1169
  const suffix = relative(parent, candidate);
1128
1170
  return suffix === "" || !suffix.startsWith("..") && suffix !== "..";
@@ -1133,17 +1175,18 @@ function movedPath(candidate, oldPath, newPath) {
1133
1175
  }
1134
1176
 
1135
1177
  class WorkspaceDocumentState {
1136
- sendNotification;
1137
- clearDiagnostics;
1138
- openDocuments = new Map;
1139
- openByUri = new Map;
1140
- openPromises = new Map;
1141
- now;
1142
- versionlessPublishQuiescenceMs;
1143
1178
  constructor(sendNotification, clearDiagnostics, options = {}) {
1144
1179
  this.sendNotification = sendNotification;
1145
1180
  this.clearDiagnostics = clearDiagnostics;
1146
- this.now = options.now ?? (() => Date.now());
1181
+ this.openDocuments = new Map;
1182
+ this.openByUri = new Map;
1183
+ this.openPromises = new Map;
1184
+ this.timerProvider = options.timerProvider ?? {
1185
+ now: options.now ?? (() => Date.now()),
1186
+ setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
1187
+ clearTimeout: (handle) => clearTimeout(handle)
1188
+ };
1189
+ this.now = () => this.timerProvider.now();
1147
1190
  this.versionlessPublishQuiescenceMs = options.versionlessPublishQuiescenceMs ?? DEFAULT_VERSIONLESS_PUBLISH_QUIESCENCE_MS;
1148
1191
  }
1149
1192
  async openFile(filePath) {
@@ -1165,7 +1208,7 @@ class WorkspaceDocumentState {
1165
1208
  return this.openDocuments.get(canonicalPath(filePath))?.version;
1166
1209
  }
1167
1210
  getStoredDiagnostics(uri) {
1168
- const state = this.openByUri.get(uri);
1211
+ const state = this.openByUri.get(normalizeDocumentUri(uri));
1169
1212
  if (!state)
1170
1213
  return [];
1171
1214
  return state.lastPublish?.diagnostics ?? state.pullCache?.diagnostics ?? [];
@@ -1187,13 +1230,13 @@ class WorkspaceDocumentState {
1187
1230
  return state !== undefined && state.uri === snapshot.uri && state.version === snapshot.version && state.generation === snapshot.documentGeneration;
1188
1231
  }
1189
1232
  getPullCache(snapshot) {
1190
- const state = this.openByUri.get(snapshot.uri);
1233
+ const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
1191
1234
  if (!state?.pullCache || state.pullCache.documentVersion !== snapshot.version)
1192
1235
  return null;
1193
1236
  return state.pullCache;
1194
1237
  }
1195
1238
  recordPullDiagnostics(snapshot, report) {
1196
- const state = this.openByUri.get(snapshot.uri);
1239
+ const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
1197
1240
  if (!state)
1198
1241
  return;
1199
1242
  state.pullCache = {
@@ -1203,7 +1246,7 @@ class WorkspaceDocumentState {
1203
1246
  };
1204
1247
  }
1205
1248
  recordPublishedDiagnostics(params) {
1206
- const state = this.openByUri.get(params.uri);
1249
+ const state = this.openByUri.get(normalizeDocumentUri(params.uri));
1207
1250
  if (!state)
1208
1251
  return;
1209
1252
  state.publishGeneration += 1;
@@ -1217,7 +1260,7 @@ class WorkspaceDocumentState {
1217
1260
  this.notifyWaiters(state);
1218
1261
  }
1219
1262
  resolvePushDiagnostics(snapshot) {
1220
- const state = this.openByUri.get(snapshot.uri);
1263
+ const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
1221
1264
  if (!state?.lastPublish)
1222
1265
  return { status: "missing" };
1223
1266
  const publish = state.lastPublish;
@@ -1231,20 +1274,22 @@ class WorkspaceDocumentState {
1231
1274
  return waitMs === 0 ? { status: "ready", diagnostics: publish.diagnostics } : { status: "wait", waitMs };
1232
1275
  }
1233
1276
  waitForDiagnosticsActivity(snapshot, timeoutMs) {
1234
- const state = this.openByUri.get(snapshot.uri);
1277
+ const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
1235
1278
  if (!state || timeoutMs <= 0)
1236
1279
  return Promise.resolve();
1280
+ if (state.publishGeneration !== snapshot.publishGeneration)
1281
+ return Promise.resolve();
1237
1282
  return new Promise((resolveActivity) => {
1238
1283
  let settled = false;
1239
1284
  const finish = () => {
1240
1285
  if (settled)
1241
1286
  return;
1242
1287
  settled = true;
1243
- clearTimeout(timer);
1288
+ this.timerProvider.clearTimeout(timer);
1244
1289
  state.waiters.delete(finish);
1245
1290
  resolveActivity();
1246
1291
  };
1247
- const timer = setTimeout(finish, timeoutMs);
1292
+ const timer = this.timerProvider.setTimeout(finish, timeoutMs);
1248
1293
  if (typeof timer.unref === "function")
1249
1294
  timer.unref();
1250
1295
  state.waiters.add(finish);
@@ -1352,7 +1397,7 @@ class WorkspaceDocumentState {
1352
1397
  waiters: new Set
1353
1398
  };
1354
1399
  this.openDocuments.set(path, state);
1355
- this.openByUri.set(state.uri, state);
1400
+ this.openByUri.set(normalizeDocumentUri(state.uri), state);
1356
1401
  this.notifyWaiters(state);
1357
1402
  await this.sendNotification("textDocument/didOpen", {
1358
1403
  textDocument: { uri: state.uri, languageId: state.languageId, version: state.version, text }
@@ -1377,7 +1422,7 @@ class WorkspaceDocumentState {
1377
1422
  }
1378
1423
  async closeDocument(state) {
1379
1424
  this.openDocuments.delete(state.path);
1380
- this.openByUri.delete(state.uri);
1425
+ this.openByUri.delete(normalizeDocumentUri(state.uri));
1381
1426
  this.clearDiagnostics(state.uri);
1382
1427
  this.notifyWaiters(state);
1383
1428
  await this.sendNotification("textDocument/didClose", { textDocument: { uri: state.uri } });
@@ -1406,13 +1451,11 @@ import { dirname, isAbsolute, relative as relative2, resolve as resolve2 } from
1406
1451
  import { fileURLToPath } from "node:url";
1407
1452
 
1408
1453
  class WorkspaceEditPathError extends Error {
1409
- path;
1410
- detail;
1411
- name = "WorkspaceEditPathError";
1412
1454
  constructor(path, detail) {
1413
1455
  super(`${detail}: ${path}`);
1414
1456
  this.path = path;
1415
1457
  this.detail = detail;
1458
+ this.name = "WorkspaceEditPathError";
1416
1459
  }
1417
1460
  }
1418
1461
  function isPathInsideWorkspace(filePath, workspaceRoot) {
@@ -1704,13 +1747,11 @@ function canonicalFingerprint(operations) {
1704
1747
 
1705
1748
  // ../lsp-core/src/lsp/workspace-edit-types.ts
1706
1749
  class WorkspaceEditValidationError extends Error {
1707
- changeIndex;
1708
- detail;
1709
- name = "WorkspaceEditValidationError";
1710
1750
  constructor(changeIndex, detail) {
1711
1751
  super(`change ${changeIndex}: ${detail}`);
1712
1752
  this.changeIndex = changeIndex;
1713
1753
  this.detail = detail;
1754
+ this.name = "WorkspaceEditValidationError";
1714
1755
  }
1715
1756
  }
1716
1757
 
@@ -1796,14 +1837,14 @@ function parseSinglePathResource(input, kind) {
1796
1837
  return;
1797
1838
  }
1798
1839
  if (kind === "create") {
1799
- const options2 = parseOptions(change["options"], ["overwrite", "ignoreIfExists"], changeIndex);
1840
+ const options = parseOptions(change["options"], ["overwrite", "ignoreIfExists"], changeIndex);
1800
1841
  target.operations.push({
1801
1842
  kind,
1802
1843
  changeIndex,
1803
1844
  path: resolvedPath.path,
1804
1845
  reportedPath: resolvedPath.requestedPath,
1805
- overwrite: options2["overwrite"] ?? false,
1806
- ignoreIfExists: options2["ignoreIfExists"] ?? false,
1846
+ overwrite: options["overwrite"] ?? false,
1847
+ ignoreIfExists: options["ignoreIfExists"] ?? false,
1807
1848
  followedSymbolicLink: resolvedPath.followedSymbolicLink
1808
1849
  });
1809
1850
  return;
@@ -2208,10 +2249,9 @@ function simulateDelete(operation, virtual) {
2208
2249
  import { existsSync as existsSync4, lstatSync as lstatSync3, readdirSync as readdirSync2 } from "node:fs";
2209
2250
  import { dirname as dirname3, resolve as resolve4 } from "node:path";
2210
2251
  class WorkspaceSnapshotBuilder {
2211
- workspaceRoot;
2212
- snapshots = new Map;
2213
2252
  constructor(workspaceRoot) {
2214
2253
  this.workspaceRoot = workspaceRoot;
2254
+ this.snapshots = new Map;
2215
2255
  }
2216
2256
  build(operations) {
2217
2257
  this.add(this.workspaceRoot, false);
@@ -2255,8 +2295,10 @@ function snapshotOperations(operations, workspaceRoot) {
2255
2295
 
2256
2296
  // ../lsp-core/src/lsp/workspace-edit-plan.ts
2257
2297
  class PlanPathIndex {
2258
- firstChangeByPath = new Map;
2259
- reportedPathByCanonical = new Map;
2298
+ constructor() {
2299
+ this.firstChangeByPath = new Map;
2300
+ this.reportedPathByCanonical = new Map;
2301
+ }
2260
2302
  build(operations) {
2261
2303
  for (const operation of operations) {
2262
2304
  switch (operation.kind) {
@@ -2272,11 +2314,11 @@ class PlanPathIndex {
2272
2314
  }
2273
2315
  }
2274
2316
  }
2275
- add(path, reportedPath2, changeIndex) {
2317
+ add(path, reportedPath, changeIndex) {
2276
2318
  if (!this.firstChangeByPath.has(path))
2277
2319
  this.firstChangeByPath.set(path, changeIndex);
2278
2320
  if (!this.reportedPathByCanonical.has(path))
2279
- this.reportedPathByCanonical.set(path, reportedPath2);
2321
+ this.reportedPathByCanonical.set(path, reportedPath);
2280
2322
  }
2281
2323
  }
2282
2324
  function fingerprintWorkspaceEdit(edit, workspaceRoot) {
@@ -2345,14 +2387,11 @@ function isRecord3(value) {
2345
2387
  }
2346
2388
 
2347
2389
  class WorkspaceMutationController {
2348
- workspaceRoot;
2349
- documents;
2350
- activeLease = null;
2351
- nextLeaseId = 1;
2352
- io;
2353
2390
  constructor(workspaceRoot, documents) {
2354
2391
  this.workspaceRoot = workspaceRoot;
2355
2392
  this.documents = documents;
2393
+ this.activeLease = null;
2394
+ this.nextLeaseId = 1;
2356
2395
  }
2357
2396
  setIo(io) {
2358
2397
  this.io = io;
@@ -2391,8 +2430,8 @@ class WorkspaceMutationController {
2391
2430
  };
2392
2431
  }
2393
2432
  lease.phase = "applying";
2394
- lease.applyCompletion = new Promise((resolve5) => {
2395
- lease.resolveApply = resolve5;
2433
+ lease.applyCompletion = new Promise((resolve) => {
2434
+ lease.resolveApply = resolve;
2396
2435
  });
2397
2436
  const edit = isRecord3(params) ? params["edit"] : undefined;
2398
2437
  const record = edit === undefined ? { fingerprint: null, result: failure("workspace/applyEdit params.edit is required", 0) } : await this.applyEdit(edit, lease);
@@ -2465,14 +2504,12 @@ var DIAGNOSTICS_FRESHNESS_TIMEOUT_MS = 3000;
2465
2504
  var VERSIONLESS_PUBLISH_QUIESCENCE_MS = 250;
2466
2505
 
2467
2506
  class LspClient extends LspClientConnection {
2468
- diagnosticPullErrors = [];
2469
- documents;
2470
- workspaceMutations;
2471
- diagnosticsFreshnessTimeoutMs;
2472
2507
  constructor(root, server, options = {}) {
2473
2508
  super(root, server, options);
2509
+ this.diagnosticPullErrors = [];
2474
2510
  this.diagnosticsFreshnessTimeoutMs = options.diagnosticsFreshnessTimeoutMs ?? DIAGNOSTICS_FRESHNESS_TIMEOUT_MS;
2475
2511
  this.documents = new WorkspaceDocumentState((method, params) => this.sendNotification(method, params), (uri) => this.diagnosticsStore.delete(uri), {
2512
+ timerProvider: this.timerProvider,
2476
2513
  versionlessPublishQuiescenceMs: options.versionlessPublishQuiescenceMs ?? VERSIONLESS_PUBLISH_QUIESCENCE_MS
2477
2514
  });
2478
2515
  this.workspaceMutations = new WorkspaceMutationController(root, this.documents);
@@ -2525,6 +2562,18 @@ class LspClient extends LspClientConnection {
2525
2562
  textDocument: { uri: pathToFileURL3(absPath).href }
2526
2563
  }, options);
2527
2564
  }
2565
+ async formatDocument(filePath, options, signal) {
2566
+ if (!this.isDocumentFormattingSupported())
2567
+ return null;
2568
+ const absPath = this.resolveWorkspacePath(filePath);
2569
+ await this.openFile(absPath);
2570
+ const requestOptions = signal === undefined ? {} : { signal };
2571
+ const edits = await this.sendRequest("textDocument/formatting", {
2572
+ textDocument: { uri: pathToFileURL3(absPath).href },
2573
+ options
2574
+ }, requestOptions);
2575
+ return edits ?? [];
2576
+ }
2528
2577
  async workspaceSymbols(query, signal) {
2529
2578
  const options = signal === undefined ? {} : { signal };
2530
2579
  return this.sendRequest("workspace/symbol", { query }, options);
@@ -2564,7 +2613,7 @@ class LspClient extends LspClientConnection {
2564
2613
  const absPath = this.resolveWorkspacePath(filePath);
2565
2614
  const uri = pathToFileURL3(absPath).href;
2566
2615
  await this.openFile(absPath);
2567
- const deadlineAt = Date.now() + this.diagnosticsFreshnessTimeoutMs;
2616
+ const deadlineAt = this.timerProvider.now() + this.diagnosticsFreshnessTimeoutMs;
2568
2617
  for (;; ) {
2569
2618
  signal?.throwIfAborted();
2570
2619
  const snapshot = this.documents.captureDiagnosticSnapshot(absPath);
@@ -2577,13 +2626,13 @@ class LspClient extends LspClientConnection {
2577
2626
  if (!pushFallbackOnly) {
2578
2627
  const cached = this.documents.getPullCache(snapshot);
2579
2628
  try {
2580
- const remainingMs2 = deadlineAt - Date.now();
2581
- if (remainingMs2 <= 0)
2629
+ const remainingMs = deadlineAt - this.timerProvider.now();
2630
+ if (remainingMs <= 0)
2582
2631
  return this.freshnessTimeout(absPath);
2583
2632
  const result = await this.sendRequest("textDocument/diagnostic", {
2584
2633
  textDocument: { uri },
2585
2634
  ...cached?.resultId === undefined ? {} : { previousResultId: cached.resultId }
2586
- }, { timeoutMs: remainingMs2, ...signal === undefined ? {} : { signal } });
2635
+ }, { timeoutMs: remainingMs, ...signal === undefined ? {} : { signal } });
2587
2636
  if (!this.documents.isCurrentSnapshot(snapshot))
2588
2637
  continue;
2589
2638
  const report = this.parseDiagnosticPullReport(result);
@@ -2612,7 +2661,7 @@ class LspClient extends LspClientConnection {
2612
2661
  }
2613
2662
  if (!pushFallbackOnly)
2614
2663
  continue;
2615
- const remainingMs = deadlineAt - Date.now();
2664
+ const remainingMs = deadlineAt - this.timerProvider.now();
2616
2665
  if (remainingMs <= 0) {
2617
2666
  if (!this.isDiagnosticPullSupported() && snapshot.publishGeneration === 0) {
2618
2667
  const cached = this.documents.getPullCache(snapshot);
@@ -2664,7 +2713,7 @@ function waitForDiagnosticsActivity(wait, signal) {
2664
2713
  return wait;
2665
2714
  if (signal.aborted)
2666
2715
  return Promise.reject(abortError2(signal));
2667
- return new Promise((resolve6, reject) => {
2716
+ return new Promise((resolve, reject) => {
2668
2717
  const onAbort = () => {
2669
2718
  signal.removeEventListener("abort", onAbort);
2670
2719
  reject(abortError2(signal));
@@ -2672,7 +2721,7 @@ function waitForDiagnosticsActivity(wait, signal) {
2672
2721
  signal.addEventListener("abort", onAbort, { once: true });
2673
2722
  wait.then(() => {
2674
2723
  signal.removeEventListener("abort", onAbort);
2675
- resolve6();
2724
+ resolve();
2676
2725
  }, (error) => {
2677
2726
  signal.removeEventListener("abort", onAbort);
2678
2727
  reject(error);
@@ -2740,7 +2789,7 @@ async function stopClientBestEffort(client) {
2740
2789
  function awaitWithSignal(promise, signal) {
2741
2790
  if (!signal)
2742
2791
  return promise;
2743
- return new Promise((resolve6, reject) => {
2792
+ return new Promise((resolve, reject) => {
2744
2793
  let settled = false;
2745
2794
  const onAbort = () => {
2746
2795
  if (settled)
@@ -2758,7 +2807,7 @@ function awaitWithSignal(promise, signal) {
2758
2807
  return;
2759
2808
  settled = true;
2760
2809
  signal.removeEventListener("abort", onAbort);
2761
- resolve6(value);
2810
+ resolve(value);
2762
2811
  }, (err) => {
2763
2812
  if (settled)
2764
2813
  return;
@@ -2770,18 +2819,16 @@ function awaitWithSignal(promise, signal) {
2770
2819
  }
2771
2820
 
2772
2821
  class LspManager {
2773
- clients = new Map;
2774
- reaperHandle = null;
2775
- signalDisposer = null;
2776
- disposed = false;
2777
- idleTimeoutMs;
2778
- initTimeoutMs;
2779
- reaperIntervalMs;
2780
- clientFactory;
2781
- now;
2782
2822
  constructor(options = {}) {
2823
+ this.clients = new Map;
2824
+ this.pendingStops = new Map;
2825
+ this.respawnBudgets = new Map;
2826
+ this.reaperHandle = null;
2827
+ this.signalDisposer = null;
2828
+ this.disposed = false;
2783
2829
  this.idleTimeoutMs = options.idleTimeoutMs ?? IDLE_TIMEOUT_MS;
2784
2830
  this.initTimeoutMs = options.initTimeoutMs ?? INIT_TIMEOUT_MS;
2831
+ this.maxResidentClients = options.maxResidentClients ?? MAX_RESIDENT_CLIENTS;
2785
2832
  this.reaperIntervalMs = options.reaperIntervalMs ?? REAPER_INTERVAL_MS;
2786
2833
  this.clientFactory = options.clientFactory ?? ((root, server) => new LspClient(root, server));
2787
2834
  this.now = options.now ?? (() => Date.now());
@@ -2801,24 +2848,79 @@ class LspManager {
2801
2848
  getKey(root, serverId) {
2802
2849
  return `${root}::${serverId}`;
2803
2850
  }
2851
+ tombstoneStop(key, client) {
2852
+ const stop = stopClientBestEffort(client);
2853
+ this.pendingStops.set(key, stop);
2854
+ stop.finally(() => {
2855
+ if (this.pendingStops.get(key) === stop) {
2856
+ this.pendingStops.delete(key);
2857
+ }
2858
+ });
2859
+ return stop;
2860
+ }
2861
+ recordDeadGeneration(key) {
2862
+ let budget = this.respawnBudgets.get(key);
2863
+ if (budget === undefined) {
2864
+ budget = { deadGenerations: 0, exhaustedAt: null };
2865
+ this.respawnBudgets.set(key, budget);
2866
+ }
2867
+ budget.deadGenerations += 1;
2868
+ }
2869
+ markHealthyGeneration(key) {
2870
+ this.respawnBudgets.delete(key);
2871
+ }
2872
+ ensureRespawnAllowed(key, root, serverId) {
2873
+ const budget = this.respawnBudgets.get(key);
2874
+ if (budget === undefined || budget.deadGenerations < CLIENT_RESPAWN_RETRY_LIMIT)
2875
+ return;
2876
+ if (budget.exhaustedAt === null) {
2877
+ budget.exhaustedAt = this.now();
2878
+ throw new LspClientRespawnBudgetExceededError(serverId, root, CLIENT_RESPAWN_RETRY_LIMIT);
2879
+ }
2880
+ if (this.now() - budget.exhaustedAt < CLIENT_RESPAWN_COOLDOWN_MS) {
2881
+ throw new LspClientRespawnBudgetExceededError(serverId, root, CLIENT_RESPAWN_RETRY_LIMIT);
2882
+ }
2883
+ budget.deadGenerations = 0;
2884
+ budget.exhaustedAt = null;
2885
+ }
2804
2886
  reapStale() {
2805
2887
  const t = this.now();
2806
2888
  for (const [key, managed] of this.clients) {
2807
2889
  if (managed.isInitializing && managed.initializingSince !== null && t - managed.initializingSince > this.initTimeoutMs) {
2808
- stopClientBestEffort(managed.client);
2809
2890
  this.clients.delete(key);
2891
+ this.tombstoneStop(key, managed.client);
2810
2892
  continue;
2811
2893
  }
2812
2894
  if (!managed.isInitializing && managed.refCount === 0 && managed.pendingWaiters === 0 && t - managed.lastUsedAt > this.idleTimeoutMs) {
2813
- stopClientBestEffort(managed.client);
2814
2895
  this.clients.delete(key);
2896
+ this.tombstoneStop(key, managed.client);
2897
+ }
2898
+ }
2899
+ }
2900
+ evictForAdmission() {
2901
+ while (this.clients.size >= this.maxResidentClients) {
2902
+ const victim = this.leastRecentlyUsedIdleClient();
2903
+ if (!victim)
2904
+ return;
2905
+ this.clients.delete(victim.key);
2906
+ this.tombstoneStop(victim.key, victim.managed.client);
2907
+ }
2908
+ }
2909
+ leastRecentlyUsedIdleClient() {
2910
+ let candidate = null;
2911
+ for (const [key, managed] of this.clients) {
2912
+ if (managed.refCount > 0 || managed.pendingWaiters > 0 || managed.isInitializing)
2913
+ continue;
2914
+ if (candidate === null || managed.lastUsedAt < candidate.managed.lastUsedAt) {
2915
+ candidate = { key, managed };
2815
2916
  }
2816
2917
  }
2918
+ return candidate;
2817
2919
  }
2818
2920
  async tryDeleteIfOrphaned(key, managed) {
2819
2921
  if (managed.refCount === 0 && managed.pendingWaiters === 0 && !managed.isInitializing && this.clients.get(key) === managed) {
2820
2922
  this.clients.delete(key);
2821
- await stopClientBestEffort(managed.client);
2923
+ await this.tombstoneStop(key, managed.client);
2822
2924
  }
2823
2925
  }
2824
2926
  async getClient(root, server, signal) {
@@ -2827,12 +2929,22 @@ class LspManager {
2827
2929
  }
2828
2930
  signal?.throwIfAborted();
2829
2931
  const key = this.getKey(root, server.id);
2932
+ for (;; ) {
2933
+ const pendingStop = this.pendingStops.get(key);
2934
+ if (pendingStop === undefined)
2935
+ break;
2936
+ await awaitWithSignal(pendingStop, signal);
2937
+ signal?.throwIfAborted();
2938
+ }
2939
+ if (this.disposed) {
2940
+ throw new Error("LspManager has been disposed");
2941
+ }
2830
2942
  let managed = this.clients.get(key);
2831
2943
  if (managed) {
2832
2944
  const t = this.now();
2833
2945
  if (managed.isInitializing && managed.initializingSince !== null && t - managed.initializingSince > this.initTimeoutMs) {
2834
- await stopClientBestEffort(managed.client);
2835
2946
  this.clients.delete(key);
2947
+ await this.tombstoneStop(key, managed.client);
2836
2948
  managed = undefined;
2837
2949
  }
2838
2950
  }
@@ -2853,14 +2965,20 @@ class LspManager {
2853
2965
  signal.throwIfAborted();
2854
2966
  }
2855
2967
  if (!managed.client.isAlive()) {
2856
- await stopClientBestEffort(managed.client);
2857
- this.clients.delete(key);
2968
+ this.recordDeadGeneration(key);
2969
+ if (this.clients.get(key) === managed) {
2970
+ this.clients.delete(key);
2971
+ }
2972
+ await this.tombstoneStop(key, managed.client);
2858
2973
  return this.getClient(root, server, signal);
2859
2974
  }
2975
+ this.markHealthyGeneration(key);
2860
2976
  managed.refCount++;
2861
2977
  managed.lastUsedAt = this.now();
2862
2978
  return managed.client;
2863
2979
  }
2980
+ this.evictForAdmission();
2981
+ this.ensureRespawnAllowed(key, root, server.id);
2864
2982
  const client = this.clientFactory(root, server);
2865
2983
  const initStartedAt = this.now();
2866
2984
  const initPromise = (async () => {
@@ -2884,7 +3002,7 @@ class LspManager {
2884
3002
  if (this.clients.get(key) === newManaged) {
2885
3003
  this.clients.delete(key);
2886
3004
  }
2887
- await stopClientBestEffort(client);
3005
+ await this.tombstoneStop(key, client);
2888
3006
  throw err;
2889
3007
  }
2890
3008
  newManaged.pendingWaiters--;
@@ -2895,6 +3013,15 @@ class LspManager {
2895
3013
  await this.tryDeleteIfOrphaned(key, newManaged);
2896
3014
  signal.throwIfAborted();
2897
3015
  }
3016
+ if (!client.isAlive()) {
3017
+ this.recordDeadGeneration(key);
3018
+ if (this.clients.get(key) === newManaged) {
3019
+ this.clients.delete(key);
3020
+ }
3021
+ await this.tombstoneStop(key, client);
3022
+ return this.getClient(root, server, signal);
3023
+ }
3024
+ this.markHealthyGeneration(key);
2898
3025
  newManaged.refCount++;
2899
3026
  newManaged.lastUsedAt = this.now();
2900
3027
  return client;
@@ -2915,14 +3042,20 @@ class LspManager {
2915
3042
  if (client && managed.client !== client)
2916
3043
  return;
2917
3044
  this.clients.delete(key);
2918
- stopClientBestEffort(managed.client);
3045
+ this.tombstoneStop(key, managed.client);
2919
3046
  }
2920
3047
  warmupClient(root, server) {
2921
3048
  if (this.disposed)
2922
3049
  return;
2923
3050
  const key = this.getKey(root, server.id);
2924
- if (this.clients.has(key))
3051
+ if (this.clients.has(key) || this.pendingStops.has(key))
2925
3052
  return;
3053
+ this.evictForAdmission();
3054
+ try {
3055
+ this.ensureRespawnAllowed(key, root, server.id);
3056
+ } catch {
3057
+ return;
3058
+ }
2926
3059
  const client = this.clientFactory(root, server);
2927
3060
  const initStartedAt = this.now();
2928
3061
  const initPromise = (async () => {
@@ -2948,7 +3081,7 @@ class LspManager {
2948
3081
  if (this.clients.get(key) === managed) {
2949
3082
  this.clients.delete(key);
2950
3083
  }
2951
- stopClientBestEffort(client);
3084
+ this.tombstoneStop(key, client);
2952
3085
  });
2953
3086
  }
2954
3087
  isServerInitializing(root, serverId) {
@@ -2992,8 +3125,11 @@ class LspManager {
2992
3125
  for (const managed of this.clients.values()) {
2993
3126
  stopPromises.push(stopClientBestEffort(managed.client));
2994
3127
  }
3128
+ const tombstonedStops = [...this.pendingStops.values()];
2995
3129
  this.clients.clear();
2996
- await Promise.allSettled(stopPromises);
3130
+ this.respawnBudgets.clear();
3131
+ await Promise.allSettled([...stopPromises, ...tombstonedStops]);
3132
+ this.pendingStops.clear();
2997
3133
  }
2998
3134
  }
2999
3135
  var _defaultInstance = null;
@@ -3013,7 +3149,7 @@ async function disposeDefaultLspManager() {
3013
3149
  // src/daemon-client.ts
3014
3150
  import { connect } from "node:net";
3015
3151
  import { homedir as homedir3 } from "node:os";
3016
- import { join as join7 } from "node:path";
3152
+ import { join as join8 } from "node:path";
3017
3153
 
3018
3154
  // ../lsp-core/src/request-context.ts
3019
3155
  import { AsyncLocalStorage } from "node:async_hooks";
@@ -3022,18 +3158,17 @@ import { homedir } from "node:os";
3022
3158
  import { basename as basename2, delimiter as delimiter2, dirname as dirname4, isAbsolute as isAbsolute2, join as join2, relative as relative4, resolve as resolve6 } from "node:path";
3023
3159
 
3024
3160
  class LspRequestContextParseError extends Error {
3025
- code;
3026
- name = "LspRequestContextParseError";
3027
3161
  constructor(code, message) {
3028
3162
  super(message);
3029
3163
  this.code = code;
3164
+ this.name = "LspRequestContextParseError";
3030
3165
  }
3031
3166
  }
3032
3167
 
3033
3168
  class LspRequestContextUnavailableError extends Error {
3034
- name = "LspRequestContextUnavailableError";
3035
3169
  constructor() {
3036
3170
  super("LSP request context is required. Standalone MCP startup must install one with runWithRequestContext(createStandaloneMcpRequestContext()).");
3171
+ this.name = "LspRequestContextUnavailableError";
3037
3172
  }
3038
3173
  }
3039
3174
  var storage = new AsyncLocalStorage;
@@ -3053,7 +3188,7 @@ function contextCwd() {
3053
3188
  }
3054
3189
  function createStandaloneMcpRequestContext(input = {}) {
3055
3190
  const env = input.env ?? process.env;
3056
- const cwd = canonicalCwd(input.cwd ?? process.cwd());
3191
+ const cwd = canonicalCwd(input.cwd ?? env["LSP_TOOLS_MCP_CWD"] ?? process.cwd());
3057
3192
  const home = input.homeDir ?? homedir();
3058
3193
  const projectConfigPaths = translateProjectConfigEnv(env["LSP_TOOLS_MCP_PROJECT_CONFIG"], cwd);
3059
3194
  const userConfigPath = translateHomeConfigEnv(env["LSP_TOOLS_MCP_USER_CONFIG"], home, ".codex/lsp-client.json");
@@ -3191,7 +3326,6 @@ function isPlainRecord(value) {
3191
3326
 
3192
3327
  // src/daemon-request-error.ts
3193
3328
  class DaemonRequestError extends Error {
3194
- requestWritten;
3195
3329
  constructor(message, requestWritten) {
3196
3330
  super(message);
3197
3331
  this.name = "DaemonRequestError";
@@ -3214,7 +3348,6 @@ class DaemonRequestCancelledError extends DaemonRequestError {
3214
3348
  }
3215
3349
 
3216
3350
  class DaemonRequestTimedOutError extends DaemonRequestError {
3217
- timeoutMs;
3218
3351
  constructor(requestWritten, timeoutMs) {
3219
3352
  super("daemon request timed out", requestWritten);
3220
3353
  this.name = "DaemonRequestTimedOutError";
@@ -3293,14 +3426,12 @@ var PROTOCOL_ERROR_CODE = -32002;
3293
3426
  var AUTH_TOKEN_BYTES = 32;
3294
3427
 
3295
3428
  class UnsafePrivateDirectoryError extends Error {
3296
- path;
3297
- reason;
3298
- name = "UnsafePrivateDirectoryError";
3299
- code = "unsafe_private_directory";
3300
3429
  constructor(path, reason) {
3301
3430
  super(`unsafe private directory ${path}: ${reason}`);
3302
3431
  this.path = path;
3303
3432
  this.reason = reason;
3433
+ this.name = "UnsafePrivateDirectoryError";
3434
+ this.code = "unsafe_private_directory";
3304
3435
  }
3305
3436
  }
3306
3437
  function authEnvelope(token) {
@@ -3484,20 +3615,18 @@ var OMO_LSP_DAEMON_VERSION = "OMO_LSP_DAEMON_VERSION";
3484
3615
  var DAEMON_VERSION_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._+-]{0,127}$/;
3485
3616
 
3486
3617
  class InvalidRuntimeOverrideError extends Error {
3487
- code = "invalid_runtime_override";
3488
- reason;
3489
3618
  constructor(reason, message) {
3490
3619
  super(message);
3620
+ this.code = "invalid_runtime_override";
3491
3621
  this.name = "InvalidRuntimeOverrideError";
3492
3622
  this.reason = reason;
3493
3623
  }
3494
3624
  }
3495
3625
 
3496
3626
  class InvalidDaemonVersionError extends Error {
3497
- code = "invalid_daemon_version";
3498
- version;
3499
3627
  constructor(version) {
3500
3628
  super("LSP daemon version must match [A-Za-z0-9][A-Za-z0-9._+-]{0,127}");
3629
+ this.code = "invalid_daemon_version";
3501
3630
  this.name = "InvalidDaemonVersionError";
3502
3631
  this.version = version;
3503
3632
  }
@@ -3543,10 +3672,9 @@ var requireFromHere = createRequire(import.meta.url);
3543
3672
  var MAX_SOCKET_PATH_LENGTH = 100;
3544
3673
 
3545
3674
  class InvalidDaemonDirectoryError extends Error {
3546
- code = "invalid_daemon_directory";
3547
- directory;
3548
3675
  constructor(directory) {
3549
3676
  super(`${OMO_LSP_DAEMON_DIR} must be an absolute path`);
3677
+ this.code = "invalid_daemon_directory";
3550
3678
  this.name = "InvalidDaemonDirectoryError";
3551
3679
  this.directory = directory;
3552
3680
  }
@@ -3700,7 +3828,7 @@ async function probeDaemon(paths, timeoutMs = PROBE_TIMEOUT_MS, signal) {
3700
3828
  return await pingDaemon(paths, token, timeoutMs, signal) !== null;
3701
3829
  }
3702
3830
  function pingDaemon(paths, token, timeoutMs = PROBE_TIMEOUT_MS, signal) {
3703
- return new Promise((resolve7) => {
3831
+ return new Promise((resolve) => {
3704
3832
  const socket = new Socket;
3705
3833
  let settled = false;
3706
3834
  let timer;
@@ -3712,7 +3840,7 @@ function pingDaemon(paths, token, timeoutMs = PROBE_TIMEOUT_MS, signal) {
3712
3840
  clearTimeout(timer);
3713
3841
  signal?.removeEventListener("abort", onAbort);
3714
3842
  socket.destroy();
3715
- resolve7(value);
3843
+ resolve(value);
3716
3844
  };
3717
3845
  const onAbort = () => finish(null);
3718
3846
  const decoder = createLineDecoder((message) => {
@@ -3735,13 +3863,17 @@ function pingDaemon(paths, token, timeoutMs = PROBE_TIMEOUT_MS, signal) {
3735
3863
  socket.connect(paths.socket);
3736
3864
  });
3737
3865
  }
3738
- function spawnDaemonProcess(paths) {
3866
+ function spawnDaemonProcess(paths, deps = {}) {
3739
3867
  mkdirSync2(dirname6(paths.log), { recursive: true });
3740
3868
  const logFd = openSync2(paths.log, "a");
3741
3869
  try {
3742
- const child = spawn2(resolveDaemonNodeExecutable(), [paths.cliPath, "daemon"], {
3870
+ const spawnDaemonChild = deps.spawn ?? spawn2;
3871
+ const executable = deps.resolveExecutable?.() ?? resolveDaemonNodeExecutable();
3872
+ const child = spawnDaemonChild(executable, [paths.cliPath, "daemon"], {
3743
3873
  detached: true,
3744
- stdio: ["ignore", logFd, logFd]
3874
+ stdio: ["ignore", logFd, logFd],
3875
+ windowsHide: true,
3876
+ env: { ...process.env, BUN_BE_BUN: "1" }
3745
3877
  });
3746
3878
  child.once("spawn", () => closeSync2(logFd));
3747
3879
  child.once("error", (error) => {
@@ -3771,7 +3903,7 @@ function defaultEnsureDaemonDeps() {
3771
3903
  };
3772
3904
  }
3773
3905
  function sleepWithSignal(ms, signal) {
3774
- return new Promise((resolve7) => {
3906
+ return new Promise((resolve) => {
3775
3907
  let settled = false;
3776
3908
  const finish = () => {
3777
3909
  if (settled)
@@ -3779,7 +3911,7 @@ function sleepWithSignal(ms, signal) {
3779
3911
  settled = true;
3780
3912
  clearTimeout(timer);
3781
3913
  signal?.removeEventListener("abort", finish);
3782
- resolve7();
3914
+ resolve();
3783
3915
  };
3784
3916
  const timer = setTimeout(finish, ms);
3785
3917
  if (signal?.aborted) {
@@ -3794,7 +3926,7 @@ function awaitWithSignal2(promise, signal) {
3794
3926
  return promise;
3795
3927
  if (signal.aborted)
3796
3928
  return Promise.reject(abortError3(signal));
3797
- return new Promise((resolve7, reject) => {
3929
+ return new Promise((resolve, reject) => {
3798
3930
  let settled = false;
3799
3931
  const finish = (run) => {
3800
3932
  if (settled)
@@ -3805,7 +3937,7 @@ function awaitWithSignal2(promise, signal) {
3805
3937
  };
3806
3938
  const onAbort = () => finish(() => reject(abortError3(signal)));
3807
3939
  signal.addEventListener("abort", onAbort, { once: true });
3808
- promise.then((value) => finish(() => resolve7(value)), (error) => finish(() => reject(error)));
3940
+ promise.then((value) => finish(() => resolve(value)), (error) => finish(() => reject(error)));
3809
3941
  });
3810
3942
  }
3811
3943
  function throwIfAborted(signal) {
@@ -3834,18 +3966,18 @@ function parsePingResponse(message) {
3834
3966
  return null;
3835
3967
  if (!endpoint || typeof endpoint !== "object" || Array.isArray(endpoint))
3836
3968
  return null;
3837
- const path2 = Reflect.get(endpoint, "path");
3969
+ const path = Reflect.get(endpoint, "path");
3838
3970
  const kind = Reflect.get(endpoint, "kind");
3839
- if (typeof path2 !== "string")
3971
+ if (typeof path !== "string")
3840
3972
  return null;
3841
3973
  if (kind === "windows")
3842
- return { pid, nonce, startedAt, endpoint: { kind, path: path2 } };
3974
+ return { pid, nonce, startedAt, endpoint: { kind, path } };
3843
3975
  if (kind === "missing")
3844
- return { pid, nonce, startedAt, endpoint: { kind, path: path2 } };
3976
+ return { pid, nonce, startedAt, endpoint: { kind, path } };
3845
3977
  const dev = Reflect.get(endpoint, "dev");
3846
3978
  const ino = Reflect.get(endpoint, "ino");
3847
3979
  if (kind === "unix" && typeof dev === "number" && typeof ino === "number") {
3848
- return { pid, nonce, startedAt, endpoint: { kind, path: path2, dev, ino } };
3980
+ return { pid, nonce, startedAt, endpoint: { kind, path, dev, ino } };
3849
3981
  }
3850
3982
  return null;
3851
3983
  }
@@ -3893,7 +4025,7 @@ ${body}` : `${body}
3893
4025
  await writeChunk(output, payload);
3894
4026
  }
3895
4027
  function writeChunk(output, chunk) {
3896
- return new Promise((resolve7, reject) => {
4028
+ return new Promise((resolve, reject) => {
3897
4029
  let settled = false;
3898
4030
  const onError = (error) => {
3899
4031
  if (settled)
@@ -3913,7 +4045,7 @@ function writeChunk(output, chunk) {
3913
4045
  return;
3914
4046
  }
3915
4047
  output.removeListener("error", onError);
3916
- resolve7();
4048
+ resolve();
3917
4049
  });
3918
4050
  } catch (error) {
3919
4051
  output.removeListener("error", onError);
@@ -4022,6 +4154,7 @@ async function runJsonRpcStdioServer(config) {
4022
4154
  const idleTimer = createIdleTimer(idleTimeoutMs, log, () => {
4023
4155
  isClosed = true;
4024
4156
  config.onIdleTimeout?.();
4157
+ config.input.destroy();
4025
4158
  });
4026
4159
  const watchdog = createParentWatchdog(config.parentWatchdog, (parentPid, pollIntervalMs) => {
4027
4160
  isClosed = true;
@@ -4118,7 +4251,11 @@ function createParentWatchdog(config, onDeadParent) {
4118
4251
  const probeAlive = config.probeAlive ?? isProcessAlive;
4119
4252
  let fired = false;
4120
4253
  const timer = setInterval(() => {
4121
- if (fired || probeAlive(parentPid))
4254
+ if (fired)
4255
+ return;
4256
+ const alive = probeAlive(parentPid);
4257
+ config.onPoll?.(alive);
4258
+ if (alive)
4122
4259
  return;
4123
4260
  fired = true;
4124
4261
  onDeadParent(parentPid, pollIntervalMs);
@@ -4153,60 +4290,55 @@ function createIdleTimer(idleTimeoutMs, log, onTimeout) {
4153
4290
  };
4154
4291
  }
4155
4292
  // ../lsp-core/src/lsp/client-wrapper.ts
4156
- import { existsSync as existsSync10, realpathSync as realpathSync4, statSync as statSync4 } from "node:fs";
4157
- import { basename as basename3, dirname as dirname8, join as join4, resolve as resolve7 } from "node:path";
4293
+ import { existsSync as existsSync11, realpathSync as realpathSync5, statSync as statSync4 } from "node:fs";
4294
+ import { basename as basename3, dirname as dirname10, join as join5, resolve as resolve8 } from "node:path";
4158
4295
 
4159
- // ../lsp-core/src/lsp/server-install-state.ts
4160
- import { existsSync as existsSync7, mkdirSync as mkdirSync3, readFileSync as readFileSync4, renameSync as renameSync2, writeFileSync as writeFileSync2 } from "node:fs";
4161
- import { dirname as dirname7 } from "node:path";
4162
- function getInstallDecisionsPath() {
4163
- return lspRequestContext().installDecisionsPath;
4164
- }
4165
- function loadInstallDecisions() {
4166
- const path2 = getInstallDecisionsPath();
4167
- if (!existsSync7(path2))
4168
- return {};
4169
- try {
4170
- const parsed = JSON.parse(readFileSync4(path2, "utf8"));
4171
- return isInstallDecisions(parsed) ? parsed : {};
4172
- } catch {
4173
- return {};
4296
+ // ../lsp-core/src/lsp/outside-context-workspace.ts
4297
+ import { existsSync as existsSync7, realpathSync as realpathSync4 } from "node:fs";
4298
+ import { dirname as dirname7, join as join3 } from "node:path";
4299
+
4300
+ // ../lsp-core/src/lsp/workspace-markers.ts
4301
+ var GIT_WORKSPACE_MARKER = ".git";
4302
+ var PROJECT_WORKSPACE_MARKERS = [
4303
+ "package.json",
4304
+ "pyproject.toml",
4305
+ "Cargo.toml",
4306
+ "go.mod",
4307
+ "pom.xml",
4308
+ "build.gradle"
4309
+ ];
4310
+ var WORKSPACE_MARKERS = [GIT_WORKSPACE_MARKER, ...PROJECT_WORKSPACE_MARKERS];
4311
+
4312
+ // ../lsp-core/src/lsp/outside-context-workspace.ts
4313
+ function findWorkspaceRootOutsideContext(directory) {
4314
+ const marked = nearestMarkedAncestor(directory);
4315
+ if (marked !== undefined)
4316
+ return marked;
4317
+ return realpathSync4(nearestExistingAncestor(directory));
4318
+ }
4319
+ function nearestMarkedAncestor(directory) {
4320
+ let current = directory;
4321
+ for (;; ) {
4322
+ if (existsSync7(current) && WORKSPACE_MARKERS.some((marker) => existsSync7(join3(current, marker)))) {
4323
+ return realpathSync4(current);
4324
+ }
4325
+ const parent = dirname7(current);
4326
+ if (parent === current)
4327
+ return;
4328
+ current = parent;
4174
4329
  }
4175
4330
  }
4176
- function loadInstallDecision(serverId) {
4177
- return loadInstallDecisions()[serverId];
4178
- }
4179
- function recordInstallDecision(serverId, decision, decidedAt = new Date().toISOString()) {
4180
- const decisions = loadInstallDecisions();
4181
- decisions[serverId] = { decision, decidedAt };
4182
- writeInstallDecisions(decisions);
4183
- }
4184
- function isInstallDecision(value) {
4185
- return value === "declined" || value === "allowed";
4186
- }
4187
- function writeInstallDecisions(decisions) {
4188
- const path2 = getInstallDecisionsPath();
4189
- mkdirSync3(dirname7(path2), { recursive: true });
4190
- const tmpPath = `${path2}.tmp`;
4191
- writeFileSync2(tmpPath, `${JSON.stringify(decisions, null, 2)}
4192
- `, "utf8");
4193
- renameSync2(tmpPath, path2);
4194
- }
4195
- function isInstallDecisions(value) {
4196
- return isRecord5(value) && Object.values(value).every(isInstallDecisionRecord);
4197
- }
4198
- function isInstallDecisionRecord(value) {
4199
- if (!isRecord5(value))
4200
- return false;
4201
- return isInstallDecision(value["decision"]) && typeof value["decidedAt"] === "string";
4202
- }
4203
- function isRecord5(value) {
4204
- return typeof value === "object" && value !== null && !Array.isArray(value);
4331
+ function nearestExistingAncestor(directory) {
4332
+ let current = directory;
4333
+ while (!existsSync7(current)) {
4334
+ const parent = dirname7(current);
4335
+ if (parent === current)
4336
+ return current;
4337
+ current = parent;
4338
+ }
4339
+ return current;
4205
4340
  }
4206
4341
 
4207
- // ../lsp-core/src/lsp/config-loader.ts
4208
- import { existsSync as existsSync8, readFileSync as readFileSync5 } from "node:fs";
4209
-
4210
4342
  // ../lsp-core/src/lsp/server-definitions.ts
4211
4343
  var LSP_INSTALL_HINTS = {
4212
4344
  typescript: "npm install -g typescript-language-server typescript",
@@ -4252,6 +4384,26 @@ var LSP_INSTALL_HINTS = {
4252
4384
  julials: `julia -e 'using Pkg; Pkg.add("LanguageServer")'`,
4253
4385
  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"
4254
4386
  };
4387
+ var LSP_LOCAL_INSTALL_HINTS = {
4388
+ typescript: "bun add -d typescript-language-server typescript",
4389
+ vue: "bun add -d @vue/language-server",
4390
+ eslint: "bun add -d vscode-langservers-extracted",
4391
+ oxlint: "bun add -d oxlint",
4392
+ biome: "bun add -d @biomejs/biome",
4393
+ svelte: "bun add -d svelte-language-server",
4394
+ astro: "bun add -d @astrojs/language-server",
4395
+ bash: "bun add -d bash-language-server",
4396
+ "bash-ls": "bun add -d bash-language-server",
4397
+ "yaml-ls": "bun add -d yaml-language-server",
4398
+ php: "bun add -d intelephense",
4399
+ prisma: "bun add -d prisma",
4400
+ dockerfile: "bun add -d dockerfile-language-server-nodejs",
4401
+ pyright: "uv add --dev pyright",
4402
+ basedpyright: "uv add --dev basedpyright",
4403
+ ruff: "uv add --dev ruff",
4404
+ ty: "uv add --dev ty",
4405
+ "ruby-lsp": "bundle add ruby-lsp --group development"
4406
+ };
4255
4407
  var BUILTIN_SERVERS = {
4256
4408
  typescript: {
4257
4409
  command: ["typescript-language-server", "--stdio"],
@@ -4354,18 +4506,67 @@ var BUILTIN_SERVERS = {
4354
4506
  }
4355
4507
  };
4356
4508
 
4509
+ // ../lsp-core/src/lsp/server-install-state.ts
4510
+ import { existsSync as existsSync8, mkdirSync as mkdirSync3, readFileSync as readFileSync4, renameSync as renameSync2, writeFileSync as writeFileSync2 } from "node:fs";
4511
+ import { dirname as dirname8 } from "node:path";
4512
+ function getInstallDecisionsPath() {
4513
+ return lspRequestContext().installDecisionsPath;
4514
+ }
4515
+ function loadInstallDecisions() {
4516
+ const path = getInstallDecisionsPath();
4517
+ if (!existsSync8(path))
4518
+ return {};
4519
+ try {
4520
+ const parsed = JSON.parse(readFileSync4(path, "utf8"));
4521
+ return isInstallDecisions(parsed) ? parsed : {};
4522
+ } catch {
4523
+ return {};
4524
+ }
4525
+ }
4526
+ function loadInstallDecision(serverId) {
4527
+ return loadInstallDecisions()[serverId];
4528
+ }
4529
+ function recordInstallDecision(serverId, decision, decidedAt = new Date().toISOString()) {
4530
+ const decisions = loadInstallDecisions();
4531
+ decisions[serverId] = { decision, decidedAt };
4532
+ writeInstallDecisions(decisions);
4533
+ }
4534
+ function isInstallDecision(value) {
4535
+ return value === "declined" || value === "allowed";
4536
+ }
4537
+ function writeInstallDecisions(decisions) {
4538
+ const path = getInstallDecisionsPath();
4539
+ mkdirSync3(dirname8(path), { recursive: true });
4540
+ const tmpPath = `${path}.tmp`;
4541
+ writeFileSync2(tmpPath, `${JSON.stringify(decisions, null, 2)}
4542
+ `, "utf8");
4543
+ renameSync2(tmpPath, path);
4544
+ }
4545
+ function isInstallDecisions(value) {
4546
+ return isRecord5(value) && Object.values(value).every(isInstallDecisionRecord);
4547
+ }
4548
+ function isInstallDecisionRecord(value) {
4549
+ if (!isRecord5(value))
4550
+ return false;
4551
+ return isInstallDecision(value["decision"]) && typeof value["decidedAt"] === "string";
4552
+ }
4553
+ function isRecord5(value) {
4554
+ return typeof value === "object" && value !== null && !Array.isArray(value);
4555
+ }
4556
+
4357
4557
  // ../lsp-core/src/lsp/config-loader.ts
4558
+ import { existsSync as existsSync9, readFileSync as readFileSync5 } from "node:fs";
4358
4559
  function getProjectConfigPaths() {
4359
4560
  return lspRequestContext().projectConfigPaths;
4360
4561
  }
4361
4562
  function getUserConfigPath() {
4362
4563
  return lspRequestContext().userConfigPath;
4363
4564
  }
4364
- function loadJsonFile(path2) {
4365
- if (!existsSync8(path2))
4565
+ function loadJsonFile(path) {
4566
+ if (!existsSync9(path))
4366
4567
  return null;
4367
4568
  try {
4368
- const parsed = JSON.parse(readFileSync5(path2, "utf-8"));
4569
+ const parsed = JSON.parse(readFileSync5(path, "utf-8"));
4369
4570
  return isConfigJson(parsed) ? parsed : null;
4370
4571
  } catch {
4371
4572
  return null;
@@ -4382,8 +4583,8 @@ function loadAllConfigs() {
4382
4583
  return configs;
4383
4584
  }
4384
4585
  function loadFirstJsonFile(paths) {
4385
- for (const path2 of paths) {
4386
- const config = loadJsonFile(path2);
4586
+ for (const path of paths) {
4587
+ const config = loadJsonFile(path);
4387
4588
  if (config)
4388
4589
  return config;
4389
4590
  }
@@ -4409,10 +4610,10 @@ function getMergedServers() {
4409
4610
  }
4410
4611
  if (seen.has(id))
4411
4612
  continue;
4412
- const server2 = createServerFromEntry(id, entry, source);
4413
- if (!server2)
4613
+ const server = createServerFromEntry(id, entry, source);
4614
+ if (!server)
4414
4615
  continue;
4415
- servers.push(server2);
4616
+ servers.push(server);
4416
4617
  seen.add(id);
4417
4618
  }
4418
4619
  }
@@ -4444,7 +4645,7 @@ function createServerFromEntry(id, entry, source) {
4444
4645
  if (source === "project") {
4445
4646
  if (!builtin)
4446
4647
  return null;
4447
- const server3 = createServer({
4648
+ const server = createServer({
4448
4649
  id,
4449
4650
  command: builtin.command,
4450
4651
  extensions: entry.extensions ?? builtin.extensions,
@@ -4452,35 +4653,35 @@ function createServerFromEntry(id, entry, source) {
4452
4653
  source
4453
4654
  });
4454
4655
  if (entry.initialization !== undefined) {
4455
- server3.initialization = entry.initialization;
4656
+ server.initialization = entry.initialization;
4456
4657
  }
4457
- return server3;
4658
+ return server;
4458
4659
  }
4459
4660
  if (entry.command && entry.extensions) {
4460
- const server3 = createServer({
4661
+ const server = createServer({
4461
4662
  id,
4462
4663
  command: entry.command,
4463
4664
  extensions: entry.extensions,
4464
4665
  priority: entry.priority ?? 0,
4465
4666
  source
4466
4667
  });
4467
- applyOptionalServerFields(server3, entry);
4468
- return server3;
4668
+ applyOptionalServerFields(server, entry);
4669
+ return server;
4469
4670
  }
4470
4671
  if (!builtin)
4471
4672
  return null;
4472
- const server2 = createServer({
4673
+ const server = createServer({
4473
4674
  id,
4474
4675
  command: entry.command ?? builtin.command,
4475
4676
  extensions: entry.extensions ?? builtin.extensions,
4476
4677
  priority: entry.priority ?? 0,
4477
4678
  source
4478
4679
  });
4479
- applyOptionalServerFields(server2, entry);
4480
- return server2;
4680
+ applyOptionalServerFields(server, entry);
4681
+ return server;
4481
4682
  }
4482
4683
  function createServer(input) {
4483
- const server2 = {
4684
+ const server = {
4484
4685
  id: input.id,
4485
4686
  command: input.command,
4486
4687
  extensions: input.extensions,
@@ -4488,19 +4689,19 @@ function createServer(input) {
4488
4689
  source: input.source
4489
4690
  };
4490
4691
  if (input.env !== undefined) {
4491
- server2.env = input.env;
4692
+ server.env = input.env;
4492
4693
  }
4493
4694
  if (input.initialization !== undefined) {
4494
- server2.initialization = input.initialization;
4695
+ server.initialization = input.initialization;
4495
4696
  }
4496
- return server2;
4697
+ return server;
4497
4698
  }
4498
- function applyOptionalServerFields(server2, entry) {
4699
+ function applyOptionalServerFields(server, entry) {
4499
4700
  if (entry.env !== undefined) {
4500
- server2.env = entry.env;
4701
+ server.env = entry.env;
4501
4702
  }
4502
4703
  if (entry.initialization !== undefined) {
4503
- server2.initialization = entry.initialization;
4704
+ server.initialization = entry.initialization;
4504
4705
  }
4505
4706
  }
4506
4707
  function isConfigJson(value) {
@@ -4550,64 +4751,165 @@ function getDisabledServerIds() {
4550
4751
  }
4551
4752
 
4552
4753
  // ../lsp-core/src/lsp/server-installation.ts
4553
- import { existsSync as existsSync9 } from "node:fs";
4554
- import { delimiter as delimiter3, join as join3 } from "node:path";
4555
- function isServerInstalled(command, _workingDirectory) {
4556
- if (command.length === 0)
4557
- return false;
4558
- const [cmd] = command;
4559
- if (!cmd)
4560
- return false;
4561
- if (cmd.includes("/") || cmd.includes("\\")) {
4562
- if (existsSync9(cmd))
4563
- return true;
4754
+ import { existsSync as existsSync10 } from "node:fs";
4755
+ import { delimiter as delimiter3, dirname as dirname9, isAbsolute as isAbsolute5, join as join4, resolve as resolve7 } from "node:path";
4756
+ var LOCAL_BIN_RULES = [
4757
+ {
4758
+ markers: ["package.json", "bun.lock", "bun.lockb", "package-lock.json", "yarn.lock", "pnpm-lock.yaml"],
4759
+ binDirs: [join4("node_modules", ".bin")]
4760
+ },
4761
+ {
4762
+ markers: [
4763
+ "pyproject.toml",
4764
+ "ty.toml",
4765
+ "requirements.txt",
4766
+ "setup.py",
4767
+ "setup.cfg",
4768
+ "Pipfile",
4769
+ "pyrightconfig.json",
4770
+ "ruff.toml",
4771
+ ".ruff.toml"
4772
+ ],
4773
+ binDirs: [
4774
+ join4(".venv", "bin"),
4775
+ join4(".venv", "Scripts"),
4776
+ join4("venv", "bin"),
4777
+ join4("venv", "Scripts"),
4778
+ join4(".env", "bin"),
4779
+ join4(".env", "Scripts")
4780
+ ]
4781
+ },
4782
+ {
4783
+ markers: ["Gemfile", "Gemfile.lock"],
4784
+ binDirs: [join4("vendor", "bundle", "bin"), "bin"]
4785
+ },
4786
+ {
4787
+ markers: ["go.mod", "go.sum", "go.work"],
4788
+ binDirs: ["bin"]
4564
4789
  }
4565
- const isWindows = process.platform === "win32";
4566
- let exts = [""];
4567
- if (isWindows) {
4568
- const pathExt = process.env["PATHEXT"] ?? "";
4569
- if (pathExt) {
4570
- const systemExts = pathExt.split(";").filter(Boolean);
4571
- exts = [...new Set([...exts, ...systemExts, ".exe", ".cmd", ".bat", ".ps1"])];
4572
- } else {
4573
- exts = ["", ".exe", ".cmd", ".bat", ".ps1"];
4790
+ ];
4791
+ var resolutionCache = new Map;
4792
+ var probeCount = 0;
4793
+ function probe(path) {
4794
+ probeCount += 1;
4795
+ return existsSync10(path);
4796
+ }
4797
+ function executableSuffixes(platform, pathExt) {
4798
+ if (platform !== "win32")
4799
+ return [""];
4800
+ const configured = pathExt ?? process.env["PATHEXT"] ?? "";
4801
+ const systemExts = configured.split(";").filter((entry) => entry.length > 0).map((entry) => entry.toLowerCase());
4802
+ return [...new Set(["", ...systemExts, ".exe", ".cmd", ".bat", ".ps1"])];
4803
+ }
4804
+ function probeWithSuffixes(directory, command, suffixes) {
4805
+ for (const suffix of suffixes) {
4806
+ const candidate = join4(directory, command + suffix);
4807
+ if (probe(candidate))
4808
+ return candidate;
4809
+ }
4810
+ return null;
4811
+ }
4812
+ function resolveLocal(command, workingDirectory, suffixes, stopAt) {
4813
+ const boundary = stopAt === undefined ? undefined : resolve7(stopAt);
4814
+ let current = resolve7(workingDirectory);
4815
+ while (true) {
4816
+ for (const rule of LOCAL_BIN_RULES) {
4817
+ if (!rule.markers.some((marker) => probe(join4(current, marker))))
4818
+ continue;
4819
+ for (const binDir of rule.binDirs) {
4820
+ const found = probeWithSuffixes(join4(current, binDir), command, suffixes);
4821
+ if (found !== null)
4822
+ return found;
4823
+ }
4574
4824
  }
4825
+ if (probe(join4(current, ".git")))
4826
+ return null;
4827
+ if (boundary !== undefined && current === boundary)
4828
+ return null;
4829
+ const parent = dirname9(current);
4830
+ if (parent === current)
4831
+ return null;
4832
+ current = parent;
4575
4833
  }
4576
- let pathEnv = process.env["PATH"] ?? "";
4577
- if (isWindows && !pathEnv) {
4834
+ }
4835
+ function resolveFromPath(command, suffixes, platform, pathEnvOverride) {
4836
+ let pathEnv = pathEnvOverride ?? process.env["PATH"] ?? "";
4837
+ if (platform === "win32" && !pathEnv) {
4578
4838
  pathEnv = process.env["Path"] ?? "";
4579
4839
  }
4580
- const paths = pathEnv.split(delimiter3);
4581
- for (const p of paths) {
4582
- for (const suffix of exts) {
4583
- if (existsSync9(join3(p, cmd + suffix))) {
4584
- return true;
4585
- }
4586
- }
4840
+ for (const entry of pathEnv.split(delimiter3)) {
4841
+ if (entry.length === 0)
4842
+ continue;
4843
+ const found = probeWithSuffixes(entry, command, suffixes);
4844
+ if (found !== null)
4845
+ return found;
4587
4846
  }
4588
- if (cmd === "node")
4589
- return true;
4590
- return false;
4847
+ return null;
4848
+ }
4849
+ function resolveServerBinary(command, workingDirectory, options = {}) {
4850
+ if (command.length === 0)
4851
+ return null;
4852
+ const [cmd] = command;
4853
+ if (cmd === undefined || cmd.length === 0)
4854
+ return null;
4855
+ const platform = options.platform ?? process.platform;
4856
+ const suffixes = executableSuffixes(platform, options.pathExt);
4857
+ if (cmd.includes("/") || cmd.includes("\\")) {
4858
+ const explicit = isAbsolute5(cmd) ? cmd : resolve7(workingDirectory ?? process.cwd(), cmd);
4859
+ return probe(explicit) ? explicit : null;
4860
+ }
4861
+ const cacheKey = JSON.stringify([
4862
+ workingDirectory ?? "",
4863
+ cmd,
4864
+ platform,
4865
+ options.stopAt ?? "",
4866
+ options.pathExt ?? "",
4867
+ options.pathEnv ?? process.env["PATH"] ?? ""
4868
+ ]);
4869
+ const cached = resolutionCache.get(cacheKey);
4870
+ if (cached !== undefined)
4871
+ return cached;
4872
+ let resolved = null;
4873
+ if (workingDirectory !== undefined && workingDirectory.length > 0) {
4874
+ resolved = resolveLocal(cmd, workingDirectory, suffixes, options.stopAt);
4875
+ }
4876
+ resolved ??= resolveFromPath(cmd, suffixes, platform, options.pathEnv);
4877
+ if (resolved === null && cmd === "node")
4878
+ resolved = cmd;
4879
+ resolutionCache.set(cacheKey, resolved);
4880
+ return resolved;
4881
+ }
4882
+ function isServerInstalled(command, workingDirectory, options = {}) {
4883
+ if (command.length === 0)
4884
+ return false;
4885
+ return resolveServerBinary(command, workingDirectory, options) !== null;
4591
4886
  }
4592
4887
 
4593
4888
  // ../lsp-core/src/lsp/server-resolution.ts
4889
+ function withResolvedCommand(command, binaryPath) {
4890
+ return [binaryPath, ...command.slice(1)];
4891
+ }
4594
4892
  function findServerForExtension(ext) {
4595
4893
  const servers = getMergedServers();
4596
- for (const server2 of servers) {
4597
- if (server2.extensions.includes(ext) && isServerInstalled(server2.command)) {
4894
+ const workingDirectory = contextCwd();
4895
+ for (const server of servers) {
4896
+ if (!server.extensions.includes(ext))
4897
+ continue;
4898
+ const binaryPath = resolveServerBinary(server.command, workingDirectory);
4899
+ if (binaryPath !== null) {
4598
4900
  const resolvedServer = {
4599
- id: server2.id,
4600
- command: server2.command,
4601
- extensions: server2.extensions,
4602
- priority: server2.priority
4901
+ id: server.id,
4902
+ command: withResolvedCommand(server.command, binaryPath),
4903
+ extensions: server.extensions,
4904
+ priority: server.priority
4603
4905
  };
4604
- if (server2.env !== undefined) {
4906
+ if (server.env !== undefined) {
4605
4907
  return {
4606
4908
  status: "found",
4607
4909
  server: {
4608
4910
  ...resolvedServer,
4609
- env: server2.env,
4610
- ...server2.initialization === undefined ? {} : { initialization: server2.initialization }
4911
+ env: server.env,
4912
+ ...server.initialization === undefined ? {} : { initialization: server.initialization }
4611
4913
  }
4612
4914
  };
4613
4915
  }
@@ -4615,20 +4917,20 @@ function findServerForExtension(ext) {
4615
4917
  status: "found",
4616
4918
  server: {
4617
4919
  ...resolvedServer,
4618
- ...server2.initialization === undefined ? {} : { initialization: server2.initialization }
4920
+ ...server.initialization === undefined ? {} : { initialization: server.initialization }
4619
4921
  }
4620
4922
  };
4621
4923
  }
4622
4924
  }
4623
- for (const server2 of servers) {
4624
- if (server2.extensions.includes(ext)) {
4625
- const installHint = LSP_INSTALL_HINTS[server2.id] ?? `Install '${server2.command[0]}' and ensure it's in your PATH`;
4925
+ for (const server of servers) {
4926
+ if (server.extensions.includes(ext)) {
4927
+ const installHint = LSP_INSTALL_HINTS[server.id] ?? `Install '${server.command[0]}' and ensure it's in your PATH`;
4626
4928
  return {
4627
4929
  status: "not_installed",
4628
4930
  server: {
4629
- id: server2.id,
4630
- command: server2.command,
4631
- extensions: server2.extensions
4931
+ id: server.id,
4932
+ command: server.command,
4933
+ extensions: server.extensions
4632
4934
  },
4633
4935
  installHint
4634
4936
  };
@@ -4644,20 +4946,21 @@ function findServerForExtension(ext) {
4644
4946
  function getAllServers() {
4645
4947
  const servers = getMergedServers();
4646
4948
  const disabled = getDisabledServerIds();
4949
+ const workingDirectory = contextCwd();
4647
4950
  const result = [];
4648
4951
  const seen = new Set;
4649
- for (const server2 of servers) {
4650
- if (seen.has(server2.id))
4952
+ for (const server of servers) {
4953
+ if (seen.has(server.id))
4651
4954
  continue;
4652
4955
  result.push({
4653
- id: server2.id,
4654
- installed: isServerInstalled(server2.command),
4655
- extensions: server2.extensions,
4956
+ id: server.id,
4957
+ installed: isServerInstalled(server.command, workingDirectory),
4958
+ extensions: server.extensions,
4656
4959
  disabled: false,
4657
- source: server2.source,
4658
- priority: server2.priority
4960
+ source: server.source,
4961
+ priority: server.priority
4659
4962
  });
4660
- seen.add(server2.id);
4963
+ seen.add(server.id);
4661
4964
  }
4662
4965
  for (const id of disabled) {
4663
4966
  if (seen.has(id))
@@ -4665,7 +4968,7 @@ function getAllServers() {
4665
4968
  const builtin = BUILTIN_SERVERS[id];
4666
4969
  result.push({
4667
4970
  id,
4668
- installed: builtin ? isServerInstalled(builtin.command) : false,
4971
+ installed: builtin ? isServerInstalled(builtin.command, workingDirectory) : false,
4669
4972
  extensions: builtin?.extensions ?? [],
4670
4973
  disabled: true,
4671
4974
  source: "disabled",
@@ -4676,7 +4979,6 @@ function getAllServers() {
4676
4979
  }
4677
4980
 
4678
4981
  // ../lsp-core/src/lsp/client-wrapper.ts
4679
- var WORKSPACE_MARKERS = [".git", "package.json", "pyproject.toml", "Cargo.toml", "go.mod", "pom.xml", "build.gradle"];
4680
4982
  function isDirectoryPath(filePath) {
4681
4983
  try {
4682
4984
  return statSync4(filePath).isDirectory();
@@ -4689,36 +4991,40 @@ function findWorkspaceRoot(filePath) {
4689
4991
  const abs = resolveReadablePathInsideContext(filePath);
4690
4992
  let dir = abs;
4691
4993
  if (!isDirectoryPath(dir)) {
4692
- dir = dirname8(dir);
4994
+ dir = dirname10(dir);
4693
4995
  }
4996
+ if (!isPathInside(cwd, abs))
4997
+ return findWorkspaceRootOutsideContext(dir);
4694
4998
  const fallbackRoot = nearestExistingDirectoryInsideContext(dir, cwd) ?? cwd;
4999
+ let nearestPackageRoot;
4695
5000
  while (isPathInside(cwd, dir)) {
4696
5001
  const canonicalDir = existingDirectoryInsideContext(dir, cwd);
4697
5002
  if (canonicalDir !== undefined) {
4698
- for (const marker of WORKSPACE_MARKERS) {
4699
- if (existsSync10(join4(dir, marker))) {
4700
- return canonicalDir;
4701
- }
5003
+ if (existsSync11(join5(dir, GIT_WORKSPACE_MARKER))) {
5004
+ return canonicalDir;
5005
+ }
5006
+ if (nearestPackageRoot === undefined && hasProjectWorkspaceMarker(dir)) {
5007
+ nearestPackageRoot = canonicalDir;
4702
5008
  }
4703
5009
  }
4704
5010
  if (dir === cwd)
4705
5011
  break;
4706
- dir = dirname8(dir);
5012
+ dir = dirname10(dir);
4707
5013
  }
4708
- return fallbackRoot;
5014
+ return nearestPackageRoot ?? fallbackRoot;
5015
+ }
5016
+ function hasProjectWorkspaceMarker(directory) {
5017
+ return PROJECT_WORKSPACE_MARKERS.some((marker) => existsSync11(join5(directory, marker)));
4709
5018
  }
4710
5019
  function resolveReadablePathInsideContext(filePath) {
4711
5020
  const cwd = contextCwd();
4712
- const abs = resolve7(cwd, filePath);
5021
+ const abs = resolve8(cwd, filePath);
4713
5022
  if (isPathInside(cwd, abs))
4714
5023
  return abs;
4715
5024
  const rebased = rebaseThroughCanonicalAncestor(abs, cwd);
4716
5025
  if (rebased !== undefined)
4717
5026
  return rebased;
4718
- const canonical = canonicalizeExistingOrNearestAncestor(abs);
4719
- if (isPathInside(cwd, canonical))
4720
- return canonical;
4721
- throw new LspInvalidPathError(`LSP file path must be inside request cwd: ${filePath}`);
5027
+ return canonicalizeExistingOrNearestAncestor(abs);
4722
5028
  }
4723
5029
  function resolvePathInsideContext(filePath) {
4724
5030
  const cwd = contextCwd();
@@ -4729,16 +5035,16 @@ function resolvePathInsideContext(filePath) {
4729
5035
  }
4730
5036
  return canonical;
4731
5037
  }
4732
- function rebaseThroughCanonicalAncestor(path2, cwd) {
4733
- let current = path2;
5038
+ function rebaseThroughCanonicalAncestor(path, cwd) {
5039
+ let current = path;
4734
5040
  const suffix = [];
4735
5041
  while (true) {
4736
- if (existsSync10(current)) {
4737
- const canonical = realpathSync4(current);
5042
+ if (existsSync11(current)) {
5043
+ const canonical = realpathSync5(current);
4738
5044
  if (isPathInside(cwd, canonical))
4739
- return suffix.length === 0 ? canonical : join4(canonical, ...suffix);
5045
+ return suffix.length === 0 ? canonical : join5(canonical, ...suffix);
4740
5046
  }
4741
- const parent = dirname8(current);
5047
+ const parent = dirname10(current);
4742
5048
  if (parent === current)
4743
5049
  return;
4744
5050
  suffix.unshift(basename3(current));
@@ -4746,9 +5052,9 @@ function rebaseThroughCanonicalAncestor(path2, cwd) {
4746
5052
  }
4747
5053
  }
4748
5054
  function existingDirectoryInsideContext(directory, cwd) {
4749
- if (!existsSync10(directory))
5055
+ if (!existsSync11(directory))
4750
5056
  return;
4751
- const canonical = realpathSync4(directory);
5057
+ const canonical = realpathSync5(directory);
4752
5058
  if (!statSync4(canonical).isDirectory())
4753
5059
  return;
4754
5060
  return isPathInside(cwd, canonical) ? canonical : undefined;
@@ -4761,7 +5067,7 @@ function nearestExistingDirectoryInsideContext(directory, cwd) {
4761
5067
  return canonical;
4762
5068
  if (current === cwd)
4763
5069
  return;
4764
- current = dirname8(current);
5070
+ current = dirname10(current);
4765
5071
  }
4766
5072
  return;
4767
5073
  }
@@ -4788,33 +5094,46 @@ function formatServerLookupError(result) {
4788
5094
  ].join(`
4789
5095
  `);
4790
5096
  }
5097
+ function formatInstallOptions(serverId, installHint) {
5098
+ const localHint = LSP_LOCAL_INSTALL_HINTS[serverId];
5099
+ if (localHint === undefined) {
5100
+ return ["To install, run:", ` ${installHint}`];
5101
+ }
5102
+ return [
5103
+ "To install in THIS repository (preferred — no global install needed):",
5104
+ ` ${localHint}`,
5105
+ "",
5106
+ "Or install it globally:",
5107
+ ` ${installHint}`
5108
+ ];
5109
+ }
4791
5110
  function formatNotInstalled(result) {
4792
- const { server: server2, installHint } = result;
4793
- const extensions = server2.extensions.join(", ");
4794
- const decision = loadInstallDecision(server2.id)?.decision;
5111
+ const { server, installHint } = result;
5112
+ const extensions = server.extensions.join(", ");
5113
+ const decision = loadInstallDecision(server.id)?.decision;
4795
5114
  const context = lspRequestContext();
4796
5115
  if (decision === "declined") {
4797
- return `LSP server '${server2.id}' (${extensions}) is NOT INSTALLED; user previously declined installation — proceed without LSP.`;
5116
+ return `LSP server '${server.id}' (${extensions}) is NOT INSTALLED; user previously declined installation — proceed without LSP.`;
4798
5117
  }
4799
5118
  const header = [
4800
- `LSP server '${server2.id}' for ${extensions} is NOT INSTALLED.`,
5119
+ `LSP server '${server.id}' for ${extensions} is NOT INSTALLED.`,
4801
5120
  "",
4802
- `Command not found: ${server2.command[0]}`,
5121
+ `Command not found: ${server.command[0]}`,
4803
5122
  ""
4804
5123
  ];
5124
+ const installOptions = formatInstallOptions(server.id, installHint);
4805
5125
  if (decision === "allowed") {
4806
5126
  return [
4807
5127
  ...header,
4808
5128
  "The user has pre-authorized LSP installation. Run the install command, then retry this tool:",
4809
- ` ${installHint}`
5129
+ ...installOptions.slice(1)
4810
5130
  ].join(`
4811
5131
  `);
4812
5132
  }
4813
5133
  if (!context.capabilities.installDecisionTool) {
4814
5134
  return [
4815
5135
  ...header,
4816
- "To install, run:",
4817
- ` ${installHint}`,
5136
+ ...installOptions,
4818
5137
  "",
4819
5138
  "ACTION REQUIRED — ASK THE USER whether to install this LSP server.",
4820
5139
  "Install-decision recording is unavailable in this harness; proceed without LSP if the user declines."
@@ -4823,13 +5142,12 @@ function formatNotInstalled(result) {
4823
5142
  }
4824
5143
  return [
4825
5144
  ...header,
4826
- "To install, run:",
4827
- ` ${installHint}`,
5145
+ ...installOptions,
4828
5146
  "",
4829
5147
  "ACTION REQUIRED — ASK THE USER whether to install this LSP server.",
4830
5148
  "- If the user agrees: run the install command above, then retry this tool.",
4831
5149
  "- If the user declines, OR has NOT explicitly asked for LSP installation:",
4832
- ` call lsp_install_decision { server_id: "${server2.id}", decision: "declined" },`,
5150
+ ` call lsp_install_decision { server_id: "${server.id}", decision: "declined" },`,
4833
5151
  ` which writes to ${context.installDecisionsPath},`,
4834
5152
  " then ignore this message and proceed WITHOUT LSP."
4835
5153
  ].join(`
@@ -4853,34 +5171,34 @@ async function withLspClient(filePath, fn, toolName, options = {}) {
4853
5171
  if (result.status !== "found") {
4854
5172
  throw new LspServerLookupError(formatServerLookupError(result), result);
4855
5173
  }
4856
- const server2 = result.server;
5174
+ const server = result.server;
4857
5175
  const root = findWorkspaceRoot(absPath);
4858
5176
  const manager = options.manager ?? getLspManager();
4859
5177
  const acquireAndCall = async (allowRetry) => {
4860
- const client = await manager.getClient(root, server2, options.signal);
5178
+ const client = await manager.getClient(root, server, options.signal);
4861
5179
  try {
4862
5180
  return await fn(client, root, absPath);
4863
5181
  } catch (err) {
4864
5182
  if (allowRetry && READ_ONLY_TOOLS.has(toolName) && isLspDeadConnectionError(err)) {
4865
- manager.invalidateClient(root, server2.id, client);
5183
+ manager.invalidateClient(root, server.id, client);
4866
5184
  return acquireAndCall(false);
4867
5185
  }
4868
5186
  if (err instanceof LspRequestTimeoutError) {
4869
- if (manager.isServerInitializing(root, server2.id)) {
5187
+ if (manager.isServerInitializing(root, server.id)) {
4870
5188
  throw new LspServerInitializingError(err);
4871
5189
  }
4872
5190
  }
4873
5191
  throw err;
4874
5192
  } finally {
4875
- manager.releaseClient(root, server2.id);
5193
+ manager.releaseClient(root, server.id);
4876
5194
  }
4877
5195
  };
4878
5196
  return acquireAndCall(true);
4879
5197
  }
4880
5198
 
4881
5199
  // ../lsp-core/src/lsp/directory-diagnostics.ts
4882
- import { existsSync as existsSync11, lstatSync as lstatSync5, readdirSync as readdirSync3 } from "node:fs";
4883
- import { join as join5, resolve as resolve8 } from "node:path";
5200
+ import { existsSync as existsSync12, lstatSync as lstatSync5, readdirSync as readdirSync3 } from "node:fs";
5201
+ import { join as join6, resolve as resolve9 } from "node:path";
4884
5202
 
4885
5203
  // ../lsp-core/src/lsp/formatters.ts
4886
5204
  import { fileURLToPath as fileURLToPath3 } from "node:url";
@@ -4895,10 +5213,10 @@ function uriToPath(uri) {
4895
5213
  }
4896
5214
  function formatLocation(loc) {
4897
5215
  if ("targetUri" in loc) {
4898
- const uri2 = uriToPath(loc.targetUri);
4899
- const line2 = loc.targetRange.start.line + 1;
4900
- const char2 = loc.targetRange.start.character;
4901
- return `${uri2}:${line2}:${char2}`;
5216
+ const uri = uriToPath(loc.targetUri);
5217
+ const line = loc.targetRange.start.line + 1;
5218
+ const char = loc.targetRange.start.character;
5219
+ return `${uri}:${line}:${char}`;
4902
5220
  }
4903
5221
  const uri = uriToPath(loc.uri);
4904
5222
  const line = loc.range.start.line + 1;
@@ -5010,7 +5328,7 @@ function collectFilesWithExtension(dir, extension, maxFiles) {
5010
5328
  for (const entry of entries) {
5011
5329
  if (files.length >= maxFiles)
5012
5330
  return;
5013
- const fullPath = join5(currentDir, entry);
5331
+ const fullPath = join6(currentDir, entry);
5014
5332
  let stat;
5015
5333
  try {
5016
5334
  stat = lstatSync5(fullPath);
@@ -5035,15 +5353,15 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
5035
5353
  if (!extension.startsWith(".")) {
5036
5354
  throw new LspInvalidPathError(`Extension must start with a dot (e.g., ".ts", not "${extension}"). Use ".${extension}" instead.`);
5037
5355
  }
5038
- const absDir = resolve8(options.workspaceRoot ?? contextCwd(), directory);
5039
- if (!existsSync11(absDir)) {
5356
+ const absDir = resolve9(options.workspaceRoot ?? contextCwd(), directory);
5357
+ if (!existsSync12(absDir)) {
5040
5358
  throw new LspInvalidPathError(`Directory does not exist: ${absDir}`);
5041
5359
  }
5042
5360
  const serverResult = options.server === undefined ? findServerForExtension(extension) : { status: "found", server: options.server };
5043
5361
  if (serverResult.status !== "found") {
5044
5362
  throw new LspServerLookupError(formatServerLookupError(serverResult));
5045
5363
  }
5046
- const server2 = serverResult.server;
5364
+ const server = serverResult.server;
5047
5365
  const allFiles = (options.listFiles ?? collectFilesWithExtension)(absDir, extension, maxFiles + 1);
5048
5366
  const wasCapped = allFiles.length > maxFiles;
5049
5367
  const filesToProcess = allFiles.slice(0, maxFiles);
@@ -5063,7 +5381,7 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
5063
5381
  const fileErrors = [];
5064
5382
  const maxConcurrency = Math.max(1, options.maxConcurrency ?? DIRECTORY_DIAGNOSTICS_MAX_CONCURRENCY);
5065
5383
  options.signal?.throwIfAborted();
5066
- const client = await manager.getClient(root, server2, options.signal);
5384
+ const client = await manager.getClient(root, server, options.signal);
5067
5385
  try {
5068
5386
  let nextIndex = 0;
5069
5387
  const workers = Array.from({ length: Math.min(maxConcurrency, filesToProcess.length) }, async () => {
@@ -5091,7 +5409,7 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
5091
5409
  });
5092
5410
  await Promise.all(workers);
5093
5411
  } finally {
5094
- manager.releaseClient(root, server2.id);
5412
+ manager.releaseClient(root, server.id);
5095
5413
  }
5096
5414
  const displayDiagnostics = allDiagnostics.slice(0, DEFAULT_MAX_DIAGNOSTICS);
5097
5415
  const wasDiagCapped = allDiagnostics.length > DEFAULT_MAX_DIAGNOSTICS;
@@ -5123,7 +5441,7 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
5123
5441
 
5124
5442
  // ../lsp-core/src/lsp/infer-extension.ts
5125
5443
  import { lstatSync as lstatSync6, readdirSync as readdirSync4 } from "node:fs";
5126
- import { join as join6 } from "node:path";
5444
+ import { join as join7 } from "node:path";
5127
5445
  var SKIP_DIRECTORIES2 = new Set(["node_modules", ".git", "dist", "build", ".next", "out"]);
5128
5446
  var MAX_SCAN_ENTRIES = 500;
5129
5447
  function inferExtensionFromDirectory(directory) {
@@ -5141,7 +5459,7 @@ function inferExtensionFromDirectory(directory) {
5141
5459
  for (const entry of entries) {
5142
5460
  if (scanned >= MAX_SCAN_ENTRIES)
5143
5461
  return;
5144
- const fullPath = join6(dir, entry);
5462
+ const fullPath = join7(dir, entry);
5145
5463
  let stat;
5146
5464
  try {
5147
5465
  stat = lstatSync6(fullPath);
@@ -5300,8 +5618,8 @@ function clientOptions(signal) {
5300
5618
  }
5301
5619
 
5302
5620
  // ../lsp-core/src/tools/result.ts
5303
- function text(text2, details, isError = false) {
5304
- return { content: [{ type: "text", text: text2 }], details, isError };
5621
+ function text(text, details, isError = false) {
5622
+ return { content: [{ type: "text", text }], details, isError };
5305
5623
  }
5306
5624
 
5307
5625
  // ../lsp-core/src/tools/diagnostics.ts
@@ -5321,7 +5639,7 @@ async function executeLspDiagnostics(params, signal) {
5321
5639
  const extension = inferExtensionFromDirectory(absPath);
5322
5640
  if (!extension) {
5323
5641
  const message = `No supported source files found in directory: ${absPath}`;
5324
- const details3 = {
5642
+ const details = {
5325
5643
  filePath,
5326
5644
  severity,
5327
5645
  mode: "directory",
@@ -5331,24 +5649,24 @@ async function executeLspDiagnostics(params, signal) {
5331
5649
  error: message,
5332
5650
  errorKind: "no_files"
5333
5651
  };
5334
- return text(message, details3);
5652
+ return text(message, details);
5335
5653
  }
5336
- const output2 = await aggregateDiagnosticsForDirectory(absPath, extension, severity, undefined, signal === undefined ? {} : { signal });
5337
- const details2 = {
5654
+ const output = await aggregateDiagnosticsForDirectory(absPath, extension, severity, undefined, signal === undefined ? {} : { signal });
5655
+ const details = {
5338
5656
  filePath,
5339
5657
  severity,
5340
5658
  mode: "directory",
5341
5659
  diagnostics: [],
5342
- totalDiagnostics: output2.totalDiagnostics,
5660
+ totalDiagnostics: output.totalDiagnostics,
5343
5661
  truncated: false,
5344
- fileFailures: [...output2.fileFailures]
5662
+ fileFailures: [...output.fileFailures]
5345
5663
  };
5346
- return text(output2.output, details2);
5664
+ return text(output.output, details);
5347
5665
  }
5348
5666
  const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.diagnostics(resolvedFilePath, signal), "diagnostics", clientOptions(signal));
5349
5667
  if (result.transientError) {
5350
5668
  const message = result.transientError.message;
5351
- const details2 = {
5669
+ const details = {
5352
5670
  filePath,
5353
5671
  severity,
5354
5672
  mode: "file",
@@ -5358,7 +5676,7 @@ async function executeLspDiagnostics(params, signal) {
5358
5676
  error: message,
5359
5677
  errorKind: result.transientError.kind
5360
5678
  };
5361
- return text(message, details2, true);
5679
+ return text(message, details, true);
5362
5680
  }
5363
5681
  const diagnostics = filterDiagnosticsBySeverity(asDiagnosticArray(result), severity);
5364
5682
  const total = diagnostics.length;
@@ -5392,6 +5710,96 @@ async function executeLspDiagnostics(params, signal) {
5392
5710
  throw error;
5393
5711
  }
5394
5712
  }
5713
+ // ../lsp-core/src/lsp/format-document.ts
5714
+ import { readFileSync as readFileSync6, renameSync as renameSync3, unlinkSync as unlinkSync2, writeFileSync as writeFileSync3 } from "node:fs";
5715
+ var DEFAULT_FORMATTING_OPTIONS = {
5716
+ tabSize: 4,
5717
+ insertSpaces: false,
5718
+ trimTrailingWhitespace: true,
5719
+ insertFinalNewline: true,
5720
+ trimFinalNewlines: true
5721
+ };
5722
+ var UNCHANGED = { status: "unchanged", linesAdded: 0, linesRemoved: 0 };
5723
+ async function formatDocumentWithClient(client, filePath, options = {}) {
5724
+ const edits = await client.formatDocument(filePath, options.formattingOptions ?? DEFAULT_FORMATTING_OPTIONS, options.signal);
5725
+ if (edits === null)
5726
+ return { status: "unavailable", reason: "capability_not_advertised" };
5727
+ if (edits.length === 0)
5728
+ return UNCHANGED;
5729
+ const before = readFileSync6(filePath, "utf-8");
5730
+ const normalized = normalizeTextEdits(before, edits, 0);
5731
+ if (normalized.text === before)
5732
+ return UNCHANGED;
5733
+ writeAtomically(filePath, normalized.text);
5734
+ await client.openFile(filePath);
5735
+ return {
5736
+ status: "formatted",
5737
+ ...lineDelta(normalized.edits)
5738
+ };
5739
+ }
5740
+ function lineDelta(edits) {
5741
+ let linesAdded = 0;
5742
+ let linesRemoved = 0;
5743
+ for (const edit of edits) {
5744
+ linesRemoved += edit.range.end.line - edit.range.start.line + 1;
5745
+ linesAdded += edit.newText.split(`
5746
+ `).length;
5747
+ }
5748
+ return { linesAdded, linesRemoved };
5749
+ }
5750
+ function writeAtomically(filePath, content) {
5751
+ const tempPath = `${filePath}.omo-format.tmp`;
5752
+ writeFileSync3(tempPath, content, "utf-8");
5753
+ try {
5754
+ renameSync3(tempPath, filePath);
5755
+ } catch (error) {
5756
+ try {
5757
+ unlinkSync2(tempPath);
5758
+ } catch {}
5759
+ throw error;
5760
+ }
5761
+ }
5762
+
5763
+ // ../lsp-core/src/tools/format.ts
5764
+ async function executeLspFormat(params, signal) {
5765
+ const filePath = requireString(params, "filePath");
5766
+ try {
5767
+ const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => formatDocumentWithClient(client, resolvedFilePath, signal === undefined ? {} : { signal }), "format", clientOptions(signal));
5768
+ return text(describeResult(filePath, result), formatDetails(filePath, result));
5769
+ } catch (error) {
5770
+ const missingDependency = missingDependencyResult(error, {
5771
+ filePath,
5772
+ status: "unavailable",
5773
+ reason: "server_unavailable",
5774
+ linesAdded: 0,
5775
+ linesRemoved: 0
5776
+ });
5777
+ if (missingDependency)
5778
+ return missingDependency;
5779
+ throw error;
5780
+ }
5781
+ }
5782
+ function formatDetails(filePath, result) {
5783
+ if (result.status === "unavailable") {
5784
+ return { filePath, status: "unavailable", reason: result.reason, linesAdded: 0, linesRemoved: 0 };
5785
+ }
5786
+ return {
5787
+ filePath,
5788
+ status: result.status,
5789
+ linesAdded: result.linesAdded,
5790
+ linesRemoved: result.linesRemoved
5791
+ };
5792
+ }
5793
+ function describeResult(filePath, result) {
5794
+ if (result.status === "unavailable") {
5795
+ return `Formatting unavailable for ${filePath}: the language server does not advertise documentFormattingProvider.`;
5796
+ }
5797
+ if (result.status === "unchanged") {
5798
+ return `Already formatted: ${filePath}`;
5799
+ }
5800
+ return `Formatted ${filePath} (+${result.linesAdded}/-${result.linesRemoved} lines)`;
5801
+ }
5802
+
5395
5803
  // ../lsp-core/src/tools/install-decision.ts
5396
5804
  async function executeLspInstallDecision(params) {
5397
5805
  const serverId = requireString(params, "server_id");
@@ -5399,7 +5807,7 @@ async function executeLspInstallDecision(params) {
5399
5807
  if (!isInstallDecision(decision)) {
5400
5808
  return text(`Invalid decision '${String(decision)}'. Expected "declined" or "allowed".`, { serverId, errorKind: "invalid_decision" }, true);
5401
5809
  }
5402
- const serverIds = [...new Set(getMergedServers().map((server2) => server2.id))];
5810
+ const serverIds = [...new Set(getMergedServers().map((server) => server.id))];
5403
5811
  if (!serverIds.includes(serverId)) {
5404
5812
  const preview = serverIds.slice(0, 20).join(", ");
5405
5813
  return text(`Unknown LSP server '${serverId}'. Known servers: ${preview}${serverIds.length > 20 ? "..." : ""}`, { serverId, errorKind: "unknown_server" }, true);
@@ -5539,10 +5947,10 @@ function objectSchema(properties, required = []) {
5539
5947
  async function executeLspStatus() {
5540
5948
  const servers = getAllServers();
5541
5949
  const snapshots = getLspManager().getSnapshot();
5542
- const installed = servers.filter((server2) => server2.installed && !server2.disabled);
5543
- const configuredLines = servers.map((server2) => {
5544
- const state = server2.disabled ? "disabled" : server2.installed ? "installed" : "missing";
5545
- return `- ${server2.id}: ${state}; source=${server2.source}; extensions=${server2.extensions.join(", ")}`;
5950
+ const installed = servers.filter((server) => server.installed && !server.disabled);
5951
+ const configuredLines = servers.map((server) => {
5952
+ const state = server.disabled ? "disabled" : server.installed ? "installed" : "missing";
5953
+ return `- ${server.id}: ${state}; source=${server.source}; extensions=${server.extensions.join(", ")}`;
5546
5954
  });
5547
5955
  const activeLines = snapshots.map((snapshot) => {
5548
5956
  const state = snapshot.alive ? snapshot.isInitializing ? "initializing" : "alive" : "dead";
@@ -5585,8 +5993,8 @@ async function executeLspSymbols(params, signal) {
5585
5993
  errorKind: "missing_query"
5586
5994
  });
5587
5995
  }
5588
- const symbols2 = await withLspClient(filePath, async (client) => client.workspaceSymbols(query, signal), "workspaceSymbols", clientOptions(signal));
5589
- return formatSymbolsResult(filePath, scope, symbols2, limit, query);
5996
+ const symbols = await withLspClient(filePath, async (client) => client.workspaceSymbols(query, signal), "workspaceSymbols", clientOptions(signal));
5997
+ return formatSymbolsResult(filePath, scope, symbols, limit, query);
5590
5998
  }
5591
5999
  const symbols = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.documentSymbols(resolvedFilePath, signal), "documentSymbols", clientOptions(signal));
5592
6000
  return formatSymbolsResult(filePath, scope, symbols, limit);
@@ -5724,6 +6132,16 @@ var LSP_MCP_TOOLS = [
5724
6132
  }, ["filePath", "line", "character", "newName"]),
5725
6133
  execute: executeLspRename
5726
6134
  },
6135
+ {
6136
+ name: "format",
6137
+ aliases: ["lsp_format"],
6138
+ title: "LSP Format",
6139
+ description: "Format a source file with its language server and write the returned edits to disk.",
6140
+ inputSchema: objectSchema({
6141
+ filePath: { type: "string", description: "Source file path to format." }
6142
+ }, ["filePath"]),
6143
+ execute: executeLspFormat
6144
+ },
5727
6145
  {
5728
6146
  name: "install_decision",
5729
6147
  aliases: ["lsp_install_decision"],
@@ -5824,7 +6242,10 @@ function requestedProtocolVersion(params) {
5824
6242
  var CONTEXT_KEY = "_context";
5825
6243
 
5826
6244
  class InvalidDaemonRequestError extends Error {
5827
- name = "InvalidDaemonRequestError";
6245
+ constructor() {
6246
+ super(...arguments);
6247
+ this.name = "InvalidDaemonRequestError";
6248
+ }
5828
6249
  }
5829
6250
  function extractRequestContext(raw) {
5830
6251
  if (!isPlainRecord(raw) || raw["method"] !== "tools/call")
@@ -5940,14 +6361,17 @@ async function callToolViaDaemon(name, args, options) {
5940
6361
  function callDiagnosticsViaDaemon(filePath, options) {
5941
6362
  return callToolViaDaemon("diagnostics", { filePath, severity: "error" }, options);
5942
6363
  }
6364
+ function callFormatViaDaemon(filePath, options) {
6365
+ return callToolViaDaemon("format", { filePath }, options);
6366
+ }
5943
6367
  function currentRequestContext(env = process.env) {
5944
6368
  const cwd = process.cwd();
5945
6369
  const home = env["HOME"] ?? homedir3();
5946
6370
  return parseLspRequestContext({
5947
6371
  cwd,
5948
- projectConfigPaths: [join7(cwd, ".codex", "lsp-client.json")],
5949
- userConfigPath: join7(home, ".codex", "lsp-client.json"),
5950
- installDecisionsPath: join7(home, ".codex", "lsp-install-decisions.json"),
6372
+ projectConfigPaths: [join8(cwd, ".codex", "lsp-client.json")],
6373
+ userConfigPath: join8(home, ".codex", "lsp-client.json"),
6374
+ installDecisionsPath: join8(home, ".codex", "lsp-install-decisions.json"),
5951
6375
  capabilities: { installDecisionTool: true }
5952
6376
  });
5953
6377
  }
@@ -5962,7 +6386,7 @@ function withContext(args, context) {
5962
6386
  function ensureDaemonAvailable(paths, ensure, signal) {
5963
6387
  if (!signal)
5964
6388
  return ensure(paths);
5965
- return new Promise((resolve9, reject) => {
6389
+ return new Promise((resolve, reject) => {
5966
6390
  let settled = false;
5967
6391
  const finish = (run) => {
5968
6392
  if (settled)
@@ -5977,11 +6401,11 @@ function ensureDaemonAvailable(paths, ensure, signal) {
5977
6401
  return;
5978
6402
  }
5979
6403
  signal.addEventListener("abort", onAbort, { once: true });
5980
- Promise.resolve().then(() => ensure(paths, signal)).then(() => finish(() => resolve9()), (error) => finish(() => reject(signal.aborted ? new DaemonRequestCancelledError(false) : error)));
6404
+ Promise.resolve().then(() => ensure(paths, signal)).then(() => finish(() => resolve()), (error) => finish(() => reject(signal.aborted ? new DaemonRequestCancelledError(false) : error)));
5981
6405
  });
5982
6406
  }
5983
6407
  function sendToolCall(paths, token, name, args, options) {
5984
- return new Promise((resolve9, reject) => {
6408
+ return new Promise((resolve, reject) => {
5985
6409
  const socket = connect(paths.socket);
5986
6410
  const requestId = allocateProxyRequestId();
5987
6411
  let settled = false;
@@ -6034,7 +6458,7 @@ function sendToolCall(paths, token, name, args, options) {
6034
6458
  }
6035
6459
  const result = toToolResult(message, requestId);
6036
6460
  if (result)
6037
- finish(() => resolve9(result));
6461
+ finish(() => resolve(result));
6038
6462
  else
6039
6463
  finish(() => reject(new DaemonRequestError("invalid daemon response", requestWritten)));
6040
6464
  });
@@ -6079,8 +6503,8 @@ function isRetryableTool(name) {
6079
6503
  return name !== "rename" && name !== "lsp_rename";
6080
6504
  }
6081
6505
  // src/proxy.ts
6082
- import { existsSync as existsSync12, realpathSync as realpathSync5 } from "node:fs";
6083
- import { basename as basename4, delimiter as delimiter4, dirname as dirname9, isAbsolute as isAbsolute5 } from "node:path";
6506
+ import { existsSync as existsSync13, realpathSync as realpathSync6 } from "node:fs";
6507
+ import { basename as basename4, delimiter as delimiter4, dirname as dirname11, isAbsolute as isAbsolute6 } from "node:path";
6084
6508
  var DEFAULT_STARTUP_TIMEOUT_MS = 1e4;
6085
6509
  async function runMcpStdioProxy(options = {}) {
6086
6510
  const input = options.input ?? process.stdin;
@@ -6203,34 +6627,34 @@ function canonicalizePathList(value) {
6203
6627
  return value.split(delimiter4).map((entry) => canonicalizePath(entry) ?? entry).join(delimiter4);
6204
6628
  }
6205
6629
  function canonicalizePath(value) {
6206
- if (value === undefined || !isAbsolute5(value) || !existsSync12(value))
6630
+ if (value === undefined || !isAbsolute6(value) || !existsSync13(value))
6207
6631
  return value;
6208
- return realpathSync5(value);
6632
+ return realpathSync6(value);
6209
6633
  }
6210
- function projectRootFromOpenCodeConfigPath(path2) {
6211
- if (basename4(path2) !== "lsp.json" && basename4(path2) !== "lsp-client.json")
6634
+ function projectRootFromOpenCodeConfigPath(path) {
6635
+ if (basename4(path) !== "lsp.json" && basename4(path) !== "lsp-client.json")
6212
6636
  return;
6213
- const configDir = dirname9(path2);
6637
+ const configDir = dirname11(path);
6214
6638
  const configDirName = basename4(configDir);
6215
6639
  if (configDirName !== ".opencode" && configDirName !== ".omo")
6216
6640
  return;
6217
- return dirname9(configDir);
6641
+ return dirname11(configDir);
6218
6642
  }
6219
6643
  export {
6220
- validateDaemonVersion,
6221
- runMcpStdioProxy,
6222
- resolveDaemonRuntime,
6223
- probeDaemon,
6224
- ensureDaemonRunning,
6225
- disposeDefaultLspManager,
6226
- daemonPaths,
6227
- currentRequestContext,
6228
- callToolViaDaemon,
6229
- callDiagnosticsViaDaemon,
6230
- OMO_LSP_DAEMON_VERSION,
6231
- OMO_LSP_DAEMON_DIR,
6232
- OMO_LSP_DAEMON_CLI,
6233
- InvalidRuntimeOverrideError,
6644
+ InvalidDaemonDirectoryError,
6234
6645
  InvalidDaemonVersionError,
6235
- InvalidDaemonDirectoryError
6646
+ InvalidRuntimeOverrideError,
6647
+ OMO_LSP_DAEMON_CLI,
6648
+ OMO_LSP_DAEMON_DIR,
6649
+ OMO_LSP_DAEMON_VERSION,
6650
+ callDiagnosticsViaDaemon,
6651
+ callToolViaDaemon,
6652
+ currentRequestContext,
6653
+ daemonPaths,
6654
+ disposeDefaultLspManager,
6655
+ ensureDaemonRunning,
6656
+ probeDaemon,
6657
+ resolveDaemonRuntime,
6658
+ runMcpStdioProxy,
6659
+ validateDaemonVersion
6236
6660
  };