@cortexkit/opencode-magic-context 0.32.2 → 0.32.4
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/dist/config/transform-mode.d.ts.map +1 -1
- package/dist/features/magic-context/compaction-marker.d.ts +2 -2
- package/dist/features/magic-context/compaction-marker.d.ts.map +1 -1
- package/dist/hooks/magic-context/compaction-marker-manager.d.ts +7 -15
- package/dist/hooks/magic-context/compaction-marker-manager.d.ts.map +1 -1
- package/dist/hooks/magic-context/ctx-reduce-availability.d.ts +1 -1
- package/dist/hooks/magic-context/ctx-reduce-availability.d.ts.map +1 -1
- package/dist/hooks/magic-context/event-resolvers.d.ts +12 -6
- package/dist/hooks/magic-context/event-resolvers.d.ts.map +1 -1
- package/dist/hooks/magic-context/inject-compartments.d.ts.map +1 -1
- package/dist/hooks/magic-context/m0-token-breakdown.d.ts +2 -0
- package/dist/hooks/magic-context/m0-token-breakdown.d.ts.map +1 -1
- package/dist/hooks/magic-context/rust-mode-transform.d.ts +3 -0
- package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
- package/dist/hooks/magic-context/shadow-sender.d.ts.map +1 -1
- package/dist/hooks/magic-context/tag-messages.d.ts +2 -0
- package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
- package/dist/hooks/magic-context/transform-context-state.d.ts +1 -1
- package/dist/hooks/magic-context/transform-context-state.d.ts.map +1 -1
- package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +11 -18
- package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
- package/dist/hooks/magic-context/transform.d.ts.map +1 -1
- package/dist/index.js +395 -174
- package/dist/plugin/rpc-handlers.d.ts +1 -0
- package/dist/plugin/rpc-handlers.d.ts.map +1 -1
- package/dist/shared/model-suggestion-retry.d.ts.map +1 -1
- package/dist/shared/subagent-runner.d.ts +4 -1
- package/dist/shared/subagent-runner.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/shared/model-suggestion-retry.test.ts +41 -1
- package/src/shared/model-suggestion-retry.ts +47 -26
- package/src/shared/subagent-runner.ts +4 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-handlers.d.ts","sourceRoot":"","sources":["../../src/plugin/rpc-handlers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAIzE,OAAO,EACH,KAAK,eAAe,IAAI,QAAQ,EAGnC,MAAM,mCAAmC,CAAC;AAc3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAQlF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAavF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,KAAK,EAAe,eAAe,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAUtF,MAAM,WAAW,iBAAiB;IAC9B,KAAK,CAAC,EAAE;QAAE,0BAA0B,CAAC,EAAE,MAAM,CAAC;QAAC,oBAAoB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/E,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAoHD,wBAAgB,oBAAoB,CAChC,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,qBAAqB,CAAC,EAAE,MAAM,EAK9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,YAAY,CAAC,EAAE,iBAAiB,GACjC,eAAe,
|
|
1
|
+
{"version":3,"file":"rpc-handlers.d.ts","sourceRoot":"","sources":["../../src/plugin/rpc-handlers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAIzE,OAAO,EACH,KAAK,eAAe,IAAI,QAAQ,EAGnC,MAAM,mCAAmC,CAAC;AAc3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAQlF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAavF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,KAAK,EAAe,eAAe,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAUtF,MAAM,WAAW,iBAAiB;IAC9B,KAAK,CAAC,EAAE;QAAE,0BAA0B,CAAC,EAAE,MAAM,CAAC;QAAC,oBAAoB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/E,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAoHD,wBAAgB,oBAAoB,CAChC,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,qBAAqB,CAAC,EAAE,MAAM,EAK9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,YAAY,CAAC,EAAE,iBAAiB,GACjC,eAAe,CA0TjB;AAED;gFACgF;AAChF,wBAAgB,+BAA+B,CAC3C,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,qBAAqB,CAAC,EAAE,MAAM,EAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,YAAY,CAAC,EAAE,iBAAiB,GACjC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAczB;AAED,wBAAgB,iBAAiB,CAC7B,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,qBAAqB,CAAC,EAAE,MAAM,EAC9B,YAAY,CAAC,EAAE,iBAAiB,GACjC,YAAY,CA0Kd;AA4BD;;GAEG;AACH,wBAAgB,mBAAmB,CAC/B,SAAS,EAAE,qBAAqB,EAChC,IAAI,EAAE;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC/C,GACF,IAAI,CAsPN"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-suggestion-retry.d.ts","sourceRoot":"","sources":["../../src/shared/model-suggestion-retry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAM7D,KAAK,MAAM,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAOtD,MAAM,MAAM,UAAU,GAAG;IACrB,KAAK,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACrB,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B,CAAC;
|
|
1
|
+
{"version":3,"file":"model-suggestion-retry.d.ts","sourceRoot":"","sources":["../../src/shared/model-suggestion-retry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAM7D,KAAK,MAAM,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAOtD,MAAM,MAAM,UAAU,GAAG;IACrB,KAAK,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACrB,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B,CAAC;AAWF,MAAM,WAAW,iBAAiB;IAC9B,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,YAAY,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,UAAU,EAAE,OAAO,CAAC;IACpB,iFAAiF;IACjF,aAAa,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,KAAK,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CACnD;AAED,MAAM,WAAW,kBAAkB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wFAAwF;IACxF,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;;;;;;;;;;;;;OAcG;IACH,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,2BAA2B,CAAC,OAAO,EAAE,UAAU,CAAE,SAAQ,kBAAkB;IACxF;;;;OAIG;IACH,WAAW,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAChF;;;OAGG;IACH,cAAc,EAAE,CACZ,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,iBAAiB,KACzB,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,0BAA0B,CAAC,OAAO,EAAE,UAAU;IAC3D,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,UAAU,CAAC;IACtB,OAAO,EAAE,iBAAiB,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACtB;AAiBD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,GAAG,IAAI,CA4C/E;AAuKD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,kCAAkC,CACpD,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,UAAU,EAChB,OAAO,GAAE,kBAAuB,GACjC,OAAO,CAAC,IAAI,CAAC,CAqFf;AAiBD;;;;;;;;;;;GAWG;AACH,wBAAsB,kCAAkC,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,EAClF,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,2BAA2B,CAAC,OAAO,EAAE,UAAU,CAAC,GAC1D,OAAO,CAAC,0BAA0B,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAqG1D"}
|
|
@@ -156,6 +156,7 @@ export type SubagentProgressEvent = {
|
|
|
156
156
|
* reported as `ok: false, reason: "no_assistant"` so callers can try fallback
|
|
157
157
|
* models instead of accepting an unusable success.
|
|
158
158
|
* - `reason`: failure category, one of:
|
|
159
|
+
* - `"invalid_prompt"`: a known zero-tool child was given no system prompt
|
|
159
160
|
* - `"timeout"`: hit `timeoutMs` before the child finished
|
|
160
161
|
* - `"abort"`: caller's `signal` was triggered
|
|
161
162
|
* - `"model_failed"`: every configured model + fallback returned an error
|
|
@@ -188,9 +189,11 @@ export type SubagentRunResult = {
|
|
|
188
189
|
meta?: Record<string, unknown>;
|
|
189
190
|
} | {
|
|
190
191
|
ok: false;
|
|
191
|
-
reason: "timeout" | "abort" | "model_failed" | "truncated" | "spawn_failed" | "non_zero_exit" | "no_assistant" | "parse_failed";
|
|
192
|
+
reason: "invalid_prompt" | "timeout" | "abort" | "model_failed" | "truncated" | "spawn_failed" | "non_zero_exit" | "no_assistant" | "parse_failed";
|
|
192
193
|
error: string;
|
|
193
194
|
durationMs: number;
|
|
195
|
+
/** True when the caller should retry the task rather than advance its schedule. */
|
|
196
|
+
transient?: boolean;
|
|
194
197
|
meta?: Record<string, unknown>;
|
|
195
198
|
};
|
|
196
199
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-runner.d.ts","sourceRoot":"","sources":["../../src/shared/subagent-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,WAAW,kBAAkB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IACjC;;;;;;;;;OASG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEnC;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAC;IAEpD,sGAAsG;IACtG,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,kBAAkB,CAAC,EACb,WAAW,GACX,kBAAkB,GAClB,YAAY,GACZ,SAAS,GACT,UAAU,GACV,oBAAoB,GACpB,QAAQ,GACR,SAAS,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3C,4BAA4B,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CAC5D;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,qBAAqB,GAC3B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACrE;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACtD;IACI,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;CACd,GACD;IACI,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;CACd,GACD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAErF
|
|
1
|
+
{"version":3,"file":"subagent-runner.d.ts","sourceRoot":"","sources":["../../src/shared/subagent-runner.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -6,7 +6,11 @@ import {
|
|
|
6
6
|
} from "./model-suggestion-retry";
|
|
7
7
|
|
|
8
8
|
type PromptCall = {
|
|
9
|
-
body: {
|
|
9
|
+
body: {
|
|
10
|
+
model?: { providerID: string; modelID: string };
|
|
11
|
+
system?: string;
|
|
12
|
+
[key: string]: unknown;
|
|
13
|
+
};
|
|
10
14
|
signal?: AbortSignal;
|
|
11
15
|
};
|
|
12
16
|
|
|
@@ -338,6 +342,42 @@ describe("promptSyncWithValidatedOutputRetry", () => {
|
|
|
338
342
|
expect(messages).toHaveBeenCalledTimes(1);
|
|
339
343
|
});
|
|
340
344
|
|
|
345
|
+
test("preserves body.system when a failed Pi-shaped attempt mutates its body", async () => {
|
|
346
|
+
const prompt = mock(async (args: PromptCall) => {
|
|
347
|
+
if (prompt.mock.calls.length === 1) {
|
|
348
|
+
// Reproduce a facade/SDK that consumes the request body before
|
|
349
|
+
// rejecting the primary model. The fallback must not inherit
|
|
350
|
+
// that mutation and spawn without its task prompt.
|
|
351
|
+
delete args.body.system;
|
|
352
|
+
throw new Error("primary failed");
|
|
353
|
+
}
|
|
354
|
+
return {};
|
|
355
|
+
});
|
|
356
|
+
const client = createClient(prompt);
|
|
357
|
+
const systemPrompt = "CLASSIFY_SYSTEM_PROMPT";
|
|
358
|
+
|
|
359
|
+
await promptSyncWithValidatedOutputRetry(
|
|
360
|
+
client,
|
|
361
|
+
{
|
|
362
|
+
path: { id: "ses-classify" },
|
|
363
|
+
body: {
|
|
364
|
+
agent: "dreamer-classifier",
|
|
365
|
+
system: systemPrompt,
|
|
366
|
+
parts: [{ type: "text", text: "classify" }],
|
|
367
|
+
},
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
fallbackModels: ["anthropic/claude-sonnet-4-6"],
|
|
371
|
+
fetchOutput: async () => "fallback-output",
|
|
372
|
+
validateOutput: (output: string) => output,
|
|
373
|
+
},
|
|
374
|
+
);
|
|
375
|
+
|
|
376
|
+
expect(prompt).toHaveBeenCalledTimes(2);
|
|
377
|
+
expect((prompt.mock.calls[0]?.[0] as PromptCall).body.system).toBeUndefined();
|
|
378
|
+
expect((prompt.mock.calls[1]?.[0] as PromptCall).body.system).toBe(systemPrompt);
|
|
379
|
+
});
|
|
380
|
+
|
|
341
381
|
test("empty first model tries the next fallback", async () => {
|
|
342
382
|
const prompt = mock(async () => ({}));
|
|
343
383
|
const messages = mock(async () =>
|
|
@@ -23,6 +23,15 @@ export type PromptArgs = {
|
|
|
23
23
|
[key: string]: unknown;
|
|
24
24
|
};
|
|
25
25
|
|
|
26
|
+
/**
|
|
27
|
+
* Keep a prompt body independent from SDK/client mutation. Some prompt facades
|
|
28
|
+
* normalize or consume request bodies while handling a failed attempt; fallback
|
|
29
|
+
* attempts must start from the original system prompt and request body every time.
|
|
30
|
+
*/
|
|
31
|
+
function copyPromptArgs(args: PromptArgs, body: PromptBody): PromptArgs {
|
|
32
|
+
return { ...args, body: { ...body } };
|
|
33
|
+
}
|
|
34
|
+
|
|
26
35
|
export interface PromptAttemptInfo {
|
|
27
36
|
/** Human-readable model label used in logs ("primary" or "provider/model"). */
|
|
28
37
|
label: string;
|
|
@@ -280,8 +289,13 @@ async function attemptOnce(
|
|
|
280
289
|
callContext: string,
|
|
281
290
|
label: string,
|
|
282
291
|
): Promise<void> {
|
|
292
|
+
// Keep this snapshot separate from the object passed to the client. A
|
|
293
|
+
// failed prompt facade may rewrite its request body before rejecting; the
|
|
294
|
+
// model-suggestion retry still needs the original system prompt.
|
|
295
|
+
const originalBody = { ...args.body };
|
|
296
|
+
const attemptArgs = copyPromptArgs(args, originalBody);
|
|
283
297
|
try {
|
|
284
|
-
await promptWithTimeout(client,
|
|
298
|
+
await promptWithTimeout(client, attemptArgs, timeoutMs, signal);
|
|
285
299
|
return;
|
|
286
300
|
} catch (error) {
|
|
287
301
|
// If non-retryable (abort, overflow, timeout), bubble up immediately.
|
|
@@ -289,7 +303,7 @@ async function attemptOnce(
|
|
|
289
303
|
if (isNonRetryable(error, signal)) throw error;
|
|
290
304
|
|
|
291
305
|
const suggestion = parseModelSuggestion(error);
|
|
292
|
-
if (!suggestion || !
|
|
306
|
+
if (!suggestion || !originalBody.model) {
|
|
293
307
|
// No suggestion available — caller's fallback loop will decide
|
|
294
308
|
// whether to try the next chain entry.
|
|
295
309
|
throw error;
|
|
@@ -302,16 +316,13 @@ async function attemptOnce(
|
|
|
302
316
|
|
|
303
317
|
await promptWithTimeout(
|
|
304
318
|
client,
|
|
305
|
-
{
|
|
306
|
-
...
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
providerID: suggestion.providerID,
|
|
311
|
-
modelID: suggestion.suggestion,
|
|
312
|
-
},
|
|
319
|
+
copyPromptArgs(args, {
|
|
320
|
+
...originalBody,
|
|
321
|
+
model: {
|
|
322
|
+
providerID: suggestion.providerID,
|
|
323
|
+
modelID: suggestion.suggestion,
|
|
313
324
|
},
|
|
314
|
-
},
|
|
325
|
+
}),
|
|
315
326
|
timeoutMs,
|
|
316
327
|
signal,
|
|
317
328
|
);
|
|
@@ -340,12 +351,17 @@ export async function promptSyncWithModelSuggestionRetry(
|
|
|
340
351
|
const timeoutMs = options.timeoutMs ?? 300_000;
|
|
341
352
|
const callContext = options.callContext ?? "subagent";
|
|
342
353
|
const fallbacks = options.fallbackModels ?? [];
|
|
354
|
+
// Snapshot the body before the first client call. The Pi facade and the
|
|
355
|
+
// OpenCode SDK both receive this same shape, and either may mutate it while
|
|
356
|
+
// handling a failed request. Fallbacks must never inherit that mutation.
|
|
357
|
+
const baseBody = { ...args.body };
|
|
358
|
+
const baseArgs = copyPromptArgs(args, baseBody);
|
|
343
359
|
|
|
344
360
|
// Attempt 0 = whatever the agent or explicit body.model resolves to.
|
|
345
361
|
// Subsequent attempts override body.model with each fallback in order.
|
|
346
362
|
const explicitPrimaryLabel =
|
|
347
|
-
|
|
348
|
-
? `${
|
|
363
|
+
baseBody.model?.providerID && baseBody.model.modelID
|
|
364
|
+
? `${baseBody.model.providerID}/${baseBody.model.modelID}`
|
|
349
365
|
: "primary";
|
|
350
366
|
|
|
351
367
|
let lastError: unknown = null;
|
|
@@ -353,7 +369,7 @@ export async function promptSyncWithModelSuggestionRetry(
|
|
|
353
369
|
try {
|
|
354
370
|
await attemptOnce(
|
|
355
371
|
client,
|
|
356
|
-
|
|
372
|
+
baseArgs,
|
|
357
373
|
timeoutMs,
|
|
358
374
|
options.signal,
|
|
359
375
|
callContext,
|
|
@@ -385,10 +401,10 @@ export async function promptSyncWithModelSuggestionRetry(
|
|
|
385
401
|
}
|
|
386
402
|
|
|
387
403
|
const label = `${parsed.providerID}/${parsed.modelID}`;
|
|
388
|
-
const attemptArgs
|
|
389
|
-
...
|
|
390
|
-
|
|
391
|
-
};
|
|
404
|
+
const attemptArgs = copyPromptArgs(baseArgs, {
|
|
405
|
+
...baseBody,
|
|
406
|
+
model: parsed,
|
|
407
|
+
});
|
|
392
408
|
|
|
393
409
|
try {
|
|
394
410
|
await attemptOnce(client, attemptArgs, timeoutMs, options.signal, callContext, label);
|
|
@@ -453,10 +469,15 @@ export async function promptSyncWithValidatedOutputRetry<TOutput, TValidated = T
|
|
|
453
469
|
const timeoutMs = options.timeoutMs ?? 300_000;
|
|
454
470
|
const callContext = options.callContext ?? "subagent";
|
|
455
471
|
const fallbacks = options.fallbackModels ?? [];
|
|
472
|
+
// Snapshot the body before the first client call. The Pi facade and the
|
|
473
|
+
// OpenCode SDK both receive this same shape, and either may mutate it while
|
|
474
|
+
// handling a failed request. Fallbacks must never inherit that mutation.
|
|
475
|
+
const baseBody = { ...args.body };
|
|
476
|
+
const baseArgs = copyPromptArgs(args, baseBody);
|
|
456
477
|
|
|
457
478
|
const explicitPrimaryLabel =
|
|
458
|
-
|
|
459
|
-
? `${
|
|
479
|
+
baseBody.model?.providerID && baseBody.model.modelID
|
|
480
|
+
? `${baseBody.model.providerID}/${baseBody.model.modelID}`
|
|
460
481
|
: "primary";
|
|
461
482
|
const totalAttempts = fallbacks.length + 1;
|
|
462
483
|
|
|
@@ -466,7 +487,7 @@ export async function promptSyncWithValidatedOutputRetry<TOutput, TValidated = T
|
|
|
466
487
|
try {
|
|
467
488
|
return await attemptAndValidate(
|
|
468
489
|
client,
|
|
469
|
-
|
|
490
|
+
baseArgs,
|
|
470
491
|
timeoutMs,
|
|
471
492
|
options.signal,
|
|
472
493
|
callContext,
|
|
@@ -475,7 +496,7 @@ export async function promptSyncWithValidatedOutputRetry<TOutput, TValidated = T
|
|
|
475
496
|
attemptIndex: 0,
|
|
476
497
|
isFallback: false,
|
|
477
498
|
totalAttempts,
|
|
478
|
-
model:
|
|
499
|
+
model: baseBody.model,
|
|
479
500
|
},
|
|
480
501
|
options,
|
|
481
502
|
);
|
|
@@ -501,10 +522,10 @@ export async function promptSyncWithValidatedOutputRetry<TOutput, TValidated = T
|
|
|
501
522
|
}
|
|
502
523
|
|
|
503
524
|
const label = `${parsed.providerID}/${parsed.modelID}`;
|
|
504
|
-
const attemptArgs
|
|
505
|
-
...
|
|
506
|
-
|
|
507
|
-
};
|
|
525
|
+
const attemptArgs = copyPromptArgs(baseArgs, {
|
|
526
|
+
...baseBody,
|
|
527
|
+
model: parsed,
|
|
528
|
+
});
|
|
508
529
|
const attempt: PromptAttemptInfo = {
|
|
509
530
|
label,
|
|
510
531
|
attemptIndex: i + 1,
|
|
@@ -159,6 +159,7 @@ export type SubagentProgressEvent =
|
|
|
159
159
|
* reported as `ok: false, reason: "no_assistant"` so callers can try fallback
|
|
160
160
|
* models instead of accepting an unusable success.
|
|
161
161
|
* - `reason`: failure category, one of:
|
|
162
|
+
* - `"invalid_prompt"`: a known zero-tool child was given no system prompt
|
|
162
163
|
* - `"timeout"`: hit `timeoutMs` before the child finished
|
|
163
164
|
* - `"abort"`: caller's `signal` was triggered
|
|
164
165
|
* - `"model_failed"`: every configured model + fallback returned an error
|
|
@@ -194,6 +195,7 @@ export type SubagentRunResult =
|
|
|
194
195
|
| {
|
|
195
196
|
ok: false;
|
|
196
197
|
reason:
|
|
198
|
+
| "invalid_prompt"
|
|
197
199
|
| "timeout"
|
|
198
200
|
| "abort"
|
|
199
201
|
| "model_failed"
|
|
@@ -204,6 +206,8 @@ export type SubagentRunResult =
|
|
|
204
206
|
| "parse_failed";
|
|
205
207
|
error: string;
|
|
206
208
|
durationMs: number;
|
|
209
|
+
/** True when the caller should retry the task rather than advance its schedule. */
|
|
210
|
+
transient?: boolean;
|
|
207
211
|
meta?: Record<string, unknown>;
|
|
208
212
|
};
|
|
209
213
|
|