@nexus-cortex/core 4.93.0 → 4.95.0

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 (55) hide show
  1. package/{.env.example → .env.defaults} +134 -25
  2. package/dist/config/MentorshipConfigService.d.ts +0 -1
  3. package/dist/config/MentorshipConfigService.d.ts.map +1 -1
  4. package/dist/config/MentorshipConfigService.js +10 -5
  5. package/dist/config/MentorshipConfigService.js.map +1 -1
  6. package/dist/config/SettingsLoader.d.ts +92 -11
  7. package/dist/config/SettingsLoader.d.ts.map +1 -1
  8. package/dist/config/SettingsLoader.js +331 -131
  9. package/dist/config/SettingsLoader.js.map +1 -1
  10. package/dist/config/effectiveConfig.d.ts +1 -1
  11. package/dist/config/effectiveConfig.d.ts.map +1 -1
  12. package/dist/config/effectiveConfig.js +10 -1
  13. package/dist/config/effectiveConfig.js.map +1 -1
  14. package/dist/middleware/HelperModelMiddleware.d.ts +32 -0
  15. package/dist/middleware/HelperModelMiddleware.d.ts.map +1 -1
  16. package/dist/middleware/HelperModelMiddleware.js +57 -5
  17. package/dist/middleware/HelperModelMiddleware.js.map +1 -1
  18. package/dist/models/cards/deepseek/deepseek-v4-flash.d.ts.map +1 -1
  19. package/dist/models/cards/deepseek/deepseek-v4-flash.js +4 -2
  20. package/dist/models/cards/deepseek/deepseek-v4-flash.js.map +1 -1
  21. package/dist/orchestrator/CortexOrchestrator.d.ts +34 -0
  22. package/dist/orchestrator/CortexOrchestrator.d.ts.map +1 -1
  23. package/dist/orchestrator/CortexOrchestrator.js +292 -6
  24. package/dist/orchestrator/CortexOrchestrator.js.map +1 -1
  25. package/dist/orchestrator/OrchestratorFactory.js +1 -1
  26. package/dist/orchestrator/OrchestratorFactory.js.map +1 -1
  27. package/dist/orchestrator/displayHistorySanitizer.d.ts +29 -0
  28. package/dist/orchestrator/displayHistorySanitizer.d.ts.map +1 -0
  29. package/dist/orchestrator/displayHistorySanitizer.js +62 -0
  30. package/dist/orchestrator/displayHistorySanitizer.js.map +1 -0
  31. package/dist/orchestrator/loopToolBlock.d.ts +46 -0
  32. package/dist/orchestrator/loopToolBlock.d.ts.map +1 -0
  33. package/dist/orchestrator/loopToolBlock.js +66 -0
  34. package/dist/orchestrator/loopToolBlock.js.map +1 -0
  35. package/dist/tools/context-management/InitCortexContext.js +1 -1
  36. package/dist/tools/context-management/InitCortexContext.js.map +1 -1
  37. package/dist/training/DecisionStore.d.ts +1 -1
  38. package/dist/training/DecisionStore.d.ts.map +1 -1
  39. package/dist/training/DecisionStore.js.map +1 -1
  40. package/dist/training/deadlineExitMentor.d.ts +67 -0
  41. package/dist/training/deadlineExitMentor.d.ts.map +1 -0
  42. package/dist/training/deadlineExitMentor.js +99 -0
  43. package/dist/training/deadlineExitMentor.js.map +1 -0
  44. package/dist/training/endTurnResolver.d.ts +14 -3
  45. package/dist/training/endTurnResolver.d.ts.map +1 -1
  46. package/dist/training/endTurnResolver.js +27 -10
  47. package/dist/training/endTurnResolver.js.map +1 -1
  48. package/dist/training/loopExitPlanner.d.ts +30 -0
  49. package/dist/training/loopExitPlanner.d.ts.map +1 -0
  50. package/dist/training/loopExitPlanner.js +61 -0
  51. package/dist/training/loopExitPlanner.js.map +1 -0
  52. package/dist/training/toolOutcome.d.ts.map +1 -1
  53. package/dist/training/toolOutcome.js +33 -2
  54. package/dist/training/toolOutcome.js.map +1 -1
  55. package/package.json +5 -5
