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

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 (1236) 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 +59118 -63486
  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 +58841 -63186
  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/lifecycle-inline-spec.d.ts +1 -1
  106. package/dist/features/team-mode/tools/messaging-fallback-wake.d.ts +17 -0
  107. package/dist/features/team-mode/tools/messaging-live-delivery-recipient.d.ts +3 -0
  108. package/dist/features/team-mode/tools/messaging-runtime.d.ts +7 -0
  109. package/dist/hooks/anthropic-context-window-limit-recovery/message-storage-directory.d.ts +0 -3
  110. package/dist/hooks/anthropic-context-window-limit-recovery/state.d.ts +1 -0
  111. package/dist/hooks/anthropic-context-window-limit-recovery/storage/empty-messages.d.ts +0 -1
  112. package/dist/hooks/anthropic-context-window-limit-recovery/tool-result-storage.d.ts +11 -0
  113. package/dist/hooks/atlas/atlas-hook.d.ts +1 -0
  114. package/dist/hooks/atlas/atlas-lifecycle-store.d.ts +50 -0
  115. package/dist/hooks/atlas/event-handler.d.ts +1 -0
  116. package/dist/hooks/atlas/final-wave-approval-gate.test-support.d.ts +50 -0
  117. package/dist/hooks/atlas/system-reminder-templates.d.ts +0 -1
  118. package/dist/hooks/atlas/tool-execute-before.d.ts +3 -0
  119. package/dist/hooks/atlas/types.d.ts +1 -0
  120. package/dist/hooks/claude-code-hooks/session-hook-state.d.ts +1 -0
  121. package/dist/hooks/claude-code-hooks/stop.d.ts +2 -0
  122. package/dist/hooks/claude-code-hooks/todo.d.ts +0 -1
  123. package/dist/hooks/claude-code-hooks/transcript.d.ts +2 -0
  124. package/dist/hooks/comment-checker/__fixtures__/download-probe.fixture.d.ts +1 -0
  125. package/dist/hooks/compaction-context-injector/validated-model.d.ts +2 -0
  126. package/dist/hooks/fsync-skip-warning/index.d.ts +4 -0
  127. package/dist/hooks/hashline-edit-diff-enhancer/hook.d.ts +1 -0
  128. package/dist/hooks/hashline-edit-diff-enhancer/pending-captures.d.ts +13 -0
  129. package/dist/hooks/index.d.ts +1 -2
  130. package/dist/hooks/keyword-detector/hook.d.ts +9 -0
  131. package/dist/hooks/keyword-detector/ultrawork/index.d.ts +2 -0
  132. package/dist/hooks/keyword-detector/ultrawork/source-detector.d.ts +0 -1
  133. package/dist/hooks/model-fallback/hook.d.ts +1 -1
  134. package/dist/hooks/plan-format-validator/hook.d.ts +19 -0
  135. package/dist/hooks/prometheus-md-only/agent-resolution.d.ts +2 -2
  136. package/dist/hooks/runtime-fallback/chat-message-handler.d.ts +2 -0
  137. package/dist/hooks/runtime-fallback/retry-model-payload.d.ts +1 -0
  138. package/dist/hooks/runtime-fallback/runtime-model-settings.d.ts +6 -0
  139. package/dist/hooks/runtime-fallback/session-status-handler.d.ts +1 -1
  140. package/dist/hooks/runtime-fallback/types.d.ts +3 -1
  141. package/dist/hooks/sisyphus-junior-notepad/constants.d.ts +1 -1
  142. package/dist/hooks/todo-continuation-enforcer/types.d.ts +1 -0
  143. package/dist/hooks/{start-work → ulw-execute}/context-info-builder.d.ts +1 -1
  144. package/dist/hooks/{start-work → ulw-execute}/index.d.ts +1 -1
  145. package/dist/hooks/ulw-execute/ulw-execute-hook.d.ts +23 -0
  146. package/dist/hooks/unstable-agent-babysitter/task-message-analyzer.d.ts +1 -0
  147. package/dist/index.js +34199 -28037
  148. package/dist/mcp/index.d.ts +0 -4
  149. package/dist/mcp/types.d.ts +0 -1
  150. package/dist/oh-my-opencode.schema.json +28 -59
  151. package/dist/plugin/chat-message/types.d.ts +6 -4
  152. package/dist/plugin/chat-message/ulw-execute-message.d.ts +5 -0
  153. package/dist/plugin/event-session-lifecycle.d.ts +1 -0
  154. package/dist/plugin/hooks/create-core-hooks.d.ts +2 -2
  155. package/dist/plugin/hooks/create-session-hooks.d.ts +2 -3
  156. package/dist/plugin/hooks/create-transform-hooks.d.ts +2 -0
  157. package/dist/plugin/messages-transform.d.ts +1 -0
  158. package/dist/plugin/stop-continuation.d.ts +3 -0
  159. package/dist/plugin/system-transform.d.ts +5 -1
  160. package/dist/plugin-config/omo-config-chain.d.ts +1 -0
  161. package/dist/plugin-dispose.d.ts +3 -0
  162. package/dist/shared/agent-tool-restrictions.d.ts +0 -1
  163. package/dist/shared/compaction-agent-config-checkpoint.d.ts +1 -0
  164. package/dist/shared/index.d.ts +2 -0
  165. package/dist/shared/legacy-plugin-warning.d.ts +2 -1
  166. package/dist/shared/omo-process-sweep.d.ts +2 -4
  167. package/dist/shared/plugin-entry-migrator.d.ts +4 -3
  168. package/dist/shared/plugin-entry-shape.d.ts +6 -0
  169. package/dist/shared/runtime-fallback-retry-marker.d.ts +16 -0
  170. package/dist/shared/shell-env.d.ts +1 -1
  171. package/dist/skills/ast-grep/AGENTS.md +51 -0
  172. package/dist/skills/ast-grep/SKILL.md +13 -1
  173. package/dist/skills/coding-agent-sessions/AGENTS.md +62 -0
  174. package/dist/skills/coding-agent-sessions/SKILL.md +1 -1
  175. package/dist/skills/data-scientist/SKILL.md +99 -239
  176. package/dist/skills/data-scientist/references/execution-surfaces.md +91 -0
  177. package/dist/skills/data-scientist/references/placement.md +74 -0
  178. package/dist/skills/data-scientist/references/polars-lane.md +95 -0
  179. package/dist/skills/data-scientist/references/uv-setup.md +1 -1
  180. package/dist/skills/data-scientist/references/visualization.md +64 -0
  181. package/dist/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
  182. package/dist/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
  183. package/dist/skills/debugging/SKILL.md +3 -1
  184. package/dist/skills/debugging/references/methodology/00-setup.md +12 -0
  185. package/dist/skills/debugging/references/methodology/02-investigate.md +26 -5
  186. package/dist/skills/debugging/references/runtimes/go.md +15 -1
  187. package/dist/skills/debugging/references/runtimes/native-binary.md +38 -0
  188. package/dist/skills/debugging/references/runtimes/node.md +25 -0
  189. package/dist/skills/debugging/references/runtimes/python.md +13 -0
  190. package/dist/skills/debugging/references/runtimes/rust.md +41 -0
  191. package/dist/skills/debugging/references/scripts/dap.mjs +267 -0
  192. package/dist/skills/debugging/references/scripts/dap.test.ts +86 -0
  193. package/dist/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
  194. package/dist/skills/debugging/references/tools/dap.md +103 -0
  195. package/dist/skills/debugging/references/tools/frida.md +193 -0
  196. package/dist/skills/debugging/references/tools/playwright-cli.md +79 -161
  197. package/dist/skills/frontend/ATTRIBUTION.md +10 -0
  198. package/dist/skills/frontend/SKILL.md +8 -3
  199. package/dist/skills/frontend/references/design/README.md +13 -4
  200. package/dist/skills/frontend/references/design/_INDEX.md +1 -0
  201. package/dist/skills/frontend/references/design/ambience-skill.md +145 -0
  202. package/dist/skills/frontend/references/design/aside.md +1 -1
  203. package/dist/skills/frontend/references/design/clone-from-url.md +1 -1
  204. package/dist/skills/frontend/references/design/design-system-architecture.md +1 -0
  205. package/dist/skills/frontend/references/design/interaction-skill.md +2 -0
  206. package/dist/skills/frontend/references/design/print-paged-media.md +76 -0
  207. package/dist/skills/frontend/references/designpowers/README.md +1 -1
  208. package/dist/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
  209. package/dist/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
  210. package/dist/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
  211. package/dist/skills/frontend/references/designpowers/orchestration.md +1 -1
  212. package/dist/skills/frontend/references/designpowers/routing.md +5 -5
  213. package/dist/skills/frontend/references/perfection/README.md +1 -0
  214. package/dist/skills/frontend/scripts/perfection/lighthouse-audit.py +2 -2
  215. package/dist/skills/git-master/SKILL.md +1 -1
  216. package/dist/skills/init-deep/SKILL.md +14 -14
  217. package/dist/skills/lsp-setup/SKILL.md +1 -1
  218. package/dist/skills/programming/SKILL.md +1 -1
  219. package/dist/skills/refactor/SKILL.md +5 -5
  220. package/dist/skills/remove-ai-slops/SKILL.md +5 -5
  221. package/dist/skills/review-work/SKILL.md +101 -419
  222. package/dist/skills/ultimate-browsing/ATTRIBUTION.md +32 -86
  223. package/dist/skills/ultimate-browsing/SKILL.md +32 -27
  224. package/dist/skills/ultimate-browsing/engine/AGENTS.md +111 -0
  225. package/dist/skills/ultimate-browsing/engine/templates/package.json +2 -2
  226. package/dist/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +5 -2
  227. package/dist/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +8 -6
  228. package/dist/skills/ultimate-browsing/engine/tests/test_playwright_stealth.py +86 -0
  229. package/dist/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +4 -7
  230. package/dist/skills/ultimate-browsing/references/chrome-stealth.md +86 -95
  231. package/dist/skills/ultimate-browsing/references/insane-search/README.md +18 -5
  232. package/dist/skills/ultimate-browsing/references/insane-search/playwright.md +16 -13
  233. package/dist/skills/ultimate-browsing/scripts/extract_cookies.py +3 -3
  234. package/dist/skills/{start-work → ulw-execute}/SKILL.md +24 -22
  235. package/dist/skills/ulw-plan/SKILL.md +5 -6
  236. package/dist/skills/ulw-plan/references/full-workflow.md +6 -5
  237. package/dist/skills/ulw-plan/references/intent-unclear.md +2 -2
  238. package/dist/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -1
  239. package/dist/skills/ulw-research/SKILL.md +10 -5
  240. package/dist/skills/visual-qa/AGENTS.md +58 -0
  241. package/dist/skills/visual-qa/SKILL.md +4 -3
  242. package/dist/skills/visual-qa/references/browser-setup.md +75 -0
  243. package/dist/tools/delegate-task/builtin-categories.d.ts +3 -1
  244. package/dist/tools/delegate-task/builtin-category-definition.d.ts +2 -1
  245. package/dist/tools/delegate-task/constants.d.ts +2 -2
  246. package/dist/tools/delegate-task/openai-categories.d.ts +10 -3
  247. package/dist/tools/delegate-task/sync-session-cleanup.d.ts +3 -0
  248. package/dist/tools/delegate-task/sync-session-poller.d.ts +1 -0
  249. package/dist/tools/delegate-task/tool-description.d.ts +3 -1
  250. package/dist/tools/delegate-task/types.d.ts +4 -0
  251. package/dist/tools/session-manager/directory-filter.d.ts +2 -0
  252. package/dist/tui.d.ts +12 -0
  253. package/dist/tui.js +22186 -30577
  254. package/package.json +51 -50
  255. package/packages/git-bash-mcp/dist/cli.js +6 -1
  256. package/packages/git-bash-mcp/package.json +1 -1
  257. package/packages/lsp-core/src/index.ts +1 -0
  258. package/packages/lsp-core/src/lsp/client-diagnostics-concurrency.integration.test.ts +9 -1
  259. package/packages/lsp-core/src/lsp/client-diagnostics-freshness.integration.test.ts +100 -28
  260. package/packages/lsp-core/src/lsp/client-diagnostics-pull-timeout.test.ts +64 -0
  261. package/packages/lsp-core/src/lsp/client-wrapper-outside-cwd.test.ts +78 -0
  262. package/packages/lsp-core/src/lsp/client-wrapper.test.ts +103 -6
  263. package/packages/lsp-core/src/lsp/client-wrapper.ts +50 -16
  264. package/packages/lsp-core/src/lsp/client.ts +32 -3
  265. package/packages/lsp-core/src/lsp/connection.ts +16 -0
  266. package/packages/lsp-core/src/lsp/constants.ts +6 -0
  267. package/packages/lsp-core/src/lsp/controlled-clock-test-support.ts +90 -0
  268. package/packages/lsp-core/src/lsp/errors.ts +15 -0
  269. package/packages/lsp-core/src/lsp/fixtures/workspace-edit-server.mjs +10 -3
  270. package/packages/lsp-core/src/lsp/format-document.test.ts +143 -0
  271. package/packages/lsp-core/src/lsp/format-document.ts +90 -0
  272. package/packages/lsp-core/src/lsp/json-rpc-connection.ts +11 -6
  273. package/packages/lsp-core/src/lsp/manager-lifecycle.test.ts +262 -0
  274. package/packages/lsp-core/src/lsp/manager-max-clients.test.ts +151 -0
  275. package/packages/lsp-core/src/lsp/manager.ts +138 -12
  276. package/packages/lsp-core/src/lsp/outside-context-workspace.ts +33 -0
  277. package/packages/lsp-core/src/lsp/server-definitions.ts +29 -0
  278. package/packages/lsp-core/src/lsp/server-installation.test.ts +376 -0
  279. package/packages/lsp-core/src/lsp/server-installation.ts +200 -27
  280. package/packages/lsp-core/src/lsp/server-resolution-local-binary.test.ts +170 -0
  281. package/packages/lsp-core/src/lsp/server-resolution.ts +18 -5
  282. package/packages/lsp-core/src/lsp/timer-provider.ts +13 -0
  283. package/packages/lsp-core/src/lsp/transport-request-timeout.test.ts +73 -0
  284. package/packages/lsp-core/src/lsp/transport.ts +16 -2
  285. package/packages/lsp-core/src/lsp/types.ts +8 -0
  286. package/packages/lsp-core/src/lsp/workspace-apply-edit-test-support.ts +29 -1
  287. package/packages/lsp-core/src/lsp/workspace-document-state.test.ts +84 -1
  288. package/packages/lsp-core/src/lsp/workspace-document-state.ts +35 -11
  289. package/packages/lsp-core/src/lsp/workspace-markers.ts +18 -0
  290. package/packages/lsp-core/src/mcp.ts +3 -0
  291. package/packages/lsp-core/src/request-context.test.ts +29 -0
  292. package/packages/lsp-core/src/request-context.ts +1 -1
  293. package/packages/lsp-core/src/tool-surface.test.ts +13 -1
  294. package/packages/lsp-core/src/tools/definitions.ts +14 -0
  295. package/packages/lsp-core/src/tools/format.test.ts +56 -0
  296. package/packages/lsp-core/src/tools/format.ts +56 -0
  297. package/packages/lsp-core/src/tools/index.ts +1 -0
  298. package/packages/lsp-core/src/tools/parameters.test.ts +51 -0
  299. package/packages/lsp-core/src/tools/types.ts +10 -0
  300. package/packages/lsp-daemon/dist/cli.js +1421 -960
  301. package/packages/lsp-daemon/dist/client.d.ts +10 -0
  302. package/packages/lsp-daemon/dist/client.js +956 -498
  303. package/packages/lsp-daemon/dist/daemon-client.d.ts +3 -0
  304. package/packages/lsp-daemon/dist/daemon-client.js +23 -3
  305. package/packages/lsp-daemon/dist/ensure-daemon.d.ts +6 -1
  306. package/packages/lsp-daemon/dist/ensure-daemon.js +27 -5
  307. package/packages/lsp-daemon/dist/index.js +860 -407
  308. package/packages/lsp-daemon/dist/ownership.js +2 -2
  309. package/packages/lsp-daemon/dist/proxy.js +3 -0
  310. package/packages/lsp-daemon/dist/version-reap.js +1 -1
  311. package/packages/lsp-daemon/package.json +5 -4
  312. package/packages/lsp-tools-mcp/dist/cli.js +764 -341
  313. package/packages/lsp-tools-mcp/dist/lsp/manager.js +274 -138
  314. package/packages/lsp-tools-mcp/dist/mcp.js +789 -368
  315. package/packages/lsp-tools-mcp/dist/request-context.js +12 -13
  316. package/packages/lsp-tools-mcp/dist/tools.js +719 -302
  317. package/packages/lsp-tools-mcp/package.json +5 -4
  318. package/packages/omo-codex/THIRD-PARTY-NOTICES.md +4 -21
  319. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +4 -6
  320. package/packages/omo-codex/plugin/.mcp.json +0 -6
  321. package/packages/omo-codex/plugin/AGENTS.md +47 -0
  322. package/packages/omo-codex/plugin/README.md +6 -2
  323. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +8402 -408
  324. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  325. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  326. package/packages/omo-codex/plugin/components/bootstrap/src/hook.ts +1 -0
  327. package/packages/omo-codex/plugin/components/bootstrap/src/setup.ts +7 -1
  328. package/packages/omo-codex/plugin/components/comment-checker/AGENTS.md +9 -0
  329. package/packages/omo-codex/plugin/components/comment-checker/biome.json +2 -2
  330. package/packages/omo-codex/plugin/components/comment-checker/dist/cli.js +2 -1
  331. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  332. package/packages/omo-codex/plugin/components/comment-checker/package.json +6 -5
  333. package/packages/omo-codex/plugin/components/comment-checker/src/apply-patch.ts +2 -8
  334. package/packages/omo-codex/plugin/components/comment-checker/src/core.ts +1 -2
  335. package/packages/omo-codex/plugin/components/comment-checker/src/request-extractor.ts +1 -1
  336. package/packages/omo-codex/plugin/components/comment-checker/src/runner.ts +1 -0
  337. package/packages/omo-codex/plugin/components/git-bash/AGENTS.md +1 -1
  338. package/packages/omo-codex/plugin/components/git-bash/dist/cli.js +1 -1
  339. package/packages/omo-codex/plugin/components/git-bash/dist/codex-hook.js +2 -1
  340. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  341. package/packages/omo-codex/plugin/components/git-bash/package.json +3 -4
  342. package/packages/omo-codex/plugin/components/git-bash/src/codex-hook.ts +2 -1
  343. package/packages/omo-codex/plugin/components/git-bash/test/codex-hook.test.ts +6 -7
  344. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/AGENTS.md +2 -2
  345. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/biome.json +2 -2
  346. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/directive.md +2 -0
  347. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/cli.js +36 -29
  348. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/codex-hook.js +32 -26
  349. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/types.d.ts +3 -0
  350. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  351. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +6 -5
  352. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/codex-hook.ts +32 -28
  353. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/types.ts +3 -0
  354. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/cli.test.ts +1 -1
  355. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +137 -28
  356. package/packages/omo-codex/plugin/components/lcx/skills/lcx-doctor/SKILL.md +4 -2
  357. package/packages/omo-codex/plugin/components/lsp/AGENTS.md +30 -15
  358. package/packages/omo-codex/plugin/components/lsp/biome.json +2 -2
  359. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +4 -4
  360. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +977 -545
  361. package/packages/omo-codex/plugin/components/lsp/dist/daemon-cli-path.js +1 -1
  362. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  363. package/packages/omo-codex/plugin/components/lsp/package.json +6 -5
  364. package/packages/omo-codex/plugin/components/lsp/src/cli.ts +1 -1
  365. package/packages/omo-codex/plugin/components/lsp/src/codex-hook.ts +1 -1
  366. package/packages/omo-codex/plugin/components/lsp/src/daemon-cli-path.ts +1 -5
  367. package/packages/omo-codex/plugin/components/lsp/test/codex-hook-unavailable.test.ts +6 -7
  368. package/packages/omo-codex/plugin/components/lsp/test/codex-hook.test.ts +1 -2
  369. package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +11 -1
  370. package/packages/omo-codex/plugin/components/rules/AGENTS.md +12 -0
  371. package/packages/omo-codex/plugin/components/rules/README.md +2 -0
  372. package/packages/omo-codex/plugin/components/rules/biome.json +2 -2
  373. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-6.md +123 -0
  374. package/packages/omo-codex/plugin/components/rules/dist/cli.js +91 -68
  375. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  376. package/packages/omo-codex/plugin/components/rules/package.json +8 -7
  377. package/packages/omo-codex/plugin/components/rules/src/config.ts +1 -2
  378. package/packages/omo-codex/plugin/components/rules/src/persistent-cache.ts +1 -2
  379. package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +15 -5
  380. package/packages/omo-codex/plugin/components/rules/src/rules-engine-factory.ts +1 -4
  381. package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +4 -9
  382. package/packages/omo-codex/plugin/components/rules/test/bundled-rules-priority.test.ts +11 -16
  383. package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +17 -25
  384. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +9 -7
  385. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +0 -6
  386. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-dedup.test.ts +6 -4
  387. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-directive.test.ts +12 -9
  388. package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +28 -37
  389. package/packages/omo-codex/plugin/components/rules/test/dynamic-target-fingerprints.test.ts +1 -2
  390. package/packages/omo-codex/plugin/components/rules/test/engine.test.ts +7 -4
  391. package/packages/omo-codex/plugin/components/rules/test/finder.test.ts +2 -3
  392. package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +39 -72
  393. package/packages/omo-codex/plugin/components/rules/test/hephaestus-model-variant.test.ts +38 -3
  394. package/packages/omo-codex/plugin/components/rules/test/hook-output.test.ts +2 -3
  395. package/packages/omo-codex/plugin/components/rules/test/matcher.test.ts +2 -3
  396. package/packages/omo-codex/plugin/components/rules/test/package-smoke.test.ts +1 -1
  397. package/packages/omo-codex/plugin/components/rules/test/parser.test.ts +1 -2
  398. package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +29 -6
  399. package/packages/omo-codex/plugin/components/rules/test/rules-engine-consumption.test.ts +3 -6
  400. package/packages/omo-codex/plugin/components/rules/test/scanner.test.ts +1 -2
  401. package/packages/omo-codex/plugin/components/rules/test/sources.test.ts +2 -5
  402. package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +2 -17
  403. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  404. package/packages/omo-codex/plugin/components/teammode/package.json +6 -5
  405. package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +4 -10
  406. package/packages/omo-codex/plugin/components/telemetry/AGENTS.md +8 -0
  407. package/packages/omo-codex/plugin/components/telemetry/biome.json +2 -2
  408. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +5328 -1382
  409. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +5524 -1579
  410. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  411. package/packages/omo-codex/plugin/components/telemetry/package.json +6 -5
  412. package/packages/omo-codex/plugin/components/telemetry/src/codex-hook.ts +1 -4
  413. package/packages/omo-codex/plugin/components/telemetry/src/posthog.ts +4 -14
  414. package/packages/omo-codex/plugin/components/telemetry/src/product-identity.ts +1 -1
  415. package/packages/omo-codex/plugin/components/telemetry/test/diagnostics.test.ts +2 -5
  416. package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +10 -4
  417. package/packages/omo-codex/plugin/components/ultrawork/README.md +2 -0
  418. package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +1 -1
  419. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-clone-fidelity-reviewer.toml +1 -1
  420. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-code-reviewer.toml +1 -1
  421. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-gate-reviewer.toml +1 -1
  422. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-qa-executor.toml +1 -1
  423. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-high.toml +1 -1
  424. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-low.toml +1 -1
  425. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-medium.toml +1 -1
  426. package/packages/omo-codex/plugin/components/ultrawork/agents/librarian.toml +1 -1
  427. package/packages/omo-codex/plugin/components/ultrawork/agents/metis.toml +1 -1
  428. package/packages/omo-codex/plugin/components/ultrawork/agents/momus.toml +1 -1
  429. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +4 -4
  430. package/packages/omo-codex/plugin/components/ultrawork/biome.json +2 -2
  431. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +500 -4
  432. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  433. package/packages/omo-codex/plugin/components/ultrawork/package.json +6 -6
  434. package/packages/omo-codex/plugin/components/ultrawork/scripts/sync-directive.mjs +30 -14
  435. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +4 -5
  436. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +5 -5
  437. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +2 -2
  438. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -0
  439. package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +4 -0
  440. package/packages/omo-codex/plugin/components/ultrawork/src/directive.ts +5 -2
  441. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook-trigger-policy.test.ts +9 -1
  442. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +0 -136
  443. package/packages/omo-codex/plugin/components/ultrawork/test/directive-source.test.ts +14 -8
  444. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +12 -1
  445. package/packages/omo-codex/plugin/components/ultrawork/test/skill-pointer.test.ts +0 -2
  446. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/AGENTS.md +4 -4
  447. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/NOTICE +1 -1
  448. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/README.md +6 -6
  449. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/biome.json +2 -2
  450. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/directive.md +11 -11
  451. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/dist/cli.js +16 -16
  452. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +16 -0
  453. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/package.json +13 -12
  454. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/boulder-reader.ts +1 -1
  455. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/cli.ts +1 -1
  456. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/codex-hook.ts +4 -4
  457. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/directive.ts +1 -1
  458. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/index.ts +1 -1
  459. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/types.ts +1 -1
  460. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/boulder-reader.test.ts +3 -3
  461. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/cli.test.ts +4 -11
  462. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/codex-hook.test.ts +24 -22
  463. package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +19 -0
  464. package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +17 -1
  465. package/packages/omo-codex/plugin/components/ulw-loop/README.md +12 -1
  466. package/packages/omo-codex/plugin/components/ulw-loop/biome.json +2 -2
  467. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +44 -27
  468. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.d.ts +18 -0
  469. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.js +30 -0
  470. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-continuation.js +10 -4
  471. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.d.ts +2 -5
  472. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.js +5 -78
  473. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.d.ts +12 -0
  474. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.js +114 -0
  475. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.d.ts +7 -1
  476. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +57 -46
  477. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-arg-parser.js +2 -2
  478. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.js +21 -8
  479. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +2 -1
  480. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +12 -1
  481. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.d.ts +1 -1
  482. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.js +40 -37
  483. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +2191 -737
  484. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.d.ts +2 -0
  485. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +28 -8
  486. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.d.ts +8 -5
  487. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.js +35 -23
  488. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.d.ts +1 -0
  489. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.js +1 -0
  490. package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +25 -9
  491. package/packages/omo-codex/plugin/components/ulw-loop/dist/driver-objective-ack.d.ts +4 -0
  492. package/packages/omo-codex/plugin/components/ulw-loop/dist/driver-objective-ack.js +18 -0
  493. package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence-artifacts.d.ts +1 -0
  494. package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence-artifacts.js +37 -0
  495. package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence.d.ts +1 -0
  496. package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence.js +24 -12
  497. package/packages/omo-codex/plugin/components/ulw-loop/dist/ledger.d.ts +4 -0
  498. package/packages/omo-codex/plugin/components/ulw-loop/dist/ledger.js +39 -0
  499. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.d.ts +2 -0
  500. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +19 -4
  501. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-commit.d.ts +19 -0
  502. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-commit.js +108 -0
  503. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.d.ts +6 -2
  504. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.js +54 -25
  505. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-goal-factory.d.ts +10 -3
  506. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-goal-factory.js +38 -31
  507. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.d.ts +10 -7
  508. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +121 -100
  509. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-log.d.ts +16 -0
  510. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-log.js +115 -0
  511. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.d.ts +18 -0
  512. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.js +41 -0
  513. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.d.ts +7 -0
  514. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.js +9 -0
  515. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.d.ts +12 -0
  516. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.js +104 -0
  517. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.d.ts +13 -1
  518. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.js +65 -9
  519. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.js +5 -1
  520. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.d.ts +4 -2
  521. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +72 -117
  522. package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.d.ts +2 -0
  523. package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.js +25 -13
  524. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/factory.d.ts +2 -0
  525. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/factory.js +157 -0
  526. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/manifest.d.ts +381 -0
  527. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/manifest.js +127 -0
  528. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/types.d.ts +130 -0
  529. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/types.js +1 -0
  530. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk.d.ts +3 -0
  531. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk.js +3 -0
  532. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-budget-io.d.ts +5 -0
  533. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-budget-io.js +67 -0
  534. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.d.ts +7 -1
  535. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +188 -59
  536. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-role-guard.d.ts +2 -0
  537. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-role-guard.js +22 -0
  538. package/packages/omo-codex/plugin/components/ulw-loop/dist/state-lock.d.ts +19 -0
  539. package/packages/omo-codex/plugin/components/ulw-loop/dist/state-lock.js +259 -0
  540. package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.d.ts +7 -0
  541. package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.js +41 -0
  542. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-batch.js +4 -4
  543. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-mutations.d.ts +3 -2
  544. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-mutations.js +4 -4
  545. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-types.d.ts +9 -1
  546. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.d.ts +3 -2
  547. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.js +11 -11
  548. package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +28 -23
  549. package/packages/omo-codex/plugin/components/ulw-loop/dist/success-criteria-input.d.ts +9 -0
  550. package/packages/omo-codex/plugin/components/ulw-loop/dist/success-criteria-input.js +41 -0
  551. package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.d.ts +19 -0
  552. package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.js +83 -0
  553. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +18 -5
  554. package/packages/omo-codex/plugin/components/ulw-loop/package.json +7 -6
  555. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +7 -2
  556. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +33 -10
  557. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-codex-validation.ts +52 -0
  558. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-continuation.ts +8 -6
  559. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-reconciliation.ts +5 -98
  560. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-template.ts +134 -0
  561. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +59 -77
  562. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-arg-parser.ts +10 -4
  563. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +24 -8
  564. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts +14 -1
  565. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-subcommands.ts +52 -46
  566. package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +8 -6
  567. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +35 -7
  568. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-snapshot.ts +51 -33
  569. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +3 -1
  570. package/packages/omo-codex/plugin/components/ulw-loop/src/constants.ts +1 -0
  571. package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +27 -9
  572. package/packages/omo-codex/plugin/components/ulw-loop/src/driver-objective-ack.ts +20 -0
  573. package/packages/omo-codex/plugin/components/ulw-loop/src/evidence-artifacts.ts +45 -0
  574. package/packages/omo-codex/plugin/components/ulw-loop/src/evidence.ts +23 -16
  575. package/packages/omo-codex/plugin/components/ulw-loop/src/ledger.ts +38 -0
  576. package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +32 -4
  577. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-commit.ts +132 -0
  578. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +67 -54
  579. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-goal-factory.ts +63 -31
  580. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts +140 -119
  581. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-log.ts +112 -0
  582. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-missing-recovery.ts +61 -0
  583. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-aggregate.ts +11 -0
  584. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-artifacts.ts +123 -0
  585. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-fields.ts +71 -15
  586. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-verdicts.ts +6 -1
  587. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +92 -136
  588. package/packages/omo-codex/plugin/components/ulw-loop/src/review-blockers.ts +38 -13
  589. package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/factory.ts +218 -0
  590. package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/manifest.ts +156 -0
  591. package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/types.ts +143 -0
  592. package/packages/omo-codex/plugin/components/ulw-loop/src/sdk.ts +3 -0
  593. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-budget-io.ts +59 -0
  594. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +196 -52
  595. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-role-guard.ts +22 -0
  596. package/packages/omo-codex/plugin/components/ulw-loop/src/state-lock.ts +257 -0
  597. package/packages/omo-codex/plugin/components/ulw-loop/src/status-next-actions.ts +45 -0
  598. package/packages/omo-codex/plugin/components/ulw-loop/src/steering-batch.ts +4 -4
  599. package/packages/omo-codex/plugin/components/ulw-loop/src/steering-mutations.ts +5 -4
  600. package/packages/omo-codex/plugin/components/ulw-loop/src/steering-types.ts +13 -1
  601. package/packages/omo-codex/plugin/components/ulw-loop/src/steering.ts +12 -10
  602. package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +27 -22
  603. package/packages/omo-codex/plugin/components/ulw-loop/src/success-criteria-input.ts +56 -0
  604. package/packages/omo-codex/plugin/components/ulw-loop/src/surface.ts +115 -0
  605. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-continuation.test.ts +0 -1
  606. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-final.test.ts +131 -82
  607. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-template.test.ts +147 -0
  608. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint.test.ts +16 -22
  609. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-checkpoint-continuation.test.ts +4 -2
  610. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-checkpoint.test.ts +31 -2
  611. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-commands.test.ts +2 -0
  612. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-complete-goals.test.ts +3 -1
  613. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-create-goals.test.ts +35 -8
  614. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +38 -4
  615. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-json-errors.test.ts +27 -0
  616. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-scope-required.test.ts +144 -0
  617. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-status-next-actions.test.ts +185 -0
  618. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering-batch.test.ts +8 -3
  619. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-validation-batch.test.ts +6 -0
  620. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +37 -2
  621. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-snapshot.test.ts +88 -11
  622. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +0 -3
  623. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/barrier.ts +13 -0
  624. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/cli-session.ts +4 -0
  625. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-child.ts +65 -0
  626. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-cli-qa.mjs +76 -0
  627. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-crash.ts +23 -0
  628. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-mutations.mjs +58 -0
  629. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-writer.ts +65 -0
  630. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/lease-clock.ts +23 -0
  631. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/quality-gate-builder.ts +9 -4
  632. package/packages/omo-codex/plugin/components/ulw-loop/test/guided-recovery.test.ts +67 -0
  633. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +5 -37
  634. package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +9 -0
  635. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-commit-log.test.ts +252 -0
  636. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-commit-recovery.test.ts +190 -0
  637. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io-cross-process.test.ts +106 -0
  638. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io.test.ts +74 -25
  639. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-log-legacy-projection.test.ts +228 -0
  640. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-log-newest.test.ts +72 -0
  641. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-aggregate-basics.test.ts +258 -0
  642. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-cap-and-dedupe.test.ts +22 -0
  643. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-fields-messages.test.ts +98 -0
  644. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-lazycodex-surface.test.ts +93 -0
  645. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-poisoning-cascades.test.ts +97 -0
  646. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-roles.test.ts +51 -2
  647. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-senpi-surface.test.ts +131 -0
  648. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-single-report.test.ts +241 -0
  649. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +58 -3
  650. package/packages/omo-codex/plugin/components/ulw-loop/test/review-blockers.test.ts +9 -7
  651. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-completed-plan.test.ts +43 -0
  652. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-contract.test.ts +137 -0
  653. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-driver-states.test.ts +174 -0
  654. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-dx.test.ts +219 -0
  655. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-session-context.test.ts +169 -0
  656. package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +450 -7
  657. package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-role-matrix.test.ts +113 -0
  658. package/packages/omo-codex/plugin/components/ulw-loop/test/state-lock.test.ts +310 -0
  659. package/packages/omo-codex/plugin/components/ulw-loop/test/status-next-actions-surface.test.ts +133 -0
  660. package/packages/omo-codex/plugin/components/ulw-loop/test/steering-batch.test.ts +12 -12
  661. package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +12 -6
  662. package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +1 -1
  663. package/packages/omo-codex/plugin/components/ulw-loop/test/surface.test.ts +74 -0
  664. package/packages/omo-codex/plugin/components/ulw-loop/test/ultrawork-directive.test.ts +13 -8
  665. package/packages/omo-codex/plugin/components/ulw-loop/vitest.config.ts +1 -0
  666. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  667. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  668. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  669. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  670. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  671. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  672. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  673. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +18 -0
  674. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  675. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  676. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  677. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  678. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  679. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  680. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  681. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +17 -0
  682. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  683. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  684. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  685. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  686. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  687. package/packages/omo-codex/plugin/model-catalog.json +16 -7
  688. package/packages/omo-codex/plugin/package-lock.json +992 -681
  689. package/packages/omo-codex/plugin/package.json +6 -3
  690. package/packages/omo-codex/plugin/scripts/AGENTS.md +39 -0
  691. package/packages/omo-codex/plugin/scripts/auto-update-plan.mjs +1 -2
  692. package/packages/omo-codex/plugin/scripts/auto-update.mjs +0 -9
  693. package/packages/omo-codex/plugin/scripts/canonical-ultrawork-directive.mjs +17 -0
  694. package/packages/omo-codex/plugin/scripts/hook-status-message.mjs +0 -1
  695. package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +16 -7
  696. package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +8 -4
  697. package/packages/omo-codex/plugin/scripts/migrate-codex-config/subagent-limit-guard.mjs +19 -90
  698. package/packages/omo-codex/plugin/scripts/migrate-codex-config/toml-section-editor.mjs +1 -1
  699. package/packages/omo-codex/plugin/scripts/sync-skills.d.mts +4 -0
  700. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +111 -64
  701. package/packages/omo-codex/plugin/shared/package.json +3 -4
  702. package/packages/omo-codex/plugin/shared/src/config-loader.ts +2 -102
  703. package/packages/omo-codex/plugin/shared/src/config-migration.ts +0 -1
  704. package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +41 -130
  705. package/packages/omo-codex/plugin/skills/ast-grep/AGENTS.md +51 -0
  706. package/packages/omo-codex/plugin/skills/ast-grep/SKILL.md +13 -1
  707. package/packages/omo-codex/plugin/skills/coding-agent-sessions/AGENTS.md +62 -0
  708. package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +1 -1
  709. package/packages/omo-codex/plugin/skills/data-scientist/SKILL.md +99 -239
  710. package/packages/omo-codex/plugin/skills/data-scientist/references/execution-surfaces.md +91 -0
  711. package/packages/omo-codex/plugin/skills/data-scientist/references/placement.md +74 -0
  712. package/packages/omo-codex/plugin/skills/data-scientist/references/polars-lane.md +95 -0
  713. package/packages/omo-codex/plugin/skills/data-scientist/references/uv-setup.md +1 -1
  714. package/packages/omo-codex/plugin/skills/data-scientist/references/visualization.md +64 -0
  715. package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
  716. package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
  717. package/packages/omo-codex/plugin/skills/debugging/SKILL.md +3 -1
  718. package/packages/omo-codex/plugin/skills/debugging/references/methodology/00-setup.md +12 -0
  719. package/packages/omo-codex/plugin/skills/debugging/references/methodology/02-investigate.md +26 -5
  720. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/go.md +15 -1
  721. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/native-binary.md +38 -0
  722. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/node.md +25 -0
  723. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/python.md +13 -0
  724. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/rust.md +41 -0
  725. package/packages/omo-codex/plugin/skills/debugging/references/scripts/dap.mjs +267 -0
  726. package/packages/omo-codex/plugin/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
  727. package/packages/omo-codex/plugin/skills/debugging/references/tools/dap.md +103 -0
  728. package/packages/omo-codex/plugin/skills/debugging/references/tools/frida.md +193 -0
  729. package/packages/omo-codex/plugin/skills/debugging/references/tools/playwright-cli.md +79 -161
  730. package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +10 -0
  731. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +8 -3
  732. package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +13 -4
  733. package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +1 -0
  734. package/packages/omo-codex/plugin/skills/frontend/references/design/ambience-skill.md +145 -0
  735. package/packages/omo-codex/plugin/skills/frontend/references/design/aside.md +1 -1
  736. package/packages/omo-codex/plugin/skills/frontend/references/design/clone-from-url.md +1 -1
  737. package/packages/omo-codex/plugin/skills/frontend/references/design/design-system-architecture.md +1 -0
  738. package/packages/omo-codex/plugin/skills/frontend/references/design/interaction-skill.md +2 -0
  739. package/packages/omo-codex/plugin/skills/frontend/references/design/print-paged-media.md +76 -0
  740. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/README.md +1 -1
  741. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
  742. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
  743. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
  744. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/orchestration.md +1 -1
  745. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/routing.md +5 -5
  746. package/packages/omo-codex/plugin/skills/frontend/references/perfection/README.md +1 -0
  747. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/lighthouse-audit.py +2 -2
  748. package/packages/omo-codex/plugin/skills/git-master/SKILL.md +1 -1
  749. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +20 -18
  750. package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +4 -2
  751. package/packages/omo-codex/plugin/skills/lsp-setup/SKILL.md +1 -1
  752. package/packages/omo-codex/plugin/skills/programming/SKILL.md +1 -1
  753. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +11 -9
  754. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +11 -9
  755. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +116 -424
  756. package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +32 -86
  757. package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +32 -27
  758. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +111 -0
  759. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +2 -2
  760. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +5 -2
  761. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +8 -6
  762. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_playwright_stealth.py +86 -0
  763. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +4 -7
  764. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +86 -95
  765. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +18 -5
  766. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/playwright.md +16 -13
  767. package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/extract_cookies.py +3 -3
  768. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +44 -27
  769. package/packages/omo-codex/plugin/skills/{start-work → ulw-execute}/SKILL.md +35 -36
  770. package/packages/omo-codex/plugin/skills/ulw-execute/agents/openai.yaml +2 -0
  771. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +31 -2
  772. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +33 -10
  773. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +4 -5
  774. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +5 -5
  775. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +2 -2
  776. package/packages/omo-codex/plugin/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -0
  777. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +16 -9
  778. package/packages/omo-codex/plugin/skills/visual-qa/AGENTS.md +58 -0
  779. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +10 -7
  780. package/packages/omo-codex/plugin/skills/visual-qa/references/browser-setup.md +75 -0
  781. package/packages/omo-codex/plugin/test/AGENTS.md +47 -0
  782. package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +19 -173
  783. package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +16 -51
  784. package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +2 -3
  785. package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +2 -7
  786. package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +14 -4
  787. package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +175 -13
  788. package/packages/omo-codex/plugin/test/aggregate.test.mjs +78 -2
  789. package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +19 -33
  790. package/packages/omo-codex/plugin/test/auto-update.test.mjs +4 -29
  791. package/packages/omo-codex/plugin/test/bootstrap-default-role.test.mjs +66 -0
  792. package/packages/omo-codex/plugin/test/bootstrap-setup.test.mjs +0 -31
  793. package/packages/omo-codex/plugin/test/canonical-ultrawork-directive.test.mjs +53 -0
  794. package/packages/omo-codex/plugin/test/component-bin-names.test.mjs +2 -2
  795. package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +1 -51
  796. package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +100 -2
  797. package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +5 -6
  798. package/packages/omo-codex/plugin/test/lcx-contribute-bug-fix-template.test.mjs +21 -27
  799. package/packages/omo-codex/plugin/test/mcp-research-servers.test.mjs +1 -3
  800. package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +35 -35
  801. package/packages/omo-codex/plugin/test/multi-agent-v2-regression.test.mjs +1 -1
  802. package/packages/omo-codex/plugin/test/scaffold-plan.test.mjs +0 -36
  803. package/packages/omo-codex/plugin/test/subagent-limit-migration.test.mjs +107 -15
  804. package/packages/omo-codex/plugin/test/sync-skills-codex-compatibility.test.mjs +168 -0
  805. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +54 -24
  806. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +18 -119
  807. package/packages/omo-codex/plugin/test/teammode-archive-ambiguity.test.mjs +0 -40
  808. package/packages/omo-codex/plugin/test/teammode-communication.test.mjs +6 -62
  809. package/packages/omo-codex/plugin/test/teammode-thread-links.test.mjs +3 -36
  810. package/packages/omo-codex/plugin/test/teammode-transport.test.mjs +0 -44
  811. package/packages/omo-codex/plugin/test/teammode-worktree.test.mjs +2 -6
  812. package/packages/omo-codex/plugin/test/ultrawork-skill-pointer.test.mjs +5 -5
  813. package/packages/omo-codex/plugin/test/ulw-plan-review-state-contract.test.mjs +0 -3
  814. package/packages/omo-codex/scripts/AGENTS.md +36 -0
  815. package/packages/omo-codex/scripts/check-model-catalog-parity.mjs +42 -0
  816. package/packages/omo-codex/scripts/install-cache-copy.test.mjs +27 -1
  817. package/packages/omo-codex/scripts/install-config-autonomous-features.test.mjs +1 -1
  818. package/packages/omo-codex/scripts/install-config-autonomous.test.mjs +2 -1
  819. package/packages/omo-codex/scripts/install-config-git-bash.test.mjs +0 -23
  820. package/packages/omo-codex/scripts/install-config-reasoning.test.mjs +5 -5
  821. package/packages/omo-codex/scripts/install-config.test.mjs +15 -17
  822. package/packages/omo-codex/scripts/install-dist/install-local.mjs +16149 -4304
  823. package/packages/omo-codex/scripts/install-generated-bundle.test.mjs +3 -4
  824. package/packages/omo-codex/scripts/install-git-bash-mcp-env.test.mjs +1 -25
  825. package/packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs +7 -2
  826. package/packages/omo-codex/scripts/install-mcp-runtime.test.mjs +0 -36
  827. package/packages/omo-codex/scripts/install-packaged-local.test.mjs +1 -6
  828. package/packages/{omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md → prompts-core/prompts/ultrawork/codex.md} +44 -34
  829. package/packages/shared-skills/package.json +7 -1
  830. package/packages/shared-skills/skill-source-filter.d.ts +16 -0
  831. package/packages/shared-skills/skill-source-filter.mjs +44 -0
  832. package/packages/shared-skills/skills/ast-grep/AGENTS.md +51 -0
  833. package/packages/shared-skills/skills/ast-grep/SKILL.md +13 -1
  834. package/packages/shared-skills/skills/coding-agent-sessions/AGENTS.md +62 -0
  835. package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +1 -1
  836. package/packages/shared-skills/skills/data-scientist/SKILL.md +99 -239
  837. package/packages/shared-skills/skills/data-scientist/references/execution-surfaces.md +91 -0
  838. package/packages/shared-skills/skills/data-scientist/references/placement.md +74 -0
  839. package/packages/shared-skills/skills/data-scientist/references/polars-lane.md +95 -0
  840. package/packages/shared-skills/skills/data-scientist/references/uv-setup.md +1 -1
  841. package/packages/shared-skills/skills/data-scientist/references/visualization.md +64 -0
  842. package/packages/shared-skills/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
  843. package/packages/shared-skills/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
  844. package/packages/shared-skills/skills/debugging/SKILL.md +3 -1
  845. package/packages/shared-skills/skills/debugging/references/methodology/00-setup.md +12 -0
  846. package/packages/shared-skills/skills/debugging/references/methodology/02-investigate.md +26 -5
  847. package/packages/shared-skills/skills/debugging/references/runtimes/go.md +15 -1
  848. package/packages/shared-skills/skills/debugging/references/runtimes/native-binary.md +38 -0
  849. package/packages/shared-skills/skills/debugging/references/runtimes/node.md +25 -0
  850. package/packages/shared-skills/skills/debugging/references/runtimes/python.md +13 -0
  851. package/packages/shared-skills/skills/debugging/references/runtimes/rust.md +41 -0
  852. package/packages/shared-skills/skills/debugging/references/scripts/dap.mjs +267 -0
  853. package/packages/shared-skills/skills/debugging/references/scripts/dap.test.ts +86 -0
  854. package/packages/shared-skills/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
  855. package/packages/shared-skills/skills/debugging/references/tools/dap.md +103 -0
  856. package/packages/shared-skills/skills/debugging/references/tools/frida.md +193 -0
  857. package/packages/shared-skills/skills/debugging/references/tools/playwright-cli.md +79 -161
  858. package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +10 -0
  859. package/packages/shared-skills/skills/frontend/SKILL.md +8 -3
  860. package/packages/shared-skills/skills/frontend/references/design/README.md +13 -4
  861. package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +1 -0
  862. package/packages/shared-skills/skills/frontend/references/design/ambience-skill.md +145 -0
  863. package/packages/shared-skills/skills/frontend/references/design/aside.md +1 -1
  864. package/packages/shared-skills/skills/frontend/references/design/clone-from-url.md +1 -1
  865. package/packages/shared-skills/skills/frontend/references/design/design-system-architecture.md +1 -0
  866. package/packages/shared-skills/skills/frontend/references/design/interaction-skill.md +2 -0
  867. package/packages/shared-skills/skills/frontend/references/design/print-paged-media.md +76 -0
  868. package/packages/shared-skills/skills/frontend/references/designpowers/README.md +1 -1
  869. package/packages/shared-skills/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
  870. package/packages/shared-skills/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
  871. package/packages/shared-skills/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
  872. package/packages/shared-skills/skills/frontend/references/designpowers/orchestration.md +1 -1
  873. package/packages/shared-skills/skills/frontend/references/designpowers/routing.md +5 -5
  874. package/packages/shared-skills/skills/frontend/references/perfection/README.md +1 -0
  875. package/packages/shared-skills/skills/frontend/scripts/perfection/lighthouse-audit.py +2 -2
  876. package/packages/shared-skills/skills/git-master/SKILL.md +1 -1
  877. package/packages/shared-skills/skills/init-deep/SKILL.md +14 -14
  878. package/packages/shared-skills/skills/lsp-setup/SKILL.md +1 -1
  879. package/packages/shared-skills/skills/programming/SKILL.md +1 -1
  880. package/packages/shared-skills/skills/refactor/SKILL.md +5 -5
  881. package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +5 -5
  882. package/packages/shared-skills/skills/review-work/SKILL.md +101 -419
  883. package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +32 -86
  884. package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +32 -27
  885. package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +111 -0
  886. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +2 -2
  887. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +5 -2
  888. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +8 -6
  889. package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_playwright_stealth.py +86 -0
  890. package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +4 -7
  891. package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +86 -95
  892. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +18 -5
  893. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/playwright.md +16 -13
  894. package/packages/shared-skills/skills/ultimate-browsing/scripts/extract_cookies.py +3 -3
  895. package/packages/shared-skills/skills/{start-work → ulw-execute}/SKILL.md +24 -22
  896. package/packages/shared-skills/skills/ulw-plan/SKILL.md +5 -6
  897. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +6 -5
  898. package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +2 -2
  899. package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -1
  900. package/packages/shared-skills/skills/ulw-research/SKILL.md +10 -5
  901. package/packages/shared-skills/skills/visual-qa/AGENTS.md +58 -0
  902. package/packages/shared-skills/skills/visual-qa/SKILL.md +4 -3
  903. package/packages/shared-skills/skills/visual-qa/references/browser-setup.md +75 -0
  904. package/postinstall.mjs +2 -0
  905. package/script/qa/web-terminal-visual-qa.mjs +2 -0
  906. package/script/qa/xterm-live-terminal.mjs +18 -2
  907. package/.agents/skills/work-with-pr-workspace/evals/evals.json +0 -76
  908. package/.agents/skills/work-with-pr-workspace/iteration-1/benchmark.json +0 -138
  909. package/.agents/skills/work-with-pr-workspace/iteration-1/benchmark.md +0 -42
  910. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/eval_metadata.json +0 -57
  911. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/grading.json +0 -15
  912. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/code-changes.md +0 -454
  913. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/execution-plan.md +0 -136
  914. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/pr-description.md +0 -47
  915. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/verification-strategy.md +0 -163
  916. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/timing.json +0 -1
  917. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/grading.json +0 -15
  918. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/code-changes.md +0 -615
  919. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/execution-plan.md +0 -99
  920. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/pr-description.md +0 -50
  921. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/verification-strategy.md +0 -111
  922. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/timing.json +0 -1
  923. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/eval_metadata.json +0 -37
  924. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/grading.json +0 -11
  925. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/code-changes.md +0 -205
  926. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/execution-plan.md +0 -78
  927. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/pr-description.md +0 -42
  928. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/verification-strategy.md +0 -87
  929. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/timing.json +0 -1
  930. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/grading.json +0 -11
  931. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/code-changes.md +0 -334
  932. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/execution-plan.md +0 -86
  933. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/pr-description.md +0 -23
  934. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/verification-strategy.md +0 -119
  935. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/timing.json +0 -1
  936. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/eval_metadata.json +0 -32
  937. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/grading.json +0 -10
  938. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/code-changes.md +0 -221
  939. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/execution-plan.md +0 -104
  940. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/pr-description.md +0 -41
  941. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/verification-strategy.md +0 -84
  942. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/timing.json +0 -1
  943. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/grading.json +0 -10
  944. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/code-changes.md +0 -342
  945. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/execution-plan.md +0 -131
  946. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/pr-description.md +0 -39
  947. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/verification-strategy.md +0 -128
  948. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/timing.json +0 -1
  949. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/eval_metadata.json +0 -32
  950. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/grading.json +0 -10
  951. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/code-changes.md +0 -143
  952. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/execution-plan.md +0 -82
  953. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/pr-description.md +0 -51
  954. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/verification-strategy.md +0 -69
  955. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/timing.json +0 -1
  956. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/grading.json +0 -10
  957. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/code-changes.md +0 -252
  958. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/execution-plan.md +0 -83
  959. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/pr-description.md +0 -33
  960. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/verification-strategy.md +0 -101
  961. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/timing.json +0 -1
  962. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/eval_metadata.json +0 -32
  963. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/grading.json +0 -10
  964. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/code-changes.md +0 -387
  965. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/execution-plan.md +0 -112
  966. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/pr-description.md +0 -51
  967. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/verification-strategy.md +0 -75
  968. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/timing.json +0 -1
  969. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/grading.json +0 -10
  970. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/code-changes.md +0 -529
  971. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/execution-plan.md +0 -127
  972. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/pr-description.md +0 -42
  973. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/verification-strategy.md +0 -120
  974. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/timing.json +0 -1
  975. package/.agents/skills/work-with-pr-workspace/iteration-1/review.html +0 -1326
  976. package/.opencode/skills/work-with-pr-workspace/evals/evals.json +0 -76
  977. package/.opencode/skills/work-with-pr-workspace/iteration-1/benchmark.json +0 -138
  978. package/.opencode/skills/work-with-pr-workspace/iteration-1/benchmark.md +0 -42
  979. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/eval_metadata.json +0 -57
  980. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/grading.json +0 -15
  981. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/code-changes.md +0 -454
  982. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/execution-plan.md +0 -136
  983. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/pr-description.md +0 -47
  984. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/verification-strategy.md +0 -163
  985. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/timing.json +0 -1
  986. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/grading.json +0 -15
  987. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/code-changes.md +0 -615
  988. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/execution-plan.md +0 -99
  989. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/pr-description.md +0 -50
  990. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/verification-strategy.md +0 -111
  991. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/timing.json +0 -1
  992. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/eval_metadata.json +0 -37
  993. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/grading.json +0 -11
  994. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/code-changes.md +0 -205
  995. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/execution-plan.md +0 -78
  996. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/pr-description.md +0 -42
  997. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/verification-strategy.md +0 -87
  998. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/timing.json +0 -1
  999. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/grading.json +0 -11
  1000. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/code-changes.md +0 -334
  1001. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/execution-plan.md +0 -86
  1002. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/pr-description.md +0 -23
  1003. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/verification-strategy.md +0 -119
  1004. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/timing.json +0 -1
  1005. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/eval_metadata.json +0 -32
  1006. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/grading.json +0 -10
  1007. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/code-changes.md +0 -221
  1008. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/execution-plan.md +0 -104
  1009. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/pr-description.md +0 -41
  1010. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/verification-strategy.md +0 -84
  1011. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/timing.json +0 -1
  1012. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/grading.json +0 -10
  1013. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/code-changes.md +0 -342
  1014. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/execution-plan.md +0 -131
  1015. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/pr-description.md +0 -39
  1016. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/verification-strategy.md +0 -128
  1017. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/timing.json +0 -1
  1018. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/eval_metadata.json +0 -32
  1019. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/grading.json +0 -10
  1020. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/code-changes.md +0 -143
  1021. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/execution-plan.md +0 -82
  1022. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/pr-description.md +0 -51
  1023. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/verification-strategy.md +0 -69
  1024. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/timing.json +0 -1
  1025. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/grading.json +0 -10
  1026. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/code-changes.md +0 -252
  1027. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/execution-plan.md +0 -83
  1028. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/pr-description.md +0 -33
  1029. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/verification-strategy.md +0 -101
  1030. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/timing.json +0 -1
  1031. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/eval_metadata.json +0 -32
  1032. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/grading.json +0 -10
  1033. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/code-changes.md +0 -387
  1034. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/execution-plan.md +0 -112
  1035. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/pr-description.md +0 -51
  1036. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/verification-strategy.md +0 -75
  1037. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/timing.json +0 -1
  1038. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/grading.json +0 -10
  1039. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/code-changes.md +0 -529
  1040. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/execution-plan.md +0 -127
  1041. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/pr-description.md +0 -42
  1042. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/verification-strategy.md +0 -120
  1043. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/timing.json +0 -1
  1044. package/.opencode/skills/work-with-pr-workspace/iteration-1/review.html +0 -1326
  1045. package/dist/config/schema/codegraph.d.ts +0 -12
  1046. package/dist/config/schema/start-work.d.ts +0 -5
  1047. package/dist/features/builtin-commands/templates/start-work.d.ts +0 -1
  1048. package/dist/features/builtin-skills/index.d.ts +0 -1
  1049. package/dist/features/builtin-skills/skill-file-loader.d.ts +0 -1
  1050. package/dist/features/builtin-skills/skills/agent-browser-skill.d.ts +0 -1
  1051. package/dist/features/builtin-skills/skills/agent-browser-template.d.ts +0 -1
  1052. package/dist/features/builtin-skills/skills/debugging.d.ts +0 -1
  1053. package/dist/features/builtin-skills/skills/dev-browser.d.ts +0 -1
  1054. package/dist/features/builtin-skills/skills/frontend.d.ts +0 -1
  1055. package/dist/features/builtin-skills/skills/git-master-sections/commit-atomic-planning.d.ts +0 -1
  1056. package/dist/features/builtin-skills/skills/git-master-sections/commit-context-analysis.d.ts +0 -1
  1057. package/dist/features/builtin-skills/skills/git-master-sections/commit-execution-verification.d.ts +0 -1
  1058. package/dist/features/builtin-skills/skills/git-master-sections/commit-workflow.d.ts +0 -1
  1059. package/dist/features/builtin-skills/skills/git-master-sections/history-search-workflow.d.ts +0 -1
  1060. package/dist/features/builtin-skills/skills/git-master-sections/overview.d.ts +0 -1
  1061. package/dist/features/builtin-skills/skills/git-master-sections/quick-reference.d.ts +0 -1
  1062. package/dist/features/builtin-skills/skills/git-master-sections/rebase-workflow.d.ts +0 -1
  1063. package/dist/features/builtin-skills/skills/git-master-skill-metadata.d.ts +0 -1
  1064. package/dist/features/builtin-skills/skills/git-master.d.ts +0 -1
  1065. package/dist/features/builtin-skills/skills/index.d.ts +0 -1
  1066. package/dist/features/builtin-skills/skills/init-deep.d.ts +0 -1
  1067. package/dist/features/builtin-skills/skills/playwright-cli.d.ts +0 -1
  1068. package/dist/features/builtin-skills/skills/playwright-mcp-skill.d.ts +0 -1
  1069. package/dist/features/builtin-skills/skills/playwright.d.ts +0 -1
  1070. package/dist/features/builtin-skills/skills/remove-ai-slops.d.ts +0 -1
  1071. package/dist/features/builtin-skills/skills/review-work.d.ts +0 -1
  1072. package/dist/features/builtin-skills/skills/security-research.d.ts +0 -1
  1073. package/dist/features/builtin-skills/skills/security-review.d.ts +0 -1
  1074. package/dist/features/builtin-skills/skills/team-mode.d.ts +0 -1
  1075. package/dist/features/builtin-skills/skills/visual-qa.d.ts +0 -1
  1076. package/dist/features/builtin-skills/skills.d.ts +0 -1
  1077. package/dist/features/builtin-skills/types.d.ts +0 -1
  1078. package/dist/features/claude-code-plugin-loader/agent-loader.d.ts +0 -1
  1079. package/dist/features/claude-code-plugin-loader/command-loader.d.ts +0 -1
  1080. package/dist/features/claude-code-plugin-loader/discovery-core.d.ts +0 -1
  1081. package/dist/features/claude-code-plugin-loader/discovery-paths.d.ts +0 -1
  1082. package/dist/features/claude-code-plugin-loader/discovery.d.ts +0 -1
  1083. package/dist/features/claude-code-plugin-loader/hook-loader.d.ts +0 -1
  1084. package/dist/features/claude-code-plugin-loader/index.d.ts +0 -1
  1085. package/dist/features/claude-code-plugin-loader/install-path-resolver.d.ts +0 -1
  1086. package/dist/features/claude-code-plugin-loader/installed-plugin-database.d.ts +0 -1
  1087. package/dist/features/claude-code-plugin-loader/loaded-plugin.d.ts +0 -1
  1088. package/dist/features/claude-code-plugin-loader/loader.d.ts +0 -1
  1089. package/dist/features/claude-code-plugin-loader/mcp-server-loader.d.ts +0 -1
  1090. package/dist/features/claude-code-plugin-loader/plugin-key.d.ts +0 -1
  1091. package/dist/features/claude-code-plugin-loader/plugin-manifest.d.ts +0 -1
  1092. package/dist/features/claude-code-plugin-loader/plugin-path-resolver.d.ts +0 -1
  1093. package/dist/features/claude-code-plugin-loader/plugin-settings.d.ts +0 -1
  1094. package/dist/features/claude-code-plugin-loader/scope-filter.d.ts +0 -1
  1095. package/dist/features/claude-code-plugin-loader/skill-loader.d.ts +0 -1
  1096. package/dist/features/claude-code-plugin-loader/types.d.ts +0 -1
  1097. package/dist/hooks/codegraph-bootstrap/command-runner.d.ts +0 -17
  1098. package/dist/hooks/codegraph-bootstrap/hook.d.ts +0 -35
  1099. package/dist/hooks/codegraph-bootstrap/index.d.ts +0 -1
  1100. package/dist/hooks/codegraph-bootstrap/project-root.d.ts +0 -1
  1101. package/dist/hooks/codegraph-bootstrap/status.d.ts +0 -11
  1102. package/dist/hooks/ralph-loop/completion-promise-detector-test-input.d.ts +0 -11
  1103. package/dist/hooks/ralph-loop/loop-session-recovery.d.ts +0 -7
  1104. package/dist/hooks/start-work/start-work-hook.d.ts +0 -23
  1105. package/dist/mcp/codegraph.d.ts +0 -16
  1106. package/dist/plugin/chat-message/start-work-message.d.ts +0 -5
  1107. package/dist/shared/prompt-async-gate/message-inspection-error.d.ts +0 -1
  1108. package/dist/shared/prompt-async-gate/pending-tool-turn.d.ts +0 -1
  1109. package/dist/shared/prompt-async-gate/prompt-message-state.d.ts +0 -1
  1110. package/dist/shared/prompt-async-gate/queue.d.ts +0 -1
  1111. package/dist/shared/prompt-async-gate/recent-dispatches.d.ts +0 -1
  1112. package/dist/shared/prompt-async-gate/reservations.d.ts +0 -1
  1113. package/dist/shared/prompt-async-gate/semantic-dedupe.d.ts +0 -1
  1114. package/dist/shared/prompt-async-gate/session-idle-dispatch.d.ts +0 -1
  1115. package/dist/shared/prompt-async-gate/timing.d.ts +0 -1
  1116. package/dist/shared/prompt-async-gate/types.d.ts +0 -1
  1117. package/dist/skills/data-scientist/references/common-scenarios.md +0 -176
  1118. package/dist/skills/data-scientist/references/execution-templates.md +0 -197
  1119. package/dist/skills/data-scientist/references/integration-patterns.md +0 -153
  1120. package/dist/skills/data-scientist/references/performance-benchmarks.md +0 -37
  1121. package/dist/skills/visual-qa/references/agent-browser-setup.md +0 -45
  1122. package/dist/tools/call-omo-agent/background-agent-executor.d.ts +0 -5
  1123. package/dist/tools/call-omo-agent/message-storage-directory.d.ts +0 -1
  1124. package/dist/tools/delegate-task/anthropic-categories.d.ts +0 -2
  1125. package/dist/tools/delegate-task/model-string-parser.d.ts +0 -1
  1126. package/packages/lsp-tools-mcp/dist/lsp/cleanup-errors.d.ts +0 -1
  1127. package/packages/lsp-tools-mcp/dist/lsp/constants.d.ts +0 -1
  1128. package/packages/lsp-tools-mcp/dist/lsp/language-mappings.d.ts +0 -1
  1129. package/packages/lsp-tools-mcp/dist/lsp/process-signal-cleanup.d.ts +0 -1
  1130. package/packages/lsp-tools-mcp/dist/missing-dependency-result.d.ts +0 -1
  1131. package/packages/omo-codex/plugin/components/codegraph/AGENTS.md +0 -58
  1132. package/packages/omo-codex/plugin/components/codegraph/NODE-RUNTIME-LICENSES.md +0 -2951
  1133. package/packages/omo-codex/plugin/components/codegraph/NOTICE +0 -16
  1134. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +0 -12244
  1135. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +0 -9842
  1136. package/packages/omo-codex/plugin/components/codegraph/package.json +0 -33
  1137. package/packages/omo-codex/plugin/components/codegraph/src/cache-gc.ts +0 -29
  1138. package/packages/omo-codex/plugin/components/codegraph/src/cli.ts +0 -79
  1139. package/packages/omo-codex/plugin/components/codegraph/src/hook-input.ts +0 -33
  1140. package/packages/omo-codex/plugin/components/codegraph/src/hook-sweep.ts +0 -25
  1141. package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +0 -131
  1142. package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +0 -258
  1143. package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +0 -309
  1144. package/packages/omo-codex/plugin/components/codegraph/src/mcp-unavailable.ts +0 -80
  1145. package/packages/omo-codex/plugin/components/codegraph/src/post-tool-use-hook.ts +0 -34
  1146. package/packages/omo-codex/plugin/components/codegraph/src/serve-invocation.ts +0 -29
  1147. package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +0 -263
  1148. package/packages/omo-codex/plugin/components/codegraph/src/session-start-command.ts +0 -106
  1149. package/packages/omo-codex/plugin/components/codegraph/src/session-start-cooldown.ts +0 -145
  1150. package/packages/omo-codex/plugin/components/codegraph/src/session-start-hook-runtime.ts +0 -21
  1151. package/packages/omo-codex/plugin/components/codegraph/src/session-start-lock.ts +0 -139
  1152. package/packages/omo-codex/plugin/components/codegraph/src/session-start-outcome.ts +0 -15
  1153. package/packages/omo-codex/plugin/components/codegraph/src/session-start-paths.ts +0 -32
  1154. package/packages/omo-codex/plugin/components/codegraph/src/session-start-project.ts +0 -109
  1155. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker-result.ts +0 -148
  1156. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +0 -175
  1157. package/packages/omo-codex/plugin/components/codegraph/src/sweep-cli.ts +0 -81
  1158. package/packages/omo-codex/plugin/components/codegraph/test/cache-gc.test.ts +0 -34
  1159. package/packages/omo-codex/plugin/components/codegraph/test/hook-exclusion.test.ts +0 -112
  1160. package/packages/omo-codex/plugin/components/codegraph/test/hook-registration.test.ts +0 -26
  1161. package/packages/omo-codex/plugin/components/codegraph/test/hook-session-start-guard.test.ts +0 -160
  1162. package/packages/omo-codex/plugin/components/codegraph/test/hook-store-upgrade.test.ts +0 -50
  1163. package/packages/omo-codex/plugin/components/codegraph/test/hook-sweep.test.ts +0 -29
  1164. package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +0 -320
  1165. package/packages/omo-codex/plugin/components/codegraph/test/mcp-bridge-fixtures.ts +0 -172
  1166. package/packages/omo-codex/plugin/components/codegraph/test/package-runtime.test.ts +0 -91
  1167. package/packages/omo-codex/plugin/components/codegraph/test/provisioned-node-guard.test.ts +0 -100
  1168. package/packages/omo-codex/plugin/components/codegraph/test/serve-built-wrapper.test.ts +0 -76
  1169. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge-lifecycle.test.ts +0 -133
  1170. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +0 -245
  1171. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-facade.test.ts +0 -69
  1172. package/packages/omo-codex/plugin/components/codegraph/test/serve-node-support.test.ts +0 -43
  1173. package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +0 -147
  1174. package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable.test.ts +0 -175
  1175. package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +0 -385
  1176. package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts +0 -206
  1177. package/packages/omo-codex/plugin/components/codegraph/test/session-start-project.test.ts +0 -58
  1178. package/packages/omo-codex/plugin/components/codegraph/test/session-start-state.test.ts +0 -104
  1179. package/packages/omo-codex/plugin/components/codegraph/test/session-start-trust-boundary.test.ts +0 -65
  1180. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-availability.test.ts +0 -106
  1181. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-cooldown.test.ts +0 -116
  1182. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +0 -258
  1183. package/packages/omo-codex/plugin/components/codegraph/test/sweep-cli.test.ts +0 -56
  1184. package/packages/omo-codex/plugin/components/codegraph/tsconfig.build.json +0 -13
  1185. package/packages/omo-codex/plugin/components/codegraph/tsconfig.json +0 -25
  1186. package/packages/omo-codex/plugin/components/start-work-continuation/LICENSE +0 -21
  1187. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +0 -28
  1188. package/packages/omo-codex/plugin/components/ultrawork/directive.md +0 -477
  1189. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +0 -18
  1190. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +0 -17
  1191. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +0 -17
  1192. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +0 -17
  1193. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/editor.mjs +0 -125
  1194. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/jsonc.mjs +0 -43
  1195. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/scaffold.mjs +0 -29
  1196. package/packages/omo-codex/plugin/scripts/migrate-omo-sot.mjs +0 -121
  1197. package/packages/omo-codex/plugin/skills/data-scientist/references/common-scenarios.md +0 -176
  1198. package/packages/omo-codex/plugin/skills/data-scientist/references/execution-templates.md +0 -197
  1199. package/packages/omo-codex/plugin/skills/data-scientist/references/integration-patterns.md +0 -153
  1200. package/packages/omo-codex/plugin/skills/data-scientist/references/performance-benchmarks.md +0 -37
  1201. package/packages/omo-codex/plugin/skills/start-work/agents/openai.yaml +0 -2
  1202. package/packages/omo-codex/plugin/skills/visual-qa/references/agent-browser-setup.md +0 -45
  1203. package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +0 -92
  1204. package/packages/omo-codex/plugin/test/component-codegraph-mcp-smoke.test.mjs +0 -76
  1205. package/packages/omo-codex/plugin/test/migrate-omo-sot.test.mjs +0 -179
  1206. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +0 -314
  1207. package/packages/omo-codex/plugin/test/ulw-plan-scope-contract.test.mjs +0 -24
  1208. package/packages/shared-skills/skills/data-scientist/references/common-scenarios.md +0 -176
  1209. package/packages/shared-skills/skills/data-scientist/references/execution-templates.md +0 -197
  1210. package/packages/shared-skills/skills/data-scientist/references/integration-patterns.md +0 -153
  1211. package/packages/shared-skills/skills/data-scientist/references/performance-benchmarks.md +0 -37
  1212. package/packages/shared-skills/skills/visual-qa/references/agent-browser-setup.md +0 -45
  1213. /package/dist/hooks/{start-work → ulw-execute}/context-info-formatters.d.ts +0 -0
  1214. /package/dist/hooks/{start-work → ulw-execute}/explicit-plan-context.d.ts +0 -0
  1215. /package/dist/hooks/{start-work → ulw-execute}/notepad-scaffold.d.ts +0 -0
  1216. /package/dist/hooks/{start-work → ulw-execute}/parse-user-request.d.ts +0 -0
  1217. /package/dist/hooks/{start-work → ulw-execute}/plan-discovery-context.d.ts +0 -0
  1218. /package/dist/hooks/{start-work → ulw-execute}/plan-selection.d.ts +0 -0
  1219. /package/dist/hooks/{start-work → ulw-execute}/session-plan-affinity.d.ts +0 -0
  1220. /package/dist/hooks/{start-work → ulw-execute}/work-initializer.d.ts +0 -0
  1221. /package/dist/hooks/{start-work → ulw-execute}/worktree-block.d.ts +0 -0
  1222. /package/dist/hooks/{start-work → ulw-execute}/worktree-detector.d.ts +0 -0
  1223. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/.gitattributes +0 -0
  1224. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/CHANGELOG.md +0 -0
  1225. /package/packages/omo-codex/plugin/components/{codegraph → ulw-execute-continuation}/LICENSE +0 -0
  1226. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/plan-checklist.ts +0 -0
  1227. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-completed.json +0 -0
  1228. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-mixed-platforms.json +0 -0
  1229. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-single-codex-work.json +0 -0
  1230. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-all-done.md +0 -0
  1231. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-scaffold.md +0 -0
  1232. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-nested-checkboxes.md +0 -0
  1233. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-unchecked.md +0 -0
  1234. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.build.json +0 -0
  1235. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.json +0 -0
  1236. /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))
