oh-my-opencode 4.19.4 → 5.0.0-beta.2

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 (268) hide show
  1. package/README.ja.md +1 -1
  2. package/README.ko.md +1 -1
  3. package/README.md +6 -5
  4. package/README.ru.md +1 -1
  5. package/README.zh-cn.md +1 -1
  6. package/bin/oh-my-opencode.js +14 -1
  7. package/bin/oh-my-opencode.test.ts +21 -0
  8. package/dist/cli/index.js +1452 -703
  9. package/dist/cli-node/index.js +1452 -703
  10. package/dist/config/schema/agent-overrides.d.ts +528 -0
  11. package/dist/config/schema/oh-my-opencode-config.d.ts +495 -0
  12. package/dist/features/monitor/batcher.d.ts +3 -1
  13. package/dist/features/monitor/manager-internals.d.ts +1 -0
  14. package/dist/features/monitor/output-injector-types.d.ts +2 -0
  15. package/dist/features/monitor/output-injector.d.ts +6 -0
  16. package/dist/hooks/todo-continuation-enforcer/types.d.ts +1 -0
  17. package/dist/hooks/todo-continuation-enforcer/unrecoverable-request-error.d.ts +9 -0
  18. package/dist/hooks/tool-pair-validator/hook.test-support.d.ts +29 -0
  19. package/dist/hooks/tool-pair-validator/tool-part-ids.d.ts +14 -5
  20. package/dist/hooks/tool-pair-validator/tool-result-repair.d.ts +4 -3
  21. package/dist/hooks/tool-pair-validator/types.d.ts +5 -22
  22. package/dist/index.js +2776 -2240
  23. package/dist/mcp/lsp.d.ts +1 -0
  24. package/dist/oh-my-opencode.schema.json +1466 -131
  25. package/dist/shared/tmux/constants.d.ts +1 -1
  26. package/dist/skills/ast-grep/SOURCE +1 -1
  27. package/dist/skills/ast-grep/install.ps1 +2 -2
  28. package/dist/skills/ast-grep/install.sh +1 -1
  29. package/dist/skills/ast-grep/references/install.md +2 -2
  30. package/dist/skills/ast-grep/tests/smoke.sh +1 -1
  31. package/dist/skills/start-work/SKILL.md +54 -9
  32. package/dist/skills/ultimate-browsing/SKILL.md +2 -2
  33. package/dist/skills/ultimate-browsing/engine/__main__.py +8 -1
  34. package/dist/skills/ultimate-browsing/engine/bias_check.py +11 -0
  35. package/dist/skills/ultimate-browsing/engine/fetch_chain.py +90 -52
  36. package/dist/skills/ultimate-browsing/engine/result_schema.py +10 -1
  37. package/dist/skills/ultimate-browsing/engine/surrogate.py +214 -0
  38. package/dist/skills/ultimate-browsing/engine/surrogates.yaml +60 -0
  39. package/dist/skills/ultimate-browsing/engine/tests/fixtures/amp_redirect_stub.html +7 -0
  40. package/dist/skills/ultimate-browsing/engine/tests/fixtures/search_interstitial.html +19 -0
  41. package/dist/skills/ultimate-browsing/engine/tests/fixtures/wayback_available.json +1 -0
  42. package/dist/skills/ultimate-browsing/engine/tests/fixtures/wayback_snapshot.html +1128 -0
  43. package/dist/skills/ultimate-browsing/engine/tests/test_surrogate.py +252 -0
  44. package/dist/skills/ultimate-browsing/engine/tests/test_surrogate_validators.py +78 -0
  45. package/dist/skills/ultimate-browsing/engine/validators.py +46 -0
  46. package/dist/skills/ultimate-browsing/engine/waf_detector.py +1 -1
  47. package/dist/skills/ultimate-browsing/engine/waf_profiles.yaml +10 -5
  48. package/dist/skills/ultimate-browsing/references/agent-reach/social.md +1 -1
  49. package/dist/skills/ultimate-browsing/references/chrome-stealth.md +13 -11
  50. package/dist/skills/ultimate-browsing/references/insane-search/README.md +4 -4
  51. package/dist/skills/ultimate-browsing/references/insane-search/cache-archive.md +51 -50
  52. package/dist/skills/ultimate-browsing/references/insane-search/fallback.md +1 -1
  53. package/dist/skills/ultimate-browsing/references/insane-search/jina.md +8 -2
  54. package/dist/skills/ultimate-browsing/references/insane-search/naver.md +1 -1
  55. package/dist/skills/ultimate-browsing/references/insane-search/twitter.md +3 -3
  56. package/dist/skills/ulw-plan/SKILL.md +1 -1
  57. package/dist/skills/ulw-plan/references/full-workflow.md +3 -3
  58. package/dist/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -1
  59. package/dist/skills/ulw-research/SKILL.md +15 -10
  60. package/dist/tui.js +307 -28
  61. package/docs/reference/web-terminal-visual-qa.md +1 -1
  62. package/package.json +27 -19
  63. package/packages/lsp-core/src/lsp/connection.ts +1 -1
  64. package/packages/lsp-daemon/dist/cli.js +27 -13
  65. package/packages/lsp-daemon/dist/client.js +49 -35
  66. package/packages/lsp-daemon/dist/ensure-daemon.d.ts +1 -0
  67. package/packages/lsp-daemon/dist/ensure-daemon.js +18 -5
  68. package/packages/lsp-daemon/dist/index.js +34 -20
  69. package/packages/lsp-tools-mcp/dist/cli.js +1 -1
  70. package/packages/lsp-tools-mcp/dist/lsp/manager.js +1 -1
  71. package/packages/lsp-tools-mcp/dist/mcp.js +1 -1
  72. package/packages/lsp-tools-mcp/dist/tools.js +1 -1
  73. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  74. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +268 -92
  75. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  76. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  77. package/packages/omo-codex/plugin/components/bootstrap/src/setup.ts +7 -7
  78. package/packages/omo-codex/plugin/components/bootstrap/src/worker.ts +3 -0
  79. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +106 -6
  80. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +106 -6
  81. package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
  82. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  83. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  84. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  85. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  86. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  87. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  88. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
  89. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +56 -42
  90. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  91. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  92. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  93. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  94. package/packages/omo-codex/plugin/components/start-work-continuation/AGENTS.md +1 -0
  95. package/packages/omo-codex/plugin/components/start-work-continuation/README.md +5 -1
  96. package/packages/omo-codex/plugin/components/start-work-continuation/directive.md +2 -1
  97. package/packages/omo-codex/plugin/components/start-work-continuation/dist/cli.js +18 -0
  98. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
  99. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  100. package/packages/omo-codex/plugin/components/start-work-continuation/src/codex-hook.ts +21 -0
  101. package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +105 -0
  102. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  103. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  104. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  105. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  106. package/packages/omo-codex/plugin/components/ultrawork/CHANGELOG.md +2 -0
  107. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-code-reviewer.toml +1 -1
  108. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-gate-reviewer.toml +1 -1
  109. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-qa-executor.toml +1 -1
  110. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-high.toml +1 -1
  111. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-low.toml +1 -1
  112. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-medium.toml +1 -1
  113. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +2 -2
  114. package/packages/omo-codex/plugin/components/ultrawork/directive.md +3 -2
  115. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  116. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  117. package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +3 -2
  118. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +1 -1
  119. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +3 -3
  120. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -1
  121. package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +1 -1
  122. package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +2 -0
  123. package/packages/omo-codex/plugin/components/ulw-loop/README.md +11 -11
  124. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +3 -2
  125. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.js +1 -1
  126. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +1 -1
  127. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +9 -9
  128. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-steering.js +1 -1
  129. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +66 -66
  130. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +4 -4
  131. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-hook.js +1 -1
  132. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.js +1 -1
  133. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +1 -1
  134. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.js +1 -1
  135. package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +2 -2
  136. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
  137. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  138. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +3 -3
  139. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +22 -25
  140. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-reconciliation.ts +1 -1
  141. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts +9 -9
  142. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-steering.ts +1 -1
  143. package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +1 -1
  144. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +4 -4
  145. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +1 -1
  146. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +1 -1
  147. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts +1 -1
  148. package/packages/omo-codex/plugin/components/ulw-loop/src/steering.ts +1 -1
  149. package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +2 -2
  150. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-commands.test.ts +2 -2
  151. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +1 -1
  152. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-helpers.test.ts +2 -2
  153. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering-kind-guidance.test.ts +1 -1
  154. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +2 -2
  155. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/quality-gate-builder.ts +1 -1
  156. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +5 -5
  157. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io.test.ts +1 -1
  158. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-roles.test.ts +1 -1
  159. package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +1 -1
  160. package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +1 -1
  161. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  162. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  163. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  164. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
  165. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  166. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  167. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  168. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  169. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  170. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  171. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  172. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  173. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  174. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
  175. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  176. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  177. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
  178. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  179. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
  180. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  181. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  182. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  183. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  184. package/packages/omo-codex/plugin/package-lock.json +13 -13
  185. package/packages/omo-codex/plugin/package.json +1 -1
  186. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +4 -4
  187. package/packages/omo-codex/plugin/skills/ast-grep/SOURCE +1 -1
  188. package/packages/omo-codex/plugin/skills/ast-grep/install.ps1 +2 -2
  189. package/packages/omo-codex/plugin/skills/ast-grep/install.sh +1 -1
  190. package/packages/omo-codex/plugin/skills/ast-grep/references/install.md +2 -2
  191. package/packages/omo-codex/plugin/skills/ast-grep/tests/smoke.sh +1 -1
  192. package/packages/omo-codex/plugin/skills/start-work/SKILL.md +54 -9
  193. package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +2 -2
  194. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/__main__.py +8 -1
  195. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/bias_check.py +11 -0
  196. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/fetch_chain.py +90 -52
  197. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/result_schema.py +10 -1
  198. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/surrogate.py +214 -0
  199. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/surrogates.yaml +60 -0
  200. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/fixtures/amp_redirect_stub.html +7 -0
  201. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/fixtures/search_interstitial.html +19 -0
  202. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/fixtures/wayback_available.json +1 -0
  203. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/fixtures/wayback_snapshot.html +1128 -0
  204. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_surrogate.py +252 -0
  205. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_surrogate_validators.py +78 -0
  206. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/validators.py +46 -0
  207. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/waf_detector.py +1 -1
  208. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/waf_profiles.yaml +10 -5
  209. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/social.md +1 -1
  210. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +13 -11
  211. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +4 -4
  212. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/cache-archive.md +51 -50
  213. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/fallback.md +1 -1
  214. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/jina.md +8 -2
  215. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/naver.md +1 -1
  216. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/twitter.md +3 -3
  217. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +3 -2
  218. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +3 -3
  219. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +22 -25
  220. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +1 -1
  221. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +3 -3
  222. package/packages/omo-codex/plugin/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -1
  223. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +15 -10
  224. package/packages/omo-codex/plugin/test/bootstrap-binlinks.test.mjs +12 -12
  225. package/packages/omo-codex/plugin/test/bootstrap-orchestration.test.mjs +36 -4
  226. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +1 -1
  227. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +4 -4
  228. package/packages/omo-codex/scripts/install-bin-links.test.mjs +56 -2
  229. package/packages/omo-codex/scripts/install-delegated-command.test.mjs +6 -6
  230. package/packages/omo-codex/scripts/install-dist/install-local.mjs +115 -61
  231. package/packages/omo-codex/scripts/install-local-entrypoint.test.mjs +4 -4
  232. package/packages/omo-codex/scripts/install-local.test.mjs +5 -2
  233. package/packages/shared-skills/index.mjs +19 -1
  234. package/packages/shared-skills/skills/ast-grep/SOURCE +1 -1
  235. package/packages/shared-skills/skills/ast-grep/install.ps1 +2 -2
  236. package/packages/shared-skills/skills/ast-grep/install.sh +1 -1
  237. package/packages/shared-skills/skills/ast-grep/references/install.md +2 -2
  238. package/packages/shared-skills/skills/ast-grep/tests/smoke.sh +1 -1
  239. package/packages/shared-skills/skills/start-work/SKILL.md +54 -9
  240. package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +2 -2
  241. package/packages/shared-skills/skills/ultimate-browsing/engine/__main__.py +8 -1
  242. package/packages/shared-skills/skills/ultimate-browsing/engine/bias_check.py +11 -0
  243. package/packages/shared-skills/skills/ultimate-browsing/engine/fetch_chain.py +90 -52
  244. package/packages/shared-skills/skills/ultimate-browsing/engine/result_schema.py +10 -1
  245. package/packages/shared-skills/skills/ultimate-browsing/engine/surrogate.py +214 -0
  246. package/packages/shared-skills/skills/ultimate-browsing/engine/surrogates.yaml +60 -0
  247. package/packages/shared-skills/skills/ultimate-browsing/engine/tests/fixtures/amp_redirect_stub.html +7 -0
  248. package/packages/shared-skills/skills/ultimate-browsing/engine/tests/fixtures/search_interstitial.html +19 -0
  249. package/packages/shared-skills/skills/ultimate-browsing/engine/tests/fixtures/wayback_available.json +1 -0
  250. package/packages/shared-skills/skills/ultimate-browsing/engine/tests/fixtures/wayback_snapshot.html +1128 -0
  251. package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_surrogate.py +252 -0
  252. package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_surrogate_validators.py +78 -0
  253. package/packages/shared-skills/skills/ultimate-browsing/engine/validators.py +46 -0
  254. package/packages/shared-skills/skills/ultimate-browsing/engine/waf_detector.py +1 -1
  255. package/packages/shared-skills/skills/ultimate-browsing/engine/waf_profiles.yaml +10 -5
  256. package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/social.md +1 -1
  257. package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +13 -11
  258. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +4 -4
  259. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/cache-archive.md +51 -50
  260. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/fallback.md +1 -1
  261. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/jina.md +8 -2
  262. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/naver.md +1 -1
  263. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/twitter.md +3 -3
  264. package/packages/shared-skills/skills/ulw-plan/SKILL.md +1 -1
  265. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +3 -3
  266. package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -1
  267. package/packages/shared-skills/skills/ulw-research/SKILL.md +15 -10
  268. package/postinstall.mjs +6 -0
