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
package/dist/tui.js CHANGED
@@ -18836,6 +18836,80 @@ var init_codegraph = __esm(() => {
18836
18836
  }).strict();
18837
18837
  });
18838
18838
 
18839
+ // packages/omo-config-core/src/schema/memory.ts
18840
+ var OmoMemoryReflectionTriggerSchema, OmoMemoryReflectionSchema, OmoMemorySyncSchema, OmoMemorySearchSchema, OmoMemoryReflectionTriggerLayerSchema, OmoMemoryReflectionLayerSchema, OmoMemorySyncLayerSchema, OmoMemorySearchLayerSchema, OmoMemoryAgentOverridesSchema, OmoMemorySettingsSchema, OmoMemorySettingsLayerSchema;
18841
+ var init_memory = __esm(() => {
18842
+ init_zod();
18843
+ OmoMemoryReflectionTriggerSchema = object({
18844
+ step_count: number2().int().nonnegative().default(0),
18845
+ on_compaction: boolean2().default(true)
18846
+ }).strict();
18847
+ OmoMemoryReflectionSchema = object({
18848
+ trigger: OmoMemoryReflectionTriggerSchema.default({ step_count: 0, on_compaction: true }),
18849
+ merge: _enum2(["auto", "integration"]).default("auto"),
18850
+ category: string2().min(1).default("quick"),
18851
+ timeout_minutes: number2().int().positive().default(15),
18852
+ sandbox: _enum2(["auto", "required", "off"]).default("auto")
18853
+ }).strict();
18854
+ OmoMemorySyncSchema = object({
18855
+ remote: string2().min(1).optional(),
18856
+ enabled: boolean2().default(true)
18857
+ }).strict();
18858
+ OmoMemorySearchSchema = object({
18859
+ enabled: boolean2().default(true)
18860
+ }).strict();
18861
+ OmoMemoryReflectionTriggerLayerSchema = object({
18862
+ step_count: number2().int().nonnegative().optional(),
18863
+ on_compaction: boolean2().optional()
18864
+ }).strict();
18865
+ OmoMemoryReflectionLayerSchema = object({
18866
+ trigger: OmoMemoryReflectionTriggerLayerSchema.optional(),
18867
+ merge: _enum2(["auto", "integration"]).optional(),
18868
+ category: string2().min(1).optional(),
18869
+ timeout_minutes: number2().int().positive().optional(),
18870
+ sandbox: _enum2(["auto", "required", "off"]).optional()
18871
+ }).strict();
18872
+ OmoMemorySyncLayerSchema = object({
18873
+ remote: string2().min(1).optional(),
18874
+ enabled: boolean2().optional()
18875
+ }).strict();
18876
+ OmoMemorySearchLayerSchema = object({
18877
+ enabled: boolean2().optional()
18878
+ }).strict();
18879
+ OmoMemoryAgentOverridesSchema = object({
18880
+ enabled: boolean2().optional(),
18881
+ agent: string2().min(1).optional(),
18882
+ reflection: OmoMemoryReflectionLayerSchema.optional(),
18883
+ sync: OmoMemorySyncLayerSchema.optional(),
18884
+ search: OmoMemorySearchLayerSchema.optional(),
18885
+ compile_warn_tokens: number2().int().positive().optional()
18886
+ }).strict();
18887
+ OmoMemorySettingsSchema = object({
18888
+ enabled: boolean2().default(true),
18889
+ agent: string2().min(1).default("auto"),
18890
+ reflection: OmoMemoryReflectionSchema.default({
18891
+ trigger: { step_count: 0, on_compaction: true },
18892
+ merge: "auto",
18893
+ category: "quick",
18894
+ timeout_minutes: 15,
18895
+ sandbox: "auto"
18896
+ }),
18897
+ sync: OmoMemorySyncSchema.default({ enabled: true }),
18898
+ search: OmoMemorySearchSchema.default({ enabled: true }),
18899
+ compile_warn_tokens: number2().int().positive().default(30000),
18900
+ agents: record(string2(), OmoMemoryAgentOverridesSchema).default({})
18901
+ }).strict();
18902
+ OmoMemorySettingsLayerSchema = object({
18903
+ enabled: boolean2().optional(),
18904
+ agent: string2().min(1).optional(),
18905
+ reflection: OmoMemoryReflectionLayerSchema.optional(),
18906
+ sync: OmoMemorySyncLayerSchema.optional(),
18907
+ search: OmoMemorySearchLayerSchema.optional(),
18908
+ compile_warn_tokens: number2().int().positive().optional(),
18909
+ agents: record(string2(), OmoMemoryAgentOverridesSchema).optional()
18910
+ }).strict();
18911
+ });
18912
+
18839
18913
  // packages/omo-config-core/src/schema/model-catalog.ts
