@nexrall/code-core 1.4.25 → 1.4.27

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.
@@ -0,0 +1,45 @@
1
+ import type { Message } from '../types';
2
+ export interface StoredAgent {
3
+ id: string;
4
+ /**
5
+ * The agent type this ran as, or null for an unnamed (general-purpose) run.
6
+ *
7
+ * Stored so resumption can be re-authorised against the CURRENT permission
8
+ * rules. Without it, an id would be a permanent bypass of any deny rule added
9
+ * after the agent first ran.
10
+ */
11
+ agentName: string | null;
12
+ /** Full conversation: the sub-agent's own user/assistant/tool messages. */
13
+ messages: Message[];
14
+ /** The description shown in the UI, for `/agents --resumable` style listings. */
15
+ description: string;
16
+ createdAt: number;
17
+ updatedAt: number;
18
+ /**
19
+ * Monotonic touch counter, used for ordering instead of `updatedAt`.
20
+ *
21
+ * Date.now() has millisecond resolution and these operations take
22
+ * microseconds, so two agents touched in the same tick compare EQUAL and a
23
+ * stable sort silently falls back to insertion order — i.e. "most recent"
24
+ * would have been wrong exactly when several things happen at once, which is
25
+ * the normal case for parallel sub-tasks. The timestamps are kept because
26
+ * they are meaningful to humans; the ordering does not depend on them.
27
+ */
28
+ seq: number;
29
+ /** Rough JSON size, cached so the byte cap doesn't re-serialise on every write. */
30
+ bytes: number;
31
+ }
32
+ /** Store a finished sub-agent's transcript. Returns its resumable id. */
33
+ export declare function rememberAgent(agentName: string | null, description: string, messages: Message[]): string;
34
+ /** Append a resumed run's new messages to an existing agent. */
35
+ export declare function updateAgent(id: string, messages: Message[]): void;
36
+ export declare function getAgent(id: string): StoredAgent | undefined;
37
+ /** Newest first — the order a "which agents can I resume?" list wants. */
38
+ export declare function listAgents(): StoredAgent[];
39
+ /** Test seam. Not exported through index.ts's public surface by intent. */
40
+ export declare function _resetAgentRegistry(): void;
41
+ export declare const _limits: {
42
+ MAX_AGENTS: number;
43
+ MAX_TOTAL_BYTES: number;
44
+ };
45
+ //# sourceMappingURL=agentRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentRegistry.d.ts","sourceRoot":"","sources":["../../src/agent/agentRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AA8CxC,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX;;;;;;OAMG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,2EAA2E;IAC3E,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,iFAAiF;IACjF,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;;;;OASG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ,mFAAmF;IACnF,KAAK,EAAE,MAAM,CAAC;CACf;AA4CD,yEAAyE;AACzE,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,OAAO,EAAE,GAClB,MAAM,CAeR;AAED,gEAAgE;AAChE,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,CAYjE;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAE5D;AAED,0EAA0E;AAC1E,wBAAgB,UAAU,IAAI,WAAW,EAAE,CAE1C;AAED,2EAA2E;AAC3E,wBAAgB,mBAAmB,IAAI,IAAI,CAI1C;AAED,eAAO,MAAM,OAAO;;;CAAkC,CAAC"}
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports._limits = void 0;
4
+ exports.rememberAgent = rememberAgent;
5
+ exports.updateAgent = updateAgent;
6
+ exports.getAgent = getAgent;
7
+ exports.listAgents = listAgents;
8
+ exports._resetAgentRegistry = _resetAgentRegistry;
9
+ // ─── Resumable sub-agents ────────────────────────────────────────────────────
10
+ //
11
+ // A sub-agent normally starts with a blank slate: fresh context, no memory of a
12
+ // previous run. That is the whole point for one-shot research — but it makes
13
+ // follow-up work absurdly expensive. "Now also check the auth path" re-reads
14
+ // every file the last run already read, because the only way to add to a
15
+ // finished sub-task is to describe the whole job again from scratch.
16
+ //
17
+ // This registry keeps a completed sub-agent's transcript in memory so a later
18
+ // `task` call can continue it instead of restarting it. Claude Code does the
19
+ // same thing; the design decisions worth writing down are the ones about what
20
+ // NOT to do:
21
+ //
22
+ // • IN-MEMORY, process-lifetime only. Deliberately not written to disk. A
23
+ // transcript is unredacted tool output — file contents, command output,
24
+ // whatever a repo happens to contain. Persisting it would create a new
25
+ // durable copy of material the user never asked us to store, in a new place
26
+ // they would have to know to clean up. Losing resumability when the process
27
+ // exits is a much smaller cost than that.
28
+ //
29
+ // • BOUNDED, by entries and by bytes. A transcript is the largest object this
30
+ // process handles, and an agent loop that spawns sub-agents in a cycle would
31
+ // otherwise grow the heap until the CLI dies — a leak that shows up only in
32
+ // the longest sessions, i.e. the ones where losing work hurts most.
33
+ //
34
+ // • Resumption re-checks permission at the CALL SITE, not here. An id is a
35
+ // capability: if a rule denies `task(explorer)` after an explorer agent has
36
+ // already run, resuming by id must not hand that agent back. This module
37
+ // therefore stores the agent's NAME alongside its history, so the caller can
38
+ // re-evaluate the current rules against it. See runSubTask.
39
+ /** Max resumable agents kept alive. Oldest is evicted first. */
40
+ const MAX_AGENTS = 20;
41
+ /**
42
+ * Max total transcript bytes across all stored agents (~8 MB of JSON).
43
+ *
44
+ * Sized to comfortably hold a handful of long research runs while staying far
45
+ * below the point where it competes with the model context for memory. Eviction
46
+ * is by age, not by size, so one enormous transcript cannot pin out many small
47
+ * useful ones.
48
+ */
49
+ const MAX_TOTAL_BYTES = 8 * 1024 * 1024;
50
+ /**
51
+ * Insertion-ordered store. A Map is enough: Maps iterate in insertion order, so
52
+ * "oldest" is simply the first key, and re-inserting on update moves an entry to
53
+ * the back — giving LRU-by-touch for free without a second data structure.
54
+ */
55
+ const _agents = new Map();
56
+ let _counter = 0;
57
+ let _seq = 0;
58
+ function totalBytes() {
59
+ let n = 0;
60
+ for (const a of _agents.values())
61
+ n += a.bytes;
62
+ return n;
63
+ }
64
+ function evictUntilWithinLimits() {
65
+ while (_agents.size > MAX_AGENTS) {
66
+ const oldest = _agents.keys().next().value;
67
+ if (oldest === undefined)
68
+ break;
69
+ _agents.delete(oldest);
70
+ }
71
+ // Byte cap is checked second: an entry that is individually enormous should
72
+ // still be storable (it is the most expensive thing to recompute), but it
73
+ // must not drag the total past the cap alongside its neighbours.
74
+ while (totalBytes() > MAX_TOTAL_BYTES && _agents.size > 1) {
75
+ const oldest = _agents.keys().next().value;
76
+ if (oldest === undefined)
77
+ break;
78
+ _agents.delete(oldest);
79
+ }
80
+ }
81
+ function sizeOf(messages) {
82
+ try {
83
+ return JSON.stringify(messages).length;
84
+ }
85
+ catch {
86
+ // A transcript that cannot be serialised (cycles shouldn't happen, but a
87
+ // crash here would take down a completed sub-task's result) is treated as
88
+ // large so it gets evicted early rather than silently counted as free.
89
+ return MAX_TOTAL_BYTES;
90
+ }
91
+ }
92
+ /** Store a finished sub-agent's transcript. Returns its resumable id. */
93
+ function rememberAgent(agentName, description, messages) {
94
+ const id = `agent_${++_counter}`;
95
+ const now = Date.now();
96
+ _agents.set(id, {
97
+ id,
98
+ agentName,
99
+ description,
100
+ messages,
101
+ createdAt: now,
102
+ updatedAt: now,
103
+ seq: ++_seq,
104
+ bytes: sizeOf(messages),
105
+ });
106
+ evictUntilWithinLimits();
107
+ return id;
108
+ }
109
+ /** Append a resumed run's new messages to an existing agent. */
110
+ function updateAgent(id, messages) {
111
+ const existing = _agents.get(id);
112
+ if (!existing)
113
+ return;
114
+ existing.messages = messages;
115
+ existing.updatedAt = Date.now();
116
+ existing.seq = ++_seq;
117
+ existing.bytes = sizeOf(messages);
118
+ // Re-insert so this becomes the most recently used entry, protecting an
119
+ // actively-continued agent from being evicted by a burst of new one-shots.
120
+ _agents.delete(id);
121
+ _agents.set(id, existing);
122
+ evictUntilWithinLimits();
123
+ }
124
+ function getAgent(id) {
125
+ return _agents.get(id);
126
+ }
127
+ /** Newest first — the order a "which agents can I resume?" list wants. */
128
+ function listAgents() {
129
+ return [..._agents.values()].sort((a, b) => b.seq - a.seq);
130
+ }
131
+ /** Test seam. Not exported through index.ts's public surface by intent. */
132
+ function _resetAgentRegistry() {
133
+ _agents.clear();
134
+ _counter = 0;
135
+ _seq = 0;
136
+ }
137
+ exports._limits = { MAX_AGENTS, MAX_TOTAL_BYTES };
138
+ //# sourceMappingURL=agentRegistry.js.map
@@ -1,4 +1,24 @@
1
1
  import type { Message, AgentLoopOptions, EnvContext } from '../types';
