lazycodex-ai 5.0.0-beta.50 → 5.0.0-beta.51

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 +37 -22
  2. package/dist/cli-node/index.js +37 -22
  3. package/package.json +1 -1
  4. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  5. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +5 -1
  6. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  7. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  8. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  9. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  10. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  11. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  12. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  13. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  14. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  15. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  16. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  17. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  18. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  19. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  20. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  21. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  22. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  23. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  24. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  25. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  26. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  27. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +11 -5
  28. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +11 -5
  29. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  30. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  31. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +10 -5
  32. package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +21 -1
  33. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  34. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  35. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  36. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  37. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  38. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  39. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  40. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  41. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  42. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  43. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  44. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  45. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  46. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  47. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  48. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  49. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  50. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  51. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  52. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  53. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  54. package/packages/omo-codex/plugin/package-lock.json +12 -12
  55. package/packages/omo-codex/plugin/package.json +1 -1
  56. package/packages/omo-codex/plugin/scripts/migrate-codex-config/subagent-limit-guard.mjs +1 -0
  57. package/packages/omo-codex/scripts/install-dist/install-local.mjs +9 -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.50",
67
+ version: "5.0.0-beta.51",
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",
@@ -248,7 +248,7 @@ var init_package = __esm(() => {
248
248
  zod: "^4.4.3"
249
249
  },
250
250
  devDependencies: {
251
- "@code-yeongyu/senpi": "2026.9.9",
251
+ "@code-yeongyu/senpi": "2026.9.9-2",
252
252
  "@oh-my-opencode/agents-md-core": "workspace:*",
253
253
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
254
254
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -289,18 +289,18 @@ var init_package = __esm(() => {
289
289
  typescript: "^7.0.2"
290
290
  },
291
291
  optionalDependencies: {
292
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.50",
293
- "oh-my-opencode-darwin-x64": "5.0.0-beta.50",
294
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.50",
295
- "oh-my-opencode-linux-arm64": "5.0.0-beta.50",
296
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.50",
297
- "oh-my-opencode-linux-x64": "5.0.0-beta.50",
298
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.50",
299
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.50",
300
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.50",
301
- "oh-my-opencode-windows-arm64": "5.0.0-beta.50",
302
- "oh-my-opencode-windows-x64": "5.0.0-beta.50",
303
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.50"
292
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.51",
293
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.51",
294
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.51",
295
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.51",
296
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.51",
297
+ "oh-my-opencode-linux-x64": "5.0.0-beta.51",
298
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.51",
299
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.51",
300
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.51",
301
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.51",
302
+ "oh-my-opencode-windows-x64": "5.0.0-beta.51",
303
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.51"
304
304
  },
305
305
  overrides: {
306
306
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -84439,7 +84439,7 @@ var package_default2;
84439
84439
  var init_package2 = __esm(() => {
84440
84440
  package_default2 = {
84441
84441
  name: "@oh-my-opencode/omo-codex",
84442
- version: "5.0.0-beta.50",
84442
+ version: "5.0.0-beta.51",
84443
84443
  type: "module",
84444
84444
  private: true,
84445
84445
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -90436,7 +90436,7 @@ var CODEX_AGENTS_HEADER = "agents";
90436
90436
  var CODEX_MULTI_AGENT_V2_HEADER = "features.multi_agent_v2";
90437
90437
  function ensureCodexMultiAgentV2Config(config, options = {}) {
90438
90438
  const featureFlag = removeFeatureFlagSetting(config, "multi_agent_v2");
90439
- const v2Preferred = options.multiAgentVersion === "v2";
90439
+ const v2Preferred = options.multiAgentVersion === "v2" || isMultiAgentV2Enabled(featureFlag.config);
90440
90440
  const agentsConfig = removeAgentsMaxThreads(featureFlag.config, v2Preferred);
90441
90441
  const preserveDisable = featureFlag.value === false && !v2Preferred;
90442
90442
  const featureConfig = preserveDisable ? setMultiAgentV2Disable(agentsConfig) : v2Preferred ? removeMultiAgentV2Disable(agentsConfig) : agentsConfig;
@@ -90515,6 +90515,10 @@ function removeFeatureFlagSetting(config, featureName) {
90515
90515
  value: readBooleanSetting(section.text, featureName)
90516
90516
  };
90517
90517
  }
90518
+ function isMultiAgentV2Enabled(config) {
90519
+ const section = findTomlSection(config, CODEX_MULTI_AGENT_V2_HEADER);
90520
+ return section !== null && /^\s*enabled\s*=\s*true[ \t]*(?:#.*)?$/m.test(section.text);
90521
+ }
90518
90522
  function removeAgentsMaxThreads(config, v2Preferred) {
90519
90523
  const section = findTomlSection(config, CODEX_AGENTS_HEADER);
90520
90524
  if (!section)
@@ -91677,7 +91681,7 @@ function lastValue(values) {
91677
91681
  return values.length > 0 ? values[values.length - 1] ?? null : null;
91678
91682
  }
91679
91683
  function repairProjectLocalCodexConfigText(config) {
91680
- if (!isMultiAgentV2Enabled(config))
91684
+ if (!isMultiAgentV2Enabled2(config))
91681
91685
  return { config, changed: false, removedKeys: [] };
91682
91686
  let nextConfig = config;
91683
91687
  const removedKeys = [];
@@ -91767,7 +91771,7 @@ async function collectProjectLocalArtifacts(projectRoots) {
91767
91771
  }
91768
91772
  return artifacts;
91769
91773
  }
91770
- function isMultiAgentV2Enabled(config) {
91774
+ function isMultiAgentV2Enabled2(config) {
91771
91775
  const featuresSection = findTomlSection(config, "features");
91772
91776
  if (featuresSection !== null && settingIsBooleanTrue(featuresSection.text, "multi_agent_v2"))
91773
91777
  return true;
@@ -93198,6 +93202,20 @@ import { constants as constants9 } from "fs";
93198
93202
  import { access as access2, readFile as readFile26, stat as stat6 } from "fs/promises";
93199
93203
  import { dirname as dirname23, join as join59 } from "path";
93200
93204
 
93205
+ // packages/memory-core/src/personas/manifest.ts
93206
+ var PERSONA_ASSET_FILENAMES = {
93207
+ reflection: "reflection-persona.md",
93208
+ dream: "dream-persona.md",
93209
+ facts: "facts-persona.md",
93210
+ kibitzer: "kibitzer-persona.md"
93211
+ };
93212
+ var PERSONA_ASSET_FILES = [
93213
+ PERSONA_ASSET_FILENAMES.reflection,
93214
+ PERSONA_ASSET_FILENAMES.dream,
93215
+ PERSONA_ASSET_FILENAMES.facts,
93216
+ PERSONA_ASSET_FILENAMES.kibitzer
93217
+ ];
93218
+
93201
93219
  // packages/omo-senpi/src/install/senpi-settings.ts
93202
93220
  import { constants as constants8 } from "fs";
93203
93221
  import { access, copyFile as copyFile3, mkdir as mkdir9, readFile as readFile25, rename as rename5, writeFile as writeFile14 } from "fs/promises";
@@ -93321,10 +93339,7 @@ var REQUIRED_PLUGIN_ARTIFACTS = [
93321
93339
  join59("extensions", "omo-task.js"),
93322
93340
  join59("extensions", "omo-member.js"),
93323
93341
  join59("extensions", "memory-run-supervisor.mjs"),
93324
- join59("extensions", "reflection-persona.md"),
93325
- join59("extensions", "dream-persona.md"),
93326
- join59("extensions", "facts-persona.md"),
93327
- join59("extensions", "kibitzer-persona.md"),
93342
+ ...PERSONA_ASSET_FILES.map((filename) => join59("extensions", filename)),
93328
93343
  join59("skills", "ast-grep", "SKILL.md"),
93329
93344
  join59("skills", "coding-agent-sessions", "SKILL.md"),
93330
93345
  join59("skills", "debugging", "SKILL.md"),
@@ -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.50",
68
+ version: "5.0.0-beta.51",
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",
@@ -249,7 +249,7 @@ var init_package = __esm(() => {
249
249
  zod: "^4.4.3"
250
250
  },
251
251
  devDependencies: {
252
- "@code-yeongyu/senpi": "2026.9.9",
252
+ "@code-yeongyu/senpi": "2026.9.9-2",
253
253
  "@oh-my-opencode/agents-md-core": "workspace:*",
254
254
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
255
255
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -290,18 +290,18 @@ var init_package = __esm(() => {
290
290
  typescript: "^7.0.2"
291
291
  },
292
292
  optionalDependencies: {
293
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.50",
294
- "oh-my-opencode-darwin-x64": "5.0.0-beta.50",
295
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.50",
296
- "oh-my-opencode-linux-arm64": "5.0.0-beta.50",
297
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.50",
298
- "oh-my-opencode-linux-x64": "5.0.0-beta.50",
299
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.50",
300
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.50",
301
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.50",
302
- "oh-my-opencode-windows-arm64": "5.0.0-beta.50",
303
- "oh-my-opencode-windows-x64": "5.0.0-beta.50",
304
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.50"
293
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.51",
294
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.51",
295
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.51",
296
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.51",
297
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.51",
298
+ "oh-my-opencode-linux-x64": "5.0.0-beta.51",
299
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.51",
300
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.51",
301
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.51",
302
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.51",
303
+ "oh-my-opencode-windows-x64": "5.0.0-beta.51",
304
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.51"
305
305
  },
306
306
  overrides: {
307
307
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -84518,7 +84518,7 @@ var package_default2;
84518
84518
  var init_package2 = __esm(() => {
84519
84519
  package_default2 = {
84520
84520
  name: "@oh-my-opencode/omo-codex",
84521
- version: "5.0.0-beta.50",
84521
+ version: "5.0.0-beta.51",
84522
84522
  type: "module",
84523
84523
  private: true,
84524
84524
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -90515,7 +90515,7 @@ var CODEX_AGENTS_HEADER = "agents";
90515
90515
  var CODEX_MULTI_AGENT_V2_HEADER = "features.multi_agent_v2";
90516
90516
  function ensureCodexMultiAgentV2Config(config, options = {}) {
90517
90517
  const featureFlag = removeFeatureFlagSetting(config, "multi_agent_v2");
90518
- const v2Preferred = options.multiAgentVersion === "v2";
90518
+ const v2Preferred = options.multiAgentVersion === "v2" || isMultiAgentV2Enabled(featureFlag.config);
90519
90519
  const agentsConfig = removeAgentsMaxThreads(featureFlag.config, v2Preferred);
90520
90520
  const preserveDisable = featureFlag.value === false && !v2Preferred;
90521
90521
  const featureConfig = preserveDisable ? setMultiAgentV2Disable(agentsConfig) : v2Preferred ? removeMultiAgentV2Disable(agentsConfig) : agentsConfig;
@@ -90594,6 +90594,10 @@ function removeFeatureFlagSetting(config, featureName) {
90594
90594
  value: readBooleanSetting(section.text, featureName)
90595
90595
  };
90596
90596
  }
90597
+ function isMultiAgentV2Enabled(config) {
90598
+ const section = findTomlSection(config, CODEX_MULTI_AGENT_V2_HEADER);
90599
+ return section !== null && /^\s*enabled\s*=\s*true[ \t]*(?:#.*)?$/m.test(section.text);
90600
+ }
90597
90601
  function removeAgentsMaxThreads(config, v2Preferred) {
90598
90602
  const section = findTomlSection(config, CODEX_AGENTS_HEADER);
90599
90603
  if (!section)
@@ -91756,7 +91760,7 @@ function lastValue(values) {
91756
91760
  return values.length > 0 ? values[values.length - 1] ?? null : null;
91757
91761
  }
91758
91762
  function repairProjectLocalCodexConfigText(config) {
91759
- if (!isMultiAgentV2Enabled(config))
91763
+ if (!isMultiAgentV2Enabled2(config))
91760
91764
  return { config, changed: false, removedKeys: [] };
91761
91765
  let nextConfig = config;
91762
91766
  const removedKeys = [];
@@ -91846,7 +91850,7 @@ async function collectProjectLocalArtifacts(projectRoots) {
91846
91850
  }
91847
91851
  return artifacts;
91848
91852
  }
91849
- function isMultiAgentV2Enabled(config) {
91853
+ function isMultiAgentV2Enabled2(config) {
91850
91854
  const featuresSection = findTomlSection(config, "features");
91851
91855
  if (featuresSection !== null && settingIsBooleanTrue(featuresSection.text, "multi_agent_v2"))
91852
91856
  return true;
@@ -93277,6 +93281,20 @@ import { constants as constants9 } from "node:fs";
93277
93281
  import { access as access2, readFile as readFile26, stat as stat6 } from "node:fs/promises";
93278
93282
  import { dirname as dirname23, join as join59 } from "node:path";
93279
93283
 
93284
+ // packages/memory-core/src/personas/manifest.ts
93285
+ var PERSONA_ASSET_FILENAMES = {
93286
+ reflection: "reflection-persona.md",
93287
+ dream: "dream-persona.md",
93288
+ facts: "facts-persona.md",
93289
+ kibitzer: "kibitzer-persona.md"
93290
+ };
93291
+ var PERSONA_ASSET_FILES = [
93292
+ PERSONA_ASSET_FILENAMES.reflection,
93293
+ PERSONA_ASSET_FILENAMES.dream,
93294
+ PERSONA_ASSET_FILENAMES.facts,
93295
+ PERSONA_ASSET_FILENAMES.kibitzer
93296
+ ];
93297
+
93280
93298
  // packages/omo-senpi/src/install/senpi-settings.ts
93281
93299
  import { constants as constants8 } from "node:fs";
93282
93300
  import { access, copyFile as copyFile3, mkdir as mkdir9, readFile as readFile25, rename as rename5, writeFile as writeFile14 } from "node:fs/promises";
@@ -93400,10 +93418,7 @@ var REQUIRED_PLUGIN_ARTIFACTS = [
93400
93418
  join59("extensions", "omo-task.js"),
93401
93419
  join59("extensions", "omo-member.js"),
93402
93420
  join59("extensions", "memory-run-supervisor.mjs"),
93403
- join59("extensions", "reflection-persona.md"),
93404
- join59("extensions", "dream-persona.md"),
93405
- join59("extensions", "facts-persona.md"),
93406
- join59("extensions", "kibitzer-persona.md"),
93421
+ ...PERSONA_ASSET_FILES.map((filename) => join59("extensions", filename)),
93407
93422
  join59("skills", "ast-grep", "SKILL.md"),
93408
93423
  join59("skills", "coding-agent-sessions", "SKILL.md"),
93409
93424
  join59("skills", "debugging", "SKILL.md"),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lazycodex-ai",
3
- "version": "5.0.0-beta.50",
3
+ "version": "5.0.0-beta.51",
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",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omo",
3
- "version": "5.0.0-beta.50",
3
+ "version": "5.0.0-beta.51",
4
4
  "description": "One Codex plugin namespace for Yeongyu's local Codex components.",
5
5
  "author": {
6
6
  "name": "Yeongyu Kim",
@@ -3260,7 +3260,7 @@ var CODEX_AGENTS_HEADER = "agents";
3260
3260
  var CODEX_MULTI_AGENT_V2_HEADER = "features.multi_agent_v2";
3261
3261
  function ensureCodexMultiAgentV2Config(config, options = {}) {
3262
3262
  const featureFlag = removeFeatureFlagSetting(config, "multi_agent_v2");
3263
- const v2Preferred = options.multiAgentVersion === "v2";
3263
+ const v2Preferred = options.multiAgentVersion === "v2" || isMultiAgentV2Enabled(featureFlag.config);
3264
3264
  const agentsConfig = removeAgentsMaxThreads(featureFlag.config, v2Preferred);
3265
3265
  const preserveDisable = featureFlag.value === false && !v2Preferred;
3266
3266
  const featureConfig = preserveDisable ? setMultiAgentV2Disable(agentsConfig) : v2Preferred ? removeMultiAgentV2Disable(agentsConfig) : agentsConfig;
@@ -3339,6 +3339,10 @@ function removeFeatureFlagSetting(config, featureName) {
3339
3339
  value: readBooleanSetting(section.text, featureName)
3340
3340
  };
3341
3341
  }
3342
+ function isMultiAgentV2Enabled(config) {
3343
+ const section = findTomlSection(config, CODEX_MULTI_AGENT_V2_HEADER);
3344
+ return section !== null && /^\s*enabled\s*=\s*true[ \t]*(?:#.*)?$/m.test(section.text);
3345
+ }
3342
3346
  function removeAgentsMaxThreads(config, v2Preferred) {
3343
3347
  const section = findTomlSection(config, CODEX_AGENTS_HEADER);
3344
3348
  if (!section)
@@ -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.0.0-beta.50) Checking Bootstrap Provisioning"
11
+ "statusMessage": "(OmO 5.0.0-beta.51) Checking Bootstrap Provisioning"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-bootstrap",
3
- "version": "5.0.0-beta.50",
3
+ "version": "5.0.0-beta.51",
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.0.0-beta.50) Checking Comments"
11
+ "statusMessage": "(OmO 5.0.0-beta.51) Checking Comments"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-comment-checker",
3
- "version": "5.0.0-beta.50",
3
+ "version": "5.0.0-beta.51",
4
4
  "description": "Codex plugin that runs comment-checker after edit-like PostToolUse hooks.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook pre-tool-use",
10
10
  "timeout": 5,
11
- "statusMessage": "(OmO 5.0.0-beta.50) Recommending Git Bash MCP"
11
+ "statusMessage": "(OmO 5.0.0-beta.51) Recommending Git Bash MCP"
12
12
  }
13
13
  ]
14
14
  }
@@ -20,7 +20,7 @@
20
20
  "type": "command",
21
21
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
22
22
  "timeout": 5,
23
- "statusMessage": "(OmO 5.0.0-beta.50) Resetting Git Bash MCP Reminder"
23
+ "statusMessage": "(OmO 5.0.0-beta.51) Resetting Git Bash MCP Reminder"
24
24
  }
25
25
  ]
26
26
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-git-bash-hook",
3
- "version": "5.0.0-beta.50",
3
+ "version": "5.0.0-beta.51",
4
4
  "description": "Codex hook component that reminds Windows sessions to prefer the OMO git_bash MCP.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/components/lazycodex-executor-verify/dist/cli.js\" hook subagent-stop",
10
10
  "timeout": 10,
11
- "statusMessage": "(OmO 5.0.0-beta.50) Verifying LazyCodex Executor Evidence"
11
+ "statusMessage": "(OmO 5.0.0-beta.51) Verifying LazyCodex Executor Evidence"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-lazycodex-executor-verify",
3
- "version": "5.0.0-beta.50",
3
+ "version": "5.0.0-beta.51",
4
4
  "description": "Codex SubagentStop evidence verifier for LazyCodex executor completions.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "version": "5.0.0-beta.50",
4
- "inputDigest": "sha256:27672c2cd34eb3b44fc226b7e4e9137af0d0acedbb729fe92cdd663602ae6846",
3
+ "version": "5.0.0-beta.51",
4
+ "inputDigest": "sha256:5ff68702440d0c19cf7d59a8fb7e953983cdae7c9228a0fae86af5e289116416",
5
5
  "outputs": [
6
6
  {
7
7
  "path": "cli.d.ts",
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 60,
11
- "statusMessage": "(OmO 5.0.0-beta.50) Checking LSP Diagnostics"
11
+ "statusMessage": "(OmO 5.0.0-beta.51) Checking LSP Diagnostics"
12
12
  }
13
13
  ]
14
14
  }
@@ -21,7 +21,7 @@
21
21
  "type": "command",
22
22
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
23
23
  "timeout": 5,
24
- "statusMessage": "(OmO 5.0.0-beta.50) Resetting LSP Diagnostics Cache"
24
+ "statusMessage": "(OmO 5.0.0-beta.51) Resetting LSP Diagnostics Cache"
25
25
  }
26
26
  ]
27
27
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-lsp",
3
- "version": "5.0.0-beta.50",
3
+ "version": "5.0.0-beta.51",
4
4
  "description": "Codex plugin that exposes Language Server Protocol tools and post-edit diagnostics.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook session-start",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.50) Loading Project Rules"
10
+ "statusMessage": "(OmO 5.0.0-beta.51) Loading Project Rules"
11
11
  }
12
12
  ]
13
13
  }
@@ -19,7 +19,7 @@
19
19
  "type": "command",
20
20
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook user-prompt-submit",
21
21
  "timeout": 10,
22
- "statusMessage": "(OmO 5.0.0-beta.50) Loading Project Rules"
22
+ "statusMessage": "(OmO 5.0.0-beta.51) Loading Project Rules"
23
23
  }
24
24
  ]
25
25
  }
@@ -32,7 +32,7 @@
32
32
  "type": "command",
33
33
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
34
34
  "timeout": 10,
35
- "statusMessage": "(OmO 5.0.0-beta.50) Matching Project Rules"
35
+ "statusMessage": "(OmO 5.0.0-beta.51) Matching Project Rules"
36
36
  }
37
37
  ]
38
38
  }
@@ -45,7 +45,7 @@
45
45
  "type": "command",
46
46
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
47
47
  "timeout": 10,
48
- "statusMessage": "(OmO 5.0.0-beta.50) Resetting Project Rule Cache"
48
+ "statusMessage": "(OmO 5.0.0-beta.51) Resetting Project Rule Cache"
49
49
  }
50
50
  ]
51
51
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-rules",
3
- "version": "5.0.0-beta.50",
3
+ "version": "5.0.0-beta.51",
4
4
  "description": "Codex plugin that injects project rule files into model context through lifecycle hooks.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 10,
11
- "statusMessage": "(OmO 5.0.0-beta.50) Checking Thread Title Hygiene"
11
+ "statusMessage": "(OmO 5.0.0-beta.51) Checking Thread Title Hygiene"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-teammode",
3
- "version": "5.0.0-beta.50",
3
+ "version": "5.0.0-beta.51",
4
4
  "description": "Codex team-mode hook component that keeps background thread titles descriptive after create_thread.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook session-start",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.50) Recording Session Telemetry"
10
+ "statusMessage": "(OmO 5.0.0-beta.51) Recording Session Telemetry"
11
11
  }
12
12
  ]
13
13
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-telemetry",
3
- "version": "5.0.0-beta.50",
3
+ "version": "5.0.0-beta.51",
4
4
  "description": "Codex plugin component that emits omo-codex anonymous daily-active telemetry on SessionStart.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.50) Checking Ultrawork Trigger"
10
+ "statusMessage": "(OmO 5.0.0-beta.51) Checking Ultrawork Trigger"
11
11
  }
12
12
  ]