@@ -0,0 +1,67 @@
1
+ /**
2
+ * deadlineExitMentor — the mentor-as-deadline-checkpoint (operator design 2026-09-05, the
3
+ * "smart deadline"). The THIRD mentor invocation (distinct from liftPlanner and
4
+ * endTurnResolver). At the WARN rung (~0.81 of the task budget, where residual still exists),
5
+ * instead of a dumb "wrap up" nudge to the junior, a bounded mentor looks at the work product
6
+ * and the remaining budget and decides ONE thing:
7
+ *
8
+ * CONTINUE — on-track / closing in (like schemelike, which solves in the last fifth) → let it
9
+ * run to the hard-floor break; do NOT truncate a win.
10
+ * FINISH — the work ALREADY meets the task's real criteria → end now with an attestation,
11
+ * bypassing the EndTurn resolver (no double pro@max pay).
12
+ * ACTION — a small, specific gap remains and the ONE minimal action to close it fits the
13
+ * residual → inject that action, then finish.
14
+ * RETIRE — stuck / structurally unclosable in the residual (like filter-js grinding) → end
15
+ * CLEANLY now, do not burn the residual on a lost cause.
16
+ *
17
+ * 🔴 WHY smart, not a slid number (resolver-k5): 24% of PASSING rows finish at ≥0.80 of budget —
18
+ * a flat earlier deadline would truncate a quarter of wins. The mentor's job is to tell
19
+ * "closing in" from "grinding". Value is GATED on that judgment (an early checkpoint that
20
+ * mis-calls a closing-in task HURTS), so this ships DARK and is A/B-validated. Pure + testable;
21
+ * the hard-floor break rung stays as the unconditional failsafe underneath.
22
+ */
23
+ export interface DeadlineExitConfig {
24
+ /** Master switch: CORTEX_DEADLINE_EXIT_MENTOR. Dark by default. */
25
+ enabled: boolean;
26
+ effort: string;
27
+ /** Absolute cap on the mentor's own output budget (tokens). Actual budget is the MIN of this
28
+ * and a residual-scaled value (a fraction of the remaining wall-clock) so the checkpoint can
29
+ * never eat the residual it is trying to preserve. */
30
+ outputBudgetTokensCap: number;
31
+ /** Absolute cap on the mentor call timeout (ms). Residual-scaled at the call site. */
32
+ timeoutMsCap: number;
33
+ /** Fraction of the residual (remaining ms) the checkpoint call may spend. */
34
+ residualFrac: number;
35
+ }
36
+ export declare function resolveDeadlineExitConfig(env?: NodeJS.ProcessEnv): DeadlineExitConfig;
37
+ /** Residual-scaled budget/timeout for ONE checkpoint call, never exceeding the caps and never
38
+ * eating more than residualFrac of the remaining wall-clock. */
39
+ export declare function deadlineExitCallBudget(cfg: DeadlineExitConfig, remainingMs: number): {
40
+ timeoutMs: number;
41
+ outputBudgetTokens: number;
42
+ };
43
+ export declare const DEADLINE_EXIT_SYSTEM: string;
44
+ export interface DeadlineExitContext {
45
+ task: string;
46
+ envReport?: string;
47
+ /** The work product so far: latest answer + recent tool outputs. */
48
+ workProduct: string;
49
+ /** A short human description of the time left, e.g. "~90s of a 900s budget (10%)". */
50
+ remainingBudget: string;
51
+ /** A brief trace of the last few tool calls / whether recent steps reduced the gap (for the
52
+ * convergence judgment), if available. */
53
+ recentProgress?: string;
54
+ }
55
+ export declare function buildDeadlineExitPrompt(ctx: DeadlineExitContext): string;
56
+ export type DeadlineExitDecision = 'continue' | 'finish' | 'action' | 'retire';
57
+ export interface DeadlineExitVerdict {
58
+ decision: DeadlineExitDecision;
59
+ /** ACTION: the step. RETIRE: the reason. FINISH: the confirming clause. */
60
+ detail: string;
61
+ /** Whether a verdict line was found (else fail-safe to CONTINUE — never cut a turn on a broken call). */
62
+ parsed: boolean;
63
+ }
64
+ /** Parse the checkpoint response. Fail-SAFE to CONTINUE (let it keep working) when unparseable —
65
+ * a broken mentor call must never truncate a turn. */
66
+ export declare function parseDeadlineExitVerdict(text: string): DeadlineExitVerdict;
67
+ //# sourceMappingURL=deadlineExitMentor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deadlineExitMentor.d.ts","sourceRoot":"","sources":["../../src/training/deadlineExitMentor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,WAAW,kBAAkB;IACjC,mEAAmE;IACnE,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf;;2DAEuD;IACvD,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sFAAsF;IACtF,YAAY,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,YAAY,EAAE,MAAM,CAAC;CACtB;AAUD,wBAAgB,yBAAyB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,kBAAkB,CAYlG;AAED;iEACiE;AACjE,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAA;CAAE,CAQtI;AAED,eAAO,MAAM,oBAAoB,QAgBH,CAAC;AAE/B,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAC;IACpB,sFAAsF;IACtF,eAAe,EAAE,MAAM,CAAC;IACxB;+CAC2C;IAC3C,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,mBAAmB,GAAG,MAAM,CAcxE;AAED,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE/E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;IACf,yGAAyG;IACzG,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;uDACuD;AACvD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAS1E"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * deadlineExitMentor — the mentor-as-deadline-checkpoint (operator design 2026-09-05, the
3
+ * "smart deadline"). The THIRD mentor invocation (distinct from liftPlanner and
4
+ * endTurnResolver). At the WARN rung (~0.81 of the task budget, where residual still exists),
5
+ * instead of a dumb "wrap up" nudge to the junior, a bounded mentor looks at the work product
6
+ * and the remaining budget and decides ONE thing:
7
+ *
8
+ * CONTINUE — on-track / closing in (like schemelike, which solves in the last fifth) → let it
9
+ * run to the hard-floor break; do NOT truncate a win.
10
+ * FINISH — the work ALREADY meets the task's real criteria → end now with an attestation,
11
+ * bypassing the EndTurn resolver (no double pro@max pay).
12
+ * ACTION — a small, specific gap remains and the ONE minimal action to close it fits the
13
+ * residual → inject that action, then finish.
14
+ * RETIRE — stuck / structurally unclosable in the residual (like filter-js grinding) → end
15
+ * CLEANLY now, do not burn the residual on a lost cause.
16
+ *
17
+ * 🔴 WHY smart, not a slid number (resolver-k5): 24% of PASSING rows finish at ≥0.80 of budget —
18
+ * a flat earlier deadline would truncate a quarter of wins. The mentor's job is to tell
19
+ * "closing in" from "grinding". Value is GATED on that judgment (an early checkpoint that
20
+ * mis-calls a closing-in task HURTS), so this ships DARK and is A/B-validated. Pure + testable;
21
+ * the hard-floor break rung stays as the unconditional failsafe underneath.
22
+ */
23
+ const DEFAULTS = {
24
+ enabled: false,
25
+ effort: 'max',
26
+ outputBudgetTokensCap: 2000,
27
+ timeoutMsCap: 45000,
28
+ residualFrac: 0.4,
29
+ };
30
+ export function resolveDeadlineExitConfig(env = process.env) {
31
+ const e = (env.CORTEX_DEADLINE_EXIT_MENTOR_EFFORT ?? '').trim();
32
+ const b = parseInt((env.CORTEX_DEADLINE_EXIT_MENTOR_BUDGET_TOKENS ?? '').trim(), 10);
33
+ const t = parseInt((env.CORTEX_DEADLINE_EXIT_MENTOR_TIMEOUT_MS ?? '').trim(), 10);
34
+ const f = parseFloat((env.CORTEX_DEADLINE_EXIT_MENTOR_RESIDUAL_FRAC ?? '').trim());
35
+ return {
36
+ enabled: (env.CORTEX_DEADLINE_EXIT_MENTOR ?? '').trim().toLowerCase() === 'true',
37
+ effort: e || DEFAULTS.effort,
38
+ outputBudgetTokensCap: Number.isInteger(b) && b > 0 ? b : DEFAULTS.outputBudgetTokensCap,
39
+ timeoutMsCap: Number.isInteger(t) && t > 0 ? t : DEFAULTS.timeoutMsCap,
40
+ residualFrac: Number.isFinite(f) && f > 0 && f < 1 ? f : DEFAULTS.residualFrac,
41
+ };
42
+ }
43
+ /** Residual-scaled budget/timeout for ONE checkpoint call, never exceeding the caps and never
44
+ * eating more than residualFrac of the remaining wall-clock. */
45
+ export function deadlineExitCallBudget(cfg, remainingMs) {
46
+ const scaledTimeout = Math.max(0, Math.floor(remainingMs * cfg.residualFrac));
47
+ const timeoutMs = Math.max(1, Math.min(cfg.timeoutMsCap, scaledTimeout || cfg.timeoutMsCap));
48
+ // Keep the output budget proportional to the (bounded) time we allow — ~40 tok/s of headroom,
49
+ // capped. A checkpoint verdict + one action line is short by design.
50
+ const byTime = Math.floor((timeoutMs / 1000) * 40);
51
+ const outputBudgetTokens = Math.max(256, Math.min(cfg.outputBudgetTokensCap, byTime || cfg.outputBudgetTokensCap));
52
+ return { timeoutMs, outputBudgetTokens };
53
+ }
54
+ export const DEADLINE_EXIT_SYSTEM = 'You are a senior engineer running a CHECKPOINT on a junior agent that is deep into a task in a ' +
55
+ 'real terminal container and is running low on time. You are given the TASK, an ENVIRONMENT REPORT, ' +
56
+ 'the WORK SO FAR, and the REMAINING BUDGET. Decide, in ONE verdict, what to do with the time left — ' +
57
+ 'the goal is to convert the residual into a PASS, or to stop wasting it on a lost cause.\n' +
58
+ 'FORMAT — your FIRST line MUST be exactly one of:\n' +
59
+ ' VERDICT: CONTINUE (on-track / closing in — let it keep working to the hard deadline; do NOT cut a near-win)\n' +
60
+ ' VERDICT: FINISH (the work ALREADY meets the task\'s real criteria — end now)\n' +
61
+ ' VERDICT: ACTION (a small specific gap remains and ONE action closes it within the residual)\n' +
62
+ ' VERDICT: RETIRE (stuck / structurally unclosable in the residual — end cleanly, stop grinding)\n' +
63
+ 'Judge against the TASK\'s real criteria (what the hidden grader checks), NOT the junior\'s own tests. ' +
64
+ 'Be decisive but fair: CONTINUE when there is genuine convergence (each recent step reduced the gap); ' +
65
+ 'RETIRE only when the same gap persists across attempts or a required capability is missing.\n' +
66
+ 'If ACTION: after the verdict line, give the SINGLE concrete step + the exact check to run.\n' +
67
+ 'If FINISH: optionally one clause confirming the criteria are met.\n' +
68
+ 'If RETIRE: one short line naming why the residual cannot close it.\n' +
69
+ 'If CONTINUE: nothing more.';
70
+ export function buildDeadlineExitPrompt(ctx) {
71
+ const parts = [];
72
+ parts.push(`TASK:\n${(ctx.task || '').trim().slice(0, 2500)}`);
73
+ const env = (ctx.envReport || '').trim();
74
+ if (env)
75
+ parts.push(`ENVIRONMENT REPORT:\n${env.slice(0, 2000)}`);
76
+ parts.push(`REMAINING BUDGET: ${(ctx.remainingBudget || '').trim().slice(0, 200)}`);
77
+ const prog = (ctx.recentProgress || '').trim();
78
+ if (prog)
79
+ parts.push(`RECENT PROGRESS (did each step reduce the gap?):\n${prog.slice(0, 1500)}`);
80
+ parts.push(`WORK SO FAR (latest answer + recent tool outputs):\n${(ctx.workProduct || '').trim().slice(0, 5000)}`);
81
+ parts.push('Checkpoint now. First line: `VERDICT: CONTINUE` | `FINISH` | `ACTION` | `RETIRE`. ' +
82
+ 'If ACTION, the single step + its check; if RETIRE, one line why; if FINISH, one confirming clause.');
83
+ return parts.join('\n\n');
84
+ }
85
+ /** Parse the checkpoint response. Fail-SAFE to CONTINUE (let it keep working) when unparseable —
86
+ * a broken mentor call must never truncate a turn. */
87
+ export function parseDeadlineExitVerdict(text) {
88
+ const t = (text || '').trim();
89
+ if (!t)
90
+ return { decision: 'continue', detail: '', parsed: false };
91
+ const m = t.match(/VERDICT:\s*(CONTINUE|FINISH|ACTION|RETIRE)/i);
92
+ if (!m)
93
+ return { decision: 'continue', detail: '', parsed: false };
94
+ const decision = m[1].toLowerCase();
95
+ const idx = t.indexOf(m[0]);
96
+ const detail = t.slice(idx + m[0].length).trim();
97
+ return { decision, detail, parsed: true };
98
+ }
99
+ //# sourceMappingURL=deadlineExitMentor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deadlineExitMentor.js","sourceRoot":"","sources":["../../src/training/deadlineExitMentor.ts"],"names":[],"mappings":"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"}
@@ -16,10 +16,18 @@ export interface EndTurnResolverConfig {
16
16
  effort: string;
17
17
  /** Max GAP verdicts that reject-and-replan before the gate fallback-accepts (liveness beats loops). */
18
18
  maxRejects: number;
19
+ /** ABSTENTION (CORTEX_ENDTURN_RESOLVER_ABSTAIN): offer the judge a RETIRE verdict for a
20
+ * structurally-hopeless finish and HONOR it (accept + stop) instead of burning the reject
21
+ * cycles on a task the junior can't fix. Dark by default (A/B-able). */
22
+ abstain: boolean;
19
23
  }