18840
18914
  function isRecord5(value) {
18841
18915
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -18859,9 +18933,18 @@ var init_model_catalog = __esm(() => {
18859
18933
  });
18860
18934
 
18861
18935
  // packages/omo-config-core/src/schema/task.ts
18862
- var OmoTaskWaitSchema, OmoTaskTeamSettingsSchema, OmoTaskWarningsSchema, OmoTaskSettingsSchema, OmoTaskWaitLayerSchema, OmoTaskTeamSettingsLayerSchema, OmoTaskWarningsLayerSchema, OmoTaskSettingsLayerSchema;
18936
+ import { availableParallelism } from "os";
18937
+ function resolveOmoTaskSettings(input, resolveParallelism = availableParallelism) {
18938
+ const record2 = record(string2(), unknown()).parse(input);
18939
+ return OmoTaskSettingsSchema.parse({
18940
+ ...record2,
18941
+ residency_max_children: record2["residency_max_children"] ?? Math.max(8, resolveParallelism() * 3)
18942
+ });
18943
+ }
18944
+ var ResidencyMaxChildrenInputSchema, OmoTaskWaitSchema, OmoTaskTeamSettingsSchema, OmoTaskWarningsSchema, OmoTaskSettingsSchema, OmoTaskWaitLayerSchema, OmoTaskTeamSettingsLayerSchema, OmoTaskWarningsLayerSchema, OmoTaskSettingsLayerSchema;
18863
18945
  var init_task = __esm(() => {
18864
18946
  init_zod();
18947
+ ResidencyMaxChildrenInputSchema = union([number2().int().positive(), literal("unlimited")]);
18865
18948
  OmoTaskWaitSchema = object({
18866
18949
  min_ms: number2().int().positive().default(5000),
18867
18950
  default_ms: number2().int().positive().default(60000),
@@ -18881,10 +18964,11 @@ var init_task = __esm(() => {
18881
18964
  provider_concurrency: record(string2(), number2().int().positive()).optional(),
18882
18965
  model_concurrency: record(string2(), number2().int().positive()).optional(),
18883
18966
  max_depth: number2().int().nonnegative().default(1),
18884
- residency_max_children: number2().int().positive().default(8),
18967
+ residency_max_children: ResidencyMaxChildrenInputSchema.default(8),
18885
18968
  ttl_ms: number2().int().positive().default(86400000),
18886
18969
  state_dir: string2().optional(),
18887
18970
  reattach_on_reconcile: boolean2().optional(),
18971
+ resume_children: boolean2().default(true),
18888
18972
  warnings: OmoTaskWarningsSchema.default({ unavailable_categories: true }),
18889
18973
  wait: OmoTaskWaitSchema.default({ min_ms: 5000, default_ms: 60000, max_ms: 600000 }),
18890
18974
  team: OmoTaskTeamSettingsSchema.default({
@@ -18912,10 +18996,11 @@ var init_task = __esm(() => {
18912
18996
  provider_concurrency: record(string2(), number2().int().positive()).optional(),
18913
18997
  model_concurrency: record(string2(), number2().int().positive()).optional(),
18914
18998
  max_depth: number2().int().nonnegative().optional(),
18915
- residency_max_children: number2().int().positive().optional(),
18999
+ residency_max_children: ResidencyMaxChildrenInputSchema.optional(),
18916
19000
  ttl_ms: number2().int().positive().optional(),
18917
19001
  state_dir: string2().optional(),
18918
19002
  reattach_on_reconcile: boolean2().optional(),
19003
+ resume_children: boolean2().optional(),
18919
19004
  warnings: OmoTaskWarningsLayerSchema.optional(),
18920
19005
  wait: OmoTaskWaitLayerSchema.optional(),
18921
19006
  team: OmoTaskTeamSettingsLayerSchema.optional()
@@ -18980,6 +19065,7 @@ var init_config = __esm(() => {
18980
19065
  init_agent();
18981
19066
  init_category();
18982
19067
  init_codegraph();
19068
+ init_memory();
18983
19069
  init_model_catalog();
18984
19070
  init_task();
18985
19071
  init_team();
@@ -18990,7 +19076,8 @@ var init_config = __esm(() => {
18990
19076
  codegraph: OmoCodegraphSettingsLayerSchema.optional(),
18991
19077
  task: OmoTaskSettingsLayerSchema.optional(),
18992
19078
  teams: OmoTeamsConfigLayerSchema.optional(),
18993
- models: OmoModelCatalogLayerSchema.optional()
19079
+ models: OmoModelCatalogLayerSchema.optional(),
19080
+ memory: OmoMemorySettingsLayerSchema.optional()
18994
19081
  }).strict();
18995
19082
  OmoConfigProfileSchema = object({
18996
19083
  categories: OmoCategoriesConfigSchema.optional(),
@@ -18999,6 +19086,7 @@ var init_config = __esm(() => {
18999
19086
  task: OmoTaskSettingsLayerSchema.optional(),
19000
19087
  teams: OmoTeamsConfigLayerSchema.optional(),
19001
19088
  models: OmoModelCatalogLayerSchema.optional(),
19089
+ memory: OmoMemorySettingsLayerSchema.optional(),
19002
19090
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
19003
19091
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
19004
19092
  "[codex]": OmoTypedHarnessConfigSchema.optional()
@@ -19011,6 +19099,7 @@ var init_config = __esm(() => {
19011
19099
  task: OmoTaskSettingsSchema.optional(),
19012
19100
  teams: OmoTeamsConfigSchema.optional(),
19013
19101
  models: OmoModelCatalogSchema.optional(),
19102
+ memory: OmoMemorySettingsSchema.optional(),
19014
19103
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
19015
19104
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
19016
19105
  "[codex]": OmoTypedHarnessConfigSchema.optional(),
@@ -19026,6 +19115,7 @@ var init_config = __esm(() => {
19026
19115
  task: OmoTaskSettingsLayerSchema.optional(),
19027
19116
  teams: OmoTeamsConfigLayerSchema.optional(),
19028
19117
  models: OmoModelCatalogLayerSchema.optional(),
19118
+ memory: OmoMemorySettingsLayerSchema.optional(),
19029
19119
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
19030
19120
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
19031
19121
  "[codex]": OmoTypedHarnessConfigSchema.optional(),
@@ -19043,6 +19133,7 @@ var init_schema = __esm(() => {
19043
19133
  init_config();
19044
19134
  init_fallback_models();
19045
19135
  init_harness();
19136
+ init_memory();
19046
19137
  init_model_catalog();
19047
19138
  init_model_ref();
19048
19139
  init_task();
@@ -19404,7 +19495,7 @@ var init_loader = __esm(() => {
19404
19495
  agents: {},
19405
19496
  categories: {},
19406
19497
  codegraph: OmoCodegraphSettingsSchema.parse({}),
19407
- task: OmoTaskSettingsSchema.parse({}),
19498
+ task: resolveOmoTaskSettings({}),
19408
19499
  teams: {}
19409
19500
  };
19410
19501
  });
@@ -19674,17 +19765,31 @@ var init_archive_entry_validator = () => {};
19674
19765
  // packages/utils/src/ast-grep/sg-manifest.ts
19675
19766
  var init_sg_manifest = () => {};
19676
19767
 
19768
+ // packages/utils/src/ast-grep/install-script.ts
19769
+ var init_install_script = () => {};
19770
+
19771
+ // packages/utils/src/ast-grep/types.ts
19772
+ var SG_PATH_ENV_KEY = "OMO_AST_GREP_SG_PATH";
19773
+
19774
+ // packages/utils/src/ast-grep/sg-candidates.ts
19775
+ var init_sg_candidates = () => {};
19776
+
19777
+ // packages/utils/src/ast-grep/sg-install-hints.ts
19778
+ var ENV_OVERRIDE_HINT;
19779
+ var init_sg_install_hints = __esm(() => {
19780
+ ENV_OVERRIDE_HINT = `Or point ${SG_PATH_ENV_KEY} at an existing ast-grep binary`;
19781
+ });
19782
+
19677
19783
  // packages/utils/src/ast-grep/sg-provisioner.ts
19678
19784
  var init_sg_provisioner = () => {};
19679
19785
 
19680
19786
  // packages/utils/src/ast-grep/sg-resolver.ts
19681
19787
  var init_sg_resolver = () => {};
19682
19788
 
19683
- // packages/utils/src/ast-grep/install-script.ts
19684
- var init_install_script = () => {};
19685
-
19686
19789
  // packages/utils/src/ast-grep/index.ts
19687
19790
  var init_ast_grep = __esm(() => {
19791
+ init_sg_candidates();
19792
+ init_sg_install_hints();
19688
19793
  init_sg_manifest();
19689
19794
  init_sg_provisioner();
19690
19795
  init_sg_resolver();
@@ -21050,9 +21155,71 @@ function normalizeModelID(modelID) {
21050
21155
  return modelID.replace(/\.(\d+)/g, "-$1");
21051
21156
  }
21052
21157
 
21158
+ // packages/model-core/src/reasoning-level.ts
21159
+ function isReasoningLevelOrAuto(value) {
21160
+ return REASONING_LEVEL_OR_AUTO_SET2.has(value);
21161
+ }
21162
+ function splitReasoningSuffix2(model, options) {
21163
+ if (typeof model !== "string")
21164
+ return { base: "" };
21165
+ const trimmed = model.trim();
21166
+ if (!trimmed)
21167
+ return { base: "" };
21168
+ const separatorIndex = trimmed.lastIndexOf(":");
21169
+ if (separatorIndex === -1)
21170
+ return { base: trimmed };
21171
+ const base = trimmed.slice(0, separatorIndex).trim();
21172
+ const token = trimmed.slice(separatorIndex + 1).trim().toLowerCase();
21173
+ if (!base || !isReasoningLevelOrAuto(token))
21174
+ return { base: trimmed };
21175
+ if (token === "max" && !(options?.allowMaxSuffix ?? base.includes("/")))
21176
+ return { base: trimmed };
21177
+ return { base, level: token };
21178
+ }
21179
+ var REASONING_LEVELS2, REASONING_AUTO2 = "auto", REASONING_LEVEL_SET2, REASONING_LEVEL_OR_AUTO_SET2;
21180
+ var init_reasoning_level = __esm(() => {
21181
+ REASONING_LEVELS2 = ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
21182
+ REASONING_LEVEL_SET2 = new Set(REASONING_LEVELS2);
21183
+ REASONING_LEVEL_OR_AUTO_SET2 = new Set([...REASONING_LEVELS2, REASONING_AUTO2]);
21184
+ });
21185
+
21186
+ // packages/model-core/src/model-string-parser.ts
21187
+ function parseVariantFromModelID(rawModelID, options) {
21188
+ if (typeof rawModelID !== "string") {
21189
+ return { modelID: "" };
21190
+ }
21191
+ const trimmedModelID = rawModelID.trim();
21192
+ if (!trimmedModelID) {
21193
+ return { modelID: "" };
21194
+ }
21195
+ const parenthesizedVariant = trimmedModelID.match(/^(.*)\(([^()]+)\)\s*$/);
21196
+ if (parenthesizedVariant) {
21197
+ const modelID = parenthesizedVariant[1]?.trim() ?? "";
21198
+ const variant = parenthesizedVariant[2]?.trim();
21199
+ return variant ? { modelID, variant } : { modelID };
21200
+ }
21201
+ const suffixedModel = splitReasoningSuffix2(trimmedModelID, options);
21202
+ if (suffixedModel.level) {
21203
+ return { modelID: suffixedModel.base, variant: suffixedModel.level };
21204
+ }
21205
+ const spaceVariant = trimmedModelID.match(/^(.*\S)\s+([a-z][a-z0-9_-]*)$/i);
21206
+ if (spaceVariant) {
21207
+ const modelID = spaceVariant[1]?.trim() ?? "";
21208
+ const variant = spaceVariant[2]?.trim().toLowerCase();
21209
+ if (variant) {
21210
+ return { modelID, variant };
21211
+ }
21212
+ }
21213
+ return { modelID: trimmedModelID };
21214
+ }
21215
+ var init_model_string_parser = __esm(() => {
21216
+ init_reasoning_level();
21217
+ });
21218
+
21053
21219
  // packages/model-core/src/model-capability-heuristics.ts
21054
21220
  function detectHeuristicModelFamily(modelID) {
21055
- const normalizedModelID = normalizeModelID(modelID).toLowerCase();
21221
+ const parsedModel = parseVariantFromModelID(modelID, { allowMaxSuffix: true });
21222
+ const normalizedModelID = normalizeModelID(parsedModel.modelID).toLowerCase();
21056
21223
  for (const definition of HEURISTIC_MODEL_FAMILY_REGISTRY) {
21057
21224
  if (definition.pattern?.test(normalizedModelID)) {
21058
21225
  return definition;
@@ -21065,6 +21232,7 @@ function detectHeuristicModelFamily(modelID) {
21065
21232
  }
21066
21233
  var HEURISTIC_MODEL_FAMILY_REGISTRY;
21067
21234
  var init_model_capability_heuristics = __esm(() => {
21235
+ init_model_string_parser();
21068
21236
  HEURISTIC_MODEL_FAMILY_REGISTRY = [
21069
21237
  {
21070
21238
  family: "claude-opus",
@@ -21078,11 +21246,19 @@ var init_model_capability_heuristics = __esm(() => {
21078
21246
  variants: ["low", "medium", "high"],
21079
21247
  supportsThinking: true
21080
21248
  },
21249
+ {
21250
+ family: "openai-deep-research",
21251
+ includes: ["o3-deep-research", "o4-mini-deep-research"],
21252
+ variants: ["low", "medium", "high"],
21253
+ reasoningEfforts: ["none", "minimal", "low", "medium", "high"],
21254
+ supportsTemperature: true
21255
+ },
21081
21256
  {
21082
21257
  family: "openai-reasoning",
21083
21258
  pattern: /(?:^|\/)o\d(?:$|-)/,
21084
21259
  variants: ["low", "medium", "high"],
21085
- reasoningEfforts: ["none", "minimal", "low", "medium", "high"]
21260
+ reasoningEfforts: ["none", "minimal", "low", "medium", "high"],
21261
+ supportsTemperature: false
21086
21262
  },
21087
21263
  {
21088
21264
  family: "gpt-5",
@@ -21126,7 +21302,13 @@ var init_model_capability_heuristics = __esm(() => {
21126
21302
  {
21127
21303
  family: "glm",
21128
21304
  includes: ["glm"],
21129
- variants: ["low", "medium", "high"]
21305
+ variants: ["low", "medium", "high", "max"],
21306
+ reasoningEfforts: ["high", "max"],
21307
+ reasoningEffortAliases: {
21308
+ low: "high",
21309
+ medium: "high",
21310
+ xhigh: "max"
21311
+ }
21130
21312
  },
21131
21313
  {
21132
21314
  family: "minimax",
@@ -21161,14 +21343,6 @@ var init_model_capability_heuristics = __esm(() => {
21161
21343
  // packages/model-core/src/model-capability-guardrails.ts
21162
21344
  var init_model_capability_guardrails = () => {};
21163
21345
 
21164
- // packages/model-core/src/reasoning-level.ts
21165
- var REASONING_LEVELS2, REASONING_AUTO2 = "auto", REASONING_LEVEL_SET2, REASONING_LEVEL_OR_AUTO_SET2;
21166
- var init_reasoning_level = __esm(() => {
21167
- REASONING_LEVELS2 = ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
21168
- REASONING_LEVEL_SET2 = new Set(REASONING_LEVELS2);
21169
- REASONING_LEVEL_OR_AUTO_SET2 = new Set([...REASONING_LEVELS2, REASONING_AUTO2]);
21170
- });
21171
-
21172
21346
  // packages/model-core/src/model-settings-compatibility.ts
21173
21347
  var init_model_settings_compatibility = () => {};
21174
21348
 
@@ -21182,9 +21356,6 @@ function normalizeFallbackModels(models2) {
21182
21356
  }
21183
21357
  var init_model_resolver = () => {};
21184
21358
 
21185
- // packages/model-core/src/model-string-parser.ts
21186
- var init_model_string_parser = () => {};
21187
-
21188
21359
  // packages/model-core/src/fallback-chain-from-models.ts
21189
21360
  var init_fallback_chain_from_models = () => {};
21190
21361
 
@@ -21500,14 +21671,89 @@ function getProviderOverride(providerID, modelID) {
21500
21671
  return;
21501
21672
  return GITHUB_COPILOT_GPT5_MODEL.test(normalizeLookupModelID2(modelID)) ? GITHUB_COPILOT_GPT5_OVERRIDE : undefined;
21502
21673
  }
21674
+ function stripSameProviderPrefix(providerID, modelID) {
21675
+ const prefix = `${providerID.trim()}/`;
21676
+ return prefix !== "/" && modelID.slice(0, prefix.length).toLowerCase() === prefix.toLowerCase() ? modelID.slice(prefix.length) : undefined;
21677
+ }
21678
+ function buildLookupCandidates(providerID, modelID) {
21679
+ const bareModelID = parseVariantFromModelID(modelID, { allowMaxSuffix: true }).modelID;
21680
+ const candidates = [
21681
+ modelID,
21682
+ stripSameProviderPrefix(providerID, modelID),
21683
+ bareModelID,
21684
+ stripSameProviderPrefix(providerID, bareModelID)
21685
+ ];
21686
+ const uniqueCandidates = [];
21687
+ const seen = new Set;
21688
+ for (const candidate of candidates) {
21689
+ if (!candidate || seen.has(candidate))
21690
+ continue;
21691
+ seen.add(candidate);
21692
+ uniqueCandidates.push(candidate);
21693
+ }
21694
+ return uniqueCandidates;
21695
+ }
21696
+ function findProviderMetadata(providerCache, providerID, modelID) {
21697
+ if (!providerCache)
21698
+ return;
21699
+ for (const candidate of buildLookupCandidates(providerID, modelID)) {
21700
+ const match = providerCache.findProviderModelMetadata(providerID, candidate);
21701
+ if (match)
21702
+ return match;
21703
+ }
21704
+ return;
21705
+ }
21706
+ function findSnapshotEntry(snapshot, providerID, modelIDs) {
21707
+ if (!snapshot)
21708
+ return;
21709
+ const normalizedProviderID = providerID.trim();
21710
+ const providerSpecificCandidates = [];
21711
+ const generalCandidates = [];
21712
+ for (const modelID of modelIDs) {
21713
+ const strippedModelID = stripSameProviderPrefix(providerID, modelID);
21714
+ const unqualifiedModelID = strippedModelID ?? (modelID.includes("/") ? undefined : modelID);
21715
+ if (!unqualifiedModelID) {
21716
+ generalCandidates.push(...buildLookupCandidates(providerID, modelID));
21717
+ continue;
21718
+ }
21719
+ const bareModelID = parseVariantFromModelID(unqualifiedModelID, { allowMaxSuffix: true }).modelID;
21720
+ if (normalizedProviderID) {
21721
+ providerSpecificCandidates.push(`${normalizedProviderID}/${unqualifiedModelID}`, `${normalizedProviderID}/${bareModelID}`);
21722
+ }
21723
+ generalCandidates.push(unqualifiedModelID, bareModelID);
21724
+ }
21725
+ const seen = new Set;
21726
+ for (const candidate of [...providerSpecificCandidates, ...generalCandidates]) {
21727
+ if (seen.has(candidate))
21728
+ continue;
21729
+ seen.add(candidate);
21730
+ const entry = snapshot.models[candidate];
21731
+ if (entry)
21732
+ return entry;
21733
+ }
21734
+ return;
21735
+ }
21736
+ function resolveCapabilityModelAlias(modelID, providerID) {
21737
+ const direct = resolveModelIDAlias(modelID, providerID);
21738
+ if (direct.source !== "canonical")
21739
+ return direct;
21740
+ const bareModelID = parseVariantFromModelID(modelID, { allowMaxSuffix: true }).modelID;
21741
+ if (bareModelID === modelID)
21742
+ return direct;
21743
+ const bareAlias = resolveModelIDAlias(bareModelID, providerID);
21744
+ return bareAlias.source === "canonical" ? direct : { ...bareAlias, requestedModelID: modelID };
21745
+ }
21503
21746
  function getModelCapabilities(input) {
21504
- const canonicalization = resolveModelIDAlias(input.modelID, input.providerID);
21747
+ const canonicalization = resolveCapabilityModelAlias(input.modelID, input.providerID);
21505
21748
  const override = getOverride(input.modelID);
21506
21749
  const providerOverride = getProviderOverride(input.providerID, canonicalization.canonicalModelID);
21507
- const runtimeModel = readRuntimeModel(input.runtimeModel ?? input.providerCache?.findProviderModelMetadata(input.providerID, input.modelID));
21750
+ const runtimeModel = readRuntimeModel(input.runtimeModel ?? findProviderMetadata(input.providerCache, input.providerID, input.modelID));
21508
21751
  const runtimeSnapshot = input.runtimeSnapshot;
21509
21752
  const bundledSnapshot = input.bundledSnapshot;
21510
- const snapshotEntry = runtimeSnapshot?.models?.[canonicalization.canonicalModelID] ?? bundledSnapshot?.models?.[canonicalization.canonicalModelID];
21753
+ const snapshotModelIDs = canonicalization.source === "canonical" ? [input.modelID, canonicalization.canonicalModelID] : [canonicalization.canonicalModelID, input.modelID];
21754
+ const runtimeSnapshotEntry = findSnapshotEntry(runtimeSnapshot, input.providerID, snapshotModelIDs);
21755
+ const bundledSnapshotEntry = findSnapshotEntry(bundledSnapshot, input.providerID, snapshotModelIDs);
21756
+ const snapshotEntry = runtimeSnapshotEntry ?? bundledSnapshotEntry;
21511
21757
  const heuristicFamily = detectHeuristicModelFamily(canonicalization.canonicalModelID);
21512
21758
  const runtimeVariants = readRuntimeModelVariants(runtimeModel);
21513
21759
  const runtimeReasoning = readRuntimeModelReasoningSupport(runtimeModel);
@@ -21517,7 +21763,7 @@ function getModelCapabilities(input) {
21517
21763
  const runtimeMaxOutputTokens = readRuntimeModelLimitOutput(runtimeModel);
21518
21764
  const runtimeToolCall = readRuntimeModelToolCallSupport(runtimeModel);
21519
21765
  const runtimeModalities = readRuntimeModelModalities(runtimeModel);
21520
- const snapshotSource = runtimeSnapshot?.models?.[canonicalization.canonicalModelID] ? "runtime-snapshot" : bundledSnapshot?.models?.[canonicalization.canonicalModelID] ? "bundled-snapshot" : "none";
21766
+ const snapshotSource = runtimeSnapshotEntry ? "runtime-snapshot" : bundledSnapshotEntry ? "bundled-snapshot" : "none";
21521
21767
  const familySource = snapshotEntry?.family ? "snapshot" : heuristicFamily?.family ? "heuristic" : "none";
21522
21768
  const variantsSource = runtimeVariants ? "runtime" : providerOverride?.variants ? "override" : override?.variants ? "override" : heuristicFamily?.variants ? "heuristic" : "none";
21523
21769
  const reasoningEffortsSource = providerOverride?.reasoningEfforts ? "override" : override?.reasoningEfforts ? "override" : heuristicFamily?.reasoningEfforts ? "heuristic" : "none";
@@ -21566,6 +21812,7 @@ var MODEL_ID_OVERRIDES, GITHUB_COPILOT_GPT5_MODEL, GITHUB_COPILOT_GPT5_OVERRIDE;
21566
21812
  var init_get_model_capabilities = __esm(() => {
21567
21813
  init_model_capability_aliases();
21568
21814
  init_model_capability_heuristics();
21815
+ init_model_string_parser();
21569
21816
  MODEL_ID_OVERRIDES = {};
21570
21817
  GITHUB_COPILOT_GPT5_MODEL = /(?:^|\/)gpt-5(?:[.-]|$)/;
21571
21818
  GITHUB_COPILOT_GPT5_OVERRIDE = {
@@ -22169,7 +22416,7 @@ function recordFields(value, fields) {
22169
22416
  }
22170
22417
  function modelInput(view) {
22171
22418
  const agents = isPlainRecord(view.agents) ? Object.fromEntries(Object.entries(view.agents).flatMap(([name, definition]) => {
22172
- const fields = recordFields(definition, ["description", "prompt", "model", "variant", "reasoningEffort", "tools", "temperature", "disable"]);
22419
+ const fields = recordFields(definition, ["description", "prompt", "model", "models", "variant", "reasoningEffort", "tools", "temperature", "disable"]);
22173
22420
  return fields === undefined ? [] : [[name, fields]];
22174
22421
  })) : undefined;
22175
22422
  const categories = isPlainRecord(view.categories) ? Object.fromEntries(Object.entries(view.categories).flatMap(([name, definition]) => {
@@ -22452,6 +22699,7 @@ var init_agent_overrides = __esm(() => {
22452
22699
  init_permission();
22453
22700
  AgentOverrideConfigSchema = exports_external.object({
22454
22701
  model: exports_external.string().optional(),
22702
+ models: exports_external.array(exports_external.union([exports_external.string(), FallbackModelObjectSchema])).optional(),
22455
22703
  fallback_models: FallbackModelsSchema.optional(),
22456
22704
  reasoning: OmoReasoningSchema.optional(),
22457
22705
  variant: exports_external.string().optional(),
@@ -23370,6 +23618,37 @@ function protectUserFields(config4, userConfig) {
23370
23618
  }
23371
23619
  };
23372
23620
  }
23621
+ function materializeAgentModelChains(config4) {
23622
+ if (config4.agents === undefined)
23623
+ return config4;
23624
+ let changed = false;
23625
+ const agents = Object.fromEntries(Object.entries(config4.agents).map(([name, agent2]) => {
23626
+ if (agent2?.models === undefined)
23627
+ return [name, agent2];
23628
+ const [primary, ...fallbacks] = agent2.models;
23629
+ const {
23630
+ models: _models,
23631
+ model: _model,
23632
+ fallback_models: _fallbackModels,
23633
+ reasoning: _reasoning,
23634
+ variant: _variant,
23635
+ reasoningEffort: _reasoningEffort,
23636
+ temperature: _temperature,
23637
+ top_p: _topP,
23638
+ maxTokens: _maxTokens,
23639
+ thinking: _thinking,
23640
+ ...rest
23641
+ } = agent2;
23642
+ const primarySettings = primary === undefined ? {} : typeof primary === "string" ? { model: primary } : primary;
23643
+ changed = true;
23644
+ return [name, {
23645
+ ...rest,
23646
+ ...primarySettings,
23647
+ fallback_models: fallbacks
23648
+ }];
23649
+ }));
23650
+ return changed ? { ...config4, agents } : config4;
23651
+ }
23373
23652
  function migrateRalphLoopConfig(config4) {
23374
23653
  const legacy = config4.ralph_loop;
23375
23654
  if (legacy === undefined)
@@ -23397,7 +23676,7 @@ function validatePluginConfig(directory, environment2 = process.env) {
23397
23676
  const firstFailingView = views.find((view) => view.messages.length > 0);
23398
23677
  const firstView = views[0];
23399
23678
  const userConfig = parseConfig(chain.protectedUserView);
23400
- const config4 = applyDisabledProviders(protectUserFields(mergeViews(views), userConfig));
23679
+ const config4 = applyDisabledProviders(materializeAgentModelChains(protectUserFields(mergeViews(views), userConfig)));
23401
23680
  return {
23402
23681
  valid: messages.length === 0,
23403
23682
  messages,
@@ -70,6 +70,6 @@ node script/qa/web-terminal-visual-qa.mjs --title "Replay" \
70
70
  2. Store the output under `.omo/evidence/<YYYYMMDD>-<slug>/`.
71
71
  3. Review `terminal.txt` and `terminal-ansi.txt` for accidental secrets before citing them.
72
72
  4. Include `terminal.png`, `terminal.txt`, and `metadata.json` in the evidence summary.
73
- 5. Verify the cleanup receipt in `metadata.json`: no leftover pty, Chrome, PIDs, ports, or temp state.
73
+ 5. Review the cleanup receipt in `metadata.json`. It records the pty cleanup action and browser closure attempt; it does not audit ports, temporary state, or all leftover processes.
74
74
 
75
75
  Tests alone are not TUI visual QA. The passing artifact is the xterm.js-rendered `terminal.png` plus a binary observation - expected text present, colors correct, no overflow, no border or CJK-width misalignment.