oh-my-opencode 5.0.0-beta.52 → 5.0.0-beta.54

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 (98) hide show
  1. package/.agents/command/publish.md +15 -7
  2. package/.agents/skills/publish/SKILL.md +15 -7
  3. package/.opencode/command/publish.md +15 -7
  4. package/README.ja.md +11 -18
  5. package/README.ko.md +10 -17
  6. package/README.md +11 -18
  7. package/README.ru.md +11 -18
  8. package/README.zh-cn.md +11 -18
  9. package/dist/cli/index.js +147 -46
  10. package/dist/cli-node/index.js +147 -46
  11. package/dist/index.js +1311 -1200
  12. package/dist/skills/refactor/SKILL.md +3 -3
  13. package/dist/skills/review-work/SKILL.md +1 -1
  14. package/dist/skills/ulw-execute/SKILL.md +5 -5
  15. package/dist/tui.js +107 -10
  16. package/package.json +15 -14
  17. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  18. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  19. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  20. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  21. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  22. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  23. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  24. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  25. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  26. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  27. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  28. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  29. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  30. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  31. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  32. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  33. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  34. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  35. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  36. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  37. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  38. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  39. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.d.ts +5 -1
  40. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.js +14 -34
  41. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-continuation.js +1 -4
  42. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.d.ts +0 -18
  43. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.js +1 -88
  44. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.d.ts +2 -0
  45. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +10 -3
  46. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-arg-parser.js +2 -2
  47. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.js +2 -0
  48. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +86 -174
  49. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.d.ts +2 -18
  50. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.js +23 -33
  51. package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.d.ts +2 -0
  52. package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.js +16 -9
  53. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  54. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  55. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-codex-validation.ts +18 -59
  56. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-continuation.ts +1 -6
  57. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-reconciliation.ts +1 -124
  58. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +11 -3
  59. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-arg-parser.ts +10 -4
  60. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-subcommands.ts +2 -0
  61. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-snapshot.ts +31 -50
  62. package/packages/omo-codex/plugin/components/ulw-loop/src/review-blockers.ts +29 -10
  63. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-final.test.ts +0 -82
  64. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint.test.ts +16 -22
  65. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-checkpoint.test.ts +27 -0
  66. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-json-errors.test.ts +25 -0
  67. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-snapshot.test.ts +34 -11
  68. package/packages/omo-codex/plugin/components/ulw-loop/test/guided-recovery.test.ts +9 -47
  69. package/packages/omo-codex/plugin/components/ulw-loop/test/review-blockers.test.ts +9 -7
  70. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  71. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  72. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  73. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  74. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  75. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  76. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  77. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  78. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  79. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  80. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  81. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  82. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  83. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  84. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  85. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  86. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  87. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  88. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  89. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  90. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  91. package/packages/omo-codex/plugin/package-lock.json +12 -12
  92. package/packages/omo-codex/plugin/package.json +1 -1
  93. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +3 -3
  94. package/packages/omo-codex/plugin/skills/ulw-execute/SKILL.md +5 -5
  95. package/packages/omo-codex/scripts/install-dist/install-local.mjs +2 -2
  96. package/packages/shared-skills/skills/refactor/SKILL.md +3 -3
  97. package/packages/shared-skills/skills/review-work/SKILL.md +1 -1
  98. package/packages/shared-skills/skills/ulw-execute/SKILL.md +5 -5
