oh-my-opencode 5.0.0-beta.1 → 5.0.0-beta.10

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 (196) hide show
  1. package/.agents/command/publish.md +44 -16
  2. package/.agents/skills/publish/SKILL.md +44 -16
  3. package/.agents/skills/work-with-pr/SKILL.md +37 -23
  4. package/.opencode/command/publish.md +44 -16
  5. package/.opencode/skills/work-with-pr/SKILL.md +37 -23
  6. package/README.md +12 -1
  7. package/dist/agents/atlas/agent.d.ts +0 -1
  8. package/dist/agents/sisyphus/grok-4.d.ts +20 -0
  9. package/dist/agents/sisyphus/index.d.ts +2 -0
  10. package/dist/agents/sisyphus-agent-config.d.ts +6 -0
  11. package/dist/agents/sisyphus-agent-factory.d.ts +1 -1
  12. package/dist/agents/sisyphus-runtime-prompt-reconciler.d.ts +15 -4
  13. package/dist/agents/types.d.ts +2 -2
  14. package/dist/cli/index.js +797 -465
  15. package/dist/cli/run/on-complete-hook.d.ts +2 -0
  16. package/dist/cli-node/index.js +797 -465
  17. package/dist/hooks/atlas/final-wave-approval-gate.test-support.d.ts +50 -0
  18. package/dist/hooks/atlas/system-reminder-templates.d.ts +0 -1
  19. package/dist/index.js +1511 -1140
  20. package/dist/shared/normalize-sdk-response.d.ts +1 -0
  21. package/dist/shared/shell-env.d.ts +1 -1
  22. package/dist/skills/coding-agent-sessions/SKILL.md +3 -2
  23. package/dist/skills/coding-agent-sessions/references/all-platforms.md +1 -1
  24. package/dist/skills/coding-agent-sessions/references/senpi.md +4 -4
  25. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
  26. package/dist/skills/frontend/SKILL.md +10 -7
  27. package/dist/skills/frontend/references/design/_INDEX.md +1 -0
  28. package/dist/skills/frontend/references/design/stylegallery.md +80 -0
  29. package/dist/skills/ultimate-browsing/ATTRIBUTION.md +37 -10
  30. package/dist/skills/ultimate-browsing/engine/AGENTS.md +179 -0
  31. package/dist/skills/ultimate-browsing/engine/templates/package.json +1 -1
  32. package/dist/skills/ultimate-browsing/references/chrome-stealth.md +11 -11
  33. package/dist/skills/ulw-plan/SKILL.md +2 -2
  34. package/dist/skills/ulw-plan/references/full-workflow.md +27 -3
  35. package/dist/skills/ulw-plan/references/intent-clear.md +2 -1
  36. package/dist/skills/ulw-plan/references/intent-unclear.md +3 -3
  37. package/dist/tui.js +176 -14
  38. package/package.json +21 -19
  39. package/packages/lsp-core/src/lsp/client-diagnostics-concurrency.integration.test.ts +44 -0
  40. package/packages/lsp-core/src/lsp/client-diagnostics-freshness.integration.test.ts +0 -28
  41. package/packages/lsp-core/src/lsp/client-wrapper.test.ts +60 -7
  42. package/packages/lsp-core/src/lsp/client-wrapper.ts +69 -16
  43. package/packages/lsp-core/src/lsp/workspace-edit-adversarial.test.ts +20 -1
  44. package/packages/lsp-core/src/tools/diagnostics.ts +3 -3
  45. package/packages/lsp-core/src/tools/navigation.ts +4 -2
  46. package/packages/lsp-core/src/tools/rename.ts +4 -2
  47. package/packages/lsp-core/src/tools/symbols.ts +1 -1
  48. package/packages/lsp-daemon/dist/cli.js +83 -29
  49. package/packages/lsp-daemon/dist/client.js +76 -22
  50. package/packages/lsp-daemon/dist/index.js +81 -27
  51. package/packages/lsp-tools-mcp/dist/cli.js +76 -22
  52. package/packages/lsp-tools-mcp/dist/mcp.js +76 -22
  53. package/packages/lsp-tools-mcp/dist/tools.js +76 -22
  54. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  55. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  56. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  57. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +118 -8
  58. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +118 -8
  59. package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
  60. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  61. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  62. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  63. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  64. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  65. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  66. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +3 -17
  67. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
  68. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +83 -29
  69. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  70. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  71. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  72. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  73. package/packages/omo-codex/plugin/components/rules/test/bundled-rules-priority.test.ts +11 -16
  74. package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +16 -23
  75. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +9 -7
  76. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +0 -6
  77. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-dedup.test.ts +6 -4
  78. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-directive.test.ts +12 -9
  79. package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +28 -37
  80. package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +37 -69
  81. package/packages/omo-codex/plugin/components/rules/test/hook-output.test.ts +2 -3
  82. package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +1 -15
  83. package/packages/omo-codex/plugin/components/start-work-continuation/AGENTS.md +3 -2
  84. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
  85. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  86. package/packages/omo-codex/plugin/components/start-work-continuation/test/cli.test.ts +0 -3
  87. package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +2 -16
  88. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  89. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  90. package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +3 -9
  91. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +24 -12
  92. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +24 -12
  93. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  94. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  95. package/packages/omo-codex/plugin/components/ultrawork/directive.md +6 -0
  96. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  97. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  98. package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +6 -0
  99. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +2 -2
  100. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +27 -3
  101. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-clear.md +2 -1
  102. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +3 -3
  103. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +0 -136
  104. package/packages/omo-codex/plugin/components/ultrawork/test/skill-pointer.test.ts +0 -2
  105. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +6 -0
  106. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
  107. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  108. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +3 -2
  109. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/define-goal.md +108 -0
  110. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +1 -0
  111. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-continuation.test.ts +0 -1
  112. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +2 -2
  113. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +0 -3
  114. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +2 -35
  115. package/packages/omo-codex/plugin/components/ulw-loop/test/ultrawork-directive.test.ts +4 -5
  116. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  117. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  118. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  119. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
  120. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  121. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  122. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  123. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  124. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  125. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  126. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  127. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  128. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  129. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
  130. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  131. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  132. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
  133. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  134. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
  135. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  136. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  137. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  138. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  139. package/packages/omo-codex/plugin/package-lock.json +20 -20
  140. package/packages/omo-codex/plugin/package.json +1 -1
  141. package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +3 -2
  142. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/all-platforms.md +1 -1
  143. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/senpi.md +4 -4
  144. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
  145. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +10 -7
  146. package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +1 -0
  147. package/packages/omo-codex/plugin/skills/frontend/references/design/stylegallery.md +80 -0
  148. package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +37 -10
  149. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +179 -0
  150. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +1 -1
  151. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +11 -11
  152. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +6 -0
  153. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +3 -2
  154. package/packages/omo-codex/plugin/skills/ulw-loop/references/define-goal.md +108 -0
  155. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +1 -0
  156. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +2 -2
  157. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +27 -3
  158. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-clear.md +2 -1
  159. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +3 -3
  160. package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +19 -173
  161. package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +4 -24
  162. package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +175 -13
  163. package/packages/omo-codex/plugin/test/aggregate.test.mjs +78 -2
  164. package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +19 -33
  165. package/packages/omo-codex/plugin/test/lcx-contribute-bug-fix-template.test.mjs +21 -27
  166. package/packages/omo-codex/plugin/test/scaffold-plan.test.mjs +0 -36
  167. package/packages/omo-codex/plugin/test/sync-skills-codex-compatibility.test.mjs +101 -0
  168. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +1 -119
  169. package/packages/omo-codex/plugin/test/teammode-archive-ambiguity.test.mjs +0 -40
  170. package/packages/omo-codex/plugin/test/teammode-communication.test.mjs +6 -62
  171. package/packages/omo-codex/plugin/test/teammode-thread-links.test.mjs +3 -36
  172. package/packages/omo-codex/plugin/test/teammode-transport.test.mjs +0 -44
  173. package/packages/omo-codex/plugin/test/teammode-worktree.test.mjs +2 -6
  174. package/packages/omo-codex/plugin/test/ultrawork-skill-pointer.test.mjs +0 -3
  175. package/packages/omo-codex/plugin/test/ulw-plan-review-state-contract.test.mjs +0 -3
  176. package/packages/omo-codex/scripts/install-dist/install-local.mjs +57 -19
  177. package/packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs +7 -2
  178. package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +3 -2
  179. package/packages/shared-skills/skills/coding-agent-sessions/references/all-platforms.md +1 -1
  180. package/packages/shared-skills/skills/coding-agent-sessions/references/senpi.md +4 -4
  181. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
  182. package/packages/shared-skills/skills/frontend/SKILL.md +10 -7
  183. package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +1 -0
  184. package/packages/shared-skills/skills/frontend/references/design/stylegallery.md +80 -0
  185. package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +37 -10
  186. package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +179 -0
  187. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +1 -1
  188. package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +11 -11
  189. package/packages/shared-skills/skills/ulw-plan/SKILL.md +2 -2
  190. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +27 -3
  191. package/packages/shared-skills/skills/ulw-plan/references/intent-clear.md +2 -1
  192. package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +3 -3
  193. package/dist/tools/call-omo-agent/background-agent-executor.d.ts +0 -5
  194. package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +0 -92
  195. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +0 -314
  196. package/packages/omo-codex/plugin/test/ulw-plan-scope-contract.test.mjs +0 -24
