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,398 @@
1
+ import { resolve } from "node:path";
2
+ import { pathToFileURL } from "node:url";
3
+
4
+ import { LspClientConnection } from "./connection.js";
5
+ import type { LspClientTimeoutOptions } from "./transport.js";
6
+ import type {
7
+ Diagnostic,
8
+ DocumentSymbol,
9
+ FormattingOptions,
10
+ Location,
11
+ LocationLink,
12
+ PrepareRenameDefaultBehavior,
13
+ PrepareRenameResult,
14
+ Range,
15
+ ResolvedServer,
16
+ SymbolInfo,
17
+ TextEdit,
18
+ WorkspaceEdit,
19
+ } from "./types.js";
20
+ import { LspRequestTimeoutError } from "./errors.js";
21
+ import { WorkspaceDocumentState } from "./workspace-document-state.js";
22
+ import type { TimerProvider } from "./timer-provider.js";
23
+ import type { LspRenameResult, WorkspaceEditCommitIo } from "./workspace-edit-types.js";
24
+ import { WorkspaceMutationController } from "./workspace-mutation-controller.js";
25
+
26
+ const DIAGNOSTICS_FRESHNESS_TIMEOUT_MS = 3_000;
27
+ const VERSIONLESS_PUBLISH_QUIESCENCE_MS = 250;
28
+
29
+ export interface LspDiagnosticsResult {
30
+ readonly items: Diagnostic[];
31
+ readonly transientError?: {
32
+ readonly kind: "freshness_timeout";
33
+ readonly message: string;
34
+ };
35
+ }
36
+
37
+ export interface LspClientOptions extends LspClientTimeoutOptions {
38
+ readonly diagnosticsFreshnessTimeoutMs?: number;
39
+ readonly versionlessPublishQuiescenceMs?: number;
40
+ readonly timerProvider?: TimerProvider;
41
+ }
42
+
43
+ export class LspClient extends LspClientConnection {
44
+ private readonly diagnosticPullErrors: Error[] = [];
45
+ private readonly documents: WorkspaceDocumentState;
46
+ private readonly workspaceMutations: WorkspaceMutationController;
47
+ private readonly diagnosticsFreshnessTimeoutMs: number;
48
+
49
+ constructor(root: string, server: ResolvedServer, options: LspClientOptions = {}) {
50
+ super(root, server, options);
51
+ this.diagnosticsFreshnessTimeoutMs =
52
+ options.diagnosticsFreshnessTimeoutMs ?? DIAGNOSTICS_FRESHNESS_TIMEOUT_MS;
53
+ this.documents = new WorkspaceDocumentState(
54
+ (method, params) => this.sendNotification(method, params),
55
+ (uri) => this.diagnosticsStore.delete(uri),
56
+ {
57
+ timerProvider: this.timerProvider,
58
+ versionlessPublishQuiescenceMs:
59
+ options.versionlessPublishQuiescenceMs ?? VERSIONLESS_PUBLISH_QUIESCENCE_MS,
60
+ },
61
+ );
62
+ this.workspaceMutations = new WorkspaceMutationController(root, this.documents);
63
+ this.setWorkspaceApplyEditHandler((params) => this.workspaceMutations.handleApplyEdit(params));
64
+ }
65
+
66
+ getDiagnosticPullErrors(): readonly Error[] {
67
+ return this.diagnosticPullErrors;
68
+ }
69
+
70
+ async openFile(filePath: string): Promise<void> {
71
+ const absPath = this.resolveWorkspacePath(filePath);
72
+ await this.documents.openFile(absPath);
73
+ }
74
+
75
+ getOpenDocumentVersion(filePath: string): number | undefined {
76
+ return this.documents.getVersion(this.resolveWorkspacePath(filePath));
77
+ }
78
+
79
+ override getStoredDiagnostics(uri: string): Diagnostic[] {
80
+ return [...this.documents.getStoredDiagnostics(uri)];
81
+ }
82
+
83
+ setWorkspaceEditIo(io: Partial<WorkspaceEditCommitIo>): void {
84
+ this.workspaceMutations.setIo(io);
85
+ }
86
+
87
+ protected override handlePublishDiagnostics(params: {
88
+ readonly uri: string;
89
+ readonly diagnostics: readonly Diagnostic[];
90
+ readonly version?: number;
91
+ }): void {
92
+ super.handlePublishDiagnostics(params);
93
+ this.documents.recordPublishedDiagnostics(params);
94
+ }
95
+
96
+ async definition(
97
+ filePath: string,
98
+ line: number,
99
+ character: number,
100
+ signal?: AbortSignal,
101
+ ): Promise<Location | LocationLink | Array<Location | LocationLink> | null> {
102
+ const absPath = this.resolveWorkspacePath(filePath);
103
+ await this.openFile(absPath);
104
+ const options = signal === undefined ? {} : { signal };
105
+ return this.sendRequest<Location | LocationLink | Array<Location | LocationLink> | null>(
106
+ "textDocument/definition",
107
+ {
108
+ textDocument: { uri: pathToFileURL(absPath).href },
109
+ position: { line: line - 1, character },
110
+ },
111
+ options,
112
+ );
113
+ }
114
+
115
+ async references(
116
+ filePath: string,
117
+ line: number,
118
+ character: number,
119
+ includeDeclaration = true,
120
+ signal?: AbortSignal,
121
+ ): Promise<Location[]> {
122
+ const absPath = this.resolveWorkspacePath(filePath);
123
+ await this.openFile(absPath);
124
+ const options = signal === undefined ? {} : { signal };
125
+ return this.sendRequest<Location[]>("textDocument/references", {
126
+ textDocument: { uri: pathToFileURL(absPath).href },
127
+ position: { line: line - 1, character },
128
+ context: { includeDeclaration },
129
+ }, options);
130
+ }
131
+
132
+ async documentSymbols(filePath: string, signal?: AbortSignal): Promise<Array<DocumentSymbol | SymbolInfo>> {
133
+ const absPath = this.resolveWorkspacePath(filePath);
134
+ await this.openFile(absPath);
135
+ const options = signal === undefined ? {} : { signal };
136
+ return this.sendRequest<Array<DocumentSymbol | SymbolInfo>>("textDocument/documentSymbol", {
137
+ textDocument: { uri: pathToFileURL(absPath).href },
138
+ }, options);
139
+ }
140
+
141
+ /**
142
+ * Requests whole-document formatting edits, returning null when the server never advertised the
143
+ * capability so callers can report unavailability instead of surfacing a method-not-found error.
144
+ */
145
+ async formatDocument(
146
+ filePath: string,
147
+ options: FormattingOptions,
148
+ signal?: AbortSignal,
149
+ ): Promise<TextEdit[] | null> {
150
+ if (!this.isDocumentFormattingSupported()) return null;
151
+ const absPath = this.resolveWorkspacePath(filePath);
152
+ await this.openFile(absPath);
153
+ const requestOptions = signal === undefined ? {} : { signal };
154
+ const edits = await this.sendRequest<TextEdit[] | null>(
155
+ "textDocument/formatting",
156
+ {
157
+ textDocument: { uri: pathToFileURL(absPath).href },
158
+ options,
159
+ },
160
+ requestOptions,
161
+ );
162
+ return edits ?? [];
163
+ }
164
+
165
+ async workspaceSymbols(query: string, signal?: AbortSignal): Promise<SymbolInfo[]> {
166
+ const options = signal === undefined ? {} : { signal };
167
+ return this.sendRequest<SymbolInfo[]>("workspace/symbol", { query }, options);
168
+ }
169
+
170
+ private isUnsupportedDiagnosticPullError(error: unknown): boolean {
171
+ if (!(error instanceof Error)) return false;
172
+ const code = "code" in error && typeof error.code === "number" ? error.code : undefined;
173
+ if (code === -32601) return true;
174
+ return /unsupported|not supported|method not found|unknown request/i.test(error.message);
175
+ }
176
+
177
+ private freshnessTimeout(absPath: string): LspDiagnosticsResult {
178
+ return {
179
+ items: [],
180
+ transientError: {
181
+ kind: "freshness_timeout",
182
+ message: `Timed out waiting for fresh diagnostics for ${absPath} within ${this.diagnosticsFreshnessTimeoutMs}ms.`,
183
+ },
184
+ };
185
+ }
186
+
187
+ private parseDiagnosticPullReport(value: { items?: Diagnostic[]; kind?: string; resultId?: string }): {
188
+ readonly type: "full";
189
+ readonly diagnostics: readonly Diagnostic[];
190
+ readonly resultId?: string;
191
+ } | {
192
+ readonly type: "unchanged";
193
+ readonly resultId?: string;
194
+ } {
195
+ if (value.kind === "unchanged") {
196
+ return {
197
+ type: "unchanged",
198
+ ...(value.resultId === undefined ? {} : { resultId: value.resultId }),
199
+ };
200
+ }
201
+ return {
202
+ type: "full",
203
+ diagnostics: value.items ?? [],
204
+ ...(value.resultId === undefined ? {} : { resultId: value.resultId }),
205
+ };
206
+ }
207
+
208
+ async diagnostics(filePath: string, signal?: AbortSignal): Promise<LspDiagnosticsResult> {
209
+ signal?.throwIfAborted();
210
+ const absPath = this.resolveWorkspacePath(filePath);
211
+ const uri = pathToFileURL(absPath).href;
212
+ await this.openFile(absPath);
213
+ const deadlineAt = this.timerProvider.now() + this.diagnosticsFreshnessTimeoutMs;
214
+
215
+ for (;;) {
216
+ signal?.throwIfAborted();
217
+ const snapshot = this.documents.captureDiagnosticSnapshot(absPath);
218
+ if (!snapshot) return this.freshnessTimeout(absPath);
219
+ const push = this.documents.resolvePushDiagnostics(snapshot);
220
+ if (push.status === "ready") return { items: [...push.diagnostics] };
221
+
222
+ let pushFallbackOnly = !this.isDiagnosticPullSupported();
223
+ if (!pushFallbackOnly) {
224
+ const cached = this.documents.getPullCache(snapshot);
225
+ try {
226
+ const remainingMs = deadlineAt - this.timerProvider.now();
227
+ if (remainingMs <= 0) return this.freshnessTimeout(absPath);
228
+ const result = await this.sendRequest<{ items?: Diagnostic[]; kind?: string; resultId?: string }>(
229
+ "textDocument/diagnostic",
230
+ {
231
+ textDocument: { uri },
232
+ ...(cached?.resultId === undefined ? {} : { previousResultId: cached.resultId }),
233
+ },
234
+ { timeoutMs: remainingMs, ...(signal === undefined ? {} : { signal }) },
235
+ );
236
+ if (!this.documents.isCurrentSnapshot(snapshot)) continue;
237
+ const report = this.parseDiagnosticPullReport(result);
238
+ if (report.type === "full") {
239
+ this.documents.recordPullDiagnostics(snapshot, {
240
+ kind: "full",
241
+ diagnostics: report.diagnostics,
242
+ ...(report.resultId === undefined ? {} : { resultId: report.resultId }),
243
+ });
244
+ return { items: [...report.diagnostics] };
245
+ }
246
+ if (
247
+ cached !== null &&
248
+ cached.documentVersion === snapshot.version &&
249
+ cached.resultId === report.resultId
250
+ ) {
251
+ return { items: [...cached.diagnostics] };
252
+ }
253
+ } catch (error) {
254
+ if (this.isUnsupportedDiagnosticPullError(error)) {
255
+ this.setDiagnosticPullSupported(false);
256
+ // A publish may have landed while the pull was in flight. Re-capture the
257
+ // snapshot and re-resolve push state instead of deciding on the stale ones.
258
+ continue;
259
+ } else if (error instanceof LspRequestTimeoutError) {
260
+ pushFallbackOnly = true;
261
+ } else {
262
+ this.diagnosticPullErrors.push(error instanceof Error ? error : new Error(String(error)));
263
+ throw error;
264
+ }
265
+ }
266
+ }
267
+
268
+ if (!pushFallbackOnly) continue;
269
+
270
+ const remainingMs = deadlineAt - this.timerProvider.now();
271
+ if (remainingMs <= 0) {
272
+ // A server that never advertised pull diagnostics (or rejected the pull
273
+ // method) and has never published for this document stays silent for a
274
+ // clean file (e.g. Marksman, #6131). Resolve with the version-current
275
+ // pull cache or explicit empty instead of a freshness timeout; a stale
276
+ // pull cache from an older document version is never returned. Servers
277
+ // that have published before keep timing out via publishGeneration > 0,
278
+ // and a hung advertised pull keeps timing out because pull stays supported.
279
+ if (!this.isDiagnosticPullSupported() && snapshot.publishGeneration === 0) {
280
+ const cached = this.documents.getPullCache(snapshot);
281
+ return { items: cached === null ? [] : [...cached.diagnostics] };
282
+ }
283
+ return this.freshnessTimeout(absPath);
284
+ }
285
+ const waitMs = push.status === "wait" ? Math.min(push.waitMs, remainingMs) : remainingMs;
286
+ await waitForDiagnosticsActivity(this.documents.waitForDiagnosticsActivity(snapshot, waitMs), signal);
287
+ }
288
+ }
289
+
290
+ async prepareRename(
291
+ filePath: string,
292
+ line: number,
293
+ character: number,
294
+ signal?: AbortSignal,
295
+ ): Promise<PrepareRenameResult | PrepareRenameDefaultBehavior | Range | null> {
296
+ const absPath = this.resolveWorkspacePath(filePath);
297
+ await this.openFile(absPath);
298
+ const options = signal === undefined ? {} : { signal };
299
+ return this.sendRequest<PrepareRenameResult | PrepareRenameDefaultBehavior | Range | null>(
300
+ "textDocument/prepareRename",
301
+ {
302
+ textDocument: { uri: pathToFileURL(absPath).href },
303
+ position: { line: line - 1, character },
304
+ },
305
+ options,
306
+ );
307
+ }
308
+
309
+ async rename(
310
+ filePath: string,
311
+ line: number,
312
+ character: number,
313
+ newName: string,
314
+ signal?: AbortSignal,
315
+ ): Promise<LspRenameResult> {
316
+ const absPath = this.resolveWorkspacePath(filePath);
317
+ await this.openFile(absPath);
318
+ const acquired = this.workspaceMutations.acquire(signal);
319
+ if (!acquired.success) return { edit: null, apply: acquired.result };
320
+ const preCommitSignal = createPreCommitAbortSignal(signal, () =>
321
+ this.workspaceMutations.isBeforeCommit(acquired.lease),
322
+ );
323
+ try {
324
+ const renameParams = {
325
+ textDocument: { uri: pathToFileURL(absPath).href },
326
+ position: { line: line - 1, character },
327
+ newName,
328
+ };
329
+ const edit =
330
+ preCommitSignal === undefined
331
+ ? await this.sendRequest<WorkspaceEdit | null>("textDocument/rename", renameParams)
332
+ : await this.sendRequest<WorkspaceEdit | null>("textDocument/rename", renameParams, {
333
+ signal: preCommitSignal.signal,
334
+ });
335
+ return await this.workspaceMutations.reconcileRename(acquired.lease, edit);
336
+ } finally {
337
+ preCommitSignal?.dispose();
338
+ this.workspaceMutations.release(acquired.lease);
339
+ }
340
+ }
341
+
342
+ private resolveWorkspacePath(filePath: string): string {
343
+ return resolve(this.root, filePath);
344
+ }
345
+ }
346
+
347
+ function waitForDiagnosticsActivity(wait: Promise<void>, signal: AbortSignal | undefined): Promise<void> {
348
+ if (!signal) return wait;
349
+ if (signal.aborted) return Promise.reject(abortError(signal));
350
+ return new Promise((resolve, reject) => {
351
+ const onAbort = (): void => {
352
+ signal.removeEventListener("abort", onAbort);
353
+ reject(abortError(signal));
354
+ };
355
+ signal.addEventListener("abort", onAbort, { once: true });
356
+ wait.then(
357
+ () => {
358
+ signal.removeEventListener("abort", onAbort);
359
+ resolve();
360
+ },
361
+ (error) => {
362
+ signal.removeEventListener("abort", onAbort);
363
+ reject(error);
364
+ },
365
+ );
366
+ });
367
+ }
368
+
369
+ function createPreCommitAbortSignal(
370
+ source: AbortSignal | undefined,
371
+ isBeforeCommit: () => boolean,
372
+ ): { readonly signal: AbortSignal; readonly dispose: () => void } | undefined {
373
+ if (!source) return undefined;
374
+ const controller = new AbortController();
375
+ const onAbort = (): void => {
376
+ if (isBeforeCommit() && !controller.signal.aborted) controller.abort(preCommitAbortReason(source));
377
+ };
378
+ if (source.aborted) onAbort();
379
+ else source.addEventListener("abort", onAbort, { once: true });
380
+ return {
381
+ signal: controller.signal,
382
+ dispose: () => source.removeEventListener("abort", onAbort),
383
+ };
384
+ }
385
+
386
+ function preCommitAbortReason(source: AbortSignal): Error {
387
+ const reason = source.reason;
388
+ if (reason instanceof Error && reason.name !== "AbortError") return reason;
389
+ return new Error("LSP request cancelled before workspace edit commit");
390
+ }
391
+
392
+ function abortError(signal: AbortSignal): Error {
393
+ const reason = signal.reason;
394
+ if (reason instanceof Error) return reason;
395
+ const error = new Error(typeof reason === "string" ? reason : "operation cancelled");
396
+ error.name = "AbortError";
397
+ return error;
398
+ }
@@ -0,0 +1,254 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+
3
+ import { lspRequestContext } from "../request-context.js";
4
+ import { BUILTIN_SERVERS } from "./server-definitions.js";
5
+ import type { ResolvedServer } from "./types.js";
6
+
7
+ interface LspEntry {
8
+ disabled?: boolean;
9
+ command?: string[];
10
+ extensions?: string[];
11
+ priority?: number;
12
+ env?: Record<string, string>;
13
+ initialization?: Record<string, unknown>;
14
+ }
15
+
16
+ interface ConfigJson {
17
+ lsp?: Record<string, unknown>;
18
+ }
19
+
20
+ type ConfigSource = "project" | "user";
21
+
22
+ export interface ServerWithSource extends ResolvedServer {
23
+ source: "project" | "user" | "builtin";
24
+ }
25
+
26
+ export function getConfigPaths(): { project: string; user: string } {
27
+ return {
28
+ project: getProjectConfigPaths()[0] ?? lspRequestContext().projectConfigPaths[0] ?? "",
29
+ user: getUserConfigPath(),
30
+ };
31
+ }
32
+
33
+ function getProjectConfigPaths(): readonly string[] {
34
+ return lspRequestContext().projectConfigPaths;
35
+ }
36
+
37
+ function getUserConfigPath(): string {
38
+ return lspRequestContext().userConfigPath;
39
+ }
40
+
41
+ function loadJsonFile(path: string): ConfigJson | null {
42
+ if (!existsSync(path)) return null;
43
+ try {
44
+ const parsed: unknown = JSON.parse(readFileSync(path, "utf-8"));
45
+ return isConfigJson(parsed) ? parsed : null;
46
+ } catch {
47
+ return null;
48
+ }
49
+ }
50
+
51
+ export function loadAllConfigs(): Map<ConfigSource, ConfigJson> {
52
+ const configs = new Map<ConfigSource, ConfigJson>();
53
+
54
+ const project = loadFirstJsonFile(getProjectConfigPaths());
55
+ if (project) configs.set("project", project);
56
+
57
+ const user = loadJsonFile(getUserConfigPath());
58
+ if (user) configs.set("user", user);
59
+
60
+ return configs;
61
+ }
62
+
63
+ function loadFirstJsonFile(paths: readonly string[]): ConfigJson | null {
64
+ for (const path of paths) {
65
+ const config = loadJsonFile(path);
66
+ if (config) return config;
67
+ }
68
+ return null;
69
+ }
70
+
71
+ export function getMergedServers(): ServerWithSource[] {
72
+ const configs = loadAllConfigs();
73
+ const servers: ServerWithSource[] = [];
74
+ const disabled = new Set<string>();
75
+ const seen = new Set<string>();
76
+
77
+ const sources: ConfigSource[] = ["project", "user"];
78
+
79
+ for (const source of sources) {
80
+ const config = configs.get(source);
81
+ if (!config?.lsp) continue;
82
+
83
+ for (const [id, rawEntry] of Object.entries(config.lsp)) {
84
+ const entry = parseLspEntry(rawEntry);
85
+ if (!entry) continue;
86
+ if (entry.disabled) {
87
+ disabled.add(id);
88
+ continue;
89
+ }
90
+
91
+ if (seen.has(id)) continue;
92
+ const server = createServerFromEntry(id, entry, source);
93
+ if (!server) continue;
94
+
95
+ servers.push(server);
96
+ seen.add(id);
97
+ }
98
+ }
99
+
100
+ for (const [id, config] of Object.entries(BUILTIN_SERVERS)) {
101
+ if (disabled.has(id) || seen.has(id)) continue;
102
+
103
+ servers.push({
104
+ id,
105
+ command: config.command,
106
+ extensions: config.extensions,
107
+ priority: -100,
108
+ source: "builtin",
109
+ });
110
+ }
111
+
112
+ return servers.sort((a, b) => {
113
+ if (a.source !== b.source) {
114
+ const order: Record<"project" | "user" | "builtin", number> = {
115
+ project: 0,
116
+ user: 1,
117
+ builtin: 2,
118
+ };
119
+ return order[a.source] - order[b.source];
120
+ }
121
+ return b.priority - a.priority;
122
+ });
123
+ }
124
+
125
+ function createServerFromEntry(id: string, entry: LspEntry, source: ConfigSource): ServerWithSource | null {
126
+ const builtin = BUILTIN_SERVERS[id];
127
+ if (source === "project") {
128
+ if (!builtin) return null;
129
+ const server = createServer({
130
+ id,
131
+ command: builtin.command,
132
+ extensions: entry.extensions ?? builtin.extensions,
133
+ priority: entry.priority ?? 0,
134
+ source,
135
+ });
136
+ if (entry.initialization !== undefined) {
137
+ server.initialization = entry.initialization;
138
+ }
139
+ return server;
140
+ }
141
+
142
+ if (entry.command && entry.extensions) {
143
+ const server = createServer({
144
+ id,
145
+ command: entry.command,
146
+ extensions: entry.extensions,
147
+ priority: entry.priority ?? 0,
148
+ source,
149
+ });
150
+ applyOptionalServerFields(server, entry);
151
+ return server;
152
+ }
153
+
154
+ if (!builtin) return null;
155
+ const server = createServer({
156
+ id,
157
+ command: entry.command ?? builtin.command,
158
+ extensions: entry.extensions ?? builtin.extensions,
159
+ priority: entry.priority ?? 0,
160
+ source,
161
+ });
162
+ applyOptionalServerFields(server, entry);
163
+ return server;
164
+ }
165
+
166
+ function createServer(input: {
167
+ readonly id: string;
168
+ readonly command: string[];
169
+ readonly extensions: string[];
170
+ readonly priority: number;
171
+ readonly source: ConfigSource;
172
+ readonly env?: Record<string, string>;
173
+ readonly initialization?: Record<string, unknown>;
174
+ }): ServerWithSource {
175
+ const server: ServerWithSource = {
176
+ id: input.id,
177
+ command: input.command,
178
+ extensions: input.extensions,
179
+ priority: input.priority,
180
+ source: input.source,
181
+ };
182
+ if (input.env !== undefined) {
183
+ server.env = input.env;
184
+ }
185
+ if (input.initialization !== undefined) {
186
+ server.initialization = input.initialization;
187
+ }
188
+ return server;
189
+ }
190
+
191
+ function applyOptionalServerFields(server: ServerWithSource, entry: LspEntry): void {
192
+ if (entry.env !== undefined) {
193
+ server.env = entry.env;
194
+ }
195
+ if (entry.initialization !== undefined) {
196
+ server.initialization = entry.initialization;
197
+ }
198
+ }
199
+
200
+ function isConfigJson(value: unknown): value is ConfigJson {
201
+ if (!isRecord(value)) return false;
202
+ const lsp = value["lsp"];
203
+ return lsp === undefined || isRecord(lsp);
204
+ }
205
+
206
+ function parseLspEntry(value: unknown): LspEntry | null {
207
+ return isLspEntry(value) ? value : null;
208
+ }
209
+
210
+ function isLspEntry(value: unknown): value is LspEntry {
211
+ if (!isRecord(value)) return false;
212
+ const disabled = value["disabled"];
213
+ const command = value["command"];
214
+ const extensions = value["extensions"];
215
+ const priority = value["priority"];
216
+ const env = value["env"];
217
+ const initialization = value["initialization"];
218
+ return (
219
+ (disabled === undefined || typeof disabled === "boolean") &&
220
+ (command === undefined || isStringArray(command)) &&
221
+ (extensions === undefined || isStringArray(extensions)) &&
222
+ (priority === undefined || typeof priority === "number") &&
223
+ (env === undefined || isStringRecord(env)) &&
224
+ (initialization === undefined || isRecord(initialization))
225
+ );
226
+ }
227
+
228
+ function isStringArray(value: unknown): value is string[] {
229
+ return Array.isArray(value) && value.every((item) => typeof item === "string");
230
+ }
231
+
232
+ function isStringRecord(value: unknown): value is Record<string, string> {
233
+ return isRecord(value) && Object.values(value).every((item) => typeof item === "string");
234
+ }
235
+
236
+ function isRecord(value: unknown): value is Record<string, unknown> {
237
+ return typeof value === "object" && value !== null && !Array.isArray(value);
238
+ }
239
+
240
+ export function getDisabledServerIds(): Set<string> {
241
+ const configs = loadAllConfigs();
242
+ const disabled = new Set<string>();
243
+
244
+ for (const config of configs.values()) {
245
+ if (!config.lsp) continue;
246
+ for (const [id, rawEntry] of Object.entries(config.lsp)) {
247
+ const entry = parseLspEntry(rawEntry);
248
+ if (!entry) continue;
249
+ if (entry.disabled) disabled.add(id);
250
+ }
251
+ }
252
+
253
+ return disabled;
254
+ }