lazycodex-ai 5.1.48 → 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 (437) 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 -316
  225. package/packages/omo-codex/plugin/skills/ulw-research/references/deliverable-phase.md +23 -21
  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 +12 -5
  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 +13 -4
  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 +11 -1
  240. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-commands-meaning.mjs +13 -9
  241. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-commands-polish.mjs +40 -18
  242. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-commands-verify.mjs +25 -8
  243. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-commands.mjs +35 -16
  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 +6 -4
  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 +4 -4
  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 +79 -26
  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 -316
  316. package/packages/shared-skills/skills/ulw-research/references/deliverable-phase.md +23 -21
  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 +12 -5
  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 +13 -4
  329. package/packages/shared-skills/skills/ulw-research/scripts/contracts.test.ts +6 -110
  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-polish.test.ts +4 -3
  336. package/packages/shared-skills/skills/ulw-research/scripts/css-hiding.mjs +158 -0
  337. package/packages/shared-skills/skills/ulw-research/scripts/css-lite.mjs +4 -2
  338. package/packages/shared-skills/skills/ulw-research/scripts/delivery-barrier-meaning.test.ts +186 -0
  339. package/packages/shared-skills/skills/ulw-research/scripts/delivery-barrier.test.ts +40 -87
  340. package/packages/shared-skills/skills/ulw-research/scripts/entities.mjs +13 -4
  341. package/packages/shared-skills/skills/ulw-research/scripts/fact-commands-fill.mjs +11 -1
  342. package/packages/shared-skills/skills/ulw-research/scripts/fact-commands-meaning.mjs +13 -9
  343. package/packages/shared-skills/skills/ulw-research/scripts/fact-commands-polish.mjs +40 -18
  344. package/packages/shared-skills/skills/ulw-research/scripts/fact-commands-verify.mjs +25 -8
  345. package/packages/shared-skills/skills/ulw-research/scripts/fact-commands.mjs +35 -16
  346. package/packages/shared-skills/skills/ulw-research/scripts/fact-derive-2.test.ts +149 -0
  347. package/packages/shared-skills/skills/ulw-research/scripts/fact-derive.mjs +7 -2
  348. package/packages/shared-skills/skills/ulw-research/scripts/fact-derive.test.ts +7 -192
  349. package/packages/shared-skills/skills/ulw-research/scripts/fact-fill.mjs +6 -4
  350. package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger-kinds.mjs +6 -7
  351. package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger-kinds.test.ts +2 -1
  352. package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger-legacy.test.ts +2 -1
  353. package/packages/shared-skills/skills/ulw-research/scripts/fact-locate.mjs +15 -9
  354. package/packages/shared-skills/skills/ulw-research/scripts/fact-unit-dimensions-2.test.ts +149 -0
  355. package/packages/shared-skills/skills/ulw-research/scripts/fact-unit-dimensions.test.ts +4 -168
  356. package/packages/shared-skills/skills/ulw-research/scripts/fact-unit-rules.test.ts +3 -229
  357. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-claims.mjs +4 -3
  358. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-csv.mjs +32 -0
  359. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-lexicon.mjs +1 -1
  360. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-originals.mjs +161 -0
  361. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-policy.mjs +4 -4
  362. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-records.mjs +81 -14
  363. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-snapshot-readability.mjs +49 -0
  364. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-sources.mjs +76 -0
  365. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-trace.mjs +25 -11
  366. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-value-unit.mjs +202 -0
  367. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-values.mjs +40 -39
  368. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-values.test.ts +8 -29
  369. package/packages/shared-skills/skills/ulw-research/scripts/gates-fidelity.mjs +8 -6
  370. package/packages/shared-skills/skills/ulw-research/scripts/gates-static-headings.test.ts +17 -0
  371. package/packages/shared-skills/skills/ulw-research/scripts/gates-static.mjs +10 -1
  372. package/packages/shared-skills/skills/ulw-research/scripts/html-lite.mjs +6 -2
  373. package/packages/shared-skills/skills/ulw-research/scripts/html-markup.mjs +2 -2
  374. package/packages/shared-skills/skills/ulw-research/scripts/html-text-map.mjs +140 -0
  375. package/packages/shared-skills/skills/ulw-research/scripts/html-text-map.test.ts +148 -0
  376. package/packages/shared-skills/skills/ulw-research/scripts/markdown-closers.mjs +126 -0
  377. package/packages/shared-skills/skills/ulw-research/scripts/md-lite-boundaries.test.ts +46 -0
  378. package/packages/shared-skills/skills/ulw-research/scripts/md-lite.mjs +1 -1
  379. package/packages/shared-skills/skills/ulw-research/scripts/number-grammar.mjs +33 -0
  380. package/packages/shared-skills/skills/ulw-research/scripts/number-grammar.test.ts +36 -0
  381. package/packages/shared-skills/skills/ulw-research/scripts/numerals.mjs +18 -7
  382. package/packages/shared-skills/skills/ulw-research/scripts/numerals.test.ts +3 -0
  383. package/packages/shared-skills/skills/ulw-research/scripts/outcome-start.mjs +66 -0
  384. package/packages/shared-skills/skills/ulw-research/scripts/outcome-start.test.ts +109 -0
  385. package/packages/shared-skills/skills/ulw-research/scripts/outcome.mjs +11 -22
  386. package/packages/shared-skills/skills/ulw-research/scripts/page-source-locator.test.ts +187 -0
  387. package/packages/shared-skills/skills/ulw-research/scripts/placeholder.mjs +18 -6
  388. package/packages/shared-skills/skills/ulw-research/scripts/polish-apply.mjs +3 -2
  389. package/packages/shared-skills/skills/ulw-research/scripts/polish-markup.test.ts +15 -1
  390. package/packages/shared-skills/skills/ulw-research/scripts/polish-partial.test.ts +42 -0
  391. package/packages/shared-skills/skills/ulw-research/scripts/raw-decode.mjs +110 -0
  392. package/packages/shared-skills/skills/ulw-research/scripts/raw-locator.mjs +47 -0
  393. package/packages/shared-skills/skills/ulw-research/scripts/raw-snapshot.test.ts +139 -0
  394. package/packages/shared-skills/skills/ulw-research/scripts/report-tools-2.test.ts +233 -0
  395. package/packages/shared-skills/skills/ulw-research/scripts/report-tools-3.test.ts +141 -0
  396. package/packages/shared-skills/skills/ulw-research/scripts/report-tools-4.test.ts +135 -0
  397. package/packages/shared-skills/skills/ulw-research/scripts/report-tools-5.test.ts +231 -0
  398. package/packages/shared-skills/skills/ulw-research/scripts/report-tools-commands.mjs +1 -1
  399. package/packages/shared-skills/skills/ulw-research/scripts/report-tools.mjs +7 -1
  400. package/packages/shared-skills/skills/ulw-research/scripts/report-tools.test.ts +5 -800
  401. package/packages/shared-skills/skills/ulw-research/scripts/snapshot-readability.test.ts +116 -0
  402. package/packages/shared-skills/skills/ulw-research/scripts/source-commands.mjs +79 -26
  403. package/packages/shared-skills/skills/ulw-research/scripts/source-integrity.test.ts +243 -0
  404. package/packages/shared-skills/skills/ulw-research/scripts/source-refresh.mjs +82 -0
  405. package/packages/shared-skills/skills/ulw-research/scripts/source-snapshot.mjs +73 -69
  406. package/packages/shared-skills/skills/ulw-research/scripts/source-snapshot.test.ts +7 -4
  407. package/packages/shared-skills/skills/ulw-research/scripts/source-view.mjs +89 -0
  408. package/packages/shared-skills/skills/ulw-research/scripts/sources-citation.mjs +203 -0
  409. package/packages/shared-skills/skills/ulw-research/scripts/sources-citation.test.ts +236 -0
  410. package/packages/shared-skills/skills/ulw-research/scripts/tests/contracts-support.ts +147 -0
  411. package/packages/shared-skills/skills/ulw-research/scripts/tests/delivery-barrier-session.ts +59 -0
  412. package/packages/shared-skills/skills/ulw-research/scripts/tests/derive-clock.ts +4 -0
  413. package/packages/shared-skills/skills/ulw-research/scripts/tests/fact-derive-support.ts +65 -0
  414. package/packages/shared-skills/skills/ulw-research/scripts/tests/fact-unit-dimensions-support.ts +41 -0
  415. package/packages/shared-skills/skills/ulw-research/scripts/tests/fact-unit-rules-support.ts +241 -0
  416. package/packages/shared-skills/skills/ulw-research/scripts/tests/fidelity-values-support.ts +30 -0
  417. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/conversion-probe.html +14 -0
  418. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/sources-shapes.html +20 -0
  419. package/packages/shared-skills/skills/ulw-research/scripts/tests/numeral-classes.ts +196 -0
  420. package/packages/shared-skills/skills/ulw-research/scripts/tests/report-tools-support.ts +182 -0
  421. package/packages/shared-skills/skills/ulw-research/scripts/tests/value-mode-support.ts +48 -0
  422. package/packages/shared-skills/skills/ulw-research/scripts/units.mjs +14 -3
  423. package/packages/shared-skills/skills/ulw-research/scripts/units.test.ts +10 -0
  424. package/packages/shared-skills/skills/ulw-research/scripts/value-mode-unit-classes.test.ts +255 -0
  425. package/packages/shared-skills/skills/ulw-research/scripts/value-mode-unit.test.ts +179 -0
  426. package/packages/shared-skills/skills/ulw-research/scripts/value-rules-cli.test.ts +157 -0
  427. package/packages/shared-skills/skills/ulw-research/scripts/value-rules-followups.test.ts +72 -0
  428. package/packages/shared-skills/skills/ulw-research/scripts/value-rules-priority.test.ts +80 -0
  429. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/fixtures/amp_redirect_stub.html +0 -7
  430. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/fixtures/search_interstitial.html +0 -19
  431. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/fixtures/wayback_available.json +0 -1
  432. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/fixtures/wayback_snapshot.html +0 -1128
  433. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_fetch_chain.py +0 -77
  434. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_playwright_stealth.py +0 -86
  435. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +0 -279
  436. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_surrogate.py +0 -252
  437. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_surrogate_validators.py +0 -78