13
13
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-ultrawork",
3
- "version": "5.0.0-beta.50",
3
+ "version": "5.0.0-beta.51",
4
4
  "description": "Codex plugin that injects the ultrawork orchestration directive and ships LazyCodex planning, review, QA, and gate agent roles.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-execute-continuation/dist/cli.js\" hook stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.50) Checking Ulw-Execute Continuation"
10
+ "statusMessage": "(OmO 5.0.0-beta.51) Checking Ulw-Execute Continuation"
11
11
  }
12
12
  ]
13
13
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-ulw-execute-continuation",
3
- "version": "5.0.0-beta.50",
3
+ "version": "5.0.0-beta.51",
4
4
  "description": "Codex Stop hook continuation injector for omo-codex ulw-execute plans.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -3828,11 +3828,17 @@ async function runSpawnAdmissionRecorderCli(stdin, stdout) {
3828
3828
  if (typeof dataDir !== "string" || typeof payload["session_id"] !== "string")
3829
3829
  return;
3830
3830
  const markerDir = join3(dataDir, "spawn-breaker");
3831
- mkdirSync2(markerDir, { recursive: true });
3832
- atomicWriteJson(join3(markerDir, `${payload["session_id"]}.json`), {
3833
- reason: response,
3834
- at: new Date().toISOString()
3835
- });
3831
+ try {
3832
+ mkdirSync2(markerDir, { recursive: true });
3833
+ atomicWriteJson(join3(markerDir, `${payload["session_id"]}.json`), {
3834
+ reason: response,
3835
+ at: new Date().toISOString()
3836
+ });
3837
+ } catch (error) {
3838
+ const message = error instanceof Error ? error.message : String(error);
3839
+ process.stderr.write(`[ulw-loop] spawn-guard: could not persist admission failure: ${message}
3840
+ `);
3841
+ }
3836
3842
  } catch {}