20
24
  export declare function resolveEndTurnResolverConfig(env?: NodeJS.ProcessEnv): EndTurnResolverConfig;
21
25
  /** The judge persona. First line is a machine-parseable verdict; a GAP is followed by a fix plan. */
22
26
  export declare const RESOLVER_SYSTEM: string;
27
+ /** Appended to the persona when abstention is enabled — offers the conservative RETIRE verdict. */
28
+ export declare const RESOLVER_ABSTAIN_CLAUSE: string;
29
+ /** The persona for the judge. With `abstain`, the RETIRE option is offered. */
30
+ export declare function resolverSystemPrompt(abstain?: boolean): string;
23
31
  export interface EndTurnResolverContext {
24
32
  /** The task statement the junior received. */
25
33
  task: string;
@@ -31,12 +39,15 @@ export interface EndTurnResolverContext {
31
39
  attestation?: string;
32
40
  }
33
41
  /** Build the user prompt for the judge. Bounded slices keep the call cheap and cache-stable. */
34
- export declare function buildResolverUserPrompt(ctx: EndTurnResolverContext): string;
42
+ export declare function buildResolverUserPrompt(ctx: EndTurnResolverContext, abstain?: boolean): string;
35
43
  export interface ResolverVerdict {
36
- /** true = MEETS (finish); false = GAP (reject + fix plan). Defaults to MEETS on an unparseable/empty
44
+ /** true = MEETS (finish); false = GAP or RETIRE. Defaults to MEETS on an unparseable/empty
37
45
  * response (fail-open: never trap the junior on a broken judge call — liveness beats purity). */
38
46
  meets: boolean;
39
- /** The fix plan (GAP only). */
47
+ /** RETIRE = the finish does not meet requirements AND is structurally unclosable → abstain (accept
48
+ * + stop the reject loop) when CORTEX_ENDTURN_RESOLVER_ABSTAIN is on. Never true for MEETS/GAP. */
49
+ retire: boolean;
50
+ /** GAP: the fix plan. RETIRE: the one-line reason it is unclosable. */
40
51
  plan: string;
41
52
  /** Whether the verdict line was actually found (else it fell back to fail-open MEETS). */
42
53
  parsed: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"endTurnResolver.d.ts","sourceRoot":"","sources":["../../src/training/endTurnResolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,qBAAqB;IACpC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,uGAAuG;IACvG,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,wBAAgB,4BAA4B,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,qBAAqB,CASxG;AAED,qGAAqG;AACrG,eAAO,MAAM,eAAe,QAgB8B,CAAC;AAE3D,MAAM,WAAW,sBAAsB;IACrC,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uGAAuG;IACvG,WAAW,EAAE,MAAM,CAAC;IACpB,wGAAwG;IACxG,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,gGAAgG;AAChG,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,sBAAsB,GAAG,MAAM,CAa3E;AAED,MAAM,WAAW,eAAe;IAC9B;sGACkG;IAClG,KAAK,EAAE,OAAO,CAAC;IACf,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,0FAA0F;IAC1F,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,4FAA4F;AAC5F,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAUlE"}
1
+ {"version":3,"file":"endTurnResolver.d.ts","sourceRoot":"","sources":["../../src/training/endTurnResolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,qBAAqB;IACpC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,uGAAuG;IACvG,UAAU,EAAE,MAAM,CAAC;IACnB;;6EAEyE;IACzE,OAAO,EAAE,OAAO,CAAC;CAClB;AAID,wBAAgB,4BAA4B,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,qBAAqB,CAUxG;AAED,qGAAqG;AACrG,eAAO,MAAM,eAAe,QAgB8B,CAAC;AAE3D,mGAAmG;AACnG,eAAO,MAAM,uBAAuB,QAMyE,CAAC;AAE9G,+EAA+E;AAC/E,wBAAgB,oBAAoB,CAAC,OAAO,UAAQ,GAAG,MAAM,CAE5D;AAED,MAAM,WAAW,sBAAsB;IACrC,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uGAAuG;IACvG,WAAW,EAAE,MAAM,CAAC;IACpB,wGAAwG;IACxG,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,gGAAgG;AAChG,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,sBAAsB,EAAE,OAAO,UAAQ,GAAG,MAAM,CAgB5F;AAED,MAAM,WAAW,eAAe;IAC9B;sGACkG;IAClG,KAAK,EAAE,OAAO,CAAC;IACf;wGACoG;IACpG,MAAM,EAAE,OAAO,CAAC;IAChB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,0FAA0F;IAC1F,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,4FAA4F;AAC5F,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAYlE"}
@@ -11,7 +11,7 @@
11
11
  * the mentor quarantines that reasoning where it belongs and hands the action model a plan, not a
12
12
  * puzzle. Same delivery as the lift planner: orchestrator-invoke → system-reminder. Pure + testable.
13
13
  */
14
- const DEFAULTS = { outputBudgetTokens: 4000, effort: 'max', maxRejects: 2 };
14
+ const DEFAULTS = { outputBudgetTokens: 4000, effort: 'max', maxRejects: 2, abstain: false };
15
15
  export function resolveEndTurnResolverConfig(env = process.env) {
16
16
  const n = parseInt((env.CORTEX_ENDTURN_RESOLVER_BUDGET_TOKENS ?? '').trim(), 10);
17
17
  const e = (env.CORTEX_ENDTURN_RESOLVER_EFFORT ?? '').trim();
@@ -20,6 +20,7 @@ export function resolveEndTurnResolverConfig(env = process.env) {
20
20
  outputBudgetTokens: Number.isInteger(n) && n > 0 ? n : DEFAULTS.outputBudgetTokens,
21
21
  effort: e || DEFAULTS.effort,
22
22
  maxRejects: Number.isInteger(m) && m >= 0 ? m : DEFAULTS.maxRejects,
23
+ abstain: (env.CORTEX_ENDTURN_RESOLVER_ABSTAIN ?? '').trim().toLowerCase() === 'true',
23
24
  };
24
25
  }
25
26
  /** The judge persona. First line is a machine-parseable verdict; a GAP is followed by a fix plan. */
@@ -39,8 +40,19 @@ export const RESOLVER_SYSTEM = 'You are a senior engineer performing the FINAL a
39
40
  'concrete step(s) to close it and the exact check to verify it against the TASK\'s criteria. If a gap ' +
40
41
  'cannot be verified in this box, say so and tell the junior to note it in open_items and finish. Be ' +
41
42
  'terse and concrete; do not rewrite the whole solution.';
43
+ /** Appended to the persona when abstention is enabled — offers the conservative RETIRE verdict. */
44
+ export const RESOLVER_ABSTAIN_CLAUSE = '\n\nA THIRD verdict is available: `VERDICT: RETIRE`. Use it ONLY when the work does not meet requirements ' +
45
+ 'AND the gap is structurally UNCLOSABLE by this junior in the remaining budget — a fundamentally wrong ' +
46
+ 'approach it keeps repeating, a missing capability/dependency that cannot be obtained in this box, or an ' +
47
+ 'impossible / self-contradictory requirement. RETIRE ends the task as-is instead of dispatching another ' +
48
+ 'doomed fix cycle. 🔴 When in doubt between GAP and RETIRE, choose GAP — only RETIRE when you are CONFIDENT ' +
49
+ 'that more attempts cannot help. After `VERDICT: RETIRE`, give ONE short line naming why it is unclosable.';
50
+ /** The persona for the judge. With `abstain`, the RETIRE option is offered. */
51
+ export function resolverSystemPrompt(abstain = false) {
52
+ return abstain ? RESOLVER_SYSTEM + RESOLVER_ABSTAIN_CLAUSE : RESOLVER_SYSTEM;
53
+ }
42
54
  /** Build the user prompt for the judge. Bounded slices keep the call cheap and cache-stable. */
43
- export function buildResolverUserPrompt(ctx) {
55
+ export function buildResolverUserPrompt(ctx, abstain = false) {
44
56
  const parts = [];
45
57
  parts.push(`TASK:\n${(ctx.task || '').trim().slice(0, 2500)}`);
46
58
  const env = (ctx.envReport || '').trim();
@@ -50,22 +62,27 @@ export function buildResolverUserPrompt(ctx) {
50
62
  const att = (ctx.attestation || '').trim();
51
63
  if (att)
52
64
  parts.push(`THE JUNIOR'S OWN ATTESTATION (treat as a claim to VERIFY, not as truth):\n${att.slice(0, 2000)}`);
53
- parts.push('Adjudicate now. First line: `VERDICT: MEETS` or `VERDICT: GAP`. If GAP, add the numbered fix plan ' +
54
- 'anchored to the TASK\'s real criteria.');
65
+ parts.push(abstain
66
+ ? 'Adjudicate now. First line: `VERDICT: MEETS`, `VERDICT: GAP`, or `VERDICT: RETIRE`. If GAP, add the ' +
67
+ 'numbered fix plan anchored to the TASK\'s real criteria; if RETIRE, one line on why it is unclosable.'
68
+ : 'Adjudicate now. First line: `VERDICT: MEETS` or `VERDICT: GAP`. If GAP, add the numbered fix plan ' +
69
+ 'anchored to the TASK\'s real criteria.');
55
70
  return parts.join('\n\n');
56
71
  }
57
72
  /** Parse the judge's response. Fail-open to MEETS when the verdict line is absent/empty. */
58
73
  export function parseResolverVerdict(text) {
59
74
  const t = (text || '').trim();
60
75
  if (!t)
61
- return { meets: true, plan: '', parsed: false };
62
- const m = t.match(/VERDICT:\s*(MEETS|GAP)/i);
76
+ return { meets: true, retire: false, plan: '', parsed: false };
77
+ const m = t.match(/VERDICT:\s*(MEETS|GAP|RETIRE)/i);
63
78
  if (!m)
64
- return { meets: true, plan: '', parsed: false }; // no clear verdict → do not block the finish
65
- const meets = m[1].toUpperCase() === 'MEETS';
66
- // The plan is everything after the verdict line.
79
+ return { meets: true, retire: false, plan: '', parsed: false }; // no clear verdict → do not block the finish
80
+ const verdict = m[1].toUpperCase();
81
+ const meets = verdict === 'MEETS';
82
+ const retire = verdict === 'RETIRE';
83
+ // The plan (GAP) / reason (RETIRE) is everything after the verdict line.
67
84
  const idx = t.indexOf(m[0]);
68
85
  const plan = t.slice(idx + m[0].length).trim();
69
- return { meets, plan, parsed: true };
86
+ return { meets, retire, plan, parsed: true };
70
87
  }
71
88
  //# sourceMappingURL=endTurnResolver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"endTurnResolver.js","sourceRoot":"","sources":["../../src/training/endTurnResolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"endTurnResolver.js","sourceRoot":"","sources":["../../src/training/endTurnResolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * loopExitPlanner.ts — the mentor-as-loop-exit-planner (CORTEX_LOOP_TOOL_BLOCK escalation).
3
+ *
4
+ * The 4th sibling of the bounded pro-max mentor family (endTurnResolver.ts, deadline-exit in
5
+ * HelperModelMiddleware, liftPlanner.ts): when the hard loop-tool-block has fired TWICE on the same
6
+ * tool without breaking the pattern, the escalation reroutes the stuck-loop reasoning away from the
7
+ * narrow-door action model — which cannot see WHY it is stuck — to a bounded max-reasoning mentor
8
+ * whose only job is REPLAN (a concrete different approach) or RETIRE (stop, submit best-effort).
9
+ *
10
+ * Single-shot generateGuidance like evaluateEndTurn; max reasoning is the design intent (a bounded
11
+ * one-shot planner cannot grind) and the big output budget avoids reasoning-eats-the-answer
12
+ * truncation on DeepSeek (the same landmine documented for the resolver/lift-planner).
13
+ */
14
+ export interface LoopExitConfig {
15
+ effort: string;
16
+ outputBudgetTokens: number;
17
+ timeoutMs: number;
18
+ }
19
+ export declare function resolveLoopExitConfig(env?: NodeJS.ProcessEnv): LoopExitConfig;
20
+ export interface LoopExitContext {
21
+ task: string;
22
+ envReport?: string;
23
+ loopingTool: string;
24
+ recentAttempts?: string;
25
+ }
26
+ export declare const LOOP_EXIT_SYSTEM: string;
27
+ export declare function buildLoopExitPrompt(ctx: LoopExitContext): string;
28
+ /** Light verdict tag for the decision-store event (REPLAN | RETIRE | UNKNOWN). Delivery uses the full text. */
29
+ export declare function parseLoopExitVerdict(text: string): 'REPLAN' | 'RETIRE' | 'UNKNOWN';
30
+ //# sourceMappingURL=loopExitPlanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loopExitPlanner.d.ts","sourceRoot":"","sources":["../../src/training/loopExitPlanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,wBAAgB,qBAAqB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,cAAc,CAS1F;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,gBAAgB,QAqB+D,CAAC;AAE7F,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAShE;AAED,+GAA+G;AAC/G,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAGlF"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * loopExitPlanner.ts — the mentor-as-loop-exit-planner (CORTEX_LOOP_TOOL_BLOCK escalation).
3
+ *
4
+ * The 4th sibling of the bounded pro-max mentor family (endTurnResolver.ts, deadline-exit in
5
+ * HelperModelMiddleware, liftPlanner.ts): when the hard loop-tool-block has fired TWICE on the same
6
+ * tool without breaking the pattern, the escalation reroutes the stuck-loop reasoning away from the
7
+ * narrow-door action model — which cannot see WHY it is stuck — to a bounded max-reasoning mentor
8
+ * whose only job is REPLAN (a concrete different approach) or RETIRE (stop, submit best-effort).
9
+ *
10
+ * Single-shot generateGuidance like evaluateEndTurn; max reasoning is the design intent (a bounded
11
+ * one-shot planner cannot grind) and the big output budget avoids reasoning-eats-the-answer
12
+ * truncation on DeepSeek (the same landmine documented for the resolver/lift-planner).
13
+ */
14
+ const DEFAULTS = { effort: 'max', outputBudgetTokens: 4000, timeoutMs: 90000 };
15
+ export function resolveLoopExitConfig(env = process.env) {
16
+ const b = parseInt((env.CORTEX_LOOP_TOOL_BLOCK_BUDGET_TOKENS ?? '').trim(), 10);
17
+ const e = (env.CORTEX_LOOP_TOOL_BLOCK_EFFORT ?? '').trim();
18
+ const t = parseInt((env.CORTEX_LOOP_TOOL_BLOCK_TIMEOUT_MS ?? '').trim(), 10);
19
+ return {
20
+ effort: e || DEFAULTS.effort,
21
+ outputBudgetTokens: Number.isInteger(b) && b > 0 ? b : DEFAULTS.outputBudgetTokens,
22
+ timeoutMs: Number.isInteger(t) && t > 0 ? t : DEFAULTS.timeoutMs,
23
+ };
24
+ }
25
+ export const LOOP_EXIT_SYSTEM = 'You are a senior engineer rescuing a junior agent that is STUCK in a non-converging loop in a real ' +
26
+ 'terminal container. The junior has repeated the SAME failing approach with the "{{TOOL}}" tool over and ' +
27
+ 'over; an automatic guard already blocked and redirected it TWICE and it STILL cannot break the pattern. ' +
28
+ 'It cannot see why it is stuck. You are given the original TASK, an ENVIRONMENT REPORT, the tool it keeps ' +
29
+ 'repeating, and its RECENT ATTEMPTS.\n' +
30
+ 'Answer exactly ONE question: is there a genuinely DIFFERENT path to the task\'s real requirements (the ' +
31
+ 'criteria the hidden grader will check), or is this task unclosable by this junior in this box?\n' +
32
+ 'Be adversarial about the loop: name the specific assumption or dead-end approach the junior keeps ' +
33
+ 'repeating, and give a path that does NOT repeat it (a different tool, a different command, reading the ' +
34
+ 'actual state first, installing a missing dependency, a different algorithm).\n' +
35
+ 'FORMAT — your FIRST line MUST be exactly one of:\n' +
36
+ ' VERDICT: REPLAN\n' +
37
+ ' VERDICT: RETIRE\n' +
38
+ 'If REPLAN: after the verdict line, give a SHORT numbered plan of concrete DIFFERENT steps — for each, the ' +
39
+ 'exact action (which tool + what) and the check that verifies it against the TASK\'s criteria. Do NOT ' +
40
+ 'restate the failing approach; do NOT rewrite the whole solution.\n' +
41
+ 'If RETIRE: use it ONLY when you are CONFIDENT no further attempt can help — a fundamentally wrong approach ' +
42
+ 'with no viable alternative, a missing capability/dependency unobtainable in this box, or an impossible / ' +
43
+ 'self-contradictory requirement. After the verdict line give ONE short line naming why it is unclosable, ' +
44
+ 'then tell the junior to record its best-effort state in open_items and STOP. 🔴 When in doubt between ' +
45
+ 'REPLAN and RETIRE, choose REPLAN — only RETIRE when more attempts genuinely cannot help.';
46
+ export function buildLoopExitPrompt(ctx) {
47
+ const parts = [
48
+ `TASK:\n${ctx.task}`,
49
+ ctx.envReport ? `\nENVIRONMENT REPORT:\n${ctx.envReport}` : '',
50
+ `\nLOOPING TOOL (blocked twice): ${ctx.loopingTool}`,
51
+ ctx.recentAttempts ? `\nRECENT ATTEMPTS (what the junior kept doing):\n${ctx.recentAttempts}` : '',
52
+ '\nGive your verdict now.',
53
+ ];
54
+ return parts.filter(Boolean).join('\n');
55
+ }
56
+ /** Light verdict tag for the decision-store event (REPLAN | RETIRE | UNKNOWN). Delivery uses the full text. */
57
+ export function parseLoopExitVerdict(text) {
58
+ const m = /^\s*VERDICT:\s*(REPLAN|RETIRE)\b/im.exec(text ?? '');
59
+ return m && m[1] ? m[1].toUpperCase() : 'UNKNOWN';
60
+ }
61
+ //# sourceMappingURL=loopExitPlanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loopExitPlanner.js","sourceRoot":"","sources":["../../src/training/loopExitPlanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,MAAM,QAAQ,GAAmB,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAE/F,MAAM,UAAU,qBAAqB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACxE,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,oCAAoC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAChF,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7E,OAAO;QACL,MAAM,EAAE,CAAC,IAAI,QAAQ,CAAC,MAAM;QAC5B,kBAAkB,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB;QAClF,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS;KACjE,CAAC;AACJ,CAAC;AASD,MAAM,CAAC,MAAM,gBAAgB,GAC3B,qGAAqG;IACrG,0GAA0G;IAC1G,0GAA0G;IAC1G,2GAA2G;IAC3G,uCAAuC;IACvC,yGAAyG;IACzG,kGAAkG;IAClG,oGAAoG;IACpG,yGAAyG;IACzG,gFAAgF;IAChF,oDAAoD;IACpD,qBAAqB;IACrB,qBAAqB;IACrB,4GAA4G;IAC5G,uGAAuG;IACvG,oEAAoE;IACpE,6GAA6G;IAC7G,2GAA2G;IAC3G,0GAA0G;IAC1G,wGAAwG;IACxG,0FAA0F,CAAC;AAE7F,MAAM,UAAU,mBAAmB,CAAC,GAAoB;IACtD,MAAM,KAAK,GAAG;QACZ,UAAU,GAAG,CAAC,IAAI,EAAE;QACpB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,0BAA0B,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE;QAC9D,mCAAmC,GAAG,CAAC,WAAW,EAAE;QACpD,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,oDAAoD,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE;QAClG,0BAA0B;KAC3B,CAAC;IACF,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED,+GAA+G;AAC/G,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,CAAC,GAAG,oCAAoC,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAA0B,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7E,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"toolOutcome.d.ts","sourceRoot":"","sources":["../../src/training/toolOutcome.ts"],"names":[],"mappings":"AAkBA,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;CACnB;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;AAoDD,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,CAkCb"}
1
+ {"version":3,"file":"toolOutcome.d.ts","sourceRoot":"","sources":["../../src/training/toolOutcome.ts"],"names":[],"mappings":"AAkBA,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;CACnB;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,CAwCb"}
@@ -41,6 +41,30 @@ const MASKED_FAILURE_SIGNATURES = [
41
41
  // Hard crashes the shell surfaces on a line of their own.
42
42
  /^[^\n]*: Segmentation fault\b/m,
43
43
  ];
44
+ /** PROBE commands whose exit code 1 means INFORMATION ("no match" / "differs" /
45
+ * "condition false" / "absent"), NOT a failure. exit>=2 IS a real error (bad
46
+ * regex, unreadable file) and stays 'failed'. Verified against 11k banked Bash
47
+ * calls (2026-09-07 census): models write `&&`-coupled bash 52% of the time vs
48
+ * `if/then/fi` 1.2%, and bare probes exit-1 in ~0.3% of calls; classifying that
49
+ * as 'failed' pollutes the failure semantics every guard consumes. NARROW by
50
+ * design (same discipline as MASKED_FAILURE_SIGNATURES): ONLY a BARE probe with
51
+ * NO `&&`/`||` chain — a gated chain's exit could carry a real downstream
52
+ * failure, so those stay 'failed'. */
53
+ const PROBE_COMMANDS = new Set(['grep', 'egrep', 'fgrep', 'rg', 'test', '[', '[[', 'diff', 'cmp']);
54
+ function isBareProbeInfoExit(toolName, input, exit) {
55
+ if (toolName !== 'Bash' && toolName !== 'Shell')
56
+ return false;
57
+ if (exit !== 1)
58
+ return false; // exit>=2 = real probe error; keep 'failed'
59
+ const cmd = String((input && typeof input === 'object' ? (input.command ?? input.cmd) : input) ?? '').trim();
60
+ if (!cmd)
61
+ return false;
62
+ if (/&&|\|\|/.test(cmd))
63
+ return false; // a gated chain — exit-1 may carry a real downstream failure
64
+ // First token = the command. Set membership (not a regex prefix) so `grepfoo`
65
+ // does not match and `[` (the test builtin, a non-word char) does.
66
+ return PROBE_COMMANDS.has(cmd.split(/\s+/)[0] ?? '');
67
+ }
44
68
  /** Normalize an input's text the way errorFamily normalizes error snippets:
45
69
  * quoted strings, hex ids, paths, and digit runs collapse so "retry with a
46
70
  * tweaked flag/version/path" lands on the same approach bucket. */
@@ -87,8 +111,15 @@ export function classifyToolOutcome(toolName, input, result) {
87
111
  else {
88
112
  const exit = result.metadata?.exitCode;
89
113
  if (typeof exit === 'number' && exit !== 0) {
90
- // Non-zero exit is the primary, unambiguous failure signal.
91
- status = 'failed';
114
+ if (isBareProbeInfoExit(toolName, input, exit)) {
115
+ // Bare probe exit-1 (grep/test/[/diff/cmp with no match / false / differ,
116
+ // no chain) = INFORMATION, not a failure — do not feed the failure guards.
117
+ status = 'ok';
118
+ }
119
+ else {
120
+ // Non-zero exit is the primary, unambiguous failure signal.
121
+ status = 'failed';
122
+ }
92
123
  }
93
124
  else if (FAILURE_SIGNATURES.some((re) => re.test(content))) {
94
125
  // ShellTool's own failure marker present — trust it even when the overall
@@ -1 +1 @@
1
- {"version":3,"file":"toolOutcome.js","sourceRoot":"","sources":["../../src/training/toolOutcome.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"toolOutcome.js","sourceRoot":"","sources":["../../src/training/toolOutcome.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nexus-cortex/core",
3
- "version": "4.93.0",
3
+ "version": "4.95.0",
4
4
  "description": "Core orchestration library implementing Claude CLI architecture patterns",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -33,7 +33,7 @@
33
33
  },
34
34
  "scripts": {
35
35
  "build": "npm run clean && tsc && npm run copy-assets",
36
- "copy-assets": "mkdir -p dist/system-messages/messages && cp src/system-messages/*.json dist/system-messages/ && cp -r src/system-messages/messages/*.md dist/system-messages/messages/ && cp ../../.env.example ./.env.example",
36
+ "copy-assets": "mkdir -p dist/system-messages/messages && cp src/system-messages/*.json dist/system-messages/ && cp -r src/system-messages/messages/*.md dist/system-messages/messages/ && cp ../../.env.defaults ./.env.defaults",
37
37
  "clean": "rm -rf dist",
38
38
  "test": "vitest",
39
39
  "test:ci": "vitest run --coverage",
@@ -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.93.0",
51
- "@nexus-cortex/types": "4.93.0",
50
+ "@nexus-cortex/executors": "4.95.0",
51
+ "@nexus-cortex/types": "4.95.0",
52
52
  "@types/uuid": "^10.0.0",
53
53
  "ajv": "^8.12.0",
54
54
  "chokidar": "^3.6.0",
@@ -76,7 +76,7 @@
76
76
  "README.md",
77
77
  "LICENSE",
78
78
  "NOTICE",
79
- ".env.example"
79
+ ".env.defaults"
80
80
  ],
81
81
  "repository": {
82
82
  "type": "git",