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

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 (108) hide show
  1. package/dist/cli/index.js +4682 -14969
  2. package/dist/cli-node/index.js +4727 -15014
  3. package/package.json +1 -1
  4. package/packages/lsp-daemon/dist/cli.js +181 -181
  5. package/packages/lsp-daemon/dist/client.js +232 -232
  6. package/packages/lsp-daemon/dist/index.js +132 -132
  7. package/packages/lsp-tools-mcp/dist/cli.js +103 -101
  8. package/packages/lsp-tools-mcp/dist/lsp/manager.js +14 -14
  9. package/packages/lsp-tools-mcp/dist/mcp.js +129 -129
  10. package/packages/lsp-tools-mcp/dist/tools.js +47 -47
  11. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  12. package/packages/omo-codex/plugin/README.md +4 -0
  13. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +151 -102
  14. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  15. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  16. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  17. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  18. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  19. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  20. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/AGENTS.md +2 -2
  21. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/directive.md +2 -0
  22. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/cli.js +35 -24
  23. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/codex-hook.js +31 -21
  24. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/types.d.ts +3 -0
  25. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  26. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  27. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/codex-hook.ts +31 -23
  28. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/types.ts +3 -0
  29. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/cli.test.ts +1 -1
  30. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +133 -7
  31. package/packages/omo-codex/plugin/components/lcx/skills/lcx-doctor/SKILL.md +3 -1
  32. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
  33. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +298 -298
  34. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  35. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  36. package/packages/omo-codex/plugin/components/rules/README.md +2 -0
  37. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-6.md +123 -0
  38. package/packages/omo-codex/plugin/components/rules/dist/cli.js +38 -30
  39. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  40. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  41. package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +6 -0
  42. package/packages/omo-codex/plugin/components/rules/test/hephaestus-model-variant.test.ts +38 -2
  43. package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +24 -0
  44. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  45. package/packages/omo-codex/plugin/components/teammode/package.json +2 -2
  46. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +66 -357
  47. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +66 -358
  48. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  49. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  50. package/packages/omo-codex/plugin/components/ultrawork/README.md +2 -0
  51. package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +1 -1
  52. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-clone-fidelity-reviewer.toml +1 -1
  53. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-code-reviewer.toml +1 -1
  54. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-gate-reviewer.toml +1 -1
  55. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-qa-executor.toml +1 -1
  56. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-high.toml +1 -1
  57. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-low.toml +1 -1
  58. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-medium.toml +1 -1
  59. package/packages/omo-codex/plugin/components/ultrawork/agents/librarian.toml +1 -1
  60. package/packages/omo-codex/plugin/components/ultrawork/agents/metis.toml +1 -1
  61. package/packages/omo-codex/plugin/components/ultrawork/agents/momus.toml +1 -1
  62. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +1 -1
  63. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  64. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  65. package/packages/omo-codex/plugin/components/ulw-execute-continuation/dist/cli.js +3 -3
  66. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  67. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  68. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +63 -63
  69. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  70. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  71. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  72. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  73. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  74. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  75. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  76. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  77. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  78. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  79. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  80. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  81. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  82. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  83. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  84. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  85. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  86. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  87. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  88. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  89. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  90. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  91. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  92. package/packages/omo-codex/plugin/model-catalog.json +16 -7
  93. package/packages/omo-codex/plugin/package-lock.json +16 -16
  94. package/packages/omo-codex/plugin/package.json +1 -1
  95. package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +16 -7
  96. package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +8 -4
  97. package/packages/omo-codex/plugin/scripts/migrate-codex-config/subagent-limit-guard.mjs +18 -90
  98. package/packages/omo-codex/plugin/scripts/migrate-codex-config/toml-section-editor.mjs +1 -1
  99. package/packages/omo-codex/plugin/shared/package.json +1 -1
  100. package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +3 -1
  101. package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +12 -12
  102. package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +14 -4
  103. package/packages/omo-codex/plugin/test/auto-update.test.mjs +4 -4
  104. package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +25 -1
  105. package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +35 -35
  106. package/packages/omo-codex/plugin/test/multi-agent-v2-regression.test.mjs +1 -1
  107. package/packages/omo-codex/plugin/test/subagent-limit-migration.test.mjs +107 -15
  108. package/packages/omo-codex/scripts/install-dist/install-local.mjs +318 -569
@@ -710,7 +710,7 @@ function extractStandaloneSgBinary(zip, platform) {
710
710
  const entries = listZipEntries(zip);
711
711
  const preferredNames = [`ast-grep${suffix}`, `sg${suffix}`];
712
712
  for (const preferred of preferredNames) {
713
- const entry = entries.find((candidate2) => zipEntryBaseName(candidate2.name) === preferred);
713
+ const entry = entries.find((candidate) => zipEntryBaseName(candidate.name) === preferred);
714
714
  if (entry !== undefined)
715
715
  return readZipEntryBytes(zip, entry);
716
716
  }
@@ -829,7 +829,7 @@ function cacheFingerprint(options, plan) {
829
829
  return JSON.stringify([
830
830
  options.platform ?? process.platform,
831
831
  options.arch ?? process.arch,
832
- plan.beforePath.map((candidate2) => candidate2.path)
832
+ plan.beforePath.map((candidate) => candidate.path)
833
833
  ]);
834
834
  }
835
835
  function defaultFileExists(filePath) {
@@ -860,9 +860,9 @@ function acceptsCandidate(binaryPath, deps) {
860
860
  return deps.fileExists(binaryPath) && probePasses(binaryPath, deps);
861
861
  }
862
862
  function firstAccepted(candidates, deps) {
863
- for (const candidate2 of candidates) {
864
- if (acceptsCandidate(candidate2.path, deps))
865
- return { found: true, path: candidate2.path, tier: candidate2.tier };
863
+ for (const candidate of candidates) {
864
+ if (acceptsCandidate(candidate.path, deps))
865
+ return { found: true, path: candidate.path, tier: candidate.tier };
866
866
  }
867
867
  return null;
868
868
  }
@@ -1067,9 +1067,9 @@ function replaceOrInsertSetting(config, section, key, value) {
1067
1067
  offset += line.length;
1068
1068
  continue;
1069
1069
  }
1070
- const replacement2 = replaceTomlAssignmentValue(line, assignmentIndex, value);
1070
+ const replacement = replaceTomlAssignmentValue(line, assignmentIndex, value);
1071
1071
  const assignmentEnd = multilineScan.nextQuote ? findTomlMultilineValueEnd(section.text, offset + line.length, multilineScan.nextQuote) : offset + line.length;
1072
- const sectionReplacement = section.text.slice(0, offset) + replacement2 + section.text.slice(assignmentEnd);
1072
+ const sectionReplacement = section.text.slice(0, offset) + replacement + section.text.slice(assignmentEnd);
1073
1073
  return config.slice(0, section.start) + sectionReplacement + config.slice(section.end);
1074
1074
  }
1075
1075
  const replacement = insertSetting(section.text, key, value);
@@ -1131,9 +1131,9 @@ function replaceOrInsertRootDottedSetting(config, keyPath, value) {
1131
1131
  offset += line.length;
1132
1132
  continue;
1133
1133
  }
1134
- const replacement2 = replaceTomlAssignmentValue(line, assignmentIndex, value);
1134
+ const replacement = replaceTomlAssignmentValue(line, assignmentIndex, value);
1135
1135
  const assignmentEnd = multilineScan.nextQuote ? findTomlMultilineValueEnd(config, offset + line.length, multilineScan.nextQuote) : offset + line.length;
1136
- return config.slice(0, offset) + replacement2 + config.slice(assignmentEnd);
1136
+ return config.slice(0, offset) + replacement + config.slice(assignmentEnd);
1137
1137
  }
1138
1138
  const sectionStart = findFirstTableStart(config);
1139
1139
  const root = config.slice(0, sectionStart).trimEnd();
@@ -1233,10 +1233,10 @@ function scanTomlMultilineLine(line, currentQuote) {
1233
1233
  }
1234
1234
  if (char === "#")
1235
1235
  break;
1236
- const delimiter2 = line.startsWith('"""', index) ? '"""' : line.startsWith("'''", index) ? "'''" : null;
1237
- if (delimiter2) {
1238
- const closingIndex = findTomlMultilineDelimiter(line, delimiter2, index + delimiter2.length);
1239
- return { wasInside: false, nextQuote: closingIndex === -1 ? delimiter2 : null };
1236
+ const delimiter = line.startsWith('"""', index) ? '"""' : line.startsWith("'''", index) ? "'''" : null;
1237
+ if (delimiter) {
1238
+ const closingIndex = findTomlMultilineDelimiter(line, delimiter, index + delimiter.length);
1239
+ return { wasInside: false, nextQuote: closingIndex === -1 ? delimiter : null };
1240
1240
  }
1241
1241
  if (char === '"' || char === "'")
1242
1242
  quote = char;
@@ -1244,12 +1244,12 @@ function scanTomlMultilineLine(line, currentQuote) {
1244
1244
  }
1245
1245
  return { wasInside: false, nextQuote: null };
1246
1246
  }
1247
- function findTomlMultilineDelimiter(line, delimiter2, startIndex) {
1248
- let index = line.indexOf(delimiter2, startIndex);
1247
+ function findTomlMultilineDelimiter(line, delimiter, startIndex) {
1248
+ let index = line.indexOf(delimiter, startIndex);
1249
1249
  while (index !== -1) {
1250
- if (delimiter2 === "'''" || countPrecedingBackslashes(line, index) % 2 === 0)
1250
+ if (delimiter === "'''" || countPrecedingBackslashes(line, index) % 2 === 0)
1251
1251
  return index;
1252
- index = line.indexOf(delimiter2, index + 1);
1252
+ index = line.indexOf(delimiter, index + 1);
1253
1253
  }
1254
1254
  return -1;
1255
1255
  }
@@ -1302,8 +1302,8 @@ function findUnquotedCharacter(line, target, startIndex) {
1302
1302
  }
1303
1303
  return -1;
1304
1304
  }
1305
- function tomlPathMatches(candidate2, target) {
1306
- return candidate2.length === target.length && candidate2.every((part, index) => part === target[index]);
1305
+ function tomlPathMatches(candidate, target) {
1306
+ return candidate.length === target.length && candidate.every((part, index) => part === target[index]);
1307
1307
  }
1308
1308
  function replaceTomlAssignmentValue(line, assignmentIndex, value) {
1309
1309
  const newline = line.endsWith(`
@@ -1567,6 +1567,10 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
1567
1567
  {
1568
1568
  previous: { model: "gpt-5.6-terra", effort: "medium" },
1569
1569
  current: { model: "gpt-5.6-luna", effort: "low" }
1570
+ },
1571
+ {
1572
+ previous: { model: "gpt-5.6-luna", effort: "low" },
1573
+ current: { model: "gpt-6-astra", effort: "low" }
1570
1574
  }
1571
1575
  ]
1572
1576
  ],
@@ -1580,6 +1584,28 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
1580
1584
  {
1581
1585
  previous: { model: "gpt-5.6-terra", effort: "medium" },
1582
1586
  current: { model: "gpt-5.6-luna", effort: "low" }
1587
+ },
1588
+ {
1589
+ previous: { model: "gpt-5.6-luna", effort: "low" },
1590
+ current: { model: "gpt-6-astra", effort: "low" }
1591
+ }
1592
+ ]
1593
+ ],
1594
+ [
1595
+ "metis",
1596
+ [
1597
+ {
1598
+ previous: { model: "gpt-5.6-sol", effort: "high" },
1599
+ current: { model: "gpt-6-astra", effort: "high" }
1600
+ }
1601
+ ]
1602
+ ],
1603
+ [
1604
+ "lazycodex-worker-low",
1605
+ [
1606
+ {
1607
+ previous: { model: "gpt-5.6-luna", effort: "high" },
1608
+ current: { model: "gpt-6-astra", effort: "high" }
1583
1609
  }
1584
1610
  ]
1585
1611
  ],
@@ -1593,6 +1619,10 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
1593
1619
  {
1594
1620
  previous: { model: "gpt-5.6-sol", effort: "ultra" },
1595
1621
  current: { model: "gpt-5.6-terra", effort: "high" }
1622
+ },
1623
+ {
1624
+ previous: { model: "gpt-5.6-terra", effort: "high" },
1625
+ current: { model: "gpt-6-astra", effort: "high" }
1596
1626
  }
1597
1627
  ]
1598
1628
  ],
@@ -1606,6 +1636,10 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
1606
1636
  {
1607
1637
  previous: { model: "gpt-5.6-sol", effort: "max" },
1608
1638
  current: { model: "gpt-5.6-sol", effort: "high" }
1639
+ },
1640
+ {
1641
+ previous: { model: "gpt-5.6-sol", effort: "high" },
1642
+ current: { model: "gpt-6-astra", effort: "high" }
1609
1643
  }
1610
1644
  ]
1611
1645
  ],
@@ -1619,6 +1653,10 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
1619
1653
  {
1620
1654
  previous: { model: "gpt-5.6-luna", effort: "max" },
1621
1655
  current: { model: "gpt-5.6-terra", effort: "high" }
1656
+ },
1657
+ {
1658
+ previous: { model: "gpt-5.6-terra", effort: "high" },
1659
+ current: { model: "gpt-6-astra", effort: "high" }
1622
1660
  }
1623
1661
  ]
1624
1662
  ],
@@ -1628,6 +1666,10 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
1628
1666
  {
1629
1667
  previous: { model: "gpt-5.6-sol", effort: "max" },
1630
1668
  current: { model: "gpt-5.6-sol", effort: "medium" }
1669
+ },
1670
+ {
1671
+ previous: { model: "gpt-5.6-sol", effort: "medium" },
1672
+ current: { model: "gpt-6-astra", effort: "medium" }
1631
1673
  }
1632
1674
  ]
1633
1675
  ],
@@ -1637,6 +1679,10 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
1637
1679
  {
1638
1680
  previous: { model: "gpt-5.6-sol", effort: "xhigh" },
1639
1681
  current: { model: "gpt-5.6-terra", effort: "medium" }
1682
+ },
1683
+ {
1684
+ previous: { model: "gpt-5.6-terra", effort: "medium" },
1685
+ current: { model: "gpt-6-astra", effort: "medium" }
1640
1686
  }
1641
1687
  ]
1642
1688
  ],
@@ -1646,6 +1692,10 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
1646
1692
  {
1647
1693
  previous: { model: "gpt-5.6-sol", effort: "xhigh" },
1648
1694
  current: { model: "gpt-5.6-terra", effort: "high" }
1695
+ },
1696
+ {
1697
+ previous: { model: "gpt-5.6-terra", effort: "high" },
1698
+ current: { model: "gpt-6-astra", effort: "high" }
1649
1699
  }
1650
1700
  ]
1651
1701
  ],
@@ -1655,6 +1705,10 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
1655
1705
  {
1656
1706
  previous: { model: "gpt-5.6-terra", effort: "medium" },
1657
1707
  current: { model: "gpt-5.6-luna", effort: "high" }
1708
+ },
1709
+ {
1710
+ previous: { model: "gpt-5.6-luna", effort: "high" },
1711
+ current: { model: "gpt-6-astra", effort: "high" }
1658
1712
  }
1659
1713
  ]
1660
1714
  ],
@@ -1668,6 +1722,10 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
1668
1722
  {
1669
1723
  previous: { model: "gpt-5.6-sol", effort: "high" },
1670
1724
  current: { model: "gpt-5.6-sol", effort: "low" }
1725
+ },
1726
+ {
1727
+ previous: { model: "gpt-5.6-sol", effort: "low" },
1728
+ current: { model: "gpt-6-astra", effort: "low" }
1671
1729
  }
1672
1730
  ]
1673
1731
  ]
@@ -1679,9 +1737,9 @@ function resolveManagedAgentReasoning(input) {
1679
1737
  const latest = steps[steps.length - 1];
1680
1738
  if (latest === undefined)
1681
1739
  return input.preserved.effort;
1682
- if (input.bundledModel !== latest.current.model || input.bundledEffort !== latest.current.effort) {
1740
+ const bundledMatchesCurrentEffort = input.bundledEffort === latest.current.effort && steps.some((step) => input.bundledModel === step.current.model && input.bundledEffort === step.current.effort);
1741
+ if (!bundledMatchesCurrentEffort)
1683
1742
  return input.preserved.effort;
1684
- }
1685
1743
  const preservedMatchesAnyStep = steps.some((step) => input.preserved.model === step.previous.model && input.preserved.effort === step.previous.effort);
1686
1744
  return preservedMatchesAnyStep ? latest.current.effort : input.preserved.effort;
1687
1745
  }
@@ -2177,16 +2235,16 @@ async function removeLegacyCodexComponentBins(binDir, platform) {
2177
2235
  }
2178
2236
  async function removeLegacyCodexComponentBin(linkPath, component, platform) {
2179
2237
  try {
2180
- const stat4 = await lstat6(linkPath);
2238
+ const stat = await lstat6(linkPath);
2181
2239
  if (platform !== "win32") {
2182
- if (!stat4.isSymbolicLink())
2240
+ if (!stat.isSymbolicLink())
2183
2241
  return;
2184
2242
  const target = await readlink2(linkPath);
2185
2243
  if (isManagedLegacyComponentTarget(target, component))
2186
2244
  await rm8(linkPath, { force: true });
2187
2245
  return;
2188
2246
  }
2189
- if (!stat4.isFile())
2247
+ if (!stat.isFile())
2190
2248
  return;
2191
2249
  const content = await readFile7(linkPath, "utf8");
2192
2250
  if (content.includes(COMMAND_SHIM_MARKER))
@@ -2349,10 +2407,10 @@ async function linkRootRuntimeBin(input) {
2349
2407
  const nodeCliPath = join14(input.repoRoot, "dist", "cli-node", "index.js");
2350
2408
  await mkdir5(input.binDir, { recursive: true });
2351
2409
  if (platform === "win32") {
2352
- const linkPath2 = join14(input.binDir, `${binName}.cmd`);
2353
- await replaceRuntimeWrapper(linkPath2, windowsRuntimeWrapper(binName, cliPath, input.codexHome, input.binDir, nodeCliPath));
2410
+ const linkPath = join14(input.binDir, `${binName}.cmd`);
2411
+ await replaceRuntimeWrapper(linkPath, windowsRuntimeWrapper(binName, cliPath, input.codexHome, input.binDir, nodeCliPath));
2354
2412
  await removeGeneratedRuntimeWrapper(legacyPath);
2355
- return { name: binName, path: linkPath2, target: cliPath };
2413
+ return { name: binName, path: linkPath, target: cliPath };
2356
2414
  }
2357
2415
  const linkPath = join14(input.binDir, binName);
2358
2416
  await replaceRuntimeWrapper(linkPath, posixRuntimeWrapper(binName, cliPath, input.codexHome, input.binDir, nodeCliPath));
@@ -2362,9 +2420,9 @@ async function linkRootRuntimeBin(input) {
2362
2420
  }
2363
2421
  async function linkCachedPluginBin(binDir, link, platform) {
2364
2422
  if (platform === "win32") {
2365
- const linkPath2 = join14(binDir, `${link.name}.cmd`);
2366
- await replaceCommandShim(linkPath2, link.target);
2367
- return linkPath2;
2423
+ const linkPath = join14(binDir, `${link.name}.cmd`);
2424
+ await replaceCommandShim(linkPath, link.target);
2425
+ return linkPath;
2368
2426
  }
2369
2427
  const linkPath = join14(binDir, link.name);
2370
2428
  await replaceSymlink(linkPath, link.target);
@@ -2486,10 +2544,10 @@ async function readGeneratedWrapperContent(path) {
2486
2544
  }
2487
2545
  async function existingNonRuntimeWrapper(path) {
2488
2546
  try {
2489
- const stat5 = await lstat7(path);
2490
- if (stat5.isSymbolicLink())
2547
+ const stat = await lstat7(path);
2548
+ if (stat.isSymbolicLink())
2491
2549
  return false;
2492
- if (!stat5.isFile())
2550
+ if (!stat.isFile())
2493
2551
  return true;
2494
2552
  const content = await readFile8(path, "utf8");
2495
2553
  return !content.includes(RUNTIME_WRAPPER_MARKER);
@@ -2501,8 +2559,8 @@ async function existingNonRuntimeWrapper(path) {
2501
2559
  }
2502
2560
  async function existingNonShim(path) {
2503
2561
  try {
2504
- const stat5 = await lstat7(path);
2505
- if (!stat5.isFile())
2562
+ const stat = await lstat7(path);
2563
+ if (!stat.isFile())
2506
2564
  return true;
2507
2565
  const content = await readFile8(path, "utf8");
2508
2566
  if (content.includes(COMMAND_SHIM_MARKER))
@@ -2516,8 +2574,8 @@ async function existingNonShim(path) {
2516
2574
  }
2517
2575
  async function existingNonSymlink(path) {
2518
2576
  try {
2519
- const stat5 = await lstat7(path);
2520
- if (!stat5.isSymbolicLink())
2577
+ const stat = await lstat7(path);
2578
+ if (!stat.isSymbolicLink())
2521
2579
  return true;
2522
2580
  await readlink3(path);
2523
2581
  return false;
@@ -2643,15 +2701,6 @@ function delay(milliseconds) {
2643
2701
  }
2644
2702
 
2645
2703
  // ../src/install/toml-setting-reader.ts
2646
- function hasTomlSetting(config, keyPath) {
2647
- const targetPath = parseTomlDottedKey(keyPath);
2648
- if (!targetPath)
2649
- return false;
2650
- return hasTomlAssignment(config, (tablePath, settingPath) => {
2651
- const fullPath = [...tablePath, ...settingPath];
2652
- return fullPath.length === targetPath.length && fullPath.every((part, index) => part === targetPath[index]);
2653
- });
2654
- }
2655
2704
  function hasTomlRootDottedKeyPrefix(config, rootKey) {
2656
2705
  return hasTomlAssignment(config, (tablePath, settingPath) => tablePath.length === 0 && settingPath.length > 1 && settingPath[0] === rootKey);
2657
2706
  }
@@ -3094,15 +3143,15 @@ import { readFile as readFile9 } from "node:fs/promises";
3094
3143
  import { join as join16 } from "node:path";
3095
3144
  var FALLBACK_CODEX_MODEL_CATALOG = {
3096
3145
  current: {
3097
- model: "gpt-5.6-sol",
3098
- modelContextWindow: 650000,
3146
+ model: "gpt-6-astra",
3147
+ modelContextWindow: 600000,
3099
3148
  modelReasoningEffort: "high",
3100
3149
  planModeReasoningEffort: "xhigh"
3101
3150
  },
3102
3151
  managedProfiles: [
3103
3152
  {
3104
3153
  model: "gpt-5.5",
3105
- modelContextWindow: 650000,
3154
+ modelContextWindow: 400000,
3106
3155
  modelReasoningEffort: "high",
3107
3156
  planModeReasoningEffort: "xhigh"
3108
3157
  },
@@ -3112,7 +3161,13 @@ var FALLBACK_CODEX_MODEL_CATALOG = {
3112
3161
  modelReasoningEffort: "high",
3113
3162
  planModeReasoningEffort: "xhigh"
3114
3163
  },
3115
- { model: "gpt-5.5", modelContextWindow: 272000 }
3164
+ { model: "gpt-5.5", modelContextWindow: 272000 },
3165
+ {
3166
+ model: "gpt-5.6-sol",
3167
+ modelContextWindow: 650000,
3168
+ modelReasoningEffort: "high",
3169
+ planModeReasoningEffort: "xhigh"
3170
+ }
3116
3171
  ]
3117
3172
  };
3118
3173
  async function readCodexModelCatalog(codexPackageRoot) {
@@ -3203,27 +3258,18 @@ import { readFileSync } from "node:fs";
3203
3258
  import { dirname as dirname7, isAbsolute as isAbsolute5, join as join17 } from "node:path";
3204
3259
  var CODEX_AGENTS_HEADER = "agents";
3205
3260
  var CODEX_MULTI_AGENT_V2_HEADER = "features.multi_agent_v2";
3206
- var CODEX_MULTI_AGENT_V2_THREAD_LIMIT_KEY = `${CODEX_MULTI_AGENT_V2_HEADER}.max_concurrent_threads_per_session`;
3207
- var CODEX_SUBAGENT_THREAD_LIMIT = 1000;
3208
- var CODEX_MULTI_AGENT_V2_THREAD_LIMIT = 16;
3209
3261
  function ensureCodexMultiAgentV2Config(config, options = {}) {
3210
3262
  const featureFlag = removeFeatureFlagSetting(config, "multi_agent_v2");
3211
3263
  const v2Preferred = options.multiAgentVersion === "v2";
3212
- const modelKnown = options.multiAgentVersion != null || readRootModel(featureFlag.config) !== null;
3213
- const agentsConfig = v2Preferred ? removeAgentsMaxThreads(featureFlag.config) : modelKnown ? ensureAgentsMaxThreads(featureFlag.config) : raiseExistingAgentsMaxThreads(featureFlag.config);
3264
+ const agentsConfig = removeAgentsMaxThreads(featureFlag.config, v2Preferred);
3214
3265
  const preserveDisable = featureFlag.value === false && !v2Preferred;
3215
3266
  const featureConfig = preserveDisable ? setMultiAgentV2Disable(agentsConfig) : v2Preferred ? removeMultiAgentV2Disable(agentsConfig) : agentsConfig;
3216
- if (hasTomlSetting(featureConfig, CODEX_MULTI_AGENT_V2_THREAD_LIMIT_KEY))
3217
- return featureConfig;
3218
- const section = findTomlSection(featureConfig, CODEX_MULTI_AGENT_V2_HEADER);
3219
- if (!section) {
3220
- const enabledSetting = preserveDisable ? `enabled = false
3221
- ` : "";
3222
- return appendBlock(featureConfig, `[${CODEX_MULTI_AGENT_V2_HEADER}]
3223
- ${enabledSetting}max_concurrent_threads_per_session = ${CODEX_MULTI_AGENT_V2_THREAD_LIMIT}
3224
- `);
3267
+ const withoutManagedLimit = removeManagedMultiAgentV2ThreadLimit(featureConfig);
3268
+ if (preserveDisable && !findTomlSection(withoutManagedLimit, CODEX_MULTI_AGENT_V2_HEADER)) {
3269
+ return appendBlock(withoutManagedLimit, `[${CODEX_MULTI_AGENT_V2_HEADER}]
3270
+ enabled = false`);
3225
3271
  }
3226
- return replaceOrInsertSetting(featureConfig, section, "max_concurrent_threads_per_session", CODEX_MULTI_AGENT_V2_THREAD_LIMIT.toString());
3272
+ return withoutManagedLimit;
3227
3273
  }
3228
3274
  function resolveCodexMultiAgentVersion(config, configPath) {
3229
3275
  const model = readRootModel(config);
@@ -3233,7 +3279,7 @@ function resolveCodexMultiAgentVersion(config, configPath) {
3233
3279
  const catalogVersion = readCatalogMultiAgentVersion(model, catalogPath);
3234
3280
  if (catalogVersion !== null)
3235
3281
  return catalogVersion;
3236
- return /^gpt-5\.6\b/i.test(model) ? "v2" : null;
3282
+ return /^(?:gpt-5\.6|gpt-6)\b/i.test(model) ? "v2" : null;
3237
3283
  }
3238
3284
  function resolveCatalogPath(configuredPath, configPath) {
3239
3285
  if (configuredPath === null)
@@ -3293,23 +3339,34 @@ function removeFeatureFlagSetting(config, featureName) {
3293
3339
  value: readBooleanSetting(section.text, featureName)
3294
3340
  };
3295
3341
  }
3296
- function ensureAgentsMaxThreads(config) {
3297
- const maxThreadsValue = CODEX_SUBAGENT_THREAD_LIMIT.toString();
3298
- const section = findTomlSection(config, CODEX_AGENTS_HEADER);
3299
- if (!section) {
3300
- return appendBlock(config, `[${CODEX_AGENTS_HEADER}]
3301
- max_threads = ${maxThreadsValue}
3302
- `);
3303
- }
3304
- return replaceOrInsertSetting(config, section, "max_threads", maxThreadsValue);
3305
- }
3306
- function removeAgentsMaxThreads(config) {
3342
+ function removeAgentsMaxThreads(config, v2Preferred) {
3307
3343
  const section = findTomlSection(config, CODEX_AGENTS_HEADER);
3308
3344
  if (!section)
3309
3345
  return config;
3310
- if (!/^\s*max_threads\s*=/m.test(section.text))
3346
+ return removeMatchingCap(config, section, "max_threads", v2Preferred ? undefined : /^1000\s*(?:#.*)?$/);
3347
+ }
3348
+ function removeManagedMultiAgentV2ThreadLimit(config) {
3349
+ const section = findTomlSection(config, CODEX_MULTI_AGENT_V2_HEADER);
3350
+ if (!section)
3311
3351
  return config;
3312
- return removeSetting(config, section, "max_threads");
3352
+ return removeMatchingCap(config, section, "max_concurrent_threads_per_session", /^(?:1000|16)\s*(?:#.*)?$/);
3353
+ }
3354
+ function removeMatchingCap(config, section, keyName, expectedValue) {
3355
+ let quote = null;
3356
+ let offset = section.start;
3357
+ for (const line of section.text.match(/[^\n]*\n?/g) ?? []) {
3358
+ const scan = scanTomlMultilineLine(line, quote);
3359
+ quote = scan.nextQuote;
3360
+ if (!scan.wasInside) {
3361
+ const assignment = line.indexOf("=");
3362
+ const key = assignment < 0 ? null : parseTomlDottedKey(line.slice(0, assignment).trim());
3363
+ if (key?.length === 1 && key[0] === keyName && (expectedValue === undefined || expectedValue.test(line.slice(assignment + 1).trim()))) {
3364
+ return config.slice(0, offset) + config.slice(offset + line.length);
3365
+ }
3366
+ }
3367
+ offset += line.length;
3368
+ }
3369
+ return config;
3313
3370
  }
3314
3371
  function removeMultiAgentV2Disable(config) {
3315
3372
  const section = findTomlSection(config, CODEX_MULTI_AGENT_V2_HEADER);
@@ -3325,14 +3382,6 @@ function setMultiAgentV2Disable(config) {
3325
3382
  return config;
3326
3383
  return replaceOrInsertSetting(config, section, "enabled", "false");
3327
3384
  }
3328
- function raiseExistingAgentsMaxThreads(config) {
3329
- const section = findTomlSection(config, CODEX_AGENTS_HEADER);
3330
- if (!section)
3331
- return config;
3332
- if (!/^\s*max_threads\s*=/m.test(section.text))
3333
- return config;
3334
- return replaceOrInsertSetting(config, section, "max_threads", CODEX_SUBAGENT_THREAD_LIMIT.toString());
3335
- }
3336
3385
  function readBooleanSetting(sectionText, key) {
3337
3386
  const match = new RegExp(`^\\s*${escapeRegExp(key)}\\s*=\\s*(true|false)\\s*(?:#.*)?$`, "m").exec(sectionText);
3338
3387
  if (!match)
@@ -3575,23 +3624,23 @@ function resolveGitBash(input) {
3575
3624
  }
3576
3625
  return missingGitBash(checkedPaths);
3577
3626
  }
3578
- for (const candidate2 of [
3627
+ for (const candidate of [
3579
3628
  { path: PROGRAM_FILES_GIT_BASH, source: "program-files" },
3580
3629
  { path: PROGRAM_FILES_X86_GIT_BASH, source: "program-files-x86" }
3581
3630
  ]) {
3582
- checkedPaths.push(candidate2.path);
3583
- if (input.exists(candidate2.path))
3584
- return { found: true, path: candidate2.path, source: candidate2.source, checkedPaths };
3631
+ checkedPaths.push(candidate.path);
3632
+ if (input.exists(candidate.path))
3633
+ return { found: true, path: candidate.path, source: candidate.source, checkedPaths };
3585
3634
  }
3586
3635
  for (const pathCandidate of input.where("bash")) {
3587
- const candidate2 = pathCandidate.trim();
3588
- if (candidate2.length === 0)
3636
+ const candidate = pathCandidate.trim();
3637
+ if (candidate.length === 0)
3589
3638
  continue;
3590
- checkedPaths.push(candidate2);
3591
- if (isKnownNonGitBashLauncher(candidate2))
3639
+ checkedPaths.push(candidate);
3640
+ if (isKnownNonGitBashLauncher(candidate))
3592
3641
  continue;
3593
- if (isBashExePath(candidate2) && input.exists(candidate2))
3594
- return { found: true, path: candidate2, source: "path", checkedPaths };
3642
+ if (isBashExePath(candidate) && input.exists(candidate))
3643
+ return { found: true, path: candidate, source: "path", checkedPaths };
3595
3644
  }
3596
3645
  return missingGitBash(checkedPaths);
3597
3646
  }
@@ -3644,8 +3693,8 @@ var resolveGitBashForCurrentProcess2 = (input = {}) => {
3644
3693
  return toCodexResolution(resolveGitBashForCurrentProcess(input));
3645
3694
  };
3646
3695
  async function prepareGitBashForInstall(input) {
3647
- const resolve7 = input.resolveGitBash ?? (() => resolveGitBashForCurrentProcess2({ platform: input.platform, env: input.env }));
3648
- const initialResolution = resolve7();
3696
+ const resolve = input.resolveGitBash ?? (() => resolveGitBashForCurrentProcess2({ platform: input.platform, env: input.env }));
3697
+ const initialResolution = resolve();
3649
3698
  return initialResolution;
3650
3699
  }
3651
3700
  function toCodexResolution(resolution) {
@@ -4047,10 +4096,10 @@ function parseDegradedEntries(raw) {
4047
4096
  if (!Array.isArray(raw))
4048
4097
  return;
4049
4098
  const entries = [];
4050
- for (const candidate2 of raw) {
4051
- if (typeof candidate2 !== "object" || candidate2 === null)
4099
+ for (const candidate of raw) {
4100
+ if (typeof candidate !== "object" || candidate === null)
4052
4101
  continue;
4053
- const record = candidate2;
4102
+ const record = candidate;
4054
4103
  if (typeof record["component"] !== "string" || typeof record["reason"] !== "string")
4055
4104
  continue;
4056
4105
  entries.push({
@@ -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.49) Checking Bootstrap Provisioning"
11
+ "statusMessage": "(OmO 5.0.0-beta.50) 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.49",
3
+ "version": "5.0.0-beta.50",
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.49) Checking Comments"
11
+ "statusMessage": "(OmO 5.0.0-beta.50) 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.49",
3
+ "version": "5.0.0-beta.50",
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.49) Recommending Git Bash MCP"
11
+ "statusMessage": "(OmO 5.0.0-beta.50) 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.49) Resetting Git Bash MCP Reminder"
23
+ "statusMessage": "(OmO 5.0.0-beta.50) 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.49",
3
+ "version": "5.0.0-beta.50",
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,
@@ -6,7 +6,7 @@
6
6
 
7
7
  Codex `SubagentStop` hook component: the evidence gate for the ultrawork implementation workers (`lazycodex-worker-low|medium|high`). When a worker stops without a valid evidence receipt, the hook emits `{"decision": "block", "reason": <directive>}` and Codex sends it back to work. Matcher is `^lazycodex-worker-(low|medium|high)$`; read-only roles like `lazycodex-qa-executor` and `lazycodex-gate-reviewer` (same `ultrawork/agents/` family) are NOT gated by this hook. (The historical `lazycodex-executor` agent was removed; this component keeps its name.)
8
8
 
9
- Valid receipt: `last_assistant_message` contains `EVIDENCE_RECORDED: <path>` where `<path>` resolves to a non-empty regular file strictly inside `<cwd>/.omo/evidence/`. Symlinks and directories rejected; containment checked on realpaths (file inside evidence root inside cwd, traversal-safe). A valid receipt clears attempt state and exits silently.
9
+ Valid receipt: `last_assistant_message` contains `EVIDENCE_RECORDED: <path>` where `<path>` resolves to a regular file strictly inside `<cwd>/.omo/evidence/` with at least 40 characters after trimming whitespace. When `transcript_path` can be stat'ed, the receipt's `mtimeMs` must be at least the transcript's `birthtimeMs` (fallback: `ctimeMs`); an unstatable transcript skips freshness validation. Short or stale receipts are blocked with `placeholder` or `stale` in the reason. Symlinks and directories rejected; containment checked on realpaths (file inside evidence root inside cwd, traversal-safe). A valid receipt clears attempt state and exits silently.
10
10
 
11
11
  Escape hatches: after 3 blocked attempts (`MAX_ATTEMPTS`) the stop passes and state clears; a transcript containing a context-pressure marker ("context compacted", "context_length_exceeded", ...) passes immediately. Malformed stdin, unknown events, unrelated agents: silent exit 0 (fail-open).
12
12
 
@@ -28,7 +28,7 @@ Escape hatches: after 3 blocked attempts (`MAX_ATTEMPTS`) the stop passes and st
28
28
  | Task | Location |
29
29
  |------|----------|
30
30
  | Change the block message | `directive.md`; keep both `{{...}}` placeholders and the literal `EVIDENCE_RECORDED: <path>` final-line contract |
31
- | Change receipt validation | `src/codex-hook.ts` (`hasValidEvidenceReceipt`, `extractEvidencePath`, `isNonEmptyFileInsideEvidenceRoot`) |
31
+ | Change receipt validation | `src/codex-hook.ts` (`getEvidenceReceiptFailure`, `extractEvidencePath`, `getEvidenceFileFailure`) |
32
32
  | Change the retry budget | `src/state.ts` `MAX_ATTEMPTS` |
33
33
  | Worker-side contract | `../ultrawork/agents/lazycodex-worker-{low,medium,high}.toml` instruct the final `EVIDENCE_RECORDED: <path>` line this hook parses |
34
34
  | Plugin-level wiring | `../../hooks/subagent-stop-verifying-lazycodex-executor-evidence.json` (adds `commandWindows` via `../bootstrap/scripts/node-dispatch.ps1`) |
@@ -4,6 +4,8 @@
4
4
 
5
5
  직접 검증하라. 관련 명령을 실제로 실행하고, 출력과 판단 근거를 `.omo/evidence/` 아래 파일로 기록하라. 실패한 항목이 있으면 완료했다고 말하지 말고 고쳐라. `stop_hook_active` 상태여도 이 검증은 생략되지 않는다. 반복은 제한되어 있지만, 증거 없는 완료 주장은 막힌다.
6
6
 
7
+ 증거 파일은 이번 실행 중에 생성하고 실제 명령 출력을 포함해 앞뒤 공백을 제외한 내용이 40자 이상이어야 한다.
8
+
7
9
  마지막 assistant 메시지:
8
10
  {{LAST_ASSISTANT_MESSAGE}}
9
11