3837
3843
  }
3838
3844
  async function runSpawnGuardCli(stdin, stdout) {
@@ -70,11 +70,17 @@ export async function runSpawnAdmissionRecorderCli(stdin, stdout) {
70
70
  if (typeof dataDir !== "string" || typeof payload["session_id"] !== "string")
71
71
  return;
72
72
  const markerDir = join(dataDir, "spawn-breaker");
73
- mkdirSync(markerDir, { recursive: true });
74
- atomicWriteJson(join(markerDir, `${payload["session_id"]}.json`), {
75
- reason: response,
76
- at: new Date().toISOString(),
77
- });
73
+ try {
74
+ mkdirSync(markerDir, { recursive: true });
75
+ atomicWriteJson(join(markerDir, `${payload["session_id"]}.json`), {
76
+ reason: response,
77
+ at: new Date().toISOString(),
78
+ });
79
+ }
80
+ catch (error) {
81
+ const message = error instanceof Error ? error.message : String(error);
82
+ process.stderr.write(`[ulw-loop] spawn-guard: could not persist admission failure: ${message}\n`);
83
+ }
78
84
  }
79
85
  catch {
80
86
  /* malformed hook input is ignored */
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook user-prompt-submit --with-ultrawork",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.50) Checking Ulw-Loop Steering"
10
+ "statusMessage": "(OmO 5.0.0-beta.51) Checking Ulw-Loop Steering"
11
11
  }
12
12
  ]
