maestro-agent-sdk 0.1.26 → 0.1.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -0
- package/dist/core/agent.d.ts +28 -0
- package/dist/core/agent.d.ts.map +1 -1
- package/dist/core/agent.js +2 -0
- package/dist/core/agent.js.map +1 -1
- package/dist/core/is-abort-error.d.ts +18 -0
- package/dist/core/is-abort-error.d.ts.map +1 -1
- package/dist/core/is-abort-error.js +34 -0
- package/dist/core/is-abort-error.js.map +1 -1
- package/dist/core/loop.d.ts.map +1 -1
- package/dist/core/loop.js +69 -14
- package/dist/core/loop.js.map +1 -1
- package/dist/core/tool-result-truncation.d.ts +34 -0
- package/dist/core/tool-result-truncation.d.ts.map +1 -0
- package/dist/core/tool-result-truncation.js +162 -0
- package/dist/core/tool-result-truncation.js.map +1 -0
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/memory/active-task-template.d.ts +7 -4
- package/dist/memory/active-task-template.d.ts.map +1 -1
- package/dist/memory/active-task-template.js +19 -4
- package/dist/memory/active-task-template.js.map +1 -1
- package/dist/memory/aux-model-map.d.ts +49 -0
- package/dist/memory/aux-model-map.d.ts.map +1 -0
- package/dist/memory/aux-model-map.js +103 -0
- package/dist/memory/aux-model-map.js.map +1 -0
- package/dist/memory/compressor.d.ts +34 -59
- package/dist/memory/compressor.d.ts.map +1 -1
- package/dist/memory/compressor.js +222 -89
- package/dist/memory/compressor.js.map +1 -1
- package/dist/platform/config.d.ts +5 -0
- package/dist/platform/config.d.ts.map +1 -1
- package/dist/platform/config.js +9 -0
- package/dist/platform/config.js.map +1 -1
- package/dist/platform/version.d.ts +1 -1
- package/dist/platform/version.js +1 -1
- package/dist/provider.d.ts +18 -6
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +71 -8
- package/dist/provider.js.map +1 -1
- package/dist/providers/codex-auth.d.ts +149 -0
- package/dist/providers/codex-auth.d.ts.map +1 -0
- package/dist/providers/codex-auth.js +332 -0
- package/dist/providers/codex-auth.js.map +1 -0
- package/dist/providers/codex-stream.d.ts +42 -0
- package/dist/providers/codex-stream.d.ts.map +1 -0
- package/dist/providers/codex-stream.js +330 -0
- package/dist/providers/codex-stream.js.map +1 -0
- package/dist/providers/codex-translators.d.ts +105 -0
- package/dist/providers/codex-translators.d.ts.map +1 -0
- package/dist/providers/codex-translators.js +244 -0
- package/dist/providers/codex-translators.js.map +1 -0
- package/dist/providers/codex.d.ts +145 -0
- package/dist/providers/codex.d.ts.map +1 -0
- package/dist/providers/codex.js +417 -0
- package/dist/providers/codex.js.map +1 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +25 -1
- package/dist/registry.js.map +1 -1
- package/dist/types.d.ts +24 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +17 -1
|
@@ -3,12 +3,28 @@ import { pruneMessages } from "../memory/prune.js";
|
|
|
3
3
|
import { estimateTokens } from "../memory/token-estimate.js";
|
|
4
4
|
import { logger } from "../platform/logger.js";
|
|
5
5
|
const compactorAntiThrash = new WeakMap();
|
|
6
|
-
/** A compaction that doesn't save at least this fraction of tokens is
|
|
7
|
-
* considered ineffective and counts toward backoff. */
|
|
8
6
|
const COMPACTOR_MIN_SAVINGS_RATIO = 0.1;
|
|
9
|
-
/** Two consecutive ineffective calls on the same array → bail out and just
|
|
10
|
-
* prune. */
|
|
11
7
|
const COMPACTOR_ANTI_THRASH_LIMIT = 2;
|
|
8
|
+
/** Sentinel user message that marks a compaction block pair.
|
|
9
|
+
* Uses NUL-bytes to make accidental user-content collision extremely unlikely. */
|
|
10
|
+
const COMPACTION_MARKER = "\x00maestro-compaction\x00";
|
|
11
|
+
/** Incremental summary update prompt. Restates the schema contract
|
|
12
|
+
* (same sections as ACTIVE_TASK_TEMPLATE) so aux output never drifts. */
|
|
13
|
+
function incrementalPrompt(previousSummary) {
|
|
14
|
+
return [
|
|
15
|
+
ACTIVE_TASK_TEMPLATE,
|
|
16
|
+
"",
|
|
17
|
+
"---",
|
|
18
|
+
"The conversation above has been partially summarized before.",
|
|
19
|
+
"Update the previous summary below by preserving still-true details,",
|
|
20
|
+
"removing stale details, and merging in new facts from the recent",
|
|
21
|
+
"conversation history above.",
|
|
22
|
+
"",
|
|
23
|
+
"<previous-summary>",
|
|
24
|
+
previousSummary,
|
|
25
|
+
"</previous-summary>",
|
|
26
|
+
].join("\n");
|
|
27
|
+
}
|
|
12
28
|
function defaultContextWindow() {
|
|
13
29
|
const env = process.env.MAESTRO_CONTEXT_WINDOW;
|
|
14
30
|
if (env) {
|
|
@@ -18,109 +34,164 @@ function defaultContextWindow() {
|
|
|
18
34
|
}
|
|
19
35
|
return 200_000;
|
|
20
36
|
}
|
|
37
|
+
function extractText(blocks) {
|
|
38
|
+
if (typeof blocks === "string")
|
|
39
|
+
return blocks;
|
|
40
|
+
if (Array.isArray(blocks)) {
|
|
41
|
+
return blocks
|
|
42
|
+
.filter((b) => b.type === "text")
|
|
43
|
+
.map((b) => b.text ?? "")
|
|
44
|
+
.join("\n");
|
|
45
|
+
}
|
|
46
|
+
return "";
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Returns true when a ProviderMessage's blocks contain at least one
|
|
50
|
+
* tool_result. Used by snap-helper to avoid cutting the wire at a
|
|
51
|
+
* tool_result user message that would orphan the preceding tool_use.
|
|
52
|
+
*/
|
|
53
|
+
function hasToolResultBlocks(msg) {
|
|
54
|
+
const content = msg.content;
|
|
55
|
+
if (typeof content === "string")
|
|
56
|
+
return false;
|
|
57
|
+
if (!Array.isArray(content))
|
|
58
|
+
return false;
|
|
59
|
+
return content.some((b) => b.type === "tool_result");
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Find the most recent compaction block pair in messages.
|
|
63
|
+
* Returns indices and the summary text, or undefined.
|
|
64
|
+
*/
|
|
65
|
+
function findLastCompaction(messages) {
|
|
66
|
+
for (let i = messages.length - 1; i >= 1; i--) {
|
|
67
|
+
const assistant = messages[i];
|
|
68
|
+
const user = messages[i - 1];
|
|
69
|
+
if (user.role === "user" &&
|
|
70
|
+
typeof user.content === "string" &&
|
|
71
|
+
user.content === COMPACTION_MARKER &&
|
|
72
|
+
assistant.role === "assistant" &&
|
|
73
|
+
typeof assistant.content === "string" &&
|
|
74
|
+
assistant.content.length > 0) {
|
|
75
|
+
return { userIdx: i - 1, assistantIdx: i, summary: assistant.content };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Collect indices of all compaction block pairs in messages.
|
|
82
|
+
*/
|
|
83
|
+
function compactionBlockIndices(messages) {
|
|
84
|
+
const indices = new Set();
|
|
85
|
+
for (let i = 0; i < messages.length - 1; i++) {
|
|
86
|
+
const user = messages[i];
|
|
87
|
+
const next = messages[i + 1];
|
|
88
|
+
if (user.role === "user" &&
|
|
89
|
+
typeof user.content === "string" &&
|
|
90
|
+
user.content === COMPACTION_MARKER &&
|
|
91
|
+
next.role === "assistant") {
|
|
92
|
+
indices.add(i);
|
|
93
|
+
indices.add(i + 1);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return indices;
|
|
97
|
+
}
|
|
98
|
+
// ─── public API ───────────────────────────────────────────────────────────
|
|
21
99
|
/**
|
|
22
100
|
* Run the auto-compaction pipeline.
|
|
23
101
|
*
|
|
24
102
|
* Steps:
|
|
25
|
-
* 1.
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
103
|
+
* 1. Prune (cheap: dedup, age-summary, truncate tool output).
|
|
104
|
+
* 2. Re-estimate tokens. If below threshold, return pruned.
|
|
105
|
+
* 3. Snap head/tail boundaries. If no middle, return pruned.
|
|
106
|
+
* 4. Find previous compaction blocks → extract last summary for
|
|
107
|
+
* incremental aux-LLM prompt.
|
|
108
|
+
* 5. Call aux LLM to summarize the middle. When a previous summary
|
|
109
|
+
* exists, only the *delta* after the last compaction
|
|
110
|
+
* (messages[assistantIdx+1 .. tailStart]) is sent to the aux LLM.
|
|
111
|
+
* 6. After the degenerate-savings guard, persist compaction user +
|
|
112
|
+
* summary assistant pair in the canonical `messages` array.
|
|
113
|
+
* 7. Return wire array: [head, wrapped-summary, tail].
|
|
33
114
|
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
115
|
+
* All wire head/tail boundaries are built from a compaction-stripped
|
|
116
|
+
* view of messages so the wire never leaks internal sentinels.
|
|
36
117
|
*/
|
|
37
118
|
export async function compressIfNeeded(messages, opts = {}) {
|
|
38
119
|
const contextWindow = opts.contextWindow ?? defaultContextWindow();
|
|
39
|
-
const triggerRatio = opts.triggerRatio ?? 0.
|
|
120
|
+
const triggerRatio = opts.triggerRatio ?? 0.6;
|
|
40
121
|
const headProtect = opts.headProtect ?? 2;
|
|
41
122
|
const tailProtect = opts.tailProtect ?? 6;
|
|
42
123
|
const auxModel = opts.auxModel;
|
|
43
|
-
//
|
|
44
|
-
// need at least `headProtect + 1 + tailProtect` messages to even slice a
|
|
45
|
-
// middle), AND at this size dedup/age-summary saves nothing (age threshold
|
|
46
|
-
// is 10 user-turns). Skipping the whole prune pipeline saves ~6 O(n) walks
|
|
47
|
-
// per turn during the first several iterations of every session — the
|
|
48
|
-
// exact window where the loop spends most of its short-conversation life.
|
|
49
|
-
// Trade-off: we forgo the cheap "string-content gets deduped immediately"
|
|
50
|
-
// win on duplicate tool results in the first few turns, but the model
|
|
51
|
-
// rarely re-issues an identical tool call inside a 9-message window.
|
|
124
|
+
// Fast-path: short conversations can't trigger compaction.
|
|
52
125
|
const minSize = headProtect + 1 + tailProtect;
|
|
53
126
|
if (messages.length < minSize) {
|
|
54
127
|
return messages;
|
|
55
128
|
}
|
|
56
|
-
//
|
|
57
|
-
// we're well under the trigger (≤ 50% of threshold) the conversation has
|
|
58
|
-
// nowhere near enough payload to need compaction, and prune's three passes
|
|
59
|
-
// wouldn't do anything an anti-thrash latch wouldn't catch on iteration 2.
|
|
60
|
-
// We skip prune entirely and return the input — same as the anti-thrash
|
|
61
|
-
// short-circuit, just gated on actual size rather than past behavior.
|
|
62
|
-
//
|
|
63
|
-
// 0.5 ratio picked empirically: at 200K window × 0.8 trigger × 0.5 gate =
|
|
64
|
-
// 80K tokens, which lands between "still actively gathering context" and
|
|
65
|
-
// "approaching compaction zone". Above the gate we run the full pipeline
|
|
66
|
-
// so an anti-thrash latch from earlier doesn't strand the loop without
|
|
67
|
-
// any pruning when the conversation actually grows large.
|
|
129
|
+
// Cheap pre-gate: skip prune when well under threshold.
|
|
68
130
|
const threshold = contextWindow * triggerRatio;
|
|
69
131
|
const rawTokens = estimateTokens(messages);
|
|
70
132
|
if (rawTokens < threshold * 0.5) {
|
|
71
133
|
return messages;
|
|
72
134
|
}
|
|
73
|
-
// Step 1: prune
|
|
135
|
+
// Step 1: prune.
|
|
74
136
|
const pruned = pruneMessages(messages);
|
|
75
137
|
const prunedTokens = estimateTokens(pruned);
|
|
76
138
|
if (prunedTokens < threshold) {
|
|
77
139
|
return pruned;
|
|
78
140
|
}
|
|
79
|
-
// Anti-thrash check
|
|
141
|
+
// Anti-thrash check.
|
|
80
142
|
const state = compactorAntiThrash.get(messages);
|
|
81
143
|
if (state && state.failedCompactions >= COMPACTOR_ANTI_THRASH_LIMIT) {
|
|
82
144
|
return pruned;
|
|
83
145
|
}
|
|
84
|
-
//
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
//
|
|
88
|
-
//
|
|
89
|
-
//
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
//
|
|
93
|
-
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
if (tailStart <= headEnd) {
|
|
97
|
-
// Snapping collapsed the middle — nothing left to compress.
|
|
146
|
+
// Step 4: find previous compaction for incremental prompt.
|
|
147
|
+
const prevCompaction = findLastCompaction(messages);
|
|
148
|
+
const previousSummary = prevCompaction?.summary;
|
|
149
|
+
// Build a compaction-free view of canonical messages for all wire
|
|
150
|
+
// boundary calculations (FIX #1: head/tail must never contain
|
|
151
|
+
// sentinel markers).
|
|
152
|
+
const skipIndices = compactionBlockIndices(messages);
|
|
153
|
+
const cleanMessages = messages.filter((_, i) => !skipIndices.has(i));
|
|
154
|
+
// Snap wire boundaries on the clean view.
|
|
155
|
+
const cleanHeadEnd = snapHeadEnd(cleanMessages, Math.min(headProtect, cleanMessages.length));
|
|
156
|
+
const cleanTailStart = snapTailStart(cleanMessages, Math.max(cleanMessages.length - tailProtect, 0));
|
|
157
|
+
if (cleanTailStart <= cleanHeadEnd) {
|
|
98
158
|
return pruned;
|
|
99
159
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
//
|
|
160
|
+
// Build middle for aux LLM.
|
|
161
|
+
// FIX #2: when a previous summary exists, limit the aux input to
|
|
162
|
+
// the *delta* after the last compaction (messages *including* the
|
|
163
|
+
// sentinel pair are canonical; the delta starts right after the
|
|
164
|
+
// summary assistant). Otherwise use the full clean middle.
|
|
165
|
+
let auxMiddle;
|
|
166
|
+
if (prevCompaction) {
|
|
167
|
+
// Delta: everything after the summary assistant up to (but not including) the tail.
|
|
168
|
+
const deltaStart = prevCompaction.assistantIdx + 1;
|
|
169
|
+
const deltaEnd = messages.length - tailProtect;
|
|
170
|
+
auxMiddle = messages.slice(deltaStart, Math.max(deltaStart, deltaEnd));
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
auxMiddle = cleanMessages.slice(cleanHeadEnd, cleanTailStart);
|
|
174
|
+
}
|
|
175
|
+
// Step 5: aux LLM call.
|
|
104
176
|
if (!opts.auxProvider) {
|
|
105
|
-
|
|
106
|
-
// (the agent loop passes its own provider). Without one we can't
|
|
107
|
-
// summarize — drop to pruned and log so the operator sees why.
|
|
108
|
-
logger.warn({ prunedTokens, threshold }, "compressIfNeeded: over threshold but no auxProvider supplied — falling back to prune-only");
|
|
177
|
+
logger.warn({ prunedTokens, threshold }, "compressIfNeeded: no auxProvider — prune-only");
|
|
109
178
|
return pruned;
|
|
110
179
|
}
|
|
111
180
|
if (!auxModel) {
|
|
112
|
-
|
|
113
|
-
// by default, so this branch only fires if a host calls compressIfNeeded
|
|
114
|
-
// directly without one. Same fallback as missing provider.
|
|
115
|
-
logger.warn({ prunedTokens, threshold }, "compressIfNeeded: over threshold but no auxModel supplied — falling back to prune-only");
|
|
181
|
+
logger.warn({ prunedTokens, threshold }, "compressIfNeeded: no auxModel — prune-only");
|
|
116
182
|
return pruned;
|
|
117
183
|
}
|
|
184
|
+
// FIX #4: incremental prompt now includes the full ACTIVE_TASK_TEMPLATE
|
|
185
|
+
// so the schema contract is restated every time.
|
|
186
|
+
const systemPrompt = previousSummary
|
|
187
|
+
? incrementalPrompt(previousSummary)
|
|
188
|
+
: ACTIVE_TASK_TEMPLATE;
|
|
118
189
|
let summaryText;
|
|
119
190
|
try {
|
|
120
191
|
const auxResponse = await opts.auxProvider.complete({
|
|
121
192
|
model: auxModel,
|
|
122
|
-
messages:
|
|
123
|
-
system:
|
|
193
|
+
messages: auxMiddle,
|
|
194
|
+
system: systemPrompt,
|
|
124
195
|
maxTokens: 2048,
|
|
125
196
|
...(opts.abortSignal ? { abortSignal: opts.abortSignal } : {}),
|
|
126
197
|
});
|
|
@@ -130,67 +201,129 @@ export async function compressIfNeeded(messages, opts = {}) {
|
|
|
130
201
|
}
|
|
131
202
|
}
|
|
132
203
|
catch (err) {
|
|
133
|
-
logger.warn({ err, prunedTokens, threshold }, "compressIfNeeded: aux LLM
|
|
204
|
+
logger.warn({ err, prunedTokens, threshold }, "compressIfNeeded: aux LLM failed");
|
|
134
205
|
if (opts.disablePruneFallback)
|
|
135
206
|
return messages;
|
|
136
|
-
|
|
207
|
+
const target = opts.emergencyTargetTokens;
|
|
208
|
+
const effectiveTarget = target !== undefined && Number.isFinite(target) && target > 0 ? target : 50_000;
|
|
209
|
+
if (target === 0)
|
|
210
|
+
return pruned;
|
|
211
|
+
const notice = "[메모리 압축 실패로 이전 대화 일부가 잘렸습니다. 최근 대화만 모델에 전달됨.]";
|
|
212
|
+
if (opts.onEmergencyTrim) {
|
|
213
|
+
try {
|
|
214
|
+
opts.onEmergencyTrim(notice);
|
|
215
|
+
}
|
|
216
|
+
catch (cbErr) {
|
|
217
|
+
logger.warn({ err: cbErr }, "onEmergencyTrim threw — swallowed");
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return emergencyTail(pruned, effectiveTarget, notice);
|
|
137
221
|
}
|
|
222
|
+
// Build wire from clean messages (FIX #1).
|
|
223
|
+
const head = cleanMessages.slice(0, cleanHeadEnd);
|
|
224
|
+
const tail = cleanMessages.slice(cleanTailStart);
|
|
138
225
|
const compacted = [
|
|
139
226
|
...head,
|
|
140
227
|
{ role: "user", content: wrapCompactedSummary(summaryText) },
|
|
141
228
|
...tail,
|
|
142
229
|
];
|
|
143
230
|
const compactedTokens = estimateTokens(compacted);
|
|
144
|
-
// Degenerate
|
|
145
|
-
// Discard and fall back to prune-only.
|
|
231
|
+
// Degenerate check — MUST run before persisting compaction blocks (FIX #3).
|
|
146
232
|
const savings = prunedTokens - compactedTokens;
|
|
147
233
|
const ratio = savings / prunedTokens;
|
|
148
234
|
if (ratio < COMPACTOR_MIN_SAVINGS_RATIO) {
|
|
149
235
|
const next = state ?? { failedCompactions: 0 };
|
|
150
236
|
next.failedCompactions++;
|
|
151
237
|
compactorAntiThrash.set(messages, next);
|
|
152
|
-
logger.info({
|
|
238
|
+
logger.info({
|
|
239
|
+
prunedTokens,
|
|
240
|
+
compactedTokens,
|
|
241
|
+
ratio,
|
|
242
|
+
failedCompactions: next.failedCompactions,
|
|
243
|
+
}, "compressIfNeeded: low savings — anti-thrash incremented");
|
|
153
244
|
return pruned;
|
|
154
245
|
}
|
|
155
|
-
//
|
|
246
|
+
// Step 6: persist compaction blocks AFTER savings gate (FIX #3).
|
|
247
|
+
if (prevCompaction) {
|
|
248
|
+
messages[prevCompaction.userIdx] = { role: "user", content: COMPACTION_MARKER };
|
|
249
|
+
messages[prevCompaction.assistantIdx] = { role: "assistant", content: summaryText };
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
messages.push({ role: "user", content: COMPACTION_MARKER });
|
|
253
|
+
messages.push({ role: "assistant", content: summaryText });
|
|
254
|
+
}
|
|
156
255
|
if (state)
|
|
157
256
|
compactorAntiThrash.delete(messages);
|
|
158
|
-
logger.info({
|
|
257
|
+
logger.info({
|
|
258
|
+
prunedTokens,
|
|
259
|
+
compactedTokens,
|
|
260
|
+
ratio,
|
|
261
|
+
incremental: !!previousSummary,
|
|
262
|
+
auxMiddleSize: auxMiddle.length,
|
|
263
|
+
}, "compressIfNeeded: applied compaction");
|
|
159
264
|
return compacted;
|
|
160
265
|
}
|
|
266
|
+
// ─── helpers ──────────────────────────────────────────────────────────────
|
|
161
267
|
/**
|
|
162
|
-
* Walk forward from `idealEnd` to land on
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
* so a pathological "all assistant" run can't push the head past the tail.
|
|
268
|
+
* Walk forward from `idealEnd` to land on a user message boundary.
|
|
269
|
+
* Skips user messages that are tool_result carriers (to avoid
|
|
270
|
+
* orphaning a preceding tool_use).
|
|
166
271
|
*/
|
|
167
272
|
function snapHeadEnd(messages, idealEnd) {
|
|
168
273
|
const cap = Math.min(messages.length, idealEnd + 4);
|
|
169
274
|
let i = Math.min(idealEnd, messages.length);
|
|
170
|
-
while (i < cap && messages[i] && messages[i].role !== "user")
|
|
275
|
+
while (i < cap && messages[i] && (messages[i].role !== "user" || hasToolResultBlocks(messages[i]))) {
|
|
171
276
|
i++;
|
|
277
|
+
}
|
|
172
278
|
return i;
|
|
173
279
|
}
|
|
174
280
|
/**
|
|
175
|
-
* Walk backward from `idealStart` until we land on a user
|
|
176
|
-
*
|
|
177
|
-
* `idealStart - 4` so the tail never grows unboundedly.
|
|
281
|
+
* Walk backward from `idealStart` until we land on a user message boundary.
|
|
282
|
+
* Skips user messages that are tool_result carriers (FIX #6).
|
|
178
283
|
*/
|
|
179
284
|
function snapTailStart(messages, idealStart) {
|
|
180
285
|
const floor = Math.max(0, idealStart - 4);
|
|
181
286
|
let i = Math.max(idealStart, 0);
|
|
182
|
-
while (i > floor &&
|
|
287
|
+
while (i > floor &&
|
|
288
|
+
messages[i] &&
|
|
289
|
+
(messages[i].role !== "user" || hasToolResultBlocks(messages[i]))) {
|
|
183
290
|
i--;
|
|
291
|
+
}
|
|
184
292
|
return i;
|
|
185
293
|
}
|
|
186
|
-
/**
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
294
|
+
/**
|
|
295
|
+
* Emergency tail-only trim — FIX #5: does NOT over-trim when the whole
|
|
296
|
+
* history fits inside targetTokens.
|
|
297
|
+
*/
|
|
298
|
+
function emergencyTail(messages, targetTokens, notice) {
|
|
299
|
+
if (messages.length === 0)
|
|
300
|
+
return messages;
|
|
301
|
+
let acc = 0;
|
|
302
|
+
let cut = messages.length; // marker: threshold never reached
|
|
303
|
+
let reachedThreshold = false;
|
|
304
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
305
|
+
acc += estimateTokens([messages[i]]);
|
|
306
|
+
if (acc >= targetTokens) {
|
|
307
|
+
cut = i;
|
|
308
|
+
reachedThreshold = true;
|
|
309
|
+
break;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
// FIX #5: if history fits entirely within target, return full history.
|
|
313
|
+
if (!reachedThreshold) {
|
|
314
|
+
return [{ role: "user", content: `<emergency-truncation>\n${notice}\n</emergency-truncation>` }, ...messages];
|
|
315
|
+
}
|
|
316
|
+
// Snap cut to a safe user message boundary.
|
|
317
|
+
while (cut < messages.length && messages[cut]?.role !== "user")
|
|
318
|
+
cut++;
|
|
319
|
+
if (cut >= messages.length)
|
|
320
|
+
cut = messages.length - 1;
|
|
321
|
+
while (cut > 0 && messages[cut]?.role !== "user")
|
|
322
|
+
cut--;
|
|
323
|
+
const tail = messages.slice(cut);
|
|
324
|
+
return [{ role: "user", content: `<emergency-truncation>\n${notice}\n</emergency-truncation>` }, ...tail];
|
|
192
325
|
}
|
|
193
|
-
|
|
326
|
+
/** Test-only: reset the compactor anti-thrash WeakMap entry for an array. */
|
|
194
327
|
export function __resetCompactorState(messages) {
|
|
195
328
|
compactorAntiThrash.delete(messages);
|
|
196
329
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compressor.js","sourceRoot":"","sources":["../../src/memory/compressor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"compressor.js","sourceRoot":"","sources":["../../src/memory/compressor.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,11 @@ export declare const MODEL_SONNET: string;
|
|
|
3
3
|
export declare const MODEL_OPUS: string;
|
|
4
4
|
export declare const MODEL_DEEPSEEK_V4_PRO: string;
|
|
5
5
|
export declare const MODEL_DEEPSEEK_V4_FLASH: string;
|
|
6
|
+
export declare const MODEL_CODEX_GPT5_5: string;
|
|
7
|
+
export declare const MODEL_CODEX_GPT5_4: string;
|
|
8
|
+
export declare const MODEL_CODEX_GPT5_4_MINI: string;
|
|
9
|
+
export declare const MODEL_CODEX_GPT5_3_CODEX: string;
|
|
10
|
+
export declare const MODEL_CODEX_GPT5_2: string;
|
|
6
11
|
export declare const FILE_TAG_REGEX: RegExp;
|
|
7
12
|
/** Returns `process.env` without `CLAUDECODE` so spawned subprocesses don't
|
|
8
13
|
* inherit a nested-claude-code detection flag from a parent harness. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/platform/config.ts"],"names":[],"mappings":"AAwBA,eAAO,MAAM,QAAQ,EAAE,MAEM,CAAC;AAK9B,eAAO,MAAM,YAAY,EAAE,MAA4B,CAAC;AACxD,eAAO,MAAM,UAAU,EAAE,MAA0B,CAAC;AAGpD,eAAO,MAAM,qBAAqB,EAAE,MAA0B,CAAC;AAC/D,eAAO,MAAM,uBAAuB,EAAE,MAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/platform/config.ts"],"names":[],"mappings":"AAwBA,eAAO,MAAM,QAAQ,EAAE,MAEM,CAAC;AAK9B,eAAO,MAAM,YAAY,EAAE,MAA4B,CAAC;AACxD,eAAO,MAAM,UAAU,EAAE,MAA0B,CAAC;AAGpD,eAAO,MAAM,qBAAqB,EAAE,MAA0B,CAAC;AAC/D,eAAO,MAAM,uBAAuB,EAAE,MAA4B,CAAC;AAMnE,eAAO,MAAM,kBAAkB,EAAE,MAAkB,CAAC;AACpD,eAAO,MAAM,kBAAkB,EAAE,MAAkB,CAAC;AACpD,eAAO,MAAM,uBAAuB,EAAE,MAAuB,CAAC;AAC9D,eAAO,MAAM,wBAAwB,EAAE,MAAwB,CAAC;AAChE,eAAO,MAAM,kBAAkB,EAAE,MAAkB,CAAC;AAEpD,eAAO,MAAM,cAAc,EAAE,MAAgC,CAAC;AAW9D;yEACyE;AACzE,wBAAgB,WAAW,IAAI,MAAM,CAAC,UAAU,CAI/C"}
|
package/dist/platform/config.js
CHANGED
|
@@ -30,6 +30,15 @@ export const MODEL_OPUS = "claude-opus-4-7";
|
|
|
30
30
|
// DeepSeek V4 (released 2026-04-24). OpenAI-compatible chat-completions API.
|
|
31
31
|
export const MODEL_DEEPSEEK_V4_PRO = "deepseek-v4-pro";
|
|
32
32
|
export const MODEL_DEEPSEEK_V4_FLASH = "deepseek-v4-flash";
|
|
33
|
+
// Codex Responses API (ChatGPT-backed OAuth). The endpoint only accepts a
|
|
34
|
+
// codex-issued whitelist of model slugs — these are the ones surfaced by the
|
|
35
|
+
// `/codex/models` endpoint as of 2026-05-23. Adding a new one: list it here
|
|
36
|
+
// AND in `MODEL_MAX_OUTPUT_TOKENS` / `ALIAS_MAP` if it deserves a short alias.
|
|
37
|
+
export const MODEL_CODEX_GPT5_5 = "gpt-5.5";
|
|
38
|
+
export const MODEL_CODEX_GPT5_4 = "gpt-5.4";
|
|
39
|
+
export const MODEL_CODEX_GPT5_4_MINI = "gpt-5.4-mini";
|
|
40
|
+
export const MODEL_CODEX_GPT5_3_CODEX = "gpt-5.3-codex";
|
|
41
|
+
export const MODEL_CODEX_GPT5_2 = "gpt-5.2";
|
|
33
42
|
export const FILE_TAG_REGEX = /\[FILE:(\/[^\]]+)\]/gi;
|
|
34
43
|
// Make sure DATA_DIR exists before any tool/skill code tries to readdir into
|
|
35
44
|
// it. Idempotent and best-effort — hosts that point this at a read-only
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/platform/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;;;;;;;;;;GAWG;AAEH,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;AAEvB,6EAA6E;AAC7E,0EAA0E;AAC1E,4EAA4E;AAC5E,uEAAuE;AACvE,4CAA4C;AAC5C,MAAM,CAAC,MAAM,QAAQ,GAAW,OAAO,CAAC,GAAG,CAAC,gBAAgB;IAC1D,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IACvC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAE9B,2EAA2E;AAC3E,0EAA0E;AAC1E,4BAA4B;AAC5B,MAAM,CAAC,MAAM,YAAY,GAAW,mBAAmB,CAAC;AACxD,MAAM,CAAC,MAAM,UAAU,GAAW,iBAAiB,CAAC;AAEpD,6EAA6E;AAC7E,MAAM,CAAC,MAAM,qBAAqB,GAAW,iBAAiB,CAAC;AAC/D,MAAM,CAAC,MAAM,uBAAuB,GAAW,mBAAmB,CAAC;AAEnE,MAAM,CAAC,MAAM,cAAc,GAAW,uBAAuB,CAAC;AAE9D,6EAA6E;AAC7E,wEAAwE;AACxE,wDAAwD;AACxD,IAAI,CAAC;IACH,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3C,CAAC;AAAC,MAAM,CAAC;IACP,yDAAyD;AAC3D,CAAC;AAED;yEACyE;AACzE,MAAM,UAAU,WAAW;IACzB,MAAM,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,OAAO,GAAG,CAAC,UAAU,CAAC;IACtB,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/platform/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;;;;;;;;;;GAWG;AAEH,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;AAEvB,6EAA6E;AAC7E,0EAA0E;AAC1E,4EAA4E;AAC5E,uEAAuE;AACvE,4CAA4C;AAC5C,MAAM,CAAC,MAAM,QAAQ,GAAW,OAAO,CAAC,GAAG,CAAC,gBAAgB;IAC1D,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IACvC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAE9B,2EAA2E;AAC3E,0EAA0E;AAC1E,4BAA4B;AAC5B,MAAM,CAAC,MAAM,YAAY,GAAW,mBAAmB,CAAC;AACxD,MAAM,CAAC,MAAM,UAAU,GAAW,iBAAiB,CAAC;AAEpD,6EAA6E;AAC7E,MAAM,CAAC,MAAM,qBAAqB,GAAW,iBAAiB,CAAC;AAC/D,MAAM,CAAC,MAAM,uBAAuB,GAAW,mBAAmB,CAAC;AAEnE,0EAA0E;AAC1E,6EAA6E;AAC7E,4EAA4E;AAC5E,+EAA+E;AAC/E,MAAM,CAAC,MAAM,kBAAkB,GAAW,SAAS,CAAC;AACpD,MAAM,CAAC,MAAM,kBAAkB,GAAW,SAAS,CAAC;AACpD,MAAM,CAAC,MAAM,uBAAuB,GAAW,cAAc,CAAC;AAC9D,MAAM,CAAC,MAAM,wBAAwB,GAAW,eAAe,CAAC;AAChE,MAAM,CAAC,MAAM,kBAAkB,GAAW,SAAS,CAAC;AAEpD,MAAM,CAAC,MAAM,cAAc,GAAW,uBAAuB,CAAC;AAE9D,6EAA6E;AAC7E,wEAAwE;AACxE,wDAAwD;AACxD,IAAI,CAAC;IACH,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3C,CAAC;AAAC,MAAM,CAAC;IACP,yDAAyD;AAC3D,CAAC;AAED;yEACyE;AACzE,MAAM,UAAU,WAAW;IACzB,MAAM,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,OAAO,GAAG,CAAC,UAAU,CAAC;IACtB,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/platform/version.js
CHANGED
package/dist/provider.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isAbortError } from "./core/is-abort-error.js";
|
|
1
|
+
import { isAbortError, isTimeoutError } from "./core/is-abort-error.js";
|
|
2
2
|
import type { Provider } from "./providers/base.js";
|
|
3
3
|
import type { AgentQueryOptions, UnifiedEvent } from "./types.js";
|
|
4
4
|
/**
|
|
@@ -191,10 +191,22 @@ export declare function applySkillAllowlist<T extends {
|
|
|
191
191
|
name: string;
|
|
192
192
|
}>(skills: T[], allowedSkills?: string[]): T[];
|
|
193
193
|
/**
|
|
194
|
-
* Pick the right provider adapter for a resolved model id.
|
|
195
|
-
*
|
|
196
|
-
*
|
|
197
|
-
*
|
|
194
|
+
* Pick the right provider adapter for a resolved model id.
|
|
195
|
+
*
|
|
196
|
+
* Dispatch table:
|
|
197
|
+
* - `gpt-5.*` / `gpt-4.*` / `o3` / `o4` → CodexResponsesProvider
|
|
198
|
+
* (ChatGPT-OAuth-backed Responses API at
|
|
199
|
+
* chatgpt.com/backend-api/codex; reads ~/.codex/auth.json).
|
|
200
|
+
* - `deepseek-*` → DeepseekProvider
|
|
201
|
+
* (DEEPSEEK_API_KEY env).
|
|
202
|
+
* - everything else (claude-*, custom full ids)
|
|
203
|
+
* → AnthropicProvider
|
|
204
|
+
* (ANTHROPIC_API_KEY env).
|
|
205
|
+
*
|
|
206
|
+
* Exported so tests / hosts can lock the dispatch shape independently of
|
|
207
|
+
* `maestroProvider`'s I/O. The codex match is prefix-based so hosts can ship
|
|
208
|
+
* new codex slugs (gpt-5.6, future tiers) without a dispatcher change — only
|
|
209
|
+
* the registry alias map needs updating.
|
|
198
210
|
*/
|
|
199
211
|
export declare function providerForModel(resolvedModel: string): Provider;
|
|
200
212
|
/**
|
|
@@ -227,5 +239,5 @@ export declare function pickHigherBudget(a: number | undefined, b: number | unde
|
|
|
227
239
|
* Exported for unit coverage — used internally by `maestroProvider`'s catch
|
|
228
240
|
* branch to distinguish a user-initiated abort from a real provider crash.
|
|
229
241
|
*/
|
|
230
|
-
export { isAbortError };
|
|
242
|
+
export { isAbortError, isTimeoutError };
|
|
231
243
|
//# sourceMappingURL=provider.d.ts.map
|
package/dist/provider.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAsBrE,OAAO,KAAK,EAAE,QAAQ,EAAyC,MAAM,kBAAkB,CAAC;AA0CxF,OAAO,KAAK,EAAE,iBAAiB,EAAc,YAAY,EAAE,MAAM,SAAS,CAAC;AAE3E;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,sBAAsB,QAA2B,CAAC;AAE/D,wBAAuB,eAAe,CAAC,IAAI,EAAE,iBAAiB,GAAG,cAAc,CAAC,YAAY,CAAC,CAylB5F;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAa1E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI/E;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,yBAAyB,EAAG,SAAkB,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAEjF;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAC5D,MAAM,EAAE,CAAC,EAAE,EACX,aAAa,CAAC,EAAE,MAAM,EAAE,GACvB,CAAC,EAAE,CAGL;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,QAAQ,CAQhE;AAwBD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAIjG;AAED;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC"}
|