@curie-agent/core 0.4.2 → 0.4.3

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 (42) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/src/compaction.d.ts +76 -0
  3. package/dist/src/compaction.d.ts.map +1 -0
  4. package/dist/src/compaction.js +229 -0
  5. package/dist/src/compaction.js.map +1 -0
  6. package/dist/src/context-budget.d.ts +72 -0
  7. package/dist/src/context-budget.d.ts.map +1 -0
  8. package/dist/src/context-budget.js +132 -0
  9. package/dist/src/context-budget.js.map +1 -0
  10. package/dist/src/event-bus.d.ts +20 -0
  11. package/dist/src/event-bus.d.ts.map +1 -1
  12. package/dist/src/event-bus.js.map +1 -1
  13. package/dist/src/index.d.ts +6 -3
  14. package/dist/src/index.d.ts.map +1 -1
  15. package/dist/src/index.js +4 -2
  16. package/dist/src/index.js.map +1 -1
  17. package/dist/src/settings.d.ts +13 -0
  18. package/dist/src/settings.d.ts.map +1 -1
  19. package/dist/src/settings.js +37 -12
  20. package/dist/src/settings.js.map +1 -1
  21. package/dist/src/subagent-executor.d.ts +8 -0
  22. package/dist/src/subagent-executor.d.ts.map +1 -1
  23. package/dist/src/subagent-executor.js +20 -6
  24. package/dist/src/subagent-executor.js.map +1 -1
  25. package/dist/src/turn-loop.d.ts +22 -2
  26. package/dist/src/turn-loop.d.ts.map +1 -1
  27. package/dist/src/turn-loop.js +222 -95
  28. package/dist/src/turn-loop.js.map +1 -1
  29. package/package.json +1 -1
  30. package/templates/settings.json +100 -91
  31. package/dist/src/cron-manager.d.ts +0 -92
  32. package/dist/src/cron-manager.d.ts.map +0 -1
  33. package/dist/src/cron-manager.js +0 -410
  34. package/dist/src/cron-manager.js.map +0 -1
  35. package/dist/src/task-executor.d.ts +0 -31
  36. package/dist/src/task-executor.d.ts.map +0 -1
  37. package/dist/src/task-executor.js +0 -91
  38. package/dist/src/task-executor.js.map +0 -1
  39. package/dist/src/token-monitor.d.ts +0 -50
  40. package/dist/src/token-monitor.d.ts.map +0 -1
  41. package/dist/src/token-monitor.js +0 -119
  42. package/dist/src/token-monitor.js.map +0 -1