13
13
  }
@@ -20,7 +20,7 @@
20
20
  "type": "command",
21
21
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use-spawn",
22
22
  "timeout": 5,
23
- "statusMessage": "(OmO 5.0.0-beta.50) Recording Spawn Admission"
23
+ "statusMessage": "(OmO 5.0.0-beta.51) Recording Spawn Admission"
24
24
  }
25
25
  ]
26
26
  }
@@ -33,7 +33,7 @@
33
33
  "type": "command",
34
34
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook pre-tool-use",
35
35
  "timeout": 5,
36
- "statusMessage": "(OmO 5.0.0-beta.50) Enforcing Unlimited Ulw-Loop Budget"
36
+ "statusMessage": "(OmO 5.0.0-beta.51) Enforcing Unlimited Ulw-Loop Budget"
37
37
  }
38
38
  ]
39
39
  },
@@ -44,7 +44,7 @@
44
44
  "type": "command",
45
45
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook pre-tool-use-spawn",
46
46
  "timeout": 5,
47
- "statusMessage": "(OmO 5.0.0-beta.50) Guarding Ulw-Loop Spawns"
47
+ "statusMessage": "(OmO 5.0.0-beta.51) Guarding Ulw-Loop Spawns"
48
48
  }
49
49
  ]
50
50
  }