@@ -136,7 +136,7 @@ No Metis, no plan file, no execution until the user approves. The UNCLEAR path a
136
136
 
137
137
  ## Phase 3 - Generate the plan (only after approval)
138
138
  1. Rerun `node "<skill-root>/scripts/scaffold-plan.mjs" <slug> [--clear|--unclear]` without `--draft-only`. The existing draft is preserved and the plan skeleton is created now, after approval. A plain rerun is a safe no-op; never hand-build the skeleton.
139
- 2. **Metis gap analysis (mandatory):** spawn a metis reviewer for contradictions, missing constraints, scope-creep, unvalidated assumptions, and missing acceptance criteria; fold findings in silently.
139
+ 2. **Metis gap analysis (mandatory):** spawn a metis reviewer for contradictions, missing constraints — including unstated extrinsic ones: budget/spend, mandated stack, expected scale, target audience / compliance — scope-creep, unvalidated assumptions, and missing acceptance criteria; fold findings in silently; require each constraint gap to return as a proposed default plus reversibility, or a single owner-question when defaulting is unsafe.
140
140
  3. APPEND todo batches into the `## Todos` region with edit/apply_patch - never rewrite the script-emitted headers; 50+ todos is fine; one request -> one plan.
141
141
  4. Fill `## TL;DR (For humans)` LAST, after the detailed plan, so it summarizes the real plan, not an intention.
142
142
  5. Self-review: every todo has references + agent-executable acceptance criteria + happy+failure QA scenarios; no business-logic assumption without evidence; zero criteria need a human. HR6 backstop - confirm the plan's FIRST `## ` heading is `## TL;DR (For humans)` and that every header below it appears in the template order; if you ever hand-built or reordered the file, the human summary must still lead.
@@ -180,7 +180,7 @@ Every "present the plan summary/brief" above delivers THIS structure, in the use
180
180
  6. **Execution handoff** - the plan runs in a worker session via `$start-work <plan-name>`; introduce the options: `--worktree <absolute-path>` (task-owned worktree; required for PR/branch work), `--make-pr` (deliver as a PR; auto-creates a task-owned worktree), `--ship` (implies `--make-pr`, keeps working until the PR is reviewed and MERGED).
181
181
 
182
182
  ### High-accuracy review (dual review)
183
- The high-accuracy review is DUAL and both passes must return OKAY before handoff: (1) the native `momus` reviewer subagent, and (2) an independent Oracle review via `task(subagent_type="oracle", ...)` on the strongest available reasoning model, in a fully isolated sub-session with normal approval and sandbox policy. Do not add flags that disable approvals or sandboxing. Momus runs at High and may take substantially longer than other agents. One round = exactly ONE `momus` + ONE independent review, dispatched together against the COMPLETE plan file (todos + TL;DR filled) at the draft's exact recorded `plan_path`. Keep Momus in flight and wait for its terminal result: elapsed time alone never justifies cancelling, duplicating, replacing, or treating it as failed. After both verdicts return, fix every cited issue and resubmit both fresh until each approves. CLEAR: runs when the user opts in or `review_required: true`. UNCLEAR: runs automatically unless Classify=Trivial.
183
+ The high-accuracy review is DUAL and both passes must return OKAY before handoff: (1) the native `momus` reviewer subagent, and (2) an independent Oracle review via `task(subagent_type="oracle", ...)` on the strongest available reasoning model, in a fully isolated sub-session with normal approval and sandbox policy. Do not add flags that disable approvals or sandboxing. Momus runs at High and may take substantially longer than other agents. One round = exactly ONE `momus` + ONE independent review, dispatched together against the COMPLETE plan file (todos + TL;DR filled) at the draft's exact recorded `plan_path`. Keep Momus in flight and wait for its terminal result: elapsed time alone never justifies cancelling, duplicating, replacing, or treating it as failed. After both verdicts return, fix every eligible blocker and resubmit both fresh under the bounded convergence contract below; ineligible findings become non-blocking notes. CLEAR: runs when the user opts in or `review_required: true`. UNCLEAR: runs automatically unless Classify=Trivial.
184
184
 