package/dist/cli/index.js CHANGED
@@ -64,7 +64,7 @@ var package_default;
64
64
  var init_package = __esm(() => {
65
65
  package_default = {
66
66
  name: "oh-my-opencode",
67
- version: "5.0.0-beta.52",
67
+ version: "5.0.0-beta.54",
68
68
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
69
69
  main: "./dist/index.js",
70
70
  types: "dist/index.d.ts",
@@ -202,6 +202,7 @@ var init_package = __esm(() => {
202
202
  "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/ast-grep-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/memory-core/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 && tsgo --noEmit -p packages/omo-native/tsconfig.json",
203
203
  "typecheck:script": "tsgo --noEmit -p script/tsconfig.json",
204
204
  test: "bun test --timeout 20000",
205
+ "changelog:section": "bun script/changelog-section.ts",
205
206
  "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 && node scripts/check-third-party-notices.mjs --ship && bun test --timeout 20000 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",
206
207
  "test:fast": "bun run script/test-fast.ts",
207
208
  "test:senpi": "bun run build:senpi-plugin && tsgo --noEmit -p packages/omo-senpi/tsconfig.json && bun test --timeout 20000 packages/omo-senpi && bun test ./.agents/skills/senpi-qa/scripts/resolve-evidence-dir.test.mjs",
@@ -248,7 +249,7 @@ var init_package = __esm(() => {
248
249
  zod: "^4.4.3"
249
250
  },
250
251
  devDependencies: {
251
- "@code-yeongyu/senpi": "2026.9.10",
252
+ "@code-yeongyu/senpi": "2026.9.11",
252
253
  "@oh-my-opencode/agents-md-core": "workspace:*",
253
254
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
254
255
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -289,18 +290,18 @@ var init_package = __esm(() => {
289
290
  typescript: "^7.0.2"
290
291
  },
291
292
  optionalDependencies: {
292
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.52",
293
- "oh-my-opencode-darwin-x64": "5.0.0-beta.52",
294
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.52",
295
- "oh-my-opencode-linux-arm64": "5.0.0-beta.52",
296
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.52",
297
- "oh-my-opencode-linux-x64": "5.0.0-beta.52",
298
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.52",
299
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.52",
300
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.52",
301
- "oh-my-opencode-windows-arm64": "5.0.0-beta.52",
302
- "oh-my-opencode-windows-x64": "5.0.0-beta.52",
303
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.52"
293
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.54",
294
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.54",
295
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.54",
296
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.54",
297
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.54",
298
+ "oh-my-opencode-linux-x64": "5.0.0-beta.54",
299
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.54",
300
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.54",
301
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.54",
302
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.54",
303
+ "oh-my-opencode-windows-x64": "5.0.0-beta.54",
304
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.54"
304
305
  },
305
306
  overrides: {
306
307
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -72651,7 +72652,7 @@ var init_harness = __esm(() => {
72651
72652
  });
72652
72653
 
72653
72654
  // packages/omo-config-core/src/schema/memory.ts
72654
- var OmoMemoryReflectionTriggerSchema, OmoMemoryReflectionSchema, OmoMemorySyncSchema, OmoMemorySearchSchema, OmoMemoryRecallSchema, OmoMemoryNudgeSchema, OmoMemoryFactsSchema, OmoMemoryDreamSchema, OmoMemoryPeopleSchema, OmoMemorySoulSchema, OmoMemoryWriteNoticeSchema, OmoMemoryReflectionTriggerLayerSchema, OmoMemoryReflectionLayerSchema, OmoMemorySyncLayerSchema, OmoMemorySearchLayerSchema, OmoMemoryRecallLayerSchema, OmoMemoryNudgeLayerSchema, OmoMemoryFactsLayerSchema, OmoMemoryDreamLayerSchema, OmoMemoryPeopleLayerSchema, OmoMemorySoulLayerSchema, OmoMemoryWriteNoticeLayerSchema, OmoMemoryAgentOverridesSchema, OmoMemorySettingsSchema, OmoMemorySettingsLayerSchema;
72655
+ var OmoMemoryReflectionTriggerSchema, OmoMemoryReflectionSchema, OmoMemorySyncSchema, OmoMemorySearchSchema, OmoMemoryRecallEventCapsSchema, OmoMemoryRecallSchema, OmoMemoryNudgeSchema, OmoMemoryFactsSchema, OmoMemoryDreamSchema, OmoMemoryPeopleSchema, OmoMemorySoulSchema, OmoMemoryWriteNoticeSchema, OmoMemoryReflectionTriggerLayerSchema, OmoMemoryReflectionLayerSchema, OmoMemorySyncLayerSchema, OmoMemorySearchLayerSchema, OmoMemoryRecallEventCapsLayerSchema, OmoMemoryRecallLayerSchema, OmoMemoryNudgeLayerSchema, OmoMemoryFactsLayerSchema, OmoMemoryDreamLayerSchema, OmoMemoryPeopleLayerSchema, OmoMemorySoulLayerSchema, OmoMemoryWriteNoticeLayerSchema, OmoMemoryAgentOverridesSchema, OmoMemorySettingsSchema, OmoMemorySettingsLayerSchema;
72655
72656
  var init_memory = __esm(() => {
72656
72657
  init_zod();
72657
72658
  OmoMemoryReflectionTriggerSchema = object({
@@ -72673,9 +72674,20 @@ var init_memory = __esm(() => {
72673
72674
  OmoMemorySearchSchema = object({
72674
72675
  enabled: boolean2().default(true)
72675
72676
  }).strict();
72677
+ OmoMemoryRecallEventCapsSchema = object({
72678
+ tool_args: number2().int().nonnegative().default(400),
72679
+ result_head: number2().int().nonnegative().default(600),
72680
+ assistant: number2().int().nonnegative().default(1500),
72681
+ prompt: number2().int().nonnegative().default(4000)
72682
+ }).strict();
72676
72683
  OmoMemoryRecallSchema = object({
72677
72684
  enabled: boolean2().default(true),
72678
- max_items: number2().int().min(1).max(5).default(2)
72685
+ max_items: number2().int().min(1).max(5).default(2),
72686
+ category: string2().min(1).default("quick"),
72687
+ event_caps: OmoMemoryRecallEventCapsSchema.default({ tool_args: 400, result_head: 600, assistant: 1500, prompt: 4000 }),
72688
+ sidecar_max_tokens: number2().int().positive().default(48000),
72689
+ max_concurrent_wakes: number2().int().positive().default(2),
72690
+ tool_budget: number2().int().positive().default(8)
72679
72691
  }).strict();
72680
72692
  OmoMemoryNudgeSchema = object({
72681
72693
  enabled: boolean2().default(true),
@@ -72723,9 +72735,20 @@ var init_memory = __esm(() => {
72723
72735
  OmoMemorySearchLayerSchema = object({
72724
72736
  enabled: boolean2().optional()
72725
72737
  }).strict();
72738
+ OmoMemoryRecallEventCapsLayerSchema = object({
72739
+ tool_args: number2().int().nonnegative().optional(),
72740
+ result_head: number2().int().nonnegative().optional(),
72741
+ assistant: number2().int().nonnegative().optional(),
72742
+ prompt: number2().int().nonnegative().optional()
72743
+ }).strict();
72726
72744
  OmoMemoryRecallLayerSchema = object({
72727
72745
  enabled: boolean2().optional(),
72728
- max_items: number2().int().min(1).max(5).optional()
72746
+ max_items: number2().int().min(1).max(5).optional(),
72747
+ category: string2().min(1).optional(),
72748
+ event_caps: OmoMemoryRecallEventCapsLayerSchema.optional(),
72749
+ sidecar_max_tokens: number2().int().positive().optional(),
72750
+ max_concurrent_wakes: number2().int().positive().optional(),
72751
+ tool_budget: number2().int().positive().optional()
72729
72752
  }).strict();
72730
72753
  OmoMemoryNudgeLayerSchema = object({
72731
72754
  enabled: boolean2().optional(),
@@ -72795,7 +72818,15 @@ var init_memory = __esm(() => {
72795
72818
  write_notice: OmoMemoryWriteNoticeSchema.default({ enabled: true }),
72796
72819
  sync: OmoMemorySyncSchema.default({ enabled: true }),
72797
72820
  search: OmoMemorySearchSchema.default({ enabled: true }),
72798
- recall: OmoMemoryRecallSchema.default({ enabled: true, max_items: 2 }),
72821
+ recall: OmoMemoryRecallSchema.default({
72822
+ enabled: true,
72823
+ max_items: 2,
72824
+ category: "quick",
72825
+ event_caps: { tool_args: 400, result_head: 600, assistant: 1500, prompt: 4000 },
72826
+ sidecar_max_tokens: 48000,
72827
+ max_concurrent_wakes: 2,
72828
+ tool_budget: 8
72829
+ }),
72799
72830
  compile_warn_tokens: number2().int().positive().default(30000),
72800
72831
  agents: record(string2(), OmoMemoryAgentOverridesSchema).default({})
72801
72832
  }).strict();
@@ -72839,6 +72870,25 @@ var init_model_catalog = __esm(() => {
72839
72870
  OmoModelCatalogLayerSchema = record(string2(), OmoModelCatalogEntryLayerSchema);
72840
72871
  });
72841
72872
 
72873
+ // packages/omo-config-core/src/schema/model-profile.ts
72874
+ function isRecord8(value) {
72875
+ return typeof value === "object" && value !== null && !Array.isArray(value);
72876
+ }
72877
+ var OmoModelProfileInputSchema, OmoModelProfileSchema, OmoModelProfilesSchema, OmoModelProfileLayerInputSchema, OmoModelProfileLayerSchema, OmoModelProfilesLayerSchema;
72878
+ var init_model_profile = __esm(() => {
72879
+ init_zod();
72880
+ init_fallback_models();
72881
+ OmoModelProfileInputSchema = object({
72882
+ display_name: string2().optional(),
72883
+ models: array(union([string2(), OmoFallbackModelObjectSchema])).optional()
72884
+ }).strict();
72885
+ OmoModelProfileSchema = preprocess((value) => isRecord8(value) ? normalizeLegacyModelFields(value) : value, OmoModelProfileInputSchema);
72886
+ OmoModelProfilesSchema = record(string2(), OmoModelProfileSchema);
72887
+ OmoModelProfileLayerInputSchema = OmoModelProfileInputSchema.partial();
72888
+ OmoModelProfileLayerSchema = preprocess((value) => isRecord8(value) ? normalizeLegacyModelFields(value) : value, OmoModelProfileLayerInputSchema);
72889
+ OmoModelProfilesLayerSchema = record(string2(), OmoModelProfileLayerSchema);
72890
+ });
72891
+
72842
72892
  // packages/omo-config-core/src/schema/task.ts
72843
72893
  import { availableParallelism } from "os";
72844
72894
  function resolveOmoTaskSettings(input, resolveParallelism = availableParallelism) {
@@ -73031,6 +73081,7 @@ var init_config = __esm(() => {
73031
73081
  init_git_master();
73032
73082
  init_memory();
73033
73083
  init_model_catalog();
73084
+ init_model_profile();
73034
73085
  init_task();
73035
73086
  init_team();
73036
73087
  init_telemetry();
@@ -73044,6 +73095,8 @@ var init_config = __esm(() => {
73044
73095
  task: OmoTaskSettingsLayerSchema.optional(),
73045
73096
  teams: OmoTeamsConfigLayerSchema.optional(),
73046
73097
  models: OmoModelCatalogLayerSchema.optional(),
73098
+ model_profiles: OmoModelProfilesLayerSchema.optional(),
73099
+ model_profile: string2().optional(),
73047
73100
  memory: OmoMemorySettingsLayerSchema.optional(),
73048
73101
  telemetry: OmoTelemetrySettingsLayerSchema.optional()
73049
73102
  }).strict();
@@ -73055,6 +73108,8 @@ var init_config = __esm(() => {
73055
73108
  task: OmoTaskSettingsLayerSchema.optional(),
73056
73109
  teams: OmoTeamsConfigLayerSchema.optional(),
73057
73110
  models: OmoModelCatalogLayerSchema.optional(),
73111
+ model_profiles: OmoModelProfilesLayerSchema.optional(),
73112
+ model_profile: string2().optional(),
73058
73113
  memory: OmoMemorySettingsLayerSchema.optional(),
73059
73114
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
73060
73115
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
@@ -73070,6 +73125,8 @@ var init_config = __esm(() => {
73070
73125
  task: OmoTaskSettingsSchema.optional(),
73071
73126
  teams: OmoTeamsConfigSchema.optional(),
73072
73127
  models: OmoModelCatalogSchema.optional(),
73128
+ model_profiles: OmoModelProfilesSchema.optional(),
73129
+ model_profile: string2().optional(),
73073
73130
  memory: OmoMemorySettingsSchema.optional(),
73074
73131
  telemetry: OmoTelemetrySettingsSchema.optional(),
73075
73132
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
@@ -73088,6 +73145,8 @@ var init_config = __esm(() => {
73088
73145
  task: OmoTaskSettingsLayerSchema.optional(),
73089
73146
  teams: OmoTeamsConfigLayerSchema.optional(),
73090
73147
  models: OmoModelCatalogLayerSchema.optional(),
73148
+ model_profiles: OmoModelProfilesLayerSchema.optional(),
73149
+ model_profile: string2().optional(),
73091
73150
  memory: OmoMemorySettingsLayerSchema.optional(),
73092
73151
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
73093
73152
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
@@ -73110,6 +73169,7 @@ var init_schema = __esm(() => {
73110
73169
  init_harness();
73111
73170
  init_memory();
73112
73171
  init_model_catalog();
73172
+ init_model_profile();
73113
73173
  init_model_ref();
73114
73174
  init_task();
73115
73175
  init_team();
@@ -73366,21 +73426,21 @@ function hasUnsafeUnrecognizedKey(issues) {
73366
73426
  function hasTamperedPrototype(value) {
73367
73427
  if (Array.isArray(value))
73368
73428
  return value.some((entry) => hasTamperedPrototype(entry));
73369
- if (!isRecord8(value))
73429
+ if (!isRecord9(value))
73370
73430
  return false;
73371
73431
  const prototype = Object.getPrototypeOf(value);
73372
73432
  if (prototype !== Object.prototype && prototype !== null)
73373
73433
  return true;
73374
73434
  return Object.values(value).some((entry) => hasTamperedPrototype(entry));
73375
73435
  }
73376
- function isRecord8(value) {
73436
+ function isRecord9(value) {
73377
73437
  return typeof value === "object" && value !== null && !Array.isArray(value);
73378
73438
  }
73379
73439
  function containerAt(record, path) {
73380
73440
  let container = record;
73381
73441
  for (const segment of path) {
73382
73442
  const next = container[segment];
73383
- if (!isRecord8(next))
73443
+ if (!isRecord9(next))
73384
73444
  return null;
73385
73445
  container = next;
73386
73446
  }
@@ -73642,6 +73702,38 @@ function resolveCategoryDefinition(definition, catalog, cycleNames) {
73642
73702
  ...definition.fallback_models === undefined ? {} : { fallback_models: resolveFallbackModels(definition.fallback_models, catalog, cycleNames) }
73643
73703
  };
73644
73704
  }
73705
+ function resolveModelProfile(definition, catalog, cycleNames) {
73706
+ return {
73707
+ ...definition,
73708
+ ...definition.models === undefined ? {} : { models: definition.models.map((entry) => resolveModelEntry(entry, catalog, cycleNames)) }
73709
+ };
73710
+ }
73711
+ function profileShadowDiagnostics(view) {
73712
+ if (view.model_profiles === undefined || view.models === undefined)
73713
+ return [];
73714
+ return Object.keys(view.model_profiles).flatMap((name) => view.models?.[name] === undefined ? [] : [{
73715
+ kind: "validation",
73716
+ message: `Model profile "${name}" shadows a model catalog entry of the same name`,
73717
+ path: `model_profiles.${name}`
73718
+ }]);
73719
+ }
73720
+ function profileSpliceDiagnostics(section, definitions, profileNames) {
73721
+ if (definitions === undefined || profileNames.size === 0)
73722
+ return [];
73723
+ return Object.entries(definitions).flatMap(([name, definition]) => (definition.models ?? []).flatMap((entry, index) => typeof entry !== "string" || !profileNames.has(entry) ? [] : [{
73724
+ kind: "validation",
73725
+ message: `"${entry}" is a model profile; splicing a profile into a category chain is not supported yet`,
73726
+ path: `${section}.${name}.models.${index}`
73727
+ }]));
73728
+ }
73729
+ function modelProfileDiagnostics(view) {
73730
+ const profileNames = new Set(Object.keys(view.model_profiles ?? {}));
73731
+ return [
73732
+ ...profileShadowDiagnostics(view),
73733
+ ...profileSpliceDiagnostics("categories", view.categories, profileNames),
73734
+ ...profileSpliceDiagnostics("agents", view.agents, profileNames)
73735
+ ];
73736
+ }
73645
73737
  function cycleDiagnostics(catalog) {
73646
73738
  if (catalog === undefined)
73647
73739
  return [];
@@ -73652,9 +73744,10 @@ function cycleDiagnostics(catalog) {
73652
73744
  }));
73653
73745
  }
73654
73746
  function resolveModelReferences(view) {
73655
- const diagnostics = cycleDiagnostics(view.models);
73747
+ const cycles = cycleDiagnostics(view.models);
73748
+ const diagnostics = [...cycles, ...modelProfileDiagnostics(view)];
73656
73749
  const cycleNames = new Set;
73657
- for (const diagnostic of diagnostics) {
73750
+ for (const diagnostic of cycles) {
73658
73751
  const name = diagnostic.path.split(".")[1];
73659
73752
  if (name !== undefined)
73660
73753
  cycleNames.add(name);
@@ -73667,12 +73760,17 @@ function resolveModelReferences(view) {
73667
73760
  name,
73668
73761
  resolveCategoryDefinition(definition, view.models, cycleNames)
73669
73762
  ]));
73763
+ const modelProfiles = view.model_profiles === undefined ? undefined : Object.fromEntries(Object.entries(view.model_profiles).map(([name, definition]) => [
73764
+ name,
73765
+ resolveModelProfile(definition, view.models, cycleNames)
73766
+ ]));
73670
73767
  return {
73671
73768
  diagnostics,
73672
73769
  view: {
73673
73770
  ...view,
73674
73771
  ...agents === undefined ? {} : { agents },
73675
- ...categories === undefined ? {} : { categories }
73772
+ ...categories === undefined ? {} : { categories },
73773
+ ...modelProfiles === undefined ? {} : { model_profiles: modelProfiles }
73676
73774
  }
73677
73775
  };
73678
73776
  }
@@ -77007,7 +77105,7 @@ function shouldRetainLine(line, cutoffMs) {
77007
77105
  function parseDiagnosticLine(line) {
77008
77106
  try {
77009
77107
  const parsed = JSON.parse(line);
77010
- if (!isRecord10(parsed)) {
77108
+ if (!isRecord11(parsed)) {
77011
77109
  return null;
77012
77110
  }
77013
77111
  return parsed;
@@ -77018,7 +77116,7 @@ function parseDiagnosticLine(line) {
77018
77116
  throw error;
77019
77117
  }
77020
77118
  }
77021
- function isRecord10(value) {
77119
+ function isRecord11(value) {
77022
77120
  return value !== null && typeof value === "object" && !Array.isArray(value);
77023
77121
  }
77024
77122
  function trimToMaxBytes(lines) {
@@ -82392,7 +82490,7 @@ function coerceBool(value) {
82392
82490
  function coerceString(value) {
82393
82491
  return typeof value == "string" ? value : undefined;
82394
82492
  }
82395
- function isRecord11(value) {
82493
+ function isRecord12(value) {
82396
82494
  return typeof value == "object" && value !== null && !Array.isArray(value);
82397
82495
  }
82398
82496
  function toRfc3339(timestamp) {
@@ -82414,7 +82512,7 @@ function relocateInto(properties, key, value) {
82414
82512
  properties[key] = value;
82415
82513
  }
82416
82514
  function buildV1Event(message) {
82417
- const sourceProperties = isRecord11(message.properties) ? message.properties : {};
82515
+ const sourceProperties = isRecord12(message.properties) ? message.properties : {};
82418
82516
  const properties = {
82419
82517
  ...sourceProperties
82420
82518
  };
@@ -84444,7 +84542,7 @@ var package_default2;
84444
84542
  var init_package2 = __esm(() => {
84445
84543
  package_default2 = {
84446
84544
  name: "@oh-my-opencode/omo-codex",
84447
- version: "5.0.0-beta.52",
84545
+ version: "5.0.0-beta.54",
84448
84546
  type: "module",
84449
84547
  private: true,
84450
84548
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -90493,10 +90591,10 @@ function readCatalogMultiAgentVersion(model, cachePath) {
90493
90591
  } catch {
90494
90592
  return null;
90495
90593
  }
90496
- if (!isRecord9(cache) || !Array.isArray(cache.models))
90594
+ if (!isRecord10(cache) || !Array.isArray(cache.models))
90497
90595
  return null;
90498
90596
  for (const entry of cache.models) {
90499
- if (!isRecord9(entry))
90597
+ if (!isRecord10(entry))
90500
90598
  continue;
90501
90599
  if (entry.slug !== model && entry.id !== model)
90502
90600
  continue;
@@ -90521,7 +90619,7 @@ function readRootModelCatalogPath(config) {
90521
90619
  const single = config.match(/^\s*model_catalog_json\s*=\s*'([^']+)'/m);
90522
90620
  return single?.[1] ?? null;
90523
90621
  }
90524
- function isRecord9(value) {
90622
+ function isRecord10(value) {
90525
90623
  return typeof value === "object" && value !== null && !Array.isArray(value);
90526
90624
  }
90527
90625
  function removeFeatureFlagSetting(config, featureName) {
@@ -93150,6 +93248,9 @@ function renderLocalLauncher(options) {
93150
93248
  envPrefix: "OMO",
93151
93249
  userAgent: "omo",
93152
93250
  originator: "omo",
93251
+ changelog: {
93252
+ path: join57(options.pluginPath, "CHANGELOG.md")
93253
+ },
93153
93254
  update: {
93154
93255
  packageName: "omo-ai",
93155
93256
  distTag: "beta",
@@ -93254,7 +93355,7 @@ async function readSettings(settingsPath) {
93254
93355
  throw error;
93255
93356
  }
93256
93357
  const parsed = JSON.parse(raw);
93257
- if (!isRecord12(parsed))
93358
+ if (!isRecord13(parsed))
93258
93359
  throw new Error(`${settingsPath} must contain a JSON object`);
93259
93360
  return parsed;
93260
93361
  }
@@ -93315,7 +93416,7 @@ async function nextBackupPath(settingsPath) {
93315
93416
  function timestampForBackup() {
93316
93417
  return new Date().toISOString().replace(/[-:.]/g, "");
93317
93418
  }
93318
- function isRecord12(value) {
93419
+ function isRecord13(value) {
93319
93420
  return typeof value === "object" && value !== null && !Array.isArray(value);
93320
93421
  }
93321
93422
  async function readPackageName(packagePath) {
@@ -93335,7 +93436,7 @@ async function readPackageName(packagePath) {
93335
93436
  return;
93336
93437
  throw error;
93337
93438
  }
93338
- return isRecord12(parsed) && typeof parsed.name === "string" ? parsed.name : undefined;
93439
+ return isRecord13(parsed) && typeof parsed.name === "string" ? parsed.name : undefined;
93339
93440
  }
93340
93441
  async function fileExists(path) {
93341
93442
  try {
@@ -93453,7 +93554,7 @@ async function verifyAstGrepRuntimeIntegrity(pluginPath, platform) {
93453
93554
  }
93454
93555
  }
93455
93556
  function isAstGrepRuntimeManifest(value) {
93456
- if (!isRecord12(value))
93557
+ if (!isRecord13(value))
93457
93558
  return false;
93458
93559
  return typeof value.sha256 === "string" && /^[a-f0-9]{64}$/.test(value.sha256) && typeof value.mode === "number" && Number.isInteger(value.mode) && typeof value.stagedAtUtc === "string" && !Number.isNaN(Date.parse(value.stagedAtUtc));
93459
93560
  }
@@ -100692,14 +100793,14 @@ var CANONICAL_REPLACEMENT = new Map([
100692
100793
  var MIGRATE_SUFFIX = ", or run: oh-my-openagent config migrate";
100693
100794
  var TUNING_CONTAINERS = new Set(["agents", "categories", "models"]);
100694
100795
  var PASSTHROUGH_CONTAINERS = new Set(["provider_options", "providerOptions"]);
100695
- function isRecord13(value) {
100796
+ function isRecord14(value) {
100696
100797
  return value !== null && typeof value === "object" && !Array.isArray(value);
100697
100798
  }
100698
100799
  function isHarnessBlock(key) {
100699
100800
  return key.startsWith("[") && key.endsWith("]");
100700
100801
  }
100701
100802
  function collectIssues(configPath, value, prefix, fixSuffix) {
100702
- if (!isRecord13(value))
100803
+ if (!isRecord14(value))
100703
100804
  return [];
100704
100805
  const issues = [];
100705
100806
  for (const [key, child] of Object.entries(value)) {
@@ -100715,7 +100816,7 @@ function collectIssues(configPath, value, prefix, fixSuffix) {
100715
100816
  });
100716
100817
  continue;
100717
100818
  }
100718
- if (!isRecord13(child))
100819
+ if (!isRecord14(child))
100719
100820
  continue;
100720
100821
  if (PASSTHROUGH_CONTAINERS.has(key))
100721
100822
  continue;
@@ -100734,7 +100835,7 @@ function collectIssues(configPath, value, prefix, fixSuffix) {
100734
100835
  return issues;
100735
100836
  }
100736
100837
  function migrateFixSuffix(parsed) {
100737
- if (isRecord13(parsed) && hasMigrationMarker(parsed, REASONING_UNIFICATION_MIGRATION_ID))
100838
+ if (isRecord14(parsed) && hasMigrationMarker(parsed, REASONING_UNIFICATION_MIGRATION_ID))
100738
100839
  return "";
100739
100840
  return MIGRATE_SUFFIX;
100740
100841
  }
@@ -101972,12 +102073,12 @@ async function auditBundleTargets(pluginRoot) {
101972
102073
  let referencedCount = 0;
101973
102074
  for (const manifestPath of await findManifestPaths(pluginRoot, ".mcp.json")) {
101974
102075
  const manifest = await readJson2(manifestPath);
101975
- if (manifest === null || !isRecord14(manifest["mcpServers"]))
102076
+ if (manifest === null || !isRecord15(manifest["mcpServers"]))
101976
102077
  continue;
101977
102078
  const manifestRoot = dirname33(manifestPath);
101978
102079
  const isRootManifest = resolve24(manifestRoot) === resolve24(pluginRoot);
101979
102080
  for (const server of Object.values(manifest["mcpServers"])) {
101980
- if (!isRecord14(server) || !Array.isArray(server["args"]))
102081
+ if (!isRecord15(server) || !Array.isArray(server["args"]))
101981
102082
  continue;
101982
102083
  for (const arg of server["args"]) {
101983
102084
  if (typeof arg !== "string" || !isPluginRuntimePathArg(arg))
@@ -102063,7 +102164,7 @@ function collectHookCommands(value, commands) {
102063
102164
  collectHookCommands(item, commands);
102064
102165
  return;
102065
102166
  }
102066
- if (!isRecord14(value))
102167
+ if (!isRecord15(value))
102067
102168
  return;
102068
102169
  if (value["type"] === "command") {
102069
102170
  if (typeof value["command"] === "string")
@@ -102118,7 +102219,7 @@ function parseDegradedEntries(value) {
102118
102219
  return [];
102119
102220
  const entries = [];
102120
102221
  for (const item of value) {
102121
- if (!isRecord14(item))
102222
+ if (!isRecord15(item))
102122
102223
  continue;
102123
102224
  if (typeof item["component"] !== "string" || typeof item["reason"] !== "string")
102124
102225
  continue;
@@ -102152,7 +102253,7 @@ function degradedDetailLines(entries) {
102152
102253
  async function readJson2(path) {
102153
102254
  try {
102154
102255
  const parsed = JSON.parse(await readFile28(path, "utf8"));
102155
- return isRecord14(parsed) ? parsed : null;
102256
+ return isRecord15(parsed) ? parsed : null;
102156
102257
  } catch (error) {
102157
102258
  if (error instanceof Error)
102158
102259
  return null;
@@ -102173,7 +102274,7 @@ function normalizeRelative(root, target) {
102173
102274
  function normalizePathSeparators(path) {
102174
102275
  return path.split("\\").join("/");
102175
102276
  }
102176
- function isRecord14(value) {
102277
+ function isRecord15(value) {
102177
102278
  return typeof value === "object" && value !== null && !Array.isArray(value);
102178
102279
  }
102179
102280