ocmm 0.5.3 → 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 +3 -3
- package/.codex/agents/dw-clarifier.toml +2 -2
- package/.codex/agents/dw-code-search.toml +2 -2
- package/.codex/agents/dw-coding.toml +2 -2
- package/.codex/agents/dw-complex.toml +2 -2
- package/.codex/agents/dw-creative.toml +2 -2
- package/.codex/agents/dw-deep.toml +3 -3
- package/.codex/agents/dw-doc-search.toml +2 -2
- package/.codex/agents/dw-documenting.toml +2 -2
- package/.codex/agents/dw-explore.toml +2 -2
- package/.codex/agents/dw-frontend.toml +2 -2
- package/.codex/agents/dw-hard-reasoning.toml +2 -2
- package/.codex/agents/dw-media-reader.toml +2 -2
- package/.codex/agents/dw-normal-task.toml +2 -2
- package/.codex/agents/dw-oracle-2nd.toml +8 -0
- package/.codex/agents/dw-oracle.toml +3 -3
- package/.codex/agents/dw-orchestrator.toml +2 -2
- package/.codex/agents/dw-plan-critic.toml +2 -2
- package/.codex/agents/dw-planner.toml +3 -3
- package/.codex/agents/dw-quick.toml +2 -2
- package/.codex/agents/dw-research.toml +2 -2
- package/.codex/agents/dw-reviewer.toml +2 -2
- package/README.md +193 -46
- 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 +121 -96
- 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 -219
- package/dist/config/schema.js +169 -36
- 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 +2 -1
- package/dist/data/agents.js +25 -10
- package/dist/data/agents.js.map +1 -1
- package/dist/data/categories.js +2 -1
- package/dist/data/categories.js.map +1 -1
- package/dist/hooks/chat-params.d.ts +2 -0
- package/dist/hooks/chat-params.js +182 -16
- 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/intent/model-family.d.ts +2 -0
- package/dist/intent/model-family.js +11 -0
- package/dist/intent/model-family.js.map +1 -1
- package/dist/intent/prompt-loader.d.ts +3 -3
- package/dist/intent/prompt-loader.js +3 -3
- 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 -11
- 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/routing/variant-translator.js +7 -4
- package/dist/routing/variant-translator.js.map +1 -1
- 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 +3 -2
- package/plugins/deepwork/agents/dw-builder.toml +3 -3
- package/plugins/deepwork/agents/dw-clarifier.toml +2 -2
- package/plugins/deepwork/agents/dw-code-search.toml +2 -2
- package/plugins/deepwork/agents/dw-coding.toml +2 -2
- package/plugins/deepwork/agents/dw-complex.toml +2 -2
- package/plugins/deepwork/agents/dw-creative.toml +2 -2
- package/plugins/deepwork/agents/dw-deep.toml +3 -3
- package/plugins/deepwork/agents/dw-doc-search.toml +2 -2
- package/plugins/deepwork/agents/dw-documenting.toml +2 -2
- package/plugins/deepwork/agents/dw-explore.toml +2 -2
- package/plugins/deepwork/agents/dw-frontend.toml +2 -2
- package/plugins/deepwork/agents/dw-hard-reasoning.toml +2 -2
- package/plugins/deepwork/agents/dw-media-reader.toml +2 -2
- package/plugins/deepwork/agents/dw-normal-task.toml +2 -2
- package/plugins/deepwork/agents/dw-oracle-2nd.toml +8 -0
- package/plugins/deepwork/agents/dw-oracle.toml +3 -3
- package/plugins/deepwork/agents/dw-orchestrator.toml +2 -2
- package/plugins/deepwork/agents/dw-plan-critic.toml +2 -2
- package/plugins/deepwork/agents/dw-planner.toml +3 -3
- package/plugins/deepwork/agents/dw-quick.toml +2 -2
- package/plugins/deepwork/agents/dw-research.toml +2 -2
- package/plugins/deepwork/agents/dw-reviewer.toml +2 -2
- 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 +74 -58
- package/plugins/deepwork/skills/deepwork-requesting-code-review/SKILL.md +53 -27
- package/plugins/deepwork/skills/deepwork-requesting-code-review/code-reviewer.md +11 -7
- package/plugins/deepwork/skills/deepwork-subagent-driven-development/SKILL.md +34 -21
- 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 -27
- package/skills/v1/requesting-code-review/code-reviewer.md +11 -7
- package/skills/v1/subagent-driven-development/SKILL.md +34 -21
- package/skills/v1/subagent-driven-development/implementer-prompt.md +10 -3
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { log as defaultLog } from "../shared/logger.ts";
|
|
2
|
+
import type { FallbackEntry } from "../shared/types.ts";
|
|
3
|
+
import type { FallbackCandidateBlocker, PeekResult } from "./fallback-state.ts";
|
|
4
|
+
import type { RuntimeFallbackConfig } from "../config/schema.ts";
|
|
5
|
+
export type Subagent429Scope = "model" | "provider";
|
|
6
|
+
export type Subagent429Target = {
|
|
7
|
+
providerID: string;
|
|
8
|
+
modelID: string;
|
|
9
|
+
entry: FallbackEntry;
|
|
10
|
+
};
|
|
11
|
+
export type Subagent429Scheduler = {
|
|
12
|
+
schedule(delayMs: number, run: () => Promise<void>): () => void;
|
|
13
|
+
};
|
|
14
|
+
export type Subagent429DispatchInput = {
|
|
15
|
+
sessionID: string;
|
|
16
|
+
snapshotId: number;
|
|
17
|
+
agent?: string;
|
|
18
|
+
target: Subagent429Target;
|
|
19
|
+
reason: string;
|
|
20
|
+
};
|
|
21
|
+
export type Subagent429PreparedSwitch = {
|
|
22
|
+
target: Subagent429Target;
|
|
23
|
+
attempt: number;
|
|
24
|
+
snapshotId: number;
|
|
25
|
+
commit: () => void;
|
|
26
|
+
};
|
|
27
|
+
export type Subagent429PrepareFailure = Extract<PeekResult, {
|
|
28
|
+
ok: false;
|
|
29
|
+
}>["reason"] | "dispatch-failed";
|
|
30
|
+
export type Subagent429PrepareResult = {
|
|
31
|
+
ok: true;
|
|
32
|
+
prepared: Subagent429PreparedSwitch;
|
|
33
|
+
} | {
|
|
34
|
+
ok: false;
|
|
35
|
+
reason: Subagent429PrepareFailure;
|
|
36
|
+
};
|
|
37
|
+
export type Subagent429ErrorInput = {
|
|
38
|
+
sessionID: string;
|
|
39
|
+
snapshotId: number;
|
|
40
|
+
agent?: string;
|
|
41
|
+
target: Subagent429Target;
|
|
42
|
+
classification: {
|
|
43
|
+
reason: string;
|
|
44
|
+
recoveryDelayMs?: number;
|
|
45
|
+
};
|
|
46
|
+
runtimeConfig: RuntimeFallbackConfig;
|
|
47
|
+
prepareSwitch: (failedTarget: Subagent429Target, isCandidateBlocked: FallbackCandidateBlocker) => Subagent429PrepareResult;
|
|
48
|
+
};
|
|
49
|
+
export type Subagent429GenericHandoff = (activeTarget: Subagent429Target) => Promise<void>;
|
|
50
|
+
export type Subagent429OtherErrorInput = {
|
|
51
|
+
sessionID: string;
|
|
52
|
+
snapshotId: number;
|
|
53
|
+
runGenericFallback: Subagent429GenericHandoff;
|
|
54
|
+
};
|
|
55
|
+
export type Queued429 = {
|
|
56
|
+
kind: "429";
|
|
57
|
+
snapshotId: number;
|
|
58
|
+
dispatchGeneration: number;
|
|
59
|
+
input: Subagent429ErrorInput;
|
|
60
|
+
errorIdleObserved: boolean;
|
|
61
|
+
};
|
|
62
|
+
export type QueuedOtherError = {
|
|
63
|
+
kind: "other";
|
|
64
|
+
snapshotId: number;
|
|
65
|
+
dispatchGeneration: number;
|
|
66
|
+
runGenericFallback: Subagent429GenericHandoff;
|
|
67
|
+
};
|
|
68
|
+
export type QueuedOutcome = Queued429 | QueuedOtherError;
|
|
69
|
+
export type Subagent429Decision = {
|
|
70
|
+
handled: false;
|
|
71
|
+
} | {
|
|
72
|
+
handled: true;
|
|
73
|
+
action: "retry-gated";
|
|
74
|
+
delayMs: number;
|
|
75
|
+
retryOrdinal: number;
|
|
76
|
+
scope: Subagent429Scope;
|
|
77
|
+
} | {
|
|
78
|
+
handled: true;
|
|
79
|
+
action: "switch-gated";
|
|
80
|
+
attempt: number;
|
|
81
|
+
target: Subagent429Target;
|
|
82
|
+
} | {
|
|
83
|
+
handled: true;
|
|
84
|
+
action: "queued-429";
|
|
85
|
+
dispatchGeneration: number;
|
|
86
|
+
} | {
|
|
87
|
+
handled: true;
|
|
88
|
+
action: "duplicate-outcome";
|
|
89
|
+
dispatchGeneration: number;
|
|
90
|
+
} | {
|
|
91
|
+
handled: true;
|
|
92
|
+
action: "observe-only";
|
|
93
|
+
} | {
|
|
94
|
+
handled: true;
|
|
95
|
+
action: "stopped";
|
|
96
|
+
reason: Subagent429PrepareFailure | "dispatch-unavailable";
|
|
97
|
+
};
|
|
98
|
+
export type Subagent429OtherErrorDecision = {
|
|
99
|
+
handled: false;
|
|
100
|
+
} | {
|
|
101
|
+
handled: true;
|
|
102
|
+
action: "queued-other-error";
|
|
103
|
+
dispatchGeneration: number;
|
|
104
|
+
} | {
|
|
105
|
+
handled: true;
|
|
106
|
+
action: "duplicate-outcome";
|
|
107
|
+
dispatchGeneration: number;
|
|
108
|
+
};
|
|
109
|
+
export type Subagent429IdleResult = {
|
|
110
|
+
kind: "untracked" | "initial-succeeded" | "error-idle-observed" | "dispatch-idle-observed" | "queued-error-idle-observed" | "retry-succeeded";
|
|
111
|
+
suppressIdleContinuation: boolean;
|
|
112
|
+
};
|
|
113
|
+
export type SubagentInterruptionCorrelation = {
|
|
114
|
+
childSessionID: string;
|
|
115
|
+
parentSessionID: string;
|
|
116
|
+
callID?: string;
|
|
117
|
+
agent?: string;
|
|
118
|
+
taskID?: string;
|
|
119
|
+
terminalTaskErrorObserved: boolean;
|
|
120
|
+
retryableChildErrorObserved: boolean;
|
|
121
|
+
explicitlyAborted: boolean;
|
|
122
|
+
};
|
|
123
|
+
export type SubagentSessionLineageInput = {
|
|
124
|
+
childSessionID: string;
|
|
125
|
+
parentSessionID: string;
|
|
126
|
+
agent?: string;
|
|
127
|
+
};
|
|
128
|
+
export type SubagentTaskPartEvidence = {
|
|
129
|
+
childSessionID: string;
|
|
130
|
+
parentSessionID: string;
|
|
131
|
+
parentPartID?: string;
|
|
132
|
+
callID?: string;
|
|
133
|
+
agent?: string;
|
|
134
|
+
taskID?: string;
|
|
135
|
+
terminalTaskErrorObserved: true;
|
|
136
|
+
};
|
|
137
|
+
export type SubagentCorrelationLookup = {
|
|
138
|
+
childSessionID?: string;
|
|
139
|
+
parentSessionID?: string;
|
|
140
|
+
parentPartID?: string;
|
|
141
|
+
taskID?: string;
|
|
142
|
+
};
|
|
143
|
+
export type Subagent429Controller = {
|
|
144
|
+
onSessionCreated(sessionID: string, isChild: boolean, snapshotId: number): void;
|
|
145
|
+
on429(input: Subagent429ErrorInput): Subagent429Decision;
|
|
146
|
+
onOtherError(input: Subagent429OtherErrorInput): Subagent429OtherErrorDecision;
|
|
147
|
+
onIdle(sessionID: string, snapshotId: number): Subagent429IdleResult;
|
|
148
|
+
onDeleted(sessionID: string): void;
|
|
149
|
+
getActiveDispatchTarget(sessionID: string, snapshotId: number): Subagent429Target | undefined;
|
|
150
|
+
recordSessionLineage(input: SubagentSessionLineageInput): "recorded" | "untracked";
|
|
151
|
+
recordTaskPart(input: SubagentTaskPartEvidence): "recorded" | "duplicate" | "untracked";
|
|
152
|
+
markRetryableChildError(childSessionID: string): void;
|
|
153
|
+
markExplicitAbort(childSessionID: string): void;
|
|
154
|
+
getInterruptionCorrelation(input: SubagentCorrelationLookup): Readonly<SubagentInterruptionCorrelation> | undefined;
|
|
155
|
+
claimInterruptionNotice(input: SubagentCorrelationLookup): boolean;
|
|
156
|
+
};
|
|
157
|
+
export type Subagent429ControllerDeps = {
|
|
158
|
+
isCurrentSnapshot: (snapshotId: number) => boolean;
|
|
159
|
+
scheduler?: Subagent429Scheduler;
|
|
160
|
+
clock?: () => number;
|
|
161
|
+
random?: () => number;
|
|
162
|
+
dispatchRetry?: (input: Subagent429DispatchInput) => Promise<boolean>;
|
|
163
|
+
logger?: Pick<typeof defaultLog, "debug" | "info" | "warn">;
|
|
164
|
+
};
|
|
165
|
+
export declare const INACTIVE_CORRELATION_GRACE_MS: number;
|
|
166
|
+
export declare const MAX_INACTIVE_CORRELATION_RECORDS = 256;
|
|
167
|
+
export declare function createSubagent429Controller(deps: Subagent429ControllerDeps): Subagent429Controller;
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
import { log as defaultLog } from "../shared/logger.js";
|
|
2
|
+
import { Session429State } from "./subagent-429-session.js";
|
|
3
|
+
import { canonicalizeReviewAgentName } from "../review-agents/names.js";
|
|
4
|
+
const defaultScheduler = {
|
|
5
|
+
schedule(delayMs, run) {
|
|
6
|
+
const handle = setTimeout(() => { void run(); }, delayMs);
|
|
7
|
+
return () => clearTimeout(handle);
|
|
8
|
+
},
|
|
9
|
+
};
|
|
10
|
+
export const INACTIVE_CORRELATION_GRACE_MS = 5 * 60_000;
|
|
11
|
+
export const MAX_INACTIVE_CORRELATION_RECORDS = 256;
|
|
12
|
+
export function createSubagent429Controller(deps) {
|
|
13
|
+
const sessions = new Map();
|
|
14
|
+
const clock = deps.clock ?? Date.now;
|
|
15
|
+
const stateDeps = {
|
|
16
|
+
scheduler: deps.scheduler ?? defaultScheduler,
|
|
17
|
+
clock,
|
|
18
|
+
random: deps.random ?? Math.random,
|
|
19
|
+
isCurrentSnapshot: deps.isCurrentSnapshot,
|
|
20
|
+
...(deps.dispatchRetry === undefined ? {} : { dispatchRetry: deps.dispatchRetry }),
|
|
21
|
+
logger: deps.logger ?? defaultLog,
|
|
22
|
+
};
|
|
23
|
+
function markInactive(record) {
|
|
24
|
+
record.inactiveSince = clock();
|
|
25
|
+
}
|
|
26
|
+
function refreshInactiveGrace(record) {
|
|
27
|
+
if (record.retry === undefined)
|
|
28
|
+
markInactive(record);
|
|
29
|
+
}
|
|
30
|
+
function pruneInactiveRecords() {
|
|
31
|
+
const now = clock();
|
|
32
|
+
for (const [sessionID, record] of sessions) {
|
|
33
|
+
if (record.retry !== undefined || record.inactiveSince === undefined)
|
|
34
|
+
continue;
|
|
35
|
+
if (now - record.inactiveSince >= INACTIVE_CORRELATION_GRACE_MS)
|
|
36
|
+
sessions.delete(sessionID);
|
|
37
|
+
}
|
|
38
|
+
const inactive = [...sessions.entries()]
|
|
39
|
+
.filter(([, record]) => record.retry === undefined)
|
|
40
|
+
.sort(([, left], [, right]) => (left.inactiveSince ?? now) - (right.inactiveSince ?? now));
|
|
41
|
+
for (const [sessionID] of inactive.slice(0, Math.max(0, inactive.length - MAX_INACTIVE_CORRELATION_RECORDS))) {
|
|
42
|
+
sessions.delete(sessionID);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function createRetryState(sessionID, record, snapshotId) {
|
|
46
|
+
let retry;
|
|
47
|
+
retry = new Session429State(sessionID, snapshotId, stateDeps, () => {
|
|
48
|
+
const current = sessions.get(sessionID);
|
|
49
|
+
return current === record && current.retry === retry;
|
|
50
|
+
}, () => {
|
|
51
|
+
// Stop callback clears only retry state. Preserve durable correlation
|
|
52
|
+
// for the bounded late-event grace window; lazy public-path pruning
|
|
53
|
+
// removes it when OpenCode omits session.deleted.
|
|
54
|
+
const current = sessions.get(sessionID);
|
|
55
|
+
if (current === record && current.retry === retry) {
|
|
56
|
+
current.retry = undefined;
|
|
57
|
+
markInactive(current);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
return retry;
|
|
61
|
+
}
|
|
62
|
+
function dedupKey(input) {
|
|
63
|
+
const identity = input.parentPartID ?? input.callID ?? input.taskID ?? input.childSessionID;
|
|
64
|
+
return `${input.parentSessionID}:${identity}`;
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
onSessionCreated(sessionID, isChild, snapshotId) {
|
|
68
|
+
pruneInactiveRecords();
|
|
69
|
+
// OpenCode can replay session.created while the child remains active.
|
|
70
|
+
// Preserve its retry state and durable correlation in that case. A
|
|
71
|
+
// session.deleted call removes the record, so delete→recreate still
|
|
72
|
+
// starts a fresh lifecycle below.
|
|
73
|
+
const existing = sessions.get(sessionID);
|
|
74
|
+
if (existing) {
|
|
75
|
+
const retry = existing.retry;
|
|
76
|
+
if (retry && (!retry.matchesSnapshot(snapshotId) || !deps.isCurrentSnapshot(snapshotId))) {
|
|
77
|
+
retry.stop();
|
|
78
|
+
if (isChild && deps.isCurrentSnapshot(snapshotId)) {
|
|
79
|
+
existing.retry = createRetryState(sessionID, existing, snapshotId);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
if (!isChild)
|
|
85
|
+
return;
|
|
86
|
+
const record = {
|
|
87
|
+
seenParentParts: new Set(),
|
|
88
|
+
parentEvidenceIDs: new Set(),
|
|
89
|
+
claimedNotices: new Set(),
|
|
90
|
+
};
|
|
91
|
+
record.retry = createRetryState(sessionID, record, snapshotId);
|
|
92
|
+
sessions.set(sessionID, record);
|
|
93
|
+
},
|
|
94
|
+
on429(input) {
|
|
95
|
+
pruneInactiveRecords();
|
|
96
|
+
const record = sessions.get(input.sessionID);
|
|
97
|
+
const previousRetry = record?.retry;
|
|
98
|
+
let retry = previousRetry;
|
|
99
|
+
if (retry && (!retry.matchesSnapshot(input.snapshotId) || !deps.isCurrentSnapshot(input.snapshotId))) {
|
|
100
|
+
retry.stop();
|
|
101
|
+
retry = undefined;
|
|
102
|
+
}
|
|
103
|
+
if (!retry && previousRetry && record && deps.isCurrentSnapshot(input.snapshotId)) {
|
|
104
|
+
retry = createRetryState(input.sessionID, record, input.snapshotId);
|
|
105
|
+
record.retry = retry;
|
|
106
|
+
}
|
|
107
|
+
const decision = retry?.on429(input) ?? { handled: false };
|
|
108
|
+
pruneInactiveRecords();
|
|
109
|
+
return decision;
|
|
110
|
+
},
|
|
111
|
+
onOtherError(input) {
|
|
112
|
+
pruneInactiveRecords();
|
|
113
|
+
const retry = sessions.get(input.sessionID)?.retry;
|
|
114
|
+
if (retry && (!retry.matchesSnapshot(input.snapshotId) || !deps.isCurrentSnapshot(input.snapshotId))) {
|
|
115
|
+
retry.stop();
|
|
116
|
+
pruneInactiveRecords();
|
|
117
|
+
return { handled: false };
|
|
118
|
+
}
|
|
119
|
+
const decision = retry?.onOtherError(input) ?? { handled: false };
|
|
120
|
+
pruneInactiveRecords();
|
|
121
|
+
return decision;
|
|
122
|
+
},
|
|
123
|
+
onIdle(sessionID, snapshotId) {
|
|
124
|
+
pruneInactiveRecords();
|
|
125
|
+
const retry = sessions.get(sessionID)?.retry;
|
|
126
|
+
if (retry && (!retry.matchesSnapshot(snapshotId) || !deps.isCurrentSnapshot(snapshotId))) {
|
|
127
|
+
retry.stop();
|
|
128
|
+
pruneInactiveRecords();
|
|
129
|
+
return { kind: "untracked", suppressIdleContinuation: false };
|
|
130
|
+
}
|
|
131
|
+
const result = retry?.onIdle() ?? { kind: "untracked", suppressIdleContinuation: false };
|
|
132
|
+
pruneInactiveRecords();
|
|
133
|
+
return result;
|
|
134
|
+
},
|
|
135
|
+
onDeleted(sessionID) {
|
|
136
|
+
pruneInactiveRecords();
|
|
137
|
+
const record = sessions.get(sessionID);
|
|
138
|
+
record?.retry?.stop();
|
|
139
|
+
sessions.delete(sessionID);
|
|
140
|
+
},
|
|
141
|
+
getActiveDispatchTarget(sessionID, snapshotId) {
|
|
142
|
+
pruneInactiveRecords();
|
|
143
|
+
const retry = sessions.get(sessionID)?.retry;
|
|
144
|
+
if (!retry)
|
|
145
|
+
return undefined;
|
|
146
|
+
if (!retry.matchesSnapshot(snapshotId) || !deps.isCurrentSnapshot(snapshotId)) {
|
|
147
|
+
retry.stop();
|
|
148
|
+
pruneInactiveRecords();
|
|
149
|
+
return undefined;
|
|
150
|
+
}
|
|
151
|
+
return retry.activeTarget();
|
|
152
|
+
},
|
|
153
|
+
recordSessionLineage(input) {
|
|
154
|
+
pruneInactiveRecords();
|
|
155
|
+
const record = sessions.get(input.childSessionID);
|
|
156
|
+
if (!record)
|
|
157
|
+
return "untracked";
|
|
158
|
+
// Canonicalize a supplied runtime review-agent alias (e.g.
|
|
159
|
+
// oracle-second -> oracle-2nd). Other agent names are preserved.
|
|
160
|
+
const canonicalAgent = input.agent === undefined
|
|
161
|
+
? undefined
|
|
162
|
+
: (canonicalizeReviewAgentName(input.agent) ?? input.agent);
|
|
163
|
+
record.correlation = {
|
|
164
|
+
childSessionID: input.childSessionID,
|
|
165
|
+
parentSessionID: input.parentSessionID,
|
|
166
|
+
...(canonicalAgent === undefined ? {} : { agent: canonicalAgent }),
|
|
167
|
+
terminalTaskErrorObserved: false,
|
|
168
|
+
retryableChildErrorObserved: false,
|
|
169
|
+
explicitlyAborted: false,
|
|
170
|
+
};
|
|
171
|
+
return "recorded";
|
|
172
|
+
},
|
|
173
|
+
recordTaskPart(input) {
|
|
174
|
+
pruneInactiveRecords();
|
|
175
|
+
const record = sessions.get(input.childSessionID);
|
|
176
|
+
if (!record)
|
|
177
|
+
return "untracked";
|
|
178
|
+
// Require matching child/parent lineage. The correlation must already
|
|
179
|
+
// exist (recordSessionLineage ran first) OR this is the first evidence
|
|
180
|
+
// for an already-tracked child - either way the child/parent must match.
|
|
181
|
+
if (record.correlation) {
|
|
182
|
+
if (record.correlation.childSessionID !== input.childSessionID
|
|
183
|
+
|| record.correlation.parentSessionID !== input.parentSessionID) {
|
|
184
|
+
return "untracked";
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
// No correlation yet - create one from the task part evidence. This
|
|
189
|
+
// supports the "part-first" arrival order where recordSessionLineage
|
|
190
|
+
// ran but the correlation was empty, OR (defensively) a child that
|
|
191
|
+
// was tracked but had no lineage recorded. The child/parent match is
|
|
192
|
+
// implicitly satisfied because the record exists for input.childSessionID.
|
|
193
|
+
record.correlation = {
|
|
194
|
+
childSessionID: input.childSessionID,
|
|
195
|
+
parentSessionID: input.parentSessionID,
|
|
196
|
+
...(input.agent === undefined ? {} : {
|
|
197
|
+
agent: canonicalizeReviewAgentName(input.agent) ?? input.agent,
|
|
198
|
+
}),
|
|
199
|
+
terminalTaskErrorObserved: false,
|
|
200
|
+
retryableChildErrorObserved: false,
|
|
201
|
+
explicitlyAborted: false,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
refreshInactiveGrace(record);
|
|
205
|
+
const key = dedupKey(input);
|
|
206
|
+
if (record.seenParentParts.has(key))
|
|
207
|
+
return "duplicate";
|
|
208
|
+
record.seenParentParts.add(key);
|
|
209
|
+
// Store parent evidence IDs for parentPartID and callID lookups. A
|
|
210
|
+
// provider callID is never stored without the parent-session constraint
|
|
211
|
+
// (the constraint is enforced by the correlation match above).
|
|
212
|
+
if (input.parentPartID !== undefined)
|
|
213
|
+
record.parentEvidenceIDs.add(input.parentPartID);
|
|
214
|
+
if (input.callID !== undefined)
|
|
215
|
+
record.parentEvidenceIDs.add(input.callID);
|
|
216
|
+
// Copy taskID only when evidence supplied one - never fabricate from childSessionID.
|
|
217
|
+
if (input.taskID !== undefined)
|
|
218
|
+
record.correlation.taskID = input.taskID;
|
|
219
|
+
if (input.callID !== undefined && record.correlation.callID === undefined) {
|
|
220
|
+
record.correlation.callID = input.callID;
|
|
221
|
+
}
|
|
222
|
+
if (input.agent !== undefined && record.correlation.agent === undefined) {
|
|
223
|
+
const canonical = canonicalizeReviewAgentName(input.agent) ?? input.agent;
|
|
224
|
+
record.correlation.agent = canonical;
|
|
225
|
+
}
|
|
226
|
+
record.correlation.terminalTaskErrorObserved = true;
|
|
227
|
+
return "recorded";
|
|
228
|
+
},
|
|
229
|
+
markRetryableChildError(childSessionID) {
|
|
230
|
+
pruneInactiveRecords();
|
|
231
|
+
const record = sessions.get(childSessionID);
|
|
232
|
+
if (!record?.correlation)
|
|
233
|
+
return;
|
|
234
|
+
refreshInactiveGrace(record);
|
|
235
|
+
record.correlation.retryableChildErrorObserved = true;
|
|
236
|
+
},
|
|
237
|
+
markExplicitAbort(childSessionID) {
|
|
238
|
+
pruneInactiveRecords();
|
|
239
|
+
const record = sessions.get(childSessionID);
|
|
240
|
+
if (!record)
|
|
241
|
+
return;
|
|
242
|
+
if (record.correlation)
|
|
243
|
+
record.correlation.explicitlyAborted = true;
|
|
244
|
+
// Stop retry/timers/generations but preserve durable correlation.
|
|
245
|
+
// The identity-checked stop callback clears record.retry only.
|
|
246
|
+
record.retry?.stop();
|
|
247
|
+
if (record.retry === undefined)
|
|
248
|
+
markInactive(record);
|
|
249
|
+
pruneInactiveRecords();
|
|
250
|
+
},
|
|
251
|
+
getInterruptionCorrelation(input) {
|
|
252
|
+
pruneInactiveRecords();
|
|
253
|
+
// Resolve by childSessionID first.
|
|
254
|
+
let record;
|
|
255
|
+
if (input.childSessionID !== undefined) {
|
|
256
|
+
record = sessions.get(input.childSessionID);
|
|
257
|
+
}
|
|
258
|
+
// taskID exact lookup scans existing records for a stored taskID.
|
|
259
|
+
// childSessionID is NEVER treated as taskID.
|
|
260
|
+
if (!record && input.taskID !== undefined) {
|
|
261
|
+
for (const candidate of sessions.values()) {
|
|
262
|
+
if (candidate.correlation?.taskID === input.taskID) {
|
|
263
|
+
record = candidate;
|
|
264
|
+
break;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
if (!record?.correlation)
|
|
269
|
+
return undefined;
|
|
270
|
+
const correlation = record.correlation;
|
|
271
|
+
// parentSessionID must match when supplied.
|
|
272
|
+
if (input.parentSessionID !== undefined && correlation.parentSessionID !== input.parentSessionID) {
|
|
273
|
+
return undefined;
|
|
274
|
+
}
|
|
275
|
+
// parentPartID must be in evidence IDs when supplied.
|
|
276
|
+
if (input.parentPartID !== undefined && !record.parentEvidenceIDs.has(input.parentPartID)) {
|
|
277
|
+
return undefined;
|
|
278
|
+
}
|
|
279
|
+
return correlation;
|
|
280
|
+
},
|
|
281
|
+
claimInterruptionNotice(input) {
|
|
282
|
+
pruneInactiveRecords();
|
|
283
|
+
// Requires a resolved non-aborted correlation and an explicit lookup.taskID.
|
|
284
|
+
if (input.taskID === undefined)
|
|
285
|
+
return false;
|
|
286
|
+
let record = input.childSessionID !== undefined
|
|
287
|
+
? sessions.get(input.childSessionID)
|
|
288
|
+
: undefined;
|
|
289
|
+
// Fall back to taskID lookup if childSessionID was not supplied or did not match.
|
|
290
|
+
if (!record && input.taskID !== undefined) {
|
|
291
|
+
for (const candidate of sessions.values()) {
|
|
292
|
+
if (candidate.correlation?.taskID === input.taskID) {
|
|
293
|
+
// Still enforce parentSessionID/parentPartID when supplied.
|
|
294
|
+
if (input.parentSessionID !== undefined
|
|
295
|
+
&& candidate.correlation.parentSessionID !== input.parentSessionID) {
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
if (input.parentPartID !== undefined
|
|
299
|
+
&& !candidate.parentEvidenceIDs.has(input.parentPartID)) {
|
|
300
|
+
continue;
|
|
301
|
+
}
|
|
302
|
+
record = candidate;
|
|
303
|
+
break;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
if (!record?.correlation)
|
|
308
|
+
return false;
|
|
309
|
+
const correlation = record.correlation;
|
|
310
|
+
if (correlation.explicitlyAborted)
|
|
311
|
+
return false;
|
|
312
|
+
// parentSessionID must match when supplied.
|
|
313
|
+
if (input.parentSessionID !== undefined && correlation.parentSessionID !== input.parentSessionID) {
|
|
314
|
+
return false;
|
|
315
|
+
}
|
|
316
|
+
// parentPartID must be in evidence IDs when supplied.
|
|
317
|
+
if (input.parentPartID !== undefined && !record.parentEvidenceIDs.has(input.parentPartID)) {
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
// When correlation already stores a task ID, the explicit value must match.
|
|
321
|
+
if (correlation.taskID !== undefined && correlation.taskID !== input.taskID) {
|
|
322
|
+
return false;
|
|
323
|
+
}
|
|
324
|
+
// When correlation has no stored taskID, accept the explicit output-adapter
|
|
325
|
+
// taskID without rewriting it as a child ID.
|
|
326
|
+
const claimKey = `${correlation.parentSessionID}:${input.parentPartID ?? input.taskID}`;
|
|
327
|
+
if (record.claimedNotices.has(claimKey))
|
|
328
|
+
return false;
|
|
329
|
+
record.claimedNotices.add(claimKey);
|
|
330
|
+
return true;
|
|
331
|
+
},
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=subagent-429-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent-429-controller.js","sourceRoot":"","sources":["../../src/runtime-fallback/subagent-429-controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { RuntimeFallbackConfig } from "../config/schema.ts";
|
|
2
|
+
import type { FallbackCandidateBlocker } from "./fallback-state.ts";
|
|
3
|
+
import type { Subagent429Scope, Subagent429Target } from "./subagent-429-controller.ts";
|
|
4
|
+
export declare const MAX_RECOVERY_HINT_MS = 600000;
|
|
5
|
+
export type ScopeInfo = {
|
|
6
|
+
key: string;
|
|
7
|
+
scope: Subagent429Scope;
|
|
8
|
+
};
|
|
9
|
+
export declare function scopeFor(target: Subagent429Target, config: RuntimeFallbackConfig): ScopeInfo;
|
|
10
|
+
export declare function scheduleDelay(retriesUsed: number, recoveryDelayMs: number | undefined, random: () => number): number;
|
|
11
|
+
export declare function recoveryDeadline(observedAt: number, recoveryDelayMs: number | undefined): number | undefined;
|
|
12
|
+
export declare function blockedUntil(lastRecoveryDeadline: number | undefined, observedAt: number, cooldownSeconds: number): number;
|
|
13
|
+
export declare function candidateBlocker(blocked: ReadonlyMap<string, number>, config: RuntimeFallbackConfig, clock: () => number): FallbackCandidateBlocker;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export const MAX_RECOVERY_HINT_MS = 600_000;
|
|
2
|
+
export function scopeFor(target, config) {
|
|
3
|
+
const scope = config.subagent429.providerScopes[target.providerID] ?? "model";
|
|
4
|
+
return scope === "provider"
|
|
5
|
+
? { key: `provider:${target.providerID}`, scope }
|
|
6
|
+
: { key: `model:${target.providerID}/${target.modelID}`, scope };
|
|
7
|
+
}
|
|
8
|
+
export function scheduleDelay(retriesUsed, recoveryDelayMs, random) {
|
|
9
|
+
if (recoveryDelayMs !== undefined) {
|
|
10
|
+
return recoveryDelayMs > MAX_RECOVERY_HINT_MS ? 0 : Math.max(0, Math.floor(recoveryDelayMs));
|
|
11
|
+
}
|
|
12
|
+
const raw = Math.min(30_000, 1_000 * 2 ** retriesUsed);
|
|
13
|
+
const value = random();
|
|
14
|
+
const sample = Number.isFinite(value) ? Math.min(Math.max(value, 0), 1 - Number.EPSILON) : 0;
|
|
15
|
+
return Math.floor(raw / 2 + sample * raw / 2);
|
|
16
|
+
}
|
|
17
|
+
export function recoveryDeadline(observedAt, recoveryDelayMs) {
|
|
18
|
+
return recoveryDelayMs !== undefined && Number.isFinite(recoveryDelayMs) && recoveryDelayMs > 0
|
|
19
|
+
? observedAt + recoveryDelayMs
|
|
20
|
+
: undefined;
|
|
21
|
+
}
|
|
22
|
+
export function blockedUntil(lastRecoveryDeadline, observedAt, cooldownSeconds) {
|
|
23
|
+
return lastRecoveryDeadline !== undefined && lastRecoveryDeadline > observedAt
|
|
24
|
+
? lastRecoveryDeadline
|
|
25
|
+
: observedAt + cooldownSeconds * 1_000;
|
|
26
|
+
}
|
|
27
|
+
export function candidateBlocker(blocked, config, clock) {
|
|
28
|
+
return (entry) => {
|
|
29
|
+
const target = {
|
|
30
|
+
providerID: entry.providers[0] ?? "",
|
|
31
|
+
modelID: entry.model,
|
|
32
|
+
entry,
|
|
33
|
+
};
|
|
34
|
+
return (blocked.get(scopeFor(target, config).key) ?? 0) > clock();
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=subagent-429-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent-429-policy.js","sourceRoot":"","sources":["../../src/runtime-fallback/subagent-429-policy.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAA;AAI3C,MAAM,UAAU,QAAQ,CAAC,MAAyB,EAAE,MAA6B;IAC/E,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,OAAO,CAAA;IAC7E,OAAO,KAAK,KAAK,UAAU;QACzB,CAAC,CAAC,EAAE,GAAG,EAAE,YAAY,MAAM,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE;QACjD,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAA;AACpE,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,WAAmB,EACnB,eAAmC,EACnC,MAAoB;IAEpB,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,eAAe,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAA;IAC9F,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,IAAI,WAAW,CAAC,CAAA;IACtD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAA;IACtB,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC5F,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAA;AAC/C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,UAAkB,EAAE,eAAmC;IACtF,OAAO,eAAe,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,eAAe,GAAG,CAAC;QAC7F,CAAC,CAAC,UAAU,GAAG,eAAe;QAC9B,CAAC,CAAC,SAAS,CAAA;AACf,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,oBAAwC,EACxC,UAAkB,EAClB,eAAuB;IAEvB,OAAO,oBAAoB,KAAK,SAAS,IAAI,oBAAoB,GAAG,UAAU;QAC5E,CAAC,CAAC,oBAAoB;QACtB,CAAC,CAAC,UAAU,GAAG,eAAe,GAAG,KAAK,CAAA;AAC1C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,OAAoC,EACpC,MAA6B,EAC7B,KAAmB;IAEnB,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,MAAM,MAAM,GAAsB;YAChC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE;YACpC,OAAO,EAAE,KAAK,CAAC,KAAK;YACpB,KAAK;SACN,CAAA;QACD,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,CAAA;IACnE,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Subagent429Decision, Subagent429DispatchInput, Subagent429ErrorInput, Subagent429IdleResult, Subagent429OtherErrorDecision, Subagent429OtherErrorInput, Subagent429Scheduler, Subagent429Target } from "./subagent-429-controller.ts";
|
|
2
|
+
export type Session429Deps = {
|
|
3
|
+
scheduler: Subagent429Scheduler;
|
|
4
|
+
clock: () => number;
|
|
5
|
+
random: () => number;
|
|
6
|
+
isCurrentSnapshot: (snapshotId: number) => boolean;
|
|
7
|
+
dispatchRetry?: (input: Subagent429DispatchInput) => Promise<boolean>;
|
|
8
|
+
logger: {
|
|
9
|
+
debug(...args: unknown[]): void;
|
|
10
|
+
info(...args: unknown[]): void;
|
|
11
|
+
warn(...args: unknown[]): void;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
export declare class Session429State {
|
|
15
|
+
private lifecycleGeneration;
|
|
16
|
+
private timerGeneration;
|
|
17
|
+
private nextDispatchGeneration;
|
|
18
|
+
private initialPending;
|
|
19
|
+
private pending?;
|
|
20
|
+
private active?;
|
|
21
|
+
private readonly retryCounts;
|
|
22
|
+
private readonly blocked;
|
|
23
|
+
private readonly lastRecoveryDeadlines;
|
|
24
|
+
private readonly sessionID;
|
|
25
|
+
readonly snapshotId: number;
|
|
26
|
+
private readonly deps;
|
|
27
|
+
private readonly isLive;
|
|
28
|
+
private readonly remove;
|
|
29
|
+
constructor(sessionID: string, snapshotId: number, deps: Session429Deps, isLive: () => boolean, remove: () => void);
|
|
30
|
+
matchesSnapshot(snapshotId: number): boolean;
|
|
31
|
+
activeTarget(): Subagent429Target | undefined;
|
|
32
|
+
stop(): void;
|
|
33
|
+
on429(input: Subagent429ErrorInput): Subagent429Decision;
|
|
34
|
+
onOtherError(input: Subagent429OtherErrorInput): Subagent429OtherErrorDecision;
|
|
35
|
+
onIdle(): Subagent429IdleResult;
|
|
36
|
+
private restriction;
|
|
37
|
+
private process429;
|
|
38
|
+
private queue429;
|
|
39
|
+
private installGate;
|
|
40
|
+
private maybeStart;
|
|
41
|
+
private settle;
|
|
42
|
+
private processQueued;
|
|
43
|
+
private account;
|
|
44
|
+
private isCurrent;
|
|
45
|
+
private isSnapshotCurrent;
|
|
46
|
+
private stopIfSnapshotStale;
|
|
47
|
+
private logTarget;
|
|
48
|
+
}
|