@@ -0,0 +1,339 @@
1
+ import { reportBestEffortCleanupError } from "./cleanup-errors.js";
2
+ import { realTimerProvider } from "./timer-provider.js";
3
+ import type { TimerProvider } from "./timer-provider.js";
4
+ import { INIT_TIMEOUT_MS, REQUEST_TIMEOUT_MS, STOP_HARD_KILL_TIMEOUT_MS, STOP_SIGKILL_GRACE_MS } from "./constants.js";
5
+ import { LspConnectionClosedError, LspProcessExitedError, LspRequestTimeoutError } from "./errors.js";
6
+ import { JsonRpcConnection } from "./json-rpc-connection.js";
7
+ import { type SpawnedProcess, spawnProcess } from "./process.js";
8
+ import { createLspSpawnEnv, parseConfigurationItems, parseDiagnosticsParams } from "./transport-protocol.js";
9
+ import type { Diagnostic, ResolvedServer } from "./types.js";
10
+ import type { WorkspaceApplyEditResponse } from "./workspace-mutation-controller.js";
11
+
12
+ export { createLspSpawnEnv } from "./transport-protocol.js";
13
+
14
+ export interface LspClientTimeoutOptions {
15
+ requestTimeoutMs?: number;
16
+ initializeTimeoutMs?: number;
17
+ timerProvider?: TimerProvider;
18
+ }
19
+
20
+ type WorkspaceApplyEditHandler = (params: unknown) => Promise<WorkspaceApplyEditResponse>;
21
+
22
+ class LspClientNotStartedError extends Error {
23
+ override readonly name = "LspClientNotStartedError";
24
+
25
+ constructor(
26
+ readonly serverId: string,
27
+ readonly root: string,
28
+ ) {
29
+ super("LSP client not started");
30
+ }
31
+ }
32
+
33
+ export class LspClientTransport {
34
+ protected proc: SpawnedProcess | null = null;
35
+ protected connection: JsonRpcConnection | null = null;
36
+ protected readonly stderrBuffer: string[] = [];
37
+ protected processExited = false;
38
+ protected readonly diagnosticsStore = new Map<string, Diagnostic[]>();
39
+ protected readonly requestTimeoutMs: number;
40
+ protected readonly initializeTimeoutMs: number;
41
+ protected readonly timerProvider: TimerProvider;
42
+ private workspaceApplyEditHandler: WorkspaceApplyEditHandler | null = null;
43
+ private diagnosticPullSupported = false;
44
+ private documentFormattingSupported = false;
45
+
46
+ constructor(
47
+ protected readonly root: string,
48
+ protected readonly server: ResolvedServer,
49
+ timeouts: LspClientTimeoutOptions = {},
50
+ ) {
51
+ this.requestTimeoutMs = timeouts.requestTimeoutMs ?? REQUEST_TIMEOUT_MS;
52
+ this.initializeTimeoutMs = timeouts.initializeTimeoutMs ?? INIT_TIMEOUT_MS;
53
+ this.timerProvider = timeouts.timerProvider ?? realTimerProvider;
54
+ }
55
+
56
+ pid(): number | undefined {
57
+ return this.proc?.pid;
58
+ }
59
+
60
+ command(): string[] {
61
+ return [...this.server.command];
62
+ }
63
+
64
+ protected setWorkspaceApplyEditHandler(handler: WorkspaceApplyEditHandler): void {
65
+ this.workspaceApplyEditHandler = handler;
66
+ }
67
+
68
+ protected hasWorkspaceApplyEditHandler(): boolean {
69
+ return this.workspaceApplyEditHandler !== null;
70
+ }
71
+
72
+ protected setDiagnosticPullSupported(supported: boolean): void {
73
+ this.diagnosticPullSupported = supported;
74
+ }
75
+
76
+ protected isDiagnosticPullSupported(): boolean {
77
+ return this.diagnosticPullSupported;
78
+ }
79
+
80
+ protected setDocumentFormattingSupported(supported: boolean): void {
81
+ this.documentFormattingSupported = supported;
82
+ }
83
+
84
+ isDocumentFormattingSupported(): boolean {
85
+ return this.documentFormattingSupported;
86
+ }
87
+
88
+ protected handlePublishDiagnostics(params: {
89
+ readonly uri: string;
90
+ readonly diagnostics: readonly Diagnostic[];
91
+ readonly version?: number;
92
+ }): void {
93
+ this.diagnosticsStore.set(params.uri, [...params.diagnostics]);
94
+ }
95
+
96
+ async start(): Promise<void> {
97
+ const env = createLspSpawnEnv(this.root, {
98
+ ...process.env,
99
+ ...this.server.env,
100
+ });
101
+
102
+ this.proc = spawnProcess(this.server.command, {
103
+ cwd: this.root,
104
+ env,
105
+ });
106
+ this.startStderrReading();
107
+
108
+ if (this.proc.exitCode !== null) {
109
+ const stderr = this.stderrBuffer.join("\n");
110
+ throw new LspProcessExitedError(this.server.id, this.root, this.proc.exitCode, stderr.slice(-2000));
111
+ }
112
+
113
+ this.connection = new JsonRpcConnection(this.proc.stdout, this.proc.stdin);
114
+
115
+ this.connection.onNotification("textDocument/publishDiagnostics", (params) => {
116
+ const diagnosticsParams = parseDiagnosticsParams(params);
117
+ if (diagnosticsParams?.uri) {
118
+ this.handlePublishDiagnostics(diagnosticsParams);
119
+ }
120
+ });
121
+
122
+ this.connection.onRequest("workspace/configuration", (params) => {
123
+ const items = parseConfigurationItems(params);
124
+ return items.map((item) => {
125
+ if (item.section === "json") return { validate: { enable: true } };
126
+ return {};
127
+ });
128
+ });
129
+
130
+ this.connection.onRequest("client/registerCapability", () => null);
131
+ this.connection.onRequest("window/workDoneProgress/create", () => null);
132
+ if (this.workspaceApplyEditHandler) {
133
+ this.connection.onRequest("workspace/applyEdit", this.workspaceApplyEditHandler);
134
+ }
135
+
136
+ this.connection.onClose(() => {
137
+ this.processExited = true;
138
+ });
139
+
140
+ this.connection.onError((error) => {
141
+ reportBestEffortCleanupError("connection error notification", error);
142
+ });
143
+
144
+ this.connection.listen();
145
+ }
146
+
147
+ protected startStderrReading(): void {
148
+ if (!this.proc) return;
149
+ this.proc.stderr.setEncoding("utf-8");
150
+ this.proc.stderr.on("data", (chunk: string) => {
151
+ this.stderrBuffer.push(chunk);
152
+ if (this.stderrBuffer.length > 100) {
153
+ this.stderrBuffer.shift();
154
+ }
155
+ });
156
+ }
157
+
158
+ private isConnectionClosedError(error: unknown): error is Error {
159
+ if (!(error instanceof Error)) {
160
+ return false;
161
+ }
162
+ const code = "code" in error && typeof error.code === "string" ? error.code : undefined;
163
+ return (
164
+ code === "ERR_STREAM_DESTROYED" ||
165
+ /connection closed|connection is disposed|stream was destroyed/i.test(error.message)
166
+ );
167
+ }
168
+
169
+ protected sendRequest<T>(method: string): Promise<T>;
170
+ protected sendRequest<T>(method: string, params: unknown): Promise<T>;
171
+ protected sendRequest<T>(
172
+ method: string,
173
+ params: unknown,
174
+ options: { timeoutMs?: number; signal?: AbortSignal },
175
+ ): Promise<T>;
176
+ protected async sendRequest<T>(
177
+ method: string,
178
+ ...args: [] | [unknown] | [unknown, { timeoutMs?: number; signal?: AbortSignal }]
179
+ ): Promise<T> {
180
+ if (!this.connection) throw new LspClientNotStartedError(this.server.id, this.root);
181
+
182
+ if (this.processExited || (this.proc && this.proc.exitCode !== null)) {
183
+ const stderrTail = this.stderrBuffer.slice(-10).join("\n");
184
+ throw new LspProcessExitedError(
185
+ this.server.id,
186
+ this.root,
187
+ this.proc?.exitCode ?? null,
188
+ stderrTail || undefined,
189
+ );
190
+ }
191
+
192
+ const options = args[1];
193
+ const timeoutMs = options?.timeoutMs ?? this.requestTimeoutMs;
194
+ const timeoutController = new AbortController();
195
+ const timeoutHandle = this.timerProvider.setTimeout(() => {
196
+ const stderrTail = this.stderrBuffer.slice(-5).join("\n");
197
+ timeoutController.abort(new LspRequestTimeoutError(method, stderrTail || undefined));
198
+ }, timeoutMs);
199
+ const combinedSignal = combineAbortSignals(options?.signal, timeoutController.signal);
200
+
201
+ try {
202
+ const result =
203
+ args.length === 0
204
+ ? await this.connection.sendRequest<T>(method, undefined, { signal: combinedSignal.signal })
205
+ : await this.connection.sendRequest<T>(method, args[0], { signal: combinedSignal.signal });
206
+ return result;
207
+ } catch (error) {
208
+ if (this.processExited || (this.proc && this.proc.exitCode !== null)) {
209
+ throw new LspProcessExitedError(
210
+ this.server.id,
211
+ this.root,
212
+ this.proc?.exitCode ?? null,
213
+ this.stderrBuffer.slice(-10).join("\n") || undefined,
214
+ );
215
+ }
216
+ if (this.isConnectionClosedError(error)) {
217
+ throw new LspConnectionClosedError(this.server.id, this.root, error.message);
218
+ }
219
+ throw error;
220
+ } finally {
221
+ this.timerProvider.clearTimeout(timeoutHandle);
222
+ combinedSignal.dispose();
223
+ }
224
+ }
225
+
226
+ protected sendNotification(method: string): Promise<void>;
227
+ protected sendNotification(method: string, params: unknown): Promise<void>;
228
+ protected async sendNotification(method: string, ...args: [] | [unknown]): Promise<void> {
229
+ if (!this.connection) return;
230
+ if (this.processExited || (this.proc && this.proc.exitCode !== null)) return;
231
+ try {
232
+ if (args.length === 0) {
233
+ await this.connection.sendNotification(method);
234
+ } else {
235
+ await this.connection.sendNotification(method, args[0]);
236
+ }
237
+ } catch (error) {
238
+ if (this.isConnectionClosedError(error)) {
239
+ throw new LspConnectionClosedError(this.server.id, this.root, error.message);
240
+ }
241
+ throw error;
242
+ }
243
+ }
244
+
245
+ isAlive(): boolean {
246
+ return this.proc !== null && !this.processExited && this.proc.exitCode === null;
247
+ }
248
+
249
+ async stop(): Promise<void> {
250
+ if (this.connection) {
251
+ try {
252
+ await this.sendRequest<null>("shutdown");
253
+ } catch (error) {
254
+ reportBestEffortCleanupError("shutdown request", error instanceof Error ? error : String(error));
255
+ }
256
+ try {
257
+ await this.sendNotification("exit");
258
+ } catch (error) {
259
+ reportBestEffortCleanupError("exit notification", error instanceof Error ? error : String(error));
260
+ }
261
+ try {
262
+ this.connection.dispose();
263
+ } catch (error) {
264
+ reportBestEffortCleanupError("connection dispose", error instanceof Error ? error : String(error));
265
+ }
266
+ this.connection = null;
267
+ }
268
+
269
+ const proc = this.proc;
270
+ if (proc) {
271
+ this.proc = null;
272
+ let exitedBeforeTimeout = false;
273
+ try {
274
+ proc.kill();
275
+ let timeoutId: NodeJS.Timeout | undefined;
276
+ const timeoutPromise = new Promise<void>((resolve) => {
277
+ timeoutId = setTimeout(resolve, STOP_HARD_KILL_TIMEOUT_MS);
278
+ });
279
+ await Promise.race([
280
+ proc.exited
281
+ .then(() => {
282
+ exitedBeforeTimeout = true;
283
+ })
284
+ .finally(() => {
285
+ if (timeoutId) clearTimeout(timeoutId);
286
+ }),
287
+ timeoutPromise,
288
+ ]);
289
+ if (!exitedBeforeTimeout) {
290
+ try {
291
+ proc.kill("SIGKILL");
292
+ await Promise.race([
293
+ proc.exited,
294
+ new Promise<void>((resolve) => setTimeout(resolve, STOP_SIGKILL_GRACE_MS)),
295
+ ]);
296
+ } catch (error) {
297
+ reportBestEffortCleanupError("hard process kill", error instanceof Error ? error : String(error));
298
+ }
299
+ }
300
+ } catch (error) {
301
+ reportBestEffortCleanupError("process stop", error instanceof Error ? error : String(error));
302
+ }
303
+ }
304
+
305
+ this.processExited = true;
306
+ this.diagnosticsStore.clear();
307
+ }
308
+
309
+ getStoredDiagnostics(uri: string): Diagnostic[] {
310
+ return this.diagnosticsStore.get(uri) ?? [];
311
+ }
312
+ }
313
+
314
+ function combineAbortSignals(
315
+ primary: AbortSignal | undefined,
316
+ secondary: AbortSignal,
317
+ ): { readonly signal: AbortSignal; readonly dispose: () => void } {
318
+ const controller = new AbortController();
319
+ const abortFrom = (signal: AbortSignal): void => {
320
+ if (!controller.signal.aborted) controller.abort(signal.reason);
321
+ };
322
+ const onPrimaryAbort = (): void => {
323
+ if (primary) abortFrom(primary);
324
+ };
325
+ const onSecondaryAbort = (): void => abortFrom(secondary);
326
+
327
+ if (primary?.aborted) abortFrom(primary);
328
+ else primary?.addEventListener("abort", onPrimaryAbort, { once: true });
329
+ if (secondary.aborted) abortFrom(secondary);
330
+ else secondary.addEventListener("abort", onSecondaryAbort, { once: true });
331
+
332
+ return {
333
+ signal: controller.signal,
334
+ dispose: () => {
335
+ primary?.removeEventListener("abort", onPrimaryAbort);
336
+ secondary.removeEventListener("abort", onSecondaryAbort);
337
+ },
338
+ };
339
+ }
@@ -0,0 +1,134 @@
1
+ export interface LspServerConfig {
2
+ id: string;
3
+ command: string[];
4
+ extensions: string[];
5
+ disabled?: boolean;
6
+ env?: Record<string, string>;
7
+ initialization?: Record<string, unknown>;
8
+ }
9
+
10
+ export interface ResolvedServer {
11
+ id: string;
12
+ command: string[];
13
+ extensions: string[];
14
+ priority: number;
15
+ env?: Record<string, string>;
16
+ initialization?: Record<string, unknown>;
17
+ }
18
+
19
+ export interface ServerLookupInfo {
20
+ id: string;
21
+ command: string[];
22
+ extensions: string[];
23
+ }
24
+
25
+ export type ServerLookupResult =
26
+ | { status: "found"; server: ResolvedServer }
27
+ | { status: "not_configured"; extension: string; availableServers: string[] }
28
+ | { status: "not_installed"; server: ServerLookupInfo; installHint: string };
29
+
30
+ export interface Position {
31
+ line: number;
32
+ character: number;
33
+ }
34
+
35
+ export interface Range {
36
+ start: Position;
37
+ end: Position;
38
+ }
39
+
40
+ export interface Location {
41
+ uri: string;
42
+ range: Range;
43
+ }
44
+
45
+ export interface LocationLink {
46
+ targetUri: string;
47
+ targetRange: Range;
48
+ targetSelectionRange: Range;
49
+ originSelectionRange?: Range;
50
+ }
51
+
52
+ export interface SymbolInfo {
53
+ name: string;
54
+ kind: number;
55
+ location: Location;
56
+ containerName?: string;
57
+ }
58
+
59
+ export interface DocumentSymbol {
60
+ name: string;
61
+ kind: number;
62
+ range: Range;
63
+ selectionRange: Range;
64
+ children?: DocumentSymbol[];
65
+ }
66
+
67
+ export interface Diagnostic {
68
+ range: Range;
69
+ severity?: number;
70
+ code?: string | number;
71
+ source?: string;
72
+ message: string;
73
+ }
74
+
75
+ export interface FormattingOptions {
76
+ tabSize: number;
77
+ insertSpaces: boolean;
78
+ trimTrailingWhitespace?: boolean;
79
+ insertFinalNewline?: boolean;
80
+ trimFinalNewlines?: boolean;
81
+ }
82
+
83
+ export interface TextDocumentIdentifier {
84
+ uri: string;
85
+ }
86
+
87
+ export interface VersionedTextDocumentIdentifier extends TextDocumentIdentifier {
88
+ version: number | null;
89
+ }
90
+
91
+ export interface TextEdit {
92
+ range: Range;
93
+ newText: string;
94
+ }
95
+
96
+ export interface TextDocumentEdit {
97
+ textDocument: VersionedTextDocumentIdentifier;
98
+ edits: TextEdit[];
99
+ }
100
+
101
+ export interface CreateFile {
102
+ kind: "create";
103
+ uri: string;
104
+ options?: { overwrite?: boolean; ignoreIfExists?: boolean };
105
+ }
106
+
107
+ export interface RenameFile {
108
+ kind: "rename";
109
+ oldUri: string;
110
+ newUri: string;
111
+ options?: { overwrite?: boolean; ignoreIfExists?: boolean };
112
+ }
113
+
114
+ export interface DeleteFile {
115
+ kind: "delete";
116
+ uri: string;
117
+ options?: { recursive?: boolean; ignoreIfNotExists?: boolean };
118
+ }
119
+
120
+ export interface WorkspaceEdit {
121
+ changes?: { [uri: string]: TextEdit[] };
122
+ documentChanges?: (TextDocumentEdit | CreateFile | RenameFile | DeleteFile)[];
123
+ }
124
+
125
+ export interface PrepareRenameResult {
126
+ range: Range;
127
+ placeholder?: string;
128
+ }
129
+
130
+ export interface PrepareRenameDefaultBehavior {
131
+ defaultBehavior: boolean;
132
+ }
133
+
134
+ export type SeverityFilter = "error" | "warning" | "information" | "hint" | "all";
@@ -0,0 +1,72 @@
1
+ import { describe, expect, test } from "bun:test";
2
+
3
+ import { LspProcessExitedError } from "./errors.js";
4
+ import { formatKnownLspStartupFailure, handleMissingDependencyError } from "./utils.js";
5
+
6
+ describe("formatKnownLspStartupFailure", () => {
7
+ test("#given rust-src component conflict #when formatting startup failure #then returns repair guidance", () => {
8
+ // given
9
+ const error = new LspProcessExitedError(
10
+ "rust",
11
+ "/repo",
12
+ 1,
13
+ "failed to install component: 'rust-src', detected conflict: 'lib/rustlib/src/rust/library/Cargo.lock'",
14
+ );
15
+
16
+ // when
17
+ const message = formatKnownLspStartupFailure(error);
18
+
19
+ // then
20
+ expect(message).toContain("rust-analyzer");
21
+ expect(message).toContain("rustup component remove rust-src");
22
+ expect(message).toContain("rustup component add rust-src");
23
+ expect(message).toContain("detected conflict");
24
+ expect(message).toContain("Cargo.lock");
25
+ expect(message).not.toContain("automatic repair");
26
+ });
27
+
28
+ test("#given rust-analyzer sysroot error #when handling missing dependency #then returns repair guidance", () => {
29
+ // given
30
+ const error = new LspProcessExitedError(
31
+ "rust",
32
+ "/repo",
33
+ 1,
34
+ "can't load standard library from sysroot\ntry installing `rust-src` the same way you installed `rustc`",
35
+ );
36
+
37
+ // when
38
+ const message = handleMissingDependencyError(error);
39
+
40
+ // then
41
+ expect(message).toContain("rustup component remove rust-src");
42
+ expect(message).toContain("rustup component add rust-src");
43
+ expect(message).toContain("can't load standard library");
44
+ });
45
+
46
+ test("#given unrelated process exits #when formatting startup failure #then returns null", () => {
47
+ // given
48
+ const typescriptError = new LspProcessExitedError(
49
+ "typescript",
50
+ "/repo",
51
+ 1,
52
+ "failed to install component: 'rust-src', detected conflict",
53
+ );
54
+ const rustPanic = new LspProcessExitedError("rust", "/repo", 1, "thread panicked while loading crate graph");
55
+
56
+ // when / then
57
+ expect(formatKnownLspStartupFailure(typescriptError)).toBeNull();
58
+ expect(formatKnownLspStartupFailure(rustPanic)).toBeNull();
59
+ });
60
+ });
61
+
62
+ describe("handleMissingDependencyError", () => {
63
+ test("#given existing dependency messages #when handling error #then preserves current messages", () => {
64
+ // given
65
+ const notInstalled = new Error("LSP server 'typescript' is configured but NOT INSTALLED.");
66
+ const notConfigured = new Error("No LSP server configured for extension: .md");
67
+
68
+ // when / then
69
+ expect(handleMissingDependencyError(notInstalled)).toBe(notInstalled.message);
70
+ expect(handleMissingDependencyError(notConfigured)).toBe(notConfigured.message);
71
+ });
72
+ });
@@ -0,0 +1,40 @@
1
+ import { LspProcessExitedError } from "./errors.js";
2
+
3
+ const RUST_SRC_REPAIR_MESSAGE = [
4
+ "rust-analyzer exited while loading Rust standard library sources.",
5
+ "",
6
+ "Repair rust-src for the active toolchain:",
7
+ " rustup component remove rust-src",
8
+ " rustup component add rust-src",
9
+ ];
10
+
11
+ export function errorMessage(error: unknown): string {
12
+ return error instanceof Error ? error.message : String(error);
13
+ }
14
+
15
+ export function formatKnownLspStartupFailure(error: unknown): string | null {
16
+ if (!(error instanceof LspProcessExitedError)) return null;
17
+ if (error.serverId !== "rust") return null;
18
+
19
+ const details = error.stderrTail ?? error.message;
20
+ const lowerDetails = details.toLowerCase();
21
+ const isRustSrcFailure =
22
+ lowerDetails.includes("rust-src") &&
23
+ (lowerDetails.includes("failed to install component") ||
24
+ lowerDetails.includes("detected conflict") ||
25
+ lowerDetails.includes("can't load standard library") ||
26
+ lowerDetails.includes("try installing") ||
27
+ lowerDetails.includes("sysroot"));
28
+
29
+ if (!isRustSrcFailure) return null;
30
+
31
+ return [...RUST_SRC_REPAIR_MESSAGE, "", "Original stderr tail:", details].join("\n");
32
+ }
33
+
34
+ export function handleMissingDependencyError(error: unknown): string | null {
35
+ const knownStartupFailure = formatKnownLspStartupFailure(error);
36
+ if (knownStartupFailure) return knownStartupFailure;
37
+
38
+ const message = errorMessage(error);
39
+ return message.includes("NOT INSTALLED") || message.includes("No LSP server configured") ? message : null;
40
+ }
@@ -0,0 +1,19 @@
1
+ export type WorkspaceApplyEditConcurrentPhase = "applying" | "settled";
2
+
3
+ const CONCURRENT_FAILURE_REASON_BY_PHASE: Readonly<Record<WorkspaceApplyEditConcurrentPhase, string>> = {
4
+ applying: "workspace/applyEdit is already in progress for this workspace mutation",
5
+ settled: "workspace/applyEdit was already handled for this workspace mutation",
6
+ };
7
+
8
+ export const CANONICAL_CONCURRENT_WORKSPACE_APPLY_EDIT_FAILURE_REASON =
9
+ "workspace/applyEdit concurrent for this workspace mutation";
10
+
11
+ export function workspaceApplyEditConcurrentFailureReason(phase: WorkspaceApplyEditConcurrentPhase): string {
12
+ return CONCURRENT_FAILURE_REASON_BY_PHASE[phase];
13
+ }
14
+
15
+ export function canonicalizeWorkspaceApplyEditFailureReason(reason: string): string {
16
+ return Object.values(CONCURRENT_FAILURE_REASON_BY_PHASE).includes(reason)
17
+ ? CANONICAL_CONCURRENT_WORKSPACE_APPLY_EDIT_FAILURE_REASON
18
+ : reason;
19
+ }