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,173 @@
1
+ export const SYMBOL_KIND_MAP: Record<number, string> = {
2
+ 1: "File",
3
+ 2: "Module",
4
+ 3: "Namespace",
5
+ 4: "Package",
6
+ 5: "Class",
7
+ 6: "Method",
8
+ 7: "Property",
9
+ 8: "Field",
10
+ 9: "Constructor",
11
+ 10: "Enum",
12
+ 11: "Interface",
13
+ 12: "Function",
14
+ 13: "Variable",
15
+ 14: "Constant",
16
+ 15: "String",
17
+ 16: "Number",
18
+ 17: "Boolean",
19
+ 18: "Array",
20
+ 19: "Object",
21
+ 20: "Key",
22
+ 21: "Null",
23
+ 22: "EnumMember",
24
+ 23: "Struct",
25
+ 24: "Event",
26
+ 25: "Operator",
27
+ 26: "TypeParameter",
28
+ };
29
+
30
+ export const SEVERITY_MAP: Record<number, string> = {
31
+ 1: "error",
32
+ 2: "warning",
33
+ 3: "information",
34
+ 4: "hint",
35
+ };
36
+
37
+ export const EXT_TO_LANG: Record<string, string> = {
38
+ ".abap": "abap",
39
+ ".bat": "bat",
40
+ ".bib": "bibtex",
41
+ ".bibtex": "bibtex",
42
+ ".clj": "clojure",
43
+ ".cljs": "clojure",
44
+ ".cljc": "clojure",
45
+ ".edn": "clojure",
46
+ ".coffee": "coffeescript",
47
+ ".c": "c",
48
+ ".cpp": "cpp",
49
+ ".cxx": "cpp",
50
+ ".cc": "cpp",
51
+ ".c++": "cpp",
52
+ ".cs": "csharp",
53
+ ".css": "css",
54
+ ".d": "d",
55
+ ".pas": "pascal",
56
+ ".pascal": "pascal",
57
+ ".diff": "diff",
58
+ ".patch": "diff",
59
+ ".dart": "dart",
60
+ ".dockerfile": "dockerfile",
61
+ ".ex": "elixir",
62
+ ".exs": "elixir",
63
+ ".erl": "erlang",
64
+ ".hrl": "erlang",
65
+ ".fs": "fsharp",
66
+ ".fsi": "fsharp",
67
+ ".fsx": "fsharp",
68
+ ".fsscript": "fsharp",
69
+ ".gitcommit": "git-commit",
70
+ ".gitrebase": "git-rebase",
71
+ ".go": "go",
72
+ ".groovy": "groovy",
73
+ ".gleam": "gleam",
74
+ ".hbs": "handlebars",
75
+ ".handlebars": "handlebars",
76
+ ".hs": "haskell",
77
+ ".html": "html",
78
+ ".htm": "html",
79
+ ".ini": "ini",
80
+ ".java": "java",
81
+ ".jl": "julia",
82
+ ".js": "javascript",
83
+ ".jsx": "javascriptreact",
84
+ ".json": "json",
85
+ ".jsonc": "jsonc",
86
+ ".tex": "latex",
87
+ ".latex": "latex",
88
+ ".less": "less",
89
+ ".lua": "lua",
90
+ ".makefile": "makefile",
91
+ makefile: "makefile",
92
+ ".md": "markdown",
93
+ ".markdown": "markdown",
94
+ ".m": "objective-c",
95
+ ".mm": "objective-cpp",
96
+ ".pl": "perl",
97
+ ".pm": "perl",
98
+ ".pm6": "perl6",
99
+ ".php": "php",
100
+ ".ps1": "powershell",
101
+ ".psm1": "powershell",
102
+ ".pug": "jade",
103
+ ".jade": "jade",
104
+ ".py": "python",
105
+ ".pyi": "python",
106
+ ".r": "r",
107
+ ".cshtml": "razor",
108
+ ".razor": "razor",
109
+ ".rb": "ruby",
110
+ ".rake": "ruby",
111
+ ".gemspec": "ruby",
112
+ ".ru": "ruby",
113
+ ".erb": "erb",
114
+ ".html.erb": "erb",
115
+ ".js.erb": "erb",
116
+ ".css.erb": "erb",
117
+ ".json.erb": "erb",
118
+ ".rs": "rust",
119
+ ".scss": "scss",
120
+ ".sass": "sass",
121
+ ".scala": "scala",
122
+ ".shader": "shaderlab",
123
+ ".sh": "shellscript",
124
+ ".bash": "shellscript",
125
+ ".zsh": "shellscript",
126
+ ".ksh": "shellscript",
127
+ ".sql": "sql",
128
+ ".svelte": "svelte",
129
+ ".swift": "swift",
130
+ ".ts": "typescript",
131
+ ".tsx": "typescriptreact",
132
+ ".mts": "typescript",
133
+ ".cts": "typescript",
134
+ ".mtsx": "typescriptreact",
135
+ ".ctsx": "typescriptreact",
136
+ ".xml": "xml",
137
+ ".xsl": "xsl",
138
+ ".yaml": "yaml",
139
+ ".yml": "yaml",
140
+ ".mjs": "javascript",
141
+ ".cjs": "javascript",
142
+ ".vue": "vue",
143
+ ".zig": "zig",
144
+ ".zon": "zig",
145
+ ".astro": "astro",
146
+ ".ml": "ocaml",
147
+ ".mli": "ocaml",
148
+ ".tf": "terraform",
149
+ ".tfvars": "terraform-vars",
150
+ ".hcl": "hcl",
151
+ ".nix": "nix",
152
+ ".typ": "typst",
153
+ ".typc": "typst",
154
+ ".ets": "typescript",
155
+ ".lhs": "haskell",
156
+ ".kt": "kotlin",
157
+ ".kts": "kotlin",
158
+ ".prisma": "prisma",
159
+ ".h": "c",
160
+ ".hpp": "cpp",
161
+ ".hh": "cpp",
162
+ ".hxx": "cpp",
163
+ ".h++": "cpp",
164
+ ".objc": "objective-c",
165
+ ".objcpp": "objective-cpp",
166
+ ".fish": "fish",
167
+ ".graphql": "graphql",
168
+ ".gql": "graphql",
169
+ };
170
+
171
+ export function getLanguageId(ext: string): string {
172
+ return EXT_TO_LANG[ext] ?? "plaintext";
173
+ }
@@ -0,0 +1,262 @@
1
+ import { describe, expect, it } from "bun:test";
2
+
3
+ import type { LspClient } from "./client.js";
4
+ import { LspManager } from "./manager.js";
5
+ import type { ResolvedServer } from "./types.js";
6
+
7
+ const SERVER: ResolvedServer = {
8
+ id: "typescript",
9
+ command: ["typescript-language-server", "--stdio"],
10
+ extensions: [".ts"],
11
+ priority: 1,
12
+ };
13
+
14
+ /** Simulates a stop that lingers (production stops reach ~21s), which is the behavior under test. */
15
+ const SLOW_STOP_MS = 50;
16
+
17
+ interface RecordingClientOptions {
18
+ readonly stopDelayMs: number;
19
+ readonly initializeError?: Error;
20
+ readonly alive: boolean;
21
+ }
22
+
23
+ class RecordingFakeClient {
24
+ alive: boolean;
25
+ stopCallCount = 0;
26
+
27
+ constructor(
28
+ readonly root: string,
29
+ private readonly log: EventLog,
30
+ private readonly options: RecordingClientOptions,
31
+ ) {
32
+ this.alive = options.alive;
33
+ }
34
+
35
+ async start(): Promise<void> {
36
+ this.log.push(`spawn:${this.root}`);
37
+ }
38
+
39
+ async initialize(): Promise<void> {
40
+ if (this.options.initializeError !== undefined) {
41
+ throw this.options.initializeError;
42
+ }
43
+ }
44
+
45
+ isAlive(): boolean {
46
+ return this.alive;
47
+ }
48
+
49
+ command(): string[] {
50
+ return [...SERVER.command];
51
+ }
52
+
53
+ async stop(): Promise<void> {
54
+ this.stopCallCount += 1;
55
+ this.log.push(`stop-start:${this.root}`);
56
+ await delay(this.options.stopDelayMs);
57
+ this.alive = false;
58
+ this.log.push(`stop-end:${this.root}`);
59
+ }
60
+ }
61
+
62
+ class EventLog {
63
+ readonly entries: string[] = [];
64
+ private waiters: Array<{ readonly event: string; readonly resolve: () => void }> = [];
65
+
66
+ push(event: string): void {
67
+ this.entries.push(event);
68
+ const due = this.waiters.filter((waiter) => waiter.event === event);
69
+ if (due.length === 0) return;
70
+ this.waiters = this.waiters.filter((waiter) => waiter.event !== event);
71
+ for (const waiter of due) waiter.resolve();
72
+ }
73
+
74
+ waitFor(event: string): Promise<void> {
75
+ if (this.entries.includes(event)) return Promise.resolve();
76
+ return new Promise<void>((resolve) => {
77
+ this.waiters.push({ event, resolve });
78
+ });
79
+ }
80
+ }
81
+
82
+ function delay(ms: number): Promise<void> {
83
+ return new Promise((resolve) => setTimeout(resolve, ms));
84
+ }
85
+
86
+ interface HarnessOptions {
87
+ readonly maxResidentClients?: number;
88
+ readonly stopDelayMs?: number;
89
+ /** Leading generations whose initialize() rejects; later generations start cleanly. */
90
+ readonly initializeFailures?: number;
91
+ /** Generations at or above this index report alive; earlier ones emulate a crash-looping server. */
92
+ readonly aliveFromGeneration?: number;
93
+ }
94
+
95
+ function managerHarness(options: HarnessOptions = {}): {
96
+ readonly manager: LspManager;
97
+ readonly clients: RecordingFakeClient[];
98
+ readonly log: EventLog;
99
+ readonly clock: { value: number };
100
+ } {
101
+ const clients: RecordingFakeClient[] = [];
102
+ const log = new EventLog();
103
+ const clock = { value: 1_000 };
104
+ const generations = new Map<string, number>();
105
+ const aliveFrom = options.aliveFromGeneration ?? 1;
106
+ const stopDelayMs = options.stopDelayMs ?? 0;
107
+ const initializeFailures = options.initializeFailures ?? 0;
108
+ const manager = new LspManager({
109
+ maxResidentClients: options.maxResidentClients ?? 6,
110
+ reaperIntervalMs: 60_000,
111
+ idleTimeoutMs: 60_000_000,
112
+ now: () => clock.value,
113
+ clientFactory: (root) => {
114
+ const generation = (generations.get(root) ?? 0) + 1;
115
+ generations.set(root, generation);
116
+ const client = new RecordingFakeClient(root, log, {
117
+ stopDelayMs,
118
+ alive: generation >= aliveFrom,
119
+ ...(generation <= initializeFailures ? { initializeError: new Error("initialize boom") } : {}),
120
+ });
121
+ clients.push(client);
122
+ return client as unknown as LspClient;
123
+ },
124
+ });
125
+ return { manager, clients, log, clock };
126
+ }
127
+
128
+ describe("LspManager pending-stop tombstones", () => {
129
+ it("#given a slow-stopping client evicted at the resident cap #when the evicted root is re-acquired while the stop is pending #then the replacement spawns only after the old client stopped", async () => {
130
+ // given
131
+ const { manager, log } = managerHarness({ maxResidentClients: 1, stopDelayMs: SLOW_STOP_MS });
132
+ try {
133
+ await manager.getClient("/root-a", SERVER);
134
+ manager.releaseClient("/root-a", SERVER.id);
135
+
136
+ // when: admitting root-b synchronously evicts idle root-a (void stop), and root-a is
137
+ // re-acquired in the same window while the evicted client's stop is still pending.
138
+ const rootBPromise = manager.getClient("/root-b", SERVER);
139
+ const rootAPromise = manager.getClient("/root-a", SERVER);
140
+ await Promise.all([rootBPromise, rootAPromise]);
141
+ manager.releaseClient("/root-b", SERVER.id);
142
+ manager.releaseClient("/root-a", SERVER.id);
143
+
144
+ // then
145
+ expect(log.entries.filter((event) => event.endsWith("/root-a"))).toEqual([
146
+ "spawn:/root-a",
147
+ "stop-start:/root-a",
148
+ "stop-end:/root-a",
149
+ "spawn:/root-a",
150
+ ]);
151
+ } finally {
152
+ await manager.stopAll();
153
+ }
154
+ });
155
+
156
+ it("#given an invalidated client whose stop is still pending #when the same root is re-acquired #then the replacement spawns only after the invalidated client stopped", async () => {
157
+ // given
158
+ const { manager, log } = managerHarness({ stopDelayMs: SLOW_STOP_MS });
159
+ try {
160
+ await manager.getClient("/root-a", SERVER);
161
+ manager.releaseClient("/root-a", SERVER.id);
162
+
163
+ // when
164
+ manager.invalidateClient("/root-a", SERVER.id);
165
+ await manager.getClient("/root-a", SERVER);
166
+
167
+ // then
168
+ expect(log.entries).toEqual([
169
+ "spawn:/root-a",
170
+ "stop-start:/root-a",
171
+ "stop-end:/root-a",
172
+ "spawn:/root-a",
173
+ ]);
174
+ } finally {
175
+ await manager.stopAll();
176
+ }
177
+ });
178
+
179
+ it("#given a client whose initialization failed while its stop is pending #when another getClient races the stop #then the replacement spawns only after the failed client stopped", async () => {
180
+ // given
181
+ const { manager, log } = managerHarness({
182
+ stopDelayMs: SLOW_STOP_MS,
183
+ initializeFailures: 1,
184
+ });
185
+ try {
186
+ const failing = manager.getClient("/root-fail", SERVER);
187
+
188
+ // when: the second acquisition starts once the first one's stop is provably in flight.
189
+ await log.waitFor("stop-start:/root-fail");
190
+ const racing = manager.getClient("/root-fail", SERVER);
191
+ await expect(failing).rejects.toThrow("initialize boom");
192
+ await racing;
193
+ manager.releaseClient("/root-fail", SERVER.id);
194
+
195
+ // then
196
+ expect(log.entries).toEqual([
197
+ "spawn:/root-fail",
198
+ "stop-start:/root-fail",
199
+ "stop-end:/root-fail",
200
+ "spawn:/root-fail",
201
+ ]);
202
+ } finally {
203
+ await manager.stopAll();
204
+ }
205
+ });
206
+ });
207
+
208
+ describe("LspManager dead-client respawn budget", () => {
209
+ it("#given a crash-looping client that is dead on every acquisition #when getClient is called repeatedly #then respawn attempts stay within the retry budget", async () => {
210
+ // given
211
+ const { manager, clients } = managerHarness({ aliveFromGeneration: Number.POSITIVE_INFINITY });
212
+ try {
213
+ // when
214
+ for (let attempt = 0; attempt < 8; attempt += 1) {
215
+ await manager
216
+ .getClient("/root-crash", SERVER)
217
+ .then(
218
+ () => manager.releaseClient("/root-crash", SERVER.id),
219
+ () => undefined,
220
+ );
221
+ }
222
+
223
+ // then: one initial generation plus at most two budgeted respawns.
224
+ expect(clients.length).toBeLessThanOrEqual(3);
225
+ } finally {
226
+ await manager.stopAll();
227
+ }
228
+ });
229
+
230
+ it("#given the respawn budget is exhausted #when getClient is called again #then it rejects with a budget error instead of respawning", async () => {
231
+ // given
232
+ const { manager } = managerHarness({ aliveFromGeneration: Number.POSITIVE_INFINITY });
233
+ try {
234
+ await expect(manager.getClient("/root-crash", SERVER)).rejects.toThrow(/respawn budget/);
235
+
236
+ // when / then
237
+ await expect(manager.getClient("/root-crash", SERVER)).rejects.toThrow(/respawn budget/);
238
+ } finally {
239
+ await manager.stopAll();
240
+ }
241
+ });
242
+
243
+ it("#given the budget was exhausted but the cooldown elapsed and the server recovered #when getClient is called #then it spawns again and resets the budget on a healthy generation", async () => {
244
+ // given: generations one and two crash, the third is healthy.
245
+ const { manager, clients, clock } = managerHarness({ aliveFromGeneration: 3 });
246
+ try {
247
+ await expect(manager.getClient("/root-crash", SERVER)).rejects.toThrow(/respawn budget/);
248
+
249
+ // when: cooldown elapses (60s default) and the server stays alive again.
250
+ clock.value += 60_001;
251
+ const recovered = await manager.getClient("/root-crash", SERVER);
252
+ manager.releaseClient("/root-crash", SERVER.id);
253
+
254
+ // then
255
+ expect(clients.length).toBe(3);
256
+ await expect(manager.getClient("/root-crash", SERVER)).resolves.toBe(recovered);
257
+ manager.releaseClient("/root-crash", SERVER.id);
258
+ } finally {
259
+ await manager.stopAll();
260
+ }
261
+ });
262
+ });
@@ -0,0 +1,151 @@
1
+ import { describe, expect, it } from "bun:test";
2
+
3
+ import type { LspClient } from "./client.js";
4
+ import { LspManager } from "./manager.js";
5
+ import type { ResolvedServer } from "./types.js";
6
+
7
+ const SERVER: ResolvedServer = {
8
+ id: "typescript",
9
+ command: ["typescript-language-server", "--stdio"],
10
+ extensions: [".ts"],
11
+ priority: 1,
12
+ };
13
+
14
+ class FakeLspClient {
15
+ alive = true;
16
+ stopCallCount = 0;
17
+
18
+ constructor(readonly root: string) {}
19
+
20
+ async start(): Promise<void> {}
21
+
22
+ async initialize(): Promise<void> {}
23
+
24
+ isAlive(): boolean {
25
+ return this.alive;
26
+ }
27
+
28
+ command(): string[] {
29
+ return [...SERVER.command];
30
+ }
31
+
32
+ async stop(): Promise<void> {
33
+ this.stopCallCount += 1;
34
+ this.alive = false;
35
+ }
36
+ }
37
+
38
+ function managerWithFakes(maxResidentClients: number): {
39
+ readonly manager: LspManager;
40
+ readonly clients: Map<string, FakeLspClient>;
41
+ readonly clock: { value: number };
42
+ } {
43
+ const clients = new Map<string, FakeLspClient>();
44
+ const clock = { value: 1_000 };
45
+ const manager = new LspManager({
46
+ maxResidentClients,
47
+ reaperIntervalMs: 60_000,
48
+ idleTimeoutMs: 60_000_000,
49
+ now: () => clock.value,
50
+ clientFactory: (root) => {
51
+ const client = new FakeLspClient(root);
52
+ clients.set(root, client);
53
+ return client as unknown as LspClient;
54
+ },
55
+ });
56
+ return { manager, clients, clock };
57
+ }
58
+
59
+ describe("LspManager resident client cap", () => {
60
+ it("#given a cap of two idle clients #when a third client is admitted #then the least recently used one is stopped and evicted", async () => {
61
+ // given
62
+ const { manager, clients, clock } = managerWithFakes(2);
63
+ try {
64
+ await manager.getClient("/root-a", SERVER);
65
+ manager.releaseClient("/root-a", SERVER.id);
66
+ clock.value += 10;
67
+ await manager.getClient("/root-b", SERVER);
68
+ manager.releaseClient("/root-b", SERVER.id);
69
+ clock.value += 10;
70
+
71
+ // when
72
+ await manager.getClient("/root-c", SERVER);
73
+ manager.releaseClient("/root-c", SERVER.id);
74
+
75
+ // then
76
+ expect(manager.clientCount()).toBe(2);
77
+ expect(manager.hasClient("/root-a", SERVER.id)).toBe(false);
78
+ expect(manager.hasClient("/root-b", SERVER.id)).toBe(true);
79
+ expect(manager.hasClient("/root-c", SERVER.id)).toBe(true);
80
+ expect(clients.get("/root-a")?.stopCallCount).toBe(1);
81
+ } finally {
82
+ await manager.stopAll();
83
+ }
84
+ });
85
+
86
+ it("#given the least recently used client is mid-request #when a new client is admitted #then the busy client survives and an idle one is evicted", async () => {
87
+ // given
88
+ const { manager, clients, clock } = managerWithFakes(2);
89
+ try {
90
+ await manager.getClient("/root-busy", SERVER);
91
+ clock.value += 10;
92
+ await manager.getClient("/root-idle", SERVER);
93
+ manager.releaseClient("/root-idle", SERVER.id);
94
+ clock.value += 10;
95
+
96
+ // when
97
+ await manager.getClient("/root-new", SERVER);
98
+ manager.releaseClient("/root-new", SERVER.id);
99
+
100
+ // then
101
+ expect(manager.hasClient("/root-busy", SERVER.id)).toBe(true);
102
+ expect(manager.hasClient("/root-idle", SERVER.id)).toBe(false);
103
+ expect(clients.get("/root-busy")?.stopCallCount).toBe(0);
104
+ expect(clients.get("/root-idle")?.stopCallCount).toBe(1);
105
+ } finally {
106
+ manager.releaseClient("/root-busy", SERVER.id);
107
+ await manager.stopAll();
108
+ }
109
+ });
110
+
111
+ it("#given every resident client is busy #when a new client is admitted #then nothing is evicted and the cap is exceeded rather than breaking a live request", async () => {
112
+ // given
113
+ const { manager, clients } = managerWithFakes(1);
114
+ try {
115
+ await manager.getClient("/root-busy", SERVER);
116
+
117
+ // when
118
+ await manager.getClient("/root-second", SERVER);
119
+
120
+ // then
121
+ expect(manager.clientCount()).toBe(2);
122
+ expect(clients.get("/root-busy")?.stopCallCount).toBe(0);
123
+ } finally {
124
+ manager.releaseClient("/root-busy", SERVER.id);
125
+ manager.releaseClient("/root-second", SERVER.id);
126
+ await manager.stopAll();
127
+ }
128
+ });
129
+
130
+ it("#given warmup requests beyond the cap #when a warm client is admitted #then the idle least recently used client is evicted too", async () => {
131
+ // given
132
+ const { manager, clients, clock } = managerWithFakes(1);
133
+ try {
134
+ await manager.getClient("/root-first", SERVER);
135
+ manager.releaseClient("/root-first", SERVER.id);
136
+ clock.value += 10;
137
+
138
+ // when
139
+ manager.warmupClient("/root-warm", SERVER);
140
+ await Promise.resolve();
141
+ await Promise.resolve();
142
+
143
+ // then
144
+ expect(manager.hasClient("/root-first", SERVER.id)).toBe(false);
145
+ expect(clients.get("/root-first")?.stopCallCount).toBe(1);
146
+ expect(manager.hasClient("/root-warm", SERVER.id)).toBe(true);
147
+ } finally {
148
+ await manager.stopAll();
149
+ }
150
+ });
151
+ });