@@ -439,7 +439,7 @@ async function readOptionalFile(path) {
439
439
 
440
440
  // components/bootstrap/src/worker.ts
441
441
  import { appendFile as appendFile2, mkdir as mkdir8, readFile as readFile14 } from "node:fs/promises";
442
- import { homedir as homedir4 } from "node:os";
442
+ import { homedir as homedir5 } from "node:os";
443
443
  import { dirname as dirname9, join as join22, resolve as resolve7 } from "node:path";
444
444
  import { fileURLToPath as fileURLToPath2 } from "node:url";
445
445
 
@@ -449,6 +449,10 @@ import { rm as rm4 } from "node:fs/promises";
449
449
  import { dirname as dirname4, join as join7 } from "node:path";
450
450
  import { promisify } from "node:util";
451
451
 
452
+ // ../../utils/src/ast-grep/sg-candidates.ts
453
+ import { homedir as homedir3 } from "node:os";
454
+ import { join as join4 } from "node:path";
455
+
452
456
  // ../../utils/src/ast-grep/sg-manifest.ts
453
457
  var SG_PINNED_VERSION = "0.43.0";
454
458
  var SG_RELEASE_ASSETS = {
@@ -494,10 +498,113 @@ function sgBinaryName(platform = process.platform) {
494
498
  return normalizeRuntimePlatform(platform) === "win32" ? "sg.exe" : "sg";
495
499
  }
496
500
 
501
+ // ../../utils/src/ast-grep/install-script.ts
502
+ var AST_GREP_BIN_DIR_ENV_KEY = "OMO_AST_GREP_BIN_DIR";
503
+
504
+ // ../../utils/src/ast-grep/types.ts
505
+ var SG_PATH_ENV_KEY = "OMO_AST_GREP_SG_PATH";
506
+ var SG_BINARY_NOT_FOUND = "BINARY_NOT_FOUND";
507
+
508
+ // ../../utils/src/ast-grep/sg-candidates.ts
509
+ var HOMEBREW_PREFIXES = {
510
+ darwin: ["/opt/homebrew/bin", "/usr/local/bin"],
511
+ linux: ["/home/linuxbrew/.linuxbrew/bin", "/usr/local/bin"],
512
+ win32: []
513
+ };
514
+ function nonEmptyValue(value) {
515
+ const trimmed = value?.trim();
516
+ return trimmed === undefined || trimmed.length === 0 ? null : trimmed;
517
+ }
518
+ function astGrepBinaryName(platform) {
519
+ return platform === "win32" ? "ast-grep.exe" : "ast-grep";
520
+ }
521
+ function candidate(tier, path) {
522
+ return { path, tier };
523
+ }
524
+ function envOverrideCandidates(env) {
525
+ const override = nonEmptyValue(env[SG_PATH_ENV_KEY]);
526
+ return override === null ? [] : [candidate("env-override", override)];
527
+ }
528
+ function omoRuntimeCandidates(options) {
529
+ const binaryName = sgBinaryName(options.platform);
530
+ const slug = runtimeSlug(options.platform, options.arch);
531
+ const paths = [];
532
+ if (options.runtimeDir !== undefined)
533
+ paths.push(join4(options.runtimeDir, binaryName));
534
+ const codexHome = nonEmptyValue(options.env["CODEX_HOME"]);
535
+ if (codexHome !== null)
536
+ paths.push(join4(codexHome, "runtime", "ast-grep", slug, binaryName));
537
+ paths.push(join4(options.homeDir, ".omo", "runtime", "ast-grep", slug, binaryName));
538
+ return paths.map((path) => candidate("omo-runtime", path));
539
+ }
540
+ function skillBinCandidates(options) {
541
+ const names = [astGrepBinaryName(options.platform), sgBinaryName(options.platform)];
542
+ const directories = [];
543
+ const cacheDir = nonEmptyValue(options.env[AST_GREP_BIN_DIR_ENV_KEY]);
544
+ if (cacheDir !== null)
545
+ directories.push(cacheDir);
546
+ if (options.packageDir !== undefined)
547
+ directories.push(join4(options.packageDir, "bin"));
548
+ return directories.flatMap((directory) => names.map((name) => candidate("skill-bin", join4(directory, name))));
549
+ }
550
+ function homebrewCandidates(platform) {
551
+ const prefixes = platform === "darwin" || platform === "linux" || platform === "win32" ? HOMEBREW_PREFIXES[platform] : [];
552
+ const names = [astGrepBinaryName(platform), sgBinaryName(platform)];
553
+ return prefixes.flatMap((prefix) => names.map((name) => candidate("homebrew", join4(prefix, name))));
554
+ }
555
+ function planSgCandidates(options) {
556
+ const env = options.env ?? process.env;
557
+ const platform = options.platform ?? process.platform;
558
+ const arch = options.arch ?? process.arch;
559
+ const homeDir = options.homeDir ?? homedir3();
560
+ return {
561
+ afterPath: homebrewCandidates(platform),
562
+ beforePath: [
563
+ ...envOverrideCandidates(env),
564
+ ...omoRuntimeCandidates({ arch, env, homeDir, platform, runtimeDir: options.runtimeDir }),
565
+ ...skillBinCandidates({ env, packageDir: options.packageDir, platform })
566
+ ],
567
+ pathCommands: ["ast-grep", "sg"]
568
+ };
569
+ }
570
+
571
+ // ../../utils/src/ast-grep/sg-install-hints.ts
572
+ var OMO_PROVISION_HINT = "Start an OMO session so the bundled ast-grep skill provisions the pinned runtime automatically";
573
+ var ENV_OVERRIDE_HINT = `Or point ${SG_PATH_ENV_KEY} at an existing ast-grep binary`;
574
+ var DARWIN_HINTS = [
575
+ "brew install ast-grep",
576
+ "npm install -g @ast-grep/cli",
577
+ "cargo install ast-grep --locked"
578
+ ];
579
+ var LINUX_HINTS = [
580
+ "npm install -g @ast-grep/cli",
581
+ "cargo install ast-grep --locked",
582
+ "brew install ast-grep # linuxbrew"
583
+ ];
584
+ var WIN32_HINTS = [
585
+ "scoop install main/ast-grep",
586
+ "winget install ast-grep",
587
+ "choco install ast-grep",
588
+ "npm install -g @ast-grep/cli"
589
+ ];
590
+ function platformHints(platform) {
591
+ if (platform === "darwin")
592
+ return DARWIN_HINTS;
593
+ if (platform === "win32")
594
+ return WIN32_HINTS;
595
+ return LINUX_HINTS;
596
+ }
597
+ function sgInstallHints(platform = process.platform) {
598
+ return [...platformHints(platform), OMO_PROVISION_HINT, ENV_OVERRIDE_HINT];
599
+ }
600
+ function sgBinaryNotFoundMessage(platform = process.platform) {
601
+ return `ast-grep binary not found for ${platform}: no candidate passed the --version probe across the env override, OMO runtime, skill bin cache, PATH, or Homebrew prefixes.`;
602
+ }
603
+
497
604
  // ../../utils/src/ast-grep/sg-provisioner.ts
498
605
  import { createHash as createHash2, randomUUID as randomUUID2 } from "node:crypto";
499
606
  import { chmod, mkdir as mkdir3, rename as rename2, rm as rm3, writeFile as writeFile2 } from "node:fs/promises";
500
- import { basename as basename2, isAbsolute, join as join4, relative, resolve as resolve2 } from "node:path";
607
+ import { basename as basename2, isAbsolute, join as join5, relative, resolve as resolve2 } from "node:path";
501
608
  import { inflateRawSync } from "node:zlib";
502
609
  var DEFAULT_DOWNLOAD_TIMEOUT_MS = 60000;
503
610
  var EOCD_SIGNATURE = 101010256;
@@ -603,7 +710,7 @@ function extractStandaloneSgBinary(zip, platform) {
603
710
  const entries = listZipEntries(zip);
604
711
  const preferredNames = [`ast-grep${suffix}`, `sg${suffix}`];
605
712
  for (const preferred of preferredNames) {
606
- const entry = entries.find((candidate) => zipEntryBaseName(candidate.name) === preferred);
713
+ const entry = entries.find((candidate2) => zipEntryBaseName(candidate2.name) === preferred);
607
714
  if (entry !== undefined)
608
715
  return readZipEntryBytes(zip, entry);
609
716
  }
@@ -623,8 +730,8 @@ async function provisionSgBinary(options) {
623
730
  throw new SgProvisionError("unsupported_platform", `ast-grep ${SG_PINNED_VERSION} has no asset for ${slug}`);
624
731
  }
625
732
  const targetDir = resolve2(options.targetDir);
626
- const destination = join4(targetDir, sgBinaryName(platform));
627
- const tempPath = join4(targetDir, `.sg-${randomUUID2().slice(0, 8)}.partial`);
733
+ const destination = join5(targetDir, sgBinaryName(platform));
734
+ const tempPath = join5(targetDir, `.sg-${randomUUID2().slice(0, 8)}.partial`);
628
735
  assertInsideTarget(targetDir, destination);
629
736
  assertInsideTarget(targetDir, tempPath);
630
737
  try {
@@ -649,11 +756,10 @@ async function provisionSgBinary(options) {
649
756
  // ../../utils/src/ast-grep/sg-resolver.ts
650
757
  import { execFileSync } from "node:child_process";
651
758
  import { existsSync, statSync } from "node:fs";
652
- import { join as join6 } from "node:path";
653
759
 
654
760
  // ../../utils/src/runtime/which.ts
655
761
  import { accessSync, constants } from "node:fs";
656
- import { delimiter, join as join5 } from "node:path";
762
+ import { delimiter, join as join6 } from "node:path";
657
763
  var runtime = globalThis;
658
764
  function isUnsafeCommandName(commandName) {
659
765
  if (commandName.includes("/") || commandName.includes("\\"))
@@ -708,7 +814,7 @@ function bunWhich(commandName) {
708
814
  return null;
709
815
  for (const pathEntry of pathEntries) {
710
816
  for (const candidateName of candidateNames) {
711
- const candidatePath = join5(pathEntry, candidateName);
817
+ const candidatePath = join6(pathEntry, candidateName);
712
818
  if (isExecutable(candidatePath))
713
819
  return candidatePath;
714
820
  }
@@ -716,13 +822,15 @@ function bunWhich(commandName) {
716
822
  return null;
717
823
  }
718
824
 
719
- // ../../utils/src/ast-grep/types.ts
720
- var SG_PATH_ENV_KEY = "OMO_AST_GREP_SG_PATH";
721
-
722
825
  // ../../utils/src/ast-grep/sg-resolver.ts
723
- function nonEmptyValue(value) {
724
- const trimmed = value?.trim();
725
- return trimmed === undefined || trimmed.length === 0 ? null : trimmed;
826
+ var SG_VERSION_PROBE_TIMEOUT_MS = 5000;
827
+ var cacheEntry = null;
828
+ function cacheFingerprint(options, plan) {
829
+ return JSON.stringify([
830
+ options.platform ?? process.platform,
831
+ options.arch ?? process.arch,
832
+ plan.beforePath.map((candidate2) => candidate2.path)
833
+ ]);
726
834
  }
727
835
  function defaultFileExists(filePath) {
728
836
  if (!existsSync(filePath))
@@ -730,9 +838,7 @@ function defaultFileExists(filePath) {
730
838
  try {
731
839
  const stats = statSync(filePath);
732
840
  return stats.isFile() && stats.size > 0;
733
- } catch (error) {
734
- if (error instanceof Error)
735
- return false;
841
+ } catch {
736
842
  return false;
737
843
  }
738
844
  }
@@ -740,53 +846,79 @@ function defaultVersionProbe(binaryPath) {
740
846
  return String(execFileSync(binaryPath, ["--version"], {
741
847
  encoding: "utf8",
742
848
  stdio: ["ignore", "pipe", "ignore"],
743
- timeout: 5000
849
+ timeout: SG_VERSION_PROBE_TIMEOUT_MS
744
850
  }));
745
851
  }
746
- function isAstGrepVersionOutput(output) {
747
- return output.toLowerCase().includes("ast-grep");
748
- }
749
- function hasAstGrepVersion(binaryPath, runVersionProbeSync) {
852
+ function probePasses(binaryPath, deps) {
750
853
  try {
751
- return isAstGrepVersionOutput(runVersionProbeSync(binaryPath));
752
- } catch (error) {
753
- if (error instanceof Error)
754
- return false;
854
+ return deps.runVersionProbeSync(binaryPath).toLowerCase().includes("ast-grep");
855
+ } catch {
755
856
  return false;
756
857
  }
757
858
  }
758
- function pathCommandCandidates() {
759
- return ["ast-grep", "sg"];
859
+ function acceptsCandidate(binaryPath, deps) {
860
+ return deps.fileExists(binaryPath) && probePasses(binaryPath, deps);
760
861
  }
761
- function findSgBinarySync(options = {}) {
762
- const env = options.env ?? process.env;
763
- const platform = options.platform ?? process.platform;
764
- const fileExists = options.fileExists ?? defaultFileExists;
765
- const runVersionProbeSync = options.runVersionProbeSync ?? defaultVersionProbe;
766
- const which = options.which ?? bunWhich;
862
+ function firstAccepted(candidates, deps) {
863
+ for (const candidate2 of candidates) {
864
+ if (acceptsCandidate(candidate2.path, deps))
865
+ return { found: true, path: candidate2.path, tier: candidate2.tier };
866
+ }
867
+ return null;
868
+ }
869
+ function pathCandidates(commands, deps) {
870
+ const resolved = [];
871
+ for (const commandName of commands) {
872
+ const found = deps.which(commandName);
873
+ if (found !== null)
874
+ resolved.push({ path: found, tier: "path" });
875
+ }
876
+ return resolved;
877
+ }
878
+ function notFound(platform) {
879
+ return {
880
+ error: { code: SG_BINARY_NOT_FOUND, hints: sgInstallHints(platform), message: sgBinaryNotFoundMessage(platform) },
881
+ found: false
882
+ };
883
+ }
884
+ function cacheIsStillValid(resolution, deps, revalidate) {
885
+ if (!resolution.found)
886
+ return false;
887
+ if (!deps.fileExists(resolution.path))
888
+ return false;
889
+ return !revalidate || probePasses(resolution.path, deps);
890
+ }
891
+ function resolverDeps(options) {
892
+ return {
893
+ fileExists: options.fileExists ?? defaultFileExists,
894
+ platform: options.platform ?? process.platform,
895
+ runVersionProbeSync: options.runVersionProbeSync ?? defaultVersionProbe,
896
+ which: options.which ?? bunWhich
897
+ };
898
+ }
899
+ function resolveSgBinarySync(options = {}) {
900
+ const deps = resolverDeps(options);
901
+ const useCache = options.cache ?? true;
767
902
  try {
768
- const envOverride = nonEmptyValue(env[SG_PATH_ENV_KEY]);
769
- if (envOverride !== null && fileExists(envOverride))
770
- return envOverride;
771
- if (options.runtimeDir !== undefined) {
772
- const runtimeCandidate = join6(options.runtimeDir, sgBinaryName(platform));
773
- if (fileExists(runtimeCandidate))
774
- return runtimeCandidate;
775
- }
776
- for (const commandName of pathCommandCandidates()) {
777
- const pathCandidate = which(commandName);
778
- if (pathCandidate === null || !fileExists(pathCandidate))
779
- continue;
780
- if (commandName !== "sg" || hasAstGrepVersion(pathCandidate, runVersionProbeSync))
781
- return pathCandidate;
903
+ const plan = planSgCandidates(options);
904
+ const fingerprint = cacheFingerprint(options, plan);
905
+ if (useCache && cacheEntry !== null && cacheEntry.fingerprint === fingerprint) {
906
+ if (cacheIsStillValid(cacheEntry.resolution, deps, options.revalidate ?? false))
907
+ return cacheEntry.resolution;
908
+ cacheEntry = null;
782
909
  }
783
- return null;
784
- } catch (error) {
785
- if (error instanceof Error)
786
- return null;
787
- return null;
910
+ const resolution = firstAccepted(plan.beforePath, deps) ?? firstAccepted(pathCandidates(plan.pathCommands, deps), deps) ?? firstAccepted(plan.afterPath, deps) ?? notFound(deps.platform);
911
+ if (useCache && resolution.found)
912
+ cacheEntry = { fingerprint, resolution };
913
+ return resolution;
914
+ } catch {
915
+ return notFound(deps.platform);
788
916
  }
789
917
  }
918
+ function findSgBinarySync(options = {}) {
919
+ const resolution = resolveSgBinarySync(options);
920
+ return resolution.found ? resolution.path : null;
921
+ }
790
922
 
791
923
  // components/bootstrap/src/provision.ts
792
924
  var SG_PROVISION_COMPONENT = "ast_grep";
@@ -1161,8 +1293,8 @@ function findUnquotedCharacter(line, target, startIndex) {
1161
1293
  }
1162
1294
  return -1;
1163
1295
  }
1164
- function tomlPathMatches(candidate, target) {
1165
- return candidate.length === target.length && candidate.every((part, index) => part === target[index]);
1296
+ function tomlPathMatches(candidate2, target) {
1297
+ return candidate2.length === target.length && candidate2.every((part, index) => part === target[index]);
1166
1298
  }
1167
1299
  function replaceTomlAssignmentValue(line, assignmentIndex, value) {
1168
1300
  const newline = line.endsWith(`
@@ -2027,6 +2159,7 @@ var LEGACY_CODEX_COMPONENT_BINS = [
2027
2159
  { name: "codex-telemetry", component: "telemetry" },
2028
2160
  { name: "codex-ultrawork", component: "ultrawork" }
2029
2161
  ];
2162
+ var LEGACY_CODEX_COMPONENT_BIN_NAMES = LEGACY_CODEX_COMPONENT_BINS.map((entry) => entry.name);
2030
2163
  async function removeLegacyCodexComponentBins(binDir, platform) {
2031
2164
  for (const entry of LEGACY_CODEX_COMPONENT_BINS) {
2032
2165
  const linkPath = join12(binDir, platform === "win32" ? `${entry.name}.cmd` : entry.name);
@@ -2082,7 +2215,7 @@ function isNodeErrorWithCode2(error) {
2082
2215
  // ../src/install/codex-cache-runtime-wrapper.ts
2083
2216
  import { join as join13 } from "node:path";
2084
2217
  var RUNTIME_WRAPPER_MARKER = "OMO_GENERATED_RUNTIME_WRAPPER";
2085
- function posixRuntimeWrapper(cliPath, codexHome, binDir, nodeCliPath) {
2218
+ function posixRuntimeWrapper(binName, cliPath, codexHome, binDir, nodeCliPath) {
2086
2219
  const ulwLoopBin = toPosixPath(join13(binDir, "omo-ulw-loop"));
2087
2220
  const nodeCli = escapePosixDoubleQuoted(toPosixPath(nodeCliPath));
2088
2221
  const escapedCliPath = escapePosixDoubleQuoted(toPosixPath(cliPath));
@@ -2092,6 +2225,8 @@ function posixRuntimeWrapper(cliPath, codexHome, binDir, nodeCliPath) {
2092
2225
  "#!/bin/sh",
2093
2226
  `# ${RUNTIME_WRAPPER_MARKER}`,
2094
2227
  `export CODEX_HOME="\${CODEX_HOME:-${escapedCodexHome}}"`,
2228
+ `export OMO_INVOCATION_NAME=${binName}`,
2229
+ "export OMO_EDITION=codex",
2095
2230
  'if [ "$1" = "ulw-loop" ] && [ -x "' + escapedUlwLoopBin + '" ]; then',
2096
2231
  " shift",
2097
2232
  ' exec "' + escapedUlwLoopBin + '" ulw-loop "$@"',
@@ -2115,11 +2250,11 @@ function posixRuntimeWrapper(cliPath, codexHome, binDir, nodeCliPath) {
2115
2250
  ` if [ -f "${nodeCli}" ] && command -v node >/dev/null 2>&1; then`,
2116
2251
  ` exec node "${nodeCli}" "$@"`,
2117
2252
  " fi",
2118
- ` echo "omo: bun runtime not found (checked PATH, ~/.bun/bin, /opt/homebrew/bin, /usr/local/bin) and the node fallback CLI is missing at ${nodeCli}; install bun from https://bun.sh, or reinstall omo and force the fallback with OMO_RUNTIME=node" >&2`,
2253
+ ` echo "${binName}: bun runtime not found (checked PATH, ~/.bun/bin, /opt/homebrew/bin, /usr/local/bin) and the node fallback CLI is missing at ${nodeCli}; install bun from https://bun.sh, or reinstall ${binName} and force the fallback with OMO_RUNTIME=node" >&2`,
2119
2254
  " exit 127",
2120
2255
  "fi",
2121
2256
  `if [ ! -f "${escapedCliPath}" ]; then`,
2122
- ` echo "omo: runtime target missing at ${escapedCliPath}; reinstall with: npx --yes lazycodex-ai@latest install --no-tui" >&2`,
2257
+ ` echo "${binName}: runtime target missing at ${escapedCliPath}; reinstall with: npx --yes lazycodex-ai@latest install --no-tui" >&2`,
2123
2258
  " exit 1",
2124
2259
  "fi",
2125
2260
  `exec "$BUN_BINARY" "${escapedCliPath}" "$@"`,
@@ -2127,12 +2262,14 @@ function posixRuntimeWrapper(cliPath, codexHome, binDir, nodeCliPath) {
2127
2262
  ].join(`
2128
2263
  `);
2129
2264
  }
2130
- function windowsRuntimeWrapper(cliPath, codexHome, binDir, nodeCliPath) {
2265
+ function windowsRuntimeWrapper(binName, cliPath, codexHome, binDir, nodeCliPath) {
2131
2266
  const ulwLoopBin = join13(binDir, "omo-ulw-loop.cmd");
2132
2267
  return [
2133
2268
  "@echo off",
2134
2269
  `rem ${RUNTIME_WRAPPER_MARKER}`,
2135
2270
  `if not defined CODEX_HOME set "CODEX_HOME=${codexHome}"`,
2271
+ `set "OMO_INVOCATION_NAME=${binName}"`,
2272
+ 'set "OMO_EDITION=codex"',
2136
2273
  ...windowsNodeDiscoveryLines(),
2137
2274
  `if "%~1"=="ulw-loop" if exist "${ulwLoopBin}" (`,
2138
2275
  " shift /1",
@@ -2150,11 +2287,11 @@ function windowsRuntimeWrapper(cliPath, codexHome, binDir, nodeCliPath) {
2150
2287
  ` "%OMO_NODE_BINARY%" "${nodeCliPath}" %*`,
2151
2288
  " exit /b %ERRORLEVEL%",
2152
2289
  " )",
2153
- ` echo omo: bun runtime not found, no Node runtime was discovered from NODE_REPL_NODE_PATH or PATH, or the node fallback CLI is missing at ${nodeCliPath}; install bun from https://bun.sh or rerun LazyCodex install from Codex Desktop 1>&2`,
2290
+ ` echo ${binName}: bun runtime not found, no Node runtime was discovered from NODE_REPL_NODE_PATH or PATH, or the node fallback CLI is missing at ${nodeCliPath}; install bun from https://bun.sh or rerun LazyCodex install from Codex Desktop 1>&2`,
2154
2291
  " exit /b 127",
2155
2292
  ")",
2156
2293
  `if not exist "${cliPath}" (`,
2157
- ` echo omo: runtime target missing at ${cliPath}; reinstall with: npx --yes lazycodex-ai@latest install --no-tui 1>&2`,
2294
+ ` echo ${binName}: runtime target missing at ${cliPath}; reinstall with: npx --yes lazycodex-ai@latest install --no-tui 1>&2`,
2158
2295
  " exit /b 1",
2159
2296
  ")",
2160
2297
  `"%BUN_BINARY%" "${cliPath}" %*`,
@@ -2170,7 +2307,14 @@ function escapePosixDoubleQuoted(value) {
2170
2307
  }
2171
2308
 
2172
2309
  // ../src/install/codex-cache-bins.ts
2173
- var RESERVED_NESTED_BIN_NAMES = new Set(["omo", "lazycodex", "lazycodex-ai", "oh-my-opencode", "oh-my-openagent"]);
2310
+ var RESERVED_NESTED_BIN_NAMES = new Set([
2311
+ "omo",
2312
+ "omo-agent-toolkit",
2313
+ "lazycodex",
2314
+ "lazycodex-ai",
2315
+ "oh-my-opencode",
2316
+ "oh-my-openagent"
2317
+ ]);
2174
2318
  async function linkCachedPluginBins(input) {
2175
2319
  const binLinks = await discoverPackageBins(input.pluginRoot);
2176
2320
  const platform = input.platform ?? process.platform;
@@ -2186,20 +2330,26 @@ async function linkCachedPluginBins(input) {
2186
2330
  }
2187
2331
  async function linkRootRuntimeBin(input) {
2188
2332
  const cliPath = join14(input.repoRoot, "dist", "cli", "index.js");
2189
- if (!await isFile2(cliPath))
2333
+ const platform = input.platform ?? process.platform;
2334
+ const legacyPath = join14(input.binDir, platform === "win32" ? "omo.cmd" : "omo");
2335
+ if (!await isFile2(cliPath)) {
2336
+ await removeGeneratedRuntimeWrapper(legacyPath);
2190
2337
  return null;
2338
+ }
2339
+ const binName = "omo-agent-toolkit";
2191
2340
  const nodeCliPath = join14(input.repoRoot, "dist", "cli-node", "index.js");
2192
- const platform = input.platform ?? process.platform;
2193
2341
  await mkdir5(input.binDir, { recursive: true });
2194
2342
  if (platform === "win32") {
2195
- const linkPath2 = join14(input.binDir, "omo.cmd");
2196
- await replaceRuntimeWrapper(linkPath2, windowsRuntimeWrapper(cliPath, input.codexHome, input.binDir, nodeCliPath));
2197
- return { name: "omo", path: linkPath2, target: cliPath };
2343
+ const linkPath2 = join14(input.binDir, `${binName}.cmd`);
2344
+ await replaceRuntimeWrapper(linkPath2, windowsRuntimeWrapper(binName, cliPath, input.codexHome, input.binDir, nodeCliPath));
2345
+ await removeGeneratedRuntimeWrapper(legacyPath);
2346
+ return { name: binName, path: linkPath2, target: cliPath };
2198
2347
  }
2199
- const linkPath = join14(input.binDir, "omo");
2200
- await replaceRuntimeWrapper(linkPath, posixRuntimeWrapper(cliPath, input.codexHome, input.binDir, nodeCliPath));
2348
+ const linkPath = join14(input.binDir, binName);
2349
+ await replaceRuntimeWrapper(linkPath, posixRuntimeWrapper(binName, cliPath, input.codexHome, input.binDir, nodeCliPath));
2201
2350
  await chmod2(linkPath, 493);
2202
- return { name: "omo", path: linkPath, target: cliPath };
2351
+ await removeGeneratedRuntimeWrapper(legacyPath);
2352
+ return { name: binName, path: linkPath, target: cliPath };
2203
2353
  }
2204
2354
  async function linkCachedPluginBin(binDir, link, platform) {
2205
2355
  if (platform === "win32") {
@@ -2302,6 +2452,29 @@ async function replaceRuntimeWrapper(linkPath, content) {
2302
2452
  await rm9(linkPath, { force: true });
2303
2453
  await writeFile5(linkPath, content);
2304
2454
  }
2455
+ async function removeGeneratedRuntimeWrapper(path) {
2456
+ try {
2457
+ const entry = await lstat7(path);
2458
+ if (!entry.isFile() && !entry.isSymbolicLink())
2459
+ return;
2460
+ const content = await readGeneratedWrapperContent(path);
2461
+ if (content.includes(RUNTIME_WRAPPER_MARKER))
2462
+ await rm9(path, { force: true });
2463
+ } catch (error) {
2464
+ if (isNodeErrorWithCode(error) && error.code === "ENOENT")
2465
+ return;
2466
+ throw error;
2467
+ }
2468
+ }
2469
+ async function readGeneratedWrapperContent(path) {
2470
+ try {
2471
+ return await readFile8(path, "utf8");
2472
+ } catch (error) {
2473
+ if (isNodeErrorWithCode(error) && (error.code === "ENOENT" || error.code === "EISDIR"))
2474
+ return "";
2475
+ throw error;
2476
+ }
2477
+ }
2305
2478
  async function existingNonRuntimeWrapper(path) {
2306
2479
  try {
2307
2480
  const stat5 = await lstat7(path);
@@ -3374,13 +3547,13 @@ async function exists4(path) {
3374
3547
  }
3375
3548
 
3376
3549
  // ../src/install/codex-installer-bin-dir.ts
3377
- import { homedir as homedir3 } from "node:os";
3550
+ import { homedir as homedir4 } from "node:os";
3378
3551
  import { join as join20, resolve as resolve6 } from "node:path";
3379
3552
  function resolveCodexInstallerBinDir(input) {
3380
3553
  const explicitBinDir = input.binDir ?? input.env?.CODEX_LOCAL_BIN_DIR;
3381
3554
  if (explicitBinDir !== undefined && explicitBinDir.trim().length > 0)
3382
3555
  return resolve6(explicitBinDir.trim());
3383
- const homeDir = input.homeDir ?? homedir3();
3556
+ const homeDir = input.homeDir ?? homedir4();
3384
3557
  const defaultCodexHome = resolve6(homeDir, ".codex");
3385
3558
  const resolvedCodexHome = resolve6(input.codexHome);
3386
3559
  if (resolvedCodexHome !== defaultCodexHome)
@@ -3407,23 +3580,23 @@ function resolveGitBash(input) {
3407
3580
  }
3408
3581
  return missingGitBash(checkedPaths);
3409
3582
  }
3410
- for (const candidate of [
3583
+ for (const candidate2 of [
3411
3584
  { path: PROGRAM_FILES_GIT_BASH, source: "program-files" },
3412
3585
  { path: PROGRAM_FILES_X86_GIT_BASH, source: "program-files-x86" }
3413
3586
  ]) {
3414
- checkedPaths.push(candidate.path);
3415
- if (input.exists(candidate.path))
3416
- return { found: true, path: candidate.path, source: candidate.source, checkedPaths };
3587
+ checkedPaths.push(candidate2.path);
3588
+ if (input.exists(candidate2.path))
3589
+ return { found: true, path: candidate2.path, source: candidate2.source, checkedPaths };
3417
3590
  }
3418
3591
  for (const pathCandidate of input.where("bash")) {
3419
- const candidate = pathCandidate.trim();
3420
- if (candidate.length === 0)
3592
+ const candidate2 = pathCandidate.trim();
3593
+ if (candidate2.length === 0)
3421
3594
  continue;
3422
- checkedPaths.push(candidate);
3423
- if (isKnownNonGitBashLauncher(candidate))
3595
+ checkedPaths.push(candidate2);
3596
+ if (isKnownNonGitBashLauncher(candidate2))
3424
3597
  continue;
3425
- if (isBashExePath(candidate) && input.exists(candidate))
3426
- return { found: true, path: candidate, source: "path", checkedPaths };
3598
+ if (isBashExePath(candidate2) && input.exists(candidate2))
3599
+ return { found: true, path: candidate2, source: "path", checkedPaths };
3427
3600
  }
3428
3601
  return missingGitBash(checkedPaths);
3429
3602
  }
@@ -3662,18 +3835,18 @@ async function linkRuntimeWrapperStep(options, binDir, degraded) {
3662
3835
  if (linked !== null)
3663
3836
  return;
3664
3837
  degraded.push({
3665
- component: "omo-cli",
3666
- hint: "use npx lazycodex-ai for the omo CLI",
3838
+ component: "omo-agent-toolkit",
3839
+ hint: "use npx lazycodex-ai for the omo-agent-toolkit CLI",
3667
3840
  reason: "marketplace payload has no dist/cli"
3668
3841
  });
3669
- await appendBootstrapLog(options.pluginData, options.now ?? Date.now(), "omo-cli-degraded", {
3670
- warning: `Warning: skipped the omo runtime wrapper because ${cliPath} is missing; omo ulw-loop commands will be unavailable until a package shipping dist/cli is installed`
3842
+ await appendBootstrapLog(options.pluginData, options.now ?? Date.now(), "omo-agent-toolkit-degraded", {
3843
+ warning: `Warning: skipped the omo-agent-toolkit runtime wrapper because ${cliPath} is missing; omo-agent-toolkit ulw-loop commands will be unavailable until a package shipping dist/cli is installed`
3671
3844
  });
3672
3845
  } catch (error) {
3673
3846
  degraded.push({
3674
- component: "omo-cli",
3847
+ component: "omo-agent-toolkit",
3675
3848
  hint: BOOTSTRAP_DOCTOR_HINT,
3676
- reason: `failed to link the omo runtime wrapper into ${binDir}: ${errorMessage(error)}`
3849
+ reason: `failed to link the omo-agent-toolkit runtime wrapper into ${binDir}: ${errorMessage(error)}`
3677
3850
  });
3678
3851
  }
3679
3852
  }
@@ -3752,7 +3925,7 @@ function resolvePluginDataRoot(env) {
3752
3925
  const fromEnv = env["PLUGIN_DATA"]?.trim();
3753
3926
  if (fromEnv !== undefined && fromEnv.length > 0)
3754
3927
  return fromEnv;
3755
- return join22(homedir4(), ".local", "share", "lazycodex");
3928
+ return join22(homedir5(), ".local", "share", "lazycodex");
3756
3929
  }
3757
3930
  async function readPluginVersion(pluginRoot) {
3758
3931
  try {
@@ -3801,6 +3974,9 @@ async function runBootstrapWorker(options = {}) {
3801
3974
  const platform = options.platform ?? process.platform;
3802
3975
  const flags = parseWorkerFlags(options.argv ?? []);
3803
3976
  const steps = options.steps ?? defaultWorkerSteps();
3977
+ if (flags.only !== undefined && !steps.some((step) => step.name === flags.only)) {
3978
+ throw new Error(`unknown --only flag value: ${flags.only}`);
3979
+ }
3804
3980
  const pluginRoot = resolvePluginRoot(env);
3805
3981
  const pluginData = resolvePluginDataRoot(env);
3806
3982
  const statePath = resolveBootstrapStatePath(pluginData);
@@ -3876,10 +4052,10 @@ function parseDegradedEntries(raw) {
3876
4052
  if (!Array.isArray(raw))
3877
4053
  return;
3878
4054
  const entries = [];
3879
- for (const candidate of raw) {
3880
- if (typeof candidate !== "object" || candidate === null)
4055
+ for (const candidate2 of raw) {
4056
+ if (typeof candidate2 !== "object" || candidate2 === null)
3881
4057
  continue;
3882
- const record = candidate;
4058
+ const record = candidate2;
3883
4059
  if (typeof record["component"] !== "string" || typeof record["reason"] !== "string")
3884
4060
  continue;
3885
4061
  entries.push({
@@ -8,7 +8,7 @@
8
8
  "command": "node \"${PLUGIN_ROOT}/components/bootstrap/dist/cli.js\" hook session-start",
9
9
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\bootstrap.ps1\"",
10
10
  "timeout": 30,
11
- "statusMessage": "(OmO 4.19.4) Checking Bootstrap Provisioning"
11
+ "statusMessage": "(OmO 5.0.0-beta.2) Checking Bootstrap Provisioning"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-bootstrap",
3
- "version": "4.19.4",
3
+ "version": "5.0.0-beta.2",
4
4
  "description": "Codex SessionStart bootstrap component that provisions LazyCodex runtime dependencies from a detached worker.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -224,7 +224,7 @@ async function linkComponentBinsStep(options: WorkerSetupOptions, degraded: Boot
224
224
  }
225
225
 
226
226
  // Older marketplace payloads may not have <pluginRoot>/dist/cli. Keep that
227
- // degraded path explicit instead of leaving a broken `omo` link.
227
+ // degraded path explicit instead of leaving a broken `omo-agent-toolkit` link.
228
228
  async function linkRuntimeWrapperStep(
229
229
  options: WorkerSetupOptions,
230
230
  binDir: string,
@@ -240,18 +240,18 @@ async function linkRuntimeWrapperStep(
240
240
  });
241
241
  if (linked !== null) return;
242
242
  degraded.push({
243
- component: "omo-cli",
244
- hint: "use npx lazycodex-ai for the omo CLI",
243
+ component: "omo-agent-toolkit",
244
+ hint: "use npx lazycodex-ai for the omo-agent-toolkit CLI",
245
245
  reason: "marketplace payload has no dist/cli",
246
246
  });
247
- await appendBootstrapLog(options.pluginData, options.now ?? Date.now(), "omo-cli-degraded", {
248
- warning: `Warning: skipped the omo runtime wrapper because ${cliPath} is missing; omo ulw-loop commands will be unavailable until a package shipping dist/cli is installed`,
247
+ await appendBootstrapLog(options.pluginData, options.now ?? Date.now(), "omo-agent-toolkit-degraded", {
248
+ warning: `Warning: skipped the omo-agent-toolkit runtime wrapper because ${cliPath} is missing; omo-agent-toolkit ulw-loop commands will be unavailable until a package shipping dist/cli is installed`,
249
249
  });
250
250
  } catch (error) {
251
251
  degraded.push({
252
- component: "omo-cli",
252
+ component: "omo-agent-toolkit",
253
253
  hint: BOOTSTRAP_DOCTOR_HINT,
254
- reason: `failed to link the omo runtime wrapper into ${binDir}: ${errorMessage(error)}`,
254
+ reason: `failed to link the omo-agent-toolkit runtime wrapper into ${binDir}: ${errorMessage(error)}`,
255
255
  });
256
256
  }
257
257
  }
@@ -167,6 +167,9 @@ export async function runBootstrapWorker(options: RunBootstrapWorkerOptions = {}
167
167
  const platform = options.platform ?? process.platform;
168
168
  const flags = parseWorkerFlags(options.argv ?? []);
169
169
  const steps = options.steps ?? defaultWorkerSteps();
170
+ if (flags.only !== undefined && !steps.some((step) => step.name === flags.only)) {
171
+ throw new Error(`unknown --only flag value: ${flags.only}`);
172
+ }
170
173
  const pluginRoot = resolvePluginRoot(env);
171
174
  const pluginData = resolvePluginDataRoot(env);
172
175
  const statePath = resolveBootstrapStatePath(pluginData);