2
+ /**
3
+ * Fingerprint one round's tool failures, for the repeated-failure runaway guard.
4
+ *
5
+ * Exported (with the limits) purely as a test seam: the guard's whole value is in the
6
+ * edge cases — that a DIFFERENT error each round must NOT trip it, that call order
7
+ * within a round is irrelevant, that a long error body doesn't make every occurrence
8
+ * look unique — and none of that is reachable without driving a live model loop.
9
+ *
10
+ * Sorted so parallel tool calls completing in a different order still compare equal;
11
+ * truncated because errors often embed a varying path or timestamp late in the string.
12
+ */
13
+ export declare function errorRoundSignature(errored: Array<{
14
+ name: string;
15
+ error: string;
16
+ }>): string;
17
+ /** Runaway-guard limits, exposed for tests. */
18
+ export declare const _stallLimits: {
19
+ STALL_LIMIT: number;
20
+ REPEAT_STALL_LIMIT: number;
21
+ };
2
22
  export declare function resolveMaxIterations(optionValue: number | undefined, settingsRaw: Record<string, unknown>): number;
3
23
  /**
4
24
  * Minimal concurrency gate. Hand-rolled rather than pulling in `p-limit` because
@@ -111,6 +131,15 @@ export interface ProgressLedger {
111
131
  tool: string;
112
132
  edits: number;
113
133
  }>;
134
+ /**
135
+ * DISTINCT paths ever touched, including any since evicted from `filesTouched`.
136
+ *
137
+ * The Map is bounded (see ledgerRecord), so `filesTouched.size` is a window, not a
138
+ * total. The preamble states "FILES CHANGED THIS SESSION (N)" as a fact the model
139
+ * reasons about, so N must not silently shrink when eviction kicks in on a very long
140
+ * run — that would tell the model less work happened than actually did.
141
+ */
142
+ filesTouchedTotal: number;
114
143
  verifications: Array<{
115
144
  cmd: string;
116
145
  ok: boolean;
@@ -121,6 +150,19 @@ export interface ProgressLedger {
121
150
  path: string;
122
151
  reason: string;
123
152
  }>;
153
+ /**
154
+ * TOTAL test-integrity findings ever recorded, including ones since trimmed.
155
+ *
156
+ * `testIntegrity` is a bounded window (older entries are spliced off once it grows
157
+ * past 2×LEDGER_MAX_NOTES), so its `.length` STOPS being a running total after the
158
+ * first trim. The one-shot nudge compares "how many findings exist" against "how
159
+ * many I've already surfaced", and comparing against a window that shrinks meant the
160
+ * count could never move ahead again — silently disabling the reward-hacking warning
161
+ * for the remainder of a long session, i.e. exactly when it matters most.
162
+ *
163
+ * This counter only ever increases, so it is a safe basis for that comparison.
164
+ */
165
+ testIntegrityTotal: number;
124
166
  /**
125
167
  * Monotonic mutation epoch: incremented on every successful source write. Two
126
168
  * verification runs sharing an epoch had NO edit between them, so a PASS↔FAIL
@@ -1 +1 @@
1
- {"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../src/agent/loop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EAMP,gBAAgB,EAChB,UAAU,EACX,MAAM,UAAU,CAAC;AAyKlB,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACnC,MAAM,CAWR;AAkED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAgBlF;AAuJD;;;;;;;;;;GAUG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI5B;AA4BD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,UAAU,UAAO,GAAG,MAAM,CAYjF;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAc,GAAG,MAAM,CAKtE;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAoBpE;AA8ND,oGAAoG;AACpG,wBAAgB,gBAAgB,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,CAE1E;AA8BD,kHAAkH;AAClH,wBAAgB,oBAAoB,IAAI;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAEzE;AAuBD,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAM7D;AAsBD,iFAAiF;AACjF,eAAO,MAAM,gBAAgB,aAA+G,CAAC;AAC7I;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,OAAO,CA8BrG;AAED,gGAAgG;AAChG,eAAO,MAAM,aAAa,QAA2J,CAAC;AAEtL;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAK5E;AAUD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAwBxD;AAoBD,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,aAAa,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClE,qFAAqF;IACrF,aAAa,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvD;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,YAAY,IAAI,cAAc,CAE7C;AAED,kFAAkF;AAClF,wBAAgB,YAAY,CAC1B,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC1C,EAAE,EAAE,OAAO,EACX,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI,CAoDN;AAED,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CA6B5D;AAmBD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,eAAe,SAAI,GAAG,MAAM,CAgCpF;AAsKD,gFAAgF;AAChF,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAE/D;AAED;;;;;;;;;GASG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,OAAO,EAAE,EACnB,IAAI,EAAE;IACJ,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,OAAO,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,GACA,OAAO,CAAC,OAAO,CAAC,CAqElB;AAID,wBAAsB,YAAY,CAChC,eAAe,EAAE,OAAO,EAAE,EAC1B,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,OAAO,EAAE,CAAC,CAyuBpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAqCtE"}
1
+ {"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../src/agent/loop.ts"],"names":[],"mappings":"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"}