3052
+ return;
3053
+ this.evictForAdmission();
3054
+ try {
3055
+ this.ensureRespawnAllowed(key, root, server.id);
3056
+ } catch {
2925
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,8 @@ 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";
3153
+ import { setTimeout as delay } from "node:timers/promises";
3017
3154
 
3018
3155
  // ../lsp-core/src/request-context.ts
3019
3156
  import { AsyncLocalStorage } from "node:async_hooks";
@@ -3022,18 +3159,17 @@ import { homedir } from "node:os";
3022
3159
  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
3160
 
3024
3161
  class LspRequestContextParseError extends Error {
3025
- code;
3026
- name = "LspRequestContextParseError";
3027
3162
  constructor(code, message) {
3028
3163
  super(message);
3029
3164
  this.code = code;
3165
+ this.name = "LspRequestContextParseError";
3030
3166
  }
3031
3167
  }
3032
3168
 
3033
3169
  class LspRequestContextUnavailableError extends Error {
3034
- name = "LspRequestContextUnavailableError";
3035
3170
  constructor() {
3036
3171
  super("LSP request context is required. Standalone MCP startup must install one with runWithRequestContext(createStandaloneMcpRequestContext()).");
3172
+ this.name = "LspRequestContextUnavailableError";
3037
3173
  }
3038
3174
  }
3039
3175
  var storage = new AsyncLocalStorage;
@@ -3053,7 +3189,7 @@ function contextCwd() {
3053
3189
  }
3054
3190
  function createStandaloneMcpRequestContext(input = {}) {
3055
3191
  const env = input.env ?? process.env;
3056
- const cwd = canonicalCwd(input.cwd ?? process.cwd());
3192
+ const cwd = canonicalCwd(input.cwd ?? env["LSP_TOOLS_MCP_CWD"] ?? process.cwd());
3057
3193
  const home = input.homeDir ?? homedir();
3058
3194
  const projectConfigPaths = translateProjectConfigEnv(env["LSP_TOOLS_MCP_PROJECT_CONFIG"], cwd);
3059
3195
  const userConfigPath = translateHomeConfigEnv(env["LSP_TOOLS_MCP_USER_CONFIG"], home, ".codex/lsp-client.json");
@@ -3191,7 +3327,6 @@ function isPlainRecord(value) {
3191
3327
 
3192
3328
  // src/daemon-request-error.ts
3193
3329
  class DaemonRequestError extends Error {
3194
- requestWritten;
3195
3330
  constructor(message, requestWritten) {
3196
3331
  super(message);
3197
3332
  this.name = "DaemonRequestError";
@@ -3214,7 +3349,6 @@ class DaemonRequestCancelledError extends DaemonRequestError {
3214
3349
  }
3215
3350
 
3216
3351
  class DaemonRequestTimedOutError extends DaemonRequestError {
3217
- timeoutMs;
3218
3352
  constructor(requestWritten, timeoutMs) {
3219
3353
  super("daemon request timed out", requestWritten);
3220
3354
  this.name = "DaemonRequestTimedOutError";
@@ -3293,14 +3427,12 @@ var PROTOCOL_ERROR_CODE = -32002;
3293
3427
  var AUTH_TOKEN_BYTES = 32;
3294
3428
 
3295
3429
  class UnsafePrivateDirectoryError extends Error {
3296
- path;
3297
- reason;
3298
- name = "UnsafePrivateDirectoryError";
3299
- code = "unsafe_private_directory";
3300
3430
  constructor(path, reason) {
3301
3431
  super(`unsafe private directory ${path}: ${reason}`);
3302
3432
  this.path = path;
3303
3433
  this.reason = reason;
3434
+ this.name = "UnsafePrivateDirectoryError";
3435
+ this.code = "unsafe_private_directory";
3304
3436
  }
3305
3437
  }
3306
3438
  function authEnvelope(token) {
@@ -3484,20 +3616,18 @@ var OMO_LSP_DAEMON_VERSION = "OMO_LSP_DAEMON_VERSION";
3484
3616
  var DAEMON_VERSION_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._+-]{0,127}$/;
3485
3617
 
3486
3618
  class InvalidRuntimeOverrideError extends Error {
3487
- code = "invalid_runtime_override";
3488
- reason;
3489
3619
  constructor(reason, message) {
3490
3620
  super(message);
3621
+ this.code = "invalid_runtime_override";
3491
3622
  this.name = "InvalidRuntimeOverrideError";
3492
3623
  this.reason = reason;
3493
3624
  }
3494
3625
  }
3495
3626
 
3496
3627
  class InvalidDaemonVersionError extends Error {
3497
- code = "invalid_daemon_version";
3498
- version;
3499
3628
  constructor(version) {
3500
3629
  super("LSP daemon version must match [A-Za-z0-9][A-Za-z0-9._+-]{0,127}");
3630
+ this.code = "invalid_daemon_version";
3501
3631
  this.name = "InvalidDaemonVersionError";
3502
3632
  this.version = version;
3503
3633
  }
@@ -3543,10 +3673,9 @@ var requireFromHere = createRequire(import.meta.url);
3543
3673
  var MAX_SOCKET_PATH_LENGTH = 100;
3544
3674
 
3545
3675
  class InvalidDaemonDirectoryError extends Error {
3546
- code = "invalid_daemon_directory";
3547
- directory;
3548
3676
  constructor(directory) {
3549
3677
  super(`${OMO_LSP_DAEMON_DIR} must be an absolute path`);
3678
+ this.code = "invalid_daemon_directory";
3550
3679
  this.name = "InvalidDaemonDirectoryError";
3551
3680
  this.directory = directory;
3552
3681
  }
@@ -3661,9 +3790,11 @@ function createLineDecoder(onMessage, onParseError) {
3661
3790
  }
3662
3791
 
3663
3792
  // src/ensure-daemon.ts
3664
- var PROBE_TIMEOUT_MS = 500;
3793
+ var PROBE_TIMEOUT_MS = 2000;
3665
3794
  var DEFAULT_READY_TIMEOUT_MS = 5000;
3666
3795
  var DEFAULT_POLL_INTERVAL_MS = 100;
3796
+ var FAILED_SPAWN_COOLDOWN_MS = 5000;
3797
+ var failedSpawnUntil = new Map;
3667
3798
 
3668
3799
  class DaemonUnreachableError extends Error {
3669
3800
  constructor(socketPath) {
@@ -3676,11 +3807,22 @@ async function ensureDaemonRunning(paths, deps = defaultEnsureDaemonDeps(), opti
3676
3807
  const pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
3677
3808
  const signal = options.signal;
3678
3809
  throwIfAborted(signal);
3679
- if (await awaitWithSignal2(deps.probe(paths, signal), signal))
3810
+ if (await awaitWithSignal2(deps.probe(paths, signal), signal)) {
3811
+ failedSpawnUntil.delete(paths.socket);
3680
3812
  return;
3813
+ }
3681
3814
  throwIfAborted(signal);
3815
+ const retryAt = failedSpawnUntil.get(paths.socket);
3816
+ if (retryAt !== undefined && deps.now() < retryAt)
3817
+ throw new DaemonUnreachableError(paths.socket);
3818
+ failedSpawnUntil.delete(paths.socket);
3682
3819
  deps.spawnDaemon(paths);
3683
- await waitUntilReachable(paths, deps, readyTimeoutMs, pollIntervalMs, signal);
3820
+ try {
3821
+ await waitUntilReachable(paths, deps, readyTimeoutMs, pollIntervalMs, signal);
3822
+ } catch (error) {
3823
+ failedSpawnUntil.set(paths.socket, deps.now() + FAILED_SPAWN_COOLDOWN_MS);
3824
+ throw error;
3825
+ }
3684
3826
  }
3685
3827
  async function waitUntilReachable(paths, deps, readyTimeoutMs, pollIntervalMs, signal) {
3686
3828
  const deadline = deps.now() + readyTimeoutMs;
@@ -3700,7 +3842,7 @@ async function probeDaemon(paths, timeoutMs = PROBE_TIMEOUT_MS, signal) {
3700
3842
  return await pingDaemon(paths, token, timeoutMs, signal) !== null;
3701
3843
  }
3702
3844
  function pingDaemon(paths, token, timeoutMs = PROBE_TIMEOUT_MS, signal) {
3703
- return new Promise((resolve7) => {
3845
+ return new Promise((resolve) => {
3704
3846
  const socket = new Socket;
3705
3847
  let settled = false;
3706
3848
  let timer;
@@ -3712,7 +3854,7 @@ function pingDaemon(paths, token, timeoutMs = PROBE_TIMEOUT_MS, signal) {
3712
3854
  clearTimeout(timer);
3713
3855
  signal?.removeEventListener("abort", onAbort);
3714
3856
  socket.destroy();
3715
- resolve7(value);
3857
+ resolve(value);
3716
3858
  };
3717
3859
  const onAbort = () => finish(null);
3718
3860
  const decoder = createLineDecoder((message) => {
@@ -3735,13 +3877,17 @@ function pingDaemon(paths, token, timeoutMs = PROBE_TIMEOUT_MS, signal) {
3735
3877
  socket.connect(paths.socket);
3736
3878
  });
3737
3879
  }
3738
- function spawnDaemonProcess(paths) {
3880
+ function spawnDaemonProcess(paths, deps = {}) {
3739
3881
  mkdirSync2(dirname6(paths.log), { recursive: true });
3740
3882
  const logFd = openSync2(paths.log, "a");
3741
3883
  try {
3742
- const child = spawn2(resolveDaemonNodeExecutable(), [paths.cliPath, "daemon"], {
3884
+ const spawnDaemonChild = deps.spawn ?? spawn2;
3885
+ const executable = deps.resolveExecutable?.() ?? resolveDaemonNodeExecutable();
3886
+ const child = spawnDaemonChild(executable, [paths.cliPath, "daemon"], {
3743
3887
  detached: true,
3744
- stdio: ["ignore", logFd, logFd]
3888
+ stdio: ["ignore", logFd, logFd],
3889
+ windowsHide: true,
3890
+ env: { ...process.env, BUN_BE_BUN: "1" }
3745
3891
  });
3746
3892
  child.once("spawn", () => closeSync2(logFd));
3747
3893
  child.once("error", (error) => {
@@ -3771,7 +3917,7 @@ function defaultEnsureDaemonDeps() {
3771
3917
  };
3772
3918
  }
3773
3919
  function sleepWithSignal(ms, signal) {
3774
- return new Promise((resolve7) => {
3920
+ return new Promise((resolve) => {
3775
3921
  let settled = false;
3776
3922
  const finish = () => {
3777
3923
  if (settled)
@@ -3779,7 +3925,7 @@ function sleepWithSignal(ms, signal) {
3779
3925
  settled = true;
3780
3926
  clearTimeout(timer);
3781
3927
  signal?.removeEventListener("abort", finish);
3782
- resolve7();
3928
+ resolve();
3783
3929
  };
3784
3930
  const timer = setTimeout(finish, ms);
3785
3931
  if (signal?.aborted) {
@@ -3794,7 +3940,7 @@ function awaitWithSignal2(promise, signal) {
3794
3940
  return promise;
3795
3941
  if (signal.aborted)
3796
3942
  return Promise.reject(abortError3(signal));
3797
- return new Promise((resolve7, reject) => {
3943
+ return new Promise((resolve, reject) => {
3798
3944
  let settled = false;
3799
3945
  const finish = (run) => {
3800
3946
  if (settled)
@@ -3805,7 +3951,7 @@ function awaitWithSignal2(promise, signal) {
3805
3951
  };
3806
3952
  const onAbort = () => finish(() => reject(abortError3(signal)));
3807
3953
  signal.addEventListener("abort", onAbort, { once: true });
3808
- promise.then((value) => finish(() => resolve7(value)), (error) => finish(() => reject(error)));
3954
+ promise.then((value) => finish(() => resolve(value)), (error) => finish(() => reject(error)));
3809
3955
  });
3810
3956
  }
3811
3957
  function throwIfAborted(signal) {
@@ -3834,18 +3980,18 @@ function parsePingResponse(message) {
3834
3980
  return null;
3835
3981
  if (!endpoint || typeof endpoint !== "object" || Array.isArray(endpoint))
3836
3982
  return null;
3837
- const path2 = Reflect.get(endpoint, "path");
3983
+ const path = Reflect.get(endpoint, "path");
3838
3984
  const kind = Reflect.get(endpoint, "kind");
3839
- if (typeof path2 !== "string")
3985
+ if (typeof path !== "string")
3840
3986
  return null;
3841
3987
  if (kind === "windows")
3842
- return { pid, nonce, startedAt, endpoint: { kind, path: path2 } };
3988
+ return { pid, nonce, startedAt, endpoint: { kind, path } };
3843
3989
  if (kind === "missing")
3844
- return { pid, nonce, startedAt, endpoint: { kind, path: path2 } };
3990
+ return { pid, nonce, startedAt, endpoint: { kind, path } };
3845
3991
  const dev = Reflect.get(endpoint, "dev");
3846
3992
  const ino = Reflect.get(endpoint, "ino");
3847
3993
  if (kind === "unix" && typeof dev === "number" && typeof ino === "number") {
3848
- return { pid, nonce, startedAt, endpoint: { kind, path: path2, dev, ino } };
3994
+ return { pid, nonce, startedAt, endpoint: { kind, path, dev, ino } };
3849
3995
  }
3850
3996
  return null;
3851
3997
  }
@@ -3893,7 +4039,7 @@ ${body}` : `${body}
3893
4039
  await writeChunk(output, payload);
3894
4040
  }
3895
4041
  function writeChunk(output, chunk) {
3896
- return new Promise((resolve7, reject) => {
4042
+ return new Promise((resolve, reject) => {
3897
4043
  let settled = false;
3898
4044
  const onError = (error) => {
3899
4045
  if (settled)
@@ -3913,7 +4059,7 @@ function writeChunk(output, chunk) {
3913
4059
  return;
3914
4060
  }
3915
4061
  output.removeListener("error", onError);
3916
- resolve7();
4062
+ resolve();
3917
4063
  });
3918
4064
  } catch (error) {
3919
4065
  output.removeListener("error", onError);
@@ -4022,6 +4168,7 @@ async function runJsonRpcStdioServer(config) {
4022
4168
  const idleTimer = createIdleTimer(idleTimeoutMs, log, () => {
4023
4169
  isClosed = true;
4024
4170
  config.onIdleTimeout?.();
4171
+ config.input.destroy();
4025
4172
  });
4026
4173
  const watchdog = createParentWatchdog(config.parentWatchdog, (parentPid, pollIntervalMs) => {
4027
4174
  isClosed = true;
@@ -4118,7 +4265,11 @@ function createParentWatchdog(config, onDeadParent) {
4118
4265
  const probeAlive = config.probeAlive ?? isProcessAlive;
4119
4266
  let fired = false;
4120
4267
  const timer = setInterval(() => {
4121
- if (fired || probeAlive(parentPid))
4268
+ if (fired)
4269
+ return;
4270
+ const alive = probeAlive(parentPid);
4271
+ config.onPoll?.(alive);
4272
+ if (alive)
4122
4273
  return;
4123
4274
  fired = true;
4124
4275
  onDeadParent(parentPid, pollIntervalMs);
@@ -4153,60 +4304,55 @@ function createIdleTimer(idleTimeoutMs, log, onTimeout) {
4153
4304
  };
4154
4305
  }
4155
4306
  // ../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";
4307
+ import { existsSync as existsSync11, realpathSync as realpathSync5, statSync as statSync4 } from "node:fs";
4308
+ import { basename as basename3, dirname as dirname10, join as join5, resolve as resolve8 } from "node:path";
4158
4309
 
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 {};
4310
+ // ../lsp-core/src/lsp/outside-context-workspace.ts
4311
+ import { existsSync as existsSync7, realpathSync as realpathSync4 } from "node:fs";
4312
+ import { dirname as dirname7, join as join3 } from "node:path";
4313
+
4314
+ // ../lsp-core/src/lsp/workspace-markers.ts
4315
+ var GIT_WORKSPACE_MARKER = ".git";
4316
+ var PROJECT_WORKSPACE_MARKERS = [
4317
+ "package.json",
4318
+ "pyproject.toml",
4319
+ "Cargo.toml",
4320
+ "go.mod",
4321
+ "pom.xml",
4322
+ "build.gradle"
4323
+ ];
4324
+ var WORKSPACE_MARKERS = [GIT_WORKSPACE_MARKER, ...PROJECT_WORKSPACE_MARKERS];
4325
+
4326
+ // ../lsp-core/src/lsp/outside-context-workspace.ts
4327
+ function findWorkspaceRootOutsideContext(directory) {
4328
+ const marked = nearestMarkedAncestor(directory);
4329
+ if (marked !== undefined)
4330
+ return marked;
4331
+ return realpathSync4(nearestExistingAncestor(directory));
4332
+ }
4333
+ function nearestMarkedAncestor(directory) {
4334
+ let current = directory;
4335
+ for (;; ) {
4336
+ if (existsSync7(current) && WORKSPACE_MARKERS.some((marker) => existsSync7(join3(current, marker)))) {
4337
+ return realpathSync4(current);
4338
+ }
4339
+ const parent = dirname7(current);
4340
+ if (parent === current)
4341
+ return;
4342
+ current = parent;
4174
4343
  }
4175
4344
  }
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);
4345
+ function nearestExistingAncestor(directory) {
4346
+ let current = directory;
4347
+ while (!existsSync7(current)) {
4348
+ const parent = dirname7(current);
4349
+ if (parent === current)
4350
+ return current;
4351
+ current = parent;
4352
+ }
4353
+ return current;
4205
4354
  }
4206
4355
 
4207
- // ../lsp-core/src/lsp/config-loader.ts
4208
- import { existsSync as existsSync8, readFileSync as readFileSync5 } from "node:fs";
4209
-
4210
4356
  // ../lsp-core/src/lsp/server-definitions.ts
4211
4357
  var LSP_INSTALL_HINTS = {
4212
4358
  typescript: "npm install -g typescript-language-server typescript",
@@ -4252,6 +4398,26 @@ var LSP_INSTALL_HINTS = {
4252
4398
  julials: `julia -e 'using Pkg; Pkg.add("LanguageServer")'`,
4253
4399
  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
4400
  };
4401
+ var LSP_LOCAL_INSTALL_HINTS = {
4402
+ typescript: "bun add -d typescript-language-server typescript",
4403
+ vue: "bun add -d @vue/language-server",
4404
+ eslint: "bun add -d vscode-langservers-extracted",
4405
+ oxlint: "bun add -d oxlint",
4406
+ biome: "bun add -d @biomejs/biome",
4407
+ svelte: "bun add -d svelte-language-server",
4408
+ astro: "bun add -d @astrojs/language-server",
4409
+ bash: "bun add -d bash-language-server",
4410
+ "bash-ls": "bun add -d bash-language-server",
4411
+ "yaml-ls": "bun add -d yaml-language-server",
4412
+ php: "bun add -d intelephense",
4413
+ prisma: "bun add -d prisma",
4414
+ dockerfile: "bun add -d dockerfile-language-server-nodejs",
4415
+ pyright: "uv add --dev pyright",
4416
+ basedpyright: "uv add --dev basedpyright",
4417
+ ruff: "uv add --dev ruff",
4418
+ ty: "uv add --dev ty",
4419
+ "ruby-lsp": "bundle add ruby-lsp --group development"
4420
+ };
4255
4421
  var BUILTIN_SERVERS = {
4256
4422
  typescript: {
4257
4423
  command: ["typescript-language-server", "--stdio"],
@@ -4354,18 +4520,67 @@ var BUILTIN_SERVERS = {
4354
4520
  }
4355
4521
  };
4356
4522
 
4523
+ // ../lsp-core/src/lsp/server-install-state.ts
4524
+ import { existsSync as existsSync8, mkdirSync as mkdirSync3, readFileSync as readFileSync4, renameSync as renameSync2, writeFileSync as writeFileSync2 } from "node:fs";
4525
+ import { dirname as dirname8 } from "node:path";
4526
+ function getInstallDecisionsPath() {
4527
+ return lspRequestContext().installDecisionsPath;
4528
+ }
4529
+ function loadInstallDecisions() {
4530
+ const path = getInstallDecisionsPath();
4531
+ if (!existsSync8(path))
4532
+ return {};
4533
+ try {
4534
+ const parsed = JSON.parse(readFileSync4(path, "utf8"));
4535
+ return isInstallDecisions(parsed) ? parsed : {};
4536
+ } catch {
4537
+ return {};
4538
+ }
4539
+ }
4540
+ function loadInstallDecision(serverId) {
4541
+ return loadInstallDecisions()[serverId];
4542
+ }
4543
+ function recordInstallDecision(serverId, decision, decidedAt = new Date().toISOString()) {
4544
+ const decisions = loadInstallDecisions();
4545
+ decisions[serverId] = { decision, decidedAt };
4546
+ writeInstallDecisions(decisions);
4547
+ }
4548
+ function isInstallDecision(value) {
4549
+ return value === "declined" || value === "allowed";
4550
+ }
4551
+ function writeInstallDecisions(decisions) {
4552
+ const path = getInstallDecisionsPath();
4553
+ mkdirSync3(dirname8(path), { recursive: true });
4554
+ const tmpPath = `${path}.tmp`;
4555
+ writeFileSync2(tmpPath, `${JSON.stringify(decisions, null, 2)}
4556
+ `, "utf8");
4557
+ renameSync2(tmpPath, path);
4558
+ }
4559
+ function isInstallDecisions(value) {
4560
+ return isRecord5(value) && Object.values(value).every(isInstallDecisionRecord);
4561
+ }
4562
+ function isInstallDecisionRecord(value) {
4563
+ if (!isRecord5(value))
4564
+ return false;
4565
+ return isInstallDecision(value["decision"]) && typeof value["decidedAt"] === "string";
4566
+ }
4567
+ function isRecord5(value) {
4568
+ return typeof value === "object" && value !== null && !Array.isArray(value);
4569
+ }
4570
+
4357
4571
  // ../lsp-core/src/lsp/config-loader.ts
4572
+ import { existsSync as existsSync9, readFileSync as readFileSync5 } from "node:fs";
4358
4573
  function getProjectConfigPaths() {
4359
4574
  return lspRequestContext().projectConfigPaths;
4360
4575
  }
4361
4576
  function getUserConfigPath() {
4362
4577
  return lspRequestContext().userConfigPath;
4363
4578
  }
4364
- function loadJsonFile(path2) {
4365
- if (!existsSync8(path2))
4579
+ function loadJsonFile(path) {
4580
+ if (!existsSync9(path))
4366
4581
  return null;
4367
4582
  try {
4368
- const parsed = JSON.parse(readFileSync5(path2, "utf-8"));
4583
+ const parsed = JSON.parse(readFileSync5(path, "utf-8"));
4369
4584
  return isConfigJson(parsed) ? parsed : null;
4370
4585
  } catch {
4371
4586
  return null;
@@ -4382,8 +4597,8 @@ function loadAllConfigs() {
4382
4597
  return configs;
4383
4598
  }
4384
4599
  function loadFirstJsonFile(paths) {
4385
- for (const path2 of paths) {
4386
- const config = loadJsonFile(path2);
4600
+ for (const path of paths) {
4601
+ const config = loadJsonFile(path);
4387
4602
  if (config)
4388
4603
  return config;
4389
4604
  }
@@ -4409,10 +4624,10 @@ function getMergedServers() {
4409
4624
  }
4410
4625
  if (seen.has(id))
4411
4626
  continue;
4412
- const server2 = createServerFromEntry(id, entry, source);
4413
- if (!server2)
4627
+ const server = createServerFromEntry(id, entry, source);
4628
+ if (!server)
4414
4629
  continue;
4415
- servers.push(server2);
4630
+ servers.push(server);
4416
4631
  seen.add(id);
4417
4632
  }
4418
4633
  }
@@ -4444,7 +4659,7 @@ function createServerFromEntry(id, entry, source) {
4444
4659
  if (source === "project") {
4445
4660
  if (!builtin)
4446
4661
  return null;
4447
- const server3 = createServer({
4662
+ const server = createServer({
4448
4663
  id,
4449
4664
  command: builtin.command,
4450
4665
  extensions: entry.extensions ?? builtin.extensions,
@@ -4452,35 +4667,35 @@ function createServerFromEntry(id, entry, source) {
4452
4667
  source
4453
4668
  });
4454
4669
  if (entry.initialization !== undefined) {
4455
- server3.initialization = entry.initialization;
4670
+ server.initialization = entry.initialization;
4456
4671
  }
4457
- return server3;
4672
+ return server;
4458
4673
  }
4459
4674
  if (entry.command && entry.extensions) {
4460
- const server3 = createServer({
4675
+ const server = createServer({
4461
4676
  id,
4462
4677
  command: entry.command,
4463
4678
  extensions: entry.extensions,
4464
4679
  priority: entry.priority ?? 0,
4465
4680
  source
4466
4681
  });
4467
- applyOptionalServerFields(server3, entry);
4468
- return server3;
4682
+ applyOptionalServerFields(server, entry);
4683
+ return server;
4469
4684
  }
4470
4685
  if (!builtin)
4471
4686
  return null;
4472
- const server2 = createServer({
4687
+ const server = createServer({
4473
4688
  id,
4474
4689
  command: entry.command ?? builtin.command,
4475
4690
  extensions: entry.extensions ?? builtin.extensions,
4476
4691
  priority: entry.priority ?? 0,
4477
4692
  source
4478
4693
  });
4479
- applyOptionalServerFields(server2, entry);
4480
- return server2;
4694
+ applyOptionalServerFields(server, entry);
4695
+ return server;
4481
4696
  }
4482
4697
  function createServer(input) {
4483
- const server2 = {
4698
+ const server = {
4484
4699
  id: input.id,
4485
4700
  command: input.command,
4486
4701
  extensions: input.extensions,
@@ -4488,19 +4703,19 @@ function createServer(input) {
4488
4703
  source: input.source
4489
4704
  };
4490
4705
  if (input.env !== undefined) {
4491
- server2.env = input.env;
4706
+ server.env = input.env;
4492
4707
  }
4493
4708
  if (input.initialization !== undefined) {
4494
- server2.initialization = input.initialization;
4709
+ server.initialization = input.initialization;
4495
4710
  }
4496
- return server2;
4711
+ return server;
4497
4712
  }
4498
- function applyOptionalServerFields(server2, entry) {
4713
+ function applyOptionalServerFields(server, entry) {
4499
4714
  if (entry.env !== undefined) {
4500
- server2.env = entry.env;
4715
+ server.env = entry.env;
4501
4716
  }
4502
4717
  if (entry.initialization !== undefined) {
4503
- server2.initialization = entry.initialization;
4718
+ server.initialization = entry.initialization;
4504
4719
  }
4505
4720
  }
4506
4721
  function isConfigJson(value) {
@@ -4550,64 +4765,165 @@ function getDisabledServerIds() {
4550
4765
  }
4551
4766
 
4552
4767
  // ../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;
4768
+ import { existsSync as existsSync10 } from "node:fs";
4769
+ import { delimiter as delimiter3, dirname as dirname9, isAbsolute as isAbsolute5, join as join4, resolve as resolve7 } from "node:path";
4770
+ var LOCAL_BIN_RULES = [
4771
+ {
4772
+ markers: ["package.json", "bun.lock", "bun.lockb", "package-lock.json", "yarn.lock", "pnpm-lock.yaml"],
4773
+ binDirs: [join4("node_modules", ".bin")]
4774
+ },
4775
+ {
4776
+ markers: [
4777
+ "pyproject.toml",
4778
+ "ty.toml",
4779
+ "requirements.txt",
4780
+ "setup.py",
4781
+ "setup.cfg",
4782
+ "Pipfile",
4783
+ "pyrightconfig.json",
4784
+ "ruff.toml",
4785
+ ".ruff.toml"
4786
+ ],
4787
+ binDirs: [
4788
+ join4(".venv", "bin"),
4789
+ join4(".venv", "Scripts"),
4790
+ join4("venv", "bin"),
4791
+ join4("venv", "Scripts"),
4792
+ join4(".env", "bin"),
4793
+ join4(".env", "Scripts")
4794
+ ]
4795
+ },
4796
+ {
4797
+ markers: ["Gemfile", "Gemfile.lock"],
4798
+ binDirs: [join4("vendor", "bundle", "bin"), "bin"]
4799
+ },
4800
+ {
4801
+ markers: ["go.mod", "go.sum", "go.work"],
4802
+ binDirs: ["bin"]
4564
4803
  }
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"];
4804
+ ];
4805
+ var resolutionCache = new Map;
4806
+ var probeCount = 0;
4807
+ function probe(path) {
4808
+ probeCount += 1;
4809
+ return existsSync10(path);
4810
+ }
4811
+ function executableSuffixes(platform, pathExt) {
4812
+ if (platform !== "win32")
4813
+ return [""];
4814
+ const configured = pathExt ?? process.env["PATHEXT"] ?? "";
4815
+ const systemExts = configured.split(";").filter((entry) => entry.length > 0).map((entry) => entry.toLowerCase());
4816
+ return [...new Set(["", ...systemExts, ".exe", ".cmd", ".bat", ".ps1"])];
4817
+ }
4818
+ function probeWithSuffixes(directory, command, suffixes) {
4819
+ for (const suffix of suffixes) {
4820
+ const candidate = join4(directory, command + suffix);
4821
+ if (probe(candidate))
4822
+ return candidate;
4823
+ }
4824
+ return null;
4825
+ }
4826
+ function resolveLocal(command, workingDirectory, suffixes, stopAt) {
4827
+ const boundary = stopAt === undefined ? undefined : resolve7(stopAt);
4828
+ let current = resolve7(workingDirectory);
4829
+ while (true) {
4830
+ for (const rule of LOCAL_BIN_RULES) {
4831
+ if (!rule.markers.some((marker) => probe(join4(current, marker))))
4832
+ continue;
4833
+ for (const binDir of rule.binDirs) {
4834
+ const found = probeWithSuffixes(join4(current, binDir), command, suffixes);
4835
+ if (found !== null)
4836
+ return found;
4837
+ }
4574
4838
  }
4839
+ if (probe(join4(current, ".git")))
4840
+ return null;
4841
+ if (boundary !== undefined && current === boundary)
4842
+ return null;
4843
+ const parent = dirname9(current);
4844
+ if (parent === current)
4845
+ return null;
4846
+ current = parent;
4575
4847
  }
4576
- let pathEnv = process.env["PATH"] ?? "";
4577
- if (isWindows && !pathEnv) {
4848
+ }
4849
+ function resolveFromPath(command, suffixes, platform, pathEnvOverride) {
4850
+ let pathEnv = pathEnvOverride ?? process.env["PATH"] ?? "";
4851
+ if (platform === "win32" && !pathEnv) {
4578
4852
  pathEnv = process.env["Path"] ?? "";
4579
4853
  }
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
- }
4854
+ for (const entry of pathEnv.split(delimiter3)) {
4855
+ if (entry.length === 0)
4856
+ continue;
4857
+ const found = probeWithSuffixes(entry, command, suffixes);
4858
+ if (found !== null)
4859
+ return found;
4587
4860
  }
4588
- if (cmd === "node")
4589
- return true;
4590
- return false;
4861
+ return null;
4862
+ }
4863
+ function resolveServerBinary(command, workingDirectory, options = {}) {
4864
+ if (command.length === 0)
4865
+ return null;
4866
+ const [cmd] = command;
4867
+ if (cmd === undefined || cmd.length === 0)
4868
+ return null;
4869
+ const platform = options.platform ?? process.platform;
4870
+ const suffixes = executableSuffixes(platform, options.pathExt);
4871
+ if (cmd.includes("/") || cmd.includes("\\")) {
4872
+ const explicit = isAbsolute5(cmd) ? cmd : resolve7(workingDirectory ?? process.cwd(), cmd);
4873
+ return probe(explicit) ? explicit : null;
4874
+ }
4875
+ const cacheKey = JSON.stringify([
4876
+ workingDirectory ?? "",
4877
+ cmd,
4878
+ platform,
4879
+ options.stopAt ?? "",
4880
+ options.pathExt ?? "",
4881
+ options.pathEnv ?? process.env["PATH"] ?? ""
4882
+ ]);
4883
+ const cached = resolutionCache.get(cacheKey);
4884
+ if (cached !== undefined)
4885
+ return cached;
4886
+ let resolved = null;
4887
+ if (workingDirectory !== undefined && workingDirectory.length > 0) {
4888
+ resolved = resolveLocal(cmd, workingDirectory, suffixes, options.stopAt);
4889
+ }
4890
+ resolved ??= resolveFromPath(cmd, suffixes, platform, options.pathEnv);
4891
+ if (resolved === null && cmd === "node")
4892
+ resolved = cmd;
4893
+ resolutionCache.set(cacheKey, resolved);
4894
+ return resolved;
4895
+ }
4896
+ function isServerInstalled(command, workingDirectory, options = {}) {
4897
+ if (command.length === 0)
4898
+ return false;
4899
+ return resolveServerBinary(command, workingDirectory, options) !== null;
4591
4900
  }
4592
4901
 
4593
4902
  // ../lsp-core/src/lsp/server-resolution.ts
4903
+ function withResolvedCommand(command, binaryPath) {
4904
+ return [binaryPath, ...command.slice(1)];
4905
+ }
4594
4906
  function findServerForExtension(ext) {
4595
4907
  const servers = getMergedServers();
4596
- for (const server2 of servers) {
4597
- if (server2.extensions.includes(ext) && isServerInstalled(server2.command)) {
4908
+ const workingDirectory = contextCwd();
4909
+ for (const server of servers) {
4910
+ if (!server.extensions.includes(ext))
4911
+ continue;
4912
+ const binaryPath = resolveServerBinary(server.command, workingDirectory);
4913
+ if (binaryPath !== null) {
4598
4914
  const resolvedServer = {
4599
- id: server2.id,
4600
- command: server2.command,
4601
- extensions: server2.extensions,
4602
- priority: server2.priority
4915
+ id: server.id,
4916
+ command: withResolvedCommand(server.command, binaryPath),
4917
+ extensions: server.extensions,
4918
+ priority: server.priority
4603
4919
  };
4604
- if (server2.env !== undefined) {
4920
+ if (server.env !== undefined) {
4605
4921
  return {
4606
4922
  status: "found",
4607
4923
  server: {
4608
4924
  ...resolvedServer,
4609
- env: server2.env,
4610
- ...server2.initialization === undefined ? {} : { initialization: server2.initialization }
4925
+ env: server.env,
4926
+ ...server.initialization === undefined ? {} : { initialization: server.initialization }
4611
4927
  }
4612
4928
  };
4613
4929
  }
@@ -4615,20 +4931,20 @@ function findServerForExtension(ext) {
4615
4931
  status: "found",
4616
4932
  server: {
4617
4933
  ...resolvedServer,
4618
- ...server2.initialization === undefined ? {} : { initialization: server2.initialization }
4934
+ ...server.initialization === undefined ? {} : { initialization: server.initialization }
4619
4935
  }
4620
4936
  };
4621
4937
  }
4622
4938
  }
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`;
4939
+ for (const server of servers) {
4940
+ if (server.extensions.includes(ext)) {
4941
+ const installHint = LSP_INSTALL_HINTS[server.id] ?? `Install '${server.command[0]}' and ensure it's in your PATH`;
4626
4942
  return {
4627
4943
  status: "not_installed",
4628
4944
  server: {
4629
- id: server2.id,
4630
- command: server2.command,
4631
- extensions: server2.extensions
4945
+ id: server.id,
4946
+ command: server.command,
4947
+ extensions: server.extensions
4632
4948
  },
4633
4949
  installHint
4634
4950
  };
@@ -4644,20 +4960,21 @@ function findServerForExtension(ext) {
4644
4960
  function getAllServers() {
4645
4961
  const servers = getMergedServers();
4646
4962
  const disabled = getDisabledServerIds();
4963
+ const workingDirectory = contextCwd();
4647
4964
  const result = [];
4648
4965
  const seen = new Set;
4649
- for (const server2 of servers) {
4650
- if (seen.has(server2.id))
4966
+ for (const server of servers) {
4967
+ if (seen.has(server.id))
4651
4968
  continue;
4652
4969
  result.push({
4653
- id: server2.id,
4654
- installed: isServerInstalled(server2.command),
4655
- extensions: server2.extensions,
4970
+ id: server.id,
4971
+ installed: isServerInstalled(server.command, workingDirectory),
4972
+ extensions: server.extensions,
4656
4973
  disabled: false,
4657
- source: server2.source,
4658
- priority: server2.priority
4974
+ source: server.source,
4975
+ priority: server.priority
4659
4976
  });
4660
- seen.add(server2.id);
4977
+ seen.add(server.id);
4661
4978
  }
4662
4979
  for (const id of disabled) {
4663
4980
  if (seen.has(id))
@@ -4665,7 +4982,7 @@ function getAllServers() {
4665
4982
  const builtin = BUILTIN_SERVERS[id];
4666
4983
  result.push({
4667
4984
  id,
4668
- installed: builtin ? isServerInstalled(builtin.command) : false,
4985
+ installed: builtin ? isServerInstalled(builtin.command, workingDirectory) : false,
4669
4986
  extensions: builtin?.extensions ?? [],
4670
4987
  disabled: true,
4671
4988
  source: "disabled",
@@ -4676,7 +4993,6 @@ function getAllServers() {
4676
4993
  }
4677
4994
 
4678
4995
  // ../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
4996
  function isDirectoryPath(filePath) {
4681
4997
  try {
4682
4998
  return statSync4(filePath).isDirectory();
@@ -4689,36 +5005,40 @@ function findWorkspaceRoot(filePath) {
4689
5005
  const abs = resolveReadablePathInsideContext(filePath);
4690
5006
  let dir = abs;
4691
5007
  if (!isDirectoryPath(dir)) {
4692
- dir = dirname8(dir);
5008
+ dir = dirname10(dir);
4693
5009
  }
5010
+ if (!isPathInside(cwd, abs))
5011
+ return findWorkspaceRootOutsideContext(dir);
4694
5012
  const fallbackRoot = nearestExistingDirectoryInsideContext(dir, cwd) ?? cwd;
5013
+ let nearestPackageRoot;
4695
5014
  while (isPathInside(cwd, dir)) {
4696
5015
  const canonicalDir = existingDirectoryInsideContext(dir, cwd);
4697
5016
  if (canonicalDir !== undefined) {
4698
- for (const marker of WORKSPACE_MARKERS) {
4699
- if (existsSync10(join4(dir, marker))) {
4700
- return canonicalDir;
4701
- }
5017
+ if (existsSync11(join5(dir, GIT_WORKSPACE_MARKER))) {
5018
+ return canonicalDir;
5019
+ }
5020
+ if (nearestPackageRoot === undefined && hasProjectWorkspaceMarker(dir)) {
5021
+ nearestPackageRoot = canonicalDir;
4702
5022
  }
4703
5023
  }
4704
5024
  if (dir === cwd)
4705
5025
  break;
4706
- dir = dirname8(dir);
5026
+ dir = dirname10(dir);
4707
5027
  }
4708
- return fallbackRoot;
5028
+ return nearestPackageRoot ?? fallbackRoot;
5029
+ }
5030
+ function hasProjectWorkspaceMarker(directory) {
5031
+ return PROJECT_WORKSPACE_MARKERS.some((marker) => existsSync11(join5(directory, marker)));
4709
5032
  }
4710
5033
  function resolveReadablePathInsideContext(filePath) {
4711
5034
  const cwd = contextCwd();
4712
- const abs = resolve7(cwd, filePath);
5035
+ const abs = resolve8(cwd, filePath);
4713
5036
  if (isPathInside(cwd, abs))
4714
5037
  return abs;
4715
5038
  const rebased = rebaseThroughCanonicalAncestor(abs, cwd);
4716
5039
  if (rebased !== undefined)
4717
5040
  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}`);
5041
+ return canonicalizeExistingOrNearestAncestor(abs);
4722
5042
  }
4723
5043
  function resolvePathInsideContext(filePath) {
4724
5044
  const cwd = contextCwd();
@@ -4729,16 +5049,16 @@ function resolvePathInsideContext(filePath) {
4729
5049
  }
4730
5050
  return canonical;
4731
5051
  }
4732
- function rebaseThroughCanonicalAncestor(path2, cwd) {
4733
- let current = path2;
5052
+ function rebaseThroughCanonicalAncestor(path, cwd) {
5053
+ let current = path;
4734
5054
  const suffix = [];
4735
5055
  while (true) {
4736
- if (existsSync10(current)) {
4737
- const canonical = realpathSync4(current);
5056
+ if (existsSync11(current)) {
5057
+ const canonical = realpathSync5(current);
4738
5058
  if (isPathInside(cwd, canonical))
4739
- return suffix.length === 0 ? canonical : join4(canonical, ...suffix);
5059
+ return suffix.length === 0 ? canonical : join5(canonical, ...suffix);
4740
5060
  }
4741
- const parent = dirname8(current);
5061
+ const parent = dirname10(current);
4742
5062
  if (parent === current)
4743
5063
  return;
4744
5064
  suffix.unshift(basename3(current));
@@ -4746,9 +5066,9 @@ function rebaseThroughCanonicalAncestor(path2, cwd) {
4746
5066
  }
4747
5067
  }
4748
5068
  function existingDirectoryInsideContext(directory, cwd) {
4749
- if (!existsSync10(directory))
5069
+ if (!existsSync11(directory))
4750
5070
  return;
4751
- const canonical = realpathSync4(directory);
5071
+ const canonical = realpathSync5(directory);
4752
5072
  if (!statSync4(canonical).isDirectory())
4753
5073
  return;
4754
5074
  return isPathInside(cwd, canonical) ? canonical : undefined;
@@ -4761,7 +5081,7 @@ function nearestExistingDirectoryInsideContext(directory, cwd) {
4761
5081
  return canonical;
4762
5082
  if (current === cwd)
4763
5083
  return;
4764
- current = dirname8(current);
5084
+ current = dirname10(current);
4765
5085
  }
4766
5086
  return;
4767
5087
  }
@@ -4788,33 +5108,46 @@ function formatServerLookupError(result) {
4788
5108
  ].join(`
4789
5109
  `);
4790
5110
  }
5111
+ function formatInstallOptions(serverId, installHint) {
5112
+ const localHint = LSP_LOCAL_INSTALL_HINTS[serverId];
5113
+ if (localHint === undefined) {
5114
+ return ["To install, run:", ` ${installHint}`];
5115
+ }
5116
+ return [
5117
+ "To install in THIS repository (preferred — no global install needed):",
5118
+ ` ${localHint}`,
5119
+ "",
5120
+ "Or install it globally:",
5121
+ ` ${installHint}`
5122
+ ];
5123
+ }
4791
5124
  function formatNotInstalled(result) {
4792
- const { server: server2, installHint } = result;
4793
- const extensions = server2.extensions.join(", ");
4794
- const decision = loadInstallDecision(server2.id)?.decision;
5125
+ const { server, installHint } = result;
5126
+ const extensions = server.extensions.join(", ");
5127
+ const decision = loadInstallDecision(server.id)?.decision;
4795
5128
  const context = lspRequestContext();
4796
5129
  if (decision === "declined") {
4797
- return `LSP server '${server2.id}' (${extensions}) is NOT INSTALLED; user previously declined installation — proceed without LSP.`;
5130
+ return `LSP server '${server.id}' (${extensions}) is NOT INSTALLED; user previously declined installation — proceed without LSP.`;
4798
5131
  }
4799
5132
  const header = [
4800
- `LSP server '${server2.id}' for ${extensions} is NOT INSTALLED.`,
5133
+ `LSP server '${server.id}' for ${extensions} is NOT INSTALLED.`,
4801
5134
  "",
4802
- `Command not found: ${server2.command[0]}`,
5135
+ `Command not found: ${server.command[0]}`,
4803
5136
  ""
4804
5137
  ];
5138
+ const installOptions = formatInstallOptions(server.id, installHint);
4805
5139
  if (decision === "allowed") {
4806
5140
  return [
4807
5141
  ...header,
4808
5142
  "The user has pre-authorized LSP installation. Run the install command, then retry this tool:",
4809
- ` ${installHint}`
5143
+ ...installOptions.slice(1)
4810
5144
  ].join(`
4811
5145
  `);
4812
5146
  }
4813
5147
  if (!context.capabilities.installDecisionTool) {
4814
5148
  return [
4815
5149
  ...header,
4816
- "To install, run:",
4817
- ` ${installHint}`,
5150
+ ...installOptions,
4818
5151
  "",
4819
5152
  "ACTION REQUIRED — ASK THE USER whether to install this LSP server.",
4820
5153
  "Install-decision recording is unavailable in this harness; proceed without LSP if the user declines."
@@ -4823,13 +5156,12 @@ function formatNotInstalled(result) {
4823
5156
  }
4824
5157
  return [
4825
5158
  ...header,
4826
- "To install, run:",
4827
- ` ${installHint}`,
5159
+ ...installOptions,
4828
5160
  "",
4829
5161
  "ACTION REQUIRED — ASK THE USER whether to install this LSP server.",
4830
5162
  "- If the user agrees: run the install command above, then retry this tool.",
4831
5163
  "- If the user declines, OR has NOT explicitly asked for LSP installation:",
4832
- ` call lsp_install_decision { server_id: "${server2.id}", decision: "declined" },`,
5164
+ ` call lsp_install_decision { server_id: "${server.id}", decision: "declined" },`,
4833
5165
  ` which writes to ${context.installDecisionsPath},`,
4834
5166
  " then ignore this message and proceed WITHOUT LSP."
4835
5167
  ].join(`
@@ -4853,34 +5185,34 @@ async function withLspClient(filePath, fn, toolName, options = {}) {
4853
5185
  if (result.status !== "found") {
4854
5186
  throw new LspServerLookupError(formatServerLookupError(result), result);
4855
5187
  }
4856
- const server2 = result.server;
5188
+ const server = result.server;
4857
5189
  const root = findWorkspaceRoot(absPath);
4858
5190
  const manager = options.manager ?? getLspManager();
4859
5191
  const acquireAndCall = async (allowRetry) => {
4860
- const client = await manager.getClient(root, server2, options.signal);
5192
+ const client = await manager.getClient(root, server, options.signal);
4861
5193
  try {
4862
5194
  return await fn(client, root, absPath);
4863
5195
  } catch (err) {
4864
5196
  if (allowRetry && READ_ONLY_TOOLS.has(toolName) && isLspDeadConnectionError(err)) {
4865
- manager.invalidateClient(root, server2.id, client);
5197
+ manager.invalidateClient(root, server.id, client);
4866
5198
  return acquireAndCall(false);
4867
5199
  }
4868
5200
  if (err instanceof LspRequestTimeoutError) {
4869
- if (manager.isServerInitializing(root, server2.id)) {
5201
+ if (manager.isServerInitializing(root, server.id)) {
4870
5202
  throw new LspServerInitializingError(err);
4871
5203
  }
4872
5204
  }
4873
5205
  throw err;
4874
5206
  } finally {
4875
- manager.releaseClient(root, server2.id);
5207
+ manager.releaseClient(root, server.id);
4876
5208
  }
4877
5209
  };
4878
5210
  return acquireAndCall(true);
4879
5211
  }
4880
5212
 
4881
5213
  // ../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";
5214
+ import { existsSync as existsSync12, lstatSync as lstatSync5, readdirSync as readdirSync3 } from "node:fs";
5215
+ import { join as join6, resolve as resolve9 } from "node:path";
4884
5216
 
4885
5217
  // ../lsp-core/src/lsp/formatters.ts
4886
5218
  import { fileURLToPath as fileURLToPath3 } from "node:url";
@@ -4895,10 +5227,10 @@ function uriToPath(uri) {
4895
5227
  }
4896
5228
  function formatLocation(loc) {
4897
5229
  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}`;
5230
+ const uri = uriToPath(loc.targetUri);
5231
+ const line = loc.targetRange.start.line + 1;
5232
+ const char = loc.targetRange.start.character;
5233
+ return `${uri}:${line}:${char}`;
4902
5234
  }
4903
5235
  const uri = uriToPath(loc.uri);
4904
5236
  const line = loc.range.start.line + 1;
@@ -5010,7 +5342,7 @@ function collectFilesWithExtension(dir, extension, maxFiles) {
5010
5342
  for (const entry of entries) {
5011
5343
  if (files.length >= maxFiles)
5012
5344
  return;
5013
- const fullPath = join5(currentDir, entry);
5345
+ const fullPath = join6(currentDir, entry);
5014
5346
  let stat;
5015
5347
  try {
5016
5348
  stat = lstatSync5(fullPath);
@@ -5035,15 +5367,15 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
5035
5367
  if (!extension.startsWith(".")) {
5036
5368
  throw new LspInvalidPathError(`Extension must start with a dot (e.g., ".ts", not "${extension}"). Use ".${extension}" instead.`);
5037
5369
  }
5038
- const absDir = resolve8(options.workspaceRoot ?? contextCwd(), directory);
5039
- if (!existsSync11(absDir)) {
5370
+ const absDir = resolve9(options.workspaceRoot ?? contextCwd(), directory);
5371
+ if (!existsSync12(absDir)) {
5040
5372
  throw new LspInvalidPathError(`Directory does not exist: ${absDir}`);
5041
5373
  }
5042
5374
  const serverResult = options.server === undefined ? findServerForExtension(extension) : { status: "found", server: options.server };
5043
5375
  if (serverResult.status !== "found") {
5044
5376
  throw new LspServerLookupError(formatServerLookupError(serverResult));
5045
5377
  }
5046
- const server2 = serverResult.server;
5378
+ const server = serverResult.server;
5047
5379
  const allFiles = (options.listFiles ?? collectFilesWithExtension)(absDir, extension, maxFiles + 1);
5048
5380
  const wasCapped = allFiles.length > maxFiles;
5049
5381
  const filesToProcess = allFiles.slice(0, maxFiles);
@@ -5063,7 +5395,7 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
5063
5395
  const fileErrors = [];
5064
5396
  const maxConcurrency = Math.max(1, options.maxConcurrency ?? DIRECTORY_DIAGNOSTICS_MAX_CONCURRENCY);
5065
5397
  options.signal?.throwIfAborted();
5066
- const client = await manager.getClient(root, server2, options.signal);
5398
+ const client = await manager.getClient(root, server, options.signal);
5067
5399
  try {
5068
5400
  let nextIndex = 0;
5069
5401
  const workers = Array.from({ length: Math.min(maxConcurrency, filesToProcess.length) }, async () => {
@@ -5091,7 +5423,7 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
5091
5423
  });
5092
5424
  await Promise.all(workers);
5093
5425
  } finally {
5094
- manager.releaseClient(root, server2.id);
5426
+ manager.releaseClient(root, server.id);
5095
5427
  }
5096
5428
  const displayDiagnostics = allDiagnostics.slice(0, DEFAULT_MAX_DIAGNOSTICS);
5097
5429
  const wasDiagCapped = allDiagnostics.length > DEFAULT_MAX_DIAGNOSTICS;
@@ -5123,7 +5455,7 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
5123
5455
 
5124
5456
  // ../lsp-core/src/lsp/infer-extension.ts
5125
5457
  import { lstatSync as lstatSync6, readdirSync as readdirSync4 } from "node:fs";
5126
- import { join as join6 } from "node:path";
5458
+ import { join as join7 } from "node:path";
5127
5459
  var SKIP_DIRECTORIES2 = new Set(["node_modules", ".git", "dist", "build", ".next", "out"]);
5128
5460
  var MAX_SCAN_ENTRIES = 500;
5129
5461
  function inferExtensionFromDirectory(directory) {
@@ -5141,7 +5473,7 @@ function inferExtensionFromDirectory(directory) {
5141
5473
  for (const entry of entries) {
5142
5474
  if (scanned >= MAX_SCAN_ENTRIES)
5143
5475
  return;
5144
- const fullPath = join6(dir, entry);
5476
+ const fullPath = join7(dir, entry);
5145
5477
  let stat;
5146
5478
  try {
5147
5479
  stat = lstatSync6(fullPath);
@@ -5300,8 +5632,8 @@ function clientOptions(signal) {
5300
5632
  }
5301
5633
 
5302
5634
  // ../lsp-core/src/tools/result.ts
5303
- function text(text2, details, isError = false) {
5304
- return { content: [{ type: "text", text: text2 }], details, isError };
5635
+ function text(text, details, isError = false) {
5636
+ return { content: [{ type: "text", text }], details, isError };
5305
5637
  }
5306
5638
 
5307
5639
  // ../lsp-core/src/tools/diagnostics.ts
@@ -5321,7 +5653,7 @@ async function executeLspDiagnostics(params, signal) {
5321
5653
  const extension = inferExtensionFromDirectory(absPath);
5322
5654
  if (!extension) {
5323
5655
  const message = `No supported source files found in directory: ${absPath}`;
5324
- const details3 = {
5656
+ const details = {
5325
5657
  filePath,
5326
5658
  severity,
5327
5659
  mode: "directory",
@@ -5331,24 +5663,24 @@ async function executeLspDiagnostics(params, signal) {
5331
5663
  error: message,
5332
5664
  errorKind: "no_files"
5333
5665
  };
5334
- return text(message, details3);
5666
+ return text(message, details);
5335
5667
  }
5336
- const output2 = await aggregateDiagnosticsForDirectory(absPath, extension, severity, undefined, signal === undefined ? {} : { signal });
5337
- const details2 = {
5668
+ const output = await aggregateDiagnosticsForDirectory(absPath, extension, severity, undefined, signal === undefined ? {} : { signal });
5669
+ const details = {
5338
5670
  filePath,
5339
5671
  severity,
5340
5672
  mode: "directory",
5341
5673
  diagnostics: [],
5342
- totalDiagnostics: output2.totalDiagnostics,
5674
+ totalDiagnostics: output.totalDiagnostics,
5343
5675
  truncated: false,
5344
- fileFailures: [...output2.fileFailures]
5676
+ fileFailures: [...output.fileFailures]
5345
5677
  };
5346
- return text(output2.output, details2);
5678
+ return text(output.output, details);
5347
5679
  }
5348
5680
  const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.diagnostics(resolvedFilePath, signal), "diagnostics", clientOptions(signal));
5349
5681
  if (result.transientError) {
5350
5682
  const message = result.transientError.message;
5351
- const details2 = {
5683
+ const details = {
5352
5684
  filePath,
5353
5685
  severity,
5354
5686
  mode: "file",
@@ -5358,7 +5690,7 @@ async function executeLspDiagnostics(params, signal) {
5358
5690
  error: message,
5359
5691
  errorKind: result.transientError.kind
5360
5692
  };
5361
- return text(message, details2, true);
5693
+ return text(message, details, true);
5362
5694
  }
5363
5695
  const diagnostics = filterDiagnosticsBySeverity(asDiagnosticArray(result), severity);
5364
5696
  const total = diagnostics.length;
@@ -5392,6 +5724,96 @@ async function executeLspDiagnostics(params, signal) {
5392
5724
  throw error;
5393
5725
  }
5394
5726
  }
5727
+ // ../lsp-core/src/lsp/format-document.ts
5728
+ import { readFileSync as readFileSync6, renameSync as renameSync3, unlinkSync as unlinkSync2, writeFileSync as writeFileSync3 } from "node:fs";
5729
+ var DEFAULT_FORMATTING_OPTIONS = {
5730
+ tabSize: 4,
5731
+ insertSpaces: false,
5732
+ trimTrailingWhitespace: true,
5733
+ insertFinalNewline: true,
5734
+ trimFinalNewlines: true
5735
+ };
5736
+ var UNCHANGED = { status: "unchanged", linesAdded: 0, linesRemoved: 0 };
5737
+ async function formatDocumentWithClient(client, filePath, options = {}) {
5738
+ const edits = await client.formatDocument(filePath, options.formattingOptions ?? DEFAULT_FORMATTING_OPTIONS, options.signal);
5739
+ if (edits === null)
5740
+ return { status: "unavailable", reason: "capability_not_advertised" };
5741
+ if (edits.length === 0)
5742
+ return UNCHANGED;
5743
+ const before = readFileSync6(filePath, "utf-8");
5744
+ const normalized = normalizeTextEdits(before, edits, 0);
5745
+ if (normalized.text === before)
5746
+ return UNCHANGED;
5747
+ writeAtomically(filePath, normalized.text);
5748
+ await client.openFile(filePath);
5749
+ return {
5750
+ status: "formatted",
5751
+ ...lineDelta(normalized.edits)
5752
+ };
5753
+ }
5754
+ function lineDelta(edits) {
5755
+ let linesAdded = 0;
5756
+ let linesRemoved = 0;
5757
+ for (const edit of edits) {
5758
+ linesRemoved += edit.range.end.line - edit.range.start.line + 1;
5759
+ linesAdded += edit.newText.split(`
5760
+ `).length;
5761
+ }
5762
+ return { linesAdded, linesRemoved };
5763
+ }
5764
+ function writeAtomically(filePath, content) {
5765
+ const tempPath = `${filePath}.omo-format.tmp`;
5766
+ writeFileSync3(tempPath, content, "utf-8");
5767
+ try {
5768
+ renameSync3(tempPath, filePath);
5769
+ } catch (error) {
5770
+ try {
5771
+ unlinkSync2(tempPath);
5772
+ } catch {}
5773
+ throw error;
5774
+ }
5775
+ }
5776
+
5777
+ // ../lsp-core/src/tools/format.ts
5778
+ async function executeLspFormat(params, signal) {
5779
+ const filePath = requireString(params, "filePath");
5780
+ try {
5781
+ const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => formatDocumentWithClient(client, resolvedFilePath, signal === undefined ? {} : { signal }), "format", clientOptions(signal));
5782
+ return text(describeResult(filePath, result), formatDetails(filePath, result));
5783
+ } catch (error) {
5784
+ const missingDependency = missingDependencyResult(error, {
5785
+ filePath,
5786
+ status: "unavailable",
5787
+ reason: "server_unavailable",
5788
+ linesAdded: 0,
5789
+ linesRemoved: 0
5790
+ });
5791
+ if (missingDependency)
5792
+ return missingDependency;
5793
+ throw error;
5794
+ }
5795
+ }
5796
+ function formatDetails(filePath, result) {
5797
+ if (result.status === "unavailable") {
5798
+ return { filePath, status: "unavailable", reason: result.reason, linesAdded: 0, linesRemoved: 0 };
5799
+ }
5800
+ return {
5801
+ filePath,
5802
+ status: result.status,
5803
+ linesAdded: result.linesAdded,
5804
+ linesRemoved: result.linesRemoved
5805
+ };
5806
+ }
5807
+ function describeResult(filePath, result) {
5808
+ if (result.status === "unavailable") {
5809
+ return `Formatting unavailable for ${filePath}: the language server does not advertise documentFormattingProvider.`;
5810
+ }
5811
+ if (result.status === "unchanged") {
5812
+ return `Already formatted: ${filePath}`;
5813
+ }
5814
+ return `Formatted ${filePath} (+${result.linesAdded}/-${result.linesRemoved} lines)`;
5815
+ }
5816
+
5395
5817
  // ../lsp-core/src/tools/install-decision.ts
5396
5818
  async function executeLspInstallDecision(params) {
5397
5819
  const serverId = requireString(params, "server_id");
@@ -5399,7 +5821,7 @@ async function executeLspInstallDecision(params) {
5399
5821
  if (!isInstallDecision(decision)) {
5400
5822
  return text(`Invalid decision '${String(decision)}'. Expected "declined" or "allowed".`, { serverId, errorKind: "invalid_decision" }, true);
5401
5823
  }
5402
- const serverIds = [...new Set(getMergedServers().map((server2) => server2.id))];
5824
+ const serverIds = [...new Set(getMergedServers().map((server) => server.id))];
5403
5825
  if (!serverIds.includes(serverId)) {
5404
5826
  const preview = serverIds.slice(0, 20).join(", ");
5405
5827
  return text(`Unknown LSP server '${serverId}'. Known servers: ${preview}${serverIds.length > 20 ? "..." : ""}`, { serverId, errorKind: "unknown_server" }, true);
@@ -5539,10 +5961,10 @@ function objectSchema(properties, required = []) {
5539
5961
  async function executeLspStatus() {
5540
5962
  const servers = getAllServers();
5541
5963
  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(", ")}`;
5964
+ const installed = servers.filter((server) => server.installed && !server.disabled);
5965
+ const configuredLines = servers.map((server) => {
5966
+ const state = server.disabled ? "disabled" : server.installed ? "installed" : "missing";
5967
+ return `- ${server.id}: ${state}; source=${server.source}; extensions=${server.extensions.join(", ")}`;
5546
5968
  });
5547
5969
  const activeLines = snapshots.map((snapshot) => {
5548
5970
  const state = snapshot.alive ? snapshot.isInitializing ? "initializing" : "alive" : "dead";
@@ -5585,8 +6007,8 @@ async function executeLspSymbols(params, signal) {
5585
6007
  errorKind: "missing_query"
5586
6008
  });
5587
6009
  }
5588
- const symbols2 = await withLspClient(filePath, async (client) => client.workspaceSymbols(query, signal), "workspaceSymbols", clientOptions(signal));
5589
- return formatSymbolsResult(filePath, scope, symbols2, limit, query);
6010
+ const symbols = await withLspClient(filePath, async (client) => client.workspaceSymbols(query, signal), "workspaceSymbols", clientOptions(signal));
6011
+ return formatSymbolsResult(filePath, scope, symbols, limit, query);
5590
6012
  }
5591
6013
  const symbols = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.documentSymbols(resolvedFilePath, signal), "documentSymbols", clientOptions(signal));
5592
6014
  return formatSymbolsResult(filePath, scope, symbols, limit);
@@ -5724,6 +6146,16 @@ var LSP_MCP_TOOLS = [
5724
6146
  }, ["filePath", "line", "character", "newName"]),
5725
6147
  execute: executeLspRename
5726
6148
  },
6149
+ {
6150
+ name: "format",
6151
+ aliases: ["lsp_format"],
6152
+ title: "LSP Format",
6153
+ description: "Format a source file with its language server and write the returned edits to disk.",
6154
+ inputSchema: objectSchema({
6155
+ filePath: { type: "string", description: "Source file path to format." }
6156
+ }, ["filePath"]),
6157
+ execute: executeLspFormat
6158
+ },
5727
6159
  {
5728
6160
  name: "install_decision",
5729
6161
  aliases: ["lsp_install_decision"],
@@ -5824,7 +6256,10 @@ function requestedProtocolVersion(params) {
5824
6256
  var CONTEXT_KEY = "_context";
5825
6257
 
5826
6258
  class InvalidDaemonRequestError extends Error {
5827
- name = "InvalidDaemonRequestError";
6259
+ constructor() {
6260
+ super(...arguments);
6261
+ this.name = "InvalidDaemonRequestError";
6262
+ }
5828
6263
  }
5829
6264
  function extractRequestContext(raw) {
5830
6265
  if (!isPlainRecord(raw) || raw["method"] !== "tools/call")
@@ -5906,6 +6341,7 @@ function parseContext(value) {
5906
6341
 
5907
6342
  // src/daemon-client.ts
5908
6343
  var DEFAULT_REQUEST_TIMEOUT_MS = 30000;
6344
+ var STARTUP_BACKOFF_MS = [0, 100, 300];
5909
6345
  var nextProxyRequestId = 1;
5910
6346
  async function callToolViaDaemon(name, args, options) {
5911
6347
  const context = requireContext(options.context);
@@ -5913,17 +6349,31 @@ async function callToolViaDaemon(name, args, options) {
5913
6349
  const ensure = options.ensure ?? ((ensurePaths, signal) => ensureDaemonRunning(ensurePaths, undefined, signal === undefined ? {} : { signal }));
5914
6350
  const timeoutMs = options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
5915
6351
  const requestArgs = withContext(args, context);
6352
+ const probe = options.probe ?? ((probePaths, signal) => probeDaemon(probePaths, undefined, signal));
6353
+ const sleep = options.sleep ?? ((ms, signal) => delay(ms, undefined, { signal }));
5916
6354
  let lastError;
5917
6355
  let authRefreshUsed = false;
5918
- for (let attempt = 0;attempt < 3; attempt += 1) {
6356
+ for (const [attempt, backoffMs] of STARTUP_BACKOFF_MS.entries()) {
5919
6357
  try {
5920
- await ensureDaemonAvailable(paths, ensure, options.signal);
6358
+ if (backoffMs > 0)
6359
+ await sleep(backoffMs, options.signal);
6360
+ if (options.signal?.aborted)
6361
+ throw new DaemonRequestCancelledError(false);
6362
+ if (attempt === 0) {
6363
+ await ensureDaemonAvailable(paths, ensure, options.signal);
6364
+ } else if (!await probe(paths, options.signal)) {
6365
+ throw new DaemonUnreachableError(paths.socket);
6366
+ }
5921
6367
  const token = readAuthToken(paths);
5922
6368
  if (!token)
5923
6369
  throw new DaemonRequestError("daemon auth token missing", false);
5924
6370
  const sendOptions = options.signal === undefined ? { timeoutMs } : { timeoutMs, signal: options.signal };
5925
6371
  return await sendToolCall(paths, token, name, requestArgs, sendOptions);
5926
6372
  } catch (error) {
6373
+ if (options.signal?.aborted) {
6374
+ lastError = new DaemonRequestCancelledError(false);
6375
+ break;
6376
+ }
5927
6377
  lastError = error;
5928
6378
  if (error instanceof DaemonAuthenticationRejectedError && !authRefreshUsed) {
5929
6379
  authRefreshUsed = true;
@@ -5940,14 +6390,17 @@ async function callToolViaDaemon(name, args, options) {
5940
6390
  function callDiagnosticsViaDaemon(filePath, options) {
5941
6391
  return callToolViaDaemon("diagnostics", { filePath, severity: "error" }, options);
5942
6392
  }
6393
+ function callFormatViaDaemon(filePath, options) {
6394
+ return callToolViaDaemon("format", { filePath }, options);
6395
+ }
5943
6396
  function currentRequestContext(env = process.env) {
5944
6397
  const cwd = process.cwd();
5945
6398
  const home = env["HOME"] ?? homedir3();
5946
6399
  return parseLspRequestContext({
5947
6400
  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"),
6401
+ projectConfigPaths: [join8(cwd, ".codex", "lsp-client.json")],
6402
+ userConfigPath: join8(home, ".codex", "lsp-client.json"),
6403
+ installDecisionsPath: join8(home, ".codex", "lsp-install-decisions.json"),
5951
6404
  capabilities: { installDecisionTool: true }
5952
6405
  });
5953
6406
  }
@@ -5962,7 +6415,7 @@ function withContext(args, context) {
5962
6415
  function ensureDaemonAvailable(paths, ensure, signal) {
5963
6416
  if (!signal)
5964
6417
  return ensure(paths);
5965
- return new Promise((resolve9, reject) => {
6418
+ return new Promise((resolve, reject) => {
5966
6419
  let settled = false;
5967
6420
  const finish = (run) => {
5968
6421
  if (settled)
@@ -5977,11 +6430,11 @@ function ensureDaemonAvailable(paths, ensure, signal) {
5977
6430
  return;
5978
6431
  }
5979
6432
  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)));
6433
+ Promise.resolve().then(() => ensure(paths, signal)).then(() => finish(() => resolve()), (error) => finish(() => reject(signal.aborted ? new DaemonRequestCancelledError(false) : error)));
5981
6434
  });
5982
6435
  }
5983
6436
  function sendToolCall(paths, token, name, args, options) {
5984
- return new Promise((resolve9, reject) => {
6437
+ return new Promise((resolve, reject) => {
5985
6438
  const socket = connect(paths.socket);
5986
6439
  const requestId = allocateProxyRequestId();
5987
6440
  let settled = false;
@@ -6034,7 +6487,7 @@ function sendToolCall(paths, token, name, args, options) {
6034
6487
  }
6035
6488
  const result = toToolResult(message, requestId);
6036
6489
  if (result)
6037
- finish(() => resolve9(result));
6490
+ finish(() => resolve(result));
6038
6491
  else
6039
6492
  finish(() => reject(new DaemonRequestError("invalid daemon response", requestWritten)));
6040
6493
  });
@@ -6079,8 +6532,8 @@ function isRetryableTool(name) {
6079
6532
  return name !== "rename" && name !== "lsp_rename";
6080
6533
  }
6081
6534
  // 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";
6535
+ import { existsSync as existsSync13, realpathSync as realpathSync6 } from "node:fs";
6536
+ import { basename as basename4, delimiter as delimiter4, dirname as dirname11, isAbsolute as isAbsolute6 } from "node:path";
6084
6537
  var DEFAULT_STARTUP_TIMEOUT_MS = 1e4;
6085
6538
  async function runMcpStdioProxy(options = {}) {
6086
6539
  const input = options.input ?? process.stdin;
@@ -6203,34 +6656,34 @@ function canonicalizePathList(value) {
6203
6656
  return value.split(delimiter4).map((entry) => canonicalizePath(entry) ?? entry).join(delimiter4);
6204
6657
  }
6205
6658
  function canonicalizePath(value) {
6206
- if (value === undefined || !isAbsolute5(value) || !existsSync12(value))
6659
+ if (value === undefined || !isAbsolute6(value) || !existsSync13(value))
6207
6660
  return value;
6208
- return realpathSync5(value);
6661
+ return realpathSync6(value);
6209
6662
  }
6210
- function projectRootFromOpenCodeConfigPath(path2) {
6211
- if (basename4(path2) !== "lsp.json" && basename4(path2) !== "lsp-client.json")
6663
+ function projectRootFromOpenCodeConfigPath(path) {
6664
+ if (basename4(path) !== "lsp.json" && basename4(path) !== "lsp-client.json")
6212
6665
  return;
6213
- const configDir = dirname9(path2);
6666
+ const configDir = dirname11(path);
6214
6667
  const configDirName = basename4(configDir);
6215
6668
  if (configDirName !== ".opencode" && configDirName !== ".omo")
6216
6669
  return;
6217
- return dirname9(configDir);
6670
+ return dirname11(configDir);
6218
6671
  }
6219
6672
  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,
6673
+ InvalidDaemonDirectoryError,
6234
6674
  InvalidDaemonVersionError,
6235
- InvalidDaemonDirectoryError
6675
+ InvalidRuntimeOverrideError,
6676
+ OMO_LSP_DAEMON_CLI,
6677
+ OMO_LSP_DAEMON_DIR,
6678
+ OMO_LSP_DAEMON_VERSION,
6679
+ callDiagnosticsViaDaemon,
6680
+ callToolViaDaemon,
6681
+ currentRequestContext,
6682
+ daemonPaths,
6683
+ disposeDefaultLspManager,
6684
+ ensureDaemonRunning,
6685
+ probeDaemon,
6686
+ resolveDaemonRuntime,
6687
+ runMcpStdioProxy,
6688
+ validateDaemonVersion
6236
6689
  };