oh-my-opencode 4.16.2 → 4.17.0

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 (234) hide show
  1. package/.agents/command/omomomo.md +1 -1
  2. package/.agents/skills/hyperplan/SKILL.md +3 -3
  3. package/.agents/skills/omomomo/SKILL.md +1 -1
  4. package/.agents/skills/pre-publish-review/SKILL.md +3 -0
  5. package/.opencode/command/omomomo.md +1 -1
  6. package/.opencode/skills/hyperplan/SKILL.md +3 -3
  7. package/.opencode/skills/pre-publish-review/SKILL.md +3 -0
  8. package/README.ja.md +4 -4
  9. package/README.ko.md +4 -4
  10. package/README.md +4 -4
  11. package/README.ru.md +4 -4
  12. package/README.zh-cn.md +4 -4
  13. package/dist/agents/hephaestus/agent.d.ts +1 -1
  14. package/dist/agents/hephaestus/gpt-5-6.d.ts +2 -0
  15. package/dist/agents/momus-gpt-5-6.d.ts +1 -0
  16. package/dist/agents/types.d.ts +2 -0
  17. package/dist/cli/index.js +947 -567
  18. package/dist/cli-node/index.js +947 -567
  19. package/dist/features/background-agent/error-classifier.d.ts +5 -0
  20. package/dist/features/builtin-commands/templates/refactor-sections/intro-and-analysis.d.ts +1 -1
  21. package/dist/features/builtin-commands/templates/remove-ai-slops.d.ts +1 -1
  22. package/dist/features/team-mode/test-support/async-test-helpers.d.ts +2 -2
  23. package/dist/index.js +523 -81
  24. package/dist/plugin/chat-message/types.d.ts +4 -0
  25. package/dist/plugin/command-execute-before.d.ts +1 -0
  26. package/dist/plugin/stop-continuation.d.ts +17 -0
  27. package/dist/shared/live-server-route.d.ts +1 -1
  28. package/dist/skills/remove-ai-slops/SKILL.md +2 -2
  29. package/dist/skills/review-work/SKILL.md +1 -1
  30. package/dist/skills/start-work/SKILL.md +5 -2
  31. package/dist/skills/ulw-plan/references/full-workflow.md +1 -1
  32. package/dist/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -2
  33. package/dist/skills/ulw-research/SKILL.md +2 -2
  34. package/dist/skills/visual-qa/SKILL.md +1 -1
  35. package/dist/tui.js +195 -41
  36. package/package.json +15 -14
  37. package/packages/git-bash-mcp/package.json +27 -0
  38. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +3 -1
  39. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +465 -248
  40. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  41. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  42. package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
  43. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  44. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  45. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  46. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  47. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/AGENTS.md +2 -2
  48. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/cli.js +6 -2
  49. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/codex-hook.js +6 -2
  50. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +2 -2
  51. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  52. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/codex-hook.ts +6 -2
  53. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/cli.test.ts +1 -1
  54. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +67 -2
  55. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  56. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  57. package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +0 -13
  58. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.6.md +93 -0
  59. package/packages/omo-codex/plugin/components/rules/dist/cli.js +43 -24
  60. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  61. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  62. package/packages/omo-codex/plugin/components/rules/src/codex-hook.ts +2 -1
  63. package/packages/omo-codex/plugin/components/rules/src/dynamic-target-fingerprints.ts +15 -6
  64. package/packages/omo-codex/plugin/components/rules/src/rules-engine-factory.ts +7 -2
  65. package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +2 -2
  66. package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +32 -0
  67. package/packages/omo-codex/plugin/components/rules/test/hephaestus-model-variant.test.ts +106 -0
  68. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
  69. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  70. package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +1 -79
  71. package/packages/omo-codex/plugin/components/teammode/AGENTS.md +12 -9
  72. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  73. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  74. package/packages/omo-codex/plugin/components/teammode/skills/teammode/SKILL.md +136 -76
  75. package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-guide.mjs +94 -23
  76. package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-state.mjs +94 -14
  77. package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-transport.mjs +55 -0
  78. package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team.mjs +72 -18
  79. package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +23 -0
  80. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  81. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  82. package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +23 -40
  83. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-clone-fidelity-reviewer.toml +1 -1
  84. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-code-reviewer.toml +3 -3
  85. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-gate-reviewer.toml +7 -7
  86. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-qa-executor.toml +5 -5
  87. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-high.toml +26 -0
  88. package/packages/omo-codex/plugin/components/ultrawork/agents/{lazycodex-executor.toml → lazycodex-worker-low.toml} +7 -5
  89. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-medium.toml +26 -0
  90. package/packages/omo-codex/plugin/components/ultrawork/agents/librarian.toml +20 -48
  91. package/packages/omo-codex/plugin/components/ultrawork/agents/metis.toml +17 -29
  92. package/packages/omo-codex/plugin/components/ultrawork/agents/momus.toml +20 -50
  93. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +22 -43
  94. package/packages/omo-codex/plugin/components/ultrawork/directive.md +55 -28
  95. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  96. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  97. package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +55 -28
  98. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +1 -1
  99. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -2
  100. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +22 -0
  101. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +0 -68
  102. package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +1 -1
  103. package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +2 -0
  104. package/packages/omo-codex/plugin/components/ulw-loop/README.md +3 -1
  105. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +55 -28
  106. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +6 -1
  107. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.d.ts +1 -1
  108. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.js +13 -2
  109. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +405 -25
  110. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +12 -1
  111. package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +4 -2
  112. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.d.ts +7 -0
  113. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +16 -1
  114. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.js +1 -0
  115. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.d.ts +6 -0
  116. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.js +20 -0
  117. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.d.ts +1 -0
  118. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +12 -9
  119. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.d.ts +3 -0
  120. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +148 -0
  121. package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.d.ts +2 -0
  122. package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +209 -0
  123. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +25 -2
  124. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  125. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +14 -15
  126. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +29 -27
  127. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +6 -1
  128. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-subcommands.ts +14 -3
  129. package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +10 -0
  130. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +12 -1
  131. package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +4 -2
  132. package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +27 -1
  133. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +1 -0
  134. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-verdicts.ts +23 -0
  135. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +16 -9
  136. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +138 -0
  137. package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +208 -0
  138. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-create-goals.test.ts +12 -0
  139. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +4 -1
  140. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +8 -35
  141. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/quality-gate-builder.ts +24 -13
  142. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +5 -2
  143. package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +43 -8
  144. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +55 -2
  145. package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +228 -0
  146. package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +193 -0
  147. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  148. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  149. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  150. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
  151. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  152. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  153. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  154. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  155. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  156. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +18 -0
  157. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  158. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  159. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  160. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
  161. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  162. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  163. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
  164. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +17 -0
  165. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
  166. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +2 -2
  167. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  168. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  169. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  170. package/packages/omo-codex/plugin/model-catalog.json +16 -7
  171. package/packages/omo-codex/plugin/package-lock.json +13 -13
  172. package/packages/omo-codex/plugin/package.json +1 -1
  173. package/packages/omo-codex/plugin/scripts/auto-update.mjs +9 -2
  174. package/packages/omo-codex/plugin/scripts/entry-guard.mjs +26 -0
  175. package/packages/omo-codex/plugin/scripts/materialize-shared-upstreams.mjs +3 -1
  176. package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +16 -7
  177. package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +39 -4
  178. package/packages/omo-codex/plugin/scripts/migrate-codex-config/subagent-limit-guard.mjs +24 -4
  179. package/packages/omo-codex/plugin/scripts/migrate-codex-config.mjs +3 -3
  180. package/packages/omo-codex/plugin/scripts/migrate-omo-sot.mjs +2 -2
  181. package/packages/omo-codex/plugin/scripts/sync-hook-status-messages.mjs +2 -2
  182. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +14 -6
  183. package/packages/omo-codex/plugin/scripts/sync-version.mjs +4 -2
  184. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +3 -3
  185. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +3 -3
  186. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +5 -5
  187. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +9 -3
  188. package/packages/omo-codex/plugin/skills/start-work/SKILL.md +6 -3
  189. package/packages/omo-codex/plugin/skills/teammode/SKILL.md +136 -76
  190. package/packages/omo-codex/plugin/skills/teammode/scripts/team-guide.mjs +94 -23
  191. package/packages/omo-codex/plugin/skills/teammode/scripts/team-state.mjs +94 -14
  192. package/packages/omo-codex/plugin/skills/teammode/scripts/team-transport.mjs +55 -0
  193. package/packages/omo-codex/plugin/skills/teammode/scripts/team.mjs +72 -18
  194. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +55 -28
  195. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +14 -15
  196. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +29 -27
  197. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +1 -1
  198. package/packages/omo-codex/plugin/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -2
  199. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +4 -4
  200. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +4 -4
  201. package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +116 -10
  202. package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +23 -2
  203. package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +1 -1
  204. package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +4 -4
  205. package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +4 -2
  206. package/packages/omo-codex/plugin/test/auto-update-restart-notice.test.mjs +33 -0
  207. package/packages/omo-codex/plugin/test/auto-update.test.mjs +4 -4
  208. package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +2 -2
  209. package/packages/omo-codex/plugin/test/lcx-bug-skills.test.mjs +4 -101
  210. package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +160 -23
  211. package/packages/omo-codex/plugin/test/multi-agent-v2-regression.test.mjs +71 -0
  212. package/packages/omo-codex/plugin/test/subagent-limit-migration.test.mjs +32 -0
  213. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +20 -2
  214. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +1 -1
  215. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +4 -2
  216. package/packages/omo-codex/plugin/test/teammode-transport.test.mjs +345 -0
  217. package/packages/omo-codex/plugin/test/ulw-plan-skill-contract.test.mjs +9 -40
  218. package/packages/omo-codex/plugin/test/ulw-research-skill-contract.test.mjs +4 -277
  219. package/packages/omo-codex/scripts/install-config-reasoning.test.mjs +5 -5
  220. package/packages/omo-codex/scripts/install-config.test.mjs +22 -3
  221. package/packages/omo-codex/scripts/install-dist/install-local.mjs +508 -286
  222. package/packages/omo-codex/scripts/install-generated-bundle.test.mjs +111 -1
  223. package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +2 -2
  224. package/packages/shared-skills/skills/review-work/SKILL.md +1 -1
  225. package/packages/shared-skills/skills/start-work/SKILL.md +5 -2
  226. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +1 -1
  227. package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -2
  228. package/packages/shared-skills/skills/ulw-research/SKILL.md +2 -2
  229. package/packages/shared-skills/skills/visual-qa/SKILL.md +1 -1
  230. package/dist/skills/visual-qa/scripts/skill-prompt-contract.test.ts +0 -296
  231. package/packages/omo-codex/plugin/components/ulw-loop/test/skill-contract.test.ts +0 -70
  232. package/packages/omo-codex/plugin/test/ulw-research-epistemic-contract.test.mjs +0 -98
  233. package/packages/shared-skills/skills/visual-qa/scripts/skill-prompt-contract.test.ts +0 -296
  234. /package/packages/omo-codex/plugin/components/rules/bundled-rules/{hephaestus.md → hephaestus/gpt-5.5.md} +0 -0