185
185
  Every reviewer prompt must carry this intake contract with all angle-bracket values replaced by literals from the current round before dispatch. Never pass `draft.plan_path`, `draft.plan_sha256`, field names, or another symbolic reference to an isolated reviewer. Its first action is to read the exact recorded path; retrieval drift stops that lane before review:
186
186
 
@@ -209,7 +209,31 @@ Every reviewer prompt must carry this intake contract with all angle-bracket val
209
209
 
210
210
  The first action must open the literal workspace root as a directory descriptor, then traverse `.omo`, `plans`, and the final target with descriptor-relative no-follow opens, `fstat` each ancestor as a directory and the final descriptor as a regular file, and hash all bytes read from that same final descriptor. If the platform cannot guarantee this chain, or any path/runtime/launch/receipt/digest check drifts, return `INCONCLUSIVE` before reviewing. Echo the literal workspace, runtime home, target, digest, round, and launch ID; the parent separately matches the completion envelope to the persisted session/process receipt. Never search or use another artifact.
211
211
 
212
- The draft must record the native Momus session/result, the independent review session/result, and the fix/retry summary. Immediately before handoff, repeat the same live canonical-path and SHA-256 validation and require it to match the approved round digest; drift invalidates both approvals and starts a fresh round. Do not say "high-accuracy review completed" unless both receipts exist, both final verdicts are unconditional approval, and the final live-plan validation passes.
212
+ ### Bounded convergence (the review must terminate)
213
+ Review rounds are capped at 5 (unlimited only on explicit user request), and an approval whose only remaining items are notes counts as approval. A finding may BLOCK only when it names at least one `blocker_eligibility` category below with its concrete evidence; every other finding - speculative durability, replay/crash-recovery, schema, CLI-parsing, state-machine, or hardening concerns the accepted scope never required - is recorded as a non-blocking note and becomes implementation/test work, never plan expansion. After round 1 the blocker ledger FREEZES: later rounds verify accepted ledger blockers, regressions introduced by fixes, and new findings that pass eligibility - they never rediscover the plan from scratch. Fixes apply the smallest edit that resolves the cited blocker; neither reviews nor fixes grow the plan's scope. Every reviewer prompt carries this convergence contract alongside the intake contract. On cap exhaustion without approval: STOP, report outstanding blockers, ask the user - continue / accept / adjust.
214
+
215
+ <!-- ulw-plan-review-convergence-contract -->
216
+ ```json
217
+ {
218
+ "max_rounds": 5,
219
+ "max_rounds_override": "explicit_user_request_only",
220
+ "on_cap_reached": "stop_report_outstanding_blockers_ask_user",
221
+ "blocker_eligibility": [
222
+ "explicit_requirement_or_accepted_decision",
223
+ "existing_failing_regression",
224
+ "reproducible_broken_flow",
225
+ "concrete_security_data_loss_or_compatibility_risk",
226
+ "external_api_provider_or_release_contract_conflict"
227
+ ],
228
+ "ineligible_finding_disposition": "non_blocking_note",
229
+ "approval_with_notes_counts_as_approval": true,
230
+ "ledger_freeze_after_round": 1,
231
+ "closure_round_scope": ["accepted_ledger_blockers", "regressions_introduced_by_fixes", "new_findings_passing_blocker_eligibility"],
232
+ "fix_edit_policy": "smallest_edit_no_scope_expansion"
233
+ }
234
+ ```
235
+
236
+ The draft must record the native Momus session/result, the independent review session/result, and the fix/retry summary, plus the convergence ledger (accepted blockers, non-blocking notes, round count). Immediately before handoff, repeat the same live canonical-path and SHA-256 validation and require it to match the approved round digest; drift invalidates both approvals and starts a fresh round. Do not say "high-accuracy review completed" unless both receipts exist, both final verdicts are unconditional approval, and the final live-plan validation passes.
213
237
 
214
238
  ## Delegation discipline (OpenCode-native)
215
239
  Every delegated prompt starts with `TASK:`, then DELIVERABLE / SCOPE / VERIFY; state the role inside the prompt and include only the context the child needs:
@@ -26,7 +26,7 @@ ASK WITH WHY: name what you explored, why it did not resolve, and which part of
26
26
 
27
27
  FOGGIEST-GAP targeting (ordinal, NO numbers): each turn aim at the single open gap whose resolution most unblocks the plan, and say why in one sentence; rotate across equally-foggy components. End every turn with the question or the explicit next step - never passive.
28
28
 
29
- CLEARANCE CHECK after each turn: objective defined? scope IN/OUT explicit? approach decided? test strategy confirmed? no blocking ambiguity left? Any NO is your next question; all YES -> present the approval brief and stop.
29
+ CLEARANCE CHECK after each turn: objective defined? scope IN/OUT explicit? approach decided? test strategy confirmed? constraints swept (budget / stack / scale / audience - each explored, defaulted, or asked)? no blocking ambiguity left? Any NO is your next question; all YES -> present the approval brief and stop.
30
30
  </interview>
31
31
 
32
32
  <approval_and_deliver>
@@ -40,5 +40,6 @@ Request: "add a 5/min-per-IP rate-limit to `/login`".
40
40
  3. Two surviving forks, each asked WITH WHY:
41
41
  - Storage backend (explored: repo already uses Redis; default = Redis; options Redis / in-memory / per-node) - why: persistence across nodes forks the design.
42
42
  - Over-limit response (default = 429 + Retry-After; options 429 / 423 / silent drop) - why: client contract forks on it.
43
+ - Swept axes: no budget/audience fork (internal service); scale bound = existing Redis capacity (defaulted, reversible).
43
44
  4. Approval brief -> explicit okay -> scaffold -> append todos -> if `review_required`, run dual review and deliver receipts; otherwise deliver with the optional review question.
44
45
  </worked_example>
@@ -20,13 +20,13 @@ TOPOLOGY LOCK still applies: enumerate the 1-6 independently-succeed/fail compon
20
20
  </research_protocol>
21
21
 
22
22
  <default_selection>
23
- For each open decision, adopt the defensible best-practice default (industry standard or repo convention), RECORD it in the draft's Open-assumptions ledger with rationale and reversibility, and proceed. NO numeric scoring - the ledger IS the audit trail. The ONLY default escalated to a single focused question is one that is irreversible, destructive, or safety-critical and research cannot settle.
23
+ For each open decision - including the extrinsic axes the sweep names (budget, mandated stack, expected scale, target audience / compliance) - adopt the defensible best-practice default (industry standard or repo convention), RECORD it in the draft's Open-assumptions ledger with rationale and reversibility, and proceed. NO numeric scoring - the ledger IS the audit trail. The ONLY default escalated to a single focused question is one that is irreversible, destructive, or safety-critical, or commits real spend the user never authorized, and research cannot settle.
24
24
 