@@ -0,0 +1,229 @@
1
+ import { summarizeToolInput } from './safety/tool-digest.js';
2
+ import { withMessageTimestamp } from './context.js';
3
+ import { estimateRequestTokens, clampCalibration, DEFAULT_CALIBRATION } from './context-budget.js';
4
+ /** Recent messages kept verbatim so the model retains its immediate working state. */
5
+ export const DEFAULT_MIN_TAIL_MESSAGES = 4;
6
+ /** Per-tool-result budget in the rendered transcript. */
7
+ const RESULT_SAMPLE_CHARS = 4000;
8
+ /** Output cap for the summarizer. The old 2048 could not hold a long research session. */
9
+ export const SUMMARY_MAX_TOKENS = 8192;
10
+ /**
11
+ * Share of the usable window a single summarizer prompt may occupy. Above this
12
+ * the transcript is summarized in chunks, then the chunk summaries are merged.
13
+ */
14
+ const TRANSCRIPT_BUDGET_FRACTION = 0.6;
15
+ /**
16
+ * Share of the usable window the kept tail may occupy. Leaves room for the
17
+ * summary, the system prompt, tool schemas and the next few tool results —
18
+ * otherwise compaction "succeeds" while leaving the history still over budget.
19
+ */
20
+ const TAIL_BUDGET_FRACTION = 0.3;
21
+ const SUMMARY_PREFIX = '[Summary of prior conversation]';
22
+ const SYSTEM_PROMPT = [
23
+ 'You are a conversation summarizer for a coding agent.',
24
+ 'Produce a dense, high-fidelity summary of the transcript below.',
25
+ 'Preserve: the original goals, what was accomplished, findings and conclusions reached,',
26
+ 'every file path / URL / command / identifier mentioned, decisions made and why,',
27
+ 'current configuration state, and the pending next steps.',
28
+ 'Tool results are the bulk of this transcript — carry their substance forward, not just',
29
+ 'the fact that a tool ran. Prefer concrete detail over narration.',
30
+ 'Output ONLY the summary text: no preamble, no sign-off, no meta-commentary.',
31
+ ].join(' ');
32
+ const MERGE_PROMPT = [
33
+ 'You are merging sequential partial summaries of one long conversation into a single summary.',
34
+ 'Preserve every concrete detail: file paths, URLs, commands, identifiers, findings, decisions,',
35
+ 'and pending next steps. Remove only redundancy between the parts.',
36
+ 'Output ONLY the merged summary text.',
37
+ ].join(' ');
38
+ function truncate(text, budget) {
39
+ if (text.length <= budget)
40
+ return text;
41
+ return `${text.slice(0, budget)}…[${String(text.length)} chars total]`;
42
+ }
43
+ /**
44
+ * Render the message history as readable dialogue, including tool calls and
45
+ * results. Tool inputs go through `summarizeToolInput`, which keeps
46
+ * safety-relevant fields (url, command, file_path, pattern) intact and reduces
47
+ * bulk fields to a head sample.
48
+ */
49
+ export function renderTranscript(messages) {
50
+ const parts = [];
51
+ const toolNameById = new Map();
52
+ for (const m of messages) {
53
+ if (m.role === 'user') {
54
+ parts.push(`User: ${m.content}`);
55
+ continue;
56
+ }
57
+ if (m.role === 'assistant') {
58
+ for (const block of m.content) {
59
+ if (block.type === 'text') {
60
+ if (block.text.trim())
61
+ parts.push(`Assistant: ${block.text}`);
62
+ }
63
+ else if (block.type === 'tool-use') {
64
+ toolNameById.set(block.id, block.name);
65
+ parts.push(`Assistant calls ${block.name}\n${summarizeToolInput(block.name, block.input)}`);
66
+ }
67
+ // Thinking blocks are deliberately omitted — they are the model's scratch
68
+ // space, already superseded by the text and tool calls they produced.
69
+ }
70
+ continue;
71
+ }
72
+ const name = m.toolName ?? toolNameById.get(m.toolUseId) ?? 'tool';
73
+ parts.push(`Result of ${name}: ${truncate(m.content, RESULT_SAMPLE_CHARS)}`);
74
+ }
75
+ return parts.join('\n\n');
76
+ }
77
+ /** Every tool-use id produced by the assistant messages in `slice`. */
78
+ function toolUseIds(slice) {
79
+ const ids = new Set();
80
+ for (const m of slice) {
81
+ if (m.role !== 'assistant')
82
+ continue;
83
+ for (const block of m.content) {
84
+ if (block.type === 'tool-use')
85
+ ids.add(block.id);
86
+ }
87
+ }
88
+ return ids;
89
+ }
90
+ /** Every tool-result id present in `slice`. */
91
+ function toolResultIds(slice) {
92
+ const ids = new Set();
93
+ for (const m of slice) {
94
+ if (m.role === 'tool')
95
+ ids.add(m.toolUseId);
96
+ }
97
+ return ids;
98
+ }
99
+ /**
100
+ * Is cutting before index `i` valid for the provider APIs?
101
+ *
102
+ * Anthropic and OpenAI both reject a `tool` message with no preceding
103
+ * `tool_use`, and a `tool_use` with no following result. Splitting mid-turn
104
+ * without this check turns a context overflow into a hard 400.
105
+ */
106
+ export function isSafeCut(messages, i) {
107
+ if (messages[i]?.role === 'tool')
108
+ return false;
109
+ const head = messages.slice(0, i);
110
+ const results = toolResultIds(head);
111
+ for (const id of toolUseIds(head)) {
112
+ if (!results.has(id))
113
+ return false;
114
+ }
115
+ return true;
116
+ }
117
+ /**
118
+ * Split into a head to summarize and a tail to keep verbatim, cutting only
119
+ * where the remaining history is still a valid request.
120
+ *
121
+ * Prefers keeping `minTailMessages`, but shrinks the tail — down to empty if
122
+ * necessary — to stay under `maxTailTokens`.
123
+ *
124
+ * Returns `[messages, []]` when no safe cut exists: everything is summarized.
125
+ */
126
+ export function splitAtSafeBoundary(messages, minTailMessages = DEFAULT_MIN_TAIL_MESSAGES, options = {}) {
127
+ const preferred = Math.max(1, messages.length - Math.max(0, minTailMessages));
128
+ const cut = (i) => [messages.slice(0, i), messages.slice(i)];
129
+ if (options.maxTailTokens !== undefined) {
130
+ // Walk forward from the preferred cut, shrinking the tail until it fits.
131
+ for (let i = preferred; i <= messages.length; i++) {
132
+ if (!isSafeCut(messages, i))
133
+ continue;
134
+ const tokens = estimateRequestTokens({ messages: messages.slice(i), calibration: options.calibration });
135
+ if (tokens <= options.maxTailTokens)
136
+ return cut(i);
137
+ }
138
+ }
139
+ for (let i = preferred; i >= 1; i--) {
140
+ if (isSafeCut(messages, i))
141
+ return cut(i);
142
+ }
143
+ return [[...messages], []];
144
+ }
145
+ /** The synthetic user message that carries a summary back into the history. */
146
+ export function buildSummaryMessage(summary, timestampMs) {
147
+ // Routed through withMessageTimestamp so live and reconstructed histories are
148
+ // byte-identical — that equality is what keeps the provider prompt cache warm.
149
+ return { role: 'user', content: withMessageTimestamp(`${SUMMARY_PREFIX}\n\n${summary}`, timestampMs) };
150
+ }
151
+ /** Split a transcript into chunks that each fit the summarizer's own budget. */
152
+ function chunkTranscript(transcript, maxChars) {
153
+ if (transcript.length <= maxChars)
154
+ return [transcript];
155
+ const chunks = [];
156
+ const paragraphs = transcript.split('\n\n');
157
+ let current = '';
158
+ for (const p of paragraphs) {
159
+ if (current && current.length + p.length + 2 > maxChars) {
160
+ chunks.push(current);
161
+ current = '';
162
+ }
163
+ // A single paragraph over budget (one huge tool result) is hard-split.
164
+ if (p.length > maxChars) {
165
+ if (current) {
166
+ chunks.push(current);
167
+ current = '';
168
+ }
169
+ for (let i = 0; i < p.length; i += maxChars)
170
+ chunks.push(p.slice(i, i + maxChars));
171
+ continue;
172
+ }
173
+ current = current ? `${current}\n\n${p}` : p;
174
+ }
175
+ if (current)
176
+ chunks.push(current);
177
+ return chunks;
178
+ }
179
+ export async function compactMessages(args) {
180
+ const { messages, provider, model, budget, signal } = args;
181
+ const estimatedTokensBefore = estimateRequestTokens({ messages, calibration: args.calibration });
182
+ const [head, tail] = splitAtSafeBoundary(messages, args.minTailMessages ?? DEFAULT_MIN_TAIL_MESSAGES, {
183
+ maxTailTokens: Math.floor(budget.usableTokens * TAIL_BUDGET_FRACTION),
184
+ calibration: args.calibration,
185
+ });
186
+ if (head.length === 0) {
187
+ throw new Error('Nothing to compact: no messages precede the protected tail.');
188
+ }
189
+ const transcript = renderTranscript(head);
190
+ if (!transcript.trim()) {
191
+ throw new Error('Nothing to compact: no conversational content found.');
192
+ }
193
+ // Budget the summarizer prompt in characters, using the same calibration the
194
+ // caller estimates with, so a huge transcript cannot itself overflow.
195
+ const maxPromptTokens = Math.floor(budget.usableTokens * TRANSCRIPT_BUDGET_FRACTION);
196
+ const charsPerToken = clampCalibration(args.calibration ?? DEFAULT_CALIBRATION);
197
+ const maxPromptChars = Math.max(4000, Math.floor(maxPromptTokens * charsPerToken));
198
+ const chunks = chunkTranscript(transcript, maxPromptChars);
199
+ const partials = [];
200
+ for (const [i, chunk] of chunks.entries()) {
201
+ const label = chunks.length > 1 ? ` (part ${String(i + 1)} of ${String(chunks.length)})` : '';
202
+ const text = await provider.check(`Summarize this conversation history${label}:\n\n${chunk}`, {
203
+ model, system: SYSTEM_PROMPT, signal, maxTokens: SUMMARY_MAX_TOKENS,
204
+ });
205
+ partials.push(text.trim());
206
+ }
207
+ let summary = partials.join('\n\n');
208
+ if (partials.length > 1) {
209
+ const merged = await provider.check(`Merge these ${String(partials.length)} partial summaries into one:\n\n${partials.map((p, i) => `--- Part ${String(i + 1)} ---\n${p}`).join('\n\n')}`, { model, system: MERGE_PROMPT, signal, maxTokens: SUMMARY_MAX_TOKENS });
210
+ if (merged.trim())
211
+ summary = merged.trim();
212
+ }
213
+ if (!summary) {
214
+ throw new Error('Compaction failed: the summarizer returned no text.');
215
+ }
216
+ const keptMessages = [...tail];
217
+ const estimatedTokensAfter = estimateRequestTokens({
218
+ messages: [buildSummaryMessage(summary, 0), ...keptMessages],
219
+ calibration: args.calibration,
220
+ });
221
+ return {
222
+ summary,
223
+ keptMessages,
224
+ summarizedMessageCount: head.length,
225
+ estimatedTokensBefore,
226
+ estimatedTokensAfter,
227
+ };
228
+ }
229
+ //# sourceMappingURL=compaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compaction.js","sourceRoot":"","sources":["../../src/compaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import { type AutoCompactConfig, type CurieSettings } from './settings.js';
2
+ import type { Message } from './turn-loop.js';
3
+ /**
4
+ * The single context accountant.
5
+ *
6
+ * Before this module there were three unconnected implementations: an inline
7
+ * chars/4 pre-flight gate in the turn loop that could only hard-abort, a
8
+ * post-run threshold check in the daemon that only ran between user prompts,
9
+ * and a fully-implemented `TokenMonitor` that was never instantiated outside
10
+ * its own test. They disagreed on every default. This is the only one now.
11
+ */
12
+ export interface ContextBudget {
13
+ /** Total context window for the active provider's model. */
14
+ windowTokens: number;
15
+ /** Headroom held back for the model's reply. */
16
+ reservedOutput: number;
17
+ /** windowTokens - reservedOutput. What the prompt may actually occupy. */
18
+ usableTokens: number;
19
+ }
20
+ export interface ToolDefinitionLike {
21
+ name: string;
22
+ description: string;
23
+ inputSchema: unknown;
24
+ }
25
+ /** Seed chars-per-token. Roughly right for English; corrected by `calibrate()`. */
26
+ export declare const DEFAULT_CALIBRATION = 4;
27
+ export type ContextStatus = 'ok' | 'warn' | 'suggest' | 'forced';
28
+ export declare function resolveBudget(settings: CurieSettings): ContextBudget;
29
+ export declare function messageChars(message: Message): number;
30
+ /**
31
+ * Character weight of the tool schemas. The previous estimator omitted these
32
+ * entirely — with ~15 built-ins plus MCP servers that is thousands of tokens
33
+ * the gate could not see.
34
+ */
35
+ export declare function toolDefinitionChars(tools: readonly ToolDefinitionLike[]): number;
36
+ /** Per-component character counts, so callers can attribute where context went. */
37
+ export interface ContextBreakdown {
38
+ system: number;
39
+ toolDefinitions: number;
40
+ conversation: number;
41
+ toolResults: number;
42
+ }
43
+ export declare function breakdownChars(args: {
44
+ system?: string;
45
+ messages: readonly Message[];
46
+ toolDefinitions?: readonly ToolDefinitionLike[];
47
+ }): ContextBreakdown;
48
+ export declare function clampCalibration(ratio: number): number;
49
+ /**
50
+ * Learn chars-per-token from a real usage report. A single hardcoded 4 is an
51
+ * English heuristic; Polish, CJK and code-heavy transcripts land well below it,
52
+ * which is how a run can be estimated at half its true size.
53
+ */
54
+ export declare function calibrate(charsSent: number, actualInputTokens: number): number;
55
+ export declare function estimateRequestTokens(args: {
56
+ system?: string;
57
+ messages: readonly Message[];
58
+ toolDefinitions?: readonly ToolDefinitionLike[];
59
+ calibration?: number;
60
+ }): number;
61
+ export declare function fillPct(estimatedTokens: number, budget: ContextBudget): number;
62
+ /**
63
+ * Map a fill percentage onto an action.
64
+ *
65
+ * `enabled: 'off'` silences everything, not just the forced tier. Previously it
66
+ * gated only forced compaction, so disabling auto-compaction still produced a
67
+ * stream of warnings the user had explicitly opted out of.
68
+ */
69
+ export declare function classify(pct: number, cfg?: Partial<AutoCompactConfig>): ContextStatus;
70
+ /** Human-readable token count: 900 → "900", 12400 → "12.4k", 1200000 → "1.2m". */
71
+ export declare function formatTokens(n: number): string;
72
+ //# sourceMappingURL=context-budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-budget.d.ts","sourceRoot":"","sources":["../../src/context-budget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAC7F,OAAO,KAAK,EAAkB,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9D;;;;;;;;GAQG;AAEH,MAAM,WAAW,aAAa;IAC5B,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,cAAc,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,mFAAmF;AACnF,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAoBrC,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEjE,wBAAgB,aAAa,CAAC,QAAQ,EAAE,aAAa,GAAG,aAAa,CAUpE;AAcD,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CASrD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,kBAAkB,EAAE,GAAG,MAAM,CAOhF;AAED,mFAAmF;AACnF,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAKD,wBAAgB,cAAc,CAAC,IAAI,EAAE;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;CACjD,GAAG,gBAAgB,CAanB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,MAAM,CAG9E;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,MAAM,CAIT;AAED,wBAAgB,OAAO,CAAC,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,CAG9E;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,aAAa,CAOrF;AAED,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAI9C"}
@@ -0,0 +1,132 @@
1
+ import { DEFAULT_SETTINGS } from './settings.js';
2
+ /** Seed chars-per-token. Roughly right for English; corrected by `calibrate()`. */
3
+ export const DEFAULT_CALIBRATION = 4;
4
+ /**
5
+ * Bounds on the learned chars-per-token ratio. Below 2 is denser than any real
6
+ * tokenizer; above 6 is sparser. Clamping keeps one anomalous `usage` event
7
+ * from poisoning every subsequent estimate.
8
+ */
9
+ const MIN_CALIBRATION = 2;
10
+ const MAX_CALIBRATION = 6;
11
+ /**
12
+ * The reserve may never exceed this share of the window. Without the clamp a
13
+ * default `max_output_tokens` of 65536 against the default 131072 window made
14
+ * half the context unusable and invisible.
15
+ */
16
+ const MAX_RESERVE_FRACTION = 0.25;
17
+ /** Fallback when a provider has no `max_output_tokens` configured. */
18
+ const FALLBACK_RESERVED_OUTPUT = 32768;
19
+ export function resolveBudget(settings) {
20
+ const provider = settings.providers[settings.current_provider];
21
+ const windowTokens = provider?.model_context_window
22
+ ?? DEFAULT_SETTINGS.providers[settings.current_provider]?.model_context_window
23
+ ?? DEFAULT_SETTINGS.providers.anthropic.model_context_window;
24
+ const requested = provider?.max_output_tokens ?? FALLBACK_RESERVED_OUTPUT;
25
+ const reservedOutput = Math.min(requested, Math.floor(windowTokens * MAX_RESERVE_FRACTION));
26
+ return { windowTokens, reservedOutput, usableTokens: windowTokens - reservedOutput };
27
+ }
28
+ /** Character weight of one assistant content block, counting only what is sent. */
29
+ function blockChars(block) {
30
+ switch (block.type) {
31
+ case 'text':
32
+ return block.text.length;
33
+ case 'thinking':
34
+ return block.thinking.length + block.signature.length;
35
+ case 'tool-use':
36
+ return block.name.length + JSON.stringify(block.input).length;
37
+ }
38
+ }
39
+ export function messageChars(message) {
40
+ switch (message.role) {
41
+ case 'user':
42
+ return message.content.length;
43
+ case 'tool':
44
+ return message.content.length + (message.toolName?.length ?? 0);
45
+ case 'assistant':
46
+ return message.content.reduce((sum, b) => sum + blockChars(b), 0);
47
+ }
48
+ }
49
+ /**
50
+ * Character weight of the tool schemas. The previous estimator omitted these
51
+ * entirely — with ~15 built-ins plus MCP servers that is thousands of tokens
52
+ * the gate could not see.
53
+ */
54
+ export function toolDefinitionChars(tools) {
55
+ let chars = 0;
56
+ for (const t of tools) {
57
+ chars += t.name.length + t.description.length;
58
+ chars += typeof t.inputSchema === 'string' ? t.inputSchema.length : JSON.stringify(t.inputSchema).length;
59
+ }
60
+ return chars;
61
+ }
62
+ /** Fixed overhead for request envelope, role markers and JSON structure. */
63
+ const ENVELOPE_CHARS = 200;
64
+ export function breakdownChars(args) {
65
+ let conversation = 0;
66
+ let toolResults = 0;
67
+ for (const m of args.messages) {
68
+ if (m.role === 'tool')
69
+ toolResults += messageChars(m);
70
+ else
71
+ conversation += messageChars(m);
72
+ }
73
+ return {
74
+ system: (args.system?.length ?? 0) + ENVELOPE_CHARS,
75
+ toolDefinitions: toolDefinitionChars(args.toolDefinitions ?? []),
76
+ conversation,
77
+ toolResults,
78
+ };
79
+ }
80
+ export function clampCalibration(ratio) {
81
+ if (!Number.isFinite(ratio) || ratio <= 0)
82
+ return DEFAULT_CALIBRATION;
83
+ return Math.min(MAX_CALIBRATION, Math.max(MIN_CALIBRATION, ratio));
84
+ }
85
+ /**
86
+ * Learn chars-per-token from a real usage report. A single hardcoded 4 is an
87
+ * English heuristic; Polish, CJK and code-heavy transcripts land well below it,
88
+ * which is how a run can be estimated at half its true size.
89
+ */
90
+ export function calibrate(charsSent, actualInputTokens) {
91
+ if (charsSent <= 0 || actualInputTokens <= 0)
92
+ return DEFAULT_CALIBRATION;
93
+ return clampCalibration(charsSent / actualInputTokens);
94
+ }
95
+ export function estimateRequestTokens(args) {
96
+ const b = breakdownChars(args);
97
+ const chars = b.system + b.toolDefinitions + b.conversation + b.toolResults;
98
+ return Math.ceil(chars / clampCalibration(args.calibration ?? DEFAULT_CALIBRATION));
99
+ }
100
+ export function fillPct(estimatedTokens, budget) {
101
+ if (budget.usableTokens <= 0)
102
+ return 100;
103
+ return Math.min(100, Math.round((estimatedTokens / budget.usableTokens) * 100));
104
+ }
105
+ /**
106
+ * Map a fill percentage onto an action.
107
+ *
108
+ * `enabled: 'off'` silences everything, not just the forced tier. Previously it
109
+ * gated only forced compaction, so disabling auto-compaction still produced a
110
+ * stream of warnings the user had explicitly opted out of.
111
+ */
112
+ export function classify(pct, cfg) {
113
+ const d = DEFAULT_SETTINGS.auto_compact;
114
+ if ((cfg?.enabled ?? d.enabled) === 'off')
115
+ return 'ok';
116
+ if (pct >= (cfg?.forced_threshold ?? d.forced_threshold))
117
+ return 'forced';
118
+ if (pct >= (cfg?.threshold ?? d.threshold))
119
+ return 'suggest';
120
+ if (pct >= (cfg?.warn_threshold ?? d.warn_threshold))
121
+ return 'warn';
122
+ return 'ok';
123
+ }
124
+ /** Human-readable token count: 900 → "900", 12400 → "12.4k", 1200000 → "1.2m". */
125
+ export function formatTokens(n) {
126
+ if (n >= 1_000_000)
127
+ return `${(n / 1_000_000).toFixed(1)}m`;
128
+ if (n >= 1_000)
129
+ return `${(n / 1_000).toFixed(1)}k`;
130
+ return String(Math.round(n));
131
+ }
132
+ //# sourceMappingURL=context-budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-budget.js","sourceRoot":"","sources":["../../src/context-budget.ts"],"names":[],"mappings":"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"}
@@ -99,6 +99,26 @@ export type Event = {
99
99
  id: string;
100
100
  message: string;
101
101
  timestamp: number;
102
+ } | {
103
+ type: 'compaction';
104
+ id: string;
105
+ summary: string;
106
+ summarizedMessageCount: number;
107
+ tokensBefore: number;
108
+ tokensAfter: number;
109
+ timestamp: number;
110
+ } | {
111
+ type: 'context-report';
112
+ id: string;
113
+ model: string;
114
+ windowTokens: number;
115
+ usedTokens: number;
116
+ reservedOutput: number;
117
+ breakdown: Array<{
118
+ label: string;
119
+ tokens: number;
120
+ }>;
121
+ timestamp: number;
102
122
  } | {
103
123
  type: 'agent-start';
104
124
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../src/event-bus.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../src/event-bus.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../src/event-bus.ts"],"names":[],"mappings":"AA+BA,SAAS,WAAW,CAAkB,MAAwB,EAAE,IAAe;IAC7E,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACzB,MAAM,EAAE,GAAG,CAAe,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC,CAAiB,CAAC;AACrB,CAAC;AAED,MAAM,OAAO,QAAQ;IACX,SAAS,GAAG,IAAI,GAAG,EAAkC,CAAC;IACtD,aAAa,GAAG,IAAI,GAAG,EAAkC,CAAC;IAC1D,QAAQ,GAAY,EAAE,CAAC;IAE/B,SAAS,CAAkB,IAAe,EAAE,EAAsB;QAChE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,GAAG,CAAC,EAAoB,CAAC,CAAC;QACpD,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAoB,CAAC,CAAC;IAC5D,CAAC;IAED,WAAW,CAAkB,IAAe,EAAE,EAAsB;QAClE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,EAAoB,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,CAAkB,IAAe,EAAE,EAAsB;QAC3D,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,GAAG,CAAC,EAAoB,CAAC,CAAC;QACxD,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,EAAoB,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,CAAkB,KAAQ;QAC5B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QAExB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAChD,EAAE,CAAC,KAAK,CAAC,CAAC;QACZ,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;gBACzB,EAAE,CAAC,KAAK,CAAC,CAAC;YACZ,CAAC;YACD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,MAAe;QACrB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;CACF"}
1
+ {"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../src/event-bus.ts"],"names":[],"mappings":"AAsCA,SAAS,WAAW,CAAkB,MAAwB,EAAE,IAAe;IAC7E,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACzB,MAAM,EAAE,GAAG,CAAe,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC,CAAiB,CAAC;AACrB,CAAC;AAED,MAAM,OAAO,QAAQ;IACX,SAAS,GAAG,IAAI,GAAG,EAAkC,CAAC;IACtD,aAAa,GAAG,IAAI,GAAG,EAAkC,CAAC;IAC1D,QAAQ,GAAY,EAAE,CAAC;IAE/B,SAAS,CAAkB,IAAe,EAAE,EAAsB;QAChE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,GAAG,CAAC,EAAoB,CAAC,CAAC;QACpD,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAoB,CAAC,CAAC;IAC5D,CAAC;IAED,WAAW,CAAkB,IAAe,EAAE,EAAsB;QAClE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,EAAoB,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,CAAkB,IAAe,EAAE,EAAsB;QAC3D,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,GAAG,CAAC,EAAoB,CAAC,CAAC;QACxD,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,EAAoB,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,CAAkB,KAAQ;QAC5B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QAExB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAChD,EAAE,CAAC,KAAK,CAAC,CAAC;QACZ,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;gBACzB,EAAE,CAAC,KAAK,CAAC,CAAC;YACZ,CAAC;YACD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,MAAe;QACrB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;CACF"}
@@ -4,7 +4,7 @@ export { SessionStore, ulid } from './session-store.js';
4
4
  export type { SessionInfo, SessionFile } from './session-store.js';
