ocmm 0.5.4 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.codex/agents/dw-builder.toml +1 -1
- package/.codex/agents/dw-clarifier.toml +1 -1
- package/.codex/agents/dw-code-search.toml +1 -1
- package/.codex/agents/dw-coding.toml +1 -1
- package/.codex/agents/dw-complex.toml +1 -1
- package/.codex/agents/dw-creative.toml +1 -1
- package/.codex/agents/dw-deep.toml +1 -1
- package/.codex/agents/dw-doc-search.toml +1 -1
- package/.codex/agents/dw-documenting.toml +1 -1
- package/.codex/agents/dw-explore.toml +1 -1
- package/.codex/agents/dw-frontend.toml +1 -1
- package/.codex/agents/dw-hard-reasoning.toml +1 -1
- package/.codex/agents/dw-media-reader.toml +1 -1
- package/.codex/agents/dw-normal-task.toml +1 -1
- package/.codex/agents/dw-oracle-2nd.toml +8 -0
- package/.codex/agents/dw-oracle.toml +1 -1
- package/.codex/agents/dw-orchestrator.toml +1 -1
- package/.codex/agents/dw-plan-critic.toml +1 -1
- package/.codex/agents/dw-planner.toml +1 -1
- package/.codex/agents/dw-quick.toml +1 -1
- package/.codex/agents/dw-research.toml +1 -1
- package/.codex/agents/dw-reviewer.toml +1 -1
- package/README.md +158 -13
- package/dist/cli/shim.d.ts +4 -2
- package/dist/cli/shim.js +26 -11
- package/dist/cli/shim.js.map +1 -1
- package/dist/codex/plugin-generator.js +82 -56
- package/dist/codex/plugin-generator.js.map +1 -1
- package/dist/config/load.d.ts +32 -23
- package/dist/config/load.js +384 -90
- package/dist/config/load.js.map +1 -1
- package/dist/config/merge.d.ts +18 -0
- package/dist/config/merge.js +46 -0
- package/dist/config/merge.js.map +1 -0
- package/dist/config/normalize.d.ts +1 -0
- package/dist/config/normalize.js +22 -16
- package/dist/config/normalize.js.map +1 -1
- package/dist/config/profile-aliases.d.ts +12 -0
- package/dist/config/profile-aliases.js +127 -0
- package/dist/config/profile-aliases.js.map +1 -0
- package/dist/config/profile-types.d.ts +13 -0
- package/dist/config/profile-types.js +2 -0
- package/dist/config/profile-types.js.map +1 -0
- package/dist/config/review-agent-migration.d.ts +89 -0
- package/dist/config/review-agent-migration.js +237 -0
- package/dist/config/review-agent-migration.js.map +1 -0
- package/dist/config/schema.d.ts +1364 -222
- package/dist/config/schema.js +169 -37
- package/dist/config/schema.js.map +1 -1
- package/dist/config/tolerant-parse.d.ts +41 -0
- package/dist/config/tolerant-parse.js +164 -0
- package/dist/config/tolerant-parse.js.map +1 -0
- package/dist/data/agents.d.ts +1 -1
- package/dist/data/agents.js +7 -7
- package/dist/data/agents.js.map +1 -1
- package/dist/hooks/chat-params.d.ts +2 -0
- package/dist/hooks/chat-params.js +113 -4
- package/dist/hooks/chat-params.js.map +1 -1
- package/dist/hooks/config.d.ts +14 -2
- package/dist/hooks/config.js +538 -60
- package/dist/hooks/config.js.map +1 -1
- package/dist/hooks/event.d.ts +3 -11
- package/dist/hooks/event.js +5 -9
- package/dist/hooks/event.js.map +1 -1
- package/dist/index.js +21 -14
- package/dist/index.js.map +1 -1
- package/dist/permissions/index.d.ts +3 -0
- package/dist/permissions/index.js +43 -28
- package/dist/permissions/index.js.map +1 -1
- package/dist/review-agents/expand.d.ts +36 -0
- package/dist/review-agents/expand.js +157 -0
- package/dist/review-agents/expand.js.map +1 -0
- package/dist/review-agents/names.d.ts +16 -0
- package/dist/review-agents/names.js +55 -0
- package/dist/review-agents/names.js.map +1 -0
- package/dist/routing/effective-route.d.ts +19 -0
- package/dist/routing/effective-route.js +133 -0
- package/dist/routing/effective-route.js.map +1 -0
- package/dist/routing/model-upgrades.d.ts +5 -0
- package/dist/routing/model-upgrades.js +59 -12
- package/dist/routing/model-upgrades.js.map +1 -1
- package/dist/routing/resolver.d.ts +8 -1
- package/dist/routing/resolver.js +29 -9
- package/dist/routing/resolver.js.map +1 -1
- package/dist/routing/route-registry.d.ts +13 -0
- package/dist/routing/route-registry.js +84 -0
- package/dist/routing/route-registry.js.map +1 -0
- package/dist/runtime-fallback/dispatcher.d.ts +1 -0
- package/dist/runtime-fallback/dispatcher.js +7 -5
- package/dist/runtime-fallback/dispatcher.js.map +1 -1
- package/dist/runtime-fallback/error-classifier.d.ts +3 -1
- package/dist/runtime-fallback/error-classifier.js +135 -1
- package/dist/runtime-fallback/error-classifier.js.map +1 -1
- package/dist/runtime-fallback/event-handler-generic-fallback.d.ts +26 -0
- package/dist/runtime-fallback/event-handler-generic-fallback.js +54 -0
- package/dist/runtime-fallback/event-handler-generic-fallback.js.map +1 -0
- package/dist/runtime-fallback/event-handler-idle-continuation.d.ts +9 -0
- package/dist/runtime-fallback/event-handler-idle-continuation.js +48 -0
- package/dist/runtime-fallback/event-handler-idle-continuation.js.map +1 -0
- package/dist/runtime-fallback/event-handler-support.d.ts +39 -0
- package/dist/runtime-fallback/event-handler-support.js +194 -0
- package/dist/runtime-fallback/event-handler-support.js.map +1 -0
- package/dist/runtime-fallback/event-handler-test-fixtures.d.ts +874 -0
- package/dist/runtime-fallback/event-handler-test-fixtures.js +150 -0
- package/dist/runtime-fallback/event-handler-test-fixtures.js.map +1 -0
- package/dist/runtime-fallback/event-handler.d.ts +13 -1
- package/dist/runtime-fallback/event-handler.js +334 -192
- package/dist/runtime-fallback/event-handler.js.map +1 -1
- package/dist/runtime-fallback/fallback-state.d.ts +8 -5
- package/dist/runtime-fallback/fallback-state.js +9 -6
- package/dist/runtime-fallback/fallback-state.js.map +1 -1
- package/dist/runtime-fallback/index.d.ts +21 -1
- package/dist/runtime-fallback/index.js +7 -1
- package/dist/runtime-fallback/index.js.map +1 -1
- package/dist/runtime-fallback/interruption-output-adapter.d.ts +7 -0
- package/dist/runtime-fallback/interruption-output-adapter.js +91 -0
- package/dist/runtime-fallback/interruption-output-adapter.js.map +1 -0
- package/dist/runtime-fallback/subagent-429-controller-fixture.d.ts +105 -0
- package/dist/runtime-fallback/subagent-429-controller-fixture.js +116 -0
- package/dist/runtime-fallback/subagent-429-controller-fixture.js.map +1 -0
- package/dist/runtime-fallback/subagent-429-controller.d.ts +167 -0
- package/dist/runtime-fallback/subagent-429-controller.js +334 -0
- package/dist/runtime-fallback/subagent-429-controller.js.map +1 -0
- package/dist/runtime-fallback/subagent-429-policy.d.ts +13 -0
- package/dist/runtime-fallback/subagent-429-policy.js +37 -0
- package/dist/runtime-fallback/subagent-429-policy.js.map +1 -0
- package/dist/runtime-fallback/subagent-429-session.d.ts +48 -0
- package/dist/runtime-fallback/subagent-429-session.js +316 -0
- package/dist/runtime-fallback/subagent-429-session.js.map +1 -0
- package/dist/shared/opencode-events.d.ts +22 -0
- package/dist/shared/opencode-events.js +75 -0
- package/dist/shared/opencode-events.js.map +1 -0
- package/dist/shared/types.d.ts +12 -1
- package/package.json +1 -1
- package/plugins/deepwork/.codex-plugin/plugin.json +1 -1
- package/plugins/deepwork/README.md +2 -1
- package/plugins/deepwork/agents/dw-builder.toml +1 -1
- package/plugins/deepwork/agents/dw-clarifier.toml +1 -1
- package/plugins/deepwork/agents/dw-code-search.toml +1 -1
- package/plugins/deepwork/agents/dw-coding.toml +1 -1
- package/plugins/deepwork/agents/dw-complex.toml +1 -1
- package/plugins/deepwork/agents/dw-creative.toml +1 -1
- package/plugins/deepwork/agents/dw-deep.toml +1 -1
- package/plugins/deepwork/agents/dw-doc-search.toml +1 -1
- package/plugins/deepwork/agents/dw-documenting.toml +1 -1
- package/plugins/deepwork/agents/dw-explore.toml +1 -1
- package/plugins/deepwork/agents/dw-frontend.toml +1 -1
- package/plugins/deepwork/agents/dw-hard-reasoning.toml +1 -1
- package/plugins/deepwork/agents/dw-media-reader.toml +1 -1
- package/plugins/deepwork/agents/dw-normal-task.toml +1 -1
- package/plugins/deepwork/agents/dw-oracle-2nd.toml +8 -0
- package/plugins/deepwork/agents/dw-oracle.toml +1 -1
- package/plugins/deepwork/agents/dw-orchestrator.toml +1 -1
- package/plugins/deepwork/agents/dw-plan-critic.toml +1 -1
- package/plugins/deepwork/agents/dw-planner.toml +1 -1
- package/plugins/deepwork/agents/dw-quick.toml +1 -1
- package/plugins/deepwork/agents/dw-research.toml +1 -1
- package/plugins/deepwork/agents/dw-reviewer.toml +1 -1
- package/plugins/deepwork/dist/cli/shim.d.ts +4 -2
- package/plugins/deepwork/dist/cli/shim.js +26 -11
- package/plugins/deepwork/dist/cli/shim.js.map +1 -1
- package/plugins/deepwork/dist/shared/opencode-events.d.ts +22 -0
- package/plugins/deepwork/dist/shared/opencode-events.js +75 -0
- package/plugins/deepwork/dist/shared/opencode-events.js.map +1 -0
- package/plugins/deepwork/dist/shared/types.d.ts +12 -1
- package/plugins/deepwork/package.json +1 -1
- package/plugins/deepwork/skills/deepwork/SKILL.md +30 -14
- package/plugins/deepwork/skills/deepwork-requesting-code-review/SKILL.md +53 -31
- package/plugins/deepwork/skills/deepwork-requesting-code-review/code-reviewer.md +11 -7
- package/plugins/deepwork/skills/deepwork-subagent-driven-development/SKILL.md +28 -19
- package/plugins/deepwork/skills/deepwork-subagent-driven-development/implementer-prompt.md +10 -3
- package/prompts/codex/agents/clarifier.md +4 -0
- package/prompts/codex/agents/orchestrator.md +12 -2
- package/prompts/codex/agents/plan-critic.md +4 -0
- package/prompts/codex/agents/planner.md +15 -10
- package/prompts/codex/agents/reviewer.md +8 -2
- package/prompts/codex/deepwork/gpt-5.6.md +20 -37
- package/prompts/omo/agents/clarifier.md +4 -0
- package/prompts/omo/agents/orchestrator.md +11 -0
- package/prompts/omo/agents/plan-critic.md +4 -0
- package/prompts/omo/agents/planner.md +15 -3
- package/prompts/omo/agents/reviewer.md +8 -2
- package/prompts/omo/deepwork/gpt-5.6.md +20 -37
- package/prompts/v1/agents/clarifier.md +4 -0
- package/prompts/v1/agents/orchestrator.md +12 -2
- package/prompts/v1/agents/plan-critic.md +4 -0
- package/prompts/v1/agents/planner.md +15 -10
- package/prompts/v1/agents/reviewer.md +8 -2
- package/prompts/v1/deepwork/gpt-5.6.md +20 -37
- package/skills/v1/requesting-code-review/SKILL.md +53 -31
- package/skills/v1/requesting-code-review/code-reviewer.md +11 -7
- package/skills/v1/subagent-driven-development/SKILL.md +28 -19
- package/skills/v1/subagent-driven-development/implementer-prompt.md +10 -3
- package/.codex/agents/dw-oracle-high.toml +0 -8
- package/plugins/deepwork/agents/dw-oracle-high.toml +0 -8
|
@@ -1,4 +1,134 @@
|
|
|
1
1
|
import { isRecord } from "../shared/logger.js";
|
|
2
|
+
const RECOVERY_FIELDS = [
|
|
3
|
+
["retryAfter", false],
|
|
4
|
+
["retry_after", false],
|
|
5
|
+
["retryDelay", false],
|
|
6
|
+
["retryAfterMs", true],
|
|
7
|
+
["retry_after_ms", true],
|
|
8
|
+
];
|
|
9
|
+
const UNIT_MS = {
|
|
10
|
+
ms: 1,
|
|
11
|
+
millisecond: 1,
|
|
12
|
+
milliseconds: 1,
|
|
13
|
+
s: 1_000,
|
|
14
|
+
sec: 1_000,
|
|
15
|
+
secs: 1_000,
|
|
16
|
+
second: 1_000,
|
|
17
|
+
seconds: 1_000,
|
|
18
|
+
m: 60_000,
|
|
19
|
+
min: 60_000,
|
|
20
|
+
mins: 60_000,
|
|
21
|
+
minute: 60_000,
|
|
22
|
+
minutes: 60_000,
|
|
23
|
+
h: 3_600_000,
|
|
24
|
+
hr: 3_600_000,
|
|
25
|
+
hrs: 3_600_000,
|
|
26
|
+
hour: 3_600_000,
|
|
27
|
+
hours: 3_600_000,
|
|
28
|
+
};
|
|
29
|
+
const DURATION_RE = /^\s*(\d+(?:\.\d+)?)\s*(ms|milliseconds?|s|secs?|seconds?|m|mins?|minutes?|h|hrs?|hours?)\s*$/i;
|
|
30
|
+
const MESSAGE_DURATION_RE = /(?:retry after|try again in|reset in)\s+(\d+(?:\.\d+)?)\s*(ms|milliseconds?|s|secs?|seconds?|m|mins?|minutes?|h|hrs?|hours?)\b/gi;
|
|
31
|
+
const MESSAGE_TIMESTAMP_RE = /(?:reset at|retry at|try again at)\s+(.+?)(?=\s*;|$)/gi;
|
|
32
|
+
const ISO_TIMESTAMP_RE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:?\d{2})$/i;
|
|
33
|
+
const HTTP_DATE_RE = /^(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun), \d{2} (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{4} \d{2}:\d{2}:\d{2} GMT$/i;
|
|
34
|
+
function positiveDelay(value) {
|
|
35
|
+
return Number.isFinite(value) && value > 0 ? value : undefined;
|
|
36
|
+
}
|
|
37
|
+
function parseTimestampDelay(value, now) {
|
|
38
|
+
const trimmed = value.trim();
|
|
39
|
+
if (!ISO_TIMESTAMP_RE.test(trimmed) && !HTTP_DATE_RE.test(trimmed))
|
|
40
|
+
return undefined;
|
|
41
|
+
const timestamp = Date.parse(trimmed);
|
|
42
|
+
return Number.isFinite(timestamp) ? positiveDelay(timestamp - now) : undefined;
|
|
43
|
+
}
|
|
44
|
+
function parseRetryAfterHeader(value, now) {
|
|
45
|
+
if (typeof value === "number")
|
|
46
|
+
return positiveDelay(value * 1_000);
|
|
47
|
+
if (typeof value !== "string")
|
|
48
|
+
return undefined;
|
|
49
|
+
const trimmed = value.trim();
|
|
50
|
+
if (/^[+-]?\d+(?:\.\d+)?$/.test(trimmed)) {
|
|
51
|
+
return positiveDelay(Number(trimmed) * 1_000);
|
|
52
|
+
}
|
|
53
|
+
return parseTimestampDelay(trimmed, now);
|
|
54
|
+
}
|
|
55
|
+
function parseRecoveryValue(value, isMilliseconds, now) {
|
|
56
|
+
const multiplier = isMilliseconds ? 1 : 1_000;
|
|
57
|
+
if (typeof value === "number")
|
|
58
|
+
return positiveDelay(value * multiplier);
|
|
59
|
+
if (typeof value !== "string")
|
|
60
|
+
return undefined;
|
|
61
|
+
const trimmed = value.trim();
|
|
62
|
+
if (/^[+-]?\d+(?:\.\d+)?$/.test(trimmed)) {
|
|
63
|
+
return positiveDelay(Number(trimmed) * multiplier);
|
|
64
|
+
}
|
|
65
|
+
const duration = trimmed.match(DURATION_RE);
|
|
66
|
+
if (duration) {
|
|
67
|
+
const unit = duration[2]?.toLowerCase();
|
|
68
|
+
const unitMultiplier = unit ? UNIT_MS[unit] : undefined;
|
|
69
|
+
if (unitMultiplier !== undefined) {
|
|
70
|
+
return positiveDelay(Number(duration[1]) * unitMultiplier);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return parseTimestampDelay(trimmed, now);
|
|
74
|
+
}
|
|
75
|
+
function collectMessageDelays(message, now) {
|
|
76
|
+
const delays = [];
|
|
77
|
+
for (const match of message.matchAll(MESSAGE_DURATION_RE)) {
|
|
78
|
+
const unit = match[2]?.toLowerCase();
|
|
79
|
+
const unitMultiplier = unit ? UNIT_MS[unit] : undefined;
|
|
80
|
+
const delay = unitMultiplier === undefined ? undefined : positiveDelay(Number(match[1]) * unitMultiplier);
|
|
81
|
+
if (delay !== undefined)
|
|
82
|
+
delays.push(delay);
|
|
83
|
+
}
|
|
84
|
+
for (const match of message.matchAll(MESSAGE_TIMESTAMP_RE)) {
|
|
85
|
+
const timestamp = match[1];
|
|
86
|
+
if (timestamp === undefined)
|
|
87
|
+
continue;
|
|
88
|
+
const delay = parseTimestampDelay(timestamp.trim(), now);
|
|
89
|
+
if (delay !== undefined)
|
|
90
|
+
delays.push(delay);
|
|
91
|
+
}
|
|
92
|
+
return delays;
|
|
93
|
+
}
|
|
94
|
+
export function extractRecoveryDelayMs(error, now = Date.now()) {
|
|
95
|
+
const delays = [];
|
|
96
|
+
const add = (delay) => {
|
|
97
|
+
if (delay !== undefined)
|
|
98
|
+
delays.push(delay);
|
|
99
|
+
};
|
|
100
|
+
const inspectRecord = (record) => {
|
|
101
|
+
for (const [field, isMilliseconds] of RECOVERY_FIELDS) {
|
|
102
|
+
add(parseRecoveryValue(record[field], isMilliseconds, now));
|
|
103
|
+
}
|
|
104
|
+
if (typeof record.message === "string") {
|
|
105
|
+
delays.push(...collectMessageDelays(record.message, now));
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
if (typeof error === "string") {
|
|
109
|
+
delays.push(...collectMessageDelays(error, now));
|
|
110
|
+
}
|
|
111
|
+
else if (isRecord(error)) {
|
|
112
|
+
inspectRecord(error);
|
|
113
|
+
for (const nested of [error.error, error.cause]) {
|
|
114
|
+
if (typeof nested === "string") {
|
|
115
|
+
delays.push(...collectMessageDelays(nested, now));
|
|
116
|
+
}
|
|
117
|
+
else if (isRecord(nested)) {
|
|
118
|
+
inspectRecord(nested);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const response = error.response;
|
|
122
|
+
if (isRecord(response) && isRecord(response.headers)) {
|
|
123
|
+
for (const [name, value] of Object.entries(response.headers)) {
|
|
124
|
+
if (name.toLowerCase() === "retry-after") {
|
|
125
|
+
add(parseRetryAfterHeader(value, now));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return delays.length > 0 ? Math.max(...delays) : undefined;
|
|
131
|
+
}
|
|
2
132
|
export function extractStatusCode(error) {
|
|
3
133
|
if (!isRecord(error))
|
|
4
134
|
return undefined;
|
|
@@ -41,10 +171,11 @@ function extractMessage(error) {
|
|
|
41
171
|
}
|
|
42
172
|
return String(error ?? "");
|
|
43
173
|
}
|
|
44
|
-
export function classifyError(error, cfg) {
|
|
174
|
+
export function classifyError(error, cfg, now = Date.now()) {
|
|
45
175
|
const message = extractMessage(error);
|
|
46
176
|
const statusCode = extractStatusCode(error);
|
|
47
177
|
const errorName = extractErrorName(error);
|
|
178
|
+
const recoveryDelayMs = statusCode === 429 ? extractRecoveryDelayMs(error, now) : undefined;
|
|
48
179
|
if (statusCode !== undefined && cfg.retryOnStatusCodes.includes(statusCode)) {
|
|
49
180
|
return {
|
|
50
181
|
retryable: true,
|
|
@@ -52,6 +183,7 @@ export function classifyError(error, cfg) {
|
|
|
52
183
|
statusCode,
|
|
53
184
|
errorName,
|
|
54
185
|
message,
|
|
186
|
+
...(recoveryDelayMs === undefined ? {} : { recoveryDelayMs }),
|
|
55
187
|
};
|
|
56
188
|
}
|
|
57
189
|
const lower = message.toLowerCase();
|
|
@@ -65,6 +197,7 @@ export function classifyError(error, cfg) {
|
|
|
65
197
|
statusCode,
|
|
66
198
|
errorName,
|
|
67
199
|
message,
|
|
200
|
+
...(recoveryDelayMs === undefined ? {} : { recoveryDelayMs }),
|
|
68
201
|
};
|
|
69
202
|
}
|
|
70
203
|
}
|
|
@@ -78,6 +211,7 @@ export function classifyError(error, cfg) {
|
|
|
78
211
|
statusCode,
|
|
79
212
|
errorName,
|
|
80
213
|
message,
|
|
214
|
+
...(recoveryDelayMs === undefined ? {} : { recoveryDelayMs }),
|
|
81
215
|
};
|
|
82
216
|
}
|
|
83
217
|
//# sourceMappingURL=error-classifier.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-classifier.js","sourceRoot":"","sources":["../../src/runtime-fallback/error-classifier.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"error-classifier.js","sourceRoot":"","sources":["../../src/runtime-fallback/error-classifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type FallbackState } from "./fallback-state.ts";
|
|
2
|
+
import { type OcmmClient } from "./dispatcher.ts";
|
|
3
|
+
import type { RuntimeFallbackConfig } from "../config/schema.ts";
|
|
4
|
+
import type { ModelRequirement } from "../shared/types.ts";
|
|
5
|
+
import type { ErrorClassification } from "./error-classifier.ts";
|
|
6
|
+
import type { Subagent429Target } from "./subagent-429-controller.ts";
|
|
7
|
+
import { type RuntimeFallbackSessionLifecycle } from "./event-handler-support.ts";
|
|
8
|
+
export type GenericFallbackInput = {
|
|
9
|
+
sessionID: string;
|
|
10
|
+
generation: number;
|
|
11
|
+
snapshotId: number;
|
|
12
|
+
agent?: string;
|
|
13
|
+
classification: ErrorClassification;
|
|
14
|
+
requirement: ModelRequirement | null;
|
|
15
|
+
state?: FallbackState;
|
|
16
|
+
failedTarget?: Subagent429Target;
|
|
17
|
+
runtimeConfig: RuntimeFallbackConfig;
|
|
18
|
+
};
|
|
19
|
+
export type GenericFallbackContext = {
|
|
20
|
+
lifecycle: RuntimeFallbackSessionLifecycle;
|
|
21
|
+
isCurrentSnapshot: (snapshotId: number) => boolean;
|
|
22
|
+
client?: OcmmClient;
|
|
23
|
+
directory?: string;
|
|
24
|
+
clock: () => number;
|
|
25
|
+
};
|
|
26
|
+
export declare function runGenericFallback(ctx: GenericFallbackContext, input: GenericFallbackInput): Promise<void>;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { markModelFailed, modelKey, peekNextFallback, commitFallback, } from "./fallback-state.js";
|
|
2
|
+
import { dispatchFallbackRetry } from "./dispatcher.js";
|
|
3
|
+
import { applyRequirementDefaults } from "./event-handler-support.js";
|
|
4
|
+
import { log } from "../shared/logger.js";
|
|
5
|
+
export async function runGenericFallback(ctx, input) {
|
|
6
|
+
const { lifecycle, client, directory, clock, isCurrentSnapshot } = ctx;
|
|
7
|
+
const { sessionID, generation, snapshotId, agent, classification, requirement, state, failedTarget, runtimeConfig } = input;
|
|
8
|
+
const isCurrent = () => lifecycle.isCurrent(sessionID, generation) && isCurrentSnapshot(snapshotId);
|
|
9
|
+
if (!isCurrent())
|
|
10
|
+
return;
|
|
11
|
+
if (!classification.retryable)
|
|
12
|
+
return;
|
|
13
|
+
if (!requirement || requirement.fallbackChain.length <= 1) {
|
|
14
|
+
log.info(`no fallback chain configured for agent=${agent ?? "<none>"}; skipping`);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (!state || !failedTarget) {
|
|
18
|
+
log.info(`could not determine failed model for agent=${agent ?? "<none>"}; skipping`);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const justFailedKey = modelKey(failedTarget.providerID, failedTarget.modelID);
|
|
22
|
+
markModelFailed(state, justFailedKey, clock());
|
|
23
|
+
const peek = peekNextFallback(state, requirement, justFailedKey, runtimeConfig.maxAttempts, runtimeConfig.cooldownSeconds, clock());
|
|
24
|
+
if (!peek.ok) {
|
|
25
|
+
log.warn(`fallback exhausted: ${peek.reason} (session=${sessionID.slice(0, 16)}…)`);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const entry = applyRequirementDefaults(requirement, peek.entry);
|
|
29
|
+
log.info(`fallback attempt ${peek.nextAttempts}/${runtimeConfig.maxAttempts}: ` +
|
|
30
|
+
`model=${entry.providers[0] ?? ""}/${entry.model}`);
|
|
31
|
+
if (!runtimeConfig.dispatch) {
|
|
32
|
+
log.info("dispatch disabled; observe-only");
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (!client) {
|
|
36
|
+
log.warn("no client available; cannot dispatch (observe-only)");
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
await lifecycle.waitForStaleDispatches(sessionID, generation);
|
|
40
|
+
if (!isCurrent())
|
|
41
|
+
return;
|
|
42
|
+
const dispatched = await lifecycle.trackDispatch(sessionID, generation, dispatchFallbackRetry({
|
|
43
|
+
client: lifecycle.guardedClient(sessionID, generation, () => isCurrentSnapshot(snapshotId)),
|
|
44
|
+
sessionID,
|
|
45
|
+
...(directory === undefined ? {} : { directory }),
|
|
46
|
+
...(agent === undefined ? {} : { agent }),
|
|
47
|
+
newEntry: entry,
|
|
48
|
+
reason: classification.reason,
|
|
49
|
+
}));
|
|
50
|
+
if (dispatched && isCurrent()) {
|
|
51
|
+
commitFallback(state, entry, peek.index);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=event-handler-generic-fallback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-handler-generic-fallback.js","sourceRoot":"","sources":["../../src/runtime-fallback/event-handler-generic-fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,QAAQ,EACR,gBAAgB,EAChB,cAAc,GAEf,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,qBAAqB,EAAmB,MAAM,iBAAiB,CAAA;AAKxE,OAAO,EAAE,wBAAwB,EAAwC,MAAM,4BAA4B,CAAA;AAC3G,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAA;AAsBzC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAA2B,EAC3B,KAA2B;IAE3B,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,EAAE,GAAG,GAAG,CAAA;IACtE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,KAAK,CAAA;IAC3H,MAAM,SAAS,GAAG,GAAY,EAAE,CAC9B,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,iBAAiB,CAAC,UAAU,CAAC,CAAA;IAE7E,IAAI,CAAC,SAAS,EAAE;QAAE,OAAM;IACxB,IAAI,CAAC,cAAc,CAAC,SAAS;QAAE,OAAM;IACrC,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,aAAa,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC1D,GAAG,CAAC,IAAI,CAAC,0CAA0C,KAAK,IAAI,QAAQ,YAAY,CAAC,CAAA;QACjF,OAAM;IACR,CAAC;IACD,IAAI,CAAC,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5B,GAAG,CAAC,IAAI,CAAC,8CAA8C,KAAK,IAAI,QAAQ,YAAY,CAAC,CAAA;QACrF,OAAM;IACR,CAAC;IAED,MAAM,aAAa,GAAG,QAAQ,CAAC,YAAY,CAAC,UAAU,EAAE,YAAY,CAAC,OAAO,CAAC,CAAA;IAC7E,eAAe,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAA;IAC9C,MAAM,IAAI,GAAG,gBAAgB,CAC3B,KAAK,EACL,WAAW,EACX,aAAa,EACb,aAAa,CAAC,WAAW,EACzB,aAAa,CAAC,eAAe,EAC7B,KAAK,EAAE,CACR,CAAA;IACD,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,uBAAuB,IAAI,CAAC,MAAM,aAAa,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;QACnF,OAAM;IACR,CAAC;IAED,MAAM,KAAK,GAAG,wBAAwB,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;IAC/D,GAAG,CAAC,IAAI,CACN,oBAAoB,IAAI,CAAC,YAAY,IAAI,aAAa,CAAC,WAAW,IAAI;QACpE,SAAS,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE,CACrD,CAAA;IACD,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;QAC5B,GAAG,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAA;QAC3C,OAAM;IACR,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,GAAG,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAA;QAC/D,OAAM;IACR,CAAC;IAED,MAAM,SAAS,CAAC,sBAAsB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;IAC7D,IAAI,CAAC,SAAS,EAAE;QAAE,OAAM;IACxB,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,SAAS,EAAE,UAAU,EAAE,qBAAqB,CAAC;QAC5F,MAAM,EAAE,SAAS,CAAC,aAAa,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAC3F,SAAS;QACT,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;QACjD,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QACzC,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,cAAc,CAAC,MAAM;KAC9B,CAAC,CAAC,CAAA;IACH,IAAI,UAAU,IAAI,SAAS,EAAE,EAAE,CAAC;QAC9B,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;IAC1C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { OcmmClient } from "./dispatcher.ts";
|
|
2
|
+
import type { OcmmConfig } from "../config/schema.ts";
|
|
3
|
+
import { type IdleContinuationState } from "./idle-state.ts";
|
|
4
|
+
export type IdleContinuationDeps = {
|
|
5
|
+
getConfig: () => OcmmConfig;
|
|
6
|
+
client?: OcmmClient;
|
|
7
|
+
idleState?: IdleContinuationState;
|
|
8
|
+
};
|
|
9
|
+
export declare function handleIdleContinuation(deps: IdleContinuationDeps, sessionID: string): Promise<void>;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { isIdleContinuationEnabled, clearSession, getSessionData, DEFAULT_CONTINUATION_PROMPT, } from "./idle-state.js";
|
|
2
|
+
import { hasUnfinishedTodos } from "./todo-reader.js";
|
|
3
|
+
import { log } from "../shared/logger.js";
|
|
4
|
+
export async function handleIdleContinuation(deps, sessionID) {
|
|
5
|
+
const idleState = deps.idleState;
|
|
6
|
+
if (!idleState)
|
|
7
|
+
return;
|
|
8
|
+
const data = idleState.sessionData.get(sessionID);
|
|
9
|
+
// ESC abort - never continue
|
|
10
|
+
if (data?.aborted) {
|
|
11
|
+
clearSession(idleState, sessionID);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
// Not enabled - clean up
|
|
15
|
+
if (!isIdleContinuationEnabled(idleState, sessionID)) {
|
|
16
|
+
clearSession(idleState, sessionID);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const cfg = deps.getConfig();
|
|
20
|
+
const idleCfg = cfg.idleContinuation;
|
|
21
|
+
const maxContinuations = idleCfg?.maxContinuations ?? 20;
|
|
22
|
+
const count = data?.continuationCount ?? 0;
|
|
23
|
+
if (count >= maxContinuations) {
|
|
24
|
+
clearSession(idleState, sessionID);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (!deps.client)
|
|
28
|
+
return;
|
|
29
|
+
const hasUnfinished = await hasUnfinishedTodos(deps.client, sessionID);
|
|
30
|
+
if (!hasUnfinished) {
|
|
31
|
+
clearSession(idleState, sessionID);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const prompt = idleCfg?.prompt ?? DEFAULT_CONTINUATION_PROMPT;
|
|
35
|
+
try {
|
|
36
|
+
await deps.client.session.prompt({
|
|
37
|
+
path: { id: sessionID },
|
|
38
|
+
body: { parts: [{ type: "text", text: prompt }] },
|
|
39
|
+
});
|
|
40
|
+
const sessionData = getSessionData(idleState, sessionID);
|
|
41
|
+
sessionData.continuationCount = count + 1;
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
log.warn("idle continuation prompt failed", { sessionID, error: String(err) });
|
|
45
|
+
clearSession(idleState, sessionID);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=event-handler-idle-continuation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-handler-idle-continuation.js","sourceRoot":"","sources":["../../src/runtime-fallback/event-handler-idle-continuation.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,yBAAyB,EACzB,YAAY,EACZ,cAAc,EACd,2BAA2B,GAE5B,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAA;AAQzC,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAA0B,EAAE,SAAiB;IACxF,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;IAChC,IAAI,CAAC,SAAS;QAAE,OAAM;IAEtB,MAAM,IAAI,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACjD,6BAA6B;IAC7B,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;QAClB,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QAClC,OAAM;IACR,CAAC;IAED,yBAAyB;IACzB,IAAI,CAAC,yBAAyB,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC;QACrD,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QAClC,OAAM;IACR,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;IAC5B,MAAM,OAAO,GAAG,GAAG,CAAC,gBAAgB,CAAA;IACpC,MAAM,gBAAgB,GAAG,OAAO,EAAE,gBAAgB,IAAI,EAAE,CAAA;IAExD,MAAM,KAAK,GAAG,IAAI,EAAE,iBAAiB,IAAI,CAAC,CAAA;IAC1C,IAAI,KAAK,IAAI,gBAAgB,EAAE,CAAC;QAC9B,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QAClC,OAAM;IACR,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAM;IAExB,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACtE,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QAClC,OAAM;IACR,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,2BAA2B,CAAA;IAC7D,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;YAC/B,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE;YACvB,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE;SAClD,CAAC,CAAA;QACF,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QACxD,WAAW,CAAC,iBAAiB,GAAG,KAAK,GAAG,CAAC,CAAA;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,iCAAiC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC9E,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;IACpC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { FallbackEntry, ModelRequirement } from "../shared/types.ts";
|
|
2
|
+
import type { Subagent429Target } from "./subagent-429-controller.ts";
|
|
3
|
+
import { type FallbackState } from "./fallback-state.ts";
|
|
4
|
+
import type { OcmmClient } from "./dispatcher.ts";
|
|
5
|
+
export type ModelIdentity = {
|
|
6
|
+
providerID: string;
|
|
7
|
+
modelID: string;
|
|
8
|
+
};
|
|
9
|
+
export declare function isExplicitRuntimeFallbackAbort(error: unknown): boolean;
|
|
10
|
+
export declare function isRuntimeFallbackAbort(error: unknown): boolean;
|
|
11
|
+
export declare function resolveRuntimeFallbackSessionID(props: unknown): string;
|
|
12
|
+
export declare function resolveRuntimeFallbackAgent(props: unknown): string | undefined;
|
|
13
|
+
export declare function resolveEventModelIdentity(props: unknown): ModelIdentity | null;
|
|
14
|
+
export declare function parseModelIdentity(value: string | null | undefined): ModelIdentity | null;
|
|
15
|
+
export declare function resolveParentSessionID(props: unknown): string | undefined;
|
|
16
|
+
export declare function applyRequirementDefaults(requirement: ModelRequirement | null | undefined, entry: FallbackEntry): FallbackEntry;
|
|
17
|
+
/**
|
|
18
|
+
* Build a retry target that retains the selected chain entry's inference
|
|
19
|
+
* metadata while pinning dispatch to the provider/model that actually failed.
|
|
20
|
+
*/
|
|
21
|
+
export declare function resolveRetryTarget(requirement: ModelRequirement | null | undefined, identity: ModelIdentity): Subagent429Target;
|
|
22
|
+
export declare function chainHeadIdentity(requirement: ModelRequirement | null): ModelIdentity | null;
|
|
23
|
+
export declare function getOrCreateFallbackState(sessionStates: Map<string, FallbackState>, sessionID: string, requirement: ModelRequirement, identity: ModelIdentity, snapshotId: number): FallbackState;
|
|
24
|
+
/**
|
|
25
|
+
* Coordinates event lifecycles with dispatcher I/O. Invalidating a session
|
|
26
|
+
* unblocks stale abort/messages/prompt calls and lets a replacement lifecycle
|
|
27
|
+
* wait for that stale dispatcher ownership to leave its session-ID lock.
|
|
28
|
+
*/
|
|
29
|
+
export type RuntimeFallbackSessionLifecycle = {
|
|
30
|
+
beginSession: (sessionID: string) => number;
|
|
31
|
+
hasSession: (sessionID: string) => boolean;
|
|
32
|
+
invalidateSession: (sessionID: string) => void;
|
|
33
|
+
currentGeneration: (sessionID: string) => number;
|
|
34
|
+
isCurrent: (sessionID: string, generation: number) => boolean;
|
|
35
|
+
trackDispatch: <T>(sessionID: string, generation: number, promise: Promise<T>) => Promise<T>;
|
|
36
|
+
waitForStaleDispatches: (sessionID: string, generation: number) => Promise<void>;
|
|
37
|
+
guardedClient: (sessionID: string, generation: number, isOperationCurrent?: () => boolean) => OcmmClient;
|
|
38
|
+
};
|
|
39
|
+
export declare function createRuntimeFallbackSessionLifecycle(client: OcmmClient | undefined): RuntimeFallbackSessionLifecycle;
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { entryExactlyMatchesModel, entryMatchesModel } from "../routing/resolver.js";
|
|
2
|
+
import { matchRequirementSuccessor } from "../routing/model-upgrades.js";
|
|
3
|
+
import { isRecord } from "../shared/logger.js";
|
|
4
|
+
import { resolveSessionLineageProperties } from "../shared/opencode-events.js";
|
|
5
|
+
import { createFallbackState, modelKey } from "./fallback-state.js";
|
|
6
|
+
const ABORT_NAMES = new Set(["AbortError", "DOMException"]);
|
|
7
|
+
export function isExplicitRuntimeFallbackAbort(error) {
|
|
8
|
+
return isRecord(error) && error.isAbort === true;
|
|
9
|
+
}
|
|
10
|
+
export function isRuntimeFallbackAbort(error) {
|
|
11
|
+
if (!isRecord(error))
|
|
12
|
+
return false;
|
|
13
|
+
const name = typeof error.name === "string" ? error.name : "";
|
|
14
|
+
return ABORT_NAMES.has(name) || isExplicitRuntimeFallbackAbort(error);
|
|
15
|
+
}
|
|
16
|
+
export function resolveRuntimeFallbackSessionID(props) {
|
|
17
|
+
return resolveSessionLineageProperties(props)?.sessionID ?? "";
|
|
18
|
+
}
|
|
19
|
+
export function resolveRuntimeFallbackAgent(props) {
|
|
20
|
+
if (!isRecord(props))
|
|
21
|
+
return undefined;
|
|
22
|
+
if (typeof props.agent === "string")
|
|
23
|
+
return props.agent;
|
|
24
|
+
if (isRecord(props.agent) && typeof props.agent.name === "string")
|
|
25
|
+
return props.agent.name;
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
export function resolveEventModelIdentity(props) {
|
|
29
|
+
if (!isRecord(props) || !isRecord(props.model))
|
|
30
|
+
return null;
|
|
31
|
+
const providerID = typeof props.model.providerID === "string" ? props.model.providerID : "";
|
|
32
|
+
const modelID = typeof props.model.modelID === "string" ? props.model.modelID : "";
|
|
33
|
+
return providerID && modelID ? { providerID, modelID } : null;
|
|
34
|
+
}
|
|
35
|
+
export function parseModelIdentity(value) {
|
|
36
|
+
if (!value)
|
|
37
|
+
return null;
|
|
38
|
+
const slash = value.indexOf("/");
|
|
39
|
+
if (slash <= 0 || slash === value.length - 1)
|
|
40
|
+
return null;
|
|
41
|
+
return { providerID: value.slice(0, slash), modelID: value.slice(slash + 1) };
|
|
42
|
+
}
|
|
43
|
+
export function resolveParentSessionID(props) {
|
|
44
|
+
return resolveSessionLineageProperties(props)?.parentSessionID;
|
|
45
|
+
}
|
|
46
|
+
function matchingEntry(requirement, identity) {
|
|
47
|
+
if (!requirement)
|
|
48
|
+
return undefined;
|
|
49
|
+
return requirement.fallbackChain.find((entry) => entryExactlyMatchesModel(entry, identity.providerID, identity.modelID))
|
|
50
|
+
?? matchRequirementSuccessor(requirement, identity.providerID, identity.modelID)
|
|
51
|
+
?? requirement.fallbackChain.find((entry) => entryMatchesModel(entry, identity.providerID, identity.modelID));
|
|
52
|
+
}
|
|
53
|
+
export function applyRequirementDefaults(requirement, entry) {
|
|
54
|
+
return entry.variant === undefined && requirement?.variant !== undefined
|
|
55
|
+
? { ...entry, variant: requirement.variant }
|
|
56
|
+
: entry;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Build a retry target that retains the selected chain entry's inference
|
|
60
|
+
* metadata while pinning dispatch to the provider/model that actually failed.
|
|
61
|
+
*/
|
|
62
|
+
export function resolveRetryTarget(requirement, identity) {
|
|
63
|
+
const template = matchingEntry(requirement, identity);
|
|
64
|
+
const base = applyRequirementDefaults(requirement, template ?? { providers: [identity.providerID], model: identity.modelID });
|
|
65
|
+
const entry = { ...base, providers: [identity.providerID], model: identity.modelID };
|
|
66
|
+
return { providerID: identity.providerID, modelID: identity.modelID, entry };
|
|
67
|
+
}
|
|
68
|
+
export function chainHeadIdentity(requirement) {
|
|
69
|
+
const head = requirement?.fallbackChain[0];
|
|
70
|
+
const providerID = head?.providers[0];
|
|
71
|
+
return head && providerID ? { providerID, modelID: head.model } : null;
|
|
72
|
+
}
|
|
73
|
+
export function getOrCreateFallbackState(sessionStates, sessionID, requirement, identity, snapshotId) {
|
|
74
|
+
const existing = sessionStates.get(sessionID);
|
|
75
|
+
if (existing?.snapshotId === snapshotId)
|
|
76
|
+
return existing;
|
|
77
|
+
const initialKey = modelKey(identity.providerID, identity.modelID);
|
|
78
|
+
const state = createFallbackState(initialKey, snapshotId);
|
|
79
|
+
state.activeModel = initialKey;
|
|
80
|
+
const matched = matchingEntry(requirement, identity);
|
|
81
|
+
// A synthesized successor is deliberately not an in-chain entry, so indexOf
|
|
82
|
+
// preserves -1 and starts the next fallback at the effective chain head.
|
|
83
|
+
state.fallbackIndex = matched ? requirement.fallbackChain.indexOf(matched) : -1;
|
|
84
|
+
sessionStates.set(sessionID, state);
|
|
85
|
+
return state;
|
|
86
|
+
}
|
|
87
|
+
export function createRuntimeFallbackSessionLifecycle(client) {
|
|
88
|
+
const sessionGenerations = new Map();
|
|
89
|
+
const cancellationSignals = new Map();
|
|
90
|
+
const activeDispatches = new Map();
|
|
91
|
+
let nextGeneration = 0;
|
|
92
|
+
const createCancellationSignal = () => {
|
|
93
|
+
let cancel;
|
|
94
|
+
const promise = new Promise((resolve) => { cancel = resolve; });
|
|
95
|
+
return { promise, cancel };
|
|
96
|
+
};
|
|
97
|
+
const beginSession = (sessionID) => {
|
|
98
|
+
const previous = sessionGenerations.get(sessionID);
|
|
99
|
+
if (previous !== undefined) {
|
|
100
|
+
cancellationSignals.get(previous)?.cancel();
|
|
101
|
+
cancellationSignals.delete(previous);
|
|
102
|
+
}
|
|
103
|
+
const generation = ++nextGeneration;
|
|
104
|
+
sessionGenerations.set(sessionID, generation);
|
|
105
|
+
cancellationSignals.set(generation, createCancellationSignal());
|
|
106
|
+
return generation;
|
|
107
|
+
};
|
|
108
|
+
const hasSession = (sessionID) => sessionGenerations.has(sessionID);
|
|
109
|
+
const invalidateSession = (sessionID) => {
|
|
110
|
+
const generation = sessionGenerations.get(sessionID);
|
|
111
|
+
if (generation !== undefined) {
|
|
112
|
+
cancellationSignals.get(generation)?.cancel();
|
|
113
|
+
cancellationSignals.delete(generation);
|
|
114
|
+
}
|
|
115
|
+
nextGeneration++;
|
|
116
|
+
sessionGenerations.delete(sessionID);
|
|
117
|
+
};
|
|
118
|
+
const currentGeneration = (sessionID) => sessionGenerations.get(sessionID) ?? beginSession(sessionID);
|
|
119
|
+
const isCurrent = (sessionID, generation) => sessionGenerations.get(sessionID) === generation;
|
|
120
|
+
const trackDispatch = (sessionID, generation, promise) => {
|
|
121
|
+
let byGeneration = activeDispatches.get(sessionID);
|
|
122
|
+
if (!byGeneration) {
|
|
123
|
+
byGeneration = new Map();
|
|
124
|
+
activeDispatches.set(sessionID, byGeneration);
|
|
125
|
+
}
|
|
126
|
+
let dispatches = byGeneration.get(generation);
|
|
127
|
+
if (!dispatches) {
|
|
128
|
+
dispatches = new Set();
|
|
129
|
+
byGeneration.set(generation, dispatches);
|
|
130
|
+
}
|
|
131
|
+
const tracked = promise;
|
|
132
|
+
dispatches.add(tracked);
|
|
133
|
+
const remove = () => {
|
|
134
|
+
dispatches.delete(tracked);
|
|
135
|
+
if (dispatches.size === 0)
|
|
136
|
+
byGeneration.delete(generation);
|
|
137
|
+
if (byGeneration.size === 0)
|
|
138
|
+
activeDispatches.delete(sessionID);
|
|
139
|
+
};
|
|
140
|
+
void tracked.then(remove, remove);
|
|
141
|
+
return promise;
|
|
142
|
+
};
|
|
143
|
+
const waitForStaleDispatches = async (sessionID, generation) => {
|
|
144
|
+
const byGeneration = activeDispatches.get(sessionID);
|
|
145
|
+
if (!byGeneration)
|
|
146
|
+
return;
|
|
147
|
+
const stale = [...byGeneration.entries()]
|
|
148
|
+
.filter(([otherGeneration]) => otherGeneration !== generation)
|
|
149
|
+
.flatMap(([, dispatches]) => [...dispatches]);
|
|
150
|
+
if (stale.length > 0)
|
|
151
|
+
await Promise.allSettled(stale);
|
|
152
|
+
};
|
|
153
|
+
const guardedClient = (sessionID, generation, isOperationCurrent = undefined) => {
|
|
154
|
+
const operationIsCurrent = () => isCurrent(sessionID, generation) && (isOperationCurrent?.() ?? true);
|
|
155
|
+
return {
|
|
156
|
+
session: {
|
|
157
|
+
async abort(args) {
|
|
158
|
+
if (!operationIsCurrent() || !client)
|
|
159
|
+
return undefined;
|
|
160
|
+
const cancelled = cancellationSignals.get(generation)?.promise ?? Promise.resolve();
|
|
161
|
+
const response = await Promise.race([client.session.abort(args), cancelled]);
|
|
162
|
+
return operationIsCurrent() ? response : undefined;
|
|
163
|
+
},
|
|
164
|
+
async messages(args) {
|
|
165
|
+
if (!operationIsCurrent() || !client)
|
|
166
|
+
return { messages: [] };
|
|
167
|
+
const cancelled = cancellationSignals.get(generation)?.promise ?? Promise.resolve();
|
|
168
|
+
const response = await Promise.race([client.session.messages(args), cancelled]);
|
|
169
|
+
return operationIsCurrent() ? response : { messages: [] };
|
|
170
|
+
},
|
|
171
|
+
async prompt(args) {
|
|
172
|
+
if (!operationIsCurrent() || !client)
|
|
173
|
+
throw new Error("runtime fallback session is stale");
|
|
174
|
+
const cancelled = cancellationSignals.get(generation)?.promise ?? Promise.resolve();
|
|
175
|
+
const response = await Promise.race([client.session.prompt(args), cancelled]);
|
|
176
|
+
if (!operationIsCurrent())
|
|
177
|
+
throw new Error("runtime fallback session became stale");
|
|
178
|
+
return response;
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
};
|
|
183
|
+
return {
|
|
184
|
+
beginSession,
|
|
185
|
+
hasSession,
|
|
186
|
+
invalidateSession,
|
|
187
|
+
currentGeneration,
|
|
188
|
+
isCurrent,
|
|
189
|
+
trackDispatch,
|
|
190
|
+
waitForStaleDispatches,
|
|
191
|
+
guardedClient,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=event-handler-support.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-handler-support.js","sourceRoot":"","sources":["../../src/runtime-fallback/event-handler-support.ts"],"names":[],"mappings":"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"}
|