@@ -56,7 +56,7 @@
56
56
  "type": "command",
57
57
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook stop",
58
58
  "timeout": 10,
59
- "statusMessage": "(OmO 5.0.0-beta.50) Checking Ulw-Loop Resume"
59
+ "statusMessage": "(OmO 5.0.0-beta.51) Checking Ulw-Loop Resume"
60
60
  }
61
61
  ]
62
62
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-ulw-loop",
3
- "version": "5.0.0-beta.50",
3
+ "version": "5.0.0-beta.51",
4
4
  "description": "Codex plugin: durable repo-native multi-goal orchestration with embedded success criteria and observable evidence audit.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -89,11 +89,16 @@ export async function runSpawnAdmissionRecorderCli(
89
89
  const dataDir = process.env["PLUGIN_DATA"];
90
90
  if (typeof dataDir !== "string" || typeof payload["session_id"] !== "string") return;
91
91
  const markerDir = join(dataDir, "spawn-breaker");
92
- mkdirSync(markerDir, { recursive: true });
93
- atomicWriteJson(join(markerDir, `${payload["session_id"]}.json`), {
94
- reason: response,
95
- at: new Date().toISOString(),
96
- });
92
+ try {
93
+ mkdirSync(markerDir, { recursive: true });
94
+ atomicWriteJson(join(markerDir, `${payload["session_id"]}.json`), {
95
+ reason: response,
96
+ at: new Date().toISOString(),
97
+ });
98
+ } catch (error) {
99
+ const message = error instanceof Error ? error.message : String(error);
100
+ process.stderr.write(`[ulw-loop] spawn-guard: could not persist admission failure: ${message}\n`);
101
+ }
97
102
  } catch {
98
103
  /* malformed hook input is ignored */
99
104
  }