5
5
  export { PermissionEngine, PURE_TOOLS } from './permission.js';
6
6
  export type { ApprovalMode, PermissionRule, PermissionResult, PermissionDecision } from './permission.js';
7
- export { TurnLoop } from './turn-loop.js';
7
+ export { TurnLoop, reconstructMessagesFromEvents } from './turn-loop.js';
8
8
  export type { TurnLoopConfig, TurnLoopResult, ReasoningEffort, Message, AssistantBlock, ProviderStream, Tool, ProviderEvent } from './turn-loop.js';
9
9
  export { SettingsManager } from './settings.js';
10
10
  export type { CurieSettings } from './settings.js';
@@ -30,8 +30,11 @@ export { BatchTurnLoop } from './heartbeat-executor.js';
30
30
  export type { BatchResult } from './heartbeat-executor.js';
31
31
  export { SubagentExecutor } from './subagent-executor.js';
32
32
  export type { SubagentConfig, SubagentHandle } from './subagent-executor.js';
33
- export { TokenMonitor, parseTieredPricing, selectTier, estimateCost, type PriceTier } from './token-monitor.js';
34
- export type { TokenMonitorConfig, TokenEvent } from './token-monitor.js';
33
+ export { parseTieredPricing, selectTier, estimateCost, type PriceTier } from './pricing.js';
34
+ export { resolveBudget, estimateRequestTokens, breakdownChars, toolDefinitionChars, messageChars, fillPct, classify, calibrate, clampCalibration, formatTokens, DEFAULT_CALIBRATION, } from './context-budget.js';
35
+ export type { ContextBudget, ContextBreakdown, ContextStatus, ToolDefinitionLike } from './context-budget.js';
36
+ export { compactMessages, renderTranscript, splitAtSafeBoundary, isSafeCut, buildSummaryMessage, DEFAULT_MIN_TAIL_MESSAGES, SUMMARY_MAX_TOKENS, } from './compaction.js';
37
+ export type { CompactionResult, CompactMessagesArgs } from './compaction.js';
35
38
  export { withOsContext, withMessageTimestamp, formatDate } from './context.js';