package/dist/index.js CHANGED
@@ -20933,6 +20933,11 @@ var AGENT_MODEL_REQUIREMENTS = {
20933
20933
  },
20934
20934
  hephaestus: {
20935
20935
  fallbackChain: [
20936
+ {
20937
+ providers: ["openai", "vercel"],
20938
+ model: "gpt-5.6-sol",
20939
+ variant: "medium"
20940
+ },
20936
20941
  {
20937
20942
  providers: ["openai", "github-copilot", "opencode", "vercel"],
20938
20943
  model: "gpt-5.5",
@@ -20959,7 +20964,7 @@ var AGENT_MODEL_REQUIREMENTS = {
20959
20964
  model: "claude-opus-4-7",
20960
20965
  variant: "max"
20961
20966
  },
20962
- { providers: ["opencode-go", "vercel"], model: "glm-5.1" }
20967
+ { providers: ["opencode-go", "vercel"], model: "glm-5.2" }
20963
20968
  ]
20964
20969
  },
20965
20970
  librarian: {
@@ -21006,7 +21011,7 @@ var AGENT_MODEL_REQUIREMENTS = {
21006
21011
  model: "gpt-5.5",
21007
21012
  variant: "high"
21008
21013
  },
21009
- { providers: ["opencode-go", "vercel"], model: "glm-5.1" },
21014
+ { providers: ["opencode-go", "vercel"], model: "glm-5.2" },
21010
21015
  {
21011
21016
  providers: ["google", "github-copilot", "opencode", "vercel"],
21012
21017
  model: "gemini-3.1-pro"
@@ -21029,12 +21034,17 @@ var AGENT_MODEL_REQUIREMENTS = {
21029
21034
  model: "gpt-5.5",
21030
21035
  variant: "high"
21031
21036
  },
21032
- { providers: ["opencode-go", "vercel"], model: "glm-5.1" },
21037
+ { providers: ["opencode-go", "vercel"], model: "glm-5.2" },
21033
21038
  { providers: ["kimi-for-coding"], model: "k2p5" }
21034
21039
  ]
21035
21040
  },
21036
21041
  momus: {
21037
21042
  fallbackChain: [
21043
+ {
21044
+ providers: ["openai", "vercel"],
21045
+ model: "gpt-5.6-sol",
21046
+ variant: "xhigh"
21047
+ },
21038
21048
  {
21039
21049
  providers: ["openai", "github-copilot", "opencode", "vercel"],
21040
21050
  model: "gpt-5.5",
@@ -21050,7 +21060,7 @@ var AGENT_MODEL_REQUIREMENTS = {
21050
21060
  model: "gemini-3.1-pro",
21051
21061
  variant: "high"
21052
21062
  },
21053
- { providers: ["opencode-go", "vercel"], model: "glm-5.1" }
21063
+ { providers: ["opencode-go", "vercel"], model: "glm-5.2" }
21054
21064
  ]
21055
21065
  },
21056
21066
  atlas: {
@@ -21098,12 +21108,17 @@ var CATEGORY_MODEL_REQUIREMENTS = {
21098
21108
  model: "claude-opus-4-7",
21099
21109
  variant: "max"
21100
21110
  },
21101
- { providers: ["opencode-go", "vercel"], model: "glm-5.1" },
21111
+ { providers: ["opencode-go", "vercel"], model: "glm-5.2" },
21102
21112
  { providers: ["kimi-for-coding"], model: "k2p5" }
21103
21113
  ]
21104
21114
  },
21105
21115
  ultrabrain: {
21106
21116
  fallbackChain: [
21117
+ {
21118
+ providers: ["openai", "vercel"],
21119
+ model: "gpt-5.6-sol",
21120
+ variant: "xhigh"
21121
+ },
21107
21122
  {
21108
21123
  providers: ["openai", "opencode", "vercel"],
21109
21124
  model: "gpt-5.5",
@@ -21119,11 +21134,21 @@ var CATEGORY_MODEL_REQUIREMENTS = {
21119
21134
  model: "claude-opus-4-7",
21120
21135
  variant: "max"
21121
21136
  },
21122
- { providers: ["opencode-go", "vercel"], model: "glm-5.1" }
21137
+ { providers: ["opencode-go", "vercel"], model: "glm-5.2" }
21123
21138
  ]
21124
21139
  },
21125
21140
  deep: {
21126
21141
  fallbackChain: [
21142
+ {
21143
+ providers: ["openai", "vercel"],
21144
+ model: "gpt-5.6-terra",
21145
+ variant: "xhigh"
21146
+ },
21147
+ {
21148
+ providers: ["openai", "vercel"],
21149
+ model: "gpt-5.6-sol",
21150
+ variant: "high"
21151
+ },
21127
21152
  {
21128
21153
  providers: ["openai", "github-copilot", "opencode", "vercel"],
21129
21154
  model: "gpt-5.5",
@@ -21140,7 +21165,7 @@ var CATEGORY_MODEL_REQUIREMENTS = {
21140
21165
  variant: "high"
21141
21166
  },
21142
21167
  { providers: ["opencode-go", "vercel"], model: "kimi-k2.6" },
21143
- { providers: ["opencode-go", "vercel"], model: "glm-5.1" }
21168
+ { providers: ["opencode-go", "vercel"], model: "glm-5.2" }
21144
21169
  ]
21145
21170
  },
21146
21171
  artistry: {
@@ -21157,7 +21182,7 @@ var CATEGORY_MODEL_REQUIREMENTS = {
21157
21182
  },
21158
21183
  { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5.5" },
21159
21184
  { providers: ["opencode-go", "vercel"], model: "kimi-k2.6" },
21160
- { providers: ["opencode-go", "vercel"], model: "glm-5.1" }
21185
+ { providers: ["opencode-go", "vercel"], model: "glm-5.2" }
21161
21186
  ]
21162
21187
  },
21163
21188
  quick: {
@@ -21182,6 +21207,11 @@ var CATEGORY_MODEL_REQUIREMENTS = {
21182
21207
  },
21183
21208
  "unspecified-low": {
21184
21209
  fallbackChain: [
21210
+ {
21211
+ providers: ["openai", "vercel"],
21212
+ model: "gpt-5.6-luna",
21213
+ variant: "xhigh"
21214
+ },
21185
21215
  {
21186
21216
  providers: ["anthropic", "github-copilot", "opencode", "vercel"],
21187
21217
  model: "claude-sonnet-4-6"
@@ -21215,7 +21245,7 @@ var CATEGORY_MODEL_REQUIREMENTS = {
21215
21245
  },
21216
21246
  { providers: ["zai-coding-plan", "opencode", "bailian-coding-plan", "vercel"], model: "glm-5" },
21217
21247
  { providers: ["kimi-for-coding"], model: "k2p5" },
21218
- { providers: ["opencode-go", "vercel"], model: "glm-5.1" },
21248
+ { providers: ["opencode-go", "vercel"], model: "glm-5.2" },
21219
21249
  { providers: ["opencode", "bailian-coding-plan", "vercel"], model: "kimi-k2.5" },
21220
21250
  {
21221
21251
  providers: [
@@ -22567,6 +22597,54 @@ var SUPPLEMENTAL_MODEL_CAPABILITIES = {
22567
22597
  output: 262144
22568
22598
  }
22569
22599
  },
22600
+ "gpt-5.6-sol": {
22601
+ id: "gpt-5.6-sol",
22602
+ family: "gpt",
22603
+ reasoning: true,
22604
+ temperature: false,
22605
+ toolCall: true,
22606
+ modalities: {
22607
+ input: ["text", "image", "pdf"],
22608
+ output: ["text"]
22609
+ },
22610
+ limit: {
22611
+ context: 1050000,
22612
+ input: 922000,
22613
+ output: 128000
22614
+ }
22615
+ },
22616
+ "gpt-5.6-terra": {
22617
+ id: "gpt-5.6-terra",
22618
+ family: "gpt-mini",
22619
+ reasoning: true,
22620
+ temperature: false,
22621
+ toolCall: true,
22622
+ modalities: {
22623
+ input: ["text", "image", "pdf"],
22624
+ output: ["text"]
22625
+ },
22626
+ limit: {
22627
+ context: 1050000,
22628
+ input: 922000,
22629
+ output: 128000
22630
+ }
22631
+ },
22632
+ "gpt-5.6-luna": {
22633
+ id: "gpt-5.6-luna",
22634
+ family: "gpt-nano",
22635
+ reasoning: true,
22636
+ temperature: false,
22637
+ toolCall: true,
22638
+ modalities: {
22639
+ input: ["text", "image", "pdf"],
22640
+ output: ["text"]
22641
+ },
22642
+ limit: {
22643
+ context: 1050000,
22644
+ input: 922000,
22645
+ output: 128000
22646
+ }
22647
+ },
22570
22648
  "gpt-5.5": {
22571
22649
  id: "gpt-5.5",
22572
22650
  family: "gpt",
@@ -23470,28 +23548,6 @@ function truncateDescription(description, maxLength = 120) {
23470
23548
  }
23471
23549
 
23472
23550
  // packages/omo-opencode/src/tools/delegate-task/anthropic-categories.ts
23473
- var UNSPECIFIED_LOW_CATEGORY_PROMPT_APPEND = `<Category_Context>
23474
- You are working on tasks that don't fit specific categories but require moderate effort.
23475
-
23476
- <Selection_Gate>
23477
- BEFORE selecting this category, VERIFY ALL conditions:
23478
- 1. Task does NOT fit: quick (trivial), visual-engineering (UI), ultrabrain (deep logic), artistry (creative), writing (docs)
23479
- 2. Task requires more than trivial effort but is NOT system-wide
23480
- 3. Scope is contained within a few files/modules
23481
-
23482
- If task fits ANY other category, DO NOT select unspecified-low.
23483
- This is NOT a default choice - it's for genuinely unclassifiable moderate-effort work.
23484
- </Selection_Gate>
23485
- </Category_Context>
23486
-
23487
- <Caller_Warning>
23488
- THIS CATEGORY USES A MID-TIER MODEL (claude-sonnet-4-6).
23489
-
23490
- **PROVIDE CLEAR STRUCTURE:**
23491
- 1. MUST DO: Enumerate required actions explicitly
23492
- 2. MUST NOT DO: State forbidden actions to prevent scope creep
23493
- 3. EXPECTED OUTPUT: Define concrete success criteria
23494
- </Caller_Warning>`;
23495
23551
  var UNSPECIFIED_HIGH_CATEGORY_PROMPT_APPEND = `<Category_Context>
23496
23552
  You are working on tasks that don't fit specific categories but require substantial effort.
23497
23553
 
@@ -23507,12 +23563,6 @@ If task is unclassifiable but moderate-effort, use unspecified-low instead.
23507
23563
  </Selection_Gate>
23508
23564
  </Category_Context>`;
23509
23565
  var ANTHROPIC_CATEGORIES = [
23510
- {
23511
- name: "unspecified-low",
23512
- config: { model: "anthropic/claude-sonnet-4-6" },
23513
- description: "Tasks that don't fit other categories, low effort required",
23514
- promptAppend: UNSPECIFIED_LOW_CATEGORY_PROMPT_APPEND
23515
- },
23516
23566
  {
23517
23567
  name: "unspecified-high",
23518
23568
  config: { model: "anthropic/claude-opus-4-7", variant: "max" },
@@ -23696,6 +23746,10 @@ function isGpt5_5Model(model) {
23696
23746
  const modelName = extractModelName2(model).toLowerCase();
23697
23747
  return modelName.includes("gpt-5.5") || modelName.includes("gpt-5-5");
23698
23748
  }
23749
+ function isGpt5_6Model(model) {
23750
+ const modelName = extractModelName2(model).toLowerCase();
23751
+ return modelName.includes("gpt-5.6") || modelName.includes("gpt-5-6");
23752
+ }
23699
23753
 
23700
23754
  // packages/omo-opencode/src/tools/delegate-task/openai-categories.ts
23701
23755
  var ULTRABRAIN_CATEGORY_PROMPT_APPEND = `<Category_Context>
@@ -23761,7 +23815,7 @@ The orchestrator chose this category because the task benefits from depth over s
23761
23815
  **Status cadence: sparse.** The user is not on the other side of this conversation; the orchestrator is, and they will synthesize your progress. Send commentary only at meaningful phase transitions (starting exploration, starting implementation, starting verification, hitting a genuine blocker). Do not narrate every tool call; silence during focused work is expected.
23762
23816
  </Category_Context>`;
23763
23817
  function resolveDeepCategoryPromptAppend(model) {
23764
- if (model && isGpt5_5Model(model)) {
23818
+ if (model && (isGpt5_5Model(model) || isGpt5_6Model(model))) {
23765
23819
  return DEEP_CATEGORY_PROMPT_APPEND_GPT_5_5;
23766
23820
  }
23767
23821
  return DEEP_CATEGORY_PROMPT_APPEND;
@@ -23816,16 +23870,38 @@ EXPECTED OUTPUT:
23816
23870
 
23817
23871
  If your prompt lacks this structure, REWRITE IT before delegating.
23818
23872
  </Caller_Warning>`;
23873
+ var UNSPECIFIED_LOW_CATEGORY_PROMPT_APPEND = `<Category_Context>
23874
+ You are working on tasks that don't fit specific categories but require moderate effort.
23875
+
23876
+ <Selection_Gate>
23877
+ BEFORE selecting this category, VERIFY ALL conditions:
23878
+ 1. Task does NOT fit: quick (trivial), visual-engineering (UI), ultrabrain (deep logic), artistry (creative), writing (docs)
23879
+ 2. Task requires more than trivial effort but is NOT system-wide
23880
+ 3. Scope is contained within a few files/modules
23881
+
23882
+ If task fits ANY other category, DO NOT select unspecified-low.
23883
+ This is NOT a default choice - it's for genuinely unclassifiable moderate-effort work.
23884
+ </Selection_Gate>
23885
+ </Category_Context>
23886
+
23887
+ <Caller_Warning>
23888
+ THIS CATEGORY USES A LIGHTWEIGHT MODEL (gpt-5.6-luna).
23889
+
23890
+ **PROVIDE CLEAR STRUCTURE:**
23891
+ 1. MUST DO: Enumerate required actions explicitly
23892
+ 2. MUST NOT DO: State forbidden actions to prevent scope creep
23893
+ 3. EXPECTED OUTPUT: Define concrete success criteria
23894
+ </Caller_Warning>`;
23819
23895
  var OPENAI_CATEGORIES = [
23820
23896
  {
23821
23897
  name: "ultrabrain",
23822
- config: { model: "openai/gpt-5.5", variant: "xhigh" },
23898
+ config: { model: "openai/gpt-5.6-sol", variant: "xhigh" },
23823
23899
  description: "Use ONLY for genuinely hard, logic-heavy tasks. Give clear goals only, not step-by-step instructions.",
23824
23900
  promptAppend: ULTRABRAIN_CATEGORY_PROMPT_APPEND
23825
23901
  },
23826
23902
  {
23827
23903
  name: "deep",
23828
- config: { model: "openai/gpt-5.5", variant: "medium" },
23904
+ config: { model: "openai/gpt-5.6-terra", variant: "xhigh" },
23829
23905
  description: "Goal-oriented autonomous problem-solving on hairy problems requiring deep research. ONE goal + ONE deliverable per call \u2014 multiple goals must fan out as parallel `deep` calls, never bundled into one.",
23830
23906
  promptAppend: DEEP_CATEGORY_PROMPT_APPEND,
23831
23907
  resolvePromptAppend: resolveDeepCategoryPromptAppend
@@ -23835,6 +23911,12 @@ var OPENAI_CATEGORIES = [
23835
23911
  config: { model: "openai/gpt-5.4-mini" },
23836
23912
  description: "Trivial tasks - single file changes, typo fixes, simple modifications",
23837
23913
  promptAppend: QUICK_CATEGORY_PROMPT_APPEND
23914
+ },
23915
+ {
23916
+ name: "unspecified-low",
23917
+ config: { model: "openai/gpt-5.6-luna", variant: "xhigh" },
23918
+ description: "Tasks that don't fit other categories, low effort required",
23919
+ promptAppend: UNSPECIFIED_LOW_CATEGORY_PROMPT_APPEND
23838
23920
  }
23839
23921
  ];
23840
23922
 
@@ -78000,6 +78082,7 @@ function injectServerAuthIntoClient(client3) {
78000
78082
  init_logger2();
78001
78083
  var PROBE_TTL_MS = 60000;
78002
78084
  var PROBE_ABORT_MS = 1500;
78085
+ var AFFINITY_TTL_MS = 60000;
78003
78086
  var registrations = new Map;
78004
78087
  var lastRegistration;
78005
78088
  var liveParentWakeRoutingDisabled = false;
@@ -78017,7 +78100,9 @@ function initLiveServerRoute(opts) {
78017
78100
  available: undefined,
78018
78101
  probeTimestamp: 0,
78019
78102
  inFlightProbe: undefined,
78020
- warnedOnce: false
78103
+ warnedOnce: false,
78104
+ sessionAffinity: new Map,
78105
+ inFlightAffinity: new Map
78021
78106
  };
78022
78107
  registrations.set(opts.inProcessClient, registration);
78023
78108
  lastRegistration = registration;
@@ -78071,6 +78156,66 @@ async function probe(registration) {
78071
78156
  return false;
78072
78157
  }
78073
78158
  }
78159
+ async function probeSessionAffinity(registration, sessionID) {
78160
+ if (!registration.serverUrl) {
78161
+ return;
78162
+ }
78163
+ const probeUrl = new URL(`/session/${sessionID}`, registration.serverUrl);
78164
+ const authHeader = getServerBasicAuthHeader();
78165
+ const headers = authHeader ? { Authorization: authHeader } : {};
78166
+ try {
78167
+ const controller = new AbortController;
78168
+ const timeoutId = setTimeout(() => controller.abort(), PROBE_ABORT_MS);
78169
+ let response;
78170
+ try {
78171
+ response = await getFetch()(probeUrl, { headers, signal: controller.signal });
78172
+ } finally {
78173
+ clearTimeout(timeoutId);
78174
+ }
78175
+ if (response.ok) {
78176
+ setSessionAffinity(registration, sessionID, true);
78177
+ return true;
78178
+ }
78179
+ if (response.status === 404) {
78180
+ setSessionAffinity(registration, sessionID, false);
78181
+ log2("[live-server-route] live listener does not own session; falling back to in-process client", { sessionID });
78182
+ return false;
78183
+ }
78184
+ return;
78185
+ } catch {
78186
+ return;
78187
+ }
78188
+ }
78189
+ function setSessionAffinity(registration, sessionID, owned) {
78190
+ const now = Date.now();
78191
+ for (const [key, entry] of registration.sessionAffinity) {
78192
+ if (now - entry.timestamp >= AFFINITY_TTL_MS) {
78193
+ registration.sessionAffinity.delete(key);
78194
+ }
78195
+ }
78196
+ registration.sessionAffinity.set(sessionID, { owned, timestamp: now });
78197
+ }
78198
+ function getFreshSessionAffinity(registration, sessionID) {
78199
+ const entry = registration.sessionAffinity.get(sessionID);
78200
+ if (!entry || Date.now() - entry.timestamp >= AFFINITY_TTL_MS) {
78201
+ return;
78202
+ }
78203
+ return entry.owned;
78204
+ }
78205
+ async function resolveSessionAffinity(registration, sessionID) {
78206
+ const cached = getFreshSessionAffinity(registration, sessionID);
78207
+ if (cached !== undefined) {
78208
+ return cached;
78209
+ }
78210
+ let inFlight = registration.inFlightAffinity.get(sessionID);
78211
+ if (!inFlight) {
78212
+ inFlight = probeSessionAffinity(registration, sessionID).finally(() => {
78213
+ registration.inFlightAffinity.delete(sessionID);
78214
+ });
78215
+ registration.inFlightAffinity.set(sessionID, inFlight);
78216
+ }
78217
+ return inFlight;
78218
+ }
78074
78219
  function getFreshProbeAvailability(registration) {
78075
78220
  const available = registration.available;
78076
78221
  if (available === undefined || Date.now() - registration.probeTimestamp >= PROBE_TTL_MS) {
@@ -78123,6 +78268,13 @@ function tryResolveDispatchClientSync2(client3, sessionID) {
78123
78268
  if (!freshAvailability) {
78124
78269
  return { client: client3, route: "in-process", reason: "unavailable" };
78125
78270
  }
78271
+ const cachedAffinity = getFreshSessionAffinity(registration, sessionID);
78272
+ if (cachedAffinity === undefined) {
78273
+ return;
78274
+ }
78275
+ if (!cachedAffinity) {
78276
+ return { client: client3, route: "in-process", reason: "affinity" };
78277
+ }
78126
78278
  const resolvedLiveClient = getOrBuildLiveClient(registration);
78127
78279
  if (!resolvedLiveClient) {
78128
78280
  return { client: client3, route: "in-process", reason: "unavailable" };
@@ -78142,6 +78294,10 @@ async function resolveDispatchClient2(client3, sessionID) {
78142
78294
  if (!isAvailable) {
78143
78295
  return { client: client3, route: "in-process", reason: "unavailable" };
78144
78296
  }
78297
+ const affinity = await resolveSessionAffinity(registration, sessionID);
78298
+ if (affinity === false) {
78299
+ return { client: client3, route: "in-process", reason: "affinity" };
78300
+ }
78145
78301
  const resolvedLiveClient = getOrBuildLiveClient(registration);
78146
78302
  if (!resolvedLiveClient) {
78147
78303
  return { client: client3, route: "in-process", reason: "unavailable" };
@@ -78179,6 +78335,7 @@ function markLiveRouteUnavailable2(reason) {
78179
78335
  for (const registration of registrations.values()) {
78180
78336
  registration.available = false;
78181
78337
  registration.probeTimestamp = Date.now();
78338
+ registration.sessionAffinity.clear();
78182
78339
  }
78183
78340
  log2(`[live-server-route] marked unavailable: ${reason}`);
78184
78341
  }
@@ -89498,7 +89655,7 @@ function getCachedVersion(options = {}) {
89498
89655
  // package.json
89499
89656
  var package_default = {
89500
89657
  name: "oh-my-opencode",
89501
- version: "4.16.2",
89658
+ version: "4.17.0",
89502
89659
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
89503
89660
  main: "./dist/index.js",
89504
89661
  types: "dist/index.d.ts",
@@ -89561,6 +89718,7 @@ var package_default = {
89561
89718
  "packages/lsp-tools-mcp/dist",
89562
89719
  "packages/lsp-daemon/package.json",
89563
89720
  "packages/lsp-daemon/dist",
89721
+ "packages/git-bash-mcp/package.json",
89564
89722
  "packages/git-bash-mcp/dist",
89565
89723
  "packages/shared-skills/package.json",
89566
89724
  "packages/shared-skills/index.mjs",
@@ -89626,7 +89784,7 @@ var package_default = {
89626
89784
  "typecheck:packages": "tsgo --noEmit -p packages/rules-engine/tsconfig.json && tsgo --noEmit -p packages/delegate-core/tsconfig.json && tsgo --noEmit -p packages/mcp-stdio-core/tsconfig.json && tsgo --noEmit -p packages/mcp-client-core/tsconfig.json && tsgo --noEmit -p packages/git-bash-mcp/tsconfig.json && tsgo --noEmit -p packages/lsp-core/tsconfig.json && tsgo --noEmit -p packages/utils/tsconfig.json && tsgo --noEmit -p packages/model-core/tsconfig.json && tsgo --noEmit -p packages/omo-config-core/tsconfig.json && tsgo --noEmit -p packages/prompts-core/tsconfig.json && tsgo --noEmit -p packages/comment-checker-core/tsconfig.json && tsgo --noEmit -p packages/hashline-core/tsconfig.json && tsgo --noEmit -p packages/tmux-core/tsconfig.json && tsgo --noEmit -p packages/team-core/tsconfig.json && tsgo --noEmit -p packages/openclaw-core/tsconfig.json && tsgo --noEmit -p packages/boulder-state/tsconfig.json && tsgo --noEmit -p packages/telemetry-core/tsconfig.json && tsgo --noEmit -p packages/claude-code-compat-core/tsconfig.json && tsgo --noEmit -p packages/skills-loader-core/tsconfig.json && tsgo --noEmit -p packages/agents-md-core/tsconfig.json && tsgo --noEmit -p packages/omo-codex/plugin/shared/tsconfig.json && tsgo --noEmit -p packages/omo-codex/tsconfig.json && tsgo --noEmit -p packages/omo-senpi/tsconfig.json && tsgo --noEmit -p packages/senpi-task/tsconfig.json && tsgo --noEmit -p packages/pi-goal/tsconfig.json && tsgo --noEmit -p packages/pi-webfetch/tsconfig.json && tsgo --noEmit -p packages/omo-opencode/tsconfig.json",
89627
89785
  "typecheck:script": "tsgo --noEmit -p script/tsconfig.json",
89628
89786
  test: "bun test",
89629
- "test:codex": "bun run build:codex-install && bun run build:git-bash-mcp && bun run build:lsp-tools-mcp && bun run build:lsp-daemon && npm --prefix packages/lsp-tools-mcp test && npm --prefix packages/omo-codex/plugin ci && bun run --cwd packages/omo-codex/plugin build && npm --prefix packages/omo-codex/plugin/components/codegraph run typecheck && npm --prefix packages/omo-codex/plugin/components/codegraph test && node scripts/check-third-party-notices.mjs --ship && bun test packages/omo-opencode/src/cli/cli-installer.platform.test.ts packages/omo-codex/src/install/codex-cache.test.ts packages/omo-codex/src/install/codex-cleanup.test.ts packages/omo-codex/src/install/codex-config-agent-cleanup.test.ts packages/omo-codex/src/install/codex-config-autonomous-features.test.ts packages/omo-codex/src/install/codex-config-reasoning.test.ts packages/omo-codex/src/install/codex-config-toml.test.ts packages/omo-codex/src/install/codex-project-local-cleanup.test.ts packages/omo-codex/src/install/install-codex-project-local-cleanup.test.ts packages/omo-codex/src/install/install-codex.test.ts packages/omo-codex/src/install/install-codex-packaged.test.ts packages/omo-codex/src/install/link-cached-plugin-agents.test.ts packages/omo-codex/src/**/*.test.ts packages/utils/src/jsonc-parser.test.ts packages/utils/src/frontmatter.test.ts packages/hashline-core/src/hash-computation.test.ts packages/hashline-core/src/smoke-untested-modules.test.ts packages/rules-engine/src/index.test.ts packages/rules-engine/src/security-boundary.test.ts packages/agents-md-core/src/injector.test.ts packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts && node --test packages/omo-codex/plugin/test/*.test.mjs packages/omo-codex/scripts/install-cache-copy.test.mjs packages/omo-codex/scripts/install-cli-args.test.mjs packages/omo-codex/scripts/install-delegated-command.test.mjs packages/omo-codex/scripts/install-config-autonomous-features.test.mjs packages/omo-codex/scripts/install-config-autonomous.test.mjs packages/omo-codex/scripts/install-config-reasoning.test.mjs packages/omo-codex/scripts/install-config.test.mjs packages/omo-codex/scripts/install-hook-targets.test.mjs packages/omo-codex/scripts/install-project-local-cleanup.test.mjs packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs packages/omo-codex/scripts/install-local-entrypoint.test.mjs packages/omo-codex/scripts/install-local-git-bash-preflight.test.mjs packages/omo-codex/scripts/install-local.test.mjs packages/omo-codex/scripts/install-marketplace-cache.test.mjs packages/omo-codex/scripts/install-mcp-context7-runtime.test.mjs packages/omo-codex/scripts/install-mcp-runtime.test.mjs packages/omo-codex/scripts/install-packaged-local.test.mjs packages/omo-codex/scripts/install-generated-bundle.test.mjs packages/omo-codex/scripts/install-agent-links.test.mjs packages/omo-codex/scripts/install-bin-links.test.mjs",
89787
+ "test:codex": "bun run build:codex-install && bun run build:git-bash-mcp && bun run build:lsp-tools-mcp && bun run build:lsp-daemon && npm --prefix packages/lsp-tools-mcp test && npm --prefix packages/omo-codex/plugin ci && npm --prefix packages/omo-codex/plugin/components/ulw-loop test && bun run --cwd packages/omo-codex/plugin build && npm --prefix packages/omo-codex/plugin/components/codegraph run typecheck && npm --prefix packages/omo-codex/plugin/components/codegraph test && node scripts/check-third-party-notices.mjs --ship && bun test packages/omo-opencode/src/cli/cli-installer.platform.test.ts packages/omo-codex/src/install/codex-cache.test.ts packages/omo-codex/src/install/codex-cleanup.test.ts packages/omo-codex/src/install/codex-config-agent-cleanup.test.ts packages/omo-codex/src/install/codex-config-autonomous-features.test.ts packages/omo-codex/src/install/codex-config-reasoning.test.ts packages/omo-codex/src/install/codex-config-toml.test.ts packages/omo-codex/src/install/codex-project-local-cleanup.test.ts packages/omo-codex/src/install/install-codex-project-local-cleanup.test.ts packages/omo-codex/src/install/install-codex.test.ts packages/omo-codex/src/install/install-codex-packaged.test.ts packages/omo-codex/src/install/link-cached-plugin-agents.test.ts packages/omo-codex/src/**/*.test.ts packages/utils/src/jsonc-parser.test.ts packages/utils/src/frontmatter.test.ts packages/hashline-core/src/hash-computation.test.ts packages/hashline-core/src/smoke-untested-modules.test.ts packages/rules-engine/src/index.test.ts packages/rules-engine/src/security-boundary.test.ts packages/agents-md-core/src/injector.test.ts packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts && node --test packages/omo-codex/plugin/test/*.test.mjs packages/omo-codex/scripts/install-cache-copy.test.mjs packages/omo-codex/scripts/install-cli-args.test.mjs packages/omo-codex/scripts/install-delegated-command.test.mjs packages/omo-codex/scripts/install-config-autonomous-features.test.mjs packages/omo-codex/scripts/install-config-autonomous.test.mjs packages/omo-codex/scripts/install-config-reasoning.test.mjs packages/omo-codex/scripts/install-config.test.mjs packages/omo-codex/scripts/install-hook-targets.test.mjs packages/omo-codex/scripts/install-project-local-cleanup.test.mjs packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs packages/omo-codex/scripts/install-local-entrypoint.test.mjs packages/omo-codex/scripts/install-local-git-bash-preflight.test.mjs packages/omo-codex/scripts/install-local.test.mjs packages/omo-codex/scripts/install-marketplace-cache.test.mjs packages/omo-codex/scripts/install-mcp-context7-runtime.test.mjs packages/omo-codex/scripts/install-mcp-runtime.test.mjs packages/omo-codex/scripts/install-packaged-local.test.mjs packages/omo-codex/scripts/install-generated-bundle.test.mjs packages/omo-codex/scripts/install-agent-links.test.mjs packages/omo-codex/scripts/install-bin-links.test.mjs",
89630
89788
  "test:senpi": "node packages/omo-senpi/plugin/scripts/build-extension.mjs && node packages/omo-senpi/plugin/scripts/sync-skills.mjs && node packages/omo-senpi/plugin/scripts/embed-directive.mjs --check && bun test packages/omo-senpi",
89631
89789
  "test:windows-codex": "bun run test:codex",
89632
89790
  "build:git-bash-mcp": "bun run --cwd packages/git-bash-mcp build"
@@ -89708,18 +89866,18 @@ var package_default = {
89708
89866
  typescript: "^6.0.3"
89709
89867
  },
89710
89868
  optionalDependencies: {
89711
- "oh-my-opencode-darwin-arm64": "4.16.2",
89712
- "oh-my-opencode-darwin-x64": "4.16.2",
89713
- "oh-my-opencode-darwin-x64-baseline": "4.16.2",
89714
- "oh-my-opencode-linux-arm64": "4.16.2",
89715
- "oh-my-opencode-linux-arm64-musl": "4.16.2",
89716
- "oh-my-opencode-linux-x64": "4.16.2",
89717
- "oh-my-opencode-linux-x64-baseline": "4.16.2",
89718
- "oh-my-opencode-linux-x64-musl": "4.16.2",
89719
- "oh-my-opencode-linux-x64-musl-baseline": "4.16.2",
89720
- "oh-my-opencode-windows-arm64": "4.16.2",
89721
- "oh-my-opencode-windows-x64": "4.16.2",
89722
- "oh-my-opencode-windows-x64-baseline": "4.16.2"
89869
+ "oh-my-opencode-darwin-arm64": "4.17.0",
89870
+ "oh-my-opencode-darwin-x64": "4.17.0",
89871
+ "oh-my-opencode-darwin-x64-baseline": "4.17.0",
89872
+ "oh-my-opencode-linux-arm64": "4.17.0",
89873
+ "oh-my-opencode-linux-arm64-musl": "4.17.0",
89874
+ "oh-my-opencode-linux-x64": "4.17.0",
89875
+ "oh-my-opencode-linux-x64-baseline": "4.17.0",
89876
+ "oh-my-opencode-linux-x64-musl": "4.17.0",
89877
+ "oh-my-opencode-linux-x64-musl-baseline": "4.17.0",
89878
+ "oh-my-opencode-windows-arm64": "4.17.0",
89879
+ "oh-my-opencode-windows-x64": "4.17.0",
89880
+ "oh-my-opencode-windows-x64-baseline": "4.17.0"
89723
89881
  },
89724
89882
  overrides: {
89725
89883
  "@earendil-works/pi-agent-core": "0.80.3",
@@ -94801,10 +94959,10 @@ Trigger when ANY apply: user said "\uC5C4\uBC00" / "strictly" / "rigorously" / "
94801
94959
 
94802
94960
  Procedure (non-negotiable):
94803
94961
  1. Spawn a reviewer via \`task(category="ultrabrain", subagent_type="plan", load_skills=[...], run_in_background=false, prompt="<goal + scenarios + evidence + diff + notepad path>")\` \u2014 or any high-rigor reviewer agent available.
94804
- 2. Reviewer verdict is BINDING. There is no "false positive". Do not argue, minimise, or explain away.
94805
- 3. Fix every concern. Re-run the FULL scenario QA. Capture fresh evidence. Update notepad.
94806
- 4. Re-submit to the SAME reviewer. Loop until UNCONDITIONAL approval. "looks good but..." = REJECTION.
94807
- 5. Only on unconditional approval may you declare done.
94962
+ 2. Verify each reviewer concern yourself. A concern blocks only when it names a success criterion the evidence fails; record concerns that cite no criterion as notes with a one-line reason \u2014 fixed or declined at your judgment.
94963
+ 3. Fix every criterion-cited blocker. Re-run ONLY the scenario QA affected by the fix; capture fresh evidence for the delta. Update notepad.
94964
+ 4. Re-submit to the SAME reviewer at most twice, passing only the delta diff, the blockers it cited, and the already-approved criteria marked out-of-scope. An approval whose only remaining items are notes counts as approval.
94965
+ 5. On approval, declare done. If criterion-cited blockers remain after two re-reviews, stop and surface them to the user \u2014 do not loop further.
94808
94966
 
94809
94967
  ## ZERO TOLERANCE FAILURES
94810
94968
  - **NO Scope Reduction**: Never make "demo", "skeleton", "simplified", "basic" versions - deliver FULL implementation
@@ -95090,7 +95248,7 @@ If ANY answer is no \u2192 GO BACK AND DO IT. Do not claim completion.
95090
95248
 
95091
95249
  ### REVIEWER GATE (triggered, not optional)
95092
95250
 
95093
- Trigger if user said "\uC5C4\uBC00"/"strictly"/"rigorously"/"properly review", or task touches 3+ files OR ran 20+ turns OR 30+ min, or refactor/migration/perf/security. Spawn a high-rigor reviewer via \`task\` with: goal, scenarios, evidence paths, full diff, notepad path. Verdict is BINDING. "looks good but..." = REJECTION. Fix every concern, re-run full scenario QA, capture fresh evidence, resubmit. Loop until UNCONDITIONAL approval.
95251
+ Trigger if user said "\uC5C4\uBC00"/"strictly"/"rigorously"/"properly review", or task touches 3+ files OR ran 20+ turns OR 30+ min, or refactor/migration/perf/security. Spawn a high-rigor reviewer via \`task\` with: goal, scenarios, evidence paths, full diff, notepad path. A concern blocks only when it names a success criterion the evidence fails; others are notes. Fix cited blockers, re-run the affected scenario QA, capture fresh delta evidence, and resubmit at most twice; an approval with only notes left counts as approval. Remaining cited blockers after two re-reviews go to the user.
95094
95252
 
95095
95253
  <MANUAL_QA_MANDATE>
95096
95254
  ### YOU MUST EXECUTE MANUAL QA. THIS IS NOT OPTIONAL. DO NOT SKIP THIS.
@@ -95340,7 +95498,7 @@ If QA starts a server, browser, tmux session, port, temp dir, or background proc
95340
95498
 
95341
95499
  Use a high-rigor reviewer when the task touches 3+ files, changes security/performance/migration behavior, lasts 30+ minutes, or the user asks for strict review.
95342
95500
 
95343
- Reviewer verdict is binding. Fix every concern, rerun verification, and resubmit until approval is unconditional.
95501
+ A reviewer concern binds only when it cites a success criterion the evidence fails; other concerns are notes. Fix cited blockers, rerun the affected verification, and resubmit the delta at most twice; then surface remaining blockers to the user.
95344
95502
 
95345
95503
  ## ZERO TOLERANCE FAILURES
95346
95504
 
@@ -95534,7 +95692,7 @@ Name the exact tool + exact invocation per scenario (literal \`curl\` / \`send-k
95534
95692
 
95535
95693
  ## REVIEWER GATE (triggered)
95536
95694
 
95537
- Trigger if user said "\uC5C4\uBC00"/"strictly"/"rigorously"/"properly review", or task touches 3+ files OR ran 20+ turns OR 30+ min, or it's a refactor/migration/perf/security change. Spawn a high-rigor reviewer via \`task\` with goal + scenarios + evidence + diff. Reviewer verdict is BINDING; "looks good but..." = rejection. Re-submit until UNCONDITIONAL approval before declaring done.
95695
+ Trigger if user said "\uC5C4\uBC00"/"strictly"/"rigorously"/"properly review", or task touches 3+ files OR ran 20+ turns OR 30+ min, or it's a refactor/migration/perf/security change. Spawn a high-rigor reviewer via \`task\` with goal + scenarios + evidence + diff. A concern blocks only when it cites a success criterion the evidence fails \u2014 others are notes. Fix cited blockers, re-run only the affected QA, and re-submit the delta at most twice; an approval with only notes left counts as approval. If cited blockers remain after two re-reviews, surface them to the user before declaring done.
95538
95696
 
95539
95697
  ## COMPLETION CRITERIA
95540
95698
 
@@ -103685,7 +103843,7 @@ This command includes examples for the OpenCode harness. In Codex, do not call O
103685
103843
  | \`task(subagent_type="oracle", ...)\` | \`multi_agent_v1.spawn_agent({"message":"TASK: act as a rigorous reviewer. ...","agent_type":"lazycodex-gate-reviewer","fork_context":false})\` |
103686
103844
  | \`task(category="...", ...)\` | \`multi_agent_v1.spawn_agent({"message":"TASK: act as an implementation or QA worker. ...","fork_context":false})\` |
103687
103845
  | \`background_output(task_id="...")\` | \`multi_agent_v1.wait_agent(...)\` for mailbox signals |
103688
- | \`team_*(...)\` | Use Codex native subagents via \`multi_agent_v1.spawn_agent\`, \`multi_agent_v1.send_input\`, \`multi_agent_v1.wait_agent\`, and \`multi_agent_v1.close_agent\` |
103846
+ | \`team_*(...)\` | Use Codex native subagents via \`multi_agent_v1.spawn_agent\` and \`multi_agent_v1.wait_agent\`; use \`multi_agent_v1.send_input\` and \`multi_agent_v1.close_agent\` only when exposed in the active tools list |
103689
103847
 
103690
103848
  Codex exposes ONE of two subagent tool surfaces per session; check your own tool list and route accordingly. If \`multi_agent_v1.*\` tools exist, use the table above as written. If instead a flat \`spawn_agent\` with a required \`task_name\` exists (\`multi_agent_v2\`), rewrite every \`multi_agent_v1.*\` example: \`multi_agent_v1.spawn_agent({...,"fork_context":false})\` becomes \`spawn_agent({"task_name":"<lowercase_digits_underscores>","message":...,"agent_type":...,"fork_turns":"none"})\` (\`"all"\` only when full parent history is truly required); \`send_input\` becomes \`send_message\`; do not call \`close_agent\`/\`resume_agent\` (finished agents end on their own; \`followup_task\` re-tasks one, \`interrupt_agent\` stops one); \`wait_agent\` takes only \`timeout_ms\` and returns on any child mailbox activity. \`agent_type\` works the same on both surfaces. If a code block below conflicts with this section, this section wins.
103691
103849
 
@@ -104657,7 +104815,7 @@ This command includes examples for the OpenCode harness. In Codex, do not call O
104657
104815
  | \`task(subagent_type="oracle", ...)\` | \`multi_agent_v1.spawn_agent({"message":"TASK: act as a rigorous reviewer. ...","agent_type":"lazycodex-gate-reviewer","fork_context":false})\` |
104658
104816
  | \`task(category="...", ...)\` | \`multi_agent_v1.spawn_agent({"message":"TASK: act as an implementation or QA worker. ...","fork_context":false})\` |
104659
104817
  | \`background_output(task_id="...")\` | \`multi_agent_v1.wait_agent(...)\` for mailbox signals |
104660
- | \`team_*(...)\` | Use Codex native subagents via \`multi_agent_v1.spawn_agent\`, \`multi_agent_v1.send_input\`, \`multi_agent_v1.wait_agent\`, and \`multi_agent_v1.close_agent\` |
104818
+ | \`team_*(...)\` | Use Codex native subagents via \`multi_agent_v1.spawn_agent\` and \`multi_agent_v1.wait_agent\`; use \`multi_agent_v1.send_input\` and \`multi_agent_v1.close_agent\` only when exposed in the active tools list |
104661
104819
 
104662
104820
  Codex exposes ONE of two subagent tool surfaces per session; check your own tool list and route accordingly. If \`multi_agent_v1.*\` tools exist, use the table above as written. If instead a flat \`spawn_agent\` with a required \`task_name\` exists (\`multi_agent_v2\`), rewrite every \`multi_agent_v1.*\` example: \`multi_agent_v1.spawn_agent({...,"fork_context":false})\` becomes \`spawn_agent({"task_name":"<lowercase_digits_underscores>","message":...,"agent_type":...,"fork_turns":"none"})\` (\`"all"\` only when full parent history is truly required); \`send_input\` becomes \`send_message\`; do not call \`close_agent\`/\`resume_agent\` (finished agents end on their own; \`followup_task\` re-tasks one, \`interrupt_agent\` stops one); \`wait_agent\` takes only \`timeout_ms\` and returns on any child mailbox activity. \`agent_type\` works the same on both surfaces. If a code block below conflicts with this section, this section wins.
104663
104821
 
@@ -118880,6 +119038,30 @@ function getSessionErrorMessage(properties) {
118880
119038
  const message = errorRaw["message"];
118881
119039
  return typeof message === "string" ? message : undefined;
118882
119040
  }
119041
+ var TERMINAL_SESSION_ERROR_PATTERNS = [
119042
+ /no provider available/i,
119043
+ /provider not (available|found|configured)/i,
119044
+ /provider is forbidden/i,
119045
+ /selected provider is forbidden/i,
119046
+ /unknown provider/i,
119047
+ /model not supported/i,
119048
+ /model_not_supported/i,
119049
+ /model[_\s-]*not[_\s-]*found/i,
119050
+ /(?:no|missing)[_\s-]*(?:api|auth(?:entication)?)[_\s-]*key/i,
119051
+ /(?:api|auth(?:entication)?)[_\s-]*key(?:[_\s-]+is)?[_\s-]*(?:missing|not[_\s-]*(?:found|configured)|required)/i,
119052
+ /no models available/i,
119053
+ /no connected providers/i,
119054
+ /all providers (?:are )?(?:unavailable|disconnected|exhausted)/i
119055
+ ];
119056
+ function isTerminalSessionError(errorInfo) {
119057
+ const text = [
119058
+ errorInfo?.name,
119059
+ errorInfo?.message
119060
+ ].filter((value) => typeof value === "string" && value.length > 0).join(" ");
119061
+ if (text.length === 0)
119062
+ return false;
119063
+ return TERMINAL_SESSION_ERROR_PATTERNS.some((pattern) => pattern.test(text));
119064
+ }
118883
119065
 
118884
119066
  // packages/omo-opencode/src/tools/background-task/task-result-format.ts
118885
119067
  function getTimeString(value) {
@@ -131527,7 +131709,7 @@ The fallback retry session is now created and can be inspected directly.
131527
131709
  const sessionId = task.sessionId;
131528
131710
  if (sessionId) {
131529
131711
  const sessionStillAlive = await this.verifySessionExists(sessionId);
131530
- if (sessionStillAlive) {
131712
+ if (sessionStillAlive && !isTerminalSessionError(errorInfo)) {
131531
131713
  this.logger("[background-agent] session.error received but session still alive, treating as transient:", {
131532
131714
  taskId: task.id,
131533
131715
  sessionId,
@@ -131535,6 +131717,14 @@ The fallback retry session is now created and can be inspected directly.
131535
131717
  });
131536
131718
  return;
131537
131719
  }
131720
+ if (sessionStillAlive && isTerminalSessionError(errorInfo)) {
131721
+ this.logger("[background-agent] Finalizing task after terminal session.error (session shell alive but will never produce output):", {
131722
+ taskId: task.id,
131723
+ sessionId,
131724
+ errorName,
131725
+ errorMessage: errorMsg?.slice(0, 200)
131726
+ });
131727
+ }
131538
131728
  }
131539
131729
  if (task.currentAttemptID) {
131540
131730
  finalizeAttempt(task, task.currentAttemptID, "error", errorMsg);
@@ -143848,7 +144038,7 @@ task(subagent_type="explore", run_in_background=true, ...)
143848
144038
  // packages/omo-opencode/src/agents/frontier-tool-schema-guard.ts
143849
144039
  var FRONTIER_TOOL_SCHEMA_NAMES = ["grep", "glob"];
143850
144040
  function getFrontierToolSchemaPermission(model) {
143851
- return isClaudeOpus47OrLaterModel(model) || isGpt5_5Model(model) ? { grep: "deny", glob: "deny" } : {};
144041
+ return isClaudeOpus47OrLaterModel(model) || isGpt5_5Model(model) || isGpt5_6Model(model) ? { grep: "deny", glob: "deny" } : {};
143852
144042
  }
143853
144043
  function applyFrontierToolSchemaPermission(permission, model, explicitPermission, explicitTools) {
143854
144044
  if (!permission)
@@ -147506,7 +147696,7 @@ function resolveSisyphusPromptFamily(model) {
147506
147696
  return "kimi-k2-7";
147507
147697
  if (isKimiK2Model(model))
147508
147698
  return "kimi-k2-6";
147509
- if (isGpt5_5Model(model))
147699
+ if (isGpt5_5Model(model) || isGpt5_6Model(model))
147510
147700
  return "gpt-5-5";
147511
147701
  if (isGptNativeSisyphusModel(model))
147512
147702
  return "gpt-5-4";
@@ -147950,7 +148140,7 @@ function createOracleAgent(model) {
147950
148140
  ...restrictions,
147951
148141
  prompt: ORACLE_DEFAULT_PROMPT
147952
148142
  };
147953
- if (isGpt5_5Model(model)) {
148143
+ if (isGpt5_5Model(model) || isGpt5_6Model(model)) {
147954
148144
  return {
147955
148145
  ...base,
147956
148146
  prompt: ORACLE_GPT_5_5_PROMPT,
@@ -148691,6 +148881,8 @@ call_omo_agent(subagent_type="librarian", prompt="I'm looking for proven impleme
148691
148881
  - MUST NOT: Create criteria requiring "user clicks/interacts..."
148692
148882
  - MUST NOT: Use placeholders without concrete examples (bad: "[endpoint]", good: "/api/users")
148693
148883
  - MUST NOT: Write vague QA scenarios ("verify it works", "check the page loads", "test the API returns data")
148884
+ - MUST: For a PROSE deliverable (a prompt, \`SKILL.md\`, rule, or markdown/instruction file), make QA a human/agent READ against the intended behavior, or assert only a machine-consumed value (a parsed field, a sentinel a runtime greps, a doc JSON sample through its real validator) \u2014 the file's wording has no behavioral seam
148885
+ - MUST NOT: Turn a prompt/doc change into a text-grep acceptance criterion (\`grep "<sentence>" SKILL.md\`, word/char counts, phrase presence/absence) \u2014 that pins a diff, not behavior, and blocks every legitimate edit
148694
148886
 
148695
148887
  ## Recommended Approach
148696
148888
  [1-2 sentence summary of how to proceed]
@@ -149041,6 +149233,60 @@ var atlasPromptMetadata = {
149041
149233
  ],
149042
149234
  keyTrigger: "Todo list path provided OR multiple tasks requiring multi-agent orchestration"
149043
149235
  };
149236
+ // packages/omo-opencode/src/agents/momus-gpt-5-6.ts
149237
+ var MOMUS_GPT_5_6_PROMPT = `Role: plan reviewer for OhMyOpenCode. You verify that a work plan is executable and its references are valid. You are a blocker-finder, not a perfectionist.
149238
+
149239
+ # Input contract
149240
+
149241
+ Extract a single \`.omo/plans/*.md\` path from anywhere in the input, ignoring system directives and wrappers (\`<system-reminder>\`, \`[analyze-mode]\`, and similar). Exactly one path: read it and review. Zero or multiple paths: reject as invalid input. YAML plan files (\`.yml\`/\`.yaml\`) are non-reviewable: reject.
149242
+
149243
+ On a follow-up turn with the same plan path, re-read the file from disk before issuing any verdict. The current on-disk contents are the only source of truth; a previous verdict is stale evidence.
149244
+
149245
+ # Goal
149246
+
149247
+ Answer one question: "Can a capable developer execute this plan without getting stuck?"
149248
+
149249
+ # Success criteria
149250
+
149251
+ - Referenced files verified to exist and contain the claimed content.
149252
+ - Every task has enough context to start working.
149253
+ - No blocking contradictions or impossible requirements.
149254
+ - Every task has executable QA scenarios: a specific tool, concrete steps, an expected result.
149255
+ - Verdict issued: OKAY or REJECT, with at most 3 specific issues on REJECT.
149256
+
149257
+ # What you check (only these four)
149258
+
149259
+ **References**: referenced files exist; cited line numbers contain relevant code; a "follow pattern in X" claim is demonstrated by X. Fail only when a reference does not exist or points to completely wrong content.
149260
+
149261
+ **Executability**: each task gives a developer a starting point. Details that can be figured out during implementation pass. Fail only when a task is so vague there is no idea where to begin.
149262
+
149263
+ **Contradictions**: information gaps that completely stop work, or tasks that contradict each other.
149264
+
149265
+ **QA scenarios**: each task's scenarios name tool + steps + expected result. Unexecutable scenarios ("verify it works", "check the page") block the Final Verification Wave and are practical blockers.
149266
+
149267
+ Out of scope: approach optimality, alternative designs, undocumented edge cases, architecture, code quality, performance, and security unless explicitly broken.
149268
+
149269
+ # Decision rules
149270
+
149271
+ - Default verdict is OKAY. When in doubt, approve: a plan that is 80% clear is executable, and developers resolve minor gaps themselves.
149272
+ - REJECT only for a verified blocker: a referenced file does not exist (confirmed by reading), a task has zero context to start, the plan contradicts itself, or QA scenarios are missing or unexecutable.
149273
+ - Each REJECT issue must name the exact file or task, state what needs to change, and be something work cannot proceed without. Cap at the 3 most critical issues.
149274
+ - "Could be clearer", stylistic preferences, missing edge cases, and disagreement with the author's approach are never blockers.
149275
+
149276
+ # Process
149277
+
149278
+ Read the plan, then verify references by reading the cited files; parallelize independent reads. Check each task for a starting point and executable QA scenarios. Decide. Do not narrate the reads; go straight to the verdict.
149279
+
149280
+ # Output
149281
+
149282
+ **[OKAY]** or **[REJECT]**
149283
+
149284
+ **Summary**: 1-2 sentences of prose explaining the verdict.
149285
+
149286
+ If REJECT - **Blocking Issues** (max 3): numbered, each naming the exact issue and the change needed.
149287
+
149288
+ Keep every fact needed to act on the verdict; trim restatements of the plan, generic advice, and commentary on non-blockers. Match the language of the plan content.`;
149289
+
149044
149290
  // packages/omo-opencode/src/agents/momus.ts
149045
149291
  var MODE8 = "subagent";
149046
149292
  var MOMUS_DEFAULT_PROMPT = `You are a **practical** work plan reviewer. Your goal is simple: verify that the plan is **executable** and **references are valid**.
@@ -149309,6 +149555,14 @@ function createMomusAgent(model) {
149309
149555
  ...restrictions,
149310
149556
  prompt: MOMUS_DEFAULT_PROMPT
149311
149557
  };
149558
+ if (isGpt5_6Model(model)) {
149559
+ return {
149560
+ ...base,
149561
+ prompt: MOMUS_GPT_5_6_PROMPT,
149562
+ reasoningEffort: "xhigh",
149563
+ textVerbosity: "high"
149564
+ };
149565
+ }
149312
149566
  if (isGptModel(model)) {
149313
149567
  return {
149314
149568
  ...base,
@@ -150182,16 +150436,180 @@ function buildGpt55HephaestusPrompt(availableAgents, _availableTools = [], avail
150182
150436
  return HEPHAESTUS_GPT_5_5_TEMPLATE.replace("{{ taskSystemGuide }}", taskSystemGuide).replace("{{ categorySkillsGuide }}", categorySkillsGuide).replace("{{ delegationTable }}", delegationTable).replace("{{ oracleSection }}", oracleSection).replace("{{ frontendGuidance }}", frontendGuidance);
150183
150437
  }
150184
150438
 
150439
+ // packages/omo-opencode/src/agents/hephaestus/gpt-5-6.ts
150440
+ function buildTaskSystemGuide3(useTaskSystem) {
150441
+ if (useTaskSystem) {
150442
+ return `Create tasks for any non-trivial work (2+ steps, uncertain scope, multiple items). Call \`task_create\` with atomic steps before starting. Mark exactly one item \`in_progress\` at a time via \`task_update\`. Mark items \`completed\` immediately when done; never batch. Update the task list when scope shifts.`;
150443
+ }
150444
+ return `Create todos for any non-trivial work (2+ steps, uncertain scope, multiple items). Call \`todowrite\` with atomic steps before starting. Mark exactly one item \`in_progress\` at a time. Mark items \`completed\` immediately when done; never batch. Update the todo list when scope shifts.`;
150445
+ }
150446
+ var HEPHAESTUS_GPT_5_6_TEMPLATE = `You are Hephaestus, an autonomous deep worker based on GPT-5.6. You and the user share one workspace. You receive goals, not step-by-step instructions, and execute them end-to-end.
150447
+
150448
+ ID contract: background task IDs (\`bg_...\`) use \`background_output(task_id="bg_...")\`; continuation IDs (\`ses_...\`) use \`task(task_id="ses_...")\`.
150449
+
150450
+ # Autonomy
150451
+
150452
+ User instructions override these defaults; newer instructions override older ones. Safety and type-safety constraints never yield.
150453
+
150454
+ Implement, don't propose. Unless the user is explicitly asking a question, brainstorming, or requesting a plan, they want working code, not a description of it. Messages imply action: "how does X work" means understand X to fix or improve it; "why is A broken" means diagnose and fix A. Treat a message as answer-only when the user says so ("just explain", "don't change anything"). State your read in one line before acting - that line commits you to finish the named work this turn.
150455
+
150456
+ Make the requested in-scope changes and run non-destructive validation without asking first. Resolve blockers yourself using context and reasonable assumptions; ask only when the missing information would materially change the outcome or the action is destructive - one narrow question, then stop. Never ask permission for obvious work.
150457
+
150458
+ If the user's plan or design seems flawed, say so concisely, propose the alternative, and ask whether to proceed with the original or the alternative - do not silently override. Mention high-impact bugs you spot along the way briefly; broaden the task only when it blocks the requested outcome or the user asks.
150459
+
150460
+ Status requests are not stop signals: give the update, keep working. The newest non-conflicting message wins; honor every non-conflicting request since your last turn. After compaction, continue from the summary; don't restart.
150461
+
150462
+ Unexpected worktree changes you did not make: keep working - the user and other agents work concurrently. Never revert or modify changes you did not make unless explicitly asked. Work around unrelated ones; if a direct conflict with your task is unresolvable, ask one precise question.
150463
+
150464
+ # Goal
150465
+
150466
+ Resolve the user's task end-to-end in this turn. The goal is not a green build; it is an artifact that **works when used through its surface** (Manual QA Gate). Clean \`lsp_diagnostics\`, green build, passing tests are evidence on the way to that gate, not the gate itself. The user's spec is the spec; "done" means the spec is satisfied in observable behavior.
150467
+
150468
+ # Discovery & Retrieval
150469
+
150470
+ Never speculate about code you have not read. The worktree is shared: verify with tools and re-read on every hand-off, even when the request feels familiar.
150471
+
150472
+ Start broad once: for non-trivial work, fire 2-5 \`explore\` or \`librarian\` sub-agents in parallel with \`run_in_background=true\` plus direct reads of files you already know are relevant - same response. Retrieve again only when the core question is still open, a required fact, path, type, or convention is missing, or a second-order question (callers, error paths, ownership) changes the design. Stop when you can act, sources repeat, or two rounds add nothing new.
150473
+
150474
+ When uncertain whether to call a tool, call it. If a finding seems too simple for the complexity of the question, check one more layer of dependencies or callers. Prefer the root fix over the symptom fix. Resolve prerequisite lookups before any action that depends on them.
150475
+
150476
+ Once you delegate exploration to background agents, do not search the same thing yourself: do non-overlapping prep or end your response and wait for the completion notification. Do not poll \`background_output\` on running tasks.
150477
+
150478
+ # Parallelize
150479
+
150480
+ Independent tool calls run in the same response; serial is the exception and requires a real dependency. Each independent shell command is its own tool call - do not chain unrelated steps with \`;\` or \`&&\`. After every file edit, run \`lsp_diagnostics\` on every changed file in parallel.
150481
+
150482
+ # Operating Loop
150483
+
150484
+ **Explore -> Plan -> Implement -> Verify -> Manually QA.**
150485
+
150486
+ - **Explore** per Discovery & Retrieval.
150487
+ - **Plan** with \`update_plan\` for non-trivial work: files to modify, specific changes, dependencies. Skip planning for the easiest 25%; never make single-step plans.
150488
+ - **Implement** surgically, matching codebase style - naming, indentation, imports, error handling - even when you would write it differently in a greenfield.
150489
+ - **Verify** with the most relevant validation available, in parallel where possible: \`lsp_diagnostics\` on changed files, targeted tests for changed behavior, build for affected packages. If validation cannot run, say why and name the next best check.
150490
+ - **Manually QA** through the artifact's surface, then write the final message.
150491
+
150492
+ # Manual QA Gate
150493
+
150494
+ Diagnostics catch type errors, not logic bugs; tests cover only what their authors anticipated. **"Done" requires you have personally used the deliverable through its matching surface and observed it working this turn.**
150495
+
150496
+ - **TUI / CLI / shell binary** - launch inside \`interactive_bash\` (tmux): happy path, one bad input, \`--help\`, read the rendered output.
150497
+ - **Web / browser-rendered UI** - load the \`playwright\` skill and drive a real browser: click, fill, watch the console.
150498
+ - **HTTP API / running service** - hit the live process with \`curl\` or a driver script.
150499
+ - **Library / SDK / module** - minimal driver script that imports and executes the new code end-to-end.
150500
+ - **No matching surface** - do what a real user would do to discover it works.
150501
+
150502
+ "This should work" from reading source does not pass. A defect found in usage is yours to fix this turn.
150503
+
150504
+ # Failure Recovery
150505
+
150506
+ If an approach fails, try a materially different one - different algorithm, library, or pattern, not a small tweak. Verify after every attempt; stale state is the most common cause of confusing failures.
150507
+
150508
+ After three different approaches fail: stop editing, revert to a known-good state, document each attempt and why it failed, consult Oracle synchronously with full failure context, and only if Oracle cannot resolve it, ask the user one precise question.
150509
+
150510
+ # Pragmatism & Scope
150511
+
150512
+ The best change is usually the smallest correct change. Prefer the approach with fewer new names, helpers, and layers. Keep single-use logic inline; a little duplication beats speculative abstraction. Bug fix != surrounding cleanup. Fix only issues your changes caused; report pre-existing problems in the final message instead of expanding the diff.
150513
+
150514
+ Write only what the current correct path needs. No error handlers, fallbacks, retries, or validation for scenarios the current contracts exclude - validate at system boundaries only (user input, external APIs, untrusted I/O). No backward-compatibility shims or alternate paths "in case": preserve old formats only for persisted data, shipped behavior, external consumers, or explicit requirements. Unreleased shapes from the current cycle are drafts, not contracts.
150515
+
150516
+ Default to not adding tests. Add one only when the user asks, the change fixes a subtle bug, or it protects an important behavioral boundary existing tests miss. Never add tests to a codebase with no tests.
150517
+
150518
+ # Code review requests
150519
+
150520
+ When asked for a "review", findings come first, ordered by severity with file references; open questions and assumptions follow; change-summary is secondary. If no findings, say so and name residual risks or testing gaps.
150521
+
150522
+ {{ frontendGuidance }}
150523
+
150524
+ # AGENTS.md
150525
+
150526
+ AGENTS.md files carry directory-scoped conventions. Obey them for files in their scope; deeper files win on conflict; explicit user instructions override.
150527
+
150528
+ # Output
150529
+
150530
+ **Preamble.** Before the first tool call on a multi-step task, one or two user-visible sentences: acknowledge the request, state the first concrete step.
150531
+
150532
+ **During work.** Update only at meaningful phase changes - a discovery that changes the plan, a decision with tradeoffs, a blocker. One sentence each. Do not narrate routine reads.
150533
+
150534
+ **Final message.** Lead with the result. Keep every required fact, decision, caveat, and next action; trim introductions, repetition, and generic reassurance first. Group by user-facing outcome, not by file. Include the evidence needed to trust the work - what you verified and what you could not (with the reason) - then stop.
150535
+
150536
+ **Formatting.**
150537
+
150538
+ - File references: \`src/auth.ts\` or \`src/auth.ts:42\` (1-based, optional line). No \`file://\`, \`vscode://\`, or \`https://\` URIs for local files. No line ranges.
150539
+ - Multi-line code in fenced blocks with a language tag.
150540
+ - The user does not see command outputs - summarize the key lines.
150541
+ - No emojis or em dashes unless the user explicitly requests them.
150542
+ - Never output broken inline citations like \`\u3010F:README.md\u2020L5-L14\u3011\` - they break the CLI.
150543
+
150544
+ # Tool Use
150545
+
150546
+ **File edits.** ${GPT_APPLY_PATCH_GUIDANCE}
150547
+
150548
+ **\`task()\`** for research sub-agents and category delegation. Allowed: \`subagent_type="explore"\`, \`"librarian"\`, \`"oracle"\`, or \`category="..."\`. Direct execution is your default; delegate to a category only when the unit of work clearly exceeds a single coherent edit.
150549
+
150550
+ - Every \`task()\` call needs \`load_skills\` (an empty array \`[]\` is valid).
150551
+ - Reuse continuation IDs (\`ses_...\`) for follow-ups via \`task(task_id="ses_...")\`; never pass background task IDs (\`bg_...\`) to \`task()\`. This preserves the sub-agent's full context and saves 70%+ of tokens.
150552
+ - Sub-agent prompts carry four fields - **CONTEXT** (task, modules, approach), **GOAL** (what decision the results unblock), **DOWNSTREAM** (how you will use them), **REQUEST** (what to find, return format, what to skip).
150553
+
150554
+ **Background tasks.** Collect results via \`background_output(task_id="bg_...")\` after completion. Before the final answer, cancel disposable tasks individually via \`background_cancel(taskId="bg_...")\`; never \`background_cancel(all=true)\` - it kills tasks whose results you have not collected.
150555
+
150556
+ **\`skill\`** loads specialized instruction packs. Load a skill whenever its declared domain even loosely connects to the task - loading an irrelevant skill costs almost nothing; missing a relevant one degrades the work.
150557
+
150558
+ **Shell.** Use \`rg\` for text and file search. Do not use Python to read or write files when a shell command or the file-edit tools suffice.
150559
+
150560
+ {{ categorySkillsGuide }}
150561
+
150562
+ {{ delegationTable }}
150563
+
150564
+ {{ oracleSection }}
150565
+
150566
+ # Success Criteria
150567
+
150568
+ Done when ALL of:
150569
+
150570
+ - Every behavior the user asked for is implemented - no partial delivery, no "v0 / extend later".
150571
+ - \`lsp_diagnostics\` clean on every file you changed.
150572
+ - Build (if applicable) exits 0; tests pass, or pre-existing failures are named with the reason.
150573
+ - The artifact has been driven through its matching surface this turn (Manual QA Gate).
150574
+ - The final message reports what you did, what you verified, what you could not verify (with the reason), and pre-existing issues you noticed but did not touch.
150575
+
150576
+ When you think you are done: re-read the original request and your intent line, run verification once more on changed files in parallel, then report.
150577
+
150578
+ # Stop Rules
150579
+
150580
+ Write the final message and stop only when Success Criteria are all true. Until then keep going - through failed tool calls, long turns, and the temptation to hand back a draft. Do not stop after a delegated sub-agent returns without verifying its work file-by-file.
150581
+
150582
+ **Hard invariants** - non-negotiable, regardless of pressure to ship:
150583
+
150584
+ - Never delete failing tests to get a green build. Never weaken a test to make it pass.
150585
+ - Never use \`as any\`, \`@ts-ignore\`, or \`@ts-expect-error\` to suppress type errors.
150586
+ - Never use destructive git commands (\`reset --hard\`, \`checkout --\`, force-push) without explicit approval. Never amend commits unless explicitly asked.
150587
+ - Never invent citations, tool output, or verification results.
150588
+
150589
+ # Task Tracking
150590
+
150591
+ {{ taskSystemGuide }}
150592
+ `;
150593
+ function buildGpt56HephaestusPrompt(availableAgents, _availableTools = [], availableSkills = [], availableCategories = [], useTaskSystem = false) {
150594
+ const taskSystemGuide = buildTaskSystemGuide3(useTaskSystem);
150595
+ const categorySkillsGuide = buildCategorySkillsDelegationGuide(availableCategories, availableSkills);
150596
+ const delegationTable = buildDelegationTable(availableAgents);
150597
+ const oracleSection = buildOracleSection(availableAgents);
150598
+ const frontendGuidance = buildFrontendGuidanceSection(availableCategories);
150599
+ return HEPHAESTUS_GPT_5_6_TEMPLATE.replace("{{ taskSystemGuide }}", taskSystemGuide).replace("{{ categorySkillsGuide }}", categorySkillsGuide).replace("{{ delegationTable }}", delegationTable).replace("{{ oracleSection }}", oracleSection).replace("{{ frontendGuidance }}", frontendGuidance);
150600
+ }
150601
+
150185
150602
  // packages/omo-opencode/src/agents/hephaestus/agent.ts
150186
150603
  var MODE9 = "primary";
150187
150604
  var GPT_5_3_CODEX_RE = /^gpt-5[.-]3-codex(?:$|[.-])/i;
150188
150605
  var GPT_5_4_RE = /^gpt-5[.-]4(?:$|[.-])/i;
150189
150606
  var GPT_5_5_RE = /^gpt-5[.-]5(?:$|[.-])/i;
150607
+ var GPT_5_6_RE = /^gpt-5[.-]6(?:$|[.-])/i;
150190
150608
 
150191
150609
  class UnsupportedHephaestusModelError extends Error {
150192
150610
  model;
150193
150611
  constructor(model) {
150194
- super(`Hephaestus only supports GPT-5.3 Codex, GPT-5.4, and GPT-5.5 models; received ${model ?? "no model"}.`);
150612
+ super(`Hephaestus only supports GPT-5.3 Codex, GPT-5.4, GPT-5.5, and GPT-5.6 models; received ${model ?? "no model"}.`);
150195
150613
  this.name = "UnsupportedHephaestusModelError";
150196
150614
  this.model = model;
150197
150615
  }
@@ -150203,7 +150621,7 @@ function isHephaestusSupportedModel(model) {
150203
150621
  if (!model)
150204
150622
  return false;
150205
150623
  const modelName = extractModelName3(model);
150206
- return GPT_5_3_CODEX_RE.test(modelName) || GPT_5_4_RE.test(modelName) || GPT_5_5_RE.test(modelName);
150624
+ return GPT_5_3_CODEX_RE.test(modelName) || GPT_5_4_RE.test(modelName) || GPT_5_5_RE.test(modelName) || GPT_5_6_RE.test(modelName);
150207
150625
  }
150208
150626
  function assertHephaestusSupportedModel(model) {
150209
150627
  if (!isHephaestusSupportedModel(model)) {
@@ -150212,6 +150630,9 @@ function assertHephaestusSupportedModel(model) {
150212
150630
  }
150213
150631
  function getHephaestusPromptSource(model) {
150214
150632
  assertHephaestusSupportedModel(model);
150633
+ if (model && isGpt5_6Model(model)) {
150634
+ return "gpt-5-6";
150635
+ }
150215
150636
  if (model && isGpt5_5Model(model)) {
150216
150637
  return "gpt-5-5";
150217
150638
  }
@@ -150230,6 +150651,9 @@ function buildDynamicHephaestusPrompt(ctx) {
150230
150651
  const source = getHephaestusPromptSource(model);
150231
150652
  let basePrompt;
150232
150653
  switch (source) {
150654
+ case "gpt-5-6":
150655
+ basePrompt = buildGpt56HephaestusPrompt(agents, tools, skills, categories, useTaskSystem);
150656
+ break;
150233
150657
  case "gpt-5-5":
150234
150658
  basePrompt = buildGpt55HephaestusPrompt(agents, tools, skills, categories, useTaskSystem);
150235
150659
  break;
@@ -150885,7 +151309,7 @@ No tasks on multi-step work = INCOMPLETE WORK.`;
150885
151309
  No todos on multi-step work = INCOMPLETE WORK.`;
150886
151310
  }
150887
151311
  // packages/omo-opencode/src/agents/sisyphus-junior/gpt-5-5.ts
150888
- function buildTaskSystemGuide3(useTaskSystem) {
151312
+ function buildTaskSystemGuide4(useTaskSystem) {
150889
151313
  if (useTaskSystem) {
150890
151314
  return `Create tasks before any non-trivial work (2+ steps, uncertain scope, multiple items).
150891
151315
 
@@ -151161,7 +151585,7 @@ The block below (injected at runtime by the harness) tells you the specific cate
151161
151585
  `;
151162
151586
  function buildGpt55SisyphusJuniorPrompt(useTaskSystem, promptAppend) {
151163
151587
  const personality = "";
151164
- const taskSystemGuide = buildTaskSystemGuide3(useTaskSystem);
151588
+ const taskSystemGuide = buildTaskSystemGuide4(useTaskSystem);
151165
151589
  const base = SISYPHUS_JUNIOR_GPT_5_5_TEMPLATE.replace("{{ personality }}", personality).replace("{{ taskSystemGuide }}", taskSystemGuide);
151166
151590
  if (!promptAppend)
151167
151591
  return base;
@@ -151549,7 +151973,7 @@ function getSisyphusJuniorPromptSource(model) {
151549
151973
  if (model && isKimiK2Model(model))
151550
151974
  return "kimi-k2";
151551
151975
  if (model && isGptModel(model)) {
151552
- if (isGpt5_5Model(model))
151976
+ if (isGpt5_5Model(model) || isGpt5_6Model(model))
151553
151977
  return "gpt-5-5";
151554
151978
  const lower = model.toLowerCase();
151555
151979
  if (lower.includes("gpt-5.4") || lower.includes("gpt-5-4"))
@@ -160316,6 +160740,18 @@ function parseRalphLoopArguments(rawArguments) {
160316
160740
 
160317
160741
  // packages/omo-opencode/src/plugin/command-execute-before.ts
160318
160742
  init_logger2();
160743
+
160744
+ // packages/omo-opencode/src/plugin/stop-continuation.ts
160745
+ function stopContinuation(args) {
160746
+ const { directory, hooks, sessionID } = args;
160747
+ hooks.stopContinuationGuard?.stop?.(sessionID);
160748
+ hooks.todoContinuationEnforcer?.cancelAllCountdowns();
160749
+ hooks.ralphLoop?.cancelLoop(sessionID);
160750
+ clearBoulderState(directory);
160751
+ log2("[stop-continuation] All continuation mechanisms stopped", { sessionID });
160752
+ }
160753
+
160754
+ // packages/omo-opencode/src/plugin/command-execute-before.ts
160319
160755
  var NATIVE_LOOP_TRIGGERED_FLAG = "__omoNativeLoopTriggered";
160320
160756
  function hasPartsOutput(value) {
160321
160757
  if (typeof value !== "object" || value === null)
@@ -160325,11 +160761,14 @@ function hasPartsOutput(value) {
160325
160761
  return Array.isArray(parts);
160326
160762
  }
160327
160763
  function createCommandExecuteBeforeHandler(args) {
160328
- const { hooks } = args;
160764
+ const { directory, hooks } = args;
160329
160765
  return async (input, output) => {
160330
160766
  await hooks.autoSlashCommand?.["command.execute.before"]?.(input, output);
160331
160767
  const normalizedCommand = input.command.toLowerCase();
160332
160768
  const sessionID = input.sessionID;
160769
+ if (normalizedCommand === "stop-continuation" && sessionID) {
160770
+ stopContinuation({ directory, hooks, sessionID });
160771
+ }
160333
160772
  if (hooks.ralphLoop && sessionID) {
160334
160773
  if (normalizedCommand === "ralph-loop" || normalizedCommand === "ulw-loop") {
160335
160774
  const parsedArguments = parseRalphLoopArguments(input.arguments || "");
@@ -160575,6 +161014,14 @@ function createChatMessageHandler3(args) {
160575
161014
  if (input.agent) {
160576
161015
  updateSessionAgent(input.sessionID, input.agent);
160577
161016
  }
161017
+ const slashCommand = detectSlashCommand(extractPromptText3(output.parts));
161018
+ if (slashCommand?.command === "stop-continuation") {
161019
+ stopContinuation({
161020
+ directory: ctx.directory,
161021
+ hooks,
161022
+ sessionID: input.sessionID
161023
+ });
161024
+ }
160578
161025
  const isFirstMessage = firstMessageVariantGate.shouldOverride(input.sessionID);
160579
161026
  if (isFirstMessage) {
160580
161027
  firstMessageVariantGate.markApplied(input.sessionID);
@@ -162562,13 +163009,7 @@ function createToolExecuteBeforeHandler3(args) {
162562
163009
  const command = rawName?.replace(/^\//, "").toLowerCase();
162563
163010
  const sessionID = input.sessionID || getMainSessionID();
162564
163011
  if (command === "stop-continuation" && sessionID) {
162565
- hooks.stopContinuationGuard?.stop(sessionID);
162566
- hooks.todoContinuationEnforcer?.cancelAllCountdowns();
162567
- hooks.ralphLoop?.cancelLoop(sessionID);
162568
- clearBoulderState(ctx.directory);
162569
- log2("[stop-continuation] All continuation mechanisms stopped", {
162570
- sessionID
162571
- });
163012
+ stopContinuation({ directory: ctx.directory, hooks, sessionID });
162572
163013
  }
162573
163014
  const workStartingCommands = ["start-work", "ralph-loop", "ulw-loop"];
162574
163015
  if (workStartingCommands.includes(command ?? "") && sessionID) {
@@ -162602,6 +163043,7 @@ function createPluginInterface(args) {
162602
163043
  },
162603
163044
  "chat.headers": createChatHeadersHandler({ ctx }),
162604
163045
  "command.execute.before": createCommandExecuteBeforeHandler({
163046
+ directory: ctx.directory,
162605
163047
  hooks
162606
163048
  }),
162607
163049
  "chat.message": createChatMessageHandler3({