oh-my-opencode 5.0.0-beta.4 → 5.0.0-beta.40

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 (868) hide show
  1. package/.agents/command/publish.md +44 -16
  2. package/.agents/skills/codex-qa/scripts/lsp-e2e.sh +1 -3
  3. package/.agents/skills/opencode-qa/scripts/lsp-e2e.sh +1 -1
  4. package/.agents/skills/publish/SKILL.md +44 -16
  5. package/.agents/skills/senpi-qa/SKILL.md +80 -0
  6. package/.agents/skills/senpi-qa/scripts/resolve-evidence-dir.mjs +65 -0
  7. package/.agents/skills/senpi-qa/scripts/resolve-evidence-dir.test.mjs +171 -0
  8. package/.agents/skills/tech-debt-audit/SKILL.md +6 -76
  9. package/.agents/skills/work-with-pr/SKILL.md +37 -23
  10. package/.opencode/command/publish.md +44 -16
  11. package/.opencode/skills/work-with-pr/SKILL.md +37 -23
  12. package/README.ja.md +25 -21
  13. package/README.ko.md +25 -21
  14. package/README.md +38 -23
  15. package/README.ru.md +24 -20
  16. package/README.zh-cn.md +25 -21
  17. package/THIRD-PARTY-NOTICES.md +27 -99
  18. package/dist/agents/atlas/agent.d.ts +0 -1
  19. package/dist/agents/sisyphus/grok-4.d.ts +20 -0
  20. package/dist/agents/sisyphus/index.d.ts +2 -0
  21. package/dist/agents/sisyphus-agent-config.d.ts +6 -0
  22. package/dist/agents/sisyphus-agent-factory.d.ts +1 -1
  23. package/dist/agents/sisyphus-runtime-prompt-reconciler.d.ts +15 -4
  24. package/dist/agents/types.d.ts +2 -2
  25. package/dist/cli/config-manager/parse-opencode-config-file.d.ts +2 -1
  26. package/dist/cli/doctor/checks/system-plugin.d.ts +4 -3
  27. package/dist/cli/fallback-lane-policy.d.ts +1 -0
  28. package/dist/cli/index.js +66932 -64746
  29. package/dist/cli/install-codex/install-codex-test-fixtures.d.ts +1 -1
  30. package/dist/cli/run/on-complete-hook.d.ts +2 -0
  31. package/dist/cli/runtime-commands.d.ts +1 -1
  32. package/dist/cli/worktree-sweep/classify.d.ts +16 -0
  33. package/dist/cli/worktree-sweep/format.d.ts +8 -0
  34. package/dist/cli/worktree-sweep/git.d.ts +19 -0
  35. package/dist/cli/worktree-sweep/index.d.ts +7 -0
  36. package/dist/cli/worktree-sweep/options.d.ts +2 -0
  37. package/dist/cli/worktree-sweep/parse-worktree-list.d.ts +8 -0
  38. package/dist/cli/worktree-sweep/sweep.d.ts +2 -0
  39. package/dist/cli/worktree-sweep/types.d.ts +65 -0
  40. package/dist/cli/worktree-sweep/worktree-sweep.d.ts +2 -0
  41. package/dist/cli-node/index.js +66795 -64586
  42. package/dist/config/index.d.ts +1 -1
  43. package/dist/config/schema/background-task.d.ts +1 -0
  44. package/dist/config/schema/commands.d.ts +1 -1
  45. package/dist/config/schema/hooks.d.ts +1 -2
  46. package/dist/config/schema/oh-my-opencode-config.d.ts +5 -11
  47. package/dist/config/schema/ulw-execute.d.ts +5 -0
  48. package/dist/config/schema.d.ts +0 -1
  49. package/dist/config/validate.d.ts +2 -0
  50. package/dist/create-hooks.d.ts +3 -2
  51. package/dist/features/background-agent/compaction-aware-message-resolver.d.ts +1 -0
  52. package/dist/features/background-agent/constants.d.ts +0 -7
  53. package/dist/features/background-agent/manager.d.ts +2 -1
  54. package/dist/features/background-agent/parent-wake-dispatched-tracker.d.ts +0 -1
  55. package/dist/features/background-agent/parent-wake-notifier-types.d.ts +1 -1
  56. package/dist/features/background-agent/parent-wake-prompt-dispatch.d.ts +1 -1
  57. package/dist/features/background-agent/parent-wake-session-inspector.d.ts +1 -1
  58. package/dist/features/background-agent/subagent-spawn-limits.d.ts +8 -0
  59. package/dist/features/btw-side/btw-command-draft.d.ts +7 -0
  60. package/dist/features/btw-side/context-injector.d.ts +15 -0
  61. package/dist/features/btw-side/index.d.ts +8 -0
  62. package/dist/features/btw-side/metadata.d.ts +15 -0
  63. package/dist/features/btw-side/parent-context-budget.d.ts +9 -0
  64. package/dist/features/btw-side/server-session-registry.d.ts +8 -0
  65. package/dist/features/btw-side/tui-adoption-cache.d.ts +13 -0
  66. package/dist/features/btw-side/tui-adoption-guard.d.ts +5 -0
  67. package/dist/features/btw-side/tui-controller-types.d.ts +68 -0
  68. package/dist/features/btw-side/tui-controller.d.ts +19 -0
  69. package/dist/features/btw-side/tui-escape-return.d.ts +12 -0
  70. package/dist/features/btw-side/tui-keymap.d.ts +17 -0
  71. package/dist/features/btw-side/tui-parent-validator.d.ts +6 -0
  72. package/dist/features/btw-side/tui-picker-options.d.ts +20 -0
  73. package/dist/features/btw-side/tui-picker.d.ts +9 -0
  74. package/dist/features/btw-side/tui-prompt-queue.d.ts +8 -0
  75. package/dist/features/btw-side/tui-session-bridge.d.ts +11 -0
  76. package/dist/features/btw-side/tui-session-catalog.d.ts +35 -0
  77. package/dist/features/btw-side/tui-side-removal.d.ts +11 -0
  78. package/dist/features/btw-side/tui-side-start.d.ts +9 -0
  79. package/dist/features/btw-side/tui-wiring.d.ts +8 -0
  80. package/dist/features/builtin-commands/templates/ulw-execute.d.ts +1 -0
  81. package/dist/features/builtin-commands/types.d.ts +1 -1
  82. package/dist/features/monitor/manager-internals.d.ts +1 -1
  83. package/dist/features/monitor/output-injector-types.d.ts +1 -1
  84. package/dist/features/opengateway-provider/index.d.ts +13 -0
  85. package/dist/features/task-toast-manager/manager.d.ts +0 -24
  86. package/dist/features/team-mode/tools/messaging-fallback-wake.d.ts +15 -0
  87. package/dist/features/team-mode/tools/messaging-live-delivery-recipient.d.ts +1 -0
  88. package/dist/features/team-mode/tools/messaging-runtime.d.ts +1 -0
  89. package/dist/hooks/anthropic-context-window-limit-recovery/message-storage-directory.d.ts +0 -3
  90. package/dist/hooks/anthropic-context-window-limit-recovery/state.d.ts +1 -0
  91. package/dist/hooks/anthropic-context-window-limit-recovery/storage/empty-messages.d.ts +0 -1
  92. package/dist/hooks/anthropic-context-window-limit-recovery/tool-result-storage.d.ts +11 -0
  93. package/dist/hooks/atlas/atlas-hook.d.ts +1 -0
  94. package/dist/hooks/atlas/atlas-lifecycle-store.d.ts +50 -0
  95. package/dist/hooks/atlas/event-handler.d.ts +1 -0
  96. package/dist/hooks/atlas/final-wave-approval-gate.test-support.d.ts +50 -0
  97. package/dist/hooks/atlas/system-reminder-templates.d.ts +0 -1
  98. package/dist/hooks/atlas/tool-execute-before.d.ts +3 -0
  99. package/dist/hooks/atlas/types.d.ts +1 -0
  100. package/dist/hooks/claude-code-hooks/session-hook-state.d.ts +1 -0
  101. package/dist/hooks/claude-code-hooks/stop.d.ts +2 -0
  102. package/dist/hooks/claude-code-hooks/todo.d.ts +0 -1
  103. package/dist/hooks/claude-code-hooks/transcript.d.ts +2 -0
  104. package/dist/hooks/compaction-context-injector/validated-model.d.ts +2 -0
  105. package/dist/hooks/fsync-skip-warning/index.d.ts +4 -0
  106. package/dist/hooks/hashline-edit-diff-enhancer/hook.d.ts +1 -0
  107. package/dist/hooks/hashline-edit-diff-enhancer/pending-captures.d.ts +13 -0
  108. package/dist/hooks/index.d.ts +1 -2
  109. package/dist/hooks/keyword-detector/hook.d.ts +7 -0
  110. package/dist/hooks/keyword-detector/ultrawork/source-detector.d.ts +0 -1
  111. package/dist/hooks/model-fallback/hook.d.ts +1 -1
  112. package/dist/hooks/prometheus-md-only/agent-resolution.d.ts +2 -2
  113. package/dist/hooks/runtime-fallback/chat-message-handler.d.ts +2 -0
  114. package/dist/hooks/runtime-fallback/retry-model-payload.d.ts +1 -0
  115. package/dist/hooks/runtime-fallback/runtime-model-settings.d.ts +6 -0
  116. package/dist/hooks/runtime-fallback/session-status-handler.d.ts +1 -1
  117. package/dist/hooks/runtime-fallback/types.d.ts +3 -1
  118. package/dist/hooks/sisyphus-junior-notepad/constants.d.ts +1 -1
  119. package/dist/hooks/todo-continuation-enforcer/types.d.ts +1 -0
  120. package/dist/hooks/{start-work → ulw-execute}/context-info-builder.d.ts +1 -1
  121. package/dist/hooks/{start-work → ulw-execute}/index.d.ts +1 -1
  122. package/dist/hooks/ulw-execute/ulw-execute-hook.d.ts +23 -0
  123. package/dist/index.js +24669 -20705
  124. package/dist/mcp/index.d.ts +0 -4
  125. package/dist/mcp/types.d.ts +0 -1
  126. package/dist/oh-my-opencode.schema.json +21 -47
  127. package/dist/plugin/chat-message/types.d.ts +3 -3
  128. package/dist/plugin/chat-message/ulw-execute-message.d.ts +5 -0
  129. package/dist/plugin/event-session-lifecycle.d.ts +1 -0
  130. package/dist/plugin/hooks/create-core-hooks.d.ts +2 -2
  131. package/dist/plugin/hooks/create-session-hooks.d.ts +2 -3
  132. package/dist/plugin/hooks/create-transform-hooks.d.ts +2 -0
  133. package/dist/plugin/messages-transform.d.ts +1 -0
  134. package/dist/plugin-dispose.d.ts +3 -0
  135. package/dist/shared/agent-tool-restrictions.d.ts +0 -1
  136. package/dist/shared/compaction-agent-config-checkpoint.d.ts +1 -0
  137. package/dist/shared/index.d.ts +2 -0
  138. package/dist/shared/legacy-plugin-warning.d.ts +2 -1
  139. package/dist/shared/normalize-sdk-response.d.ts +1 -0
  140. package/dist/shared/omo-process-sweep.d.ts +2 -4
  141. package/dist/shared/plugin-entry-migrator.d.ts +4 -3
  142. package/dist/shared/plugin-entry-shape.d.ts +6 -0
  143. package/dist/shared/runtime-fallback-retry-marker.d.ts +16 -0
  144. package/dist/shared/shell-env.d.ts +1 -1
  145. package/dist/skills/ast-grep/AGENTS.md +51 -0
  146. package/dist/skills/coding-agent-sessions/AGENTS.md +62 -0
  147. package/dist/skills/coding-agent-sessions/SKILL.md +3 -2
  148. package/dist/skills/coding-agent-sessions/references/all-platforms.md +1 -1
  149. package/dist/skills/coding-agent-sessions/references/senpi.md +4 -4
  150. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
  151. package/dist/skills/data-scientist/SKILL.md +99 -239
  152. package/dist/skills/data-scientist/references/execution-surfaces.md +91 -0
  153. package/dist/skills/data-scientist/references/placement.md +74 -0
  154. package/dist/skills/data-scientist/references/polars-lane.md +95 -0
  155. package/dist/skills/data-scientist/references/uv-setup.md +1 -1
  156. package/dist/skills/data-scientist/references/visualization.md +64 -0
  157. package/dist/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
  158. package/dist/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
  159. package/dist/skills/debugging/SKILL.md +2 -0
  160. package/dist/skills/debugging/references/methodology/00-setup.md +12 -0
  161. package/dist/skills/debugging/references/methodology/02-investigate.md +21 -0
  162. package/dist/skills/debugging/references/runtimes/go.md +15 -1
  163. package/dist/skills/debugging/references/runtimes/native-binary.md +38 -0
  164. package/dist/skills/debugging/references/runtimes/node.md +25 -0
  165. package/dist/skills/debugging/references/runtimes/python.md +13 -0
  166. package/dist/skills/debugging/references/runtimes/rust.md +41 -0
  167. package/dist/skills/debugging/references/scripts/dap.mjs +267 -0
  168. package/dist/skills/debugging/references/scripts/dap.test.ts +86 -0
  169. package/dist/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
  170. package/dist/skills/debugging/references/tools/dap.md +103 -0
  171. package/dist/skills/debugging/references/tools/frida.md +193 -0
  172. package/dist/skills/frontend/SKILL.md +11 -7
  173. package/dist/skills/frontend/references/design/_INDEX.md +1 -0
  174. package/dist/skills/frontend/references/design/print-paged-media.md +76 -0
  175. package/dist/skills/frontend/references/design/stylegallery.md +80 -0
  176. package/dist/skills/frontend/references/designpowers/README.md +1 -1
  177. package/dist/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
  178. package/dist/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
  179. package/dist/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
  180. package/dist/skills/frontend/references/designpowers/orchestration.md +1 -1
  181. package/dist/skills/frontend/references/designpowers/routing.md +5 -5
  182. package/dist/skills/init-deep/SKILL.md +13 -13
  183. package/dist/skills/review-work/SKILL.md +3 -3
  184. package/dist/skills/ultimate-browsing/ATTRIBUTION.md +37 -10
  185. package/dist/skills/ultimate-browsing/SKILL.md +2 -0
  186. package/dist/skills/ultimate-browsing/engine/AGENTS.md +110 -0
  187. package/dist/skills/ultimate-browsing/engine/templates/package.json +1 -1
  188. package/dist/skills/ultimate-browsing/references/chrome-stealth.md +13 -11
  189. package/dist/skills/ultimate-browsing/references/insane-search/README.md +9 -2
  190. package/dist/skills/{start-work → ulw-execute}/SKILL.md +17 -16
  191. package/dist/skills/ulw-plan/SKILL.md +6 -7
  192. package/dist/skills/ulw-plan/references/full-workflow.md +31 -7
  193. package/dist/skills/ulw-plan/references/intent-clear.md +2 -1
  194. package/dist/skills/ulw-plan/references/intent-unclear.md +5 -5
  195. package/dist/skills/ulw-research/SKILL.md +4 -2
  196. package/dist/skills/visual-qa/AGENTS.md +58 -0
  197. package/dist/skills/visual-qa/SKILL.md +3 -2
  198. package/dist/tools/delegate-task/builtin-categories.d.ts +1 -0
  199. package/dist/tools/delegate-task/builtin-category-definition.d.ts +1 -0
  200. package/dist/tools/delegate-task/sync-session-cleanup.d.ts +3 -0
  201. package/dist/tools/delegate-task/sync-session-poller.d.ts +1 -0
  202. package/dist/tools/delegate-task/tool-description.d.ts +3 -1
  203. package/dist/tools/delegate-task/types.d.ts +4 -0
  204. package/dist/tools/session-manager/directory-filter.d.ts +2 -0
  205. package/dist/tui.d.ts +12 -0
  206. package/dist/tui.js +49320 -49316
  207. package/package.json +41 -39
  208. package/packages/git-bash-mcp/dist/cli.js +6 -1
  209. package/packages/git-bash-mcp/package.json +1 -1
  210. package/packages/lsp-core/src/index.ts +1 -0
  211. package/packages/lsp-core/src/lsp/client-diagnostics-concurrency.integration.test.ts +44 -0
  212. package/packages/lsp-core/src/lsp/client-diagnostics-freshness.integration.test.ts +47 -47
  213. package/packages/lsp-core/src/lsp/client-diagnostics-pull-timeout.test.ts +64 -0
  214. package/packages/lsp-core/src/lsp/client-wrapper-outside-cwd.test.ts +78 -0
  215. package/packages/lsp-core/src/lsp/client-wrapper.test.ts +163 -13
  216. package/packages/lsp-core/src/lsp/client-wrapper.ts +110 -23
  217. package/packages/lsp-core/src/lsp/client.ts +32 -3
  218. package/packages/lsp-core/src/lsp/connection.ts +16 -0
  219. package/packages/lsp-core/src/lsp/constants.ts +6 -0
  220. package/packages/lsp-core/src/lsp/controlled-clock-test-support.ts +61 -0
  221. package/packages/lsp-core/src/lsp/errors.ts +15 -0
  222. package/packages/lsp-core/src/lsp/fixtures/workspace-edit-server.mjs +10 -3
  223. package/packages/lsp-core/src/lsp/format-document.test.ts +143 -0
  224. package/packages/lsp-core/src/lsp/format-document.ts +90 -0
  225. package/packages/lsp-core/src/lsp/manager-lifecycle.test.ts +262 -0
  226. package/packages/lsp-core/src/lsp/manager-max-clients.test.ts +151 -0
  227. package/packages/lsp-core/src/lsp/manager.ts +138 -12
  228. package/packages/lsp-core/src/lsp/outside-context-workspace.ts +33 -0
  229. package/packages/lsp-core/src/lsp/server-definitions.ts +29 -0
  230. package/packages/lsp-core/src/lsp/server-installation.test.ts +376 -0
  231. package/packages/lsp-core/src/lsp/server-installation.ts +200 -27
  232. package/packages/lsp-core/src/lsp/server-resolution-local-binary.test.ts +170 -0
  233. package/packages/lsp-core/src/lsp/server-resolution.ts +18 -5
  234. package/packages/lsp-core/src/lsp/timer-provider.ts +13 -0
  235. package/packages/lsp-core/src/lsp/transport-request-timeout.test.ts +73 -0
  236. package/packages/lsp-core/src/lsp/transport.ts +16 -2
  237. package/packages/lsp-core/src/lsp/types.ts +8 -0
  238. package/packages/lsp-core/src/lsp/workspace-document-state.test.ts +84 -1
  239. package/packages/lsp-core/src/lsp/workspace-document-state.ts +30 -11
  240. package/packages/lsp-core/src/lsp/workspace-edit-adversarial.test.ts +20 -1
  241. package/packages/lsp-core/src/lsp/workspace-markers.ts +18 -0
  242. package/packages/lsp-core/src/mcp.ts +3 -0
  243. package/packages/lsp-core/src/request-context.test.ts +29 -0
  244. package/packages/lsp-core/src/request-context.ts +1 -1
  245. package/packages/lsp-core/src/tool-surface.test.ts +13 -1
  246. package/packages/lsp-core/src/tools/definitions.ts +14 -0
  247. package/packages/lsp-core/src/tools/diagnostics.ts +3 -3
  248. package/packages/lsp-core/src/tools/format.test.ts +56 -0
  249. package/packages/lsp-core/src/tools/format.ts +56 -0
  250. package/packages/lsp-core/src/tools/index.ts +1 -0
  251. package/packages/lsp-core/src/tools/navigation.ts +4 -2
  252. package/packages/lsp-core/src/tools/parameters.test.ts +51 -0
  253. package/packages/lsp-core/src/tools/rename.ts +4 -2
  254. package/packages/lsp-core/src/tools/symbols.ts +1 -1
  255. package/packages/lsp-core/src/tools/types.ts +10 -0
  256. package/packages/lsp-daemon/dist/cli.js +793 -323
  257. package/packages/lsp-daemon/dist/client.d.ts +10 -0
  258. package/packages/lsp-daemon/dist/client.js +753 -280
  259. package/packages/lsp-daemon/dist/daemon-client.d.ts +1 -0
  260. package/packages/lsp-daemon/dist/daemon-client.js +3 -0
  261. package/packages/lsp-daemon/dist/ensure-daemon.js +1 -0
  262. package/packages/lsp-daemon/dist/index.js +757 -289
  263. package/packages/lsp-daemon/dist/proxy.js +3 -0
  264. package/packages/lsp-daemon/dist/version-reap.js +1 -1
  265. package/packages/lsp-daemon/package.json +1 -1
  266. package/packages/lsp-tools-mcp/dist/cli.js +712 -244
  267. package/packages/lsp-tools-mcp/dist/lsp/manager.js +248 -119
  268. package/packages/lsp-tools-mcp/dist/mcp.js +714 -246
  269. package/packages/lsp-tools-mcp/dist/request-context.js +12 -13
  270. package/packages/lsp-tools-mcp/dist/tools.js +718 -254
  271. package/packages/lsp-tools-mcp/package.json +1 -1
  272. package/packages/omo-codex/THIRD-PARTY-NOTICES.md +4 -21
  273. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +4 -6
  274. package/packages/omo-codex/plugin/.mcp.json +0 -6
  275. package/packages/omo-codex/plugin/AGENTS.md +47 -0
  276. package/packages/omo-codex/plugin/README.md +2 -2
  277. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +45 -49
  278. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  279. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  280. package/packages/omo-codex/plugin/components/bootstrap/src/hook.ts +1 -0
  281. package/packages/omo-codex/plugin/components/comment-checker/AGENTS.md +9 -0
  282. package/packages/omo-codex/plugin/components/comment-checker/biome.json +2 -2
  283. package/packages/omo-codex/plugin/components/comment-checker/dist/cli.js +2 -1
  284. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  285. package/packages/omo-codex/plugin/components/comment-checker/package.json +5 -5
  286. package/packages/omo-codex/plugin/components/comment-checker/src/apply-patch.ts +2 -8
  287. package/packages/omo-codex/plugin/components/comment-checker/src/core.ts +1 -2
  288. package/packages/omo-codex/plugin/components/comment-checker/src/request-extractor.ts +1 -1
  289. package/packages/omo-codex/plugin/components/comment-checker/src/runner.ts +1 -0
  290. package/packages/omo-codex/plugin/components/git-bash/AGENTS.md +1 -1
  291. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  292. package/packages/omo-codex/plugin/components/git-bash/package.json +3 -4
  293. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/biome.json +2 -2
  294. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/cli.js +1 -5
  295. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/codex-hook.js +1 -5
  296. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  297. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +5 -5
  298. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/codex-hook.ts +1 -5
  299. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +4 -21
  300. package/packages/omo-codex/plugin/components/lcx/skills/lcx-doctor/SKILL.md +1 -1
  301. package/packages/omo-codex/plugin/components/lsp/AGENTS.md +30 -15
  302. package/packages/omo-codex/plugin/components/lsp/biome.json +2 -2
  303. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +4 -4
  304. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +741 -294
  305. package/packages/omo-codex/plugin/components/lsp/dist/daemon-cli-path.js +1 -1
  306. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  307. package/packages/omo-codex/plugin/components/lsp/package.json +5 -5
  308. package/packages/omo-codex/plugin/components/lsp/src/cli.ts +1 -1
  309. package/packages/omo-codex/plugin/components/lsp/src/codex-hook.ts +1 -1
  310. package/packages/omo-codex/plugin/components/lsp/src/daemon-cli-path.ts +1 -5
  311. package/packages/omo-codex/plugin/components/lsp/test/codex-hook-unavailable.test.ts +6 -7
  312. package/packages/omo-codex/plugin/components/lsp/test/codex-hook.test.ts +1 -2
  313. package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +11 -1
  314. package/packages/omo-codex/plugin/components/rules/AGENTS.md +12 -0
  315. package/packages/omo-codex/plugin/components/rules/biome.json +2 -2
  316. package/packages/omo-codex/plugin/components/rules/dist/cli.js +60 -45
  317. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  318. package/packages/omo-codex/plugin/components/rules/package.json +7 -7
  319. package/packages/omo-codex/plugin/components/rules/src/config.ts +1 -2
  320. package/packages/omo-codex/plugin/components/rules/src/persistent-cache.ts +1 -2
  321. package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +9 -5
  322. package/packages/omo-codex/plugin/components/rules/src/rules-engine-factory.ts +1 -4
  323. package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +4 -9
  324. package/packages/omo-codex/plugin/components/rules/test/bundled-rules-priority.test.ts +11 -16
  325. package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +17 -25
  326. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +9 -7
  327. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +0 -6
  328. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-dedup.test.ts +6 -4
  329. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-directive.test.ts +12 -9
  330. package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +28 -37
  331. package/packages/omo-codex/plugin/components/rules/test/dynamic-target-fingerprints.test.ts +1 -2
  332. package/packages/omo-codex/plugin/components/rules/test/engine.test.ts +7 -4
  333. package/packages/omo-codex/plugin/components/rules/test/finder.test.ts +2 -3
  334. package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +39 -72
  335. package/packages/omo-codex/plugin/components/rules/test/hephaestus-model-variant.test.ts +1 -2
  336. package/packages/omo-codex/plugin/components/rules/test/hook-output.test.ts +2 -3
  337. package/packages/omo-codex/plugin/components/rules/test/matcher.test.ts +2 -3
  338. package/packages/omo-codex/plugin/components/rules/test/package-smoke.test.ts +1 -1
  339. package/packages/omo-codex/plugin/components/rules/test/parser.test.ts +1 -2
  340. package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +5 -6
  341. package/packages/omo-codex/plugin/components/rules/test/rules-engine-consumption.test.ts +3 -6
  342. package/packages/omo-codex/plugin/components/rules/test/scanner.test.ts +1 -2
  343. package/packages/omo-codex/plugin/components/rules/test/sources.test.ts +2 -5
  344. package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +2 -17
  345. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  346. package/packages/omo-codex/plugin/components/teammode/package.json +5 -5
  347. package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +4 -10
  348. package/packages/omo-codex/plugin/components/telemetry/AGENTS.md +8 -0
  349. package/packages/omo-codex/plugin/components/telemetry/biome.json +2 -2
  350. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +2463 -437
  351. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +2467 -441
  352. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  353. package/packages/omo-codex/plugin/components/telemetry/package.json +5 -5
  354. package/packages/omo-codex/plugin/components/telemetry/src/codex-hook.ts +1 -4
  355. package/packages/omo-codex/plugin/components/telemetry/src/posthog.ts +4 -14
  356. package/packages/omo-codex/plugin/components/telemetry/src/product-identity.ts +1 -1
  357. package/packages/omo-codex/plugin/components/telemetry/test/diagnostics.test.ts +2 -5
  358. package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +10 -4
  359. package/packages/omo-codex/plugin/components/ultrawork/biome.json +2 -2
  360. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +489 -4
  361. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  362. package/packages/omo-codex/plugin/components/ultrawork/package.json +5 -6
  363. package/packages/omo-codex/plugin/components/ultrawork/scripts/sync-directive.mjs +30 -14
  364. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +6 -7
  365. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +31 -7
  366. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-clear.md +2 -1
  367. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +5 -5
  368. package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +4 -0
  369. package/packages/omo-codex/plugin/components/ultrawork/src/directive.ts +5 -2
  370. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook-trigger-policy.test.ts +9 -1
  371. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +0 -136
  372. package/packages/omo-codex/plugin/components/ultrawork/test/directive-source.test.ts +14 -8
  373. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +12 -1
  374. package/packages/omo-codex/plugin/components/ultrawork/test/skill-pointer.test.ts +0 -2
  375. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/AGENTS.md +2 -2
  376. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/NOTICE +1 -1
  377. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/README.md +5 -5
  378. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/biome.json +2 -2
  379. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/directive.md +6 -6
  380. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/dist/cli.js +12 -12
  381. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +28 -0
  382. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/package.json +12 -12
  383. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/boulder-reader.ts +1 -1
  384. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/cli.ts +1 -1
  385. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/codex-hook.ts +3 -3
  386. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/directive.ts +1 -1
  387. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/index.ts +1 -1
  388. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/boulder-reader.test.ts +3 -3
  389. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/cli.test.ts +1 -4
  390. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/codex-hook.test.ts +8 -22
  391. package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +19 -0
  392. package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +1 -1
  393. package/packages/omo-codex/plugin/components/ulw-loop/README.md +12 -1
  394. package/packages/omo-codex/plugin/components/ulw-loop/biome.json +2 -2
  395. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +15 -3
  396. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.d.ts +12 -0
  397. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.js +45 -0
  398. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-continuation.js +9 -0
  399. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.d.ts +15 -0
  400. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.js +15 -1
  401. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.d.ts +8 -0
  402. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.js +120 -0
  403. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +40 -39
  404. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.js +7 -2
  405. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +2 -1
  406. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +12 -1
  407. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.js +2 -0
  408. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +958 -342
  409. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.d.ts +2 -0
  410. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +27 -6
  411. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.d.ts +13 -0
  412. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.js +15 -1
  413. package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +17 -9
  414. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +1 -1
  415. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +17 -2
  416. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.d.ts +13 -0
  417. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.js +19 -0
  418. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.d.ts +7 -0
  419. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.js +9 -0
  420. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.d.ts +12 -0
  421. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.js +104 -0
  422. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.d.ts +13 -1
  423. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.js +65 -9
  424. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.js +5 -1
  425. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.d.ts +4 -2
  426. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +69 -111
  427. package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.js +4 -2
  428. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +185 -14
  429. package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.d.ts +6 -0
  430. package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.js +33 -0
  431. package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +3 -3
  432. package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.d.ts +18 -0
  433. package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.js +65 -0
  434. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
  435. package/packages/omo-codex/plugin/components/ulw-loop/package.json +5 -5
  436. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +3 -2
  437. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/define-goal.md +108 -0
  438. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +22 -1
  439. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-codex-validation.ts +81 -0
  440. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-continuation.ts +7 -0
  441. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-reconciliation.ts +31 -1
  442. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-template.ts +134 -0
  443. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +38 -71
  444. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +7 -2
  445. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts +14 -1
  446. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-subcommands.ts +2 -0
  447. package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +3 -5
  448. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +34 -5
  449. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-snapshot.ts +26 -1
  450. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +3 -1
  451. package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +19 -9
  452. package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +1 -1
  453. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts +18 -3
  454. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-missing-recovery.ts +27 -0
  455. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-aggregate.ts +11 -0
  456. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-artifacts.ts +123 -0
  457. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-fields.ts +68 -15
  458. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-verdicts.ts +6 -1
  459. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +82 -131
  460. package/packages/omo-codex/plugin/components/ulw-loop/src/review-blockers.ts +4 -2
  461. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +187 -12
  462. package/packages/omo-codex/plugin/components/ulw-loop/src/status-next-actions.ts +36 -0
  463. package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +3 -3
  464. package/packages/omo-codex/plugin/components/ulw-loop/src/surface.ts +95 -0
  465. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-continuation.test.ts +0 -1
  466. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-final.test.ts +133 -1
  467. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-template.test.ts +137 -0
  468. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-create-goals.test.ts +25 -0
  469. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +26 -2
  470. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-status-next-actions.test.ts +183 -0
  471. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +37 -2
  472. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-snapshot.test.ts +18 -0
  473. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +0 -3
  474. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/quality-gate-builder.ts +7 -3
  475. package/packages/omo-codex/plugin/components/ulw-loop/test/guided-recovery.test.ts +105 -0
  476. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +5 -37
  477. package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +9 -0
  478. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-aggregate-basics.test.ts +258 -0
  479. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-cap-and-dedupe.test.ts +22 -0
  480. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-poisoning-cascades.test.ts +97 -0
  481. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-roles.test.ts +46 -2
  482. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-senpi-surface.test.ts +131 -0
  483. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-single-report.test.ts +241 -0
  484. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +48 -3
  485. package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +318 -1
  486. package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +8 -5
  487. package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +1 -1
  488. package/packages/omo-codex/plugin/components/ulw-loop/test/surface.test.ts +74 -0
  489. package/packages/omo-codex/plugin/components/ulw-loop/test/ultrawork-directive.test.ts +13 -8
  490. package/packages/omo-codex/plugin/components/ulw-loop/vitest.config.ts +1 -0
  491. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  492. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  493. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  494. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  495. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  496. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  497. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  498. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  499. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  500. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  501. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  502. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  503. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  504. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  505. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +17 -0
  506. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  507. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-ulw-execute-continuation.json +17 -0
  508. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  509. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  510. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  511. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  512. package/packages/omo-codex/plugin/model-catalog.json +3 -3
  513. package/packages/omo-codex/plugin/package-lock.json +676 -524
  514. package/packages/omo-codex/plugin/package.json +2 -3
  515. package/packages/omo-codex/plugin/scripts/AGENTS.md +39 -0
  516. package/packages/omo-codex/plugin/scripts/auto-update-plan.mjs +1 -2
  517. package/packages/omo-codex/plugin/scripts/auto-update.mjs +0 -9
  518. package/packages/omo-codex/plugin/scripts/canonical-ultrawork-directive.mjs +17 -0
  519. package/packages/omo-codex/plugin/scripts/hook-status-message.mjs +0 -1
  520. package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +3 -3
  521. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +36 -13
  522. package/packages/omo-codex/plugin/shared/package.json +3 -4
  523. package/packages/omo-codex/plugin/shared/src/config-loader.ts +2 -102
  524. package/packages/omo-codex/plugin/shared/src/config-migration.ts +0 -1
  525. package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +41 -130
  526. package/packages/omo-codex/plugin/skills/ast-grep/AGENTS.md +51 -0
  527. package/packages/omo-codex/plugin/skills/coding-agent-sessions/AGENTS.md +62 -0
  528. package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +3 -2
  529. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/all-platforms.md +1 -1
  530. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/senpi.md +4 -4
  531. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
  532. package/packages/omo-codex/plugin/skills/data-scientist/SKILL.md +99 -239
  533. package/packages/omo-codex/plugin/skills/data-scientist/references/execution-surfaces.md +91 -0
  534. package/packages/omo-codex/plugin/skills/data-scientist/references/placement.md +74 -0
  535. package/packages/omo-codex/plugin/skills/data-scientist/references/polars-lane.md +95 -0
  536. package/packages/omo-codex/plugin/skills/data-scientist/references/uv-setup.md +1 -1
  537. package/packages/omo-codex/plugin/skills/data-scientist/references/visualization.md +64 -0
  538. package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
  539. package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
  540. package/packages/omo-codex/plugin/skills/debugging/SKILL.md +2 -0
  541. package/packages/omo-codex/plugin/skills/debugging/references/methodology/00-setup.md +12 -0
  542. package/packages/omo-codex/plugin/skills/debugging/references/methodology/02-investigate.md +21 -0
  543. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/go.md +15 -1
  544. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/native-binary.md +38 -0
  545. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/node.md +25 -0
  546. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/python.md +13 -0
  547. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/rust.md +41 -0
  548. package/packages/omo-codex/plugin/skills/debugging/references/scripts/dap.mjs +267 -0
  549. package/packages/omo-codex/plugin/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
  550. package/packages/omo-codex/plugin/skills/debugging/references/tools/dap.md +103 -0
  551. package/packages/omo-codex/plugin/skills/debugging/references/tools/frida.md +193 -0
  552. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +11 -7
  553. package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +1 -0
  554. package/packages/omo-codex/plugin/skills/frontend/references/design/print-paged-media.md +76 -0
  555. package/packages/omo-codex/plugin/skills/frontend/references/design/stylegallery.md +80 -0
  556. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/README.md +1 -1
  557. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
  558. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
  559. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
  560. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/orchestration.md +1 -1
  561. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/routing.md +5 -5
  562. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +13 -13
  563. package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +1 -1
  564. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +4 -4
  565. package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +37 -10
  566. package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +2 -0
  567. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +110 -0
  568. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +1 -1
  569. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +13 -11
  570. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +9 -2
  571. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +15 -3
  572. package/packages/omo-codex/plugin/skills/{start-work → ulw-execute}/SKILL.md +19 -26
  573. package/packages/omo-codex/plugin/skills/ulw-execute/agents/openai.yaml +2 -0
  574. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +3 -2
  575. package/packages/omo-codex/plugin/skills/ulw-loop/references/define-goal.md +108 -0
  576. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +22 -1
  577. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +6 -7
  578. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +31 -7
  579. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-clear.md +2 -1
  580. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +5 -5
  581. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +4 -2
  582. package/packages/omo-codex/plugin/skills/visual-qa/AGENTS.md +58 -0
  583. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +3 -2
  584. package/packages/omo-codex/plugin/test/AGENTS.md +47 -0
  585. package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +19 -173
  586. package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +9 -48
  587. package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +2 -3
  588. package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +2 -7
  589. package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +1 -1
  590. package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +175 -13
  591. package/packages/omo-codex/plugin/test/aggregate.test.mjs +78 -2
  592. package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +19 -33
  593. package/packages/omo-codex/plugin/test/auto-update.test.mjs +2 -27
  594. package/packages/omo-codex/plugin/test/bootstrap-setup.test.mjs +0 -31
  595. package/packages/omo-codex/plugin/test/canonical-ultrawork-directive.test.mjs +53 -0
  596. package/packages/omo-codex/plugin/test/component-bin-names.test.mjs +2 -2
  597. package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +1 -51
  598. package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +2 -2
  599. package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +4 -5
  600. package/packages/omo-codex/plugin/test/lcx-contribute-bug-fix-template.test.mjs +21 -27
  601. package/packages/omo-codex/plugin/test/mcp-research-servers.test.mjs +1 -3
  602. package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +8 -8
  603. package/packages/omo-codex/plugin/test/scaffold-plan.test.mjs +0 -36
  604. package/packages/omo-codex/plugin/test/sync-skills-codex-compatibility.test.mjs +101 -0
  605. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +23 -13
  606. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +14 -119
  607. package/packages/omo-codex/plugin/test/teammode-archive-ambiguity.test.mjs +0 -40
  608. package/packages/omo-codex/plugin/test/teammode-communication.test.mjs +6 -62
  609. package/packages/omo-codex/plugin/test/teammode-thread-links.test.mjs +3 -36
  610. package/packages/omo-codex/plugin/test/teammode-transport.test.mjs +0 -44
  611. package/packages/omo-codex/plugin/test/teammode-worktree.test.mjs +2 -6
  612. package/packages/omo-codex/plugin/test/ultrawork-skill-pointer.test.mjs +5 -5
  613. package/packages/omo-codex/plugin/test/ulw-plan-review-state-contract.test.mjs +0 -3
  614. package/packages/omo-codex/scripts/AGENTS.md +36 -0
  615. package/packages/omo-codex/scripts/install-cache-copy.test.mjs +27 -1
  616. package/packages/omo-codex/scripts/install-config-autonomous-features.test.mjs +1 -1
  617. package/packages/omo-codex/scripts/install-config-autonomous.test.mjs +2 -1
  618. package/packages/omo-codex/scripts/install-config-git-bash.test.mjs +0 -23
  619. package/packages/omo-codex/scripts/install-config-reasoning.test.mjs +2 -2
  620. package/packages/omo-codex/scripts/install-dist/install-local.mjs +2817 -913
  621. package/packages/omo-codex/scripts/install-git-bash-mcp-env.test.mjs +1 -25
  622. package/packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs +7 -2
  623. package/packages/omo-codex/scripts/install-mcp-runtime.test.mjs +0 -36
  624. package/packages/shared-skills/skills/ast-grep/AGENTS.md +51 -0
  625. package/packages/shared-skills/skills/coding-agent-sessions/AGENTS.md +62 -0
  626. package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +3 -2
  627. package/packages/shared-skills/skills/coding-agent-sessions/references/all-platforms.md +1 -1
  628. package/packages/shared-skills/skills/coding-agent-sessions/references/senpi.md +4 -4
  629. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
  630. package/packages/shared-skills/skills/data-scientist/SKILL.md +99 -239
  631. package/packages/shared-skills/skills/data-scientist/references/execution-surfaces.md +91 -0
  632. package/packages/shared-skills/skills/data-scientist/references/placement.md +74 -0
  633. package/packages/shared-skills/skills/data-scientist/references/polars-lane.md +95 -0
  634. package/packages/shared-skills/skills/data-scientist/references/uv-setup.md +1 -1
  635. package/packages/shared-skills/skills/data-scientist/references/visualization.md +64 -0
  636. package/packages/shared-skills/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
  637. package/packages/shared-skills/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
  638. package/packages/shared-skills/skills/debugging/SKILL.md +2 -0
  639. package/packages/shared-skills/skills/debugging/references/methodology/00-setup.md +12 -0
  640. package/packages/shared-skills/skills/debugging/references/methodology/02-investigate.md +21 -0
  641. package/packages/shared-skills/skills/debugging/references/runtimes/go.md +15 -1
  642. package/packages/shared-skills/skills/debugging/references/runtimes/native-binary.md +38 -0
  643. package/packages/shared-skills/skills/debugging/references/runtimes/node.md +25 -0
  644. package/packages/shared-skills/skills/debugging/references/runtimes/python.md +13 -0
  645. package/packages/shared-skills/skills/debugging/references/runtimes/rust.md +41 -0
  646. package/packages/shared-skills/skills/debugging/references/scripts/dap.mjs +267 -0
  647. package/packages/shared-skills/skills/debugging/references/scripts/dap.test.ts +86 -0
  648. package/packages/shared-skills/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
  649. package/packages/shared-skills/skills/debugging/references/tools/dap.md +103 -0
  650. package/packages/shared-skills/skills/debugging/references/tools/frida.md +193 -0
  651. package/packages/shared-skills/skills/frontend/SKILL.md +11 -7
  652. package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +1 -0
  653. package/packages/shared-skills/skills/frontend/references/design/print-paged-media.md +76 -0
  654. package/packages/shared-skills/skills/frontend/references/design/stylegallery.md +80 -0
  655. package/packages/shared-skills/skills/frontend/references/designpowers/README.md +1 -1
  656. package/packages/shared-skills/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
  657. package/packages/shared-skills/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
  658. package/packages/shared-skills/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
  659. package/packages/shared-skills/skills/frontend/references/designpowers/orchestration.md +1 -1
  660. package/packages/shared-skills/skills/frontend/references/designpowers/routing.md +5 -5
  661. package/packages/shared-skills/skills/init-deep/SKILL.md +13 -13
  662. package/packages/shared-skills/skills/review-work/SKILL.md +3 -3
  663. package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +37 -10
  664. package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +2 -0
  665. package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +110 -0
  666. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +1 -1
  667. package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +13 -11
  668. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +9 -2
  669. package/packages/shared-skills/skills/{start-work → ulw-execute}/SKILL.md +17 -16
  670. package/packages/shared-skills/skills/ulw-plan/SKILL.md +6 -7
  671. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +31 -7
  672. package/packages/shared-skills/skills/ulw-plan/references/intent-clear.md +2 -1
  673. package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +5 -5
  674. package/packages/shared-skills/skills/ulw-research/SKILL.md +4 -2
  675. package/packages/shared-skills/skills/visual-qa/AGENTS.md +58 -0
  676. package/packages/shared-skills/skills/visual-qa/SKILL.md +3 -2
  677. package/script/qa/web-terminal-visual-qa.mjs +2 -0
  678. package/script/qa/xterm-live-terminal.mjs +18 -2
  679. package/dist/config/schema/codegraph.d.ts +0 -12
  680. package/dist/config/schema/start-work.d.ts +0 -5
  681. package/dist/features/builtin-commands/templates/start-work.d.ts +0 -1
  682. package/dist/features/builtin-skills/index.d.ts +0 -1
  683. package/dist/features/builtin-skills/skill-file-loader.d.ts +0 -1
  684. package/dist/features/builtin-skills/skills/agent-browser-skill.d.ts +0 -1
  685. package/dist/features/builtin-skills/skills/agent-browser-template.d.ts +0 -1
  686. package/dist/features/builtin-skills/skills/debugging.d.ts +0 -1
  687. package/dist/features/builtin-skills/skills/dev-browser.d.ts +0 -1
  688. package/dist/features/builtin-skills/skills/frontend.d.ts +0 -1
  689. package/dist/features/builtin-skills/skills/git-master-sections/commit-atomic-planning.d.ts +0 -1
  690. package/dist/features/builtin-skills/skills/git-master-sections/commit-context-analysis.d.ts +0 -1
  691. package/dist/features/builtin-skills/skills/git-master-sections/commit-execution-verification.d.ts +0 -1
  692. package/dist/features/builtin-skills/skills/git-master-sections/commit-workflow.d.ts +0 -1
  693. package/dist/features/builtin-skills/skills/git-master-sections/history-search-workflow.d.ts +0 -1
  694. package/dist/features/builtin-skills/skills/git-master-sections/overview.d.ts +0 -1
  695. package/dist/features/builtin-skills/skills/git-master-sections/quick-reference.d.ts +0 -1
  696. package/dist/features/builtin-skills/skills/git-master-sections/rebase-workflow.d.ts +0 -1
  697. package/dist/features/builtin-skills/skills/git-master-skill-metadata.d.ts +0 -1
  698. package/dist/features/builtin-skills/skills/git-master.d.ts +0 -1
  699. package/dist/features/builtin-skills/skills/index.d.ts +0 -1
  700. package/dist/features/builtin-skills/skills/init-deep.d.ts +0 -1
  701. package/dist/features/builtin-skills/skills/playwright-cli.d.ts +0 -1
  702. package/dist/features/builtin-skills/skills/playwright-mcp-skill.d.ts +0 -1
  703. package/dist/features/builtin-skills/skills/playwright.d.ts +0 -1
  704. package/dist/features/builtin-skills/skills/remove-ai-slops.d.ts +0 -1
  705. package/dist/features/builtin-skills/skills/review-work.d.ts +0 -1
  706. package/dist/features/builtin-skills/skills/security-research.d.ts +0 -1
  707. package/dist/features/builtin-skills/skills/security-review.d.ts +0 -1
  708. package/dist/features/builtin-skills/skills/team-mode.d.ts +0 -1
  709. package/dist/features/builtin-skills/skills/visual-qa.d.ts +0 -1
  710. package/dist/features/builtin-skills/skills.d.ts +0 -1
  711. package/dist/features/builtin-skills/types.d.ts +0 -1
  712. package/dist/features/claude-code-plugin-loader/agent-loader.d.ts +0 -1
  713. package/dist/features/claude-code-plugin-loader/command-loader.d.ts +0 -1
  714. package/dist/features/claude-code-plugin-loader/discovery-core.d.ts +0 -1
  715. package/dist/features/claude-code-plugin-loader/discovery-paths.d.ts +0 -1
  716. package/dist/features/claude-code-plugin-loader/discovery.d.ts +0 -1
  717. package/dist/features/claude-code-plugin-loader/hook-loader.d.ts +0 -1
  718. package/dist/features/claude-code-plugin-loader/index.d.ts +0 -1
  719. package/dist/features/claude-code-plugin-loader/install-path-resolver.d.ts +0 -1
  720. package/dist/features/claude-code-plugin-loader/installed-plugin-database.d.ts +0 -1
  721. package/dist/features/claude-code-plugin-loader/loaded-plugin.d.ts +0 -1
  722. package/dist/features/claude-code-plugin-loader/loader.d.ts +0 -1
  723. package/dist/features/claude-code-plugin-loader/mcp-server-loader.d.ts +0 -1
  724. package/dist/features/claude-code-plugin-loader/plugin-key.d.ts +0 -1
  725. package/dist/features/claude-code-plugin-loader/plugin-manifest.d.ts +0 -1
  726. package/dist/features/claude-code-plugin-loader/plugin-path-resolver.d.ts +0 -1
  727. package/dist/features/claude-code-plugin-loader/plugin-settings.d.ts +0 -1
  728. package/dist/features/claude-code-plugin-loader/scope-filter.d.ts +0 -1
  729. package/dist/features/claude-code-plugin-loader/skill-loader.d.ts +0 -1
  730. package/dist/features/claude-code-plugin-loader/types.d.ts +0 -1
  731. package/dist/hooks/codegraph-bootstrap/command-runner.d.ts +0 -17
  732. package/dist/hooks/codegraph-bootstrap/hook.d.ts +0 -35
  733. package/dist/hooks/codegraph-bootstrap/index.d.ts +0 -1
  734. package/dist/hooks/codegraph-bootstrap/project-root.d.ts +0 -1
  735. package/dist/hooks/codegraph-bootstrap/status.d.ts +0 -11
  736. package/dist/hooks/ralph-loop/completion-promise-detector-test-input.d.ts +0 -11
  737. package/dist/hooks/ralph-loop/loop-session-recovery.d.ts +0 -7
  738. package/dist/hooks/start-work/start-work-hook.d.ts +0 -23
  739. package/dist/mcp/codegraph.d.ts +0 -16
  740. package/dist/plugin/chat-message/start-work-message.d.ts +0 -5
  741. package/dist/shared/prompt-async-gate/message-inspection-error.d.ts +0 -1
  742. package/dist/shared/prompt-async-gate/pending-tool-turn.d.ts +0 -1
  743. package/dist/shared/prompt-async-gate/prompt-message-state.d.ts +0 -1
  744. package/dist/shared/prompt-async-gate/queue.d.ts +0 -1
  745. package/dist/shared/prompt-async-gate/recent-dispatches.d.ts +0 -1
  746. package/dist/shared/prompt-async-gate/reservations.d.ts +0 -1
  747. package/dist/shared/prompt-async-gate/semantic-dedupe.d.ts +0 -1
  748. package/dist/shared/prompt-async-gate/session-idle-dispatch.d.ts +0 -1
  749. package/dist/shared/prompt-async-gate/timing.d.ts +0 -1
  750. package/dist/shared/prompt-async-gate/types.d.ts +0 -1
  751. package/dist/skills/data-scientist/references/common-scenarios.md +0 -176
  752. package/dist/skills/data-scientist/references/execution-templates.md +0 -197
  753. package/dist/skills/data-scientist/references/integration-patterns.md +0 -153
  754. package/dist/skills/data-scientist/references/performance-benchmarks.md +0 -37
  755. package/dist/tools/call-omo-agent/background-agent-executor.d.ts +0 -5
  756. package/dist/tools/call-omo-agent/message-storage-directory.d.ts +0 -1
  757. package/dist/tools/delegate-task/model-string-parser.d.ts +0 -1
  758. package/packages/lsp-tools-mcp/dist/lsp/cleanup-errors.d.ts +0 -1
  759. package/packages/lsp-tools-mcp/dist/lsp/constants.d.ts +0 -1
  760. package/packages/lsp-tools-mcp/dist/lsp/language-mappings.d.ts +0 -1
  761. package/packages/lsp-tools-mcp/dist/lsp/process-signal-cleanup.d.ts +0 -1
  762. package/packages/lsp-tools-mcp/dist/missing-dependency-result.d.ts +0 -1
  763. package/packages/omo-codex/plugin/components/codegraph/AGENTS.md +0 -58
  764. package/packages/omo-codex/plugin/components/codegraph/NODE-RUNTIME-LICENSES.md +0 -2951
  765. package/packages/omo-codex/plugin/components/codegraph/NOTICE +0 -16
  766. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +0 -12136
  767. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +0 -9734
  768. package/packages/omo-codex/plugin/components/codegraph/package.json +0 -33
  769. package/packages/omo-codex/plugin/components/codegraph/src/cache-gc.ts +0 -29
  770. package/packages/omo-codex/plugin/components/codegraph/src/cli.ts +0 -79
  771. package/packages/omo-codex/plugin/components/codegraph/src/hook-input.ts +0 -33
  772. package/packages/omo-codex/plugin/components/codegraph/src/hook-sweep.ts +0 -25
  773. package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +0 -131
  774. package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +0 -258
  775. package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +0 -309
  776. package/packages/omo-codex/plugin/components/codegraph/src/mcp-unavailable.ts +0 -80
  777. package/packages/omo-codex/plugin/components/codegraph/src/post-tool-use-hook.ts +0 -34
  778. package/packages/omo-codex/plugin/components/codegraph/src/serve-invocation.ts +0 -29
  779. package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +0 -263
  780. package/packages/omo-codex/plugin/components/codegraph/src/session-start-command.ts +0 -106
  781. package/packages/omo-codex/plugin/components/codegraph/src/session-start-cooldown.ts +0 -145
  782. package/packages/omo-codex/plugin/components/codegraph/src/session-start-hook-runtime.ts +0 -21
  783. package/packages/omo-codex/plugin/components/codegraph/src/session-start-lock.ts +0 -139
  784. package/packages/omo-codex/plugin/components/codegraph/src/session-start-outcome.ts +0 -15
  785. package/packages/omo-codex/plugin/components/codegraph/src/session-start-paths.ts +0 -32
  786. package/packages/omo-codex/plugin/components/codegraph/src/session-start-project.ts +0 -109
  787. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker-result.ts +0 -148
  788. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +0 -175
  789. package/packages/omo-codex/plugin/components/codegraph/src/sweep-cli.ts +0 -81
  790. package/packages/omo-codex/plugin/components/codegraph/test/cache-gc.test.ts +0 -34
  791. package/packages/omo-codex/plugin/components/codegraph/test/hook-exclusion.test.ts +0 -112
  792. package/packages/omo-codex/plugin/components/codegraph/test/hook-registration.test.ts +0 -26
  793. package/packages/omo-codex/plugin/components/codegraph/test/hook-session-start-guard.test.ts +0 -160
  794. package/packages/omo-codex/plugin/components/codegraph/test/hook-store-upgrade.test.ts +0 -50
  795. package/packages/omo-codex/plugin/components/codegraph/test/hook-sweep.test.ts +0 -29
  796. package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +0 -320
  797. package/packages/omo-codex/plugin/components/codegraph/test/mcp-bridge-fixtures.ts +0 -172
  798. package/packages/omo-codex/plugin/components/codegraph/test/package-runtime.test.ts +0 -91
  799. package/packages/omo-codex/plugin/components/codegraph/test/provisioned-node-guard.test.ts +0 -100
  800. package/packages/omo-codex/plugin/components/codegraph/test/serve-built-wrapper.test.ts +0 -76
  801. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge-lifecycle.test.ts +0 -133
  802. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +0 -245
  803. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-facade.test.ts +0 -69
  804. package/packages/omo-codex/plugin/components/codegraph/test/serve-node-support.test.ts +0 -43
  805. package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +0 -147
  806. package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable.test.ts +0 -175
  807. package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +0 -385
  808. package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts +0 -206
  809. package/packages/omo-codex/plugin/components/codegraph/test/session-start-project.test.ts +0 -58
  810. package/packages/omo-codex/plugin/components/codegraph/test/session-start-state.test.ts +0 -104
  811. package/packages/omo-codex/plugin/components/codegraph/test/session-start-trust-boundary.test.ts +0 -65
  812. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-availability.test.ts +0 -106
  813. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-cooldown.test.ts +0 -116
  814. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +0 -258
  815. package/packages/omo-codex/plugin/components/codegraph/test/sweep-cli.test.ts +0 -56
  816. package/packages/omo-codex/plugin/components/codegraph/tsconfig.build.json +0 -13
  817. package/packages/omo-codex/plugin/components/codegraph/tsconfig.json +0 -25
  818. package/packages/omo-codex/plugin/components/start-work-continuation/LICENSE +0 -21
  819. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +0 -28
  820. package/packages/omo-codex/plugin/components/ultrawork/directive.md +0 -471
  821. package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +0 -478
  822. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +0 -18
  823. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +0 -17
  824. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +0 -17
  825. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +0 -17
  826. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/editor.mjs +0 -125
  827. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/jsonc.mjs +0 -43
  828. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/scaffold.mjs +0 -29
  829. package/packages/omo-codex/plugin/scripts/migrate-omo-sot.mjs +0 -121
  830. package/packages/omo-codex/plugin/skills/data-scientist/references/common-scenarios.md +0 -176
  831. package/packages/omo-codex/plugin/skills/data-scientist/references/execution-templates.md +0 -197
  832. package/packages/omo-codex/plugin/skills/data-scientist/references/integration-patterns.md +0 -153
  833. package/packages/omo-codex/plugin/skills/data-scientist/references/performance-benchmarks.md +0 -37
  834. package/packages/omo-codex/plugin/skills/start-work/agents/openai.yaml +0 -2
  835. package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +0 -92
  836. package/packages/omo-codex/plugin/test/component-codegraph-mcp-smoke.test.mjs +0 -76
  837. package/packages/omo-codex/plugin/test/migrate-omo-sot.test.mjs +0 -179
  838. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +0 -314
  839. package/packages/omo-codex/plugin/test/ulw-plan-scope-contract.test.mjs +0 -24
  840. package/packages/shared-skills/skills/data-scientist/references/common-scenarios.md +0 -176
  841. package/packages/shared-skills/skills/data-scientist/references/execution-templates.md +0 -197
  842. package/packages/shared-skills/skills/data-scientist/references/integration-patterns.md +0 -153
  843. package/packages/shared-skills/skills/data-scientist/references/performance-benchmarks.md +0 -37
  844. /package/dist/hooks/{start-work → ulw-execute}/context-info-formatters.d.ts +0 -0
  845. /package/dist/hooks/{start-work → ulw-execute}/explicit-plan-context.d.ts +0 -0
  846. /package/dist/hooks/{start-work → ulw-execute}/notepad-scaffold.d.ts +0 -0
  847. /package/dist/hooks/{start-work → ulw-execute}/parse-user-request.d.ts +0 -0
  848. /package/dist/hooks/{start-work → ulw-execute}/plan-discovery-context.d.ts +0 -0
  849. /package/dist/hooks/{start-work → ulw-execute}/plan-selection.d.ts +0 -0
  850. /package/dist/hooks/{start-work → ulw-execute}/session-plan-affinity.d.ts +0 -0
  851. /package/dist/hooks/{start-work → ulw-execute}/work-initializer.d.ts +0 -0
  852. /package/dist/hooks/{start-work → ulw-execute}/worktree-block.d.ts +0 -0
  853. /package/dist/hooks/{start-work → ulw-execute}/worktree-detector.d.ts +0 -0
  854. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/.gitattributes +0 -0
  855. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/CHANGELOG.md +0 -0
  856. /package/packages/omo-codex/plugin/components/{codegraph → ulw-execute-continuation}/LICENSE +0 -0
  857. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/plan-checklist.ts +0 -0
  858. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/types.ts +0 -0
  859. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-completed.json +0 -0
  860. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-mixed-platforms.json +0 -0
  861. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-single-codex-work.json +0 -0
  862. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-all-done.md +0 -0
  863. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-scaffold.md +0 -0
  864. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-nested-checkboxes.md +0 -0
  865. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-unchecked.md +0 -0
  866. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.build.json +0 -0
  867. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.json +0 -0
  868. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/vitest.config.ts +0 -0