36
39
  export { buildBaseSystemPrompt } from './identity-context.js';
37
40
  export { listSnapshots, revertTo, createSnapshot } from './safety/snapshot.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
package/dist/src/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  export { EventBus } from './event-bus.js';
2
2
  export { SessionStore, ulid } from './session-store.js';
3
3
  export { PermissionEngine, PURE_TOOLS } from './permission.js';
4
- export { TurnLoop } from './turn-loop.js';
4
+ export { TurnLoop, reconstructMessagesFromEvents } from './turn-loop.js';
5
5
  export { SettingsManager } from './settings.js';
6
6
  export { DEFAULT_SETTINGS } from './settings.js';
7
7
  export { TaskManager } from './task-manager.js';
@@ -17,7 +17,9 @@ export { pickNextSchedule, computeNextFire } from './unified-task.js';
17
17
  export { HeartbeatDelivery } from './heartbeat-delivery.js';
18
18
  export { BatchTurnLoop } from './heartbeat-executor.js';
19
19
  export { SubagentExecutor } from './subagent-executor.js';
20
- export { TokenMonitor, parseTieredPricing, selectTier, estimateCost } from './token-monitor.js';
20
+ export { parseTieredPricing, selectTier, estimateCost } from './pricing.js';
21
+ export { resolveBudget, estimateRequestTokens, breakdownChars, toolDefinitionChars, messageChars, fillPct, classify, calibrate, clampCalibration, formatTokens, DEFAULT_CALIBRATION, } from './context-budget.js';
22
+ export { compactMessages, renderTranscript, splitAtSafeBoundary, isSafeCut, buildSummaryMessage, DEFAULT_MIN_TAIL_MESSAGES, SUMMARY_MAX_TOKENS, } from './compaction.js';
21
23
  export { withOsContext, withMessageTimestamp, formatDate } from './context.js';
