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
@@ -65,7 +65,7 @@ var package_default;
65
65
  var init_package = __esm(() => {
66
66
  package_default = {
67
67
  name: "oh-my-opencode",
68
- version: "5.0.0-beta.52",
68
+ version: "5.0.0-beta.54",
69
69
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
70
70
  main: "./dist/index.js",
71
71
  types: "dist/index.d.ts",
@@ -203,6 +203,7 @@ var init_package = __esm(() => {
203
203
  "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",
204
204
  "typecheck:script": "tsgo --noEmit -p script/tsconfig.json",
205
205
  test: "bun test --timeout 20000",
206
+ "changelog:section": "bun script/changelog-section.ts",
206
207
  "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",
207
208
  "test:fast": "bun run script/test-fast.ts",
208
209
  "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",
@@ -249,7 +250,7 @@ var init_package = __esm(() => {
249
250
  zod: "^4.4.3"
250
251
  },
251
252
  devDependencies: {
252
- "@code-yeongyu/senpi": "2026.9.10",
253
+ "@code-yeongyu/senpi": "2026.9.11",
253
254
  "@oh-my-opencode/agents-md-core": "workspace:*",
254
255
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
255
256
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -290,18 +291,18 @@ var init_package = __esm(() => {
290
291
  typescript: "^7.0.2"
291
292
  },
292
293
  optionalDependencies: {
293
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.52",
294
- "oh-my-opencode-darwin-x64": "5.0.0-beta.52",
295
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.52",
296
- "oh-my-opencode-linux-arm64": "5.0.0-beta.52",
297
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.52",
298
- "oh-my-opencode-linux-x64": "5.0.0-beta.52",
299
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.52",
300
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.52",
301
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.52",
302
- "oh-my-opencode-windows-arm64": "5.0.0-beta.52",
303
- "oh-my-opencode-windows-x64": "5.0.0-beta.52",
304
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.52"
294
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.54",
295
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.54",
296
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.54",
297
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.54",
298
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.54",
299
+ "oh-my-opencode-linux-x64": "5.0.0-beta.54",
300
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.54",
301
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.54",
302
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.54",
303
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.54",
304
+ "oh-my-opencode-windows-x64": "5.0.0-beta.54",
305
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.54"
305
306
  },
306
307
  overrides: {
307
308
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -72730,7 +72731,7 @@ var init_harness = __esm(() => {
72730
72731
  });
72731
72732
 
72732
72733
  // packages/omo-config-core/src/schema/memory.ts
72733
- 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;
72734
+ 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;
72734
72735
  var init_memory = __esm(() => {
72735
72736
  init_zod();
72736
72737
  OmoMemoryReflectionTriggerSchema = object({
@@ -72752,9 +72753,20 @@ var init_memory = __esm(() => {
72752
72753
  OmoMemorySearchSchema = object({
72753
72754
  enabled: boolean2().default(true)
72754
72755
  }).strict();
72756
+ OmoMemoryRecallEventCapsSchema = object({
72757
+ tool_args: number2().int().nonnegative().default(400),
72758
+ result_head: number2().int().nonnegative().default(600),
72759
+ assistant: number2().int().nonnegative().default(1500),
72760
+ prompt: number2().int().nonnegative().default(4000)
72761
+ }).strict();
72755
72762
  OmoMemoryRecallSchema = object({
72756
72763
  enabled: boolean2().default(true),
72757
- max_items: number2().int().min(1).max(5).default(2)
72764
+ max_items: number2().int().min(1).max(5).default(2),
72765
+ category: string2().min(1).default("quick"),
72766
+ event_caps: OmoMemoryRecallEventCapsSchema.default({ tool_args: 400, result_head: 600, assistant: 1500, prompt: 4000 }),
72767
+ sidecar_max_tokens: number2().int().positive().default(48000),
72768
+ max_concurrent_wakes: number2().int().positive().default(2),
72769
+ tool_budget: number2().int().positive().default(8)
72758
72770
  }).strict();
72759
72771
  OmoMemoryNudgeSchema = object({
72760
72772
  enabled: boolean2().default(true),
@@ -72802,9 +72814,20 @@ var init_memory = __esm(() => {
72802
72814
  OmoMemorySearchLayerSchema = object({
72803
72815
  enabled: boolean2().optional()
72804
72816
  }).strict();
72817
+ OmoMemoryRecallEventCapsLayerSchema = object({
72818
+ tool_args: number2().int().nonnegative().optional(),
72819
+ result_head: number2().int().nonnegative().optional(),
72820
+ assistant: number2().int().nonnegative().optional(),
72821
+ prompt: number2().int().nonnegative().optional()
72822
+ }).strict();
72805
72823
  OmoMemoryRecallLayerSchema = object({
72806
72824
  enabled: boolean2().optional(),
72807
- max_items: number2().int().min(1).max(5).optional()
72825
+ max_items: number2().int().min(1).max(5).optional(),
72826
+ category: string2().min(1).optional(),
72827
+ event_caps: OmoMemoryRecallEventCapsLayerSchema.optional(),
72828
+ sidecar_max_tokens: number2().int().positive().optional(),
72829
+ max_concurrent_wakes: number2().int().positive().optional(),
72830
+ tool_budget: number2().int().positive().optional()
72808
72831
  }).strict();
72809
72832
  OmoMemoryNudgeLayerSchema = object({
72810
72833
  enabled: boolean2().optional(),
@@ -72874,7 +72897,15 @@ var init_memory = __esm(() => {
72874
72897
  write_notice: OmoMemoryWriteNoticeSchema.default({ enabled: true }),
72875
72898
  sync: OmoMemorySyncSchema.default({ enabled: true }),
72876
72899
  search: OmoMemorySearchSchema.default({ enabled: true }),
72877
- recall: OmoMemoryRecallSchema.default({ enabled: true, max_items: 2 }),
72900
+ recall: OmoMemoryRecallSchema.default({
72901
+ enabled: true,
72902
+ max_items: 2,
72903
+ category: "quick",
72904
+ event_caps: { tool_args: 400, result_head: 600, assistant: 1500, prompt: 4000 },
72905
+ sidecar_max_tokens: 48000,
72906
+ max_concurrent_wakes: 2,
72907
+ tool_budget: 8
72908
+ }),
72878
72909
  compile_warn_tokens: number2().int().positive().default(30000),
72879
72910
  agents: record(string2(), OmoMemoryAgentOverridesSchema).default({})
72880
72911
  }).strict();
@@ -72918,6 +72949,25 @@ var init_model_catalog = __esm(() => {
72918
72949
  OmoModelCatalogLayerSchema = record(string2(), OmoModelCatalogEntryLayerSchema);
72919
72950
  });
72920
72951
 
72952
+ // packages/omo-config-core/src/schema/model-profile.ts
72953
+ function isRecord8(value) {
72954
+ return typeof value === "object" && value !== null && !Array.isArray(value);
72955
+ }
72956
+ var OmoModelProfileInputSchema, OmoModelProfileSchema, OmoModelProfilesSchema, OmoModelProfileLayerInputSchema, OmoModelProfileLayerSchema, OmoModelProfilesLayerSchema;
72957
+ var init_model_profile = __esm(() => {
72958
+ init_zod();
72959
+ init_fallback_models();
72960
+ OmoModelProfileInputSchema = object({
72961
+ display_name: string2().optional(),
72962
+ models: array(union([string2(), OmoFallbackModelObjectSchema])).optional()
72963
+ }).strict();
72964
+ OmoModelProfileSchema = preprocess((value) => isRecord8(value) ? normalizeLegacyModelFields(value) : value, OmoModelProfileInputSchema);
72965
+ OmoModelProfilesSchema = record(string2(), OmoModelProfileSchema);
72966
+ OmoModelProfileLayerInputSchema = OmoModelProfileInputSchema.partial();
72967
+ OmoModelProfileLayerSchema = preprocess((value) => isRecord8(value) ? normalizeLegacyModelFields(value) : value, OmoModelProfileLayerInputSchema);
72968
+ OmoModelProfilesLayerSchema = record(string2(), OmoModelProfileLayerSchema);
72969
+ });
72970
+
72921
72971
  // packages/omo-config-core/src/schema/task.ts
72922
72972
  import { availableParallelism } from "node:os";
72923
72973
  function resolveOmoTaskSettings(input, resolveParallelism = availableParallelism) {
@@ -73110,6 +73160,7 @@ var init_config = __esm(() => {
73110
73160
  init_git_master();
73111
73161
  init_memory();
73112
73162
  init_model_catalog();
73163
+ init_model_profile();
73113
73164
  init_task();
73114
73165
  init_team();
73115
73166
  init_telemetry();
@@ -73123,6 +73174,8 @@ var init_config = __esm(() => {
73123
73174
  task: OmoTaskSettingsLayerSchema.optional(),
73124
73175
  teams: OmoTeamsConfigLayerSchema.optional(),
73125
73176
  models: OmoModelCatalogLayerSchema.optional(),
73177
+ model_profiles: OmoModelProfilesLayerSchema.optional(),
73178
+ model_profile: string2().optional(),
73126
73179
  memory: OmoMemorySettingsLayerSchema.optional(),
73127
73180
  telemetry: OmoTelemetrySettingsLayerSchema.optional()
73128
73181
  }).strict();
@@ -73134,6 +73187,8 @@ var init_config = __esm(() => {
73134
73187
  task: OmoTaskSettingsLayerSchema.optional(),
73135
73188
  teams: OmoTeamsConfigLayerSchema.optional(),
73136
73189
  models: OmoModelCatalogLayerSchema.optional(),
73190
+ model_profiles: OmoModelProfilesLayerSchema.optional(),
73191
+ model_profile: string2().optional(),
73137
73192
  memory: OmoMemorySettingsLayerSchema.optional(),
73138
73193
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
73139
73194
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
@@ -73149,6 +73204,8 @@ var init_config = __esm(() => {
73149
73204
  task: OmoTaskSettingsSchema.optional(),
73150
73205
  teams: OmoTeamsConfigSchema.optional(),
73151
73206
  models: OmoModelCatalogSchema.optional(),
73207
+ model_profiles: OmoModelProfilesSchema.optional(),
73208
+ model_profile: string2().optional(),
73152
73209
  memory: OmoMemorySettingsSchema.optional(),
73153
73210
  telemetry: OmoTelemetrySettingsSchema.optional(),
73154
73211
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
@@ -73167,6 +73224,8 @@ var init_config = __esm(() => {
73167
73224
  task: OmoTaskSettingsLayerSchema.optional(),
73168
73225
  teams: OmoTeamsConfigLayerSchema.optional(),
73169
73226
  models: OmoModelCatalogLayerSchema.optional(),
73227
+ model_profiles: OmoModelProfilesLayerSchema.optional(),
73228
+ model_profile: string2().optional(),
73170
73229
  memory: OmoMemorySettingsLayerSchema.optional(),
73171
73230
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
73172
73231
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
@@ -73189,6 +73248,7 @@ var init_schema = __esm(() => {
73189
73248
  init_harness();
73190
73249
  init_memory();
73191
73250
  init_model_catalog();
73251
+ init_model_profile();
73192
73252
  init_model_ref();
73193
73253
  init_task();
73194
73254
  init_team();
@@ -73445,21 +73505,21 @@ function hasUnsafeUnrecognizedKey(issues) {
73445
73505
  function hasTamperedPrototype(value) {
73446
73506
  if (Array.isArray(value))
73447
73507
  return value.some((entry) => hasTamperedPrototype(entry));
73448
- if (!isRecord8(value))
73508
+ if (!isRecord9(value))
73449
73509
  return false;
73450
73510
  const prototype = Object.getPrototypeOf(value);
73451
73511
  if (prototype !== Object.prototype && prototype !== null)
73452
73512
  return true;
73453
73513
  return Object.values(value).some((entry) => hasTamperedPrototype(entry));
73454
73514
  }
73455
- function isRecord8(value) {
73515
+ function isRecord9(value) {
73456
73516
  return typeof value === "object" && value !== null && !Array.isArray(value);
73457
73517
  }
73458
73518
  function containerAt(record, path) {
73459
73519
  let container = record;
73460
73520
  for (const segment of path) {
73461
73521
  const next = container[segment];
73462
- if (!isRecord8(next))
73522
+ if (!isRecord9(next))
73463
73523
  return null;
73464
73524
  container = next;
73465
73525
  }
@@ -73721,6 +73781,38 @@ function resolveCategoryDefinition(definition, catalog, cycleNames) {
73721
73781
  ...definition.fallback_models === undefined ? {} : { fallback_models: resolveFallbackModels(definition.fallback_models, catalog, cycleNames) }
73722
73782
  };
73723
73783
  }
73784
+ function resolveModelProfile(definition, catalog, cycleNames) {
73785
+ return {
73786
+ ...definition,
73787
+ ...definition.models === undefined ? {} : { models: definition.models.map((entry) => resolveModelEntry(entry, catalog, cycleNames)) }
73788
+ };
73789
+ }
73790
+ function profileShadowDiagnostics(view) {
73791
+ if (view.model_profiles === undefined || view.models === undefined)
73792
+ return [];
73793
+ return Object.keys(view.model_profiles).flatMap((name) => view.models?.[name] === undefined ? [] : [{
73794
+ kind: "validation",
73795
+ message: `Model profile "${name}" shadows a model catalog entry of the same name`,
73796
+ path: `model_profiles.${name}`
73797
+ }]);
73798
+ }
73799
+ function profileSpliceDiagnostics(section, definitions, profileNames) {
73800
+ if (definitions === undefined || profileNames.size === 0)
73801
+ return [];
73802
+ return Object.entries(definitions).flatMap(([name, definition]) => (definition.models ?? []).flatMap((entry, index) => typeof entry !== "string" || !profileNames.has(entry) ? [] : [{
73803
+ kind: "validation",
73804
+ message: `"${entry}" is a model profile; splicing a profile into a category chain is not supported yet`,
73805
+ path: `${section}.${name}.models.${index}`
73806
+ }]));
73807
+ }
73808
+ function modelProfileDiagnostics(view) {
73809
+ const profileNames = new Set(Object.keys(view.model_profiles ?? {}));
73810
+ return [
73811
+ ...profileShadowDiagnostics(view),
73812
+ ...profileSpliceDiagnostics("categories", view.categories, profileNames),
73813
+ ...profileSpliceDiagnostics("agents", view.agents, profileNames)
73814
+ ];
73815
+ }
73724
73816
  function cycleDiagnostics(catalog) {
73725
73817
  if (catalog === undefined)
73726
73818
  return [];
@@ -73731,9 +73823,10 @@ function cycleDiagnostics(catalog) {
73731
73823
  }));
73732
73824
  }
73733
73825
  function resolveModelReferences(view) {
73734
- const diagnostics = cycleDiagnostics(view.models);
73826
+ const cycles = cycleDiagnostics(view.models);
73827
+ const diagnostics = [...cycles, ...modelProfileDiagnostics(view)];
73735
73828
  const cycleNames = new Set;
73736
- for (const diagnostic of diagnostics) {
73829
+ for (const diagnostic of cycles) {
73737
73830
  const name = diagnostic.path.split(".")[1];
73738
73831
  if (name !== undefined)
73739
73832
  cycleNames.add(name);
@@ -73746,12 +73839,17 @@ function resolveModelReferences(view) {
73746
73839
  name,
73747
73840
  resolveCategoryDefinition(definition, view.models, cycleNames)
73748
73841
  ]));
73842
+ const modelProfiles = view.model_profiles === undefined ? undefined : Object.fromEntries(Object.entries(view.model_profiles).map(([name, definition]) => [
73843
+ name,
73844
+ resolveModelProfile(definition, view.models, cycleNames)
73845
+ ]));
73749
73846
  return {
73750
73847
  diagnostics,
73751
73848
  view: {
73752
73849
  ...view,
73753
73850
  ...agents === undefined ? {} : { agents },
73754
- ...categories === undefined ? {} : { categories }
73851
+ ...categories === undefined ? {} : { categories },
73852
+ ...modelProfiles === undefined ? {} : { model_profiles: modelProfiles }
73755
73853
  }
73756
73854
  };
73757
73855
  }
@@ -77086,7 +77184,7 @@ function shouldRetainLine(line, cutoffMs) {
77086
77184
  function parseDiagnosticLine(line) {
77087
77185
  try {
77088
77186
  const parsed = JSON.parse(line);
77089
- if (!isRecord10(parsed)) {
77187
+ if (!isRecord11(parsed)) {
77090
77188
  return null;
77091
77189
  }
77092
77190
  return parsed;
@@ -77097,7 +77195,7 @@ function parseDiagnosticLine(line) {
77097
77195
  throw error;
77098
77196
  }
77099
77197
  }
77100
- function isRecord10(value) {
77198
+ function isRecord11(value) {
77101
77199
  return value !== null && typeof value === "object" && !Array.isArray(value);
77102
77200
  }
77103
77201
  function trimToMaxBytes(lines) {
@@ -82471,7 +82569,7 @@ function coerceBool(value) {
82471
82569
  function coerceString(value) {
82472
82570
  return typeof value == "string" ? value : undefined;
82473
82571
  }
82474
- function isRecord11(value) {
82572
+ function isRecord12(value) {
82475
82573
  return typeof value == "object" && value !== null && !Array.isArray(value);
82476
82574
  }
82477
82575
  function toRfc3339(timestamp) {
@@ -82493,7 +82591,7 @@ function relocateInto(properties, key, value) {
82493
82591
  properties[key] = value;
82494
82592
  }
82495
82593
  function buildV1Event(message) {
82496
- const sourceProperties = isRecord11(message.properties) ? message.properties : {};
82594
+ const sourceProperties = isRecord12(message.properties) ? message.properties : {};
82497
82595
  const properties = {
82498
82596
  ...sourceProperties
82499
82597
  };
@@ -84523,7 +84621,7 @@ var package_default2;
84523
84621
  var init_package2 = __esm(() => {
84524
84622
  package_default2 = {
84525
84623
  name: "@oh-my-opencode/omo-codex",
84526
- version: "5.0.0-beta.52",
84624
+ version: "5.0.0-beta.54",
84527
84625
  type: "module",
84528
84626
  private: true,
84529
84627
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -90572,10 +90670,10 @@ function readCatalogMultiAgentVersion(model, cachePath) {
90572
90670
  } catch {
90573
90671
  return null;
90574
90672
  }
90575
- if (!isRecord9(cache) || !Array.isArray(cache.models))
90673
+ if (!isRecord10(cache) || !Array.isArray(cache.models))
90576
90674
  return null;
90577
90675
  for (const entry of cache.models) {
90578
- if (!isRecord9(entry))
90676
+ if (!isRecord10(entry))
90579
90677
  continue;
90580
90678
  if (entry.slug !== model && entry.id !== model)
90581
90679
  continue;
@@ -90600,7 +90698,7 @@ function readRootModelCatalogPath(config) {
90600
90698
  const single = config.match(/^\s*model_catalog_json\s*=\s*'([^']+)'/m);
90601
90699
  return single?.[1] ?? null;
90602
90700
  }
90603
- function isRecord9(value) {
90701
+ function isRecord10(value) {
90604
90702
  return typeof value === "object" && value !== null && !Array.isArray(value);
90605
90703
  }
90606
90704
  function removeFeatureFlagSetting(config, featureName) {
@@ -93229,6 +93327,9 @@ function renderLocalLauncher(options) {
93229
93327
  envPrefix: "OMO",
93230
93328
  userAgent: "omo",
93231
93329
  originator: "omo",
93330
+ changelog: {
93331
+ path: join57(options.pluginPath, "CHANGELOG.md")
93332
+ },
93232
93333
  update: {
93233
93334
  packageName: "omo-ai",
93234
93335
  distTag: "beta",
@@ -93333,7 +93434,7 @@ async function readSettings(settingsPath) {
93333
93434
  throw error;
93334
93435
  }
93335
93436
  const parsed = JSON.parse(raw);
93336
- if (!isRecord12(parsed))
93437
+ if (!isRecord13(parsed))
93337
93438
  throw new Error(`${settingsPath} must contain a JSON object`);
93338
93439
  return parsed;
93339
93440
  }
@@ -93394,7 +93495,7 @@ async function nextBackupPath(settingsPath) {
93394
93495
  function timestampForBackup() {
93395
93496
  return new Date().toISOString().replace(/[-:.]/g, "");
93396
93497
  }
93397
- function isRecord12(value) {
93498
+ function isRecord13(value) {
93398
93499
  return typeof value === "object" && value !== null && !Array.isArray(value);
93399
93500
  }
93400
93501
  async function readPackageName(packagePath) {
@@ -93414,7 +93515,7 @@ async function readPackageName(packagePath) {
93414
93515
  return;
93415
93516
  throw error;
93416
93517
  }
93417
- return isRecord12(parsed) && typeof parsed.name === "string" ? parsed.name : undefined;
93518
+ return isRecord13(parsed) && typeof parsed.name === "string" ? parsed.name : undefined;
93418
93519
  }
93419
93520
  async function fileExists(path) {
93420
93521
  try {
@@ -93532,7 +93633,7 @@ async function verifyAstGrepRuntimeIntegrity(pluginPath, platform) {
93532
93633
  }
93533
93634
  }
93534
93635
  function isAstGrepRuntimeManifest(value) {
93535
- if (!isRecord12(value))
93636
+ if (!isRecord13(value))
93536
93637
  return false;
93537
93638
  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));
93538
93639
  }
@@ -100771,14 +100872,14 @@ var CANONICAL_REPLACEMENT = new Map([
100771
100872
  var MIGRATE_SUFFIX = ", or run: oh-my-openagent config migrate";
100772
100873
  var TUNING_CONTAINERS = new Set(["agents", "categories", "models"]);
100773
100874
  var PASSTHROUGH_CONTAINERS = new Set(["provider_options", "providerOptions"]);
100774
- function isRecord13(value) {
100875
+ function isRecord14(value) {
100775
100876
  return value !== null && typeof value === "object" && !Array.isArray(value);
100776
100877
  }
100777
100878
  function isHarnessBlock(key) {
100778
100879
  return key.startsWith("[") && key.endsWith("]");
100779
100880
  }
100780
100881
  function collectIssues(configPath, value, prefix, fixSuffix) {
100781
- if (!isRecord13(value))
100882
+ if (!isRecord14(value))
100782
100883
  return [];
100783
100884
  const issues = [];
100784
100885
  for (const [key, child] of Object.entries(value)) {
@@ -100794,7 +100895,7 @@ function collectIssues(configPath, value, prefix, fixSuffix) {
100794
100895
  });
100795
100896
  continue;
100796
100897
  }
100797
- if (!isRecord13(child))
100898
+ if (!isRecord14(child))
100798
100899
  continue;
100799
100900
  if (PASSTHROUGH_CONTAINERS.has(key))
100800
100901
  continue;
@@ -100813,7 +100914,7 @@ function collectIssues(configPath, value, prefix, fixSuffix) {
100813
100914
  return issues;
100814
100915
  }
100815
100916
  function migrateFixSuffix(parsed) {
100816
- if (isRecord13(parsed) && hasMigrationMarker(parsed, REASONING_UNIFICATION_MIGRATION_ID))
100917
+ if (isRecord14(parsed) && hasMigrationMarker(parsed, REASONING_UNIFICATION_MIGRATION_ID))
100817
100918
  return "";
100818
100919
  return MIGRATE_SUFFIX;
100819
100920
  }
@@ -102051,12 +102152,12 @@ async function auditBundleTargets(pluginRoot) {
102051
102152
  let referencedCount = 0;
102052
102153
  for (const manifestPath of await findManifestPaths(pluginRoot, ".mcp.json")) {
102053
102154
  const manifest = await readJson2(manifestPath);
102054
- if (manifest === null || !isRecord14(manifest["mcpServers"]))
102155
+ if (manifest === null || !isRecord15(manifest["mcpServers"]))
102055
102156
  continue;
102056
102157
  const manifestRoot = dirname33(manifestPath);
102057
102158
  const isRootManifest = resolve24(manifestRoot) === resolve24(pluginRoot);
102058
102159
  for (const server of Object.values(manifest["mcpServers"])) {
102059
- if (!isRecord14(server) || !Array.isArray(server["args"]))
102160
+ if (!isRecord15(server) || !Array.isArray(server["args"]))
102060
102161
  continue;
102061
102162
  for (const arg of server["args"]) {
102062
102163
  if (typeof arg !== "string" || !isPluginRuntimePathArg(arg))
@@ -102142,7 +102243,7 @@ function collectHookCommands(value, commands) {
102142
102243
  collectHookCommands(item, commands);
102143
102244
  return;
102144
102245
  }
102145
- if (!isRecord14(value))
102246
+ if (!isRecord15(value))
102146
102247
  return;
102147
102248
  if (value["type"] === "command") {
102148
102249
  if (typeof value["command"] === "string")
@@ -102197,7 +102298,7 @@ function parseDegradedEntries(value) {
102197
102298
  return [];
102198
102299
  const entries = [];
102199
102300
  for (const item of value) {
102200
- if (!isRecord14(item))
102301
+ if (!isRecord15(item))
102201
102302
  continue;
102202
102303
  if (typeof item["component"] !== "string" || typeof item["reason"] !== "string")
102203
102304
  continue;
@@ -102231,7 +102332,7 @@ function degradedDetailLines(entries) {
102231
102332
  async function readJson2(path) {
102232
102333
  try {
102233
102334
  const parsed = JSON.parse(await readFile28(path, "utf8"));
102234
- return isRecord14(parsed) ? parsed : null;
102335
+ return isRecord15(parsed) ? parsed : null;
102235
102336
  } catch (error) {
102236
102337
  if (error instanceof Error)
102237
102338
  return null;
@@ -102252,7 +102353,7 @@ function normalizeRelative(root, target) {
102252
102353
  function normalizePathSeparators(path) {
102253
102354
  return path.split("\\").join("/");
102254
102355
  }
102255
- function isRecord14(value) {
102356
+ function isRecord15(value) {
102256
102357
  return typeof value === "object" && value !== null && !Array.isArray(value);
102257
102358
  }
102258
102359