lazycodex-ai 5.1.47 → 5.1.51

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 (438) hide show
  1. package/dist/cli/index.js +1194 -752
  2. package/dist/cli/service-auth/accounts-gate.d.ts +11 -0
  3. package/dist/cli/service-auth/commands.d.ts +2 -4
  4. package/dist/cli/service-auth/index.d.ts +1 -1
  5. package/dist/cli/service-auth/keystore.d.ts +26 -2
  6. package/dist/cli/service-auth/protocol.d.ts +7 -1
  7. package/dist/cli/service-auth/session.d.ts +6 -0
  8. package/dist/cli/service-auth/signed-out-marker.d.ts +11 -0
  9. package/dist/cli-node/index.js +1194 -752
  10. package/package.json +3 -1
  11. package/packages/lsp-core/package.json +45 -0
  12. package/packages/lsp-core/src/index.ts +30 -0
  13. package/packages/lsp-core/src/lsp/bun-command-output.ts +82 -0
  14. package/packages/lsp-core/src/lsp/bun-project-checks.test.ts +170 -0
  15. package/packages/lsp-core/src/lsp/bun-project-checks.ts +223 -0
  16. package/packages/lsp-core/src/lsp/cleanup-errors.test.ts +18 -0
  17. package/packages/lsp-core/src/lsp/cleanup-errors.ts +14 -0
  18. package/packages/lsp-core/src/lsp/client-diagnostics-concurrency.integration.test.ts +52 -0
  19. package/packages/lsp-core/src/lsp/client-diagnostics-freshness.integration.test.ts +471 -0
  20. package/packages/lsp-core/src/lsp/client-diagnostics-pull-timeout.test.ts +64 -0
  21. package/packages/lsp-core/src/lsp/client-wrapper-outside-cwd.test.ts +78 -0
  22. package/packages/lsp-core/src/lsp/client-wrapper.test.ts +213 -0
  23. package/packages/lsp-core/src/lsp/client-wrapper.ts +290 -0
  24. package/packages/lsp-core/src/lsp/client.ts +398 -0
  25. package/packages/lsp-core/src/lsp/config-loader.ts +254 -0
  26. package/packages/lsp-core/src/lsp/connection.ts +95 -0
  27. package/packages/lsp-core/src/lsp/constants.ts +17 -0
  28. package/packages/lsp-core/src/lsp/controlled-clock-test-support.ts +90 -0
  29. package/packages/lsp-core/src/lsp/directory-diagnostics.test.ts +221 -0
  30. package/packages/lsp-core/src/lsp/directory-diagnostics.ts +187 -0
  31. package/packages/lsp-core/src/lsp/effective-extension.ts +10 -0
  32. package/packages/lsp-core/src/lsp/errors.ts +89 -0
  33. package/packages/lsp-core/src/lsp/fake-bun-test-support.ts +102 -0
  34. package/packages/lsp-core/src/lsp/fixtures/diagnostics-freshness-contract-probe.ts +283 -0
  35. package/packages/lsp-core/src/lsp/fixtures/disposed-stdin-epipe-probe.ts +28 -0
  36. package/packages/lsp-core/src/lsp/fixtures/workspace-edit-contract-probe.ts +196 -0
  37. package/packages/lsp-core/src/lsp/fixtures/workspace-edit-server.mjs +234 -0
  38. package/packages/lsp-core/src/lsp/format-document.test.ts +143 -0
  39. package/packages/lsp-core/src/lsp/format-document.ts +90 -0
  40. package/packages/lsp-core/src/lsp/formatters.ts +144 -0
  41. package/packages/lsp-core/src/lsp/infer-extension.ts +66 -0
  42. package/packages/lsp-core/src/lsp/json-rpc-connection-cancellation.test.ts +97 -0
  43. package/packages/lsp-core/src/lsp/json-rpc-connection.ts +369 -0
  44. package/packages/lsp-core/src/lsp/language-mappings.ts +173 -0
  45. package/packages/lsp-core/src/lsp/manager-lifecycle.test.ts +262 -0
  46. package/packages/lsp-core/src/lsp/manager-max-clients.test.ts +151 -0
  47. package/packages/lsp-core/src/lsp/manager.ts +495 -0
  48. package/packages/lsp-core/src/lsp/outside-context-workspace.ts +33 -0
  49. package/packages/lsp-core/src/lsp/process-pipe-errors.test.ts +21 -0
  50. package/packages/lsp-core/src/lsp/process-signal-cleanup.ts +21 -0
  51. package/packages/lsp-core/src/lsp/process.ts +221 -0
  52. package/packages/lsp-core/src/lsp/server-definitions.ts +205 -0
  53. package/packages/lsp-core/src/lsp/server-install-state.ts +67 -0
  54. package/packages/lsp-core/src/lsp/server-installation.test.ts +376 -0
  55. package/packages/lsp-core/src/lsp/server-installation.ts +218 -0
  56. package/packages/lsp-core/src/lsp/server-resolution-local-binary.test.ts +170 -0
  57. package/packages/lsp-core/src/lsp/server-resolution.ts +117 -0
  58. package/packages/lsp-core/src/lsp/startup-failure.ts +1 -0
  59. package/packages/lsp-core/src/lsp/timer-provider.ts +13 -0
  60. package/packages/lsp-core/src/lsp/transport-protocol.ts +52 -0
  61. package/packages/lsp-core/src/lsp/transport-request-timeout.test.ts +73 -0
  62. package/packages/lsp-core/src/lsp/transport.ts +339 -0
  63. package/packages/lsp-core/src/lsp/types.ts +134 -0
  64. package/packages/lsp-core/src/lsp/utils.test.ts +72 -0
  65. package/packages/lsp-core/src/lsp/utils.ts +40 -0
  66. package/packages/lsp-core/src/lsp/workspace-apply-edit-failure.ts +19 -0
  67. package/packages/lsp-core/src/lsp/workspace-apply-edit-lease.integration.test.ts +218 -0
  68. package/packages/lsp-core/src/lsp/workspace-apply-edit-sync.integration.test.ts +113 -0
  69. package/packages/lsp-core/src/lsp/workspace-apply-edit-test-support.ts +194 -0
  70. package/packages/lsp-core/src/lsp/workspace-apply-edit.integration.test.ts +163 -0
  71. package/packages/lsp-core/src/lsp/workspace-document-state.test.ts +150 -0
  72. package/packages/lsp-core/src/lsp/workspace-document-state.ts +392 -0
  73. package/packages/lsp-core/src/lsp/workspace-edit-adversarial.test.ts +132 -0
  74. package/packages/lsp-core/src/lsp/workspace-edit-commit.test.ts +140 -0
  75. package/packages/lsp-core/src/lsp/workspace-edit-commit.ts +220 -0
  76. package/packages/lsp-core/src/lsp/workspace-edit-contract-evidence.test.ts +56 -0
  77. package/packages/lsp-core/src/lsp/workspace-edit-contract-evidence.ts +30 -0
  78. package/packages/lsp-core/src/lsp/workspace-edit-fingerprint.ts +44 -0
  79. package/packages/lsp-core/src/lsp/workspace-edit-options.test.ts +147 -0
  80. package/packages/lsp-core/src/lsp/workspace-edit-parse-helpers.ts +59 -0
  81. package/packages/lsp-core/src/lsp/workspace-edit-parser.ts +130 -0
  82. package/packages/lsp-core/src/lsp/workspace-edit-path.ts +98 -0
  83. package/packages/lsp-core/src/lsp/workspace-edit-plan-types.ts +60 -0
  84. package/packages/lsp-core/src/lsp/workspace-edit-plan.ts +73 -0
  85. package/packages/lsp-core/src/lsp/workspace-edit-prevalidation.test.ts +174 -0
  86. package/packages/lsp-core/src/lsp/workspace-edit-resource-parser.ts +89 -0
  87. package/packages/lsp-core/src/lsp/workspace-edit-simulation.ts +183 -0
  88. package/packages/lsp-core/src/lsp/workspace-edit-snapshot.ts +53 -0
  89. package/packages/lsp-core/src/lsp/workspace-edit-text.ts +125 -0
  90. package/packages/lsp-core/src/lsp/workspace-edit-types.ts +121 -0
  91. package/packages/lsp-core/src/lsp/workspace-edit.characterization.test.ts +95 -0
  92. package/packages/lsp-core/src/lsp/workspace-edit.ts +55 -0
  93. package/packages/lsp-core/src/lsp/workspace-markers.ts +18 -0
  94. package/packages/lsp-core/src/lsp/workspace-mutation-controller.ts +182 -0
  95. package/packages/lsp-core/src/mcp-protocol-pin.test.ts +97 -0
  96. package/packages/lsp-core/src/mcp.ts +122 -0
  97. package/packages/lsp-core/src/missing-dependency-result.test.ts +135 -0
  98. package/packages/lsp-core/src/missing-dependency-result.ts +79 -0
  99. package/packages/lsp-core/src/post-edit/file-location.ts +55 -0
  100. package/packages/lsp-core/src/post-edit/index.ts +3 -0
  101. package/packages/lsp-core/src/post-edit/not-installed-guidance.ts +36 -0
  102. package/packages/lsp-core/src/post-edit/not-installed.test.ts +224 -0
  103. package/packages/lsp-core/src/post-edit/orchestration.test.ts +157 -0
  104. package/packages/lsp-core/src/post-edit/orchestration.ts +205 -0
  105. package/packages/lsp-core/src/request-context.test.ts +200 -0
  106. package/packages/lsp-core/src/request-context.ts +235 -0
  107. package/packages/lsp-core/src/tool-surface.test.ts +173 -0
  108. package/packages/lsp-core/src/tools/bun-directory-diagnostics.test.ts +113 -0
  109. package/packages/lsp-core/src/tools/bun-directory-diagnostics.ts +75 -0
  110. package/packages/lsp-core/src/tools/definitions.ts +156 -0
  111. package/packages/lsp-core/src/tools/diagnostics.ts +133 -0
  112. package/packages/lsp-core/src/tools/format.test.ts +56 -0
  113. package/packages/lsp-core/src/tools/format.ts +56 -0
  114. package/packages/lsp-core/src/tools/index.ts +11 -0
  115. package/packages/lsp-core/src/tools/install-decision.ts +39 -0
  116. package/packages/lsp-core/src/tools/navigation.ts +88 -0
  117. package/packages/lsp-core/src/tools/parameters.test.ts +51 -0
  118. package/packages/lsp-core/src/tools/parameters.ts +49 -0
  119. package/packages/lsp-core/src/tools/rename.ts +69 -0
  120. package/packages/lsp-core/src/tools/result.ts +5 -0
  121. package/packages/lsp-core/src/tools/runtime.ts +21 -0
  122. package/packages/lsp-core/src/tools/schema.ts +9 -0
  123. package/packages/lsp-core/src/tools/status.ts +28 -0
  124. package/packages/lsp-core/src/tools/symbols.ts +99 -0
  125. package/packages/lsp-core/src/tools/types.ts +116 -0
  126. package/packages/lsp-core/src/tools.ts +1 -0
  127. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  128. package/packages/omo-codex/plugin/README.md +1 -1
  129. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  130. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  131. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  132. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  133. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  134. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  135. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  136. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  137. package/packages/omo-codex/plugin/components/lcx/skills/lcx-contribute-bug-fix/SKILL.md +51 -55
  138. package/packages/omo-codex/plugin/components/lcx/skills/lcx-contribute-bug-fix/agents/openai.yaml +1 -1
  139. package/packages/omo-codex/plugin/components/lcx/skills/lcx-report-bug/SKILL.md +7 -7
  140. package/packages/omo-codex/plugin/components/lcx/skills/lcx-report-bug/agents/openai.yaml +1 -1
  141. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  142. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  143. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  144. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  145. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  146. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  147. package/packages/omo-codex/plugin/components/teammode/package.json +2 -2
  148. package/packages/omo-codex/plugin/components/telemetry/README.md +2 -2
  149. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +52 -15
  150. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +52 -19
  151. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  152. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  153. package/packages/omo-codex/plugin/components/telemetry/src/codex-hook.ts +2 -9
  154. package/packages/omo-codex/plugin/components/telemetry/src/posthog.ts +4 -13
  155. package/packages/omo-codex/plugin/components/telemetry/src/product-identity.ts +0 -2
  156. package/packages/omo-codex/plugin/components/telemetry/test/codex-hook-diagnostics.test.ts +0 -3
  157. package/packages/omo-codex/plugin/components/telemetry/test/codex-hook.test.ts +3 -8
  158. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +3 -0
  159. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  160. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  161. package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +1 -1
  162. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  163. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  164. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +3 -0
  165. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  166. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  167. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  168. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  169. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  170. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  171. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  172. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  173. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  174. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  175. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  176. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  177. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  178. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  179. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  180. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  181. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  182. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  183. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  184. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  185. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  186. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  187. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  188. package/packages/omo-codex/plugin/package-lock.json +16 -16
  189. package/packages/omo-codex/plugin/package.json +1 -1
  190. package/packages/omo-codex/plugin/shared/package.json +1 -1
  191. package/packages/omo-codex/plugin/skills/ast-grep/README.md +1 -1
  192. package/packages/omo-codex/plugin/skills/ast-grep/install.ps1 +5 -3
  193. package/packages/omo-codex/plugin/skills/ast-grep/install.sh +4 -5
  194. package/packages/omo-codex/plugin/skills/ast-grep/references/install.md +2 -2
  195. package/packages/omo-codex/plugin/skills/ast-grep/scripts/ast_grep_helper.py +13 -3
  196. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
  197. package/packages/omo-codex/plugin/skills/coding-agent-sessions/AGENTS.md +5 -4
  198. package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +11 -11
  199. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/all-platforms.md +2 -2
  200. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/codex.md +4 -4
  201. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +1 -1
  202. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/find-agent-sessions.py +6 -3
  203. package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +1 -1
  204. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +34 -12
  205. package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +2 -2
  206. package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +2 -1
  207. package/packages/omo-codex/plugin/skills/frontend/references/design/component-catalogs.md +14 -10
  208. package/packages/omo-codex/plugin/skills/frontend/references/design/design-system-architecture.md +19 -6
  209. package/packages/omo-codex/plugin/skills/frontend/references/design/grounding.md +29 -0
  210. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/scripts/design_system.py +2 -0
  211. package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/scripts/search.py +2 -0
  212. package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/SKILL.md +51 -55
  213. package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/agents/openai.yaml +1 -1
  214. package/packages/omo-codex/plugin/skills/lcx-report-bug/SKILL.md +7 -7
  215. package/packages/omo-codex/plugin/skills/lcx-report-bug/agents/openai.yaml +1 -1
  216. package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +5 -4
  217. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +2 -2
  218. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/__main__.py +9 -6
  219. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/summary.py +1 -1
  220. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +4 -4
  221. package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/extract_cookies.py +4 -2
  222. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +3 -0
  223. package/packages/omo-codex/plugin/skills/ulw-research/AGENTS.md +8 -4
  224. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +7 -259
  225. package/packages/omo-codex/plugin/skills/ulw-research/references/deliverable-phase.md +68 -24
  226. package/packages/omo-codex/plugin/skills/ulw-research/references/fact-ledger-grammar.md +7 -3
  227. package/packages/omo-codex/plugin/skills/ulw-research/references/fact-ledger.md +42 -8
  228. package/packages/omo-codex/plugin/skills/ulw-research/references/fidelity-claim-kinds.md +1 -1
  229. package/packages/omo-codex/plugin/skills/ulw-research/references/markdown-blocks.md +12 -0
  230. package/packages/omo-codex/plugin/skills/ulw-research/references/report-gates.md +14 -6
  231. package/packages/omo-codex/plugin/skills/ulw-research/references/research-collection.md +195 -0
  232. package/packages/omo-codex/plugin/skills/ulw-research/references/research-delivery.md +123 -0
  233. package/packages/omo-codex/plugin/skills/ulw-research/scripts/claim-kinds.mjs +33 -5
  234. package/packages/omo-codex/plugin/skills/ulw-research/scripts/contracts.mjs +16 -15
  235. package/packages/omo-codex/plugin/skills/ulw-research/scripts/conversion-probe.mjs +229 -0
  236. package/packages/omo-codex/plugin/skills/ulw-research/scripts/css-hiding.mjs +158 -0
  237. package/packages/omo-codex/plugin/skills/ulw-research/scripts/css-lite.mjs +4 -2
  238. package/packages/omo-codex/plugin/skills/ulw-research/scripts/entities.mjs +13 -4
  239. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-commands-fill.mjs +96 -0
  240. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-commands-meaning.mjs +26 -30
  241. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-commands-polish.mjs +46 -19
  242. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-commands-verify.mjs +37 -6
  243. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-commands.mjs +40 -62
  244. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-derive.mjs +7 -2
  245. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-fill.mjs +9 -6
  246. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-ledger-kinds.mjs +6 -7
  247. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-locate.mjs +15 -9
  248. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-claims.mjs +4 -3
  249. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-csv.mjs +32 -0
  250. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-lexicon.mjs +1 -1
  251. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-originals.mjs +161 -0
  252. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-policy.mjs +183 -0
  253. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-records.mjs +81 -14
  254. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-snapshot-readability.mjs +49 -0
  255. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-sources.mjs +76 -0
  256. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-trace.mjs +25 -11
  257. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-value-unit.mjs +202 -0
  258. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-values.mjs +40 -39
  259. package/packages/omo-codex/plugin/skills/ulw-research/scripts/gates-fidelity.mjs +8 -6
  260. package/packages/omo-codex/plugin/skills/ulw-research/scripts/gates-static.mjs +10 -1
  261. package/packages/omo-codex/plugin/skills/ulw-research/scripts/html-lite.mjs +6 -2
  262. package/packages/omo-codex/plugin/skills/ulw-research/scripts/html-markup.mjs +2 -2
  263. package/packages/omo-codex/plugin/skills/ulw-research/scripts/html-text-map.mjs +140 -0
  264. package/packages/omo-codex/plugin/skills/ulw-research/scripts/markdown-closers.mjs +126 -0
  265. package/packages/omo-codex/plugin/skills/ulw-research/scripts/md-lite.mjs +1 -1
  266. package/packages/omo-codex/plugin/skills/ulw-research/scripts/number-grammar.mjs +33 -0
  267. package/packages/omo-codex/plugin/skills/ulw-research/scripts/numerals.mjs +18 -7
  268. package/packages/omo-codex/plugin/skills/ulw-research/scripts/outcome-start.mjs +66 -0
  269. package/packages/omo-codex/plugin/skills/ulw-research/scripts/outcome.mjs +11 -22
  270. package/packages/omo-codex/plugin/skills/ulw-research/scripts/placeholder.mjs +18 -6
  271. package/packages/omo-codex/plugin/skills/ulw-research/scripts/polish-apply.mjs +3 -2
  272. package/packages/omo-codex/plugin/skills/ulw-research/scripts/raw-decode.mjs +110 -0
  273. package/packages/omo-codex/plugin/skills/ulw-research/scripts/raw-locator.mjs +47 -0
  274. package/packages/omo-codex/plugin/skills/ulw-research/scripts/report-tools-commands.mjs +1 -1
  275. package/packages/omo-codex/plugin/skills/ulw-research/scripts/report-tools.mjs +7 -1
  276. package/packages/omo-codex/plugin/skills/ulw-research/scripts/source-commands.mjs +87 -29
  277. package/packages/omo-codex/plugin/skills/ulw-research/scripts/source-refresh.mjs +82 -0
  278. package/packages/omo-codex/plugin/skills/ulw-research/scripts/source-snapshot.mjs +73 -69
  279. package/packages/omo-codex/plugin/skills/ulw-research/scripts/source-view.mjs +89 -0
  280. package/packages/omo-codex/plugin/skills/ulw-research/scripts/sources-citation.mjs +203 -0
  281. package/packages/omo-codex/plugin/skills/ulw-research/scripts/units.mjs +14 -3
  282. package/packages/omo-codex/plugin/test/payload-equivalence.test.mjs +6 -4
  283. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +4 -3
  284. package/packages/omo-codex/scripts/install-dist/install-local.mjs +338 -237
  285. package/packages/prompts-core/prompts/ultrawork/codex.md +3 -0
  286. package/packages/shared-skills/skill-source-filter.mjs +6 -2
  287. package/packages/shared-skills/skills/ast-grep/README.md +1 -1
  288. package/packages/shared-skills/skills/ast-grep/install.ps1 +5 -3
  289. package/packages/shared-skills/skills/ast-grep/install.sh +4 -5
  290. package/packages/shared-skills/skills/ast-grep/references/install.md +2 -2
  291. package/packages/shared-skills/skills/ast-grep/scripts/ast_grep_helper.py +13 -3
  292. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
  293. package/packages/shared-skills/skills/coding-agent-sessions/AGENTS.md +5 -4
  294. package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +11 -11
  295. package/packages/shared-skills/skills/coding-agent-sessions/references/all-platforms.md +2 -2
  296. package/packages/shared-skills/skills/coding-agent-sessions/references/codex.md +4 -4
  297. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +1 -1
  298. package/packages/shared-skills/skills/coding-agent-sessions/scripts/find-agent-sessions.py +6 -3
  299. package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +1 -1
  300. package/packages/shared-skills/skills/frontend/SKILL.md +34 -12
  301. package/packages/shared-skills/skills/frontend/references/design/README.md +2 -2
  302. package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +2 -1
  303. package/packages/shared-skills/skills/frontend/references/design/component-catalogs.md +14 -10
  304. package/packages/shared-skills/skills/frontend/references/design/design-system-architecture.md +19 -6
  305. package/packages/shared-skills/skills/frontend/references/design/grounding.md +29 -0
  306. package/packages/shared-skills/skills/frontend/references/ui-ux-db/scripts/design_system.py +2 -0
  307. package/packages/shared-skills/skills/frontend/references/ui-ux-db/scripts/search.py +2 -0
  308. package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +5 -4
  309. package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +2 -2
  310. package/packages/shared-skills/skills/ultimate-browsing/engine/__main__.py +9 -6
  311. package/packages/shared-skills/skills/ultimate-browsing/engine/summary.py +1 -1
  312. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +4 -4
  313. package/packages/shared-skills/skills/ultimate-browsing/scripts/extract_cookies.py +4 -2
  314. package/packages/shared-skills/skills/ulw-research/AGENTS.md +8 -4
  315. package/packages/shared-skills/skills/ulw-research/SKILL.md +7 -259
  316. package/packages/shared-skills/skills/ulw-research/references/deliverable-phase.md +68 -24
  317. package/packages/shared-skills/skills/ulw-research/references/fact-ledger-grammar.md +7 -3
  318. package/packages/shared-skills/skills/ulw-research/references/fact-ledger.md +42 -8
  319. package/packages/shared-skills/skills/ulw-research/references/fidelity-claim-kinds.md +1 -1
  320. package/packages/shared-skills/skills/ulw-research/references/markdown-blocks.md +12 -0
  321. package/packages/shared-skills/skills/ulw-research/references/report-gates.md +14 -6
  322. package/packages/shared-skills/skills/ulw-research/references/research-collection.md +195 -0
  323. package/packages/shared-skills/skills/ulw-research/references/research-delivery.md +123 -0
  324. package/packages/shared-skills/skills/ulw-research/scripts/claim-kinds.mjs +33 -5
  325. package/packages/shared-skills/skills/ulw-research/scripts/claim-kinds.test.ts +37 -2
  326. package/packages/shared-skills/skills/ulw-research/scripts/claim-prefix.test.ts +76 -0
  327. package/packages/shared-skills/skills/ulw-research/scripts/contracts-validation.test.ts +83 -0
  328. package/packages/shared-skills/skills/ulw-research/scripts/contracts.mjs +16 -15
  329. package/packages/shared-skills/skills/ulw-research/scripts/contracts.test.ts +6 -109
  330. package/packages/shared-skills/skills/ulw-research/scripts/conversion-altered.test.ts +154 -0
  331. package/packages/shared-skills/skills/ulw-research/scripts/conversion-originals.test.ts +297 -0
  332. package/packages/shared-skills/skills/ulw-research/scripts/conversion-probe-classes.test.ts +361 -0
  333. package/packages/shared-skills/skills/ulw-research/scripts/conversion-probe.mjs +229 -0
  334. package/packages/shared-skills/skills/ulw-research/scripts/conversion-probe.test.ts +218 -0
  335. package/packages/shared-skills/skills/ulw-research/scripts/copy-returns-fidelity-policy.test.ts +156 -0
  336. package/packages/shared-skills/skills/ulw-research/scripts/copy-returns-polish.test.ts +10 -9
  337. package/packages/shared-skills/skills/ulw-research/scripts/css-hiding.mjs +158 -0
  338. package/packages/shared-skills/skills/ulw-research/scripts/css-lite.mjs +4 -2
  339. package/packages/shared-skills/skills/ulw-research/scripts/delivery-barrier-meaning.test.ts +186 -0
  340. package/packages/shared-skills/skills/ulw-research/scripts/delivery-barrier.test.ts +40 -87
  341. package/packages/shared-skills/skills/ulw-research/scripts/entities.mjs +13 -4
  342. package/packages/shared-skills/skills/ulw-research/scripts/fact-commands-fill.mjs +96 -0
  343. package/packages/shared-skills/skills/ulw-research/scripts/fact-commands-meaning.mjs +26 -30
  344. package/packages/shared-skills/skills/ulw-research/scripts/fact-commands-polish.mjs +46 -19
  345. package/packages/shared-skills/skills/ulw-research/scripts/fact-commands-verify.mjs +37 -6
  346. package/packages/shared-skills/skills/ulw-research/scripts/fact-commands.mjs +40 -62
  347. package/packages/shared-skills/skills/ulw-research/scripts/fact-derive-2.test.ts +149 -0
  348. package/packages/shared-skills/skills/ulw-research/scripts/fact-derive.mjs +7 -2
  349. package/packages/shared-skills/skills/ulw-research/scripts/fact-derive.test.ts +7 -192
  350. package/packages/shared-skills/skills/ulw-research/scripts/fact-fill.mjs +9 -6
  351. package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger-kinds.mjs +6 -7
  352. package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger-kinds.test.ts +2 -1
  353. package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger-legacy.test.ts +2 -1
  354. package/packages/shared-skills/skills/ulw-research/scripts/fact-locate.mjs +15 -9
  355. package/packages/shared-skills/skills/ulw-research/scripts/fact-unit-dimensions-2.test.ts +149 -0
  356. package/packages/shared-skills/skills/ulw-research/scripts/fact-unit-dimensions.test.ts +4 -168
  357. package/packages/shared-skills/skills/ulw-research/scripts/fact-unit-rules.test.ts +3 -229
  358. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-claims.mjs +4 -3
  359. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-csv.mjs +32 -0
  360. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-lexicon.mjs +1 -1
  361. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-originals.mjs +161 -0
  362. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-policy.mjs +183 -0
  363. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-records.mjs +81 -14
  364. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-snapshot-readability.mjs +49 -0
  365. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-sources.mjs +76 -0
  366. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-trace.mjs +25 -11
  367. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-value-unit.mjs +202 -0
  368. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-values.mjs +40 -39
  369. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-values.test.ts +8 -29
  370. package/packages/shared-skills/skills/ulw-research/scripts/gates-fidelity.mjs +8 -6
  371. package/packages/shared-skills/skills/ulw-research/scripts/gates-static-headings.test.ts +17 -0
  372. package/packages/shared-skills/skills/ulw-research/scripts/gates-static.mjs +10 -1
  373. package/packages/shared-skills/skills/ulw-research/scripts/html-lite.mjs +6 -2
  374. package/packages/shared-skills/skills/ulw-research/scripts/html-markup.mjs +2 -2
  375. package/packages/shared-skills/skills/ulw-research/scripts/html-text-map.mjs +140 -0
  376. package/packages/shared-skills/skills/ulw-research/scripts/html-text-map.test.ts +148 -0
  377. package/packages/shared-skills/skills/ulw-research/scripts/markdown-closers.mjs +126 -0
  378. package/packages/shared-skills/skills/ulw-research/scripts/md-lite-boundaries.test.ts +46 -0
  379. package/packages/shared-skills/skills/ulw-research/scripts/md-lite.mjs +1 -1
  380. package/packages/shared-skills/skills/ulw-research/scripts/number-grammar.mjs +33 -0
  381. package/packages/shared-skills/skills/ulw-research/scripts/number-grammar.test.ts +36 -0
  382. package/packages/shared-skills/skills/ulw-research/scripts/numerals.mjs +18 -7
  383. package/packages/shared-skills/skills/ulw-research/scripts/numerals.test.ts +3 -0
  384. package/packages/shared-skills/skills/ulw-research/scripts/outcome-start.mjs +66 -0
  385. package/packages/shared-skills/skills/ulw-research/scripts/outcome-start.test.ts +109 -0
  386. package/packages/shared-skills/skills/ulw-research/scripts/outcome.mjs +11 -22
  387. package/packages/shared-skills/skills/ulw-research/scripts/page-source-locator.test.ts +187 -0
  388. package/packages/shared-skills/skills/ulw-research/scripts/placeholder.mjs +18 -6
  389. package/packages/shared-skills/skills/ulw-research/scripts/polish-apply.mjs +3 -2
  390. package/packages/shared-skills/skills/ulw-research/scripts/polish-markup.test.ts +15 -1
  391. package/packages/shared-skills/skills/ulw-research/scripts/polish-partial.test.ts +42 -0
  392. package/packages/shared-skills/skills/ulw-research/scripts/raw-decode.mjs +110 -0
  393. package/packages/shared-skills/skills/ulw-research/scripts/raw-locator.mjs +47 -0
  394. package/packages/shared-skills/skills/ulw-research/scripts/raw-snapshot.test.ts +139 -0
  395. package/packages/shared-skills/skills/ulw-research/scripts/report-tools-2.test.ts +233 -0
  396. package/packages/shared-skills/skills/ulw-research/scripts/report-tools-3.test.ts +141 -0
  397. package/packages/shared-skills/skills/ulw-research/scripts/report-tools-4.test.ts +135 -0
  398. package/packages/shared-skills/skills/ulw-research/scripts/report-tools-5.test.ts +231 -0
  399. package/packages/shared-skills/skills/ulw-research/scripts/report-tools-commands.mjs +1 -1
  400. package/packages/shared-skills/skills/ulw-research/scripts/report-tools.mjs +7 -1
  401. package/packages/shared-skills/skills/ulw-research/scripts/report-tools.test.ts +6 -560
  402. package/packages/shared-skills/skills/ulw-research/scripts/snapshot-readability.test.ts +116 -0
  403. package/packages/shared-skills/skills/ulw-research/scripts/source-commands.mjs +87 -29
  404. package/packages/shared-skills/skills/ulw-research/scripts/source-integrity.test.ts +243 -0
  405. package/packages/shared-skills/skills/ulw-research/scripts/source-refresh.mjs +82 -0
  406. package/packages/shared-skills/skills/ulw-research/scripts/source-snapshot.mjs +73 -69
  407. package/packages/shared-skills/skills/ulw-research/scripts/source-snapshot.test.ts +7 -4
  408. package/packages/shared-skills/skills/ulw-research/scripts/source-view.mjs +89 -0
  409. package/packages/shared-skills/skills/ulw-research/scripts/sources-citation.mjs +203 -0
  410. package/packages/shared-skills/skills/ulw-research/scripts/sources-citation.test.ts +236 -0
  411. package/packages/shared-skills/skills/ulw-research/scripts/tests/contracts-support.ts +147 -0
  412. package/packages/shared-skills/skills/ulw-research/scripts/tests/delivery-barrier-session.ts +59 -0
  413. package/packages/shared-skills/skills/ulw-research/scripts/tests/derive-clock.ts +4 -0
  414. package/packages/shared-skills/skills/ulw-research/scripts/tests/fact-derive-support.ts +65 -0
  415. package/packages/shared-skills/skills/ulw-research/scripts/tests/fact-unit-dimensions-support.ts +41 -0
  416. package/packages/shared-skills/skills/ulw-research/scripts/tests/fact-unit-rules-support.ts +241 -0
  417. package/packages/shared-skills/skills/ulw-research/scripts/tests/fidelity-values-support.ts +30 -0
  418. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/conversion-probe.html +14 -0
  419. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/sources-shapes.html +20 -0
  420. package/packages/shared-skills/skills/ulw-research/scripts/tests/numeral-classes.ts +196 -0
  421. package/packages/shared-skills/skills/ulw-research/scripts/tests/report-tools-support.ts +182 -0
  422. package/packages/shared-skills/skills/ulw-research/scripts/tests/value-mode-support.ts +48 -0
  423. package/packages/shared-skills/skills/ulw-research/scripts/units.mjs +14 -3
  424. package/packages/shared-skills/skills/ulw-research/scripts/units.test.ts +10 -0
  425. package/packages/shared-skills/skills/ulw-research/scripts/value-mode-unit-classes.test.ts +255 -0
  426. package/packages/shared-skills/skills/ulw-research/scripts/value-mode-unit.test.ts +179 -0
  427. package/packages/shared-skills/skills/ulw-research/scripts/value-rules-cli.test.ts +157 -0
  428. package/packages/shared-skills/skills/ulw-research/scripts/value-rules-followups.test.ts +72 -0
  429. package/packages/shared-skills/skills/ulw-research/scripts/value-rules-priority.test.ts +80 -0
  430. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/fixtures/amp_redirect_stub.html +0 -7
  431. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/fixtures/search_interstitial.html +0 -19
  432. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/fixtures/wayback_available.json +0 -1
  433. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/fixtures/wayback_snapshot.html +0 -1128
  434. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_fetch_chain.py +0 -77
  435. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_playwright_stealth.py +0 -86
  436. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +0 -279
  437. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_surrogate.py +0 -252
  438. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_surrogate_validators.py +0 -78