@@ -175,6 +175,7 @@ async function runJsonRpcStdioServer(config) {
175
175
  const idleTimer = createIdleTimer(idleTimeoutMs, log, () => {
176
176
  isClosed = true;
177
177
  config.onIdleTimeout?.();
178
+ config.input.destroy();
178
179
  });
179
180
  const watchdog = createParentWatchdog(config.parentWatchdog, (parentPid, pollIntervalMs) => {
180
181
  isClosed = true;
@@ -271,7 +272,11 @@ function createParentWatchdog(config, onDeadParent) {
271
272
  const probeAlive = config.probeAlive ?? isProcessAlive;
272
273
  let fired = false;
273
274
  const timer = setInterval(() => {
274
- if (fired || probeAlive(parentPid))
275
+ if (fired)
276
+ return;
277
+ const alive = probeAlive(parentPid);
278
+ config.onPoll?.(alive);
279
+ if (alive)
275
280
  return;
276
281
  fired = true;
277
282
  onDeadParent(parentPid, pollIntervalMs);
@@ -306,8 +311,8 @@ function createIdleTimer(idleTimeoutMs, log, onTimeout) {
306
311
  };
307
312
  }
308
313
  // ../lsp-core/src/lsp/client-wrapper.ts
309
- import { existsSync as existsSync9, statSync as statSync3 } from "node:fs";
310
- import { dirname as dirname6, join as join4, resolve as resolve7 } from "node:path";
314
+ import { existsSync as existsSync10, realpathSync as realpathSync5, statSync as statSync3 } from "node:fs";
315
+ import { basename as basename3, dirname as dirname8, join as join5, resolve as resolve8 } from "node:path";
311
316
 
312
317
  // ../lsp-core/src/request-context.ts
313
318
  import { AsyncLocalStorage } from "node:async_hooks";
@@ -316,18 +321,17 @@ import { homedir } from "node:os";
316
321
  import { basename, delimiter, dirname, isAbsolute, join, relative, resolve } from "node:path";
317
322
 
318
323
  class LspRequestContextParseError extends Error {
319
- code;
320
- name = "LspRequestContextParseError";
321
324
  constructor(code, message) {
322
325
  super(message);
323
326
  this.code = code;
327
+ this.name = "LspRequestContextParseError";
324
328
  }
325
329
  }
326
330
 
327
331
  class LspRequestContextUnavailableError extends Error {
328
- name = "LspRequestContextUnavailableError";
329
332
  constructor() {
330
333
  super("LSP request context is required. Standalone MCP startup must install one with runWithRequestContext(createStandaloneMcpRequestContext()).");
334
+ this.name = "LspRequestContextUnavailableError";
331
335
  }
332
336
  }
333
337
  var storage = new AsyncLocalStorage;
@@ -357,7 +361,7 @@ function contextEnv(key) {
357
361
  }
358
362
  function createStandaloneMcpRequestContext(input = {}) {
359
363
  const env = input.env ?? process.env;
360
- const cwd = canonicalCwd(input.cwd ?? process.cwd());
364
+ const cwd = canonicalCwd(input.cwd ?? env["LSP_TOOLS_MCP_CWD"] ?? process.cwd());
361
365
  const home = input.homeDir ?? homedir();
362
366
  const projectConfigPaths = translateProjectConfigEnv(env["LSP_TOOLS_MCP_PROJECT_CONFIG"], cwd);
363
367
  const userConfigPath = translateHomeConfigEnv(env["LSP_TOOLS_MCP_USER_CONFIG"], home, ".codex/lsp-client.json");
@@ -500,22 +504,15 @@ function effectiveExtension(filePath) {
500
504
 
501
505
  // ../lsp-core/src/lsp/errors.ts
502
506
  class LspConnectionClosedError extends Error {
503
- serverId;
504
- root;
505
- name = "LspConnectionClosedError";
506
507
  constructor(serverId, root, message) {
507
508
  super(message ?? `LSP connection closed for ${serverId} at ${root}`);
508
509
  this.serverId = serverId;
509
510
  this.root = root;
511
+ this.name = "LspConnectionClosedError";
510
512
  }
511
513
  }
512
514
 
513
515
  class LspProcessExitedError extends Error {
514
- serverId;
515
- root;
516
- exitCode;
517
- stderrTail;
518
- name = "LspProcessExitedError";
519
516
  constructor(serverId, root, exitCode, stderrTail) {
520
517
  const stderrSuffix = stderrTail ? `
521
518
  stderr tail: ${stderrTail}` : "";
@@ -524,46 +521,59 @@ stderr tail: ${stderrTail}` : "";
524
521
  this.root = root;
525
522
  this.exitCode = exitCode;
526
523
  this.stderrTail = stderrTail;
524
+ this.name = "LspProcessExitedError";
527
525
  }
528
526
  }
529
527
 
530
528
  class LspRequestTimeoutError extends Error {
531
- method;
532
- stderrTail;
533
- name = "LspRequestTimeoutError";
534
529
  constructor(method, stderrTail) {
535
530
  const stderrSuffix = stderrTail ? `
536
531
  recent stderr: ${stderrTail}` : "";
537
532
  super(`LSP request timeout (method: ${method})${stderrSuffix}`);
538
533
  this.method = method;
539
534
  this.stderrTail = stderrTail;
535
+ this.name = "LspRequestTimeoutError";
540
536
  }
541
537
  }
542
538
 
543
539
  class LspInvalidPathError extends Error {
544
- name = "LspInvalidPathError";
540
+ constructor() {
541
+ super(...arguments);
542
+ this.name = "LspInvalidPathError";
543
+ }
545
544
  }
546
545
 
547
546
  class LspServerLookupError extends Error {
548
- lookup;
549
- name = "LspServerLookupError";
550
547
  constructor(message, lookup) {
551
548
  super(message);
552
549
  this.lookup = lookup;
550
+ this.name = "LspServerLookupError";
553
551
  }
554
552
  }
555
553
 
556
554
  class LspServerInitializingError extends Error {
557
- originalError;
558
- name = "LspServerInitializingError";
559
555
  constructor(originalError) {
560
556
  super(`LSP server is still initializing. Please retry in a few seconds. Original error: ${originalError.message}`);
561
557
  this.originalError = originalError;
558
+ this.name = "LspServerInitializingError";
562
559
  }
563
560
  }
564
561
 
565
562
  class LspProcessSpawnError extends Error {
566
- name = "LspProcessSpawnError";
563
+ constructor() {
564
+ super(...arguments);
565
+ this.name = "LspProcessSpawnError";
566
+ }
567
+ }
568
+
569
+ class LspClientRespawnBudgetExceededError extends Error {
570
+ constructor(serverId, root, retryLimit) {
571
+ super(`LSP server ${serverId} at ${root} failed to stay alive; respawn budget exhausted ` + `(${retryLimit} consecutive dead generations). Retrying after the cooldown may succeed.`);
572
+ this.serverId = serverId;
573
+ this.root = root;
574
+ this.retryLimit = retryLimit;
575
+ this.name = "LspClientRespawnBudgetExceededError";
576
+ }
567
577
  }
568
578
  function isLspDeadConnectionError(err) {
569
579
  return err instanceof LspConnectionClosedError || err instanceof LspProcessExitedError;
@@ -586,6 +596,13 @@ import { pathToFileURL as pathToFileURL3 } from "node:url";
586
596
  // ../lsp-core/src/lsp/connection.ts
587
597
  import { pathToFileURL } from "node:url";
588
598
 
599
+ // ../lsp-core/src/lsp/timer-provider.ts
600
+ var realTimerProvider = {
601
+ now: () => Date.now(),
602
+ setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
603
+ clearTimeout: (handle) => clearTimeout(handle)
604
+ };
605
+
589
606
  // ../lsp-core/src/lsp/constants.ts
590
607
  var DEFAULT_MAX_REFERENCES = 200;
591
608
  var DEFAULT_MAX_SYMBOLS = 200;
@@ -594,9 +611,12 @@ var DEFAULT_MAX_DIRECTORY_FILES = 50;
594
611
  var REQUEST_TIMEOUT_MS = 15000;
595
612
  var INIT_TIMEOUT_MS = 60000;
596
613
  var IDLE_TIMEOUT_MS = 5 * 60000;
614
+ var MAX_RESIDENT_CLIENTS = 6;
597
615
  var REAPER_INTERVAL_MS = 60000;
598
616
  var STOP_HARD_KILL_TIMEOUT_MS = 5000;
599
617
  var STOP_SIGKILL_GRACE_MS = 1000;
618
+ var CLIENT_RESPAWN_RETRY_LIMIT = 2;
619
+ var CLIENT_RESPAWN_COOLDOWN_MS = 60000;
600
620
 
601
621
  // ../lsp-core/src/lsp/json-rpc-connection.ts
602
622
  var HEADER_SEPARATOR2 = `\r
@@ -608,20 +628,31 @@ var METHOD_NOT_FOUND = -32601;
608
628
  var INTERNAL_ERROR = -32603;
609
629
 
610
630
  class JsonRpcConnection {
611
- reader;
612
- writer;
613
- pendingRequests = new Map;
614
- notificationHandlers = new Map;
615
- requestHandlers = new Map;
616
- closeHandlers = [];
617
- errorHandlers = [];
618
- inputBuffer = Buffer.alloc(0);
619
- nextRequestId = 1;
620
- listening = false;
621
- disposed = false;
622
631
  constructor(reader, writer) {
623
632
  this.reader = reader;
624
633
  this.writer = writer;
634
+ this.pendingRequests = new Map;
635
+ this.notificationHandlers = new Map;
636
+ this.requestHandlers = new Map;
637
+ this.closeHandlers = [];
638
+ this.errorHandlers = [];
639
+ this.inputBuffer = Buffer.alloc(0);
640
+ this.nextRequestId = 1;
641
+ this.listening = false;
642
+ this.disposed = false;
643
+ this.handleData = (chunk) => {
644
+ const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf8");
645
+ this.inputBuffer = Buffer.concat([this.inputBuffer, chunkBuffer]);
646
+ this.drainInputBuffer();
647
+ };
648
+ this.handleClose = () => {
649
+ for (const handler of this.closeHandlers) {
650
+ handler();
651
+ }
652
+ };
653
+ this.handleStreamError = (error) => {
654
+ this.emitError(error);
655
+ };
625
656
  }
626
657
  listen() {
627
658
  if (this.listening)
@@ -742,19 +773,6 @@ class JsonRpcConnection {
742
773
  this.notificationHandlers.clear();
743
774
  this.requestHandlers.clear();
744
775
  }
745
- handleData = (chunk) => {
746
- const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf8");
747
- this.inputBuffer = Buffer.concat([this.inputBuffer, chunkBuffer]);
748
- this.drainInputBuffer();
749
- };
750
- handleClose = () => {
751
- for (const handler of this.closeHandlers) {
752
- handler();
753
- }
754
- };
755
- handleStreamError = (error) => {
756
- this.emitError(error);
757
- };
758
776
  drainInputBuffer() {
759
777
  while (true) {
760
778
  const headerEnd = this.inputBuffer.indexOf(HEADER_SEPARATOR2);
@@ -1102,33 +1120,29 @@ function isPosition(value) {
1102
1120
 
1103
1121
  // ../lsp-core/src/lsp/transport.ts
1104
1122
  class LspClientNotStartedError extends Error {
1105
- serverId;
1106
- root;
1107
- name = "LspClientNotStartedError";
1108
1123
  constructor(serverId, root) {
1109
1124
  super("LSP client not started");
1110
1125
  this.serverId = serverId;
1111
1126
  this.root = root;
1127
+ this.name = "LspClientNotStartedError";
1112
1128
  }
1113
1129
  }
1114
1130
 
1115
1131
  class LspClientTransport {
1116
- root;
1117
- server;
1118
- proc = null;
1119
- connection = null;
1120
- stderrBuffer = [];
1121
- processExited = false;
1122
- diagnosticsStore = new Map;
1123
- requestTimeoutMs;
1124
- initializeTimeoutMs;
1125
- workspaceApplyEditHandler = null;
1126
- diagnosticPullSupported = false;
1127
1132
  constructor(root, server2, timeouts = {}) {
1128
1133
  this.root = root;
1129
1134
  this.server = server2;
1135
+ this.proc = null;
1136
+ this.connection = null;
1137
+ this.stderrBuffer = [];
1138
+ this.processExited = false;
1139
+ this.diagnosticsStore = new Map;
1140
+ this.workspaceApplyEditHandler = null;
1141
+ this.diagnosticPullSupported = false;
1142
+ this.documentFormattingSupported = false;
1130
1143
  this.requestTimeoutMs = timeouts.requestTimeoutMs ?? REQUEST_TIMEOUT_MS;
1131
1144
  this.initializeTimeoutMs = timeouts.initializeTimeoutMs ?? INIT_TIMEOUT_MS;
1145
+ this.timerProvider = timeouts.timerProvider ?? realTimerProvider;
1132
1146
  }
1133
1147
  pid() {
1134
1148
  return this.proc?.pid;
@@ -1148,6 +1162,12 @@ class LspClientTransport {
1148
1162
  isDiagnosticPullSupported() {
1149
1163
  return this.diagnosticPullSupported;
1150
1164
  }
1165
+ setDocumentFormattingSupported(supported) {
1166
+ this.documentFormattingSupported = supported;
1167
+ }
1168
+ isDocumentFormattingSupported() {
1169
+ return this.documentFormattingSupported;
1170
+ }
1151
1171
  handlePublishDiagnostics(params) {
1152
1172
  this.diagnosticsStore.set(params.uri, [...params.diagnostics]);
1153
1173
  }
@@ -1223,7 +1243,7 @@ class LspClientTransport {
1223
1243
  const options = args[1];
1224
1244
  const timeoutMs = options?.timeoutMs ?? this.requestTimeoutMs;
1225
1245
  const timeoutController = new AbortController;
1226
- const timeoutHandle = setTimeout(() => {
1246
+ const timeoutHandle = this.timerProvider.setTimeout(() => {
1227
1247
  const stderrTail = this.stderrBuffer.slice(-5).join(`
1228
1248
  `);
1229
1249
  timeoutController.abort(new LspRequestTimeoutError(method, stderrTail || undefined));
@@ -1242,7 +1262,7 @@ class LspClientTransport {
1242
1262
  }
1243
1263
  throw error;
1244
1264
  } finally {
1245
- clearTimeout(timeoutHandle);
1265
+ this.timerProvider.clearTimeout(timeoutHandle);
1246
1266
  combinedSignal.dispose();
1247
1267
  }
1248
1268
  }
@@ -1361,6 +1381,14 @@ function supportsDiagnosticPull(capabilities) {
1361
1381
  return false;
1362
1382
  return Object.hasOwn(capabilities, "diagnosticProvider");
1363
1383
  }
1384
+ function supportsDocumentFormatting(capabilities) {
1385
+ if (capabilities === undefined)
1386
+ return false;
1387
+ const provider = capabilities.documentFormattingProvider;
1388
+ if (provider === undefined || provider === null || provider === false)
1389
+ return false;
1390
+ return provider === true || typeof provider === "object";
1391
+ }
1364
1392
 
1365
1393
  class LspClientConnection extends LspClientTransport {
1366
1394
  async initialize() {
@@ -1377,6 +1405,7 @@ class LspClientConnection extends LspClientTransport {
1377
1405
  references: {},
1378
1406
  documentSymbol: { hierarchicalDocumentSymbolSupport: true },
1379
1407
  publishDiagnostics: {},
1408
+ formatting: { dynamicRegistration: false },
1380
1409
  rename: {
1381
1410
  prepareSupport: true,
1382
1411
  prepareSupportDefaultBehavior: 1
@@ -1418,6 +1447,7 @@ class LspClientConnection extends LspClientTransport {
1418
1447
  initializationOptions: this.server.initialization
1419
1448
  }, { timeoutMs: this.initializeTimeoutMs });
1420
1449
  this.setDiagnosticPullSupported(supportsDiagnosticPull(result?.capabilities));
1450
+ this.setDocumentFormattingSupported(supportsDocumentFormatting(result?.capabilities));
1421
1451
  await this.sendNotification("initialized", {});
1422
1452
  await this.sendNotification("workspace/didChangeConfiguration", {
1423
1453
  settings: { json: { validate: { enable: true } } }
@@ -1613,6 +1643,17 @@ function canonicalPath(filePath) {
1613
1643
  return absolute;
1614
1644
  }
1615
1645
  }
1646
+ function normalizeDocumentUri(uri) {
1647
+ let decoded = uri;
1648
+ try {
1649
+ decoded = decodeURIComponent(uri);
1650
+ } catch {
1651
+ decoded = uri;
1652
+ }
1653
+ if (process.platform !== "win32")
1654
+ return decoded;
1655
+ return decoded.replace(/^(file:\/\/\/)([a-z]):/, (_match, prefix, drive) => `${prefix}${drive.toUpperCase()}:`);
1656
+ }
1616
1657
  function isSameOrDescendant(candidate, parent) {
1617
1658
  const suffix = relative2(parent, candidate);
1618
1659
  return suffix === "" || !suffix.startsWith("..") && suffix !== "..";
@@ -1623,17 +1664,18 @@ function movedPath(candidate, oldPath, newPath) {
1623
1664
  }
1624
1665
 
1625
1666
  class WorkspaceDocumentState {
1626
- sendNotification;
1627
- clearDiagnostics;
1628
- openDocuments = new Map;
1629
- openByUri = new Map;
1630
- openPromises = new Map;
1631
- now;
1632
- versionlessPublishQuiescenceMs;
1633
1667
  constructor(sendNotification, clearDiagnostics, options = {}) {
1634
1668
  this.sendNotification = sendNotification;
1635
1669
  this.clearDiagnostics = clearDiagnostics;
1636
- this.now = options.now ?? (() => Date.now());
1670
+ this.openDocuments = new Map;
1671
+ this.openByUri = new Map;
1672
+ this.openPromises = new Map;
1673
+ this.timerProvider = options.timerProvider ?? {
1674
+ now: options.now ?? (() => Date.now()),
1675
+ setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
1676
+ clearTimeout: (handle) => clearTimeout(handle)
1677
+ };
1678
+ this.now = () => this.timerProvider.now();
1637
1679
  this.versionlessPublishQuiescenceMs = options.versionlessPublishQuiescenceMs ?? DEFAULT_VERSIONLESS_PUBLISH_QUIESCENCE_MS;
1638
1680
  }
1639
1681
  async openFile(filePath) {
@@ -1655,7 +1697,7 @@ class WorkspaceDocumentState {
1655
1697
  return this.openDocuments.get(canonicalPath(filePath))?.version;
1656
1698
  }
1657
1699
  getStoredDiagnostics(uri) {
1658
- const state = this.openByUri.get(uri);
1700
+ const state = this.openByUri.get(normalizeDocumentUri(uri));
1659
1701
  if (!state)
1660
1702
  return [];
1661
1703
  return state.lastPublish?.diagnostics ?? state.pullCache?.diagnostics ?? [];
@@ -1677,13 +1719,13 @@ class WorkspaceDocumentState {
1677
1719
  return state !== undefined && state.uri === snapshot.uri && state.version === snapshot.version && state.generation === snapshot.documentGeneration;
1678
1720
  }
1679
1721
  getPullCache(snapshot) {
1680
- const state = this.openByUri.get(snapshot.uri);
1722
+ const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
1681
1723
  if (!state?.pullCache || state.pullCache.documentVersion !== snapshot.version)
1682
1724
  return null;
1683
1725
  return state.pullCache;
1684
1726
  }
1685
1727
  recordPullDiagnostics(snapshot, report) {
1686
- const state = this.openByUri.get(snapshot.uri);
1728
+ const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
1687
1729
  if (!state)
1688
1730
  return;
1689
1731
  state.pullCache = {
@@ -1693,7 +1735,7 @@ class WorkspaceDocumentState {
1693
1735
  };
1694
1736
  }
1695
1737
  recordPublishedDiagnostics(params) {
1696
- const state = this.openByUri.get(params.uri);
1738
+ const state = this.openByUri.get(normalizeDocumentUri(params.uri));
1697
1739
  if (!state)
1698
1740
  return;
1699
1741
  state.publishGeneration += 1;
@@ -1707,7 +1749,7 @@ class WorkspaceDocumentState {
1707
1749
  this.notifyWaiters(state);
1708
1750
  }
1709
1751
  resolvePushDiagnostics(snapshot) {
1710
- const state = this.openByUri.get(snapshot.uri);
1752
+ const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
1711
1753
  if (!state?.lastPublish)
1712
1754
  return { status: "missing" };
1713
1755
  const publish = state.lastPublish;
@@ -1721,7 +1763,7 @@ class WorkspaceDocumentState {
1721
1763
  return waitMs === 0 ? { status: "ready", diagnostics: publish.diagnostics } : { status: "wait", waitMs };
1722
1764
  }
1723
1765
  waitForDiagnosticsActivity(snapshot, timeoutMs) {
1724
- const state = this.openByUri.get(snapshot.uri);
1766
+ const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
1725
1767
  if (!state || timeoutMs <= 0)
1726
1768
  return Promise.resolve();
1727
1769
  return new Promise((resolveActivity) => {
@@ -1730,11 +1772,11 @@ class WorkspaceDocumentState {
1730
1772
  if (settled)
1731
1773
  return;
1732
1774
  settled = true;
1733
- clearTimeout(timer);
1775
+ this.timerProvider.clearTimeout(timer);
1734
1776
  state.waiters.delete(finish);
1735
1777
  resolveActivity();
1736
1778
  };
1737
- const timer = setTimeout(finish, timeoutMs);
1779
+ const timer = this.timerProvider.setTimeout(finish, timeoutMs);
1738
1780
  if (typeof timer.unref === "function")
1739
1781
  timer.unref();
1740
1782
  state.waiters.add(finish);
@@ -1842,7 +1884,7 @@ class WorkspaceDocumentState {
1842
1884
  waiters: new Set
1843
1885
  };
1844
1886
  this.openDocuments.set(path, state);
1845
- this.openByUri.set(state.uri, state);
1887
+ this.openByUri.set(normalizeDocumentUri(state.uri), state);
1846
1888
  this.notifyWaiters(state);
1847
1889
  await this.sendNotification("textDocument/didOpen", {
1848
1890
  textDocument: { uri: state.uri, languageId: state.languageId, version: state.version, text }
@@ -1867,7 +1909,7 @@ class WorkspaceDocumentState {
1867
1909
  }
1868
1910
  async closeDocument(state) {
1869
1911
  this.openDocuments.delete(state.path);
1870
- this.openByUri.delete(state.uri);
1912
+ this.openByUri.delete(normalizeDocumentUri(state.uri));
1871
1913
  this.clearDiagnostics(state.uri);
1872
1914
  this.notifyWaiters(state);
1873
1915
  await this.sendNotification("textDocument/didClose", { textDocument: { uri: state.uri } });
@@ -1896,13 +1938,11 @@ import { dirname as dirname2, isAbsolute as isAbsolute2, relative as relative3,
1896
1938
  import { fileURLToPath } from "node:url";
1897
1939
 
1898
1940
  class WorkspaceEditPathError extends Error {
1899
- path;
1900
- detail;
1901
- name = "WorkspaceEditPathError";
1902
1941
  constructor(path, detail) {
1903
1942
  super(`${detail}: ${path}`);
1904
1943
  this.path = path;
1905
1944
  this.detail = detail;
1945
+ this.name = "WorkspaceEditPathError";
1906
1946
  }
1907
1947
  }
1908
1948
  function isPathInsideWorkspace(filePath, workspaceRoot) {
@@ -2194,13 +2234,11 @@ function canonicalFingerprint(operations) {
2194
2234
 
2195
2235
  // ../lsp-core/src/lsp/workspace-edit-types.ts
2196
2236
  class WorkspaceEditValidationError extends Error {
2197
- changeIndex;
2198
- detail;
2199
- name = "WorkspaceEditValidationError";
2200
2237
  constructor(changeIndex, detail) {
2201
2238
  super(`change ${changeIndex}: ${detail}`);
2202
2239
  this.changeIndex = changeIndex;
2203
2240
  this.detail = detail;
2241
+ this.name = "WorkspaceEditValidationError";
2204
2242
  }
2205
2243
  }
2206
2244
 
@@ -2698,10 +2736,9 @@ function simulateDelete(operation, virtual) {
2698
2736
  import { existsSync as existsSync5, lstatSync as lstatSync3, readdirSync as readdirSync2 } from "node:fs";
2699
2737
  import { dirname as dirname4, resolve as resolve5 } from "node:path";
2700
2738
  class WorkspaceSnapshotBuilder {
2701
- workspaceRoot;
2702
- snapshots = new Map;
2703
2739
  constructor(workspaceRoot) {
2704
2740
  this.workspaceRoot = workspaceRoot;
2741
+ this.snapshots = new Map;
2705
2742
  }
2706
2743
  build(operations) {
2707
2744
  this.add(this.workspaceRoot, false);
@@ -2745,8 +2782,10 @@ function snapshotOperations(operations, workspaceRoot) {
2745
2782
 
2746
2783
  // ../lsp-core/src/lsp/workspace-edit-plan.ts
2747
2784
  class PlanPathIndex {
2748
- firstChangeByPath = new Map;
2749
- reportedPathByCanonical = new Map;
2785
+ constructor() {
2786
+ this.firstChangeByPath = new Map;
2787
+ this.reportedPathByCanonical = new Map;
2788
+ }
2750
2789
  build(operations) {
2751
2790
  for (const operation of operations) {
2752
2791
  switch (operation.kind) {
@@ -2835,14 +2874,11 @@ function isRecord4(value) {
2835
2874
  }
2836
2875
 
2837
2876
  class WorkspaceMutationController {
2838
- workspaceRoot;
2839
- documents;
2840
- activeLease = null;
2841
- nextLeaseId = 1;
2842
- io;
2843
2877
  constructor(workspaceRoot, documents) {
2844
2878
  this.workspaceRoot = workspaceRoot;
2845
2879
  this.documents = documents;
2880
+ this.activeLease = null;
2881
+ this.nextLeaseId = 1;
2846
2882
  }
2847
2883
  setIo(io) {
2848
2884
  this.io = io;
@@ -2955,14 +2991,12 @@ var DIAGNOSTICS_FRESHNESS_TIMEOUT_MS = 3000;
2955
2991
  var VERSIONLESS_PUBLISH_QUIESCENCE_MS = 250;
2956
2992
 
2957
2993
  class LspClient extends LspClientConnection {
2958
- diagnosticPullErrors = [];
2959
- documents;
2960
- workspaceMutations;
2961
- diagnosticsFreshnessTimeoutMs;
2962
2994
  constructor(root, server2, options = {}) {
2963
2995
  super(root, server2, options);
2996
+ this.diagnosticPullErrors = [];
2964
2997
  this.diagnosticsFreshnessTimeoutMs = options.diagnosticsFreshnessTimeoutMs ?? DIAGNOSTICS_FRESHNESS_TIMEOUT_MS;
2965
2998
  this.documents = new WorkspaceDocumentState((method, params) => this.sendNotification(method, params), (uri) => this.diagnosticsStore.delete(uri), {
2999
+ timerProvider: this.timerProvider,
2966
3000
  versionlessPublishQuiescenceMs: options.versionlessPublishQuiescenceMs ?? VERSIONLESS_PUBLISH_QUIESCENCE_MS
2967
3001
  });
2968
3002
  this.workspaceMutations = new WorkspaceMutationController(root, this.documents);
@@ -3015,6 +3049,18 @@ class LspClient extends LspClientConnection {
3015
3049
  textDocument: { uri: pathToFileURL3(absPath).href }
3016
3050
  }, options);
3017
3051
  }
3052
+ async formatDocument(filePath, options, signal) {
3053
+ if (!this.isDocumentFormattingSupported())
3054
+ return null;
3055
+ const absPath = this.resolveWorkspacePath(filePath);
3056
+ await this.openFile(absPath);
3057
+ const requestOptions = signal === undefined ? {} : { signal };
3058
+ const edits = await this.sendRequest("textDocument/formatting", {
3059
+ textDocument: { uri: pathToFileURL3(absPath).href },
3060
+ options
3061
+ }, requestOptions);
3062
+ return edits ?? [];
3063
+ }
3018
3064
  async workspaceSymbols(query, signal) {
3019
3065
  const options = signal === undefined ? {} : { signal };
3020
3066
  return this.sendRequest("workspace/symbol", { query }, options);
@@ -3054,7 +3100,7 @@ class LspClient extends LspClientConnection {
3054
3100
  const absPath = this.resolveWorkspacePath(filePath);
3055
3101
  const uri = pathToFileURL3(absPath).href;
3056
3102
  await this.openFile(absPath);
3057
- const deadlineAt = Date.now() + this.diagnosticsFreshnessTimeoutMs;
3103
+ const deadlineAt = this.timerProvider.now() + this.diagnosticsFreshnessTimeoutMs;
3058
3104
  for (;; ) {
3059
3105
  signal?.throwIfAborted();
3060
3106
  const snapshot = this.documents.captureDiagnosticSnapshot(absPath);
@@ -3067,7 +3113,7 @@ class LspClient extends LspClientConnection {
3067
3113
  if (!pushFallbackOnly) {
3068
3114
  const cached = this.documents.getPullCache(snapshot);
3069
3115
  try {
3070
- const remainingMs2 = deadlineAt - Date.now();
3116
+ const remainingMs2 = deadlineAt - this.timerProvider.now();
3071
3117
  if (remainingMs2 <= 0)
3072
3118
  return this.freshnessTimeout(absPath);
3073
3119
  const result = await this.sendRequest("textDocument/diagnostic", {
@@ -3102,7 +3148,7 @@ class LspClient extends LspClientConnection {
3102
3148
  }
3103
3149
  if (!pushFallbackOnly)
3104
3150
  continue;
3105
- const remainingMs = deadlineAt - Date.now();
3151
+ const remainingMs = deadlineAt - this.timerProvider.now();
3106
3152
  if (remainingMs <= 0) {
3107
3153
  if (!this.isDiagnosticPullSupported() && snapshot.publishGeneration === 0) {
3108
3154
  const cached = this.documents.getPullCache(snapshot);
@@ -3260,18 +3306,16 @@ function awaitWithSignal(promise, signal) {
3260
3306
  }
3261
3307
 
3262
3308
  class LspManager {
3263
- clients = new Map;
3264
- reaperHandle = null;
3265
- signalDisposer = null;
3266
- disposed = false;
3267
- idleTimeoutMs;
3268
- initTimeoutMs;
3269
- reaperIntervalMs;
3270
- clientFactory;
3271
- now;
3272
3309
  constructor(options = {}) {
3310
+ this.clients = new Map;
3311
+ this.pendingStops = new Map;
3312
+ this.respawnBudgets = new Map;
3313
+ this.reaperHandle = null;
3314
+ this.signalDisposer = null;
3315
+ this.disposed = false;
3273
3316
  this.idleTimeoutMs = options.idleTimeoutMs ?? IDLE_TIMEOUT_MS;
3274
3317
  this.initTimeoutMs = options.initTimeoutMs ?? INIT_TIMEOUT_MS;
3318
+ this.maxResidentClients = options.maxResidentClients ?? MAX_RESIDENT_CLIENTS;
3275
3319
  this.reaperIntervalMs = options.reaperIntervalMs ?? REAPER_INTERVAL_MS;
3276
3320
  this.clientFactory = options.clientFactory ?? ((root, server2) => new LspClient(root, server2));
3277
3321
  this.now = options.now ?? (() => Date.now());
@@ -3291,24 +3335,79 @@ class LspManager {
3291
3335
  getKey(root, serverId) {
3292
3336
  return `${root}::${serverId}`;
3293
3337
  }
3338
+ tombstoneStop(key, client) {
3339
+ const stop = stopClientBestEffort(client);
3340
+ this.pendingStops.set(key, stop);
3341
+ stop.finally(() => {
3342
+ if (this.pendingStops.get(key) === stop) {
3343
+ this.pendingStops.delete(key);
3344
+ }
3345
+ });
3346
+ return stop;
3347
+ }
3348
+ recordDeadGeneration(key) {
3349
+ let budget = this.respawnBudgets.get(key);
3350
+ if (budget === undefined) {
3351
+ budget = { deadGenerations: 0, exhaustedAt: null };
3352
+ this.respawnBudgets.set(key, budget);
3353
+ }
3354
+ budget.deadGenerations += 1;
3355
+ }
3356
+ markHealthyGeneration(key) {
3357
+ this.respawnBudgets.delete(key);
3358
+ }
3359
+ ensureRespawnAllowed(key, root, serverId) {
3360
+ const budget = this.respawnBudgets.get(key);
3361
+ if (budget === undefined || budget.deadGenerations < CLIENT_RESPAWN_RETRY_LIMIT)
3362
+ return;
3363
+ if (budget.exhaustedAt === null) {
3364
+ budget.exhaustedAt = this.now();
3365
+ throw new LspClientRespawnBudgetExceededError(serverId, root, CLIENT_RESPAWN_RETRY_LIMIT);
3366
+ }
3367
+ if (this.now() - budget.exhaustedAt < CLIENT_RESPAWN_COOLDOWN_MS) {
3368
+ throw new LspClientRespawnBudgetExceededError(serverId, root, CLIENT_RESPAWN_RETRY_LIMIT);
3369
+ }
3370
+ budget.deadGenerations = 0;
3371
+ budget.exhaustedAt = null;
3372
+ }
3294
3373
  reapStale() {
3295
3374
  const t = this.now();
3296
3375
  for (const [key, managed] of this.clients) {
3297
3376
  if (managed.isInitializing && managed.initializingSince !== null && t - managed.initializingSince > this.initTimeoutMs) {
3298
- stopClientBestEffort(managed.client);
3299
3377
  this.clients.delete(key);
3378
+ this.tombstoneStop(key, managed.client);
3300
3379
  continue;
3301
3380
  }
3302
3381
  if (!managed.isInitializing && managed.refCount === 0 && managed.pendingWaiters === 0 && t - managed.lastUsedAt > this.idleTimeoutMs) {
3303
- stopClientBestEffort(managed.client);
3304
3382
  this.clients.delete(key);
3383
+ this.tombstoneStop(key, managed.client);
3305
3384
  }
3306
3385
  }
3307
3386
  }
3387
+ evictForAdmission() {
3388
+ while (this.clients.size >= this.maxResidentClients) {
3389
+ const victim = this.leastRecentlyUsedIdleClient();
3390
+ if (!victim)
3391
+ return;
3392
+ this.clients.delete(victim.key);
3393
+ this.tombstoneStop(victim.key, victim.managed.client);
3394
+ }
3395
+ }
3396
+ leastRecentlyUsedIdleClient() {
3397
+ let candidate = null;
3398
+ for (const [key, managed] of this.clients) {
3399
+ if (managed.refCount > 0 || managed.pendingWaiters > 0 || managed.isInitializing)
3400
+ continue;
3401
+ if (candidate === null || managed.lastUsedAt < candidate.managed.lastUsedAt) {
3402
+ candidate = { key, managed };
3403
+ }
3404
+ }
3405
+ return candidate;
3406
+ }
3308
3407
  async tryDeleteIfOrphaned(key, managed) {
3309
3408
  if (managed.refCount === 0 && managed.pendingWaiters === 0 && !managed.isInitializing && this.clients.get(key) === managed) {
3310
3409
  this.clients.delete(key);
3311
- await stopClientBestEffort(managed.client);
3410
+ await this.tombstoneStop(key, managed.client);
3312
3411
  }
3313
3412
  }
3314
3413
  async getClient(root, server2, signal) {
@@ -3317,12 +3416,22 @@ class LspManager {
3317
3416
  }
3318
3417
  signal?.throwIfAborted();
3319
3418
  const key = this.getKey(root, server2.id);
3419
+ for (;; ) {
3420
+ const pendingStop = this.pendingStops.get(key);
3421
+ if (pendingStop === undefined)
3422
+ break;
3423
+ await awaitWithSignal(pendingStop, signal);
3424
+ signal?.throwIfAborted();
3425
+ }
3426
+ if (this.disposed) {
3427
+ throw new Error("LspManager has been disposed");
3428
+ }
3320
3429
  let managed = this.clients.get(key);
3321
3430
  if (managed) {
3322
3431
  const t = this.now();
3323
3432
  if (managed.isInitializing && managed.initializingSince !== null && t - managed.initializingSince > this.initTimeoutMs) {
3324
- await stopClientBestEffort(managed.client);
3325
3433
  this.clients.delete(key);
3434
+ await this.tombstoneStop(key, managed.client);
3326
3435
  managed = undefined;
3327
3436
  }
3328
3437
  }
@@ -3343,14 +3452,20 @@ class LspManager {
3343
3452
  signal.throwIfAborted();
3344
3453
  }
3345
3454
  if (!managed.client.isAlive()) {
3346
- await stopClientBestEffort(managed.client);
3347
- this.clients.delete(key);
3455
+ this.recordDeadGeneration(key);
3456
+ if (this.clients.get(key) === managed) {
3457
+ this.clients.delete(key);
3458
+ }
3459
+ await this.tombstoneStop(key, managed.client);
3348
3460
  return this.getClient(root, server2, signal);
3349
3461
  }
3462
+ this.markHealthyGeneration(key);
3350
3463
  managed.refCount++;
3351
3464
  managed.lastUsedAt = this.now();
3352
3465
  return managed.client;
3353
3466
  }
3467
+ this.evictForAdmission();
3468
+ this.ensureRespawnAllowed(key, root, server2.id);
3354
3469
  const client = this.clientFactory(root, server2);
3355
3470
  const initStartedAt = this.now();
3356
3471
  const initPromise = (async () => {
@@ -3374,7 +3489,7 @@ class LspManager {
3374
3489
  if (this.clients.get(key) === newManaged) {
3375
3490
  this.clients.delete(key);
3376
3491
  }
3377
- await stopClientBestEffort(client);
3492
+ await this.tombstoneStop(key, client);
3378
3493
  throw err;
3379
3494
  }
3380
3495
  newManaged.pendingWaiters--;
@@ -3385,6 +3500,15 @@ class LspManager {
3385
3500
  await this.tryDeleteIfOrphaned(key, newManaged);
3386
3501
  signal.throwIfAborted();
3387
3502
  }
3503
+ if (!client.isAlive()) {
3504
+ this.recordDeadGeneration(key);
3505
+ if (this.clients.get(key) === newManaged) {
3506
+ this.clients.delete(key);
3507
+ }
3508
+ await this.tombstoneStop(key, client);
3509
+ return this.getClient(root, server2, signal);
3510
+ }
3511
+ this.markHealthyGeneration(key);
3388
3512
  newManaged.refCount++;
3389
3513
  newManaged.lastUsedAt = this.now();
3390
3514
  return client;
@@ -3405,14 +3529,20 @@ class LspManager {
3405
3529
  if (client && managed.client !== client)
3406
3530
  return;
3407
3531
  this.clients.delete(key);
3408
- stopClientBestEffort(managed.client);
3532
+ this.tombstoneStop(key, managed.client);
3409
3533
  }
3410
3534
  warmupClient(root, server2) {
3411
3535
  if (this.disposed)
3412
3536
  return;
3413
3537
  const key = this.getKey(root, server2.id);
3414
- if (this.clients.has(key))
3538
+ if (this.clients.has(key) || this.pendingStops.has(key))
3415
3539
  return;
3540
+ this.evictForAdmission();
3541
+ try {
3542
+ this.ensureRespawnAllowed(key, root, server2.id);
3543
+ } catch {
3544
+ return;
3545
+ }
3416
3546
  const client = this.clientFactory(root, server2);
3417
3547
  const initStartedAt = this.now();
3418
3548
  const initPromise = (async () => {
@@ -3438,7 +3568,7 @@ class LspManager {
3438
3568
  if (this.clients.get(key) === managed) {
3439
3569
  this.clients.delete(key);
3440
3570
  }
3441
- stopClientBestEffort(client);
3571
+ this.tombstoneStop(key, client);
3442
3572
  });
3443
3573
  }
3444
3574
  isServerInitializing(root, serverId) {
@@ -3482,8 +3612,11 @@ class LspManager {
3482
3612
  for (const managed of this.clients.values()) {
3483
3613
  stopPromises.push(stopClientBestEffort(managed.client));
3484
3614
  }
3615
+ const tombstonedStops = [...this.pendingStops.values()];
3485
3616
  this.clients.clear();
3486
- await Promise.allSettled(stopPromises);
3617
+ this.respawnBudgets.clear();
3618
+ await Promise.allSettled([...stopPromises, ...tombstonedStops]);
3619
+ this.pendingStops.clear();
3487
3620
  }
3488
3621
  }
3489
3622
  var _defaultInstance = null;
@@ -3501,57 +3634,52 @@ async function disposeDefaultLspManager() {
3501
3634
  }
3502
3635
  }
3503
3636
 
3504
- // ../lsp-core/src/lsp/server-install-state.ts
3505
- import { existsSync as existsSync6, mkdirSync, readFileSync as readFileSync3, renameSync as renameSync2, writeFileSync as writeFileSync2 } from "node:fs";
3506
- import { dirname as dirname5 } from "node:path";
3507
- function getInstallDecisionsPath() {
3508
- return lspRequestContext().installDecisionsPath;
3509
- }
3510
- function loadInstallDecisions() {
3511
- const path = getInstallDecisionsPath();
3512
- if (!existsSync6(path))
3513
- return {};
3514
- try {
3515
- const parsed = JSON.parse(readFileSync3(path, "utf8"));
3516
- return isInstallDecisions(parsed) ? parsed : {};
3517
- } catch {
3518
- return {};
3637
+ // ../lsp-core/src/lsp/outside-context-workspace.ts
3638
+ import { existsSync as existsSync6, realpathSync as realpathSync4 } from "node:fs";
3639
+ import { dirname as dirname5, join as join3 } from "node:path";
3640
+
3641
+ // ../lsp-core/src/lsp/workspace-markers.ts
3642
+ var GIT_WORKSPACE_MARKER = ".git";
3643
+ var PROJECT_WORKSPACE_MARKERS = [
3644
+ "package.json",
3645
+ "pyproject.toml",
3646
+ "Cargo.toml",
3647
+ "go.mod",
3648
+ "pom.xml",
3649
+ "build.gradle"
3650
+ ];
3651
+ var WORKSPACE_MARKERS = [GIT_WORKSPACE_MARKER, ...PROJECT_WORKSPACE_MARKERS];
3652
+
3653
+ // ../lsp-core/src/lsp/outside-context-workspace.ts
3654
+ function findWorkspaceRootOutsideContext(directory) {
3655
+ const marked = nearestMarkedAncestor(directory);
3656
+ if (marked !== undefined)
3657
+ return marked;
3658
+ return realpathSync4(nearestExistingAncestor(directory));
3659
+ }
3660
+ function nearestMarkedAncestor(directory) {
3661
+ let current = directory;
3662
+ for (;; ) {
3663
+ if (existsSync6(current) && WORKSPACE_MARKERS.some((marker) => existsSync6(join3(current, marker)))) {
3664
+ return realpathSync4(current);
3665
+ }
3666
+ const parent = dirname5(current);
3667
+ if (parent === current)
3668
+ return;
3669
+ current = parent;
3519
3670
  }
3520
3671
  }
3521
- function loadInstallDecision(serverId) {
3522
- return loadInstallDecisions()[serverId];
3523
- }
3524
- function recordInstallDecision(serverId, decision, decidedAt = new Date().toISOString()) {
3525
- const decisions = loadInstallDecisions();
3526
- decisions[serverId] = { decision, decidedAt };
3527
- writeInstallDecisions(decisions);
3528
- }
3529
- function isInstallDecision(value) {
3530
- return value === "declined" || value === "allowed";
3531
- }
3532
- function writeInstallDecisions(decisions) {
3533
- const path = getInstallDecisionsPath();
3534
- mkdirSync(dirname5(path), { recursive: true });
3535
- const tmpPath = `${path}.tmp`;
3536
- writeFileSync2(tmpPath, `${JSON.stringify(decisions, null, 2)}
3537
- `, "utf8");
3538
- renameSync2(tmpPath, path);
3539
- }
3540
- function isInstallDecisions(value) {
3541
- return isRecord5(value) && Object.values(value).every(isInstallDecisionRecord);
3542
- }
3543
- function isInstallDecisionRecord(value) {
3544
- if (!isRecord5(value))
3545
- return false;
3546
- return isInstallDecision(value["decision"]) && typeof value["decidedAt"] === "string";
3547
- }
3548
- function isRecord5(value) {
3549
- return typeof value === "object" && value !== null && !Array.isArray(value);
3672
+ function nearestExistingAncestor(directory) {
3673
+ let current = directory;
3674
+ while (!existsSync6(current)) {
3675
+ const parent = dirname5(current);
3676
+ if (parent === current)
3677
+ return current;
3678
+ current = parent;
3679
+ }
3680
+ return current;
3550
3681
  }
3551
3682
 
3552
- // ../lsp-core/src/lsp/config-loader.ts
3553
- import { existsSync as existsSync7, readFileSync as readFileSync4 } from "node:fs";
3554
-
3555
3683
  // ../lsp-core/src/lsp/server-definitions.ts
3556
3684
  var LSP_INSTALL_HINTS = {
3557
3685
  typescript: "npm install -g typescript-language-server typescript",
@@ -3597,6 +3725,26 @@ var LSP_INSTALL_HINTS = {
3597
3725
  julials: `julia -e 'using Pkg; Pkg.add("LanguageServer")'`,
3598
3726
  razor: "Razor runs through the Roslyn language server (cohosting). " + "Install: dotnet tool install -g roslyn-language-server --prerelease (requires v5.8.0+). See https://github.com/dotnet/razor"
3599
3727
  };
3728
+ var LSP_LOCAL_INSTALL_HINTS = {
3729
+ typescript: "bun add -d typescript-language-server typescript",
3730
+ vue: "bun add -d @vue/language-server",
3731
+ eslint: "bun add -d vscode-langservers-extracted",
3732
+ oxlint: "bun add -d oxlint",
3733
+ biome: "bun add -d @biomejs/biome",
3734
+ svelte: "bun add -d svelte-language-server",
3735
+ astro: "bun add -d @astrojs/language-server",
3736
+ bash: "bun add -d bash-language-server",
3737
+ "bash-ls": "bun add -d bash-language-server",
3738
+ "yaml-ls": "bun add -d yaml-language-server",
3739
+ php: "bun add -d intelephense",
3740
+ prisma: "bun add -d prisma",
3741
+ dockerfile: "bun add -d dockerfile-language-server-nodejs",
3742
+ pyright: "uv add --dev pyright",
3743
+ basedpyright: "uv add --dev basedpyright",
3744
+ ruff: "uv add --dev ruff",
3745
+ ty: "uv add --dev ty",
3746
+ "ruby-lsp": "bundle add ruby-lsp --group development"
3747
+ };
3600
3748
  var BUILTIN_SERVERS = {
3601
3749
  typescript: {
3602
3750
  command: ["typescript-language-server", "--stdio"],
@@ -3699,7 +3847,56 @@ var BUILTIN_SERVERS = {
3699
3847
  }
3700
3848
  };
3701
3849
 
3850
+ // ../lsp-core/src/lsp/server-install-state.ts
3851
+ import { existsSync as existsSync7, mkdirSync, readFileSync as readFileSync3, renameSync as renameSync2, writeFileSync as writeFileSync2 } from "node:fs";
3852
+ import { dirname as dirname6 } from "node:path";
3853
+ function getInstallDecisionsPath() {
3854
+ return lspRequestContext().installDecisionsPath;
3855
+ }
3856
+ function loadInstallDecisions() {
3857
+ const path = getInstallDecisionsPath();
3858
+ if (!existsSync7(path))
3859
+ return {};
3860
+ try {
3861
+ const parsed = JSON.parse(readFileSync3(path, "utf8"));
3862
+ return isInstallDecisions(parsed) ? parsed : {};
3863
+ } catch {
3864
+ return {};
3865
+ }
3866
+ }
3867
+ function loadInstallDecision(serverId) {
3868
+ return loadInstallDecisions()[serverId];
3869
+ }
3870
+ function recordInstallDecision(serverId, decision, decidedAt = new Date().toISOString()) {
3871
+ const decisions = loadInstallDecisions();
3872
+ decisions[serverId] = { decision, decidedAt };
3873
+ writeInstallDecisions(decisions);
3874
+ }
3875
+ function isInstallDecision(value) {
3876
+ return value === "declined" || value === "allowed";
3877
+ }
3878
+ function writeInstallDecisions(decisions) {
3879
+ const path = getInstallDecisionsPath();
3880
+ mkdirSync(dirname6(path), { recursive: true });
3881
+ const tmpPath = `${path}.tmp`;
3882
+ writeFileSync2(tmpPath, `${JSON.stringify(decisions, null, 2)}
3883
+ `, "utf8");
3884
+ renameSync2(tmpPath, path);
3885
+ }
3886
+ function isInstallDecisions(value) {
3887
+ return isRecord5(value) && Object.values(value).every(isInstallDecisionRecord);
3888
+ }
3889
+ function isInstallDecisionRecord(value) {
3890
+ if (!isRecord5(value))
3891
+ return false;
3892
+ return isInstallDecision(value["decision"]) && typeof value["decidedAt"] === "string";
3893
+ }
3894
+ function isRecord5(value) {
3895
+ return typeof value === "object" && value !== null && !Array.isArray(value);
3896
+ }
3897
+
3702
3898
  // ../lsp-core/src/lsp/config-loader.ts
3899
+ import { existsSync as existsSync8, readFileSync as readFileSync4 } from "node:fs";
3703
3900
  function getProjectConfigPaths() {
3704
3901
  return lspRequestContext().projectConfigPaths;
3705
3902
  }
@@ -3707,7 +3904,7 @@ function getUserConfigPath() {
3707
3904
  return lspRequestContext().userConfigPath;
3708
3905
  }
3709
3906
  function loadJsonFile(path) {
3710
- if (!existsSync7(path))
3907
+ if (!existsSync8(path))
3711
3908
  return null;
3712
3909
  try {
3713
3910
  const parsed = JSON.parse(readFileSync4(path, "utf-8"));
@@ -3895,54 +4092,155 @@ function getDisabledServerIds() {
3895
4092
  }
3896
4093
 
3897
4094
  // ../lsp-core/src/lsp/server-installation.ts
3898
- import { existsSync as existsSync8 } from "node:fs";
3899
- import { delimiter as delimiter3, join as join3 } from "node:path";
3900
- function isServerInstalled(command, _workingDirectory) {
3901
- if (command.length === 0)
3902
- return false;
3903
- const [cmd] = command;
3904
- if (!cmd)
3905
- return false;
3906
- if (cmd.includes("/") || cmd.includes("\\")) {
3907
- if (existsSync8(cmd))
3908
- return true;
4095
+ import { existsSync as existsSync9 } from "node:fs";
4096
+ import { delimiter as delimiter3, dirname as dirname7, isAbsolute as isAbsolute3, join as join4, resolve as resolve7 } from "node:path";
4097
+ var LOCAL_BIN_RULES = [
4098
+ {
4099
+ markers: ["package.json", "bun.lock", "bun.lockb", "package-lock.json", "yarn.lock", "pnpm-lock.yaml"],
4100
+ binDirs: [join4("node_modules", ".bin")]
4101
+ },
4102
+ {
4103
+ markers: [
4104
+ "pyproject.toml",
4105
+ "ty.toml",
4106
+ "requirements.txt",
4107
+ "setup.py",
4108
+ "setup.cfg",
4109
+ "Pipfile",
4110
+ "pyrightconfig.json",
4111
+ "ruff.toml",
4112
+ ".ruff.toml"
4113
+ ],
4114
+ binDirs: [
4115
+ join4(".venv", "bin"),
4116
+ join4(".venv", "Scripts"),
4117
+ join4("venv", "bin"),
4118
+ join4("venv", "Scripts"),
4119
+ join4(".env", "bin"),
4120
+ join4(".env", "Scripts")
4121
+ ]
4122
+ },
4123
+ {
4124
+ markers: ["Gemfile", "Gemfile.lock"],
4125
+ binDirs: [join4("vendor", "bundle", "bin"), "bin"]
4126
+ },
4127
+ {
4128
+ markers: ["go.mod", "go.sum", "go.work"],
4129
+ binDirs: ["bin"]
4130
+ }
4131
+ ];
4132
+ var resolutionCache = new Map;
4133
+ var probeCount = 0;
4134
+ function probe(path) {
4135
+ probeCount += 1;
4136
+ return existsSync9(path);
4137
+ }
4138
+ function executableSuffixes(platform, pathExt) {
4139
+ if (platform !== "win32")
4140
+ return [""];
4141
+ const configured = pathExt ?? process.env["PATHEXT"] ?? "";
4142
+ const systemExts = configured.split(";").filter((entry) => entry.length > 0).map((entry) => entry.toLowerCase());
4143
+ return [...new Set(["", ...systemExts, ".exe", ".cmd", ".bat", ".ps1"])];
4144
+ }
4145
+ function probeWithSuffixes(directory, command, suffixes) {
4146
+ for (const suffix of suffixes) {
4147
+ const candidate = join4(directory, command + suffix);
4148
+ if (probe(candidate))
4149
+ return candidate;
3909
4150
  }
3910
- const isWindows = process.platform === "win32";
3911
- let exts = [""];
3912
- if (isWindows) {
3913
- const pathExt = process.env["PATHEXT"] ?? "";
3914
- if (pathExt) {
3915
- const systemExts = pathExt.split(";").filter(Boolean);
3916
- exts = [...new Set([...exts, ...systemExts, ".exe", ".cmd", ".bat", ".ps1"])];
3917
- } else {
3918
- exts = ["", ".exe", ".cmd", ".bat", ".ps1"];
4151
+ return null;
4152
+ }
4153
+ function resolveLocal(command, workingDirectory, suffixes, stopAt) {
4154
+ const boundary = stopAt === undefined ? undefined : resolve7(stopAt);
4155
+ let current = resolve7(workingDirectory);
4156
+ while (true) {
4157
+ for (const rule of LOCAL_BIN_RULES) {
4158
+ if (!rule.markers.some((marker) => probe(join4(current, marker))))
4159
+ continue;
4160
+ for (const binDir of rule.binDirs) {
4161
+ const found = probeWithSuffixes(join4(current, binDir), command, suffixes);
4162
+ if (found !== null)
4163
+ return found;
4164
+ }
3919
4165
  }
4166
+ if (probe(join4(current, ".git")))
4167
+ return null;
4168
+ if (boundary !== undefined && current === boundary)
4169
+ return null;
4170
+ const parent = dirname7(current);
4171
+ if (parent === current)
4172
+ return null;
4173
+ current = parent;
3920
4174
  }
3921
- let pathEnv = process.env["PATH"] ?? "";
3922
- if (isWindows && !pathEnv) {
4175
+ }
4176
+ function resolveFromPath(command, suffixes, platform, pathEnvOverride) {
4177
+ let pathEnv = pathEnvOverride ?? process.env["PATH"] ?? "";
4178
+ if (platform === "win32" && !pathEnv) {
3923
4179
  pathEnv = process.env["Path"] ?? "";
3924
4180
  }
3925
- const paths = pathEnv.split(delimiter3);
3926
- for (const p of paths) {
3927
- for (const suffix of exts) {
3928
- if (existsSync8(join3(p, cmd + suffix))) {
3929
- return true;
3930
- }
3931
- }
4181
+ for (const entry of pathEnv.split(delimiter3)) {
4182
+ if (entry.length === 0)
4183
+ continue;
4184
+ const found = probeWithSuffixes(entry, command, suffixes);
4185
+ if (found !== null)
4186
+ return found;
3932
4187
  }
3933
- if (cmd === "node")
3934
- return true;
3935
- return false;
4188
+ return null;
4189
+ }
4190
+ function resolveServerBinary(command, workingDirectory, options = {}) {
4191
+ if (command.length === 0)
4192
+ return null;
4193
+ const [cmd] = command;
4194
+ if (cmd === undefined || cmd.length === 0)
4195
+ return null;
4196
+ const platform = options.platform ?? process.platform;
4197
+ const suffixes = executableSuffixes(platform, options.pathExt);
4198
+ if (cmd.includes("/") || cmd.includes("\\")) {
4199
+ const explicit = isAbsolute3(cmd) ? cmd : resolve7(workingDirectory ?? process.cwd(), cmd);
4200
+ return probe(explicit) ? explicit : null;
4201
+ }
4202
+ const cacheKey = JSON.stringify([
4203
+ workingDirectory ?? "",
4204
+ cmd,
4205
+ platform,
4206
+ options.stopAt ?? "",
4207
+ options.pathExt ?? "",
4208
+ options.pathEnv ?? process.env["PATH"] ?? ""
4209
+ ]);
4210
+ const cached = resolutionCache.get(cacheKey);
4211
+ if (cached !== undefined)
4212
+ return cached;
4213
+ let resolved = null;
4214
+ if (workingDirectory !== undefined && workingDirectory.length > 0) {
4215
+ resolved = resolveLocal(cmd, workingDirectory, suffixes, options.stopAt);
4216
+ }
4217
+ resolved ??= resolveFromPath(cmd, suffixes, platform, options.pathEnv);
4218
+ if (resolved === null && cmd === "node")
4219
+ resolved = cmd;
4220
+ resolutionCache.set(cacheKey, resolved);
4221
+ return resolved;
4222
+ }
4223
+ function isServerInstalled(command, workingDirectory, options = {}) {
4224
+ if (command.length === 0)
4225
+ return false;
4226
+ return resolveServerBinary(command, workingDirectory, options) !== null;
3936
4227
  }
3937
4228
 
3938
4229
  // ../lsp-core/src/lsp/server-resolution.ts
4230
+ function withResolvedCommand(command, binaryPath) {
4231
+ return [binaryPath, ...command.slice(1)];
4232
+ }
3939
4233
  function findServerForExtension(ext) {
3940
4234
  const servers = getMergedServers();
4235
+ const workingDirectory = contextCwd();
3941
4236
  for (const server2 of servers) {
3942
- if (server2.extensions.includes(ext) && isServerInstalled(server2.command)) {
4237
+ if (!server2.extensions.includes(ext))
4238
+ continue;
4239
+ const binaryPath = resolveServerBinary(server2.command, workingDirectory);
4240
+ if (binaryPath !== null) {
3943
4241
  const resolvedServer = {
3944
4242
  id: server2.id,
3945
- command: server2.command,
4243
+ command: withResolvedCommand(server2.command, binaryPath),
3946
4244
  extensions: server2.extensions,
3947
4245
  priority: server2.priority
3948
4246
  };
@@ -3989,6 +4287,7 @@ function findServerForExtension(ext) {
3989
4287
  function getAllServers() {
3990
4288
  const servers = getMergedServers();
3991
4289
  const disabled = getDisabledServerIds();
4290
+ const workingDirectory = contextCwd();
3992
4291
  const result = [];
3993
4292
  const seen = new Set;
3994
4293
  for (const server2 of servers) {
@@ -3996,7 +4295,7 @@ function getAllServers() {
3996
4295
  continue;
3997
4296
  result.push({
3998
4297
  id: server2.id,
3999
- installed: isServerInstalled(server2.command),
4298
+ installed: isServerInstalled(server2.command, workingDirectory),
4000
4299
  extensions: server2.extensions,
4001
4300
  disabled: false,
4002
4301
  source: server2.source,
@@ -4010,7 +4309,7 @@ function getAllServers() {
4010
4309
  const builtin = BUILTIN_SERVERS[id];
4011
4310
  result.push({
4012
4311
  id,
4013
- installed: builtin ? isServerInstalled(builtin.command) : false,
4312
+ installed: builtin ? isServerInstalled(builtin.command, workingDirectory) : false,
4014
4313
  extensions: builtin?.extensions ?? [],
4015
4314
  disabled: true,
4016
4315
  source: "disabled",
@@ -4021,7 +4320,6 @@ function getAllServers() {
4021
4320
  }
4022
4321
 
4023
4322
  // ../lsp-core/src/lsp/client-wrapper.ts
4024
- var WORKSPACE_MARKERS = [".git", "package.json", "pyproject.toml", "Cargo.toml", "go.mod", "pom.xml", "build.gradle"];
4025
4323
  function isDirectoryPath(filePath) {
4026
4324
  try {
4027
4325
  return statSync3(filePath).isDirectory();
@@ -4030,32 +4328,90 @@ function isDirectoryPath(filePath) {
4030
4328
  }
4031
4329
  }
4032
4330
  function findWorkspaceRoot(filePath) {
4033
- const abs = resolvePathInsideContext(filePath);
4331
+ const cwd = contextCwd();
4332
+ const abs = resolveReadablePathInsideContext(filePath);
4034
4333
  let dir = abs;
4035
4334
  if (!isDirectoryPath(dir)) {
4036
- dir = dirname6(dir);
4037
- }
4038
- let prevDir = "";
4039
- while (dir !== prevDir) {
4040
- for (const marker of WORKSPACE_MARKERS) {
4041
- if (existsSync9(join4(dir, marker))) {
4042
- return dir;
4335
+ dir = dirname8(dir);
4336
+ }
4337
+ if (!isPathInside(cwd, abs))
4338
+ return findWorkspaceRootOutsideContext(dir);
4339
+ const fallbackRoot = nearestExistingDirectoryInsideContext(dir, cwd) ?? cwd;
4340
+ let nearestPackageRoot;
4341
+ while (isPathInside(cwd, dir)) {
4342
+ const canonicalDir = existingDirectoryInsideContext(dir, cwd);
4343
+ if (canonicalDir !== undefined) {
4344
+ if (existsSync10(join5(dir, GIT_WORKSPACE_MARKER))) {
4345
+ return canonicalDir;
4346
+ }
4347
+ if (nearestPackageRoot === undefined && hasProjectWorkspaceMarker(dir)) {
4348
+ nearestPackageRoot = canonicalDir;
4043
4349
  }
4044
4350
  }
4045
- prevDir = dir;
4046
- dir = dirname6(dir);
4351
+ if (dir === cwd)
4352
+ break;
4353
+ dir = dirname8(dir);
4047
4354
  }
4048
- return dirname6(abs);
4355
+ return nearestPackageRoot ?? fallbackRoot;
4356
+ }
4357
+ function hasProjectWorkspaceMarker(directory) {
4358
+ return PROJECT_WORKSPACE_MARKERS.some((marker) => existsSync10(join5(directory, marker)));
4359
+ }
4360
+ function resolveReadablePathInsideContext(filePath) {
4361
+ const cwd = contextCwd();
4362
+ const abs = resolve8(cwd, filePath);
4363
+ if (isPathInside(cwd, abs))
4364
+ return abs;
4365
+ const rebased = rebaseThroughCanonicalAncestor(abs, cwd);
4366
+ if (rebased !== undefined)
4367
+ return rebased;
4368
+ return canonicalizeExistingOrNearestAncestor(abs);
4049
4369
  }
4050
4370
  function resolvePathInsideContext(filePath) {
4051
4371
  const cwd = contextCwd();
4052
- const abs = resolve7(cwd, filePath);
4372
+ const abs = resolveReadablePathInsideContext(filePath);
4053
4373
  const canonical = canonicalizeExistingOrNearestAncestor(abs);
4054
4374
  if (!isPathInside(cwd, canonical)) {
4055
4375
  throw new LspInvalidPathError(`LSP file path must be inside request cwd: ${filePath}`);
4056
4376
  }
4057
4377
  return canonical;
4058
4378
  }
4379
+ function rebaseThroughCanonicalAncestor(path, cwd) {
4380
+ let current = path;
4381
+ const suffix = [];
4382
+ while (true) {
4383
+ if (existsSync10(current)) {
4384
+ const canonical = realpathSync5(current);
4385
+ if (isPathInside(cwd, canonical))
4386
+ return suffix.length === 0 ? canonical : join5(canonical, ...suffix);
4387
+ }
4388
+ const parent = dirname8(current);
4389
+ if (parent === current)
4390
+ return;
4391
+ suffix.unshift(basename3(current));
4392
+ current = parent;
4393
+ }
4394
+ }
4395
+ function existingDirectoryInsideContext(directory, cwd) {
4396
+ if (!existsSync10(directory))
4397
+ return;
4398
+ const canonical = realpathSync5(directory);
4399
+ if (!statSync3(canonical).isDirectory())
4400
+ return;
4401
+ return isPathInside(cwd, canonical) ? canonical : undefined;
4402
+ }
4403
+ function nearestExistingDirectoryInsideContext(directory, cwd) {
4404
+ let current = directory;
4405
+ while (isPathInside(cwd, current)) {
4406
+ const canonical = existingDirectoryInsideContext(current, cwd);
4407
+ if (canonical !== undefined)
4408
+ return canonical;
4409
+ if (current === cwd)
4410
+ return;
4411
+ current = dirname8(current);
4412
+ }
4413
+ return;
4414
+ }
4059
4415
  function formatServerLookupError(result) {
4060
4416
  if (result.status === "not_installed") {
4061
4417
  return formatNotInstalled(result);
@@ -4079,6 +4435,19 @@ function formatServerLookupError(result) {
4079
4435
  ].join(`
4080
4436
  `);
4081
4437
  }
4438
+ function formatInstallOptions(serverId, installHint) {
4439
+ const localHint = LSP_LOCAL_INSTALL_HINTS[serverId];
4440
+ if (localHint === undefined) {
4441
+ return ["To install, run:", ` ${installHint}`];
4442
+ }
4443
+ return [
4444
+ "To install in THIS repository (preferred — no global install needed):",
4445
+ ` ${localHint}`,
4446
+ "",
4447
+ "Or install it globally:",
4448
+ ` ${installHint}`
4449
+ ];
4450
+ }
4082
4451
  function formatNotInstalled(result) {
4083
4452
  const { server: server2, installHint } = result;
4084
4453
  const extensions = server2.extensions.join(", ");
@@ -4093,19 +4462,19 @@ function formatNotInstalled(result) {
4093
4462
  `Command not found: ${server2.command[0]}`,
4094
4463
  ""
4095
4464
  ];
4465
+ const installOptions = formatInstallOptions(server2.id, installHint);
4096
4466
  if (decision === "allowed") {
4097
4467
  return [
4098
4468
  ...header,
4099
4469
  "The user has pre-authorized LSP installation. Run the install command, then retry this tool:",
4100
- ` ${installHint}`
4470
+ ...installOptions.slice(1)
4101
4471
  ].join(`
4102
4472
  `);
4103
4473
  }
4104
4474
  if (!context.capabilities.installDecisionTool) {
4105
4475
  return [
4106
4476
  ...header,
4107
- "To install, run:",
4108
- ` ${installHint}`,
4477
+ ...installOptions,
4109
4478
  "",
4110
4479
  "ACTION REQUIRED — ASK THE USER whether to install this LSP server.",
4111
4480
  "Install-decision recording is unavailable in this harness; proceed without LSP if the user declines."
@@ -4114,8 +4483,7 @@ function formatNotInstalled(result) {
4114
4483
  }
4115
4484
  return [
4116
4485
  ...header,
4117
- "To install, run:",
4118
- ` ${installHint}`,
4486
+ ...installOptions,
4119
4487
  "",
4120
4488
  "ACTION REQUIRED — ASK THE USER whether to install this LSP server.",
4121
4489
  "- If the user agrees: run the install command above, then retry this tool.",
@@ -4126,7 +4494,7 @@ function formatNotInstalled(result) {
4126
4494
  ].join(`
4127
4495
  `);
4128
4496
  }
4129
- var READ_ONLY_RETRY_TOOLS = new Set([
4497
+ var READ_ONLY_TOOLS = new Set([
4130
4498
  "diagnostics",
4131
4499
  "definition",
4132
4500
  "references",
@@ -4135,7 +4503,7 @@ var READ_ONLY_RETRY_TOOLS = new Set([
4135
4503
  "prepareRename"
4136
4504
  ]);
4137
4505
  async function withLspClient(filePath, fn, toolName, options = {}) {
4138
- const absPath = resolvePathInsideContext(filePath);
4506
+ const absPath = READ_ONLY_TOOLS.has(toolName) ? resolveReadablePathInsideContext(filePath) : resolvePathInsideContext(filePath);
4139
4507
  if (isDirectoryPath(absPath)) {
4140
4508
  throw new LspInvalidPathError("Directory paths are not supported by this LSP tool. " + "Use lsp.diagnostics with a directory path for directory diagnostics.");
4141
4509
  }
@@ -4150,9 +4518,9 @@ async function withLspClient(filePath, fn, toolName, options = {}) {
4150
4518
  const acquireAndCall = async (allowRetry) => {
4151
4519
  const client = await manager.getClient(root, server2, options.signal);
4152
4520
  try {
4153
- return await fn(client, root);
4521
+ return await fn(client, root, absPath);
4154
4522
  } catch (err) {
4155
- if (allowRetry && READ_ONLY_RETRY_TOOLS.has(toolName) && isLspDeadConnectionError(err)) {
4523
+ if (allowRetry && READ_ONLY_TOOLS.has(toolName) && isLspDeadConnectionError(err)) {
4156
4524
  manager.invalidateClient(root, server2.id, client);
4157
4525
  return acquireAndCall(false);
4158
4526
  }
@@ -4170,8 +4538,8 @@ async function withLspClient(filePath, fn, toolName, options = {}) {
4170
4538
  }
4171
4539
 
4172
4540
  // ../lsp-core/src/lsp/directory-diagnostics.ts
4173
- import { existsSync as existsSync10, lstatSync as lstatSync4, readdirSync as readdirSync3 } from "node:fs";
4174
- import { join as join5, resolve as resolve8 } from "node:path";
4541
+ import { existsSync as existsSync11, lstatSync as lstatSync4, readdirSync as readdirSync3 } from "node:fs";
4542
+ import { join as join6, resolve as resolve9 } from "node:path";
4175
4543
 
4176
4544
  // ../lsp-core/src/lsp/formatters.ts
4177
4545
  import { fileURLToPath as fileURLToPath2 } from "node:url";
@@ -4301,7 +4669,7 @@ function collectFilesWithExtension(dir, extension, maxFiles) {
4301
4669
  for (const entry of entries) {
4302
4670
  if (files.length >= maxFiles)
4303
4671
  return;
4304
- const fullPath = join5(currentDir, entry);
4672
+ const fullPath = join6(currentDir, entry);
4305
4673
  let stat;
4306
4674
  try {
4307
4675
  stat = lstatSync4(fullPath);
@@ -4326,8 +4694,8 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
4326
4694
  if (!extension.startsWith(".")) {
4327
4695
  throw new LspInvalidPathError(`Extension must start with a dot (e.g., ".ts", not "${extension}"). Use ".${extension}" instead.`);
4328
4696
  }
4329
- const absDir = resolve8(options.workspaceRoot ?? contextCwd(), directory);
4330
- if (!existsSync10(absDir)) {
4697
+ const absDir = resolve9(options.workspaceRoot ?? contextCwd(), directory);
4698
+ if (!existsSync11(absDir)) {
4331
4699
  throw new LspInvalidPathError(`Directory does not exist: ${absDir}`);
4332
4700
  }
4333
4701
  const serverResult = options.server === undefined ? findServerForExtension(extension) : { status: "found", server: options.server };
@@ -4414,7 +4782,7 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
4414
4782
 
4415
4783
  // ../lsp-core/src/lsp/infer-extension.ts
4416
4784
  import { lstatSync as lstatSync5, readdirSync as readdirSync4 } from "node:fs";
4417
- import { join as join6 } from "node:path";
4785
+ import { join as join7 } from "node:path";
4418
4786
  var SKIP_DIRECTORIES2 = new Set(["node_modules", ".git", "dist", "build", ".next", "out"]);
4419
4787
  var MAX_SCAN_ENTRIES = 500;
4420
4788
  function inferExtensionFromDirectory(directory) {
@@ -4432,7 +4800,7 @@ function inferExtensionFromDirectory(directory) {
4432
4800
  for (const entry of entries) {
4433
4801
  if (scanned >= MAX_SCAN_ENTRIES)
4434
4802
  return;
4435
- const fullPath = join6(dir, entry);
4803
+ const fullPath = join7(dir, entry);
4436
4804
  let stat;
4437
4805
  try {
4438
4806
  stat = lstatSync5(fullPath);
@@ -4607,7 +4975,7 @@ async function executeLspDiagnostics(params, signal) {
4607
4975
  const filePath = requireString(params, "filePath");
4608
4976
  const severity = severityFilter(params);
4609
4977
  try {
4610
- const absPath = resolvePathInsideContext(filePath);
4978
+ const absPath = resolveReadablePathInsideContext(filePath);
4611
4979
  if (isDirectoryPath(absPath)) {
4612
4980
  const extension = inferExtensionFromDirectory(absPath);
4613
4981
  if (!extension) {
@@ -4636,7 +5004,7 @@ async function executeLspDiagnostics(params, signal) {
4636
5004
  };
4637
5005
  return text(output2.output, details2);
4638
5006
  }
4639
- const result = await withLspClient(filePath, async (client) => client.diagnostics(filePath, signal), "diagnostics", clientOptions(signal));
5007
+ const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.diagnostics(resolvedFilePath, signal), "diagnostics", clientOptions(signal));
4640
5008
  if (result.transientError) {
4641
5009
  const message = result.transientError.message;
4642
5010
  const details2 = {
@@ -4683,6 +5051,96 @@ async function executeLspDiagnostics(params, signal) {
4683
5051
  throw error;
4684
5052
  }
4685
5053
  }
5054
+ // ../lsp-core/src/lsp/format-document.ts
5055
+ import { readFileSync as readFileSync5, renameSync as renameSync3, unlinkSync, writeFileSync as writeFileSync3 } from "node:fs";
5056
+ var DEFAULT_FORMATTING_OPTIONS = {
5057
+ tabSize: 4,
5058
+ insertSpaces: false,
5059
+ trimTrailingWhitespace: true,
5060
+ insertFinalNewline: true,
5061
+ trimFinalNewlines: true
5062
+ };
5063
+ var UNCHANGED = { status: "unchanged", linesAdded: 0, linesRemoved: 0 };
5064
+ async function formatDocumentWithClient(client, filePath, options = {}) {
5065
+ const edits = await client.formatDocument(filePath, options.formattingOptions ?? DEFAULT_FORMATTING_OPTIONS, options.signal);
5066
+ if (edits === null)
5067
+ return { status: "unavailable", reason: "capability_not_advertised" };
5068
+ if (edits.length === 0)
5069
+ return UNCHANGED;
5070
+ const before = readFileSync5(filePath, "utf-8");
5071
+ const normalized = normalizeTextEdits(before, edits, 0);
5072
+ if (normalized.text === before)
5073
+ return UNCHANGED;
5074
+ writeAtomically(filePath, normalized.text);
5075
+ await client.openFile(filePath);
5076
+ return {
5077
+ status: "formatted",
5078
+ ...lineDelta(normalized.edits)
5079
+ };
5080
+ }
5081
+ function lineDelta(edits) {
5082
+ let linesAdded = 0;
5083
+ let linesRemoved = 0;
5084
+ for (const edit of edits) {
5085
+ linesRemoved += edit.range.end.line - edit.range.start.line + 1;
5086
+ linesAdded += edit.newText.split(`
5087
+ `).length;
5088
+ }
5089
+ return { linesAdded, linesRemoved };
5090
+ }
5091
+ function writeAtomically(filePath, content) {
5092
+ const tempPath = `${filePath}.omo-format.tmp`;
5093
+ writeFileSync3(tempPath, content, "utf-8");
5094
+ try {
5095
+ renameSync3(tempPath, filePath);
5096
+ } catch (error) {
5097
+ try {
5098
+ unlinkSync(tempPath);
5099
+ } catch {}
5100
+ throw error;
5101
+ }
5102
+ }
5103
+
5104
+ // ../lsp-core/src/tools/format.ts
5105
+ async function executeLspFormat(params, signal) {
5106
+ const filePath = requireString(params, "filePath");
5107
+ try {
5108
+ const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => formatDocumentWithClient(client, resolvedFilePath, signal === undefined ? {} : { signal }), "format", clientOptions(signal));
5109
+ return text(describeResult(filePath, result), formatDetails(filePath, result));
5110
+ } catch (error) {
5111
+ const missingDependency = missingDependencyResult(error, {
5112
+ filePath,
5113
+ status: "unavailable",
5114
+ reason: "server_unavailable",
5115
+ linesAdded: 0,
5116
+ linesRemoved: 0
5117
+ });
5118
+ if (missingDependency)
5119
+ return missingDependency;
5120
+ throw error;
5121
+ }
5122
+ }
5123
+ function formatDetails(filePath, result) {
5124
+ if (result.status === "unavailable") {
5125
+ return { filePath, status: "unavailable", reason: result.reason, linesAdded: 0, linesRemoved: 0 };
5126
+ }
5127
+ return {
5128
+ filePath,
5129
+ status: result.status,
5130
+ linesAdded: result.linesAdded,
5131
+ linesRemoved: result.linesRemoved
5132
+ };
5133
+ }
5134
+ function describeResult(filePath, result) {
5135
+ if (result.status === "unavailable") {
5136
+ return `Formatting unavailable for ${filePath}: the language server does not advertise documentFormattingProvider.`;
5137
+ }
5138
+ if (result.status === "unchanged") {
5139
+ return `Already formatted: ${filePath}`;
5140
+ }
5141
+ return `Formatted ${filePath} (+${result.linesAdded}/-${result.linesRemoved} lines)`;
5142
+ }
5143
+
4686
5144
  // ../lsp-core/src/tools/install-decision.ts
4687
5145
  async function executeLspInstallDecision(params) {
4688
5146
  const serverId = requireString(params, "server_id");
@@ -4711,7 +5169,7 @@ async function executeLspGotoDefinition(params, signal) {
4711
5169
  const line = requireNumber(params, "line");
4712
5170
  const character = requireNumber(params, "character");
4713
5171
  try {
4714
- const result = await withLspClient(filePath, async (client) => client.definition(filePath, line, character, signal), "definition", clientOptions(signal));
5172
+ const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.definition(resolvedFilePath, line, character, signal), "definition", clientOptions(signal));
4715
5173
  const locations = !result ? [] : Array.isArray(result) ? result : [result];
4716
5174
  const details = { filePath, line, character, locations };
4717
5175
  if (locations.length === 0)
@@ -4736,7 +5194,7 @@ async function executeLspFindReferences(params, signal) {
4736
5194
  const character = requireNumber(params, "character");
4737
5195
  const includeDeclaration = optionalBoolean(params, "includeDeclaration") ?? true;
4738
5196
  try {
4739
- const result = await withLspClient(filePath, async (client) => client.references(filePath, line, character, includeDeclaration, signal), "references", clientOptions(signal));
5197
+ const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.references(resolvedFilePath, line, character, includeDeclaration, signal), "references", clientOptions(signal));
4740
5198
  const references = Array.isArray(result) ? result : [];
4741
5199
  const total = references.length;
4742
5200
  const truncated = total > DEFAULT_MAX_REFERENCES;
@@ -4778,7 +5236,7 @@ async function executeLspPrepareRename(params, signal) {
4778
5236
  const line = requireNumber(params, "line");
4779
5237
  const character = requireNumber(params, "character");
4780
5238
  try {
4781
- const result = await withLspClient(filePath, async (client) => client.prepareRename(filePath, line, character, signal), "prepareRename", clientOptions(signal));
5239
+ const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.prepareRename(resolvedFilePath, line, character, signal), "prepareRename", clientOptions(signal));
4782
5240
  const details = { filePath, line, character, result };
4783
5241
  return text(formatPrepareRenameResult(result), details);
4784
5242
  } catch (error) {
@@ -4799,7 +5257,7 @@ async function executeLspRename(params, signal) {
4799
5257
  const character = requireNumber(params, "character");
4800
5258
  const newName = requireString(params, "newName");
4801
5259
  try {
4802
- const result = await withLspClient(filePath, async (client) => client.rename(filePath, line, character, newName, signal), "rename", clientOptions(signal));
5260
+ const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.rename(resolvedFilePath, line, character, newName, signal), "rename", clientOptions(signal));
4803
5261
  const details = { filePath, line, character, newName, apply: result.apply, edit: result.edit };
4804
5262
  return text(formatApplyResult(result.apply), details, !result.apply.success);
4805
5263
  } catch (error) {
@@ -4879,7 +5337,7 @@ async function executeLspSymbols(params, signal) {
4879
5337
  const symbols2 = await withLspClient(filePath, async (client) => client.workspaceSymbols(query, signal), "workspaceSymbols", clientOptions(signal));
4880
5338
  return formatSymbolsResult(filePath, scope, symbols2, limit, query);
4881
5339
  }
4882
- const symbols = await withLspClient(filePath, async (client) => client.documentSymbols(filePath, signal), "documentSymbols", clientOptions(signal));
5340
+ const symbols = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.documentSymbols(resolvedFilePath, signal), "documentSymbols", clientOptions(signal));
4883
5341
  return formatSymbolsResult(filePath, scope, symbols, limit);
4884
5342
  } catch (error) {
4885
5343
  const query = optionalString(params, "query");
@@ -5015,6 +5473,16 @@ var LSP_MCP_TOOLS = [
5015
5473
  }, ["filePath", "line", "character", "newName"]),
5016
5474
  execute: executeLspRename
5017
5475
  },
5476
+ {
5477
+ name: "format",
5478
+ aliases: ["lsp_format"],
5479
+ title: "LSP Format",
5480
+ description: "Format a source file with its language server and write the returned edits to disk.",
5481
+ inputSchema: objectSchema({
5482
+ filePath: { type: "string", description: "Source file path to format." }
5483
+ }, ["filePath"]),
5484
+ execute: executeLspFormat
5485
+ },
5018
5486
  {
5019
5487
  name: "install_decision",
5020
5488
  aliases: ["lsp_install_decision"],
@@ -5122,6 +5590,6 @@ function requestedProtocolVersion(params) {
5122
5590
  return params["protocolVersion"];
5123
5591
  }
5124
5592
  export {
5125
- runMcpStdioServer,
5126
- handleLspMcpRequest
5593
+ handleLspMcpRequest,
5594
+ runMcpStdioServer
5127
5595
  };