25
25
  Fold a contrarian self-grill into the Metis spawn: challenge the single highest-leverage adopted assumption - is this constraint real or habitual; does any adopted default add complexity the request never asked for? - and return concrete reframes. The grill targets incidental complexity (unneeded abstraction, speculative capacity), NEVER the feature set: reducing, phasing, or deferring part of the request is not a reframe. Fold a reframe into the plan only as a recommended default plus rationale, never as a forced change.
26
26
  </default_selection>
27
27
 
28
28
  <high_accuracy_auto>
29
- Because the human did not steer, adversarial review SUBSTITUTES for the interview you skipped - this is what catches a bad default. Metis runs during plan generation as always; after Metis findings are folded and the plan file is complete, run the dual high-accuracy review defined in `full-workflow.md` AUTOMATICALLY - no "do you want a review?" question - and resubmit fresh until BOTH passes APPROVE, fixing every cited issue.
29
+ Because the human did not steer, adversarial review SUBSTITUTES for the interview you skipped - this is what catches a bad default. Metis runs during plan generation as always; after Metis findings are folded and the plan file is complete, run the dual high-accuracy review defined in `full-workflow.md` AUTOMATICALLY - no "do you want a review?" question - and drive it to convergence under the bounded convergence contract in `full-workflow.md`: fix every eligible blocker and resubmit fresh, record ineligible findings as non-blocking notes, and on cap exhaustion stop and ask the user.
30
30
 
31
31
  TRIVIAL-TIER GUARD: if Classify sized the work Trivial, the auto-Momus loop is SUPPRESSED (Metis still runs once) - a vague-but-tiny request ("clean this up") must not trigger the full adversarial loop. UNCLEAR raises the research-plus-default posture; it does not override the Trivial cost guard for Momus.
32
32
  </high_accuracy_auto>
@@ -40,5 +40,5 @@ Request: "make auth better".
40
40
  1. Research waves -> current auth at `src/auth/*` and evidence for the requested improvement; best-practice baselines via librarian.
41
41
  2. Topology lock as an ANNOUNCEMENT, not a question: components refine the evidenced auth intent in full, such as session hardening, brute-force protection, and password policy when the repository supports them. MFA is an adjacent capability and stays in Scope OUT unless the user asks for it or evidence establishes it as part of the requested outcome.
42
42
  3. Adopted-defaults table (assumption | default | rationale | reversible?): bcrypt rounds 8 -> 12 (reversible), add 5/min-per-IP login limit (reversible), rotate session id on privilege change (reversible).
43
- 4. Metis folded -> auto dual review (fix cited gaps until both approve) -> brief LEADING with the approach and the defaults, surfaced in the human TL;DR for veto.
43
+ 4. Metis folded -> auto dual review (fix eligible gaps under the bounded convergence contract) -> brief LEADING with the approach and the defaults, surfaced in the human TL;DR for veto.
44
44
  </worked_example>
