@superblocksteam/vite-plugin-file-sync 2.0.70 → 2.0.71-next.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/dist/ai-service/agent/prompts/build-base-system-prompt.js +1 -1
- package/dist/ai-service/agent/subagents/types.d.ts.map +1 -1
- package/dist/ai-service/agent/subagents/types.js +1 -0
- package/dist/ai-service/agent/subagents/types.js.map +1 -1
- package/dist/ai-service/agent/tool-message-utils.d.ts.map +1 -1
- package/dist/ai-service/agent/tool-message-utils.js +5 -0
- package/dist/ai-service/agent/tool-message-utils.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/build-api-artifact.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/build-api-artifact.js +2 -1
- package/dist/ai-service/agent/tools/apis/build-api-artifact.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/sample-json.d.ts +2 -0
- package/dist/ai-service/agent/tools/apis/sample-json.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/apis/sample-json.js +16 -0
- package/dist/ai-service/agent/tools/apis/sample-json.js.map +1 -0
- package/dist/ai-service/agent/tools/apis/test-api.d.ts +4 -4
- package/dist/ai-service/agent/tools/apis/test-api.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/test-api.js +16 -5
- package/dist/ai-service/agent/tools/apis/test-api.js.map +1 -1
- package/dist/ai-service/agent/tools/build-capture-screenshot.d.ts +35 -0
- package/dist/ai-service/agent/tools/build-capture-screenshot.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-capture-screenshot.js +90 -15
- package/dist/ai-service/agent/tools/build-capture-screenshot.js.map +1 -1
- package/dist/ai-service/agent/tools/build-validate-icons.d.ts +3 -18
- package/dist/ai-service/agent/tools/build-validate-icons.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-validate-icons.js +12 -50
- package/dist/ai-service/agent/tools/build-validate-icons.js.map +1 -1
- package/dist/ai-service/agent/tools/debug-cache.js.map +1 -1
- package/dist/ai-service/agent/tools/integrations/execute-request.d.ts +1 -1
- package/dist/ai-service/agent/tools/shared-helpers.d.ts +0 -35
- package/dist/ai-service/agent/tools/shared-helpers.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/shared-helpers.js +0 -89
- package/dist/ai-service/agent/tools/shared-helpers.js.map +1 -1
- package/dist/ai-service/agent/tools2/access-control.d.ts +1 -23
- package/dist/ai-service/agent/tools2/access-control.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/access-control.js +3 -68
- package/dist/ai-service/agent/tools2/access-control.js.map +1 -1
- package/dist/ai-service/agent/tools2/registry.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/registry.js +16 -5
- package/dist/ai-service/agent/tools2/registry.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/bash.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/bash.js +2 -1
- package/dist/ai-service/agent/tools2/tools/bash.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js +10 -2
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/grep.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/grep.js +2 -1
- package/dist/ai-service/agent/tools2/tools/grep.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/ls.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/ls.js +3 -1
- package/dist/ai-service/agent/tools2/tools/ls.js.map +1 -1
- package/dist/ai-service/agent/tools2/types.d.ts +2 -1
- package/dist/ai-service/agent/tools2/types.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/types.js +31 -11
- package/dist/ai-service/agent/tools2/types.js.map +1 -1
- package/dist/ai-service/agent/utils.d.ts.map +1 -1
- package/dist/ai-service/agent/utils.js +5 -10
- package/dist/ai-service/agent/utils.js.map +1 -1
- package/dist/ai-service/clark-provider/clark-chat-settings.d.ts +2 -1
- package/dist/ai-service/clark-provider/clark-chat-settings.d.ts.map +1 -1
- package/dist/ai-service/clark-provider/clark-chat-settings.js +1 -0
- package/dist/ai-service/clark-provider/clark-chat-settings.js.map +1 -1
- package/dist/ai-service/index.d.ts.map +1 -1
- package/dist/ai-service/index.js +7 -4
- package/dist/ai-service/index.js.map +1 -1
- package/dist/ai-service/integrations/store.d.ts +1 -0
- package/dist/ai-service/integrations/store.d.ts.map +1 -1
- package/dist/ai-service/integrations/store.js +1 -0
- package/dist/ai-service/integrations/store.js.map +1 -1
- package/dist/ai-service/llm/client.d.ts +14 -117
- package/dist/ai-service/llm/client.d.ts.map +1 -1
- package/dist/ai-service/llm/client.js +57 -149
- package/dist/ai-service/llm/client.js.map +1 -1
- package/dist/ai-service/llm/error.d.ts +7 -2
- package/dist/ai-service/llm/error.d.ts.map +1 -1
- package/dist/ai-service/llm/error.js +17 -17
- package/dist/ai-service/llm/error.js.map +1 -1
- package/dist/ai-service/llm/impl/anthropic.d.ts.map +1 -1
- package/dist/ai-service/llm/impl/anthropic.js +2 -1
- package/dist/ai-service/llm/impl/anthropic.js.map +1 -1
- package/dist/ai-service/llm/impl/clark.d.ts.map +1 -1
- package/dist/ai-service/llm/impl/clark.js +2 -1
- package/dist/ai-service/llm/impl/clark.js.map +1 -1
- package/dist/ai-service/llm/interaction/index.d.ts +0 -64
- package/dist/ai-service/llm/interaction/index.d.ts.map +1 -1
- package/dist/ai-service/llm/interaction/index.js +0 -65
- package/dist/ai-service/llm/interaction/index.js.map +1 -1
- package/dist/ai-service/llm/provider.d.ts.map +1 -1
- package/dist/ai-service/llm/provider.js +2 -6
- package/dist/ai-service/llm/provider.js.map +1 -1
- package/dist/ai-service/llm/stream/config.d.ts +56 -0
- package/dist/ai-service/llm/stream/config.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/config.js +41 -0
- package/dist/ai-service/llm/stream/config.js.map +1 -0
- package/dist/ai-service/llm/stream/errors.d.ts +16 -0
- package/dist/ai-service/llm/stream/errors.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/errors.js +68 -0
- package/dist/ai-service/llm/stream/errors.js.map +1 -0
- package/dist/ai-service/llm/stream/event-bus.d.ts +68 -0
- package/dist/ai-service/llm/stream/event-bus.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/event-bus.js +51 -0
- package/dist/ai-service/llm/stream/event-bus.js.map +1 -0
- package/dist/ai-service/llm/stream/index.d.ts +49 -0
- package/dist/ai-service/llm/stream/index.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/index.js +46 -0
- package/dist/ai-service/llm/stream/index.js.map +1 -0
- package/dist/ai-service/llm/stream/managed-stream.d.ts +25 -0
- package/dist/ai-service/llm/stream/managed-stream.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/managed-stream.js +68 -0
- package/dist/ai-service/llm/stream/managed-stream.js.map +1 -0
- package/dist/ai-service/llm/stream/observer.d.ts +34 -0
- package/dist/ai-service/llm/stream/observer.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/observer.js +2 -0
- package/dist/ai-service/llm/stream/observer.js.map +1 -0
- package/dist/ai-service/llm/stream/observers/context.d.ts +40 -0
- package/dist/ai-service/llm/stream/observers/context.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/observers/context.js +55 -0
- package/dist/ai-service/llm/stream/observers/context.js.map +1 -0
- package/dist/ai-service/llm/stream/observers/index.d.ts +8 -0
- package/dist/ai-service/llm/stream/observers/index.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/observers/index.js +8 -0
- package/dist/ai-service/llm/stream/observers/index.js.map +1 -0
- package/dist/ai-service/llm/stream/observers/llmobs.d.ts +78 -0
- package/dist/ai-service/llm/stream/observers/llmobs.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/observers/llmobs.js +504 -0
- package/dist/ai-service/llm/stream/observers/llmobs.js.map +1 -0
- package/dist/ai-service/llm/stream/observers/logging.d.ts +46 -0
- package/dist/ai-service/llm/stream/observers/logging.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/observers/logging.js +296 -0
- package/dist/ai-service/llm/stream/observers/logging.js.map +1 -0
- package/dist/ai-service/llm/stream/observers/retry-notification.d.ts +17 -0
- package/dist/ai-service/llm/stream/observers/retry-notification.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/observers/retry-notification.js +36 -0
- package/dist/ai-service/llm/stream/observers/retry-notification.js.map +1 -0
- package/dist/ai-service/llm/stream/orchestrator.d.ts +73 -0
- package/dist/ai-service/llm/stream/orchestrator.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/orchestrator.js +285 -0
- package/dist/ai-service/llm/stream/orchestrator.js.map +1 -0
- package/dist/ai-service/llm/stream/retry-engine.d.ts +58 -0
- package/dist/ai-service/llm/stream/retry-engine.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/retry-engine.js +151 -0
- package/dist/ai-service/llm/stream/retry-engine.js.map +1 -0
- package/dist/ai-service/llm/stream/session.d.ts +58 -0
- package/dist/ai-service/llm/stream/session.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/session.js +116 -0
- package/dist/ai-service/llm/stream/session.js.map +1 -0
- package/dist/ai-service/llm/stream/tests/helpers/mock-provider.d.ts +129 -0
- package/dist/ai-service/llm/stream/tests/helpers/mock-provider.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/tests/helpers/mock-provider.js +508 -0
- package/dist/ai-service/llm/stream/tests/helpers/mock-provider.js.map +1 -0
- package/dist/ai-service/llm/stream/types.d.ts +15 -0
- package/dist/ai-service/llm/stream/types.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/types.js +2 -0
- package/dist/ai-service/llm/stream/types.js.map +1 -0
- package/dist/ai-service/llm/types.d.ts +1 -1
- package/dist/ai-service/llm/types.d.ts.map +1 -1
- package/dist/ai-service/llmobs/helpers.d.ts +0 -19
- package/dist/ai-service/llmobs/helpers.d.ts.map +1 -1
- package/dist/ai-service/llmobs/helpers.js +0 -23
- package/dist/ai-service/llmobs/helpers.js.map +1 -1
- package/dist/ai-service/llmobs/tracer.d.ts +1 -0
- package/dist/ai-service/llmobs/tracer.d.ts.map +1 -1
- package/dist/ai-service/llmobs/tracer.js +1 -0
- package/dist/ai-service/llmobs/tracer.js.map +1 -1
- package/dist/ai-service/llmobs/types.d.ts +2 -0
- package/dist/ai-service/llmobs/types.d.ts.map +1 -1
- package/dist/ai-service/llmobs/utils.d.ts.map +1 -1
- package/dist/ai-service/llmobs/utils.js +8 -0
- package/dist/ai-service/llmobs/utils.js.map +1 -1
- package/dist/ai-service/mcp/playwright-server.d.ts.map +1 -1
- package/dist/ai-service/mcp/playwright-server.js.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.d.ts +1 -3
- package/dist/ai-service/state-machine/clark-fsm.d.ts.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.js +6 -28
- package/dist/ai-service/state-machine/clark-fsm.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/agent-planning.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/agent-planning.js +9 -11
- package/dist/ai-service/state-machine/handlers/agent-planning.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/awaiting-user.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/awaiting-user.js +3 -2
- package/dist/ai-service/state-machine/handlers/awaiting-user.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/llm-generating.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/llm-generating.js +18 -4
- package/dist/ai-service/state-machine/handlers/llm-generating.js.map +1 -1
- package/dist/ai-service/state-machine/traced-fsm.d.ts +5 -4
- package/dist/ai-service/state-machine/traced-fsm.d.ts.map +1 -1
- package/dist/ai-service/state-machine/traced-fsm.js +25 -25
- package/dist/ai-service/state-machine/traced-fsm.js.map +1 -1
- package/dist/ai-service/types.d.ts +3 -3
- package/dist/ai-service/types.d.ts.map +1 -1
- package/dist/ai-service/types.js +10 -10
- package/dist/ai-service/types.js.map +1 -1
- package/dist/socket-manager.d.ts.map +1 -1
- package/dist/socket-manager.js +10 -3
- package/dist/socket-manager.js.map +1 -1
- package/dist/source-tracker.d.ts.map +1 -1
- package/dist/source-tracker.js +8 -0
- package/dist/source-tracker.js.map +1 -1
- package/dist/sync-service/index.d.ts +7 -2
- package/dist/sync-service/index.d.ts.map +1 -1
- package/dist/sync-service/index.js +16 -9
- package/dist/sync-service/index.js.map +1 -1
- package/package.json +11 -11
- package/dist/ai-service/llm/interaction/compose.d.ts +0 -71
- package/dist/ai-service/llm/interaction/compose.d.ts.map +0 -1
- package/dist/ai-service/llm/interaction/compose.js +0 -88
- package/dist/ai-service/llm/interaction/compose.js.map +0 -1
- package/dist/ai-service/llm/interaction/middleware.d.ts +0 -52
- package/dist/ai-service/llm/interaction/middleware.d.ts.map +0 -1
- package/dist/ai-service/llm/interaction/middleware.js +0 -17
- package/dist/ai-service/llm/interaction/middleware.js.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/llmobs.d.ts +0 -45
- package/dist/ai-service/llm/interaction/middlewares/llmobs.d.ts.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/llmobs.js +0 -85
- package/dist/ai-service/llm/interaction/middlewares/llmobs.js.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/logging.d.ts +0 -88
- package/dist/ai-service/llm/interaction/middlewares/logging.d.ts.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/logging.js +0 -238
- package/dist/ai-service/llm/interaction/middlewares/logging.js.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/profiler.d.ts +0 -47
- package/dist/ai-service/llm/interaction/middlewares/profiler.d.ts.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/profiler.js +0 -183
- package/dist/ai-service/llm/interaction/middlewares/profiler.js.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/stream-retry.d.ts +0 -115
- package/dist/ai-service/llm/interaction/middlewares/stream-retry.d.ts.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/stream-retry.js +0 -231
- package/dist/ai-service/llm/interaction/middlewares/stream-retry.js.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/utils/abort.d.ts +0 -41
- package/dist/ai-service/llm/interaction/middlewares/utils/abort.d.ts.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/utils/abort.js +0 -74
- package/dist/ai-service/llm/interaction/middlewares/utils/abort.js.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/utils/fallback-chain.d.ts +0 -61
- package/dist/ai-service/llm/interaction/middlewares/utils/fallback-chain.d.ts.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/utils/fallback-chain.js +0 -116
- package/dist/ai-service/llm/interaction/middlewares/utils/fallback-chain.js.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/utils/retries.d.ts +0 -47
- package/dist/ai-service/llm/interaction/middlewares/utils/retries.d.ts.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/utils/retries.js +0 -141
- package/dist/ai-service/llm/interaction/middlewares/utils/retries.js.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/utils/stall-detector.d.ts +0 -30
- package/dist/ai-service/llm/interaction/middlewares/utils/stall-detector.d.ts.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/utils/stall-detector.js +0 -36
- package/dist/ai-service/llm/interaction/middlewares/utils/stall-detector.js.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/utils/streams.d.ts +0 -42
- package/dist/ai-service/llm/interaction/middlewares/utils/streams.d.ts.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/utils/streams.js +0 -208
- package/dist/ai-service/llm/interaction/middlewares/utils/streams.js.map +0 -1
- package/dist/ai-service/llmobs/middleware/stream-text.d.ts +0 -56
- package/dist/ai-service/llmobs/middleware/stream-text.d.ts.map +0 -1
- package/dist/ai-service/llmobs/middleware/stream-text.js +0 -597
- package/dist/ai-service/llmobs/middleware/stream-text.js.map +0 -1
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { LLMProviderError } from "../error.js";
|
|
2
|
+
import { AbortedError, RetriesExhaustedError } from "./errors.js";
|
|
3
|
+
import { createManagedStream } from "./managed-stream.js";
|
|
4
|
+
import { RetryEngine } from "./retry-engine.js";
|
|
5
|
+
import { StreamSession } from "./session.js";
|
|
6
|
+
/**
|
|
7
|
+
* The main coordinator for stream operations.
|
|
8
|
+
*
|
|
9
|
+
* Brings together all components:
|
|
10
|
+
* - StreamSession for state management
|
|
11
|
+
* - RetryEngine for retry/fallback decisions
|
|
12
|
+
* - ManagedStream for lifecycle tracking
|
|
13
|
+
* - Observers for side effects
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* const orchestrator = new StreamOrchestrator({
|
|
18
|
+
* provider: createVercelProvider(),
|
|
19
|
+
* config: StreamConfig.create({ retry: { maxAttempts: 3 } }),
|
|
20
|
+
* observers: [new LoggingObserver()],
|
|
21
|
+
* logger: getLogger(),
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* const result = await orchestrator.execute({
|
|
25
|
+
* model,
|
|
26
|
+
* messages,
|
|
27
|
+
* tools,
|
|
28
|
+
* });
|
|
29
|
+
*
|
|
30
|
+
* for await (const chunk of result.fullStream) {
|
|
31
|
+
* console.log(chunk);
|
|
32
|
+
* }
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export class StreamOrchestrator {
|
|
36
|
+
provider;
|
|
37
|
+
config;
|
|
38
|
+
observers;
|
|
39
|
+
logger;
|
|
40
|
+
constructor(options) {
|
|
41
|
+
this.provider = options.provider;
|
|
42
|
+
this.config = options.config;
|
|
43
|
+
this.observers = options.observers ?? [];
|
|
44
|
+
this.logger = options.logger;
|
|
45
|
+
}
|
|
46
|
+
async execute(options) {
|
|
47
|
+
if (options.abortSignal?.aborted) {
|
|
48
|
+
throw new Error("aborted");
|
|
49
|
+
}
|
|
50
|
+
const retryEngine = new RetryEngine(this.config);
|
|
51
|
+
const initialProvider = retryEngine.getInitialProvider();
|
|
52
|
+
const session = new StreamSession(this.config, initialProvider);
|
|
53
|
+
const internalAbortController = new AbortController();
|
|
54
|
+
if (options.abortSignal) {
|
|
55
|
+
options.abortSignal.addEventListener("abort", () => {
|
|
56
|
+
internalAbortController.abort();
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
const optionsWithAbort = {
|
|
60
|
+
...options,
|
|
61
|
+
abortSignal: internalAbortController.signal,
|
|
62
|
+
};
|
|
63
|
+
this.logger.info(`[orchestrator] Starting session ${session.id} with provider=${initialProvider.name} model=${initialProvider.model}`);
|
|
64
|
+
for (const observer of this.observers) {
|
|
65
|
+
observer.attach(session.events, this.config);
|
|
66
|
+
}
|
|
67
|
+
await session.events.emit("session:start", session, {
|
|
68
|
+
system: options.system,
|
|
69
|
+
messages: options.messages ?? [],
|
|
70
|
+
tools: options.tools,
|
|
71
|
+
});
|
|
72
|
+
internalAbortController.signal.addEventListener("abort", () => {
|
|
73
|
+
void session.events.emit("session:abort", session);
|
|
74
|
+
});
|
|
75
|
+
const result = await this.startStreamWithRetry(optionsWithAbort, session, retryEngine);
|
|
76
|
+
// wrapper order matters here. managed stream throws errors (error chunks), retry wrapper catches them.
|
|
77
|
+
const managedStream = createManagedStream(result.fullStream, session);
|
|
78
|
+
const retryableFullStream = this.wrapWithRetry(managedStream, (r) => createManagedStream(r.fullStream, session), optionsWithAbort, session, retryEngine, internalAbortController);
|
|
79
|
+
return {
|
|
80
|
+
...result,
|
|
81
|
+
fullStream: retryableFullStream,
|
|
82
|
+
textStream: result.textStream,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Wraps a fullStream with retry logic. When an error occurs (either thrown or
|
|
87
|
+
* as an error chunk), makes a retry decision and either creates a new stream
|
|
88
|
+
* or throws the final error. It catches errors from the managed stream (inner)
|
|
89
|
+
* and decides whether to retry or give up. Session finalization happens here,
|
|
90
|
+
* not in the managed stream. If you add finalization to managed-stream.ts,
|
|
91
|
+
* retries will silently fail (the new stream will close immediately because
|
|
92
|
+
* session.isPending() returns false).
|
|
93
|
+
*/
|
|
94
|
+
wrapWithRetry(initialStream, getNewStream, options, session, retryEngine, abortController) {
|
|
95
|
+
const handleRetry = this.handleRetryDecision.bind(this);
|
|
96
|
+
let currentStream = initialStream;
|
|
97
|
+
async function* createRetryIterator() {
|
|
98
|
+
while (true) {
|
|
99
|
+
try {
|
|
100
|
+
for await (const chunk of currentStream) {
|
|
101
|
+
// throw for the retry logic to take over
|
|
102
|
+
if (chunk.type === "error") {
|
|
103
|
+
throw chunk.error;
|
|
104
|
+
}
|
|
105
|
+
yield chunk;
|
|
106
|
+
}
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
const retryResult = await handleRetry(error, options, session, retryEngine);
|
|
111
|
+
if (!retryResult.shouldRetry) {
|
|
112
|
+
// abort the internal signal so any in-flight stream processing stops.
|
|
113
|
+
// without this, tools keep getting called in the background since the stream is not closed.
|
|
114
|
+
abortController.abort();
|
|
115
|
+
throw retryResult.error;
|
|
116
|
+
}
|
|
117
|
+
currentStream = getNewStream(retryResult.newResult);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const sharedIterator = createRetryIterator();
|
|
122
|
+
const readable = new ReadableStream({
|
|
123
|
+
async pull(controller) {
|
|
124
|
+
try {
|
|
125
|
+
const result = await sharedIterator.next();
|
|
126
|
+
if (result.done) {
|
|
127
|
+
controller.close();
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
controller.enqueue(result.value);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
controller.error(error);
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
async cancel() {
|
|
138
|
+
await sharedIterator.return?.(undefined);
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
return readable;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Handle an error by making a retry decision. Returns either a new result to continue
|
|
145
|
+
* with, or the final error to throw.
|
|
146
|
+
*/
|
|
147
|
+
async handleRetryDecision(error, options, session, retryEngine) {
|
|
148
|
+
const decision = retryEngine.getRetryDecision(error, session, options.abortSignal);
|
|
149
|
+
if (!decision.shouldRetry) {
|
|
150
|
+
this.logger.error(`[orchestrator] Not retrying: reason=${decision.reason}`, {
|
|
151
|
+
error: {
|
|
152
|
+
kind: error instanceof Error ? error.name : "unknown",
|
|
153
|
+
message: error instanceof Error ? error.message : String(error),
|
|
154
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
155
|
+
},
|
|
156
|
+
});
|
|
157
|
+
session.finalize("error", error);
|
|
158
|
+
return {
|
|
159
|
+
shouldRetry: false,
|
|
160
|
+
error: this.wrapFinalError(error, decision.reason ?? "unknown", session),
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
await session.events.emit("retry", error, session.attempt, decision.delayMs, session);
|
|
164
|
+
if (decision.newProvider) {
|
|
165
|
+
const oldProvider = session.provider;
|
|
166
|
+
session.provider = decision.newProvider;
|
|
167
|
+
this.logger.info(`[orchestrator] Switching provider: ${oldProvider.name}/${oldProvider.model} -> ${decision.newProvider.name}/${decision.newProvider.model}`);
|
|
168
|
+
await session.events.emit("fallback", oldProvider, decision.newProvider, this.getFallbackReason(error), session);
|
|
169
|
+
}
|
|
170
|
+
session.recordRetry(decision.delayMs);
|
|
171
|
+
this.logger.info(`[orchestrator] Retrying in ${decision.delayMs}ms (attempt ${session.attempt})`);
|
|
172
|
+
await this.delay(decision.delayMs, options.abortSignal);
|
|
173
|
+
const newResult = await this.startStreamWithRetry(options, session, retryEngine);
|
|
174
|
+
return { shouldRetry: true, newResult };
|
|
175
|
+
}
|
|
176
|
+
async startStreamWithRetry(options, session, retryEngine) {
|
|
177
|
+
while (true) {
|
|
178
|
+
try {
|
|
179
|
+
return await this.startStream(options, session);
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
const decision = retryEngine.getRetryDecision(error, session, options.abortSignal);
|
|
183
|
+
if (!decision.shouldRetry) {
|
|
184
|
+
this.logger.error(`[orchestrator] Startup error, not retrying: reason=${decision.reason}`, {
|
|
185
|
+
error: {
|
|
186
|
+
kind: error instanceof Error ? error.name : "unknown",
|
|
187
|
+
message: error instanceof Error ? error.message : String(error),
|
|
188
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
189
|
+
},
|
|
190
|
+
});
|
|
191
|
+
await session.events.emit("session:error", error, session);
|
|
192
|
+
throw this.wrapFinalError(error, decision.reason ?? "unknown", session);
|
|
193
|
+
}
|
|
194
|
+
await session.events.emit("retry", error, session.attempt, decision.delayMs, session);
|
|
195
|
+
if (decision.newProvider) {
|
|
196
|
+
const oldProvider = session.provider;
|
|
197
|
+
session.provider = decision.newProvider;
|
|
198
|
+
this.logger.info(`[orchestrator] Switching provider: ${oldProvider.name}/${oldProvider.model} -> ${decision.newProvider.name}/${decision.newProvider.model}`);
|
|
199
|
+
await session.events.emit("fallback", oldProvider, decision.newProvider, this.getFallbackReason(error), session);
|
|
200
|
+
}
|
|
201
|
+
session.recordRetry(decision.delayMs);
|
|
202
|
+
this.logger.info(`[orchestrator] Startup retry in ${decision.delayMs}ms (attempt ${session.attempt})`);
|
|
203
|
+
await this.delay(decision.delayMs, options.abortSignal);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// todo(@omar): this needs to use the wrapError helper
|
|
208
|
+
wrapFinalError(error, reason, session) {
|
|
209
|
+
if (reason === "aborted") {
|
|
210
|
+
return new AbortedError();
|
|
211
|
+
}
|
|
212
|
+
if (reason === "max-attempts" || reason === "max-time") {
|
|
213
|
+
return new RetriesExhaustedError(session.attempt, session.getElapsedMs(), error);
|
|
214
|
+
}
|
|
215
|
+
return new LLMProviderError({
|
|
216
|
+
provider: session.provider.name,
|
|
217
|
+
message: error instanceof Error
|
|
218
|
+
? (error.message ?? "All retries exhausted")
|
|
219
|
+
: "All retries exhausted",
|
|
220
|
+
type: "retries_exhausted",
|
|
221
|
+
isRetryable: false,
|
|
222
|
+
cause: error,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
async startStream(options, session) {
|
|
226
|
+
if (options.abortSignal?.aborted) {
|
|
227
|
+
throw new AbortedError();
|
|
228
|
+
}
|
|
229
|
+
const providerOptions = this.applyProvider(options, session.provider);
|
|
230
|
+
this.logger.debug(`[orchestrator] Attempt ${session.attempt} with provider=${session.provider.name} model=${session.provider.model}`);
|
|
231
|
+
return this.provider.streamText({
|
|
232
|
+
...providerOptions,
|
|
233
|
+
prepareStep: options.prepareStep,
|
|
234
|
+
onStepFinish: async (step) => {
|
|
235
|
+
await session.events.emit("step:complete", step, session);
|
|
236
|
+
await options.onStepFinish?.(step);
|
|
237
|
+
},
|
|
238
|
+
onFinish: async (finalResult) => {
|
|
239
|
+
session.setTotalTokens(finalResult.totalUsage?.totalTokens ?? 0);
|
|
240
|
+
await session.events.emit("stream:finish", finalResult, session);
|
|
241
|
+
return options.onFinish?.(finalResult);
|
|
242
|
+
},
|
|
243
|
+
onChunk: options.onChunk,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
applyProvider(options, provider) {
|
|
247
|
+
if (!this.config.fallback.enabled) {
|
|
248
|
+
return options;
|
|
249
|
+
}
|
|
250
|
+
return {
|
|
251
|
+
...options,
|
|
252
|
+
providerOptions: {
|
|
253
|
+
...options.providerOptions,
|
|
254
|
+
unified: {
|
|
255
|
+
...(options.providerOptions?.unified ??
|
|
256
|
+
{}),
|
|
257
|
+
forceProvider: provider.name,
|
|
258
|
+
coreModel: provider.model,
|
|
259
|
+
},
|
|
260
|
+
},
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
getFallbackReason(error) {
|
|
264
|
+
if (error && typeof error === "object" && "type" in error) {
|
|
265
|
+
const errorType = error.type;
|
|
266
|
+
if (errorType === "no_output")
|
|
267
|
+
return "no_output";
|
|
268
|
+
}
|
|
269
|
+
return "error";
|
|
270
|
+
}
|
|
271
|
+
delay(ms, abortSignal) {
|
|
272
|
+
return new Promise((resolve) => {
|
|
273
|
+
if (abortSignal?.aborted) {
|
|
274
|
+
resolve();
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
const timeoutId = setTimeout(resolve, ms);
|
|
278
|
+
abortSignal?.addEventListener("abort", () => {
|
|
279
|
+
clearTimeout(timeoutId);
|
|
280
|
+
resolve();
|
|
281
|
+
}, { once: true });
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../../src/ai-service/llm/stream/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { StreamConfig, ProviderType, CoreModelType } from "./config.js";
|
|
2
|
+
import type { StreamSession } from "./session.js";
|
|
3
|
+
import type { ProviderInfo } from "./types.js";
|
|
4
|
+
export interface FallbackAttempt {
|
|
5
|
+
provider: ProviderType;
|
|
6
|
+
model: CoreModelType;
|
|
7
|
+
}
|
|
8
|
+
export interface RetryDecision {
|
|
9
|
+
shouldRetry: boolean;
|
|
10
|
+
delayMs: number;
|
|
11
|
+
newProvider?: ProviderInfo;
|
|
12
|
+
reason?: "non-retryable" | "max-attempts" | "max-time" | "aborted" | "auth_error" | "not_found" | "rate_limit" | "api_error";
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Engine for making retry and fallback decisions.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const engine = new RetryEngine(config);
|
|
20
|
+
*
|
|
21
|
+
* // Check if we should retry
|
|
22
|
+
* const decision = engine.getRetryDecision(error, session);
|
|
23
|
+
*
|
|
24
|
+
* if (decision.shouldRetry) {
|
|
25
|
+
* // Update provider if fallback
|
|
26
|
+
* if (decision.newProvider) {
|
|
27
|
+
* session.provider = decision.newProvider;
|
|
28
|
+
* }
|
|
29
|
+
* // Wait and retry
|
|
30
|
+
* await sleep(decision.delayMs);
|
|
31
|
+
* } else {
|
|
32
|
+
* // Give up
|
|
33
|
+
* throw error;
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare class RetryEngine {
|
|
38
|
+
private readonly config;
|
|
39
|
+
private readonly fallbackChain;
|
|
40
|
+
private fallbackIndex;
|
|
41
|
+
constructor(config: StreamConfig);
|
|
42
|
+
getRetryDecision(error: unknown, session: StreamSession, abortSignal?: AbortSignal): RetryDecision;
|
|
43
|
+
getInitialProvider(): ProviderInfo;
|
|
44
|
+
resetFallback(): void;
|
|
45
|
+
isRetryable(error: unknown): boolean;
|
|
46
|
+
private calculateDelay;
|
|
47
|
+
private advanceFallback;
|
|
48
|
+
/**
|
|
49
|
+
* Build the fallback chain based on initial provider/model.
|
|
50
|
+
*
|
|
51
|
+
* Chain construction:
|
|
52
|
+
* - Provider order is determined by initialProvider (that provider first, then the other)
|
|
53
|
+
* - If using opus, try opus on all providers first, then sonnet on all providers
|
|
54
|
+
* - If using sonnet, each provider only gets sonnet
|
|
55
|
+
*/
|
|
56
|
+
private buildFallbackChain;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=retry-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-engine.d.ts","sourceRoot":"","sources":["../../../../src/ai-service/llm/stream/retry-engine.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,aAAa,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,MAAM,CAAC,EACH,eAAe,GACf,cAAc,GACd,UAAU,GACV,SAAS,GACT,YAAY,GACZ,WAAW,GACX,YAAY,GACZ,WAAW,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,OAAO,CAAC,aAAa,CAAK;gBAEd,MAAM,EAAE,YAAY;IAKhC,gBAAgB,CACd,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,aAAa,EACtB,WAAW,CAAC,EAAE,WAAW,GACxB,aAAa;IAsDhB,kBAAkB,IAAI,YAAY;IAWlC,aAAa,IAAI,IAAI;IAIrB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAOpC,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,eAAe;IAcvB;;;;;;;OAOG;IACH,OAAO,CAAC,kBAAkB;CA8B3B"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { APICallError } from "ai";
|
|
2
|
+
import { LLMProviderError } from "../error.js";
|
|
3
|
+
/**
|
|
4
|
+
* Engine for making retry and fallback decisions.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* const engine = new RetryEngine(config);
|
|
9
|
+
*
|
|
10
|
+
* // Check if we should retry
|
|
11
|
+
* const decision = engine.getRetryDecision(error, session);
|
|
12
|
+
*
|
|
13
|
+
* if (decision.shouldRetry) {
|
|
14
|
+
* // Update provider if fallback
|
|
15
|
+
* if (decision.newProvider) {
|
|
16
|
+
* session.provider = decision.newProvider;
|
|
17
|
+
* }
|
|
18
|
+
* // Wait and retry
|
|
19
|
+
* await sleep(decision.delayMs);
|
|
20
|
+
* } else {
|
|
21
|
+
* // Give up
|
|
22
|
+
* throw error;
|
|
23
|
+
* }
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export class RetryEngine {
|
|
27
|
+
config;
|
|
28
|
+
fallbackChain;
|
|
29
|
+
fallbackIndex = 0;
|
|
30
|
+
constructor(config) {
|
|
31
|
+
this.config = config;
|
|
32
|
+
this.fallbackChain = this.buildFallbackChain();
|
|
33
|
+
}
|
|
34
|
+
getRetryDecision(error, session, abortSignal) {
|
|
35
|
+
if (abortSignal?.aborted) {
|
|
36
|
+
return { shouldRetry: false, delayMs: 0, reason: "aborted" };
|
|
37
|
+
}
|
|
38
|
+
if (!this.isRetryable(error)) {
|
|
39
|
+
if (APICallError.isInstance(error)) {
|
|
40
|
+
const statusCode = error.statusCode;
|
|
41
|
+
let cause = "non-retryable";
|
|
42
|
+
if (statusCode === 401 || statusCode === 403) {
|
|
43
|
+
cause = "auth_error";
|
|
44
|
+
}
|
|
45
|
+
if (statusCode === 404) {
|
|
46
|
+
cause = "not_found";
|
|
47
|
+
}
|
|
48
|
+
if (statusCode === 429) {
|
|
49
|
+
cause = "rate_limit";
|
|
50
|
+
}
|
|
51
|
+
if (statusCode === 500) {
|
|
52
|
+
cause = "api_error";
|
|
53
|
+
}
|
|
54
|
+
return { shouldRetry: false, delayMs: 0, reason: cause };
|
|
55
|
+
}
|
|
56
|
+
return { shouldRetry: false, delayMs: 0, reason: "non-retryable" };
|
|
57
|
+
}
|
|
58
|
+
// check time since last chunk, not total elapsed time. if chunks are flowing,
|
|
59
|
+
// we're making progress and shouldn't timeout. only give up if we're stuck.
|
|
60
|
+
const timeSinceActivity = session.getTimeSinceLastActivity();
|
|
61
|
+
const { maxTotalTimeMs } = this.config.retry;
|
|
62
|
+
if (timeSinceActivity >= maxTotalTimeMs) {
|
|
63
|
+
return { shouldRetry: false, delayMs: 0, reason: "max-time" };
|
|
64
|
+
}
|
|
65
|
+
// exhausted attempts for current provider? try the fallback chain.
|
|
66
|
+
// each provider gets maxAttempts tries before we move to the next one.
|
|
67
|
+
const { maxAttempts } = this.config.retry;
|
|
68
|
+
if (session.attempt >= maxAttempts) {
|
|
69
|
+
const newProvider = this.advanceFallback(error);
|
|
70
|
+
if (newProvider) {
|
|
71
|
+
session.resetAttempts();
|
|
72
|
+
const delayMs = this.calculateDelay(session.attempt);
|
|
73
|
+
return { shouldRetry: true, delayMs, newProvider };
|
|
74
|
+
}
|
|
75
|
+
// fallback chain exhausted, we're out of options
|
|
76
|
+
return { shouldRetry: false, delayMs: 0, reason: "max-attempts" };
|
|
77
|
+
}
|
|
78
|
+
// still have attempts left, try again with the same provider
|
|
79
|
+
const delayMs = this.calculateDelay(session.attempt);
|
|
80
|
+
return { shouldRetry: true, delayMs };
|
|
81
|
+
}
|
|
82
|
+
getInitialProvider() {
|
|
83
|
+
if (this.config.fallback.enabled && this.fallbackChain.length > 0) {
|
|
84
|
+
const first = this.fallbackChain[0];
|
|
85
|
+
return { name: first.provider, model: first.model };
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
name: this.config.fallback.initialProvider,
|
|
89
|
+
model: this.config.fallback.initialModel,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
resetFallback() {
|
|
93
|
+
this.fallbackIndex = 0;
|
|
94
|
+
}
|
|
95
|
+
isRetryable(error) {
|
|
96
|
+
if (LLMProviderError.isInstance(error) || APICallError.isInstance(error)) {
|
|
97
|
+
return error.isRetryable;
|
|
98
|
+
}
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
calculateDelay(attempt) {
|
|
102
|
+
const { initialDelayMs, maxDelayMs, backoffMultiplier } = this.config.retry;
|
|
103
|
+
const delay = initialDelayMs * Math.pow(backoffMultiplier, attempt - 1);
|
|
104
|
+
return Math.min(delay, maxDelayMs);
|
|
105
|
+
}
|
|
106
|
+
advanceFallback(_error) {
|
|
107
|
+
if (!this.config.fallback.enabled || this.fallbackChain.length === 0) {
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
if (this.fallbackIndex >= this.fallbackChain.length - 1) {
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
this.fallbackIndex++;
|
|
114
|
+
const next = this.fallbackChain[this.fallbackIndex];
|
|
115
|
+
return { name: next.provider, model: next.model };
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Build the fallback chain based on initial provider/model.
|
|
119
|
+
*
|
|
120
|
+
* Chain construction:
|
|
121
|
+
* - Provider order is determined by initialProvider (that provider first, then the other)
|
|
122
|
+
* - If using opus, try opus on all providers first, then sonnet on all providers
|
|
123
|
+
* - If using sonnet, each provider only gets sonnet
|
|
124
|
+
*/
|
|
125
|
+
buildFallbackChain() {
|
|
126
|
+
if (!this.config.fallback.enabled) {
|
|
127
|
+
return [];
|
|
128
|
+
}
|
|
129
|
+
const { initialProvider, initialModel } = this.config.fallback;
|
|
130
|
+
const isOpus = initialModel === "claude-opus-4-5";
|
|
131
|
+
const providerOrder = initialProvider === "bedrock"
|
|
132
|
+
? ["bedrock", "vertex"]
|
|
133
|
+
: ["vertex", "bedrock"];
|
|
134
|
+
const chain = [];
|
|
135
|
+
if (isOpus) {
|
|
136
|
+
for (const provider of providerOrder) {
|
|
137
|
+
chain.push({ provider, model: "claude-opus-4-5" });
|
|
138
|
+
}
|
|
139
|
+
for (const provider of providerOrder) {
|
|
140
|
+
chain.push({ provider, model: "claude-sonnet-4-5" });
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
for (const provider of providerOrder) {
|
|
145
|
+
chain.push({ provider, model: "claude-sonnet-4-5" });
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return chain;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=retry-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-engine.js","sourceRoot":"","sources":["../../../../src/ai-service/llm/stream/retry-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { StreamEventBus } from "./event-bus.js";
|
|
2
|
+
import type { StreamConfig } from "./config.js";
|
|
3
|
+
import type { ProviderInfo, StreamMetrics, SessionOutcome } from "./types.js";
|
|
4
|
+
/**
|
|
5
|
+
* State container for a single stream operation.
|
|
6
|
+
*
|
|
7
|
+
* Contains all mutable state for the session:
|
|
8
|
+
* - Current attempt number
|
|
9
|
+
* - Current provider info
|
|
10
|
+
* - Metrics (chunks, tokens, retries, duration)
|
|
11
|
+
* - Error and outcome status
|
|
12
|
+
*
|
|
13
|
+
* The session also owns the event bus for this operation.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* const session = new StreamSession(config, initialProvider);
|
|
18
|
+
*
|
|
19
|
+
* // Record activity
|
|
20
|
+
* session.recordChunk();
|
|
21
|
+
* session.recordRetry(500);
|
|
22
|
+
*
|
|
23
|
+
* // Finalize when done
|
|
24
|
+
* session.finalize("complete");
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare class StreamSession {
|
|
28
|
+
readonly id: string;
|
|
29
|
+
readonly startTime: number;
|
|
30
|
+
readonly events: StreamEventBus;
|
|
31
|
+
readonly config: StreamConfig;
|
|
32
|
+
attempt: number;
|
|
33
|
+
provider: ProviderInfo;
|
|
34
|
+
metrics: StreamMetrics;
|
|
35
|
+
error: unknown;
|
|
36
|
+
outcome: SessionOutcome;
|
|
37
|
+
private lastActivityTime;
|
|
38
|
+
constructor(config: StreamConfig, initialProvider: ProviderInfo);
|
|
39
|
+
/**
|
|
40
|
+
* Finalize the session with an outcome.
|
|
41
|
+
*
|
|
42
|
+
* Can only be called once. Subsequent calls are ignored.
|
|
43
|
+
* Emits the appropriate lifecycle event based on outcome.
|
|
44
|
+
*
|
|
45
|
+
* @param outcome - The final outcome of the session
|
|
46
|
+
* @param error - Optional error that caused failure
|
|
47
|
+
*/
|
|
48
|
+
finalize(outcome: Exclude<SessionOutcome, "pending">, error?: unknown): void;
|
|
49
|
+
recordRetry(delayMs: number): void;
|
|
50
|
+
resetAttempts(): void;
|
|
51
|
+
recordChunk(): void;
|
|
52
|
+
setTotalTokens(tokens: number): void;
|
|
53
|
+
isPending(): boolean;
|
|
54
|
+
getElapsedMs(): number;
|
|
55
|
+
getTimeSinceLastActivity(): number;
|
|
56
|
+
resetActivityTimer(): void;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../../src/ai-service/llm/stream/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE9E;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,aAAa;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAE9B,OAAO,SAAK;IACZ,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,aAAa,CAOpB;IACF,KAAK,EAAE,OAAO,CAAQ;IACtB,OAAO,EAAE,cAAc,CAAa;IAGpC,OAAO,CAAC,gBAAgB,CAAS;gBAErB,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY;IAS/D;;;;;;;;OAQG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,EAAE,SAAS,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI;IAsB5E,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IASlC,aAAa,IAAI,IAAI;IAIrB,WAAW,IAAI,IAAI;IAQnB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIpC,SAAS,IAAI,OAAO;IAIpB,YAAY,IAAI,MAAM;IAMtB,wBAAwB,IAAI,MAAM;IAIlC,kBAAkB,IAAI,IAAI;CAG3B"}
|