@@ -3,7 +3,7 @@ import { mkdtemp, rm } from "node:fs/promises";
3
3
  import { tmpdir } from "node:os";
4
4
  import { join } from "node:path";
5
5
  import { Readable, Writable } from "node:stream";
6
- import { afterEach, beforeEach, describe, expect, it } from "vitest";
6
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
7
7
 
8
8
  import type { PreToolUsePayload } from "../src/codex-hook.ts";
9
9
  import { applySpawnGuards, DEFAULT_FANOUT_LIMIT, runSpawnAdmissionRecorderCli } from "../src/spawn-guard.ts";
@@ -158,6 +158,26 @@ describe("spawn admission breaker", () => {
158
158
  expect(existsSync(join(sessionDir(), "spawn-count.json"))).toBe(false);
159
159
  expect(existsSync(join(sessionDir(), "review-spawn-counts.json"))).toBe(false);
160
160
  });
161
+
162
+ it.skipIf(process.getuid?.() === 0)(
163
+ "#given PLUGIN_DATA is a file #when recording an admission failure #then reports persist failure on stderr and keeps stdout empty",
164
+ async () => {
165
+ const blocked = join(workDir, "blocked-plugin-data");
166
+ writeFileSync(blocked, "not-a-directory");
167
+ process.env["PLUGIN_DATA"] = blocked;
168
+ const err: string[] = [];
169
+ const spy = vi.spyOn(process.stderr, "write").mockImplementation((chunk: string | Uint8Array): boolean => {
170
+ err.push(chunk.toString());
171
+ return true;
172
+ });
173
+ try {
174
+ await expect(record("too many active cells")).resolves.toBe("");
175
+ expect(err.join("")).toContain("could not persist");
176
+ } finally {
177
+ spy.mockRestore();
178
+ }
179
+ },
180
+ );
161
181
  });
162
182
 
163
183
  describe("applySpawnGuards fan-out cap", () => {
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/git-bash/dist/cli.js\" hook post-compact",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.50) Resetting Git Bash MCP Reminder",
10
+ "statusMessage": "(OmO 5.0.0-beta.51) Resetting Git Bash MCP Reminder",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\git-bash\\dist\\cli.js\" hook post-compact"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/lsp/dist/cli.js\" hook post-compact",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.50) Resetting LSP Diagnostics Cache",
10
+ "statusMessage": "(OmO 5.0.0-beta.51) Resetting LSP Diagnostics Cache",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\lsp\\dist\\cli.js\" hook post-compact"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook post-compact",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.50) Resetting Project Rule Cache",
10
+ "statusMessage": "(OmO 5.0.0-beta.51) Resetting Project Rule Cache",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\rules\\dist\\cli.js\" hook post-compact"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/comment-checker/dist/cli.js\" hook post-tool-use",
9
9
  "timeout": 30,
10
- "statusMessage": "(OmO 5.0.0-beta.50) Checking Comments",
10
+ "statusMessage": "(OmO 5.0.0-beta.51) Checking Comments",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\comment-checker\\dist\\cli.js\" hook post-tool-use"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/lsp/dist/cli.js\" hook post-tool-use",
9
9
  "timeout": 60,
10
- "statusMessage": "(OmO 5.0.0-beta.50) Checking LSP Diagnostics",
10
+ "statusMessage": "(OmO 5.0.0-beta.51) Checking LSP Diagnostics",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\lsp\\dist\\cli.js\" hook post-tool-use"
12
12
  }
13
13
  ],
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/components/teammode/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 10,
11
- "statusMessage": "(OmO 5.0.0-beta.50) Checking Thread Title Hygiene",
11
+ "statusMessage": "(OmO 5.0.0-beta.51) Checking Thread Title Hygiene",
12
12
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\teammode\\dist\\cli.js\" hook post-tool-use"
13
13
  }
14
14
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook post-tool-use",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.50) Matching Project Rules",
10
+ "statusMessage": "(OmO 5.0.0-beta.51) Matching Project Rules",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\rules\\dist\\cli.js\" hook post-tool-use"
12
12
  }
13
13
  ],
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook post-tool-use-spawn",
10
10
  "timeout": 5,
11
- "statusMessage": "(OmO 5.0.0-beta.50) Recording Spawn Admission",
11
+ "statusMessage": "(OmO 5.0.0-beta.51) Recording Spawn Admission",
12
12
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook post-tool-use-spawn"
13
13
  }
14
14
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook pre-tool-use",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.50) Enforcing Unlimited Goal Budget",
10
+ "statusMessage": "(OmO 5.0.0-beta.51) Enforcing Unlimited Goal Budget",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook pre-tool-use"
12
12
  }
13
13
  ],
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook pre-tool-use-spawn",
10
10
  "timeout": 5,
11
- "statusMessage": "(OmO 5.0.0-beta.50) Guarding Ulw-Loop Spawns",
11
+ "statusMessage": "(OmO 5.0.0-beta.51) Guarding Ulw-Loop Spawns",
12
12
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook pre-tool-use-spawn"
13
13
  }
14
14
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/git-bash/dist/cli.js\" hook pre-tool-use",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.50) Recommending Git Bash MCP",
10
+ "statusMessage": "(OmO 5.0.0-beta.51) Recommending Git Bash MCP",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\git-bash\\dist\\cli.js\" hook pre-tool-use"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/scripts/auto-update.mjs\" hook session-start",
9
9
  "timeout": 15,