@@ -0,0 +1,182 @@
1
+ import type { WorkspaceEdit } from "./types.js";
2
+ import { workspaceApplyEditConcurrentFailureReason } from "./workspace-apply-edit-failure.js";
3
+ import { commitWorkspaceEditPlan } from "./workspace-edit-commit.js";
4
+ import { fingerprintWorkspaceEdit, planWorkspaceEdit } from "./workspace-edit-plan.js";
5
+ import type {
6
+ ApplyResult,
7
+ LspRenameResult,
8
+ WorkspaceEditCommitIo,
9
+ } from "./workspace-edit-types.js";
10
+ import { WorkspaceDocumentState } from "./workspace-document-state.js";
11
+
12
+ export interface WorkspaceApplyEditResponse {
13
+ readonly applied: boolean;
14
+ readonly failureReason?: string;
15
+ readonly failedChange?: number;
16
+ }
17
+
18
+ export interface WorkspaceMutationLease {
19
+ readonly id: number;
20
+ }
21
+
22
+ interface ServerApplyRecord {
23
+ readonly fingerprint: string | null;
24
+ readonly result: ApplyResult;
25
+ }
26
+
27
+ interface ActiveLease extends WorkspaceMutationLease {
28
+ readonly signal?: AbortSignal;
29
+ phase: "idle" | "applying" | "settled" | "sealed";
30
+ serverApply?: ServerApplyRecord;
31
+ applyCompletion?: Promise<void>;
32
+ resolveApply?: () => void;
33
+ }
34
+
35
+ export type AcquireMutationLeaseResult =
36
+ | { readonly success: true; readonly lease: WorkspaceMutationLease }
37
+ | { readonly success: false; readonly result: ApplyResult };
38
+
39
+ function failure(message: string, failedChange?: number, base?: ApplyResult): ApplyResult {
40
+ return {
41
+ success: false,
42
+ filesModified: base?.filesModified ?? [],
43
+ totalEdits: base?.totalEdits ?? 0,
44
+ errors: [message],
45
+ ...(failedChange === undefined ? {} : { failedChange }),
46
+ ...(base?.lateAbort ? { lateAbort: true } : {}),
47
+ };
48
+ }
49
+
50
+ function responseFor(result: ApplyResult): WorkspaceApplyEditResponse {
51
+ if (result.success) return { applied: true };
52
+ return {
53
+ applied: false,
54
+ failureReason: result.errors[0] ?? "workspace edit failed",
55
+ ...(result.failedChange === undefined ? {} : { failedChange: result.failedChange }),
56
+ };
57
+ }
58
+
59
+ function isRecord(value: unknown): value is Record<string, unknown> {
60
+ return typeof value === "object" && value !== null && !Array.isArray(value);
61
+ }
62
+
63
+ export class WorkspaceMutationController {
64
+ private activeLease: ActiveLease | null = null;
65
+ private nextLeaseId = 1;
66
+ private io: Partial<WorkspaceEditCommitIo> | undefined;
67
+
68
+ constructor(
69
+ private readonly workspaceRoot: string,
70
+ private readonly documents: WorkspaceDocumentState,
71
+ ) {}
72
+
73
+ setIo(io: Partial<WorkspaceEditCommitIo>): void {
74
+ this.io = io;
75
+ }
76
+
77
+ acquire(signal?: AbortSignal): AcquireMutationLeaseResult {
78
+ if (this.activeLease) return { success: false, result: failure("workspace mutation is already in progress") };
79
+ if (signal?.aborted) return { success: false, result: failure("cancelled before mutating request") };
80
+ const lease: ActiveLease = {
81
+ id: this.nextLeaseId,
82
+ phase: "idle",
83
+ ...(signal === undefined ? {} : { signal }),
84
+ };
85
+ this.nextLeaseId += 1;
86
+ this.activeLease = lease;
87
+ return { success: true, lease };
88
+ }
89
+
90
+ release(lease: WorkspaceMutationLease): void {
91
+ if (this.activeLease?.id !== lease.id) return;
92
+ this.activeLease.phase = "sealed";
93
+ this.activeLease = null;
94
+ }
95
+
96
+ isBeforeCommit(lease: WorkspaceMutationLease): boolean {
97
+ return this.activeLease?.id === lease.id && this.activeLease.phase === "idle";
98
+ }
99
+
100
+ async handleApplyEdit(params: unknown): Promise<WorkspaceApplyEditResponse> {
101
+ const lease = this.activeLease;
102
+ if (!lease) return { applied: false, failureReason: "workspace/applyEdit requires an active workspace mutation" };
103
+ if (lease.phase !== "idle") {
104
+ return {
105
+ applied: false,
106
+ failureReason: workspaceApplyEditConcurrentFailureReason(lease.phase === "applying" ? "applying" : "settled"),
107
+ };
108
+ }
109
+
110
+ lease.phase = "applying";
111
+ lease.applyCompletion = new Promise<void>((resolve) => {
112
+ lease.resolveApply = resolve;
113
+ });
114
+ const edit = isRecord(params) ? params["edit"] : undefined;
115
+ const record =
116
+ edit === undefined
117
+ ? { fingerprint: null, result: failure("workspace/applyEdit params.edit is required", 0) }
118
+ : await this.applyEdit(edit, lease);
119
+ lease.serverApply = record;
120
+ lease.phase = "settled";
121
+ lease.resolveApply?.();
122
+ return responseFor(record.result);
123
+ }
124
+
125
+ async reconcileRename(
126
+ leaseToken: WorkspaceMutationLease,
127
+ edit: WorkspaceEdit | null,
128
+ ): Promise<LspRenameResult> {
129
+ const lease = this.requireActiveLease(leaseToken);
130
+ if (!lease) return { edit, apply: failure("workspace mutation lease ended before rename reconciliation") };
131
+ if (lease.phase === "applying") await lease.applyCompletion;
132
+ if (lease.serverApply) return this.reconcileServerApply(lease.serverApply, edit);
133
+ lease.phase = "sealed";
134
+ if (!edit) return { edit, apply: failure("No edit provided") };
135
+ const applied = await this.applyEdit(edit, lease);
136
+ return { edit, apply: applied.result };
137
+ }
138
+
139
+ private reconcileServerApply(record: ServerApplyRecord, edit: WorkspaceEdit | null): LspRenameResult {
140
+ if (!edit) return { edit, apply: record.result };
141
+ const fingerprint = fingerprintWorkspaceEdit(edit, this.workspaceRoot);
142
+ if (fingerprint.success && record.fingerprint !== null && fingerprint.fingerprint === record.fingerprint) {
143
+ return { edit, apply: record.result };
144
+ }
145
+ return {
146
+ edit,
147
+ apply: failure("rename result conflicts with server-applied workspace edit", 0, record.result),
148
+ };
149
+ }
150
+
151
+ private async applyEdit(edit: unknown, lease: ActiveLease): Promise<ServerApplyRecord> {
152
+ const planned = planWorkspaceEdit(edit, this.workspaceRoot);
153
+ if (!planned.success) return { fingerprint: null, result: planned.result };
154
+ const versionFailure = this.documents.validateVersions(planned.plan.operations);
155
+ if (versionFailure) {
156
+ return {
157
+ fingerprint: planned.plan.fingerprint,
158
+ result: failure(versionFailure.message, versionFailure.changeIndex),
159
+ };
160
+ }
161
+
162
+ const commit = commitWorkspaceEditPlan(planned.plan, {
163
+ ...(lease.signal === undefined ? {} : { signal: lease.signal }),
164
+ ...(this.io === undefined ? {} : { io: this.io }),
165
+ });
166
+ let result = commit.result;
167
+ if (commit.delta.operations.length > 0) {
168
+ try {
169
+ await this.documents.synchronize(commit.delta);
170
+ } catch (error) {
171
+ const message = error instanceof Error ? error.message : String(error);
172
+ result = failure(`document synchronization failed after filesystem commit: ${message}`, undefined, result);
173
+ }
174
+ }
175
+ if (lease.signal?.aborted && !result.lateAbort) result = { ...result, lateAbort: true };
176
+ return { fingerprint: planned.plan.fingerprint, result };
177
+ }
178
+
179
+ private requireActiveLease(lease: WorkspaceMutationLease): ActiveLease | null {
180
+ return this.activeLease?.id === lease.id ? this.activeLease : null;
181
+ }
182
+ }
@@ -0,0 +1,97 @@
1
+ import { describe, expect, it } from "bun:test";
2
+ import { Readable, Writable } from "node:stream";
3
+ import { handleLspMcpRequest, runMcpStdioServer } from "./mcp";
4
+
5
+ describe("lsp MCP protocol pins", () => {
6
+ for (const [requested, expected] of [
7
+ ["2025-06-18", "2025-06-18"],
8
+ ["2025-03-26", "2025-03-26"],
9
+ ["2024-11-05", "2024-11-05"],
10
+ ["2026-07-28", "2025-06-18"],
11
+ ["2025-11-25", "2025-06-18"],
12
+ ["unknown", "2025-06-18"],
13
+ ["", "2025-06-18"],
14
+ [null, "2025-06-18"],
15
+ [42, "2025-06-18"],
16
+ [undefined, "2025-06-18"],
17
+ ] as const) {
18
+ it(`negotiates ${String(requested)} as ${expected} over stdio`, async () => {
19
+ const out: string[] = [];
20
+ await runMcpStdioServer(Readable.from([`${JSON.stringify({
21
+ jsonrpc: "2.0", id: 7, method: "initialize",
22
+ params: { protocolVersion: requested },
23
+ })}\n`]), collectingWritable(out));
24
+ expect(JSON.parse(out.join(""))).toEqual({
25
+ jsonrpc: "2.0", id: 7,
26
+ result: {
27
+ capabilities: { tools: { listChanged: false } },
28
+ serverInfo: { name: "lsp", version: "0.1.0" },
29
+ protocolVersion: expected,
30
+ },
31
+ });
32
+ });
33
+ }
34
+
35
+ it("#given initialize request #when handled #then exact server info and capabilities stay stable", async () => {
36
+ const response = await handleLspMcpRequest({
37
+ jsonrpc: "2.0",
38
+ id: 1,
39
+ method: "initialize",
40
+ params: { protocolVersion: "2024-11-05", capabilities: {}, clientInfo: { name: "todo-23", version: "0.0.0" } },
41
+ });
42
+
43
+ expect(response).toEqual({
44
+ jsonrpc: "2.0",
45
+ id: 1,
46
+ result: {
47
+ capabilities: { tools: { listChanged: false } },
48
+ serverInfo: { name: "lsp", version: "0.1.0" },
49
+ protocolVersion: "2024-11-05",
50
+ },
51
+ });
52
+ });
53
+
54
+ it("#given malformed stdio line #when read #then parse error envelope includes parser data", async () => {
55
+ const out: string[] = [];
56
+
57
+ await runMcpStdioServer(Readable.from(["garbage\n"]), collectingWritable(out));
58
+
59
+ const response = JSON.parse(out.join(""));
60
+ if (!isProtocolErrorResponse(response)) {
61
+ throw new TypeError(`Expected protocol error response: ${out.join("")}`);
62
+ }
63
+
64
+ expect(response).toEqual({
65
+ jsonrpc: "2.0",
66
+ id: null,
67
+ error: {
68
+ code: -32700,
69
+ message: "Parse error",
70
+ data: response.error.data,
71
+ },
72
+ });
73
+ expect(typeof response.error.data).toBe("string");
74
+ expect(response.error.data).toContain("garbage");
75
+ });
76
+ });
77
+
78
+ function collectingWritable(chunks: string[]): Writable {
79
+ return new Writable({
80
+ write(chunk, _encoding, callback): void {
81
+ chunks.push(chunk.toString());
82
+ callback();
83
+ },
84
+ });
85
+ }
86
+
87
+ function isProtocolErrorResponse(value: unknown): value is {
88
+ readonly jsonrpc: string;
89
+ readonly id: null;
90
+ readonly error: { readonly code: number; readonly message: string; readonly data?: unknown };
91
+ } {
92
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
93
+ const record = value;
94
+ if (!("error" in record)) return false;
95
+ const { error } = record;
96
+ return typeof error === "object" && error !== null && !Array.isArray(error);
97
+ }
@@ -0,0 +1,122 @@
1
+ import type { Readable, Writable } from "node:stream";
2
+ import {
3
+ errorResponse,
4
+ isPlainRecord,
5
+ jsonRpcId,
6
+ runJsonRpcStdioServer,
7
+ successResponse,
8
+ type JsonRpcError,
9
+ type JsonRpcId,
10
+ type JsonRpcResponse,
11
+ type JsonRpcResult,
12
+ type McpToolDescriptor,
13
+ type ParentWatchdogConfig,
14
+ } from "@oh-my-opencode/mcp-stdio-core";
15
+ import { coerceToolArguments, executeLspTool, LSP_MCP_TOOLS } from "./tools.js";
16
+ import { createStandaloneMcpRequestContext, runWithRequestContext } from "./request-context.js";
17
+
18
+ export type { JsonRpcError, JsonRpcId, JsonRpcResponse, JsonRpcResult, McpToolDescriptor };
19
+
20
+ const SERVER_NAME = "lsp";
21
+ const SERVER_VERSION = "0.1.0";
22
+ const PROTOCOL_VERSIONS: readonly string[] = ["2025-06-18", "2025-03-26", "2024-11-05"];
23
+
24
+ export interface HandleLspMcpRequestOptions {
25
+ readonly signal?: AbortSignal;
26
+ }
27
+
28
+ export interface LspMcpStdioServerOptions {
29
+ // Test seam: production callers leave this unset so the watchdog uses its
30
+ // defaults (parentPid = process.ppid, 30s poll).
31
+ readonly parentWatchdog?: ParentWatchdogConfig;
32
+ }
33
+
34
+ export async function handleLspMcpRequest(
35
+ input: unknown,
36
+ options: HandleLspMcpRequestOptions = {},
37
+ ): Promise<JsonRpcResponse | undefined> {
38
+ if (!isPlainRecord(input)) {
39
+ return errorResponse(null, -32600, "Invalid Request");
40
+ }
41
+
42
+ const id = jsonRpcId(input["id"]);
43
+ const method = input["method"];
44
+ if (method === "notifications/initialized") return undefined;
45
+ if (method === "ping") return successResponse(id, {});
46
+ if (method === "initialize") {
47
+ const protocolVersion = requestedProtocolVersion(input["params"]);
48
+ return successResponse(id, {
49
+ capabilities: { tools: { listChanged: false } },
50
+ serverInfo: { name: SERVER_NAME, version: SERVER_VERSION },
51
+ protocolVersion,
52
+ });
53
+ }
54
+
55
+ if (method === "tools/list") {
56
+ return successResponse(id, { tools: LSP_MCP_TOOLS.map(describeTool) });
57
+ }
58
+
59
+ if (method === "tools/call") {
60
+ return handleToolCall(id, input["params"], options.signal);
61
+ }
62
+
63
+ return errorResponse(id, -32601, `Method not found: ${String(method)}`);
64
+ }
65
+
66
+ export async function runMcpStdioServer(
67
+ input: Readable = process.stdin,
68
+ output: Writable = process.stdout,
69
+ options: LspMcpStdioServerOptions = {},
70
+ ): Promise<void> {
71
+ const requestContext = createStandaloneMcpRequestContext();
72
+ await runJsonRpcStdioServer({
73
+ input,
74
+ output,
75
+ // Idle stays disabled: hosts of this CLI (legacy opencode configs and
76
+ // standalone lsp-tools-mcp users) have no evidenced respawn for an exited
77
+ // stdio server; opencode in particular marks it failed without retry.
78
+ idleTimeoutMs: 0,
79
+ parentWatchdog: options.parentWatchdog ?? {},
80
+ handler: (request) => runWithRequestContext(requestContext, () => handleLspMcpRequest(request)),
81
+ handlerOptions: undefined,
82
+ });
83
+ }
84
+
85
+ async function handleToolCall(id: JsonRpcId, params: unknown, signal?: AbortSignal): Promise<JsonRpcResponse> {
86
+ if (!isPlainRecord(params) || typeof params["name"] !== "string") {
87
+ return errorResponse(id, -32602, "tools/call requires params.name");
88
+ }
89
+
90
+ try {
91
+ const result = await executeLspTool(params["name"], coerceToolArguments(params["arguments"]), signal);
92
+ return successResponse(id, {
93
+ content: result.content,
94
+ isError: result.isError ?? false,
95
+ details: result.details,
96
+ });
97
+ } catch (error) {
98
+ if (!(error instanceof Error)) {
99
+ throw error;
100
+ }
101
+ return successResponse(id, {
102
+ content: [{ type: "text", text: error.message }],
103
+ isError: true,
104
+ });
105
+ }
106
+ }
107
+
108
+ function describeTool(tool: (typeof LSP_MCP_TOOLS)[number]): McpToolDescriptor {
109
+ return {
110
+ name: tool.name,
111
+ title: tool.title,
112
+ description: tool.description,
113
+ inputSchema: tool.inputSchema,
114
+ };
115
+ }
116
+
117
+ function requestedProtocolVersion(params: unknown): string {
118
+ const requested = isPlainRecord(params) ? params["protocolVersion"] : undefined;
119
+ return typeof requested === "string" && PROTOCOL_VERSIONS.includes(requested)
120
+ ? requested
121
+ : "2025-06-18";
122
+ }
@@ -0,0 +1,135 @@
1
+ import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { afterEach, describe, expect, it } from "bun:test";
5
+
6
+ import { LspServerLookupError } from "./lsp/errors.js";
7
+ import { missingDependencyResult } from "./missing-dependency-result.js";
8
+ import { parseLspRequestContext, runWithRequestContext } from "./request-context.js";
9
+
10
+ const tempDirectories: string[] = [];
11
+
12
+ afterEach(() => {
13
+ for (const directory of tempDirectories.splice(0)) {
14
+ rmSync(directory, { recursive: true, force: true });
15
+ }
16
+ });
17
+
18
+ function tempRoot(): string {
19
+ const root = mkdtempSync(join(homedir(), "lsp-missing-dep-"));
20
+ tempDirectories.push(root);
21
+ return root;
22
+ }
23
+
24
+ describe("missingDependencyResult", () => {
25
+ it("#given not configured lookup #when converted #then includes structured availability and typed config paths", () => {
26
+ const root = tempRoot();
27
+ const projectConfigPath = join(root, ".codex", "lsp-client.json");
28
+ const userConfigPath = join(homedir(), ".codex", "lsp-client.json");
29
+ const installDecisionsPath = join(homedir(), ".codex", "lsp-install-decisions.json");
30
+ const context = parseLspRequestContext({
31
+ cwd: root,
32
+ projectConfigPaths: [projectConfigPath],
33
+ userConfigPath,
34
+ installDecisionsPath,
35
+ capabilities: { installDecisionTool: false },
36
+ });
37
+
38
+ const result = runWithRequestContext(context, () =>
39
+ missingDependencyResult(
40
+ new LspServerLookupError("No LSP server configured for extension: .foo", {
41
+ status: "not_configured",
42
+ extension: ".foo",
43
+ availableServers: ["typescript"],
44
+ }),
45
+ { filePath: "src/file.foo" },
46
+ ),
47
+ );
48
+
49
+ expect(result?.details).toEqual({
50
+ filePath: "src/file.foo",
51
+ error: "No LSP server configured for extension: .foo",
52
+ errorKind: "missing_dependency",
53
+ availability: {
54
+ kind: "not_configured",
55
+ extension: ".foo",
56
+ availableServers: ["typescript"],
57
+ projectConfigPaths: [projectConfigPath],
58
+ userConfigPath,
59
+ installDecisionTool: false,
60
+ },
61
+ });
62
+ });
63
+
64
+ it("#given not installed lookup #when converted #then includes install decision availability", () => {
65
+ const root = tempRoot();
66
+ const installDecisionsPath = join(root, "lsp-install-decisions.json");
67
+ const context = parseLspRequestContext({
68
+ cwd: root,
69
+ projectConfigPaths: [join(root, ".codex", "lsp-client.json")],
70
+ userConfigPath: join(homedir(), ".codex", "lsp-client.json"),
71
+ installDecisionsPath,
72
+ capabilities: { installDecisionTool: true },
73
+ });
74
+
75
+ const result = runWithRequestContext(context, () =>
76
+ missingDependencyResult(
77
+ new LspServerLookupError("LSP server 'typescript' for .ts is NOT INSTALLED.", {
78
+ status: "not_installed",
79
+ server: {
80
+ id: "typescript",
81
+ command: ["typescript-language-server", "--stdio"],
82
+ extensions: [".ts"],
83
+ },
84
+ installHint: "npm install -g typescript-language-server typescript",
85
+ }),
86
+ { filePath: "src/file.ts" },
87
+ ),
88
+ );
89
+
90
+ expect(result?.details).toEqual({
91
+ filePath: "src/file.ts",
92
+ error: "LSP server 'typescript' for .ts is NOT INSTALLED.",
93
+ errorKind: "missing_dependency",
94
+ availability: {
95
+ kind: "not_installed",
96
+ serverId: "typescript",
97
+ command: ["typescript-language-server", "--stdio"],
98
+ extensions: [".ts"],
99
+ installHint: "npm install -g typescript-language-server typescript",
100
+ installDecisionTool: true,
101
+ installDecisionsPath,
102
+ decision: null,
103
+ },
104
+ });
105
+ });
106
+
107
+ it("#given a recorded decision #when a not installed lookup is converted #then availability carries it", () => {
108
+ const root = tempRoot();
109
+ const installDecisionsPath = join(root, "lsp-install-decisions.json");
110
+ writeFileSync(
111
+ installDecisionsPath,
112
+ JSON.stringify({ biome: { decision: "declined", decidedAt: "2026-09-29T00:00:00.000Z" } }),
113
+ );
114
+ const context = parseLspRequestContext({
115
+ cwd: root,
116
+ projectConfigPaths: [join(root, ".codex", "lsp-client.json")],
117
+ userConfigPath: join(root, "lsp-client.json"),
118
+ installDecisionsPath,
119
+ capabilities: { installDecisionTool: false },
120
+ });
121
+
122
+ const result = runWithRequestContext(context, () =>
123
+ missingDependencyResult(
124
+ new LspServerLookupError("LSP server 'biome' is NOT INSTALLED.", {
125
+ status: "not_installed",
126
+ server: { id: "biome", command: ["biome", "lsp-proxy"], extensions: [".json"] },
127
+ installHint: "npm install -g @biomejs/biome",
128
+ }),
129
+ { filePath: "a.json" },
130
+ ),
131
+ );
132
+
133
+ expect(result?.details).toMatchObject({ availability: { kind: "not_installed", decision: "declined" } });
134
+ });
135
+ });
@@ -0,0 +1,79 @@
1
+ import { LspServerLookupError } from "./lsp/errors.js";
2
+ import { type InstallDecision, loadInstallDecision } from "./lsp/server-install-state.js";
3
+ import { handleMissingDependencyError } from "./lsp/startup-failure.js";
4
+ import { lspRequestContext } from "./request-context.js";
5
+ import type { ToolExecutionResult } from "./tools.js";
6
+
7
+ export type MissingDependencyAvailability =
8
+ | {
9
+ readonly kind: "not_configured";
10
+ readonly extension: string;
11
+ readonly availableServers: readonly string[];
12
+ readonly projectConfigPaths: readonly string[];
13
+ readonly userConfigPath: string;
14
+ readonly installDecisionTool: boolean;
15
+ }
16
+ | {
17
+ readonly kind: "not_installed";
18
+ readonly serverId: string;
19
+ readonly command: readonly string[];
20
+ readonly extensions: readonly string[];
21
+ readonly installHint: string;
22
+ readonly installDecisionTool: boolean;
23
+ readonly installDecisionsPath: string;
24
+ readonly decision: InstallDecision | null;
25
+ };
26
+
27
+ export function missingDependencyResult<TDetails extends object>(
28
+ error: unknown,
29
+ details: TDetails,
30
+ ): ToolExecutionResult | null {
31
+ const message = handleMissingDependencyError(error);
32
+ if (!message) return null;
33
+
34
+ return {
35
+ content: [{ type: "text", text: message }],
36
+ details: {
37
+ ...details,
38
+ error: message,
39
+ errorKind: "missing_dependency",
40
+ ...availabilityDetails(error),
41
+ },
42
+ };
43
+ }
44
+
45
+ function availabilityDetails(error: unknown): { readonly availability: MissingDependencyAvailability } | object {
46
+ const availability = missingDependencyAvailability(error);
47
+ return availability === null ? {} : { availability };
48
+ }
49
+
50
+ function missingDependencyAvailability(error: unknown): MissingDependencyAvailability | null {
51
+ if (!(error instanceof LspServerLookupError) || error.lookup === undefined) return null;
52
+ const context = lspRequestContext();
53
+ switch (error.lookup.status) {
54
+ case "not_configured":
55
+ return {
56
+ kind: "not_configured",
57
+ extension: error.lookup.extension,
58
+ availableServers: [...error.lookup.availableServers],
59
+ projectConfigPaths: [...context.projectConfigPaths],
60
+ userConfigPath: context.userConfigPath,
61
+ installDecisionTool: context.capabilities.installDecisionTool,
62
+ };
63
+ case "not_installed":
64
+ return {
65
+ kind: "not_installed",
66
+ serverId: error.lookup.server.id,
67
+ command: [...error.lookup.server.command],
68
+ extensions: [...error.lookup.server.extensions],
69
+ installHint: error.lookup.installHint,
70
+ installDecisionTool: context.capabilities.installDecisionTool,
71
+ installDecisionsPath: context.installDecisionsPath,
72
+ decision: loadInstallDecision(error.lookup.server.id)?.decision ?? null,
73
+ };
74
+ default: {
75
+ const exhaustive: never = error.lookup;
76
+ return exhaustive;
77
+ }
78
+ }
79
+ }
@@ -0,0 +1,55 @@
1
+ import { homedir, tmpdir } from "node:os";
2
+ import { dirname, resolve } from "node:path";
3
+
4
+ import { nearestMarkedAncestor } from "../lsp/outside-context-workspace.js";
5
+ import { canonicalizeExistingOrNearestAncestor, isPathInside } from "../request-context.js";
6
+
7
+ export type PostEditFileLocation = "project" | "outside_project" | "agent_config" | "temp";
8
+
9
+ export interface PostEditFileLocationOptions {
10
+ readonly cwd: string;
11
+ readonly agentDirs: readonly string[];
12
+ /** Temp roots; defaults to the canonical OS temp dir (plus `/tmp` off Windows). */
13
+ readonly tempDirs?: readonly string[];
14
+ /** Home dirs that never count as a project root themselves; defaults to the OS home dir. */
15
+ readonly homeDirs?: readonly string[];
16
+ }
17
+
18
+ /**
19
+ * Classifies an edited file for install guidance.
20
+ *
21
+ * A project root is the nearest ancestor carrying one of lsp-core's `WORKSPACE_MARKERS` (the marker set the
22
+ * out-of-cwd workspace resolver uses). Inside a temp dir, only a marked root strictly below the temp root
23
+ * counts, so a stray `package.json` left in the temp root does not turn every scratch file into a project.
24
+ * The home dir is never a project root either: a dotfiles `.git` or stray `~/package.json` there does not make
25
+ * every home-level file a project, while a marked project below home still is one.
26
+ * Paths are canonicalized first because macOS `/tmp` and `/var` are symlinks.
27
+ */
28
+ export function classifyPostEditFileLocation(
29
+ filePath: string,
30
+ options: PostEditFileLocationOptions,
31
+ ): PostEditFileLocation {
32
+ const file = canonicalizeExistingOrNearestAncestor(resolve(options.cwd, filePath));
33
+ if (canonicalDirectories(options.agentDirs).some((directory) => isPathInside(directory, file))) {
34
+ return "agent_config";
35
+ }
36
+
37
+ const projectRoot = nearestMarkedAncestor(dirname(file));
38
+ const tempRoot = canonicalDirectories(options.tempDirs ?? defaultTempDirectories()).find((directory) =>
39
+ isPathInside(directory, file),
40
+ );
41
+ if (tempRoot !== undefined) {
42
+ const ownProject = projectRoot !== undefined && projectRoot !== tempRoot && isPathInside(tempRoot, projectRoot);
43
+ return ownProject ? "project" : "temp";
44
+ }
45
+ if (projectRoot === undefined) return "outside_project";
46
+ return canonicalDirectories(options.homeDirs ?? [homedir()]).includes(projectRoot) ? "outside_project" : "project";
47
+ }
48
+
49
+ function defaultTempDirectories(): readonly string[] {
50
+ return process.platform === "win32" ? [tmpdir()] : [tmpdir(), "/tmp"];
51
+ }
52
+
53
+ function canonicalDirectories(directories: readonly string[]): readonly string[] {
54
+ return directories.map((directory) => canonicalizeExistingOrNearestAncestor(directory));
55
+ }
@@ -0,0 +1,3 @@
1
+ export * from "./file-location.js";
2
+ export * from "./not-installed-guidance.js";
3
+ export * from "./orchestration.js";