package/dist/tui.js CHANGED
@@ -15197,7 +15197,7 @@ function finalize(ctx, schema) {
15197
15197
  result.$schema = "http://json-schema.org/draft-07/schema#";
15198
15198
  } else if (ctx.target === "draft-04") {
15199
15199
  result.$schema = "http://json-schema.org/draft-04/schema#";
15200
- } else if (ctx.target === "openapi-3.0") {} else {}
15200
+ } else if (ctx.target === "openapi-3.0") {}
15201
15201
  if (ctx.external?.uri) {
15202
15202
  const id = ctx.external.registry.get(schema)?.id;
15203
15203
  if (!id)
@@ -15458,7 +15458,7 @@ var formatMap, stringProcessor = (schema, ctx, _json, _params) => {
15458
15458
  if (val === undefined) {
15459
15459
  if (ctx.unrepresentable === "throw") {
15460
15460
  throw new Error("Literal `undefined` cannot be represented in JSON Schema");
15461
- } else {}
15461
+ }
15462
15462
  } else if (typeof val === "bigint") {
15463
15463
  if (ctx.unrepresentable === "throw") {
15464
15464
  throw new Error("BigInt literals cannot be represented in JSON Schema");
@@ -18837,15 +18837,16 @@ var init_codegraph = __esm(() => {
18837
18837
  });
18838
18838
 
18839
18839
  // packages/omo-config-core/src/schema/memory.ts
18840
- var OmoMemoryReflectionTriggerSchema, OmoMemoryReflectionSchema, OmoMemorySyncSchema, OmoMemorySearchSchema, OmoMemoryReflectionTriggerLayerSchema, OmoMemoryReflectionLayerSchema, OmoMemorySyncLayerSchema, OmoMemorySearchLayerSchema, OmoMemoryAgentOverridesSchema, OmoMemorySettingsSchema, OmoMemorySettingsLayerSchema;
18840
+ var OmoMemoryReflectionTriggerSchema, OmoMemoryReflectionSchema, OmoMemorySyncSchema, OmoMemorySearchSchema, OmoMemoryNudgeSchema, OmoMemoryFactsSchema, OmoMemoryDreamSchema, OmoMemoryPeopleSchema, OmoMemorySoulSchema, OmoMemoryReflectionTriggerLayerSchema, OmoMemoryReflectionLayerSchema, OmoMemorySyncLayerSchema, OmoMemorySearchLayerSchema, OmoMemoryNudgeLayerSchema, OmoMemoryFactsLayerSchema, OmoMemoryDreamLayerSchema, OmoMemoryPeopleLayerSchema, OmoMemorySoulLayerSchema, OmoMemoryAgentOverridesSchema, OmoMemorySettingsSchema, OmoMemorySettingsLayerSchema;
18841
18841
  var init_memory = __esm(() => {
18842
18842
  init_zod();
18843
18843
  OmoMemoryReflectionTriggerSchema = object({
18844
- step_count: number2().int().nonnegative().default(0),
18844
+ step_count: number2().int().nonnegative().default(25),
18845
18845
  on_compaction: boolean2().default(true)
18846
18846
  }).strict();
18847
18847
  OmoMemoryReflectionSchema = object({
18848
- trigger: OmoMemoryReflectionTriggerSchema.default({ step_count: 0, on_compaction: true }),
18848
+ enabled: boolean2().default(true),
18849
+ trigger: OmoMemoryReflectionTriggerSchema.default({ step_count: 25, on_compaction: true }),
18849
18850
  merge: _enum2(["auto", "integration"]).default("auto"),
18850
18851
  category: string2().min(1).default("quick"),
18851
18852
  timeout_minutes: number2().int().positive().default(15),
@@ -18858,11 +18859,36 @@ var init_memory = __esm(() => {
18858
18859
  OmoMemorySearchSchema = object({
18859
18860
  enabled: boolean2().default(true)
18860
18861
  }).strict();
18862
+ OmoMemoryNudgeSchema = object({
18863
+ enabled: boolean2().default(true),
18864
+ every_user_turns: number2().int().min(1).default(10)
18865
+ }).strict();
18866
+ OmoMemoryFactsSchema = object({
18867
+ enabled: boolean2().default(true),
18868
+ debounce_settles: number2().int().min(1).default(4)
18869
+ }).strict();
18870
+ OmoMemoryDreamSchema = object({
18871
+ enabled: boolean2().default(true),
18872
+ idle_minutes: number2().int().min(0).default(30),
18873
+ min_hours_between: number2().int().min(1).default(24),
18874
+ shutdown_launch: boolean2().default(true),
18875
+ auto_select_max: number2().int().min(1).max(10).default(5),
18876
+ auto_select_max_chars: number2().int().min(1e4).default(150000)
18877
+ }).strict();
18878
+ OmoMemoryPeopleSchema = object({
18879
+ enabled: boolean2().default(true),
18880
+ max_entries: number2().int().min(1).max(100).default(40),
18881
+ max_entry_chars: number2().int().min(50).max(500).default(200)
18882
+ }).strict();
18883
+ OmoMemorySoulSchema = object({
18884
+ edit_notice: boolean2().default(true)
18885
+ }).strict();
18861
18886
  OmoMemoryReflectionTriggerLayerSchema = object({
18862
18887
  step_count: number2().int().nonnegative().optional(),
18863
18888
  on_compaction: boolean2().optional()
18864
18889
  }).strict();
18865
18890
  OmoMemoryReflectionLayerSchema = object({
18891
+ enabled: boolean2().optional(),
18866
18892
  trigger: OmoMemoryReflectionTriggerLayerSchema.optional(),
18867
18893
  merge: _enum2(["auto", "integration"]).optional(),
18868
18894
  category: string2().min(1).optional(),
@@ -18876,10 +18902,39 @@ var init_memory = __esm(() => {
18876
18902
  OmoMemorySearchLayerSchema = object({
18877
18903
  enabled: boolean2().optional()
18878
18904
  }).strict();
18905
+ OmoMemoryNudgeLayerSchema = object({
18906
+ enabled: boolean2().optional(),
18907
+ every_user_turns: number2().int().min(1).optional()
18908
+ }).strict();
18909
+ OmoMemoryFactsLayerSchema = object({
18910
+ enabled: boolean2().optional(),
18911
+ debounce_settles: number2().int().min(1).optional()
18912
+ }).strict();
18913
+ OmoMemoryDreamLayerSchema = object({
18914
+ enabled: boolean2().optional(),
18915
+ idle_minutes: number2().int().min(0).optional(),
18916
+ min_hours_between: number2().int().min(1).optional(),
18917
+ shutdown_launch: boolean2().optional(),
18918
+ auto_select_max: number2().int().min(1).max(10).optional(),
18919
+ auto_select_max_chars: number2().int().min(1e4).optional()
18920
+ }).strict();
18921
+ OmoMemoryPeopleLayerSchema = object({
18922
+ enabled: boolean2().optional(),
18923
+ max_entries: number2().int().min(1).max(100).optional(),
18924
+ max_entry_chars: number2().int().min(50).max(500).optional()
18925
+ }).strict();
18926
+ OmoMemorySoulLayerSchema = object({
18927
+ edit_notice: boolean2().optional()
18928
+ }).strict();
18879
18929
  OmoMemoryAgentOverridesSchema = object({
18880
18930
  enabled: boolean2().optional(),
18881
18931
  agent: string2().min(1).optional(),
18882
18932
  reflection: OmoMemoryReflectionLayerSchema.optional(),
18933
+ nudge: OmoMemoryNudgeLayerSchema.optional(),
18934
+ facts: OmoMemoryFactsLayerSchema.optional(),
18935
+ dream: OmoMemoryDreamLayerSchema.optional(),
18936
+ people: OmoMemoryPeopleLayerSchema.optional(),
18937
+ soul: OmoMemorySoulLayerSchema.optional(),
18883
18938
  sync: OmoMemorySyncLayerSchema.optional(),
18884
18939
  search: OmoMemorySearchLayerSchema.optional(),
18885
18940
  compile_warn_tokens: number2().int().positive().optional()
@@ -18887,13 +18942,27 @@ var init_memory = __esm(() => {
18887
18942
  OmoMemorySettingsSchema = object({
18888
18943
  enabled: boolean2().default(true),
18889
18944
  agent: string2().min(1).default("auto"),
18945
+ tool_exposure: _enum2(["direct", "search"]).default("direct"),
18890
18946
  reflection: OmoMemoryReflectionSchema.default({
18891
- trigger: { step_count: 0, on_compaction: true },
18947
+ enabled: true,
18948
+ trigger: { step_count: 25, on_compaction: true },
18892
18949
  merge: "auto",
18893
18950
  category: "quick",
18894
18951
  timeout_minutes: 15,
18895
18952
  sandbox: "auto"
18896
18953
  }),
18954
+ nudge: OmoMemoryNudgeSchema.default({ enabled: true, every_user_turns: 10 }),
18955
+ facts: OmoMemoryFactsSchema.default({ enabled: true, debounce_settles: 4 }),
18956
+ dream: OmoMemoryDreamSchema.default({
18957
+ enabled: true,
18958
+ idle_minutes: 30,
18959
+ min_hours_between: 24,
18960
+ shutdown_launch: true,
18961
+ auto_select_max: 5,
18962
+ auto_select_max_chars: 150000
18963
+ }),
18964
+ people: OmoMemoryPeopleSchema.default({ enabled: true, max_entries: 40, max_entry_chars: 200 }),
18965
+ soul: OmoMemorySoulSchema.default({ edit_notice: true }),
18897
18966
  sync: OmoMemorySyncSchema.default({ enabled: true }),
18898
18967
  search: OmoMemorySearchSchema.default({ enabled: true }),
18899
18968
  compile_warn_tokens: number2().int().positive().default(30000),
@@ -18902,7 +18971,13 @@ var init_memory = __esm(() => {
18902
18971
  OmoMemorySettingsLayerSchema = object({
18903
18972
  enabled: boolean2().optional(),
18904
18973
  agent: string2().min(1).optional(),
18974
+ tool_exposure: _enum2(["direct", "search"]).optional(),
18905
18975
  reflection: OmoMemoryReflectionLayerSchema.optional(),
18976
+ nudge: OmoMemoryNudgeLayerSchema.optional(),
18977
+ facts: OmoMemoryFactsLayerSchema.optional(),
18978
+ dream: OmoMemoryDreamLayerSchema.optional(),
18979
+ people: OmoMemoryPeopleLayerSchema.optional(),
18980
+ soul: OmoMemorySoulLayerSchema.optional(),
18906
18981
  sync: OmoMemorySyncLayerSchema.optional(),
18907
18982
  search: OmoMemorySearchLayerSchema.optional(),
18908
18983
  compile_warn_tokens: number2().int().positive().optional(),
@@ -18941,7 +19016,7 @@ function resolveOmoTaskSettings(input, resolveParallelism = availableParallelism
18941
19016
  residency_max_children: record2["residency_max_children"] ?? Math.max(8, resolveParallelism() * 3)
18942
19017
  });
18943
19018
  }
18944
- var ResidencyMaxChildrenInputSchema, OmoTaskWaitSchema, OmoTaskTeamSettingsSchema, OmoTaskWarningsSchema, OmoTaskSettingsSchema, OmoTaskWaitLayerSchema, OmoTaskTeamSettingsLayerSchema, OmoTaskWarningsLayerSchema, OmoTaskSettingsLayerSchema;
19019
+ var ResidencyMaxChildrenInputSchema, OmoTaskWaitSchema, OmoTaskTeamSettingsSchema, OmoTaskWarningsSchema, OmoTaskDagSettingsSchema, OmoTaskSettingsSchema, OmoTaskDagSettingsLayerSchema, OmoTaskWaitLayerSchema, OmoTaskTeamSettingsLayerSchema, OmoTaskWarningsLayerSchema, OmoTaskSettingsLayerSchema;
18945
19020
  var init_task = __esm(() => {
18946
19021
  init_zod();
18947
19022
  ResidencyMaxChildrenInputSchema = union([number2().int().positive(), literal("unlimited")]);
@@ -18958,6 +19033,16 @@ var init_task = __esm(() => {
18958
19033
  OmoTaskWarningsSchema = object({
18959
19034
  unavailable_categories: boolean2().default(true)
18960
19035
  }).strict();
19036
+ OmoTaskDagSettingsSchema = object({
19037
+ max_nodes_per_run: number2().int().positive().default(64),
19038
+ max_runs_per_session: number2().int().positive().default(16),
19039
+ subscriber_ring: number2().int().positive().default(1000),
19040
+ heartbeat_ms: number2().int().positive().default(15000),
19041
+ history_default_limit: number2().int().positive().default(256),
19042
+ history_max_limit: number2().int().positive().default(1000),
19043
+ retention_days: number2().int().positive().default(7),
19044
+ max_prompt_bytes: number2().int().positive().default(262144)
19045
+ }).strict();
18961
19046
  OmoTaskSettingsSchema = object({
18962
19047
  default_execution_mode: _enum2(["in-process", "process"]).default("in-process"),
18963
19048
  default_concurrency: number2().int().positive().default(5),
@@ -18975,7 +19060,18 @@ var init_task = __esm(() => {
18975
19060
  max_members: 8,
18976
19061
  max_parallel_members: 4,
18977
19062
  max_wall_clock_minutes: 120
18978
- })
19063
+ }),
19064
+ dag: OmoTaskDagSettingsSchema.optional()
19065
+ }).strict();
19066
+ OmoTaskDagSettingsLayerSchema = object({
19067
+ max_nodes_per_run: number2().int().positive().optional(),
19068
+ max_runs_per_session: number2().int().positive().optional(),
19069
+ subscriber_ring: number2().int().positive().optional(),
19070
+ heartbeat_ms: number2().int().positive().optional(),
19071
+ history_default_limit: number2().int().positive().optional(),
19072
+ history_max_limit: number2().int().positive().optional(),
19073
+ retention_days: number2().int().positive().optional(),
19074
+ max_prompt_bytes: number2().int().positive().optional()
18979
19075
  }).strict();
18980
19076
  OmoTaskWaitLayerSchema = object({
18981
19077
  min_ms: number2().int().positive().optional(),
@@ -19003,7 +19099,8 @@ var init_task = __esm(() => {
19003
19099
  resume_children: boolean2().optional(),
19004
19100
  warnings: OmoTaskWarningsLayerSchema.optional(),
19005
19101
  wait: OmoTaskWaitLayerSchema.optional(),
19006
- team: OmoTaskTeamSettingsLayerSchema.optional()
19102
+ team: OmoTaskTeamSettingsLayerSchema.optional(),
19103
+ dag: OmoTaskDagSettingsLayerSchema.optional()
19007
19104
  }).strict();
19008
19105
  });
19009
19106
 
@@ -19058,6 +19155,19 @@ var init_team = __esm(() => {
19058
19155
  OmoTeamsConfigLayerSchema = record(string2(), OmoTeamSpecLayerSchema);
19059
19156
  });
19060
19157
 
19158
+ // packages/omo-config-core/src/schema/telemetry.ts
19159
+ var OmoTelemetrySettingsShape, OmoTelemetrySettingsLayerSchema, OmoTelemetrySettingsSchema;
19160
+ var init_telemetry = __esm(() => {
19161
+ init_zod();
19162
+ OmoTelemetrySettingsShape = {
19163
+ enabled: boolean2()
19164
+ };
19165
+ OmoTelemetrySettingsLayerSchema = object(OmoTelemetrySettingsShape).partial().strict();
19166
+ OmoTelemetrySettingsSchema = OmoTelemetrySettingsLayerSchema.extend({
19167
+ enabled: boolean2().default(true)
19168
+ }).strict();
19169
+ });
19170
+
19061
19171
  // packages/omo-config-core/src/schema/config.ts
19062
19172
  var OmoOpenCodeHarnessConfigSchema, OmoTypedHarnessConfigSchema, OmoConfigProfileSchema, OmoConfigSchema, OmoConfigLayerSchema;
19063
19173
  var init_config = __esm(() => {
@@ -19069,6 +19179,7 @@ var init_config = __esm(() => {
19069
19179
  init_model_catalog();
19070
19180
  init_task();
19071
19181
  init_team();
19182
+ init_telemetry();
19072
19183
  OmoOpenCodeHarnessConfigSchema = record(string2(), unknown());
19073
19184
  OmoTypedHarnessConfigSchema = object({
19074
19185
  categories: OmoCategoriesConfigSchema.optional(),
@@ -19077,7 +19188,8 @@ var init_config = __esm(() => {
19077
19188
  task: OmoTaskSettingsLayerSchema.optional(),
19078
19189
  teams: OmoTeamsConfigLayerSchema.optional(),
19079
19190
  models: OmoModelCatalogLayerSchema.optional(),
19080
- memory: OmoMemorySettingsLayerSchema.optional()
19191
+ memory: OmoMemorySettingsLayerSchema.optional(),
19192
+ telemetry: OmoTelemetrySettingsLayerSchema.optional()
19081
19193
  }).strict();
19082
19194
  OmoConfigProfileSchema = object({
19083
19195
  categories: OmoCategoriesConfigSchema.optional(),
@@ -19087,6 +19199,7 @@ var init_config = __esm(() => {
19087
19199
  teams: OmoTeamsConfigLayerSchema.optional(),
19088
19200
  models: OmoModelCatalogLayerSchema.optional(),
19089
19201
  memory: OmoMemorySettingsLayerSchema.optional(),
19202
+ telemetry: OmoTelemetrySettingsLayerSchema.optional(),
19090
19203
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
19091
19204
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
19092
19205
  "[codex]": OmoTypedHarnessConfigSchema.optional()
@@ -19100,6 +19213,7 @@ var init_config = __esm(() => {
19100
19213
  teams: OmoTeamsConfigSchema.optional(),
19101
19214
  models: OmoModelCatalogSchema.optional(),
19102
19215
  memory: OmoMemorySettingsSchema.optional(),
19216
+ telemetry: OmoTelemetrySettingsSchema.optional(),
19103
19217
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
19104
19218
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
19105
19219
  "[codex]": OmoTypedHarnessConfigSchema.optional(),
@@ -19116,6 +19230,7 @@ var init_config = __esm(() => {
19116
19230
  teams: OmoTeamsConfigLayerSchema.optional(),
19117
19231
  models: OmoModelCatalogLayerSchema.optional(),
19118
19232
  memory: OmoMemorySettingsLayerSchema.optional(),
19233
+ telemetry: OmoTelemetrySettingsLayerSchema.optional(),
19119
19234
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
19120
19235
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
19121
19236
  "[codex]": OmoTypedHarnessConfigSchema.optional(),
@@ -19138,6 +19253,7 @@ var init_schema = __esm(() => {
19138
19253
  init_model_ref();
19139
19254
  init_task();
19140
19255
  init_team();
19256
+ init_telemetry();
19141
19257
  });
19142
19258
 
19143
19259
  // packages/omo-config-core/src/loader/merge.ts
@@ -20964,10 +21080,10 @@ var init_category_model_requirements = __esm(() => {
20964
21080
  quick: {
20965
21081
  fallbackChain: [
20966
21082
  { providers: ["kimi-for-coding"], model: "kimi-for-coding-highspeed" },
20967
- { providers: ["quotio-openai"], model: "gpt-5.6-luna-fast", variant: "low" },
21083
+ { providers: ["openai-codex"], model: "gpt-5.6-luna-fast", variant: "low" },
20968
21084
  { providers: ["deepseek"], model: "deepseek-v4-flash", variant: "off" },
20969
21085
  {
20970
- providers: ["qwen-token-plan", "alibaba-token-plan", "bailian-coding-plan", "opencode-go", "vercel"],
21086
+ providers: ["qwen-token-plan", "alibaba-token-plan", "bailian-coding-plan", "vercel"],
20971
21087
  model: "qwen3.6-flash",
20972
21088
  variant: "low"
20973
21089
  },
@@ -20983,6 +21099,11 @@ var init_category_model_requirements = __esm(() => {
20983
21099
  },
20984
21100
  "unspecified-low": {
20985
21101
  fallbackChain: [
21102
+ {
21103
+ providers: ["xai", "github-copilot", "opencode", "vercel"],
21104
+ model: "grok-4.6",
21105
+ variant: "xhigh"
21106
+ },
20986
21107
  {
20987
21108
  providers: ["openai", "quotio-openai", "github-copilot", "opencode", "vercel"],
20988
21109
  model: "gpt-5.6-terra",
@@ -77849,6 +77970,47 @@ var init_model_capabilities_generated = __esm(() => {
77849
77970
  input: 272000,
77850
77971
  output: 128000
77851
77972
  }
77973
+ },
77974
+ "grok-4.6": {
77975
+ id: "grok-4.6",
77976
+ family: "grok",
77977
+ reasoning: true,
77978
+ temperature: true,
77979
+ toolCall: true,
77980
+ modalities: {
77981
+ input: [
77982
+ "text",
77983
+ "image"
77984
+ ],
77985
+ output: [
77986
+ "text"
77987
+ ]
77988
+ },
77989
+ limit: {
77990
+ context: 500000,
77991
+ output: 500000
77992
+ }
77993
+ },
77994
+ "xai/grok-4.6": {
77995
+ id: "xai/grok-4.6",
77996
+ family: "grok",
77997
+ reasoning: true,
77998
+ temperature: true,
77999
+ toolCall: true,
78000
+ modalities: {
78001
+ input: [
78002
+ "text",
78003
+ "image",
78004
+ "pdf"
78005
+ ],
78006
+ output: [
78007
+ "text"
78008
+ ]
78009
+ },
78010
+ limit: {
78011
+ context: 500000,
78012
+ output: 500000
78013
+ }
77852
78014
  }
77853
78015
  }
77854
78016
  };
@@ -78347,7 +78509,7 @@ This is NOT a default choice - it's for genuinely unclassifiable moderate-effort
78347
78509
  </Category_Context>
78348
78510
 
78349
78511
  <Caller_Warning>
78350
- THIS CATEGORY USES A LIGHTWEIGHT MODEL (gpt-5.6-luna).
78512
+ THIS CATEGORY USES GROK 4.6 (xhigh).
78351
78513
 
78352
78514
  **PROVIDE CLEAR STRUCTURE:**
78353
78515
  1. MUST DO: Enumerate required actions explicitly
@@ -78379,7 +78541,7 @@ var init_openai_categories = __esm(() => {
78379
78541
  },
78380
78542
  {
78381
78543
  name: "unspecified-low",
78382
- config: { model: "openai/gpt-5.6-luna", variant: "xhigh" },
78544
+ config: { model: "xai/grok-4.6", variant: "xhigh" },
78383
78545
  description: "Tasks that don't fit other categories, low effort required",
78384
78546
  promptAppend: UNSPECIFIED_LOW_CATEGORY_PROMPT_APPEND
78385
78547
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-opencode",
3
- "version": "5.0.0-beta.1",
3
+ "version": "5.0.0-beta.10",
4
4
  "description": "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
5
5
  "main": "./dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -136,6 +136,7 @@
136
136
  "typecheck:script": "tsgo --noEmit -p script/tsconfig.json",
137
137
  "test": "bun test",
138
138
  "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",
139
+ "test:fast": "bun run script/test-fast.ts",
139
140
  "test:senpi": "bun run build:senpi-plugin && tsgo --noEmit -p packages/omo-senpi/tsconfig.json && bun test packages/omo-senpi",
140
141
  "test:windows-codex": "bun run test:codex",
141
142
  "build:git-bash-mcp": "bun run --cwd packages/git-bash-mcp build",
@@ -180,7 +181,7 @@
180
181
  "zod": "^4.4.3"
181
182
  },
182
183
  "devDependencies": {
183
- "@code-yeongyu/senpi": "2026.8.9-2",
184
+ "@code-yeongyu/senpi": "2026.8.18-2",
184
185
  "@oh-my-opencode/agents-md-core": "workspace:*",
185
186
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
186
187
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -196,6 +197,7 @@
196
197
  "@oh-my-opencode/model-core": "workspace:*",
197
198
  "@oh-my-opencode/omo-codex": "workspace:*",
198
199
  "@oh-my-opencode/omo-config-core": "workspace:*",
200
+ "@oh-my-opencode/omo-opencode": "workspace:*",
199
201
  "@oh-my-opencode/omo-senpi": "workspace:*",
200
202
  "@oh-my-opencode/openclaw-core": "workspace:*",
201
203
  "@oh-my-opencode/pi-goal": "workspace:*",
@@ -211,7 +213,7 @@
211
213
  "@oh-my-opencode/utils": "workspace:*",
212
214
  "@types/js-yaml": "^4.0.9",
213
215
  "@types/picomatch": "^4.0.3",
214
- "@typescript/native-preview": "7.0.0-dev.20260518.1",
216
+ "@typescript/native-preview": "7.0.0-dev.20260707.2",
215
217
  "@xterm/addon-unicode11": "^0.9.0",
216
218
  "@xterm/xterm": "^6.0.0",
217
219
  "bun-types": "1.3.14",
@@ -220,24 +222,24 @@
220
222
  "typescript": "^7.0.2"
221
223
  },
222
224
  "optionalDependencies": {
223
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.1",
224
- "oh-my-opencode-darwin-x64": "5.0.0-beta.1",
225
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.1",
226
- "oh-my-opencode-linux-arm64": "5.0.0-beta.1",
227
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.1",
228
- "oh-my-opencode-linux-x64": "5.0.0-beta.1",
229
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.1",
230
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.1",
231
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.1",
232
- "oh-my-opencode-windows-arm64": "5.0.0-beta.1",
233
- "oh-my-opencode-windows-x64": "5.0.0-beta.1",
234
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.1"
225
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.10",
226
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.10",
227
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.10",
228
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.10",
229
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.10",
230
+ "oh-my-opencode-linux-x64": "5.0.0-beta.10",
231
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.10",
232
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.10",
233
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.10",
234
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.10",
235
+ "oh-my-opencode-windows-x64": "5.0.0-beta.10",
236
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.10"
235
237
  },
236
238
  "overrides": {
237
- "@earendil-works/pi-agent-core": "0.80.3",
238
- "@earendil-works/pi-ai": "0.80.3",
239
- "@earendil-works/pi-coding-agent": "0.80.3",
240
- "@earendil-works/pi-tui": "0.80.3",
239
+ "@earendil-works/pi-agent-core": "0.84.2",
240
+ "@earendil-works/pi-ai": "0.84.2",
241
+ "@earendil-works/pi-coding-agent": "0.84.2",
242
+ "@earendil-works/pi-tui": "0.84.2",
241
243
  "hono": "^4.12.18",
242
244
  "@hono/node-server": "^1.19.13",
243
245
  "express-rate-limit": "^8.5.1",
@@ -0,0 +1,44 @@
1
+ import { afterEach, describe, expect, it } from "bun:test";
2
+
3
+ import {
4
+ createWorkspaceEditTestHarness,
5
+ diagnostic,
6
+ readEvents,
7
+ } from "./workspace-apply-edit-test-support.js";
8
+
9
+ const harness = createWorkspaceEditTestHarness();
10
+
11
+ afterEach(async () => {
12
+ await harness.cleanup();
13
+ });
14
+
15
+ describe("LspClient diagnostics concurrency", () => {
16
+ it("#given concurrent diagnostics on a cold file and an exact didOpen publish #when pull is not advertised #then one didOpen opens the file and both requests receive the current diagnostics", async () => {
17
+ const context = await harness.makeClient(
18
+ {
19
+ publishDiagnostics: [
20
+ {
21
+ trigger: "didOpen",
22
+ version: 1,
23
+ diagnostics: [diagnostic("exact-current")],
24
+ awaitClientDelivery: true,
25
+ },
26
+ ],
27
+ },
28
+ { diagnosticsFreshnessTimeoutMs: 500, versionlessPublishQuiescenceMs: 5 },
29
+ );
30
+
31
+ const [first, second] = await Promise.all([
32
+ context.client.diagnostics(context.source),
33
+ context.client.diagnostics(context.source),
34
+ ]);
35
+
36
+ expect(first.items).toEqual([diagnostic("exact-current")]);
37
+ expect(second.items).toEqual([diagnostic("exact-current")]);
38
+ expect(
39
+ readEvents(context.events).filter(
40
+ (event) => event.type === "clientNotification" && event.method === "textDocument/didOpen",
41
+ ),
42
+ ).toHaveLength(1);
43
+ });
44
+ });
@@ -16,34 +16,6 @@ afterEach(async () => {
16
16
  });
17
17
 
18
18
  describe("LspClient diagnostics freshness", () => {
19
- it("#given concurrent diagnostics on a cold file and an exact didOpen publish #when pull is not advertised #then one didOpen opens the file and both requests receive the current diagnostics", async () => {
20
- const context = await harness.makeClient(
21
- {
22
- publishDiagnostics: [
23
- {
24
- trigger: "didOpen",
25
- version: 1,
26
- diagnostics: [diagnostic("exact-current")],
27
- },
28
- ],
29
- },
30
- { diagnosticsFreshnessTimeoutMs: 50, versionlessPublishQuiescenceMs: 5 },
31
- );
32
-
33
- const [first, second] = await Promise.all([
34
- context.client.diagnostics(context.source),
35
- context.client.diagnostics(context.source),
36
- ]);
37
-
38
- expect(first.items).toEqual([diagnostic("exact-current")]);
39
- expect(second.items).toEqual([diagnostic("exact-current")]);
40
- expect(
41
- readEvents(context.events).filter(
42
- (event) => event.type === "clientNotification" && event.method === "textDocument/didOpen",
43
- ),
44
- ).toHaveLength(1);
45
- });
46
-
47
19
  it("#given a versionless publish that arrives after the current change #when no newer eligible publish arrives before quiescence #then diagnostics wait for that quiescence window and return the versionless payload", async () => {
48
20
  const context = await harness.makeClient(
49
21
  {