10
- "statusMessage": "(OmO 5.0.0-beta.50) Checking Auto Update",
10
+ "statusMessage": "(OmO 5.0.0-beta.51) Checking Auto Update",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\scripts\\auto-update.mjs\" hook session-start"
12
12
  }
13
13
  ],
@@ -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.0.0-beta.50) Checking Bootstrap Provisioning"
11
+ "statusMessage": "(OmO 5.0.0-beta.51) Checking Bootstrap Provisioning"
12
12
  }
13
13
  ]
14
14
  }
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook session-start",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.50) Loading Project Rules",
10
+ "statusMessage": "(OmO 5.0.0-beta.51) Loading Project Rules",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\rules\\dist\\cli.js\" hook session-start"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/telemetry/dist/cli.js\" hook session-start",
9
9
  "timeout": 15,
10
- "statusMessage": "(OmO 5.0.0-beta.50) Recording Session Telemetry",
10
+ "statusMessage": "(OmO 5.0.0-beta.51) Recording Session Telemetry",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\telemetry\\dist\\cli.js\" hook session-start"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-execute-continuation/dist/cli.js\" hook stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.50) Checking Ulw-Execute Continuation",
10
+ "statusMessage": "(OmO 5.0.0-beta.51) Checking Ulw-Execute Continuation",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-execute-continuation\\dist\\cli.js\" hook stop"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.50) Checking Ulw-Loop Resume",
10
+ "statusMessage": "(OmO 5.0.0-beta.51) Checking Ulw-Loop Resume",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook stop"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/lazycodex-executor-verify/dist/cli.js\" hook subagent-stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.50) Verifying LazyCodex Executor Evidence",
10
+ "statusMessage": "(OmO 5.0.0-beta.51) Verifying LazyCodex Executor Evidence",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\lazycodex-executor-verify\\dist\\cli.js\" hook subagent-stop"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ultrawork/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.50) Checking Ultrawork Trigger",
10
+ "statusMessage": "(OmO 5.0.0-beta.51) Checking Ultrawork Trigger",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ultrawork\\dist\\cli.js\" hook user-prompt-submit"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.50) Checking Ulw-Loop Steering",
10
+ "statusMessage": "(OmO 5.0.0-beta.51) Checking Ulw-Loop Steering",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook user-prompt-submit"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.50) Loading Project Rules",
10
+ "statusMessage": "(OmO 5.0.0-beta.51) Loading Project Rules",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\rules\\dist\\cli.js\" hook user-prompt-submit"
12
12
  }
13
13
  ]
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/omo-codex-plugin",
3
- "version": "5.0.0-beta.50",
3
+ "version": "5.0.0-beta.51",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@sisyphuslabs/omo-codex-plugin",
9
- "version": "5.0.0-beta.50",
9
+ "version": "5.0.0-beta.51",
10
10
  "workspaces": [
11
11
  "components/comment-checker",
12
12
  "components/git-bash",
@@ -90,7 +90,7 @@
90
90
  },
