oh-my-opencode 5.1.21 → 5.1.23

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 (57) hide show
  1. package/dist/cli/index.js +102 -89
  2. package/dist/cli-node/index.js +102 -89
  3. package/dist/index.js +129 -118
  4. package/dist/skills/browser/runtime/omowright/manifest.json +1 -1
  5. package/dist/tui.js +87 -76
  6. package/package.json +14 -14
  7. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  8. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +11 -0
  9. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  10. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  11. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  12. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  13. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  14. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  15. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  16. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  17. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  18. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  19. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  20. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  21. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  22. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  23. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  24. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  25. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  26. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  27. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  28. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  29. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  30. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  31. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  32. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  33. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  34. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  35. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  36. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  37. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  38. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  39. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  40. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  41. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  42. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  43. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  44. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  45. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  46. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  47. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  48. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  49. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  50. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  51. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  52. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  53. package/packages/omo-codex/plugin/package-lock.json +12 -12
  54. package/packages/omo-codex/plugin/package.json +1 -1
  55. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
  56. package/packages/omo-codex/scripts/install-dist/install-local.mjs +13 -2
  57. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
package/dist/index.js CHANGED
@@ -20469,6 +20469,14 @@ var OmoMemorySoulLayerSchema = z8.object({
20469
20469
  var OmoMemoryWriteNoticeLayerSchema = z8.object({
20470
20470
  enabled: z8.boolean().optional()
20471
20471
  }).strict();
20472
+ var OmoMemoryProjectionSchema = z8.object({
20473
+ max_entries_per_directory: z8.number().int().min(0).default(40),
20474
+ max_bytes: z8.number().int().min(0).default(24576)
20475
+ }).strict();
20476
+ var OmoMemoryProjectionLayerSchema = z8.object({
20477
+ max_entries_per_directory: z8.number().int().min(0).optional(),
20478
+ max_bytes: z8.number().int().min(0).optional()
20479
+ }).strict();
20472
20480
  var OmoMemoryAgentOverridesSchema = z8.object({
20473
20481
  enabled: z8.boolean().optional(),
20474
20482
  agent: z8.string().min(1).optional(),
@@ -20482,6 +20490,7 @@ var OmoMemoryAgentOverridesSchema = z8.object({
20482
20490
  sync: OmoMemorySyncLayerSchema.optional(),
20483
20491
  search: OmoMemorySearchLayerSchema.optional(),
20484
20492
  recall: OmoMemoryRecallLayerSchema.optional(),
20493
+ projection: OmoMemoryProjectionLayerSchema.optional(),
20485
20494
  compile_warn_tokens: z8.number().int().positive().optional()
20486
20495
  }).strict();
20487
20496
  var OmoMemorySettingsSchema = z8.object({
@@ -20520,6 +20529,7 @@ var OmoMemorySettingsSchema = z8.object({
20520
20529
  tool_budget: 8,
20521
20530
  query_expansion: false
20522
20531
  }),
20532
+ projection: OmoMemoryProjectionSchema.default({ max_entries_per_directory: 40, max_bytes: 24576 }),
20523
20533
  compile_warn_tokens: z8.number().int().positive().default(30000),
20524
20534
  agents: z8.record(z8.string(), OmoMemoryAgentOverridesSchema).default({})
20525
20535
  }).strict();
@@ -20536,6 +20546,7 @@ var OmoMemorySettingsLayerSchema = z8.object({
20536
20546
  sync: OmoMemorySyncLayerSchema.optional(),
20537
20547
  search: OmoMemorySearchLayerSchema.optional(),
20538
20548
  recall: OmoMemoryRecallLayerSchema.optional(),
20549
+ projection: OmoMemoryProjectionLayerSchema.optional(),
20539
20550
  compile_warn_tokens: z8.number().int().positive().optional(),
20540
20551
  agents: z8.record(z8.string(), OmoMemoryAgentOverridesSchema).optional()
20541
20552
  }).strict();
@@ -23085,6 +23096,110 @@ var CATEGORY_MODEL_REQUIREMENTS = {
23085
23096
  ]
23086
23097
  }
23087
23098
  };
23099
+ // packages/model-core/src/reasoning-level.ts
23100
+ var REASONING_LEVELS2 = ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
23101
+ var REASONING_AUTO2 = "auto";
23102
+ var REASONING_LEVEL_SET2 = new Set(REASONING_LEVELS2);
23103
+ var REASONING_LEVEL_OR_AUTO_SET2 = new Set([...REASONING_LEVELS2, REASONING_AUTO2]);
23104
+ function isReasoningLevel2(value) {
23105
+ return REASONING_LEVEL_SET2.has(value);
23106
+ }
23107
+ function isReasoningLevelOrAuto(value) {
23108
+ return REASONING_LEVEL_OR_AUTO_SET2.has(value);
23109
+ }
23110
+ function normalizeReasoning2(input) {
23111
+ const normalized = input.trim().toLowerCase();
23112
+ if (!normalized)
23113
+ return {};
23114
+ if (normalized === "none")
23115
+ return { level: "off" };
23116
+ if (normalized === REASONING_AUTO2)
23117
+ return { level: REASONING_AUTO2 };
23118
+ if (isReasoningLevel2(normalized))
23119
+ return { level: normalized };
23120
+ return { passthrough: normalized };
23121
+ }
23122
+ function clampReasoningLevel(value, allowed) {
23123
+ const ladder = REASONING_LEVELS2;
23124
+ const requestedIndex = ladder.indexOf(value);
23125
+ if (requestedIndex === -1)
23126
+ return;
23127
+ for (let index = requestedIndex;index >= 0; index -= 1) {
23128
+ const candidate = REASONING_LEVELS2[index];
23129
+ if (candidate !== undefined && allowed.includes(candidate))
23130
+ return candidate;
23131
+ }
23132
+ return;
23133
+ }
23134
+ function splitReasoningSuffix2(model, options) {
23135
+ if (typeof model !== "string")
23136
+ return { base: "" };
23137
+ const trimmed = model.trim();
23138
+ if (!trimmed)
23139
+ return { base: "" };
23140
+ const separatorIndex = trimmed.lastIndexOf(":");
23141
+ if (separatorIndex === -1)
23142
+ return { base: trimmed };
23143
+ const base = trimmed.slice(0, separatorIndex).trim();
23144
+ const token = trimmed.slice(separatorIndex + 1).trim().toLowerCase();
23145
+ if (!base || !isReasoningLevelOrAuto(token))
23146
+ return { base: trimmed };
23147
+ if (token === "max" && !(options?.allowMaxSuffix ?? base.includes("/")))
23148
+ return { base: trimmed };
23149
+ return { base, level: token };
23150
+ }
23151
+
23152
+ // packages/model-core/src/model-string-parser.ts
23153
+ function parseVariantFromModelID(rawModelID, options) {
23154
+ if (typeof rawModelID !== "string") {
23155
+ return { modelID: "" };
23156
+ }
23157
+ const trimmedModelID = rawModelID.trim();
23158
+ if (!trimmedModelID) {
23159
+ return { modelID: "" };
23160
+ }
23161
+ const parenthesizedVariant = trimmedModelID.match(/^(.*)\(([^()]+)\)\s*$/);
23162
+ if (parenthesizedVariant) {
23163
+ const modelID = parenthesizedVariant[1]?.trim() ?? "";
23164
+ const variant = parenthesizedVariant[2]?.trim();
23165
+ return variant ? { modelID, variant } : { modelID };
23166
+ }
23167
+ const suffixedModel = splitReasoningSuffix2(trimmedModelID, options);
23168
+ if (suffixedModel.level) {
23169
+ return { modelID: suffixedModel.base, variant: suffixedModel.level };
23170
+ }
23171
+ const spaceVariant = trimmedModelID.match(/^(.*\S)\s+([a-z][a-z0-9_-]*)$/i);
23172
+ if (spaceVariant) {
23173
+ const modelID = spaceVariant[1]?.trim() ?? "";
23174
+ const variant = spaceVariant[2]?.trim().toLowerCase();
23175
+ if (variant) {
23176
+ return { modelID, variant };
23177
+ }
23178
+ }
23179
+ return { modelID: trimmedModelID };
23180
+ }
23181
+ function parseModelString(model) {
23182
+ if (typeof model !== "string")
23183
+ return;
23184
+ const trimmedModel = model.trim();
23185
+ if (!trimmedModel)
23186
+ return;
23187
+ const separatorIndex = trimmedModel.indexOf("/");
23188
+ if (separatorIndex === -1) {
23189
+ return;
23190
+ }
23191
+ const providerID = trimmedModel.slice(0, separatorIndex).trim();
23192
+ const rawModelID = trimmedModel.slice(separatorIndex + 1).trim();
23193
+ if (!providerID || !rawModelID) {
23194
+ return;
23195
+ }
23196
+ const parsedModel = parseVariantFromModelID(rawModelID, { allowMaxSuffix: true });
23197
+ if (!parsedModel.modelID) {
23198
+ return;
23199
+ }
23200
+ return parsedModel.variant ? { providerID, modelID: parsedModel.modelID, variant: parsedModel.variant } : { providerID, modelID: parsedModel.modelID };
23201
+ }
23202
+
23088
23203
  // packages/model-core/src/model-family-detectors.ts
23089
23204
  function extractModelName(model) {
23090
23205
  return model.includes("/") ? model.split("/").pop() ?? model : model;
@@ -23296,110 +23411,6 @@ function normalizeModelID(modelID) {
23296
23411
  return modelID.replace(/\.(\d+)/g, "-$1");
23297
23412
  }
23298
23413
 
23299
- // packages/model-core/src/reasoning-level.ts
23300
- var REASONING_LEVELS2 = ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
23301
- var REASONING_AUTO2 = "auto";
23302
- var REASONING_LEVEL_SET2 = new Set(REASONING_LEVELS2);
23303
- var REASONING_LEVEL_OR_AUTO_SET2 = new Set([...REASONING_LEVELS2, REASONING_AUTO2]);
23304
- function isReasoningLevel2(value) {
23305
- return REASONING_LEVEL_SET2.has(value);
23306
- }
23307
- function isReasoningLevelOrAuto(value) {
23308
- return REASONING_LEVEL_OR_AUTO_SET2.has(value);
23309
- }
23310
- function normalizeReasoning2(input) {
23311
- const normalized = input.trim().toLowerCase();
23312
- if (!normalized)
23313
- return {};
23314
- if (normalized === "none")
23315
- return { level: "off" };
23316
- if (normalized === REASONING_AUTO2)
23317
- return { level: REASONING_AUTO2 };
23318
- if (isReasoningLevel2(normalized))
23319
- return { level: normalized };
23320
- return { passthrough: normalized };
23321
- }
23322
- function clampReasoningLevel(value, allowed) {
23323
- const ladder = REASONING_LEVELS2;
23324
- const requestedIndex = ladder.indexOf(value);
23325
- if (requestedIndex === -1)
23326
- return;
23327
- for (let index = requestedIndex;index >= 0; index -= 1) {
23328
- const candidate = REASONING_LEVELS2[index];
23329
- if (candidate !== undefined && allowed.includes(candidate))
23330
- return candidate;
23331
- }
23332
- return;
23333
- }
23334
- function splitReasoningSuffix2(model, options) {
23335
- if (typeof model !== "string")
23336
- return { base: "" };
23337
- const trimmed = model.trim();
23338
- if (!trimmed)
23339
- return { base: "" };
23340
- const separatorIndex = trimmed.lastIndexOf(":");
23341
- if (separatorIndex === -1)
23342
- return { base: trimmed };
23343
- const base = trimmed.slice(0, separatorIndex).trim();
23344
- const token = trimmed.slice(separatorIndex + 1).trim().toLowerCase();
23345
- if (!base || !isReasoningLevelOrAuto(token))
23346
- return { base: trimmed };
23347
- if (token === "max" && !(options?.allowMaxSuffix ?? base.includes("/")))
23348
- return { base: trimmed };
23349
- return { base, level: token };
23350
- }
23351
-
23352
- // packages/model-core/src/model-string-parser.ts
23353
- function parseVariantFromModelID(rawModelID, options) {
23354
- if (typeof rawModelID !== "string") {
23355
- return { modelID: "" };
23356
- }
23357
- const trimmedModelID = rawModelID.trim();
23358
- if (!trimmedModelID) {
23359
- return { modelID: "" };
23360
- }
23361
- const parenthesizedVariant = trimmedModelID.match(/^(.*)\(([^()]+)\)\s*$/);
23362
- if (parenthesizedVariant) {
23363
- const modelID = parenthesizedVariant[1]?.trim() ?? "";
23364
- const variant = parenthesizedVariant[2]?.trim();
23365
- return variant ? { modelID, variant } : { modelID };
23366
- }
23367
- const suffixedModel = splitReasoningSuffix2(trimmedModelID, options);
23368
- if (suffixedModel.level) {
23369
- return { modelID: suffixedModel.base, variant: suffixedModel.level };
23370
- }
23371
- const spaceVariant = trimmedModelID.match(/^(.*\S)\s+([a-z][a-z0-9_-]*)$/i);
23372
- if (spaceVariant) {
23373
- const modelID = spaceVariant[1]?.trim() ?? "";
23374
- const variant = spaceVariant[2]?.trim().toLowerCase();
23375
- if (variant) {
23376
- return { modelID, variant };
23377
- }
23378
- }
23379
- return { modelID: trimmedModelID };
23380
- }
23381
- function parseModelString(model) {
23382
- if (typeof model !== "string")
23383
- return;
23384
- const trimmedModel = model.trim();
23385
- if (!trimmedModel)
23386
- return;
23387
- const separatorIndex = trimmedModel.indexOf("/");
23388
- if (separatorIndex === -1) {
23389
- return;
23390
- }
23391
- const providerID = trimmedModel.slice(0, separatorIndex).trim();
23392
- const rawModelID = trimmedModel.slice(separatorIndex + 1).trim();
23393
- if (!providerID || !rawModelID) {
23394
- return;
23395
- }
23396
- const parsedModel = parseVariantFromModelID(rawModelID, { allowMaxSuffix: true });
23397
- if (!parsedModel.modelID) {
23398
- return;
23399
- }
23400
- return parsedModel.variant ? { providerID, modelID: parsedModel.modelID, variant: parsedModel.variant } : { providerID, modelID: parsedModel.modelID };
23401
- }
23402
-
23403
23414
  // packages/model-core/src/model-capability-heuristics.ts
23404
23415
  var HEURISTIC_MODEL_FAMILY_REGISTRY = [
23405
23416
  {
@@ -98586,7 +98597,7 @@ function getCachedVersion(options = {}) {
98586
98597
  // package.json
98587
98598
  var package_default = {
98588
98599
  name: "oh-my-opencode",
98589
- version: "5.1.21",
98600
+ version: "5.1.23",
98590
98601
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
98591
98602
  main: "./dist/index.js",
98592
98603
  types: "dist/index.d.ts",
@@ -98763,7 +98774,7 @@ var package_default = {
98763
98774
  },
98764
98775
  devDependencies: {
98765
98776
  "@clack/prompts": "^1.8.1",
98766
- "@code-yeongyu/senpi": "2026.10.10-3",
98777
+ "@code-yeongyu/senpi": "2026.10.10-6",
98767
98778
  "@modelcontextprotocol/sdk": "^1.30.0",
98768
98779
  "@oh-my-opencode/agents-md-core": "workspace:*",
98769
98780
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
@@ -98821,18 +98832,18 @@ var package_default = {
98821
98832
  typescript: "^7.0.2"
98822
98833
  },
98823
98834
  optionalDependencies: {
98824
- "oh-my-opencode-darwin-arm64": "5.1.21",
98825
- "oh-my-opencode-darwin-x64": "5.1.21",
98826
- "oh-my-opencode-darwin-x64-baseline": "5.1.21",
98827
- "oh-my-opencode-linux-arm64": "5.1.21",
98828
- "oh-my-opencode-linux-arm64-musl": "5.1.21",
98829
- "oh-my-opencode-linux-x64": "5.1.21",
98830
- "oh-my-opencode-linux-x64-baseline": "5.1.21",
98831
- "oh-my-opencode-linux-x64-musl": "5.1.21",
98832
- "oh-my-opencode-linux-x64-musl-baseline": "5.1.21",
98833
- "oh-my-opencode-windows-arm64": "5.1.21",
98834
- "oh-my-opencode-windows-x64": "5.1.21",
98835
- "oh-my-opencode-windows-x64-baseline": "5.1.21"
98835
+ "oh-my-opencode-darwin-arm64": "5.1.23",
98836
+ "oh-my-opencode-darwin-x64": "5.1.23",
98837
+ "oh-my-opencode-darwin-x64-baseline": "5.1.23",
98838
+ "oh-my-opencode-linux-arm64": "5.1.23",
98839
+ "oh-my-opencode-linux-arm64-musl": "5.1.23",
98840
+ "oh-my-opencode-linux-x64": "5.1.23",
98841
+ "oh-my-opencode-linux-x64-baseline": "5.1.23",
98842
+ "oh-my-opencode-linux-x64-musl": "5.1.23",
98843
+ "oh-my-opencode-linux-x64-musl-baseline": "5.1.23",
98844
+ "oh-my-opencode-windows-arm64": "5.1.23",
98845
+ "oh-my-opencode-windows-x64": "5.1.23",
98846
+ "oh-my-opencode-windows-x64-baseline": "5.1.23"
98836
98847
  },
98837
98848
  overrides: {
98838
98849
  hono: "^4.13.8",
@@ -5,5 +5,5 @@
5
5
  "index.js": "b6b064fab277031c6c51f5a58b84b31040f9960bf767bf646adc0540c1d25c1b",
6
6
  "page-bundle.js": "bfd51e8383cf47200d57387bbbed258bce5a3a3d00c38fc108034d2888e23f0c"
7
7
  },
8
- "stagedAtUtc": "2026-10-06T13:44:50.013Z"
8
+ "stagedAtUtc": "2026-10-07T16:27:53.017Z"
9
9
  }
package/dist/tui.js CHANGED
@@ -3628,6 +3628,67 @@ var init_model_requirements = __esm(() => {
3628
3628
  init_category_model_requirements();
3629
3629
  });
3630
3630
 
3631
+ // packages/model-core/src/reasoning-level.ts
3632
+ function isReasoningLevelOrAuto(value) {
3633
+ return REASONING_LEVEL_OR_AUTO_SET.has(value);
3634
+ }
3635
+ function splitReasoningSuffix(model, options) {
3636
+ if (typeof model !== "string")
3637
+ return { base: "" };
3638
+ const trimmed = model.trim();
3639
+ if (!trimmed)
3640
+ return { base: "" };
3641
+ const separatorIndex = trimmed.lastIndexOf(":");
3642
+ if (separatorIndex === -1)
3643
+ return { base: trimmed };
3644
+ const base = trimmed.slice(0, separatorIndex).trim();
3645
+ const token = trimmed.slice(separatorIndex + 1).trim().toLowerCase();
3646
+ if (!base || !isReasoningLevelOrAuto(token))
3647
+ return { base: trimmed };
3648
+ if (token === "max" && !(options?.allowMaxSuffix ?? base.includes("/")))
3649
+ return { base: trimmed };
3650
+ return { base, level: token };
3651
+ }
3652
+ var REASONING_LEVELS, REASONING_AUTO = "auto", REASONING_LEVEL_SET, REASONING_LEVEL_OR_AUTO_SET;
3653
+ var init_reasoning_level = __esm(() => {
3654
+ REASONING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
3655
+ REASONING_LEVEL_SET = new Set(REASONING_LEVELS);
3656
+ REASONING_LEVEL_OR_AUTO_SET = new Set([...REASONING_LEVELS, REASONING_AUTO]);
3657
+ });
3658
+
3659
+ // packages/model-core/src/model-string-parser.ts
3660
+ function parseVariantFromModelID(rawModelID, options) {
3661
+ if (typeof rawModelID !== "string") {
3662
+ return { modelID: "" };
3663
+ }
3664
+ const trimmedModelID = rawModelID.trim();
3665
+ if (!trimmedModelID) {
3666
+ return { modelID: "" };
3667
+ }
3668
+ const parenthesizedVariant = trimmedModelID.match(/^(.*)\(([^()]+)\)\s*$/);
3669
+ if (parenthesizedVariant) {
3670
+ const modelID = parenthesizedVariant[1]?.trim() ?? "";
3671
+ const variant = parenthesizedVariant[2]?.trim();
3672
+ return variant ? { modelID, variant } : { modelID };
3673
+ }
3674
+ const suffixedModel = splitReasoningSuffix(trimmedModelID, options);
3675
+ if (suffixedModel.level) {
3676
+ return { modelID: suffixedModel.base, variant: suffixedModel.level };
3677
+ }
3678
+ const spaceVariant = trimmedModelID.match(/^(.*\S)\s+([a-z][a-z0-9_-]*)$/i);
3679
+ if (spaceVariant) {
3680
+ const modelID = spaceVariant[1]?.trim() ?? "";
3681
+ const variant = spaceVariant[2]?.trim().toLowerCase();
3682
+ if (variant) {
3683
+ return { modelID, variant };
3684
+ }
3685
+ }
3686
+ return { modelID: trimmedModelID };
3687
+ }
3688
+ var init_model_string_parser = __esm(() => {
3689
+ init_reasoning_level();
3690
+ });
3691
+
3631
3692
  // packages/model-core/src/model-family-detectors.ts
3632
3693
  var init_model_family_detectors = () => {};
3633
3694
 
@@ -3727,67 +3788,6 @@ function normalizeModelID(modelID) {
3727
3788
  return modelID.replace(/\.(\d+)/g, "-$1");
3728
3789
  }
3729
3790
 
3730
- // packages/model-core/src/reasoning-level.ts
3731
- function isReasoningLevelOrAuto(value) {
3732
- return REASONING_LEVEL_OR_AUTO_SET.has(value);
3733
- }
3734
- function splitReasoningSuffix(model, options) {
3735
- if (typeof model !== "string")
3736
- return { base: "" };
3737
- const trimmed = model.trim();
3738
- if (!trimmed)
3739
- return { base: "" };
3740
- const separatorIndex = trimmed.lastIndexOf(":");
3741
- if (separatorIndex === -1)
3742
- return { base: trimmed };
3743
- const base = trimmed.slice(0, separatorIndex).trim();
3744
- const token = trimmed.slice(separatorIndex + 1).trim().toLowerCase();
3745
- if (!base || !isReasoningLevelOrAuto(token))
3746
- return { base: trimmed };
3747
- if (token === "max" && !(options?.allowMaxSuffix ?? base.includes("/")))
3748
- return { base: trimmed };
3749
- return { base, level: token };
3750
- }
3751
- var REASONING_LEVELS, REASONING_AUTO = "auto", REASONING_LEVEL_SET, REASONING_LEVEL_OR_AUTO_SET;
3752
- var init_reasoning_level = __esm(() => {
3753
- REASONING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
3754
- REASONING_LEVEL_SET = new Set(REASONING_LEVELS);
3755
- REASONING_LEVEL_OR_AUTO_SET = new Set([...REASONING_LEVELS, REASONING_AUTO]);
3756
- });
3757
-
3758
- // packages/model-core/src/model-string-parser.ts
3759
- function parseVariantFromModelID(rawModelID, options) {
3760
- if (typeof rawModelID !== "string") {
3761
- return { modelID: "" };
3762
- }
3763
- const trimmedModelID = rawModelID.trim();
3764
- if (!trimmedModelID) {
3765
- return { modelID: "" };
3766
- }
3767
- const parenthesizedVariant = trimmedModelID.match(/^(.*)\(([^()]+)\)\s*$/);
3768
- if (parenthesizedVariant) {
3769
- const modelID = parenthesizedVariant[1]?.trim() ?? "";
3770
- const variant = parenthesizedVariant[2]?.trim();
3771
- return variant ? { modelID, variant } : { modelID };
3772
- }
3773
- const suffixedModel = splitReasoningSuffix(trimmedModelID, options);
3774
- if (suffixedModel.level) {
3775
- return { modelID: suffixedModel.base, variant: suffixedModel.level };
3776
- }
3777
- const spaceVariant = trimmedModelID.match(/^(.*\S)\s+([a-z][a-z0-9_-]*)$/i);
3778
- if (spaceVariant) {
3779
- const modelID = spaceVariant[1]?.trim() ?? "";
3780
- const variant = spaceVariant[2]?.trim().toLowerCase();
3781
- if (variant) {
3782
- return { modelID, variant };
3783
- }
3784
- }
3785
- return { modelID: trimmedModelID };
3786
- }
3787
- var init_model_string_parser = __esm(() => {
3788
- init_reasoning_level();
3789
- });
3790
-
3791
3791
  // packages/model-core/src/model-capability-heuristics.ts
3792
3792
  function detectHeuristicModelFamily(modelID) {
3793
3793
  const parsedModel = parseVariantFromModelID(modelID, { allowMaxSuffix: true });
@@ -69872,7 +69872,7 @@ var init_harness = __esm(() => {
69872
69872
  });
69873
69873
 
69874
69874
  // packages/omo-config-core/src/schema/memory.ts
69875
- 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;
69875
+ 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, OmoMemoryProjectionSchema, OmoMemoryProjectionLayerSchema, OmoMemoryAgentOverridesSchema, OmoMemorySettingsSchema, OmoMemorySettingsLayerSchema;
69876
69876
  var init_memory = __esm(() => {
69877
69877
  init_zod();
69878
69878
  OmoMemoryReflectionTriggerSchema = object({
@@ -69999,6 +69999,14 @@ var init_memory = __esm(() => {
69999
69999
  OmoMemoryWriteNoticeLayerSchema = object({
70000
70000
  enabled: boolean2().optional()
70001
70001
  }).strict();
70002
+ OmoMemoryProjectionSchema = object({
70003
+ max_entries_per_directory: number2().int().min(0).default(40),
70004
+ max_bytes: number2().int().min(0).default(24576)
70005
+ }).strict();
70006
+ OmoMemoryProjectionLayerSchema = object({
70007
+ max_entries_per_directory: number2().int().min(0).optional(),
70008
+ max_bytes: number2().int().min(0).optional()
70009
+ }).strict();
70002
70010
  OmoMemoryAgentOverridesSchema = object({
70003
70011
  enabled: boolean2().optional(),
70004
70012
  agent: string2().min(1).optional(),
@@ -70012,6 +70020,7 @@ var init_memory = __esm(() => {
70012
70020
  sync: OmoMemorySyncLayerSchema.optional(),
70013
70021
  search: OmoMemorySearchLayerSchema.optional(),
70014
70022
  recall: OmoMemoryRecallLayerSchema.optional(),
70023
+ projection: OmoMemoryProjectionLayerSchema.optional(),
70015
70024
  compile_warn_tokens: number2().int().positive().optional()
70016
70025
  }).strict();
70017
70026
  OmoMemorySettingsSchema = object({
@@ -70050,6 +70059,7 @@ var init_memory = __esm(() => {
70050
70059
  tool_budget: 8,
70051
70060
  query_expansion: false
70052
70061
  }),
70062
+ projection: OmoMemoryProjectionSchema.default({ max_entries_per_directory: 40, max_bytes: 24576 }),
70053
70063
  compile_warn_tokens: number2().int().positive().default(30000),
70054
70064
  agents: record(string2(), OmoMemoryAgentOverridesSchema).default({})
70055
70065
  }).strict();
@@ -70066,6 +70076,7 @@ var init_memory = __esm(() => {
70066
70076
  sync: OmoMemorySyncLayerSchema.optional(),
70067
70077
  search: OmoMemorySearchLayerSchema.optional(),
70068
70078
  recall: OmoMemoryRecallLayerSchema.optional(),
70079
+ projection: OmoMemoryProjectionLayerSchema.optional(),
70069
70080
  compile_warn_tokens: number2().int().positive().optional(),
70070
70081
  agents: record(string2(), OmoMemoryAgentOverridesSchema).optional()
70071
70082
  }).strict();
@@ -74609,7 +74620,7 @@ init_shared();
74609
74620
  // package.json
74610
74621
  var package_default = {
74611
74622
  name: "oh-my-opencode",
74612
- version: "5.1.21",
74623
+ version: "5.1.23",
74613
74624
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
74614
74625
  main: "./dist/index.js",
74615
74626
  types: "dist/index.d.ts",
@@ -74786,7 +74797,7 @@ var package_default = {
74786
74797
  },
74787
74798
  devDependencies: {
74788
74799
  "@clack/prompts": "^1.8.1",
74789
- "@code-yeongyu/senpi": "2026.10.10-3",
74800
+ "@code-yeongyu/senpi": "2026.10.10-6",
74790
74801
  "@modelcontextprotocol/sdk": "^1.30.0",
74791
74802
  "@oh-my-opencode/agents-md-core": "workspace:*",
74792
74803
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
@@ -74844,18 +74855,18 @@ var package_default = {
74844
74855
  typescript: "^7.0.2"
74845
74856
  },
74846
74857
  optionalDependencies: {
74847
- "oh-my-opencode-darwin-arm64": "5.1.21",
74848
- "oh-my-opencode-darwin-x64": "5.1.21",
74849
- "oh-my-opencode-darwin-x64-baseline": "5.1.21",
74850
- "oh-my-opencode-linux-arm64": "5.1.21",
74851
- "oh-my-opencode-linux-arm64-musl": "5.1.21",
74852
- "oh-my-opencode-linux-x64": "5.1.21",
74853
- "oh-my-opencode-linux-x64-baseline": "5.1.21",
74854
- "oh-my-opencode-linux-x64-musl": "5.1.21",
74855
- "oh-my-opencode-linux-x64-musl-baseline": "5.1.21",
74856
- "oh-my-opencode-windows-arm64": "5.1.21",
74857
- "oh-my-opencode-windows-x64": "5.1.21",
74858
- "oh-my-opencode-windows-x64-baseline": "5.1.21"
74858
+ "oh-my-opencode-darwin-arm64": "5.1.23",
74859
+ "oh-my-opencode-darwin-x64": "5.1.23",
74860
+ "oh-my-opencode-darwin-x64-baseline": "5.1.23",
74861
+ "oh-my-opencode-linux-arm64": "5.1.23",
74862
+ "oh-my-opencode-linux-arm64-musl": "5.1.23",
74863
+ "oh-my-opencode-linux-x64": "5.1.23",
74864
+ "oh-my-opencode-linux-x64-baseline": "5.1.23",
74865
+ "oh-my-opencode-linux-x64-musl": "5.1.23",
74866
+ "oh-my-opencode-linux-x64-musl-baseline": "5.1.23",
74867
+ "oh-my-opencode-windows-arm64": "5.1.23",
74868
+ "oh-my-opencode-windows-x64": "5.1.23",
74869
+ "oh-my-opencode-windows-x64-baseline": "5.1.23"
74859
74870
  },
74860
74871
  overrides: {
74861
74872
  hono: "^4.13.8",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-opencode",
3
- "version": "5.1.21",
3
+ "version": "5.1.23",
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",
@@ -177,7 +177,7 @@
177
177
  },
178
178
  "devDependencies": {
179
179
  "@clack/prompts": "^1.8.1",
180
- "@code-yeongyu/senpi": "2026.10.10-3",
180
+ "@code-yeongyu/senpi": "2026.10.10-6",
181
181
  "@modelcontextprotocol/sdk": "^1.30.0",
182
182
  "@oh-my-opencode/agents-md-core": "workspace:*",
183
183
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
@@ -235,18 +235,18 @@
235
235
  "typescript": "^7.0.2"
236
236
  },
237
237
  "optionalDependencies": {
238
- "oh-my-opencode-darwin-arm64": "5.1.21",
239
- "oh-my-opencode-darwin-x64": "5.1.21",
240
- "oh-my-opencode-darwin-x64-baseline": "5.1.21",
241
- "oh-my-opencode-linux-arm64": "5.1.21",
242
- "oh-my-opencode-linux-arm64-musl": "5.1.21",
243
- "oh-my-opencode-linux-x64": "5.1.21",
244
- "oh-my-opencode-linux-x64-baseline": "5.1.21",
245
- "oh-my-opencode-linux-x64-musl": "5.1.21",
246
- "oh-my-opencode-linux-x64-musl-baseline": "5.1.21",
247
- "oh-my-opencode-windows-arm64": "5.1.21",
248
- "oh-my-opencode-windows-x64": "5.1.21",
249
- "oh-my-opencode-windows-x64-baseline": "5.1.21"
238
+ "oh-my-opencode-darwin-arm64": "5.1.23",
239
+ "oh-my-opencode-darwin-x64": "5.1.23",
240
+ "oh-my-opencode-darwin-x64-baseline": "5.1.23",
241
+ "oh-my-opencode-linux-arm64": "5.1.23",
242
+ "oh-my-opencode-linux-arm64-musl": "5.1.23",
243
+ "oh-my-opencode-linux-x64": "5.1.23",
244
+ "oh-my-opencode-linux-x64-baseline": "5.1.23",
245
+ "oh-my-opencode-linux-x64-musl": "5.1.23",
246
+ "oh-my-opencode-linux-x64-musl-baseline": "5.1.23",
247
+ "oh-my-opencode-windows-arm64": "5.1.23",
248
+ "oh-my-opencode-windows-x64": "5.1.23",
249
+ "oh-my-opencode-windows-x64-baseline": "5.1.23"
250
250
  },
251
251
  "overrides": {
252
252
  "hono": "^4.13.8",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omo",
3
- "version": "5.1.21",
3
+ "version": "5.1.23",
4
4
  "description": "One Codex plugin namespace for Yeongyu's local Codex components.",
5
5
  "author": {
6
6
  "name": "Yeongyu Kim",
@@ -7240,6 +7240,14 @@ var OmoMemorySoulLayerSchema = object({
7240
7240
  var OmoMemoryWriteNoticeLayerSchema = object({
7241
7241
  enabled: boolean2().optional()
7242
7242
  }).strict();
7243
+ var OmoMemoryProjectionSchema = object({
7244
+ max_entries_per_directory: number2().int().min(0).default(40),
7245
+ max_bytes: number2().int().min(0).default(24576)
7246
+ }).strict();
7247
+ var OmoMemoryProjectionLayerSchema = object({
7248
+ max_entries_per_directory: number2().int().min(0).optional(),
7249
+ max_bytes: number2().int().min(0).optional()
7250
+ }).strict();
7243
7251
  var OmoMemoryAgentOverridesSchema = object({
7244
7252
  enabled: boolean2().optional(),
7245
7253
  agent: string2().min(1).optional(),
@@ -7253,6 +7261,7 @@ var OmoMemoryAgentOverridesSchema = object({
7253
7261
  sync: OmoMemorySyncLayerSchema.optional(),
7254
7262
  search: OmoMemorySearchLayerSchema.optional(),
7255
7263
  recall: OmoMemoryRecallLayerSchema.optional(),
7264
+ projection: OmoMemoryProjectionLayerSchema.optional(),
7256
7265
  compile_warn_tokens: number2().int().positive().optional()
7257
7266
  }).strict();
7258
7267
  var OmoMemorySettingsSchema = object({
@@ -7291,6 +7300,7 @@ var OmoMemorySettingsSchema = object({
7291
7300
  tool_budget: 8,
7292
7301
  query_expansion: false
7293
7302
  }),
7303
+ projection: OmoMemoryProjectionSchema.default({ max_entries_per_directory: 40, max_bytes: 24576 }),
7294
7304
  compile_warn_tokens: number2().int().positive().default(30000),
7295
7305
  agents: record(string2(), OmoMemoryAgentOverridesSchema).default({})
7296
7306
  }).strict();
@@ -7307,6 +7317,7 @@ var OmoMemorySettingsLayerSchema = object({
7307
7317
  sync: OmoMemorySyncLayerSchema.optional(),
7308
7318
  search: OmoMemorySearchLayerSchema.optional(),
7309
7319
  recall: OmoMemoryRecallLayerSchema.optional(),
7320
+ projection: OmoMemoryProjectionLayerSchema.optional(),
7310
7321
  compile_warn_tokens: number2().int().positive().optional(),
7311
7322
  agents: record(string2(), OmoMemoryAgentOverridesSchema).optional()
7312
7323
  }).strict();
@@ -8,7 +8,7 @@
8
8
  "command": "node \"${PLUGIN_ROOT}/components/bootstrap/dist/cli.js\" hook session-start",
9
9
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\bootstrap.ps1\"",
10
10
  "timeout": 30,
11
- "statusMessage": "(OmO 5.1.21) Checking Bootstrap Provisioning"
11
+ "statusMessage": "(OmO 5.1.23) Checking Bootstrap Provisioning"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-bootstrap",
3
- "version": "5.1.21",
3
+ "version": "5.1.23",
4
4
  "description": "Codex SessionStart bootstrap component that provisions LazyCodex runtime dependencies from a detached worker.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 30,
11
- "statusMessage": "(OmO 5.1.21) Checking Comments"
11
+ "statusMessage": "(OmO 5.1.23) Checking Comments"
12
12
  }
13
13
  ]
14
14
  }