22
24
  export { buildBaseSystemPrompt } from './identity-context.js';
23
25
  export { listSnapshots, revertTo, createSnapshot } from './safety/snapshot.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE/D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACrG,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,YAAY,EAAkB,MAAM,oBAAoB,CAAC;AAEhH,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvG,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,gCAAgC,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAErH,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE/D,OAAO,EAAE,QAAQ,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAEzE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACrG,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,YAAY,EAAkB,MAAM,cAAc,CAAC;AAC5F,OAAO,EACL,aAAa,EAAE,qBAAqB,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,EACvF,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,EAAE,YAAY,EAAE,mBAAmB,GAClF,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,eAAe,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,SAAS,EAAE,mBAAmB,EACtF,yBAAyB,EAAE,kBAAkB,GAC9C,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvG,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,gCAAgC,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAErH,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -44,6 +44,8 @@ export interface AutoCompactConfig {
44
44
  threshold: number;
45
45
  warn_threshold: number;
46
46
  forced_threshold: number;
47
+ /** Model used to write compaction summaries. Empty = use the active model. */
48
+ model?: string;
47
49
  }
48
50
  export interface WikiConfig {
49
51
  path: string;
@@ -62,6 +64,8 @@ export interface CurieSettings {
62
64
  channels: ChannelsConfig;
63
65
  tools_per_call: number;
64
66
  websearch_per_call: number;
67
+ tools_per_run: number;
68
+ websearch_per_run: number;
65
69
  system_prompt_files: string[];
66
70
  brave_search_api_key: string;
67
71
  heartbeat: HeartbeatConfig;
@@ -91,6 +95,8 @@ export interface CurieSettings {
91
95
  MCP_SERVERS?: Record<string, unknown>;
92
96
  TOOLS_PER_CALL?: number;
93
97
  WEBSEARCH_PER_CALL?: number;
98
+ TOOLS_PER_RUN?: number;
99
+ WEBSEARCH_PER_RUN?: number;
94
100
  HEARTBEAT?: 'on' | 'off';
95
101
  HEARTBEAT_INTRADAY?: string;
96
102
  HEARTBEAT_DAILY?: string;
@@ -122,6 +128,13 @@ export declare class SettingsManager {
122
128
  load(): CurieSettings;
123
129
  save(): void;
124
130
  update(partial: Partial<CurieSettings>): CurieSettings;
131
+ /**
132
+ * Returns a deep clone. A shallow copy used to let callers mutate nested
133
+ * objects (`auto_compact`, `providers`, …) in place while top-level scalar
134
+ * writes were silently dropped by `save()` — the two behaved differently for
135
+ * no reason a caller could see. Mutating the result is now always a no-op;
136
+ * persist through `update()` / `setProviderKey()`.
137
+ */
125
138
  get(): CurieSettings;
126
139
  /** Get the currently active model name from provider config. */
127
140
  getActiveModel(): string;