91
91
  "components/comment-checker": {
92
92
  "name": "@code-yeongyu/codex-comment-checker",
93
- "version": "5.0.0-beta.50",
93
+ "version": "5.0.0-beta.51",
94
94
  "license": "MIT",
95
95
  "bin": {
96
96
  "omo-comment-checker": "dist/cli.js"
@@ -111,7 +111,7 @@
111
111
  },
112
112
  "components/git-bash": {
113
113
  "name": "@sisyphuslabs/codex-git-bash-hook",
114
- "version": "5.0.0-beta.50",
114
+ "version": "5.0.0-beta.51",
115
115
  "bin": {
116
116
  "omo-git-bash-hook": "dist/cli.js"
117
117
  },
@@ -125,7 +125,7 @@
125
125
  },
126
126
  "components/lazycodex-executor-verify": {
127
127
  "name": "@code-yeongyu/codex-lazycodex-executor-verify",
128
- "version": "5.0.0-beta.50",
128
+ "version": "5.0.0-beta.51",
129
129
  "license": "MIT",
130
130
  "bin": {
131
131
  "lazycodex-executor-verify": "dist/cli.js"
@@ -142,7 +142,7 @@
142
142
  },
143
143
  "components/lsp": {
144
144
  "name": "@code-yeongyu/codex-lsp",
145
- "version": "5.0.0-beta.50",
145
+ "version": "5.0.0-beta.51",
146
146
  "license": "MIT",
147
147
  "dependencies": {
148
148
  "@code-yeongyu/lsp-daemon": "file:../../../../lsp-daemon",
@@ -163,7 +163,7 @@
163
163
  },
164
164
  "components/rules": {
165
165
  "name": "@code-yeongyu/codex-rules",
166
- "version": "5.0.0-beta.50",
166
+ "version": "5.0.0-beta.51",
167
167
  "license": "MIT",
168
168
  "dependencies": {
169
169
  "picomatch": "^4.0.7"
@@ -185,7 +185,7 @@
185
185
  },
186
186
  "components/teammode": {
187
187
  "name": "@sisyphuslabs/codex-teammode",
188
- "version": "5.0.0-beta.50",
188
+ "version": "5.0.0-beta.51",
189
189
  "devDependencies": {
190
190
  "@types/node": "^26.2.0",
191
191
  "bun-types": "^1.4.2",
@@ -198,7 +198,7 @@
198
198
  },
199
199
  "components/telemetry": {
200
200
  "name": "@code-yeongyu/codex-telemetry",
201
- "version": "5.0.0-beta.50",
201
+ "version": "5.0.0-beta.51",
202
202
  "license": "MIT",
203
203
  "bin": {
204
204
  "omo-telemetry": "dist/cli.js"
@@ -216,7 +216,7 @@
216
216
  },
217
217
  "components/ultrawork": {
218
218
  "name": "@code-yeongyu/codex-ultrawork",
219
- "version": "5.0.0-beta.50",
219
+ "version": "5.0.0-beta.51",
220
220
  "license": "MIT",
221
221
  "bin": {
222
222
  "omo-ultrawork": "dist/cli.js"
@@ -234,7 +234,7 @@
234
234
  },
235
235
  "components/ulw-execute-continuation": {
236
236
  "name": "@code-yeongyu/codex-ulw-execute-continuation",
237
- "version": "5.0.0-beta.50",
237
+ "version": "5.0.0-beta.51",
238
238
  "license": "MIT",
239
239
  "bin": {
240
240
  "omo-ulw-execute-continuation": "dist/cli.js"
@@ -251,7 +251,7 @@
251
251
  },
252
252
  "components/ulw-loop": {
253
253
  "name": "@code-yeongyu/codex-ulw-loop",
254
- "version": "5.0.0-beta.50",
254
+ "version": "5.0.0-beta.51",
255
255
  "license": "MIT",
256
256
  "bin": {
257
257
  "omo-ulw-loop": "dist/cli.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/omo-codex-plugin",
3
- "version": "5.0.0-beta.50",
3
+ "version": "5.0.0-beta.51",
4
4
  "description": "Aggregate Codex plugin root for OMO components.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -21,6 +21,7 @@ export function ensureSubagentConcurrencyLimit(config, options = {}) {
21
21
  const version = options.multiAgentVersion !== undefined
22
22
  ? options.multiAgentVersion
23
23
  : resolveMultiAgentVersionFromConfig(config, options);
24
+ // Keep this V2-active rule aligned with src/install/codex-multi-agent-v2-config.ts.
24
25
  const v2Section = findSection(config, CODEX_MULTI_AGENT_V2_HEADER);
25
26
  const v2Preferred = prefersMultiAgentV2(version, options.sessionModel)
26
27
  || (v2Section !== null && /^\s*enabled\s*=\s*true[ \t]*(?:#[^\n]*)?$/m.test(v2Section.text));
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- // omo-codex-install:dd6a563800e30ce8e45f73e631a566e5e525285c2e2049577b5f004bf9d9710a:26ef1567ba9e38d0d52846b6fe707522f7d02c45e69ba503717e1a6aa88c3ce4
2
+ // omo-codex-install:bc3bb113ea819d8b72c7576db558adb445ad7b64a2dbd605369dbfedf2f94008:29f8fd6ebb3f8a85bed1f4ec5303e033a521dbe3d7bc554ba8d2087959545c09
3
3
  var __esm = (fn, res, err) => () => {
4
4
  if (fn)
5
5
  try {
@@ -7706,7 +7706,7 @@ var package_default;
7706
7706
  var init_package = __esm(() => {
7707
7707
  package_default = {
7708
7708
  name: "@oh-my-opencode/omo-codex",
7709
- version: "5.0.0-beta.50",
7709
+ version: "5.0.0-beta.51",
7710
7710
  type: "module",
7711
7711
  private: true,
7712
7712
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -10681,7 +10681,7 @@ var CODEX_AGENTS_HEADER = "agents";
10681
10681
  var CODEX_MULTI_AGENT_V2_HEADER = "features.multi_agent_v2";
10682
10682
  function ensureCodexMultiAgentV2Config(config, options = {}) {
10683
10683
  const featureFlag = removeFeatureFlagSetting(config, "multi_agent_v2");
10684
- const v2Preferred = options.multiAgentVersion === "v2";
10684
+ const v2Preferred = options.multiAgentVersion === "v2" || isMultiAgentV2Enabled(featureFlag.config);
10685
10685
  const agentsConfig = removeAgentsMaxThreads(featureFlag.config, v2Preferred);
10686
10686
  const preserveDisable = featureFlag.value === false && !v2Preferred;
10687
10687
  const featureConfig = preserveDisable ? setMultiAgentV2Disable(agentsConfig) : v2Preferred ? removeMultiAgentV2Disable(agentsConfig) : agentsConfig;
@@ -10760,6 +10760,10 @@ function removeFeatureFlagSetting(config, featureName) {
10760
10760
  value: readBooleanSetting(section.text, featureName)
10761
10761
  };
10762
10762
  }
10763
+ function isMultiAgentV2Enabled(config) {
10764
+ const section = findTomlSection(config, CODEX_MULTI_AGENT_V2_HEADER);
10765
+ return section !== null && /^\s*enabled\s*=\s*true[ \t]*(?:#.*)?$/m.test(section.text);
10766
+ }
10763
10767
  function removeAgentsMaxThreads(config, v2Preferred) {
10764
10768
  const section = findTomlSection(config, CODEX_AGENTS_HEADER);
10765
10769
  if (!section)
@@ -11893,7 +11897,7 @@ function lastValue(values) {
11893
11897
  return values.length > 0 ? values[values.length - 1] ?? null : null;
11894
11898
  }
11895
11899
  function repairProjectLocalCodexConfigText(config) {
11896
- if (!isMultiAgentV2Enabled(config))
11900
+ if (!isMultiAgentV2Enabled2(config))
11897
11901
  return { config, changed: false, removedKeys: [] };
11898
11902
  let nextConfig = config;
11899
11903
  const removedKeys = [];
@@ -11983,7 +11987,7 @@ async function collectProjectLocalArtifacts(projectRoots) {
11983
11987
  }
11984
11988
  return artifacts;
11985
11989
  }
11986
- function isMultiAgentV2Enabled(config) {
11990
+ function isMultiAgentV2Enabled2(config) {
11987
11991
  const featuresSection = findTomlSection(config, "features");
11988
11992
  if (featuresSection !== null && settingIsBooleanTrue(featuresSection.text, "multi_agent_v2"))
11989
11993
  return true;