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.
- package/dist/cli/index.js +4682 -14969
- package/dist/cli-node/index.js +4727 -15014
- package/package.json +1 -1
- package/packages/lsp-daemon/dist/cli.js +181 -181
- package/packages/lsp-daemon/dist/client.js +232 -232
- package/packages/lsp-daemon/dist/index.js +132 -132
- package/packages/lsp-tools-mcp/dist/cli.js +103 -101
- package/packages/lsp-tools-mcp/dist/lsp/manager.js +14 -14
- package/packages/lsp-tools-mcp/dist/mcp.js +129 -129
- package/packages/lsp-tools-mcp/dist/tools.js +47 -47
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/README.md +4 -0
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +151 -102
- package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/AGENTS.md +2 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/directive.md +2 -0
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/cli.js +35 -24
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/codex-hook.js +31 -21
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/types.d.ts +3 -0
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/codex-hook.ts +31 -23
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/types.ts +3 -0
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/cli.test.ts +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +133 -7
- package/packages/omo-codex/plugin/components/lcx/skills/lcx-doctor/SKILL.md +3 -1
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
- package/packages/omo-codex/plugin/components/lsp/dist/cli.js +298 -298
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/README.md +2 -0
- package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-6.md +123 -0
- package/packages/omo-codex/plugin/components/rules/dist/cli.js +38 -30
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +6 -0
- package/packages/omo-codex/plugin/components/rules/test/hephaestus-model-variant.test.ts +38 -2
- package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +24 -0
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +2 -2
- package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +66 -357
- package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +66 -358
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/README.md +2 -0
- package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-clone-fidelity-reviewer.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-code-reviewer.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-gate-reviewer.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-qa-executor.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-high.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-low.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-medium.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/librarian.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/metis.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/momus.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/dist/cli.js +3 -3
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +63 -63
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/model-catalog.json +16 -7
- package/packages/omo-codex/plugin/package-lock.json +16 -16
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +16 -7
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +8 -4
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/subagent-limit-guard.mjs +18 -90
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/toml-section-editor.mjs +1 -1
- package/packages/omo-codex/plugin/shared/package.json +1 -1
- package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +3 -1
- package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +12 -12
- package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +14 -4
- package/packages/omo-codex/plugin/test/auto-update.test.mjs +4 -4
- package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +25 -1
- package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +35 -35
- package/packages/omo-codex/plugin/test/multi-agent-v2-regression.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/subagent-limit-migration.test.mjs +107 -15
- 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((
|
|
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((
|
|
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
|
|
864
|
-
if (acceptsCandidate(
|
|
865
|
-
return { found: true, path:
|
|
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
|
|
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) +
|
|
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
|
|
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) +
|
|
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
|
|
1237
|
-
if (
|
|
1238
|
-
const closingIndex = findTomlMultilineDelimiter(line,
|
|
1239
|
-
return { wasInside: false, nextQuote: closingIndex === -1 ?
|
|
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,
|
|
1248
|
-
let index = line.indexOf(
|
|
1247
|
+
function findTomlMultilineDelimiter(line, delimiter, startIndex) {
|
|
1248
|
+
let index = line.indexOf(delimiter, startIndex);
|
|
1249
1249
|
while (index !== -1) {
|
|
1250
|
-
if (
|
|
1250
|
+
if (delimiter === "'''" || countPrecedingBackslashes(line, index) % 2 === 0)
|
|
1251
1251
|
return index;
|
|
1252
|
-
index = line.indexOf(
|
|
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(
|
|
1306
|
-
return
|
|
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
|
-
|
|
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
|
|
2238
|
+
const stat = await lstat6(linkPath);
|
|
2181
2239
|
if (platform !== "win32") {
|
|
2182
|
-
if (!
|
|
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 (!
|
|
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
|
|
2353
|
-
await replaceRuntimeWrapper(
|
|
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:
|
|
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
|
|
2366
|
-
await replaceCommandShim(
|
|
2367
|
-
return
|
|
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
|
|
2490
|
-
if (
|
|
2547
|
+
const stat = await lstat7(path);
|
|
2548
|
+
if (stat.isSymbolicLink())
|
|
2491
2549
|
return false;
|
|
2492
|
-
if (!
|
|
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
|
|
2505
|
-
if (!
|
|
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
|
|
2520
|
-
if (!
|
|
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-
|
|
3098
|
-
modelContextWindow:
|
|
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:
|
|
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
|
|
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
|
-
|
|
3217
|
-
|
|
3218
|
-
|
|
3219
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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(
|
|
3583
|
-
if (input.exists(
|
|
3584
|
-
return { found: true, path:
|
|
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
|
|
3588
|
-
if (
|
|
3636
|
+
const candidate = pathCandidate.trim();
|
|
3637
|
+
if (candidate.length === 0)
|
|
3589
3638
|
continue;
|
|
3590
|
-
checkedPaths.push(
|
|
3591
|
-
if (isKnownNonGitBashLauncher(
|
|
3639
|
+
checkedPaths.push(candidate);
|
|
3640
|
+
if (isKnownNonGitBashLauncher(candidate))
|
|
3592
3641
|
continue;
|
|
3593
|
-
if (isBashExePath(
|
|
3594
|
-
return { found: true, path:
|
|
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
|
|
3648
|
-
const initialResolution =
|
|
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
|
|
4051
|
-
if (typeof
|
|
4099
|
+
for (const candidate of raw) {
|
|
4100
|
+
if (typeof candidate !== "object" || candidate === null)
|
|
4052
4101
|
continue;
|
|
4053
|
-
const record =
|
|
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.
|
|
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.
|
|
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 pre-tool-use",
|
|
10
10
|
"timeout": 5,
|
|
11
|
-
"statusMessage": "(OmO 5.0.0-beta.
|
|
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.
|
|
23
|
+
"statusMessage": "(OmO 5.0.0-beta.50) Resetting Git Bash MCP Reminder"
|
|
24
24
|
}
|
|
25
25
|
]
|
|
26
26
|
}
|
|
@@ -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
|
|
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` (`
|
|
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
|
|