@nexus-cortex/core 4.108.8 → 4.108.10
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/.env.defaults +11 -0
- package/dist/config/RuntimeConfigRegistry.d.ts.map +1 -1
- package/dist/config/RuntimeConfigRegistry.js +1 -0
- package/dist/config/RuntimeConfigRegistry.js.map +1 -1
- package/dist/config/SettingsLoader.d.ts.map +1 -1
- package/dist/config/SettingsLoader.js +1 -0
- package/dist/config/SettingsLoader.js.map +1 -1
- package/dist/config/SettingsSchema.d.ts +1 -0
- package/dist/config/SettingsSchema.d.ts.map +1 -1
- package/dist/config/SettingsSchema.js +9 -0
- package/dist/config/SettingsSchema.js.map +1 -1
- package/dist/config/effectiveConfig.d.ts.map +1 -1
- package/dist/config/effectiveConfig.js +1 -0
- package/dist/config/effectiveConfig.js.map +1 -1
- package/dist/orchestrator/CortexOrchestrator.d.ts +4 -0
- package/dist/orchestrator/CortexOrchestrator.d.ts.map +1 -1
- package/dist/orchestrator/CortexOrchestrator.js +25 -7
- package/dist/orchestrator/CortexOrchestrator.js.map +1 -1
- package/dist/orchestrator/outerToolTimeout.d.ts +11 -1
- package/dist/orchestrator/outerToolTimeout.d.ts.map +1 -1
- package/dist/orchestrator/outerToolTimeout.js +16 -2
- package/dist/orchestrator/outerToolTimeout.js.map +1 -1
- package/dist/orchestrator/sliceBlock.d.ts +14 -0
- package/dist/orchestrator/sliceBlock.d.ts.map +1 -1
- package/dist/orchestrator/sliceBlock.js +14 -0
- package/dist/orchestrator/sliceBlock.js.map +1 -1
- package/dist/training/chunkReadProgression.d.ts +30 -0
- package/dist/training/chunkReadProgression.d.ts.map +1 -0
- package/dist/training/chunkReadProgression.js +80 -0
- package/dist/training/chunkReadProgression.js.map +1 -0
- package/dist/training/loopLadder.d.ts +2 -1
- package/dist/training/loopLadder.d.ts.map +1 -1
- package/dist/training/loopLadder.js +15 -2
- package/dist/training/loopLadder.js.map +1 -1
- package/dist/training/toolOutcome.d.ts +5 -0
- package/dist/training/toolOutcome.d.ts.map +1 -1
- package/dist/training/toolOutcome.js +3 -0
- package/dist/training/toolOutcome.js.map +1 -1
- package/package.json +3 -3
|
@@ -2,12 +2,22 @@ export type ToolUseBlockLike = {
|
|
|
2
2
|
name?: string;
|
|
3
3
|
input?: unknown;
|
|
4
4
|
};
|
|
5
|
+
/**
|
|
6
|
+
* CORTEX_OUTER_TOOL_TIMEOUT_MS (2026-09-13): a FLOOR (ms) for the outer batch deadline. Non-Bash tools
|
|
7
|
+
* without a limit of their own (CreateArtifactTool persistent launches, ctr-optimization) and Task
|
|
8
|
+
* sub-agents mid-turn were still killed at the static ~150s (5 TB4.0 kills). With the floor set the
|
|
9
|
+
* deadline becomes max(computed, floor + grace). Unset / 0 / junk = no floor (behaviour unchanged).
|
|
10
|
+
*/
|
|
11
|
+
export declare function resolveOuterToolTimeoutFloorMs(env?: NodeJS.ProcessEnv): number;
|
|
5
12
|
/**
|
|
6
13
|
* R133 HB-SUBAGENT-TIMEOUT (2026-09-13): a Task batch was aborted at this same ~150s, BELOW the sub-agent's
|
|
7
14
|
* own timeout (300s hardcoded then; now derived from the parent's remaining turn budget). The optional
|
|
8
15
|
* `blockTimeoutMs` lookup lets the caller contribute a per-block resolved timeout (Task → resolveSubAgentTimeoutMs)
|
|
9
16
|
* so the batch abort is >= the sub-agent timeout + grace. Not clamped to the shell ceiling — a sub-agent
|
|
10
17
|
* legitimately runs for hours under a long turn deadline.
|
|
18
|
+
*
|
|
19
|
+
* `floorMs` (CORTEX_OUTER_TOOL_TIMEOUT_MS, resolved by the caller once per turn) lifts the deadline to at
|
|
20
|
+
* least floor + grace; 0 / undefined / non-finite = no floor.
|
|
11
21
|
*/
|
|
12
|
-
export declare function resolveOuterToolDeadlineMs(toolUseBlocks: ReadonlyArray<ToolUseBlockLike>, toolTimeoutMs: number, graceMs: number, blockTimeoutMs?: (block: ToolUseBlockLike, index: number) => number | undefined): number;
|
|
22
|
+
export declare function resolveOuterToolDeadlineMs(toolUseBlocks: ReadonlyArray<ToolUseBlockLike>, toolTimeoutMs: number, graceMs: number, blockTimeoutMs?: (block: ToolUseBlockLike, index: number) => number | undefined, floorMs?: number): number;
|
|
13
23
|
//# sourceMappingURL=outerToolTimeout.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outerToolTimeout.d.ts","sourceRoot":"","sources":["../../src/orchestrator/outerToolTimeout.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,gBAAgB,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAElE
|
|
1
|
+
{"version":3,"file":"outerToolTimeout.d.ts","sourceRoot":"","sources":["../../src/orchestrator/outerToolTimeout.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,gBAAgB,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAElE;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAG3F;AAED;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CACxC,aAAa,EAAE,aAAa,CAAC,gBAAgB,CAAC,EAC9C,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACf,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,EAC/E,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAiBR"}
|
|
@@ -13,14 +13,27 @@
|
|
|
13
13
|
* timer is only ever the true last-resort for a hung tool.
|
|
14
14
|
*/
|
|
15
15
|
const SHELL_MAX_TIMEOUT_MS = 600_000; // mirrors ShellTool.MAX_TIMEOUT_MS (requested timeouts are clamped there)
|
|
16
|
+
/**
|
|
17
|
+
* CORTEX_OUTER_TOOL_TIMEOUT_MS (2026-09-13): a FLOOR (ms) for the outer batch deadline. Non-Bash tools
|
|
18
|
+
* without a limit of their own (CreateArtifactTool persistent launches, ctr-optimization) and Task
|
|
19
|
+
* sub-agents mid-turn were still killed at the static ~150s (5 TB4.0 kills). With the floor set the
|
|
20
|
+
* deadline becomes max(computed, floor + grace). Unset / 0 / junk = no floor (behaviour unchanged).
|
|
21
|
+
*/
|
|
22
|
+
export function resolveOuterToolTimeoutFloorMs(env = process.env) {
|
|
23
|
+
const n = Number(String(env.CORTEX_OUTER_TOOL_TIMEOUT_MS ?? '').trim() || 0);
|
|
24
|
+
return Number.isFinite(n) && n > 0 ? Math.floor(n) : 0;
|
|
25
|
+
}
|
|
16
26
|
/**
|
|
17
27
|
* R133 HB-SUBAGENT-TIMEOUT (2026-09-13): a Task batch was aborted at this same ~150s, BELOW the sub-agent's
|
|
18
28
|
* own timeout (300s hardcoded then; now derived from the parent's remaining turn budget). The optional
|
|
19
29
|
* `blockTimeoutMs` lookup lets the caller contribute a per-block resolved timeout (Task → resolveSubAgentTimeoutMs)
|
|
20
30
|
* so the batch abort is >= the sub-agent timeout + grace. Not clamped to the shell ceiling — a sub-agent
|
|
21
31
|
* legitimately runs for hours under a long turn deadline.
|
|
32
|
+
*
|
|
33
|
+
* `floorMs` (CORTEX_OUTER_TOOL_TIMEOUT_MS, resolved by the caller once per turn) lifts the deadline to at
|
|
34
|
+
* least floor + grace; 0 / undefined / non-finite = no floor.
|
|
22
35
|
*/
|
|
23
|
-
export function resolveOuterToolDeadlineMs(toolUseBlocks, toolTimeoutMs, graceMs, blockTimeoutMs) {
|
|
36
|
+
export function resolveOuterToolDeadlineMs(toolUseBlocks, toolTimeoutMs, graceMs, blockTimeoutMs, floorMs) {
|
|
24
37
|
let maxRequested = 0;
|
|
25
38
|
let maxResolved = 0;
|
|
26
39
|
for (let i = 0; i < toolUseBlocks.length; i++) {
|
|
@@ -39,6 +52,7 @@ export function resolveOuterToolDeadlineMs(toolUseBlocks, toolTimeoutMs, graceMs
|
|
|
39
52
|
maxRequested = t;
|
|
40
53
|
}
|
|
41
54
|
const honored = Math.max(Math.min(maxRequested, SHELL_MAX_TIMEOUT_MS), maxResolved);
|
|
42
|
-
|
|
55
|
+
const floor = Number.isFinite(floorMs) && floorMs > 0 ? floorMs : 0;
|
|
56
|
+
return Math.max(toolTimeoutMs, honored, floor) + graceMs;
|
|
43
57
|
}
|
|
44
58
|
//# sourceMappingURL=outerToolTimeout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outerToolTimeout.js","sourceRoot":"","sources":["../../src/orchestrator/outerToolTimeout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,MAAM,oBAAoB,GAAG,OAAO,CAAC,CAAC,0EAA0E;AAIhH
|
|
1
|
+
{"version":3,"file":"outerToolTimeout.js","sourceRoot":"","sources":["../../src/orchestrator/outerToolTimeout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,MAAM,oBAAoB,GAAG,OAAO,CAAC,CAAC,0EAA0E;AAIhH;;;;;GAKG;AACH,MAAM,UAAU,8BAA8B,CAAC,MAAyB,OAAO,CAAC,GAAG;IACjF,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7E,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,0BAA0B,CACxC,aAA8C,EAC9C,aAAqB,EACrB,OAAe,EACf,cAA+E,EAC/E,OAAgB;IAEhB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,CAAC,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACvC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,WAAW;gBAAE,WAAW,GAAG,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC,EAAE,IAAI,KAAK,MAAM;YAAE,SAAS,CAAC,0CAA0C;QAC5E,MAAM,CAAC,GAAG,MAAM,CAAE,CAAC,CAAC,KAA2C,EAAE,OAAO,CAAC,CAAC;QAC1E,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,YAAY;YAAE,YAAY,GAAG,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,oBAAoB,CAAC,EAAE,WAAW,CAAC,CAAC;IACpF,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAK,OAAkB,GAAG,CAAC,CAAC,CAAC,CAAE,OAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5F,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC;AAC3D,CAAC"}
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
*
|
|
20
20
|
* PURE + deterministic — all state (per-file slice count, per-file block count) lives in the orchestrator.
|
|
21
21
|
*/
|
|
22
|
+
import { type ChunkRead } from '../training/chunkReadProgression.js';
|
|
22
23
|
export type SliceBlockAction = 'block' | 'none';
|
|
23
24
|
export interface SliceBlockDecision {
|
|
24
25
|
action: SliceBlockAction;
|
|
@@ -47,4 +48,17 @@ export declare function isPathLike(file: string): boolean;
|
|
|
47
48
|
* CORTEX_SLICE_BLOCK and confirmed this is a slice-read (via sliceReadFile).
|
|
48
49
|
*/
|
|
49
50
|
export declare function decideSliceBlock(file: string, priorSlices: number, priorBlocks: number, at?: number, max?: number): SliceBlockDecision;
|
|
51
|
+
/**
|
|
52
|
+
* HB-CHUNKED-READS (R128): one step of the per-file slice-read counter. A slice that is the next
|
|
53
|
+
* DISJOINT, INCREASING chunk of the same file (sed -n 'A,Bp' / head|tail / tail|head / awk NR) is a
|
|
54
|
+
* progression, not a re-read: the count does NOT advance (so neither the slice_read nudge at 3 nor the
|
|
55
|
+
* slice block at 5 fires across a chunked read), but the chunk is remembered as the new `lastChunk`.
|
|
56
|
+
* An identical / overlapping / backwards range, or a slice with no parseable range, counts as before.
|
|
57
|
+
* PURE — the orchestrator keeps both maps (count per file, last chunk per file).
|
|
58
|
+
*/
|
|
59
|
+
export declare function sliceReadStep(priorCount: number, lastChunk: ChunkRead | undefined, cmd: string): {
|
|
60
|
+
count: number;
|
|
61
|
+
progression: boolean;
|
|
62
|
+
chunk: ChunkRead | null;
|
|
63
|
+
};
|
|
50
64
|
//# sourceMappingURL=sliceBlock.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sliceBlock.d.ts","sourceRoot":"","sources":["../../src/orchestrator/sliceBlock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,MAAM,CAAC;AAEhD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,gBAAgB,CAAC;IACzB,2EAA2E;IAC3E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;yGACyG;AACzG,eAAO,MAAM,sBAAsB,IAAI,CAAC;AACxC,8FAA8F;AAC9F,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAMzC,+FAA+F;AAC/F,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGxD;AAED,yFAAyF;AACzF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGjD;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,EAAE,GAAE,MAA+B,EACnC,GAAG,GAAE,MAAgC,GACpC,kBAAkB,CAWpB"}
|
|
1
|
+
{"version":3,"file":"sliceBlock.d.ts","sourceRoot":"","sources":["../../src/orchestrator/sliceBlock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAsC,KAAK,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAEzG,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,MAAM,CAAC;AAEhD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,gBAAgB,CAAC;IACzB,2EAA2E;IAC3E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;yGACyG;AACzG,eAAO,MAAM,sBAAsB,IAAI,CAAC;AACxC,8FAA8F;AAC9F,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAMzC,+FAA+F;AAC/F,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGxD;AAED,yFAAyF;AACzF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGjD;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,EAAE,GAAE,MAA+B,EACnC,GAAG,GAAE,MAAgC,GACpC,kBAAkB,CAWpB;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,SAAS,GAAG,SAAS,EAChC,GAAG,EAAE,MAAM,GACV;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAA;CAAE,CAIlE"}
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
*
|
|
20
20
|
* PURE + deterministic — all state (per-file slice count, per-file block count) lives in the orchestrator.
|
|
21
21
|
*/
|
|
22
|
+
import { parseChunkRead, isChunkProgression } from '../training/chunkReadProgression.js';
|
|
22
23
|
/** Default: block once the model is ATTEMPTING the (at+1)th slice — leaves the soft nudge at 3 and the
|
|
23
24
|
* ~60% shallow-stoppers (1-2 extra slices) alone, coercing only the sustained grinders. Env-tunable. */
|
|
24
25
|
export const SLICE_BLOCK_AT_DEFAULT = 5;
|
|
@@ -66,4 +67,17 @@ export function decideSliceBlock(file, priorSlices, priorBlocks, at = SLICE_BLOC
|
|
|
66
67
|
`${file} can be sliced again next turn.`;
|
|
67
68
|
return { action: 'block', message };
|
|
68
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* HB-CHUNKED-READS (R128): one step of the per-file slice-read counter. A slice that is the next
|
|
72
|
+
* DISJOINT, INCREASING chunk of the same file (sed -n 'A,Bp' / head|tail / tail|head / awk NR) is a
|
|
73
|
+
* progression, not a re-read: the count does NOT advance (so neither the slice_read nudge at 3 nor the
|
|
74
|
+
* slice block at 5 fires across a chunked read), but the chunk is remembered as the new `lastChunk`.
|
|
75
|
+
* An identical / overlapping / backwards range, or a slice with no parseable range, counts as before.
|
|
76
|
+
* PURE — the orchestrator keeps both maps (count per file, last chunk per file).
|
|
77
|
+
*/
|
|
78
|
+
export function sliceReadStep(priorCount, lastChunk, cmd) {
|
|
79
|
+
const chunk = parseChunkRead(cmd);
|
|
80
|
+
const progression = isChunkProgression(lastChunk, chunk);
|
|
81
|
+
return { count: progression ? priorCount : priorCount + 1, progression, chunk };
|
|
82
|
+
}
|
|
69
83
|
//# sourceMappingURL=sliceBlock.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sliceBlock.js","sourceRoot":"","sources":["../../src/orchestrator/sliceBlock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;
|
|
1
|
+
{"version":3,"file":"sliceBlock.js","sourceRoot":"","sources":["../../src/orchestrator/sliceBlock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAkB,MAAM,qCAAqC,CAAC;AAUzG;yGACyG;AACzG,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACxC,8FAA8F;AAC9F,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAEzC,sGAAsG;AACtG,oGAAoG;AACpG,MAAM,QAAQ,GAAG,6FAA6F,CAAC;AAE/G,+FAA+F;AAC/F,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1B,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC;IAC3C,OAAO,6CAA6C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,WAAmB,EACnB,WAAmB,EACnB,KAAa,sBAAsB,EACnC,MAAc,uBAAuB;IAErC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAG,8DAA8D;IAC/H,IAAI,WAAW,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAG,8BAA8B;IAC/F,IAAI,WAAW,GAAG,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAK,uCAAuC;IACzG,IAAI,WAAW,IAAI,GAAG;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAG,gCAAgC;IAClG,MAAM,OAAO,GACX,iBAAiB,IAAI,OAAO,WAAW,0DAA0D;QACjG,8DAA8D,IAAI,kCAAkC;QACpG,sFAAsF;QACtF,GAAG,IAAI,iCAAiC,CAAC;IAC3C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AACtC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAC3B,UAAkB,EAClB,SAAgC,EAChC,GAAW;IAEX,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,WAAW,GAAG,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACzD,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AAClF,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* chunkReadProgression — HB-CHUNKED-READS (R128, 2026-09-13).
|
|
3
|
+
*
|
|
4
|
+
* The anti-loop stack (approachHash strips digits → `sed -n '1,200p'` ≡ `sed -n '201,400p'`; the
|
|
5
|
+
* near-dup hash lens; the poll guard; the per-file slice_read nudge/block) fought a task that read a
|
|
6
|
+
* 1200-line file in ≤200-line chunks: loop_escalation remind(4)/diversify(12) on ONE hash,
|
|
7
|
+
* steering_injected slice_read, then loop_tool_block neardup-hash pushed the model off Bash. A
|
|
8
|
+
* monotonic range progression over one file is the canonical way to read a large input.
|
|
9
|
+
*
|
|
10
|
+
* ONE pure helper shared by the ladder (hash lens + poll guard + similarity lens), the near-dup
|
|
11
|
+
* trigger downstream of it, and the slice_read nudge/block: recognize a chunk read and decide
|
|
12
|
+
* whether two chunk reads of the same file form a DISJOINT, INCREASING progression (a new approach)
|
|
13
|
+
* or a repeat/overlap/backwards read (still a retry — real loop detection stays intact).
|
|
14
|
+
*/
|
|
15
|
+
export type ChunkReadKind = 'sed' | 'head' | 'head-tail' | 'tail-head' | 'awk' | 'read';
|
|
16
|
+
export interface ChunkRead {
|
|
17
|
+
file: string;
|
|
18
|
+
/** 1-based inclusive line range. */
|
|
19
|
+
start: number;
|
|
20
|
+
end: number;
|
|
21
|
+
kind: ChunkReadKind;
|
|
22
|
+
}
|
|
23
|
+
/** Parse a bash command as a chunk read of one file, or null when it is not one (or the range is invalid). */
|
|
24
|
+
export declare function parseChunkRead(command: string): ChunkRead | null;
|
|
25
|
+
/** Parse a tool input (Bash {command} or Read {file_path, offset, limit}) as a chunk read. */
|
|
26
|
+
export declare function parseChunkReadInput(toolName: string, input: unknown): ChunkRead | null;
|
|
27
|
+
/** True when `next` is a DISJOINT, INCREASING chunk of the same file after `prev` — a progression,
|
|
28
|
+
* not a retry. Identical, overlapping and backwards ranges (and different files) are NOT. */
|
|
29
|
+
export declare function isChunkProgression(prev: ChunkRead | null | undefined, next: ChunkRead | null | undefined): boolean;
|
|
30
|
+
//# sourceMappingURL=chunkReadProgression.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunkReadProgression.d.ts","sourceRoot":"","sources":["../../src/training/chunkReadProgression.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,GAAG,WAAW,GAAG,WAAW,GAAG,KAAK,GAAG,MAAM,CAAC;AAExF,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,aAAa,CAAC;CACrB;AAsBD,8GAA8G;AAC9G,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAgBhE;AAED,8FAA8F;AAC9F,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAYtF;AAED;8FAC8F;AAC9F,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAGlH"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* chunkReadProgression — HB-CHUNKED-READS (R128, 2026-09-13).
|
|
3
|
+
*
|
|
4
|
+
* The anti-loop stack (approachHash strips digits → `sed -n '1,200p'` ≡ `sed -n '201,400p'`; the
|
|
5
|
+
* near-dup hash lens; the poll guard; the per-file slice_read nudge/block) fought a task that read a
|
|
6
|
+
* 1200-line file in ≤200-line chunks: loop_escalation remind(4)/diversify(12) on ONE hash,
|
|
7
|
+
* steering_injected slice_read, then loop_tool_block neardup-hash pushed the model off Bash. A
|
|
8
|
+
* monotonic range progression over one file is the canonical way to read a large input.
|
|
9
|
+
*
|
|
10
|
+
* ONE pure helper shared by the ladder (hash lens + poll guard + similarity lens), the near-dup
|
|
11
|
+
* trigger downstream of it, and the slice_read nudge/block: recognize a chunk read and decide
|
|
12
|
+
* whether two chunk reads of the same file form a DISJOINT, INCREASING progression (a new approach)
|
|
13
|
+
* or a repeat/overlap/backwards read (still a retry — real loop detection stays intact).
|
|
14
|
+
*/
|
|
15
|
+
const FILE = String.raw `([^\s;|&><'"]+)`;
|
|
16
|
+
const Q = String.raw `['"]?`;
|
|
17
|
+
// sed -n 'A,Bp' FILE | sed -n "A,Bp" FILE | sed -n A,Bp FILE
|
|
18
|
+
const SED_FILE_RE = new RegExp(String.raw `sed\s+-n\s+${Q}(\d+)\s*,\s*(\d+)\s*p${Q}\s+${FILE}`);
|
|
19
|
+
// cat FILE | sed -n 'A,Bp'
|
|
20
|
+
const CAT_SED_RE = new RegExp(String.raw `cat\s+${FILE}\s*\|\s*sed\s+-n\s+${Q}(\d+)\s*,\s*(\d+)\s*p${Q}`);
|
|
21
|
+
// head -n N FILE | tail -n M (also head -N / tail -M)
|
|
22
|
+
const HEAD_TAIL_RE = new RegExp(String.raw `head\s+-n?\s*(\d+)\s+${FILE}\s*\|\s*tail\s+-n?\s*(\d+)(?!\d)`);
|
|
23
|
+
// tail -n +A FILE | head -n B (also head -B)
|
|
24
|
+
const TAIL_HEAD_RE = new RegExp(String.raw `tail\s+-n?\s*\+(\d+)\s+${FILE}\s*\|\s*head\s+-n?\s*(\d+)`);
|
|
25
|
+
// bare head -n N FILE (lines 1..N)
|
|
26
|
+
const HEAD_RE = new RegExp(String.raw `head\s+-n?\s*(\d+)\s+${FILE}`);
|
|
27
|
+
// awk 'NR>=A && NR<=B' FILE
|
|
28
|
+
const AWK_RE = new RegExp(String.raw `awk\s+${Q}\s*NR\s*>=\s*(\d+)\s*&&\s*NR\s*<=\s*(\d+)\s*${Q}\s+${FILE}`);
|
|
29
|
+
function chunk(file, start, end, kind) {
|
|
30
|
+
if (!Number.isFinite(start) || !Number.isFinite(end) || start < 1 || end < start)
|
|
31
|
+
return null;
|
|
32
|
+
return { file, start, end, kind };
|
|
33
|
+
}
|
|
34
|
+
/** Parse a bash command as a chunk read of one file, or null when it is not one (or the range is invalid). */
|
|
35
|
+
export function parseChunkRead(command) {
|
|
36
|
+
const cmd = String(command ?? '');
|
|
37
|
+
let m;
|
|
38
|
+
if ((m = SED_FILE_RE.exec(cmd)))
|
|
39
|
+
return chunk(m[3], Number(m[1]), Number(m[2]), 'sed');
|
|
40
|
+
if ((m = CAT_SED_RE.exec(cmd)))
|
|
41
|
+
return chunk(m[1], Number(m[2]), Number(m[3]), 'sed');
|
|
42
|
+
if ((m = TAIL_HEAD_RE.exec(cmd))) {
|
|
43
|
+
const start = Number(m[1]);
|
|
44
|
+
return chunk(m[2], start, start + Number(m[3]) - 1, 'tail-head');
|
|
45
|
+
}
|
|
46
|
+
if ((m = HEAD_TAIL_RE.exec(cmd))) {
|
|
47
|
+
const end = Number(m[1]);
|
|
48
|
+
return chunk(m[2], end - Number(m[3]) + 1, end, 'head-tail');
|
|
49
|
+
}
|
|
50
|
+
if ((m = AWK_RE.exec(cmd)))
|
|
51
|
+
return chunk(m[3], Number(m[1]), Number(m[2]), 'awk');
|
|
52
|
+
if ((m = HEAD_RE.exec(cmd)))
|
|
53
|
+
return chunk(m[2], 1, Number(m[1]), 'head');
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
/** Parse a tool input (Bash {command} or Read {file_path, offset, limit}) as a chunk read. */
|
|
57
|
+
export function parseChunkReadInput(toolName, input) {
|
|
58
|
+
if (!input || typeof input !== 'object')
|
|
59
|
+
return null;
|
|
60
|
+
const i = input;
|
|
61
|
+
if (toolName === 'Bash')
|
|
62
|
+
return parseChunkRead(String(i.command ?? ''));
|
|
63
|
+
if (toolName === 'Read') {
|
|
64
|
+
const file = typeof i.file_path === 'string' ? i.file_path : '';
|
|
65
|
+
const limit = typeof i.limit === 'number' ? i.limit : NaN;
|
|
66
|
+
if (!file || !Number.isFinite(limit) || limit < 1)
|
|
67
|
+
return null; // whole-file Read is not a chunk
|
|
68
|
+
const start = typeof i.offset === 'number' && i.offset >= 1 ? i.offset : 1;
|
|
69
|
+
return chunk(file, start, start + limit - 1, 'read');
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
/** True when `next` is a DISJOINT, INCREASING chunk of the same file after `prev` — a progression,
|
|
74
|
+
* not a retry. Identical, overlapping and backwards ranges (and different files) are NOT. */
|
|
75
|
+
export function isChunkProgression(prev, next) {
|
|
76
|
+
if (!prev || !next)
|
|
77
|
+
return false;
|
|
78
|
+
return prev.file === next.file && next.start > prev.end && next.end >= next.start;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=chunkReadProgression.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunkReadProgression.js","sourceRoot":"","sources":["../../src/training/chunkReadProgression.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,6 +39,7 @@ export declare class LoopLadder {
|
|
|
39
39
|
private readonly simNudged;
|
|
40
40
|
private readonly recentKeys;
|
|
41
41
|
private readonly nearDupNudged;
|
|
42
|
+
private readonly lastChunk;
|
|
42
43
|
constructor(thresholds?: LoopLadderThresholds);
|
|
43
44
|
/** HB-LOOP-NEARDUP: windowed similarity count for an executing tool's normalized text. */
|
|
44
45
|
private observeSimilar;
|
|
@@ -46,7 +47,7 @@ export declare class LoopLadder {
|
|
|
46
47
|
* same normalized approach recurs >= nudgeAt (diversify, once per key) or
|
|
47
48
|
* >= 2x nudgeAt (break) within the sliding window. */
|
|
48
49
|
private observeNearDup;
|
|
49
|
-
observe(toolName: string, outcome: Pick<ToolOutcome, 'status' | 'approachHash' | 'family' | 'approachText'>): LadderResult;
|
|
50
|
+
observe(toolName: string, outcome: Pick<ToolOutcome, 'status' | 'approachHash' | 'family' | 'approachText' | 'chunkRead'>): LadderResult;
|
|
50
51
|
}
|
|
51
52
|
/**
|
|
52
53
|
* Format the tool-result signal text for a ladder escalation. `null` for
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loopLadder.d.ts","sourceRoot":"","sources":["../../src/training/loopLadder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"loopLadder.d.ts","sourceRoot":"","sources":["../../src/training/loopLadder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpE,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,CAAC;AAErE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gHAAgH;IAChH,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC;CACjC;AAID,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAOD,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyD;IAQhF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;IACtC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,UAAU,CAAS;IAM3B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAOxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6C;IACvE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IAInD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgC;gBAE9C,UAAU,GAAE,oBAAyB;IAuBjD,0FAA0F;IAC1F,OAAO,CAAC,cAAc;IActB;;2DAEuD;IACvD,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,GAAG,cAAc,GAAG,QAAQ,GAAG,cAAc,GAAG,WAAW,CAAC,GAAG,YAAY;CA+CzI;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CA2CxF;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,KAAK,CAAK;IAElB,oEAAoE;IACpE,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;CAUrD"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* detector remains as the fast path for byte-identical spam.)
|
|
7
7
|
*/
|
|
8
8
|
import { diceSimilarity } from './toolOutcome.js';
|
|
9
|
+
import { isChunkProgression } from './chunkReadProgression.js';
|
|
9
10
|
const RANK = { none: 0, remind: 1, diversify: 2, break: 3 };
|
|
10
11
|
function envInt(name, fallback) {
|
|
11
12
|
const v = parseInt(process.env[name] ?? '', 10);
|
|
@@ -48,6 +49,10 @@ export class LoopLadder {
|
|
|
48
49
|
simNudged = new Set();
|
|
49
50
|
recentKeys = [];
|
|
50
51
|
nearDupNudged = new Set();
|
|
52
|
+
// HB-CHUNKED-READS (R128): last chunk read per (tool, file). A disjoint increasing progression
|
|
53
|
+
// gets a range-suffixed key (a NEW approach for the hash lens, poll guard and failure ladder) and
|
|
54
|
+
// skips the similarity lens; an identical/overlapping/backwards range keeps the plain hash key.
|
|
55
|
+
lastChunk = new Map();
|
|
51
56
|
constructor(thresholds = {}) {
|
|
52
57
|
this.remindAt = thresholds.remindAt ?? envInt('LOOP_REMIND_AT', 2);
|
|
53
58
|
this.diversifyAt = thresholds.diversifyAt ?? envInt('LOOP_DIVERSIFY_AT', 4);
|
|
@@ -107,9 +112,17 @@ export class LoopLadder {
|
|
|
107
112
|
return null;
|
|
108
113
|
}
|
|
109
114
|
observe(toolName, outcome) {
|
|
110
|
-
|
|
115
|
+
let key = `${toolName}\n${outcome.approachHash}`;
|
|
116
|
+
let progression = false;
|
|
117
|
+
if (outcome.chunkRead) {
|
|
118
|
+
const chunkKey = `${toolName}\n${outcome.chunkRead.file}`;
|
|
119
|
+
progression = isChunkProgression(this.lastChunk.get(chunkKey), outcome.chunkRead);
|
|
120
|
+
this.lastChunk.set(chunkKey, outcome.chunkRead);
|
|
121
|
+
if (progression)
|
|
122
|
+
key += `\n${outcome.chunkRead.start}-${outcome.chunkRead.end}`;
|
|
123
|
+
}
|
|
111
124
|
const hashDup = this.observeNearDup(key);
|
|
112
|
-
const simDup = this.observeSimilar(toolName, outcome.approachText);
|
|
125
|
+
const simDup = this.observeSimilar(toolName, progression ? undefined : outcome.approachText);
|
|
113
126
|
// the more severe of the two near-dup lenses
|
|
114
127
|
const nearDup = hashDup && simDup ? (RANK[simDup.action] >= RANK[hashDup.action] ? simDup : hashDup) : (simDup ?? hashDup);
|
|
115
128
|
if (outcome.status === 'ok') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loopLadder.js","sourceRoot":"","sources":["../../src/training/loopLadder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,cAAc,EAAoB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"loopLadder.js","sourceRoot":"","sources":["../../src/training/loopLadder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type ChunkRead } from './chunkReadProgression.js';
|
|
1
2
|
export interface ToolOutcome {
|
|
2
3
|
status: 'ok' | 'failed' | 'error';
|
|
3
4
|
/** Normalized failure fingerprint (present when status !== 'ok'). */
|
|
@@ -10,6 +11,10 @@ export interface ToolOutcome {
|
|
|
10
11
|
* text the similarity near-dup lens compares (the approachHash is too fine: `python3 -c "…"` retries
|
|
11
12
|
* with an edited script never collide, the 12-in-30 rung was unreachable on every real loop replayed). */
|
|
12
13
|
approachText?: string;
|
|
14
|
+
/** HB-CHUNKED-READS (R128): the file + line range when the call is a chunk read (sed -n / head|tail /
|
|
15
|
+
* awk NR / Read offset+limit). The ladder keys a disjoint increasing progression over one file as
|
|
16
|
+
* a NEW approach instead of the digit-stripped hash the whole progression collides into. */
|
|
17
|
+
chunkRead?: ChunkRead;
|
|
13
18
|
}
|
|
14
19
|
export declare const EXEC_TOOLS: Set<string>;
|
|
15
20
|
/** Slice-reads (sed -n / head / tail paging) are inspection, handled by CORTEX_SLICE_BLOCK — excluded from the loop lens. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolOutcome.d.ts","sourceRoot":"","sources":["../../src/training/toolOutcome.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"toolOutcome.d.ts","sourceRoot":"","sources":["../../src/training/toolOutcome.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAuB,KAAK,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEhF,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,IAAI,GAAG,QAAQ,GAAG,OAAO,CAAC;IAClC,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,YAAY,EAAE,MAAM,CAAC;IACrB,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB;;+GAE2G;IAC3G,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;iGAE6F;IAC7F,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,eAAO,MAAM,UAAU,aAAkE,CAAC;AAC1F,6HAA6H;AAC7H,eAAO,MAAM,aAAa,QAA6C,CAAC;AAExE,6GAA6G;AAC7G,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAWrE;AAED,+GAA+G;AAC/G,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ3D;AAED,UAAU,cAAc;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnE;AA2ED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAYrE;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,cAAc,GACrB,WAAW,CA2Cb"}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
import { createHash } from 'crypto';
|
|
16
16
|
import { classifyErrorFamily } from './errorFamily.js';
|
|
17
17
|
import { stableInputHash } from './DecisionStore.js';
|
|
18
|
+
import { parseChunkReadInput } from './chunkReadProgression.js';
|
|
18
19
|
export const EXEC_TOOLS = new Set(['Bash', 'Write', 'Edit', 'MultiEdit', 'NotebookEdit']);
|
|
19
20
|
/** Slice-reads (sed -n / head / tail paging) are inspection, handled by CORTEX_SLICE_BLOCK — excluded from the loop lens. */
|
|
20
21
|
export const SLICE_READ_RE = /\b(sed\s+-n|head\s+-[nc]|tail\s+-[nc])\b/;
|
|
@@ -141,6 +142,7 @@ export function approachHash(toolName, input) {
|
|
|
141
142
|
export function classifyToolOutcome(toolName, input, result) {
|
|
142
143
|
const exactHash = stableInputHash(input);
|
|
143
144
|
const aHash = approachHash(toolName, input);
|
|
145
|
+
const chunkRead = parseChunkReadInput(toolName, input);
|
|
144
146
|
const content = String(result.content ?? '');
|
|
145
147
|
let status;
|
|
146
148
|
if (result.is_error) {
|
|
@@ -181,6 +183,7 @@ export function classifyToolOutcome(toolName, input, result) {
|
|
|
181
183
|
approachHash: aHash,
|
|
182
184
|
exactHash,
|
|
183
185
|
...(EXEC_TOOLS.has(toolName) ? { approachText: approachText(toolName, input) } : {}),
|
|
186
|
+
...(chunkRead ? { chunkRead } : {}),
|
|
184
187
|
};
|
|
185
188
|
}
|
|
186
189
|
/** Loop-level classification sees results ALREADY augmented with prepended
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolOutcome.js","sourceRoot":"","sources":["../../src/training/toolOutcome.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"toolOutcome.js","sourceRoot":"","sources":["../../src/training/toolOutcome.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAkB,MAAM,2BAA2B,CAAC;AAoBhF,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;AAC1F,6HAA6H;AAC7H,MAAM,CAAC,MAAM,aAAa,GAAG,0CAA0C,CAAC;AAExE,6GAA6G;AAC7G,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,KAAc;IAC3D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAChF,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC9B,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC;IACzC,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO;QAAE,GAAG,GAAG,GAAG,CAAC,CAAC,SAAS,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;SAC7E,IAAI,QAAQ,KAAK,MAAM;QAAE,GAAG,GAAG,GAAG,CAAC,CAAC,SAAS,IAAI,EAAE,KAAK,CAAC,CAAC,UAAU,IAAI,EAAE,KAAK,CAAC,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;;QACpG,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC7B,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC5E,CAAC;AAED,+GAA+G;AAC/G,MAAM,UAAU,cAAc,CAAC,CAAS,EAAE,CAAS;IACjD,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACvL,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE;QAAE,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAQD;;;;;;gDAMgD;AAChD,MAAM,kBAAkB,GAAG;IACzB,mCAAmC;IACnC,0BAA0B;CAC3B,CAAC;AAEF;;;;;;2BAM2B;AAC3B,MAAM,yBAAyB,GAAG;IAChC,yEAAyE;IACzE,yEAAyE;IACzE,yCAAyC;IACzC,+BAA+B;IAC/B,0DAA0D;IAC1D,gCAAgC;CACjC,CAAC;AAEF;;;;;;;;uCAQuC;AACvC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AACnG,SAAS,mBAAmB,CAAC,QAAgB,EAAE,KAAc,EAAE,IAAY;IACzE,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IAC9D,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,CAAC,4CAA4C;IAC1E,MAAM,GAAG,GAAG,MAAM,CAChB,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAE,KAAa,CAAC,OAAO,IAAK,KAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CACpG,CAAC,IAAI,EAAE,CAAC;IACT,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC,CAAC,6DAA6D;IACpG,8EAA8E;IAC9E,mEAAmE;IACnE,OAAO,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACvD,CAAC;AAED;;oEAEoE;AACpE,SAAS,qBAAqB,CAAC,IAAY;IACzC,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,2BAA2B,EAAE,KAAK,CAAC;SAC3C,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC;SACpC,OAAO,CAAC,yDAAyD,EAAE,SAAS,CAAC;QAC9E,wEAAwE;QACxE,0EAA0E;QAC1E,yDAAyD;SACxD,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,OAAO,CAAC,2BAA2B,EAAE,GAAG,CAAC;SACzC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;QACrB,0EAA0E;SACzE,OAAO,CAAC,qBAAqB,EAAE,GAAG,CAAC;SACnC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE;SACN,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,KAAc;IAC3D,IAAI,IAAY,CAAC;IACjB,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,0EAA0E;QAC1E,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;aAC7D,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACpC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,qBAAqB,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,qBAAqB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,QAAQ,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,QAAgB,EAChB,KAAc,EACd,MAAsB;IAEtB,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAE7C,IAAI,MAA6B,CAAC;IAClC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,GAAG,OAAO,CAAC;IACnB,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC;QACvC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YAC3C,IAAI,mBAAmB,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;gBAC/C,0EAA0E;gBAC1E,2EAA2E;gBAC3E,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,4DAA4D;gBAC5D,MAAM,GAAG,QAAQ,CAAC;YACpB,CAAC;QACH,CAAC;aAAM,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAC7D,0EAA0E;YAC1E,uEAAuE;YACvE,MAAM,GAAG,QAAQ,CAAC;QACpB,CAAC;aAAM,IAAI,yBAAyB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACpE,2EAA2E;YAC3E,2EAA2E;YAC3E,MAAM,GAAG,QAAQ,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM;QACN,GAAG,CAAC,MAAM,KAAK,IAAI;YACjB,CAAC,CAAC,EAAE,MAAM,EAAE,mBAAmB,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,cAAc,EAAE;YACjG,CAAC,CAAC,EAAE,CAAC;QACP,YAAY,EAAE,KAAK;QACnB,SAAS;QACT,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpF,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpC,CAAC;AACJ,CAAC;AAED;;+EAE+E;AAC/E,SAAS,qBAAqB,CAAC,OAAe;IAC5C,IAAI,GAAG,GAAG,OAAO,CAAC;IAClB,iDAAiD;IACjD,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,qDAAqD,EAAE,EAAE,CAAC,CAAC;QACpF,IAAI,IAAI,KAAK,GAAG;YAAE,OAAO,GAAG,CAAC;QAC7B,GAAG,GAAG,IAAI,CAAC;IACb,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nexus-cortex/core",
|
|
3
|
-
"version": "4.108.
|
|
3
|
+
"version": "4.108.10",
|
|
4
4
|
"description": "Core orchestration library implementing Claude CLI architecture patterns",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -47,8 +47,8 @@
|
|
|
47
47
|
"@google/generative-ai": "^0.2.1",
|
|
48
48
|
"@gradio/client": "^2.3.1",
|
|
49
49
|
"@modelcontextprotocol/sdk": "^1.20.2",
|
|
50
|
-
"@nexus-cortex/executors": "4.108.
|
|
51
|
-
"@nexus-cortex/types": "4.108.
|
|
50
|
+
"@nexus-cortex/executors": "4.108.10",
|
|
51
|
+
"@nexus-cortex/types": "4.108.10",
|
|
52
52
|
"@types/uuid": "^10.0.0",
|
|
53
53
|
"ajv": "^8.12.0",
|
|
54
54
|
"chokidar": "^3.6.0",
|