@qduc/term2 0.17.0 → 0.19.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/agent.d.ts +2 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +4 -1
- package/dist/agent.js.map +1 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +12 -2
- package/dist/app.js.map +1 -1
- package/dist/commands/retry-failed-turn-command.d.ts +6 -0
- package/dist/commands/retry-failed-turn-command.d.ts.map +1 -0
- package/dist/commands/retry-failed-turn-command.js +12 -0
- package/dist/commands/retry-failed-turn-command.js.map +1 -0
- package/dist/components/layout/BackgroundTaskManager.d.ts.map +1 -1
- package/dist/components/layout/BackgroundTaskManager.js +4 -0
- package/dist/components/layout/BackgroundTaskManager.js.map +1 -1
- package/dist/components/layout/BackgroundTasksPanel.d.ts.map +1 -1
- package/dist/components/layout/BackgroundTasksPanel.js +11 -1
- package/dist/components/layout/BackgroundTasksPanel.js.map +1 -1
- package/dist/components/layout/BottomArea.d.ts +6 -0
- package/dist/components/layout/BottomArea.d.ts.map +1 -1
- package/dist/components/layout/BottomArea.js +14 -5
- package/dist/components/layout/BottomArea.js.map +1 -1
- package/dist/components/layout/StatusBar.d.ts +6 -0
- package/dist/components/layout/StatusBar.d.ts.map +1 -1
- package/dist/components/layout/StatusBar.js +15 -4
- package/dist/components/layout/StatusBar.js.map +1 -1
- package/dist/components/message/ChatMessage.js +3 -1
- package/dist/components/message/ChatMessage.js.map +1 -1
- package/dist/components/message/CommandGroupSummary.js +4 -5
- package/dist/components/message/CommandGroupSummary.js.map +1 -1
- package/dist/components/message/MessageList.d.ts.map +1 -1
- package/dist/components/message/MessageList.js +15 -2
- package/dist/components/message/MessageList.js.map +1 -1
- package/dist/components/message/command-grouping.d.ts +1 -0
- package/dist/components/message/command-grouping.d.ts.map +1 -1
- package/dist/components/message/command-grouping.js +14 -7
- package/dist/components/message/command-grouping.js.map +1 -1
- package/dist/components/message/command-message-helpers.d.ts +5 -5
- package/dist/contracts/conversation.d.ts +2 -0
- package/dist/contracts/conversation.d.ts.map +1 -1
- package/dist/contracts/conversation.js.map +1 -1
- package/dist/contracts/run-termination.d.ts +7 -0
- package/dist/contracts/run-termination.d.ts.map +1 -0
- package/dist/contracts/run-termination.js +2 -0
- package/dist/contracts/run-termination.js.map +1 -0
- package/dist/contracts/session-rollover.d.ts +32 -0
- package/dist/contracts/session-rollover.d.ts.map +1 -0
- package/dist/contracts/session-rollover.js +2 -0
- package/dist/contracts/session-rollover.js.map +1 -0
- package/dist/contracts/streamed-model-turn.d.ts +4 -0
- package/dist/contracts/streamed-model-turn.d.ts.map +1 -1
- package/dist/hooks/conversation-ui-reducer.d.ts +7 -0
- package/dist/hooks/conversation-ui-reducer.d.ts.map +1 -1
- package/dist/hooks/conversation-ui-reducer.js +6 -0
- package/dist/hooks/conversation-ui-reducer.js.map +1 -1
- package/dist/hooks/settings-completion-config.d.ts.map +1 -1
- package/dist/hooks/settings-completion-config.js +6 -0
- package/dist/hooks/settings-completion-config.js.map +1 -1
- package/dist/hooks/use-app-commands.d.ts +2 -1
- package/dist/hooks/use-app-commands.d.ts.map +1 -1
- package/dist/hooks/use-app-commands.js +4 -1
- package/dist/hooks/use-app-commands.js.map +1 -1
- package/dist/hooks/use-conversation.d.ts +9 -1
- package/dist/hooks/use-conversation.d.ts.map +1 -1
- package/dist/hooks/use-conversation.js +42 -6
- package/dist/hooks/use-conversation.js.map +1 -1
- package/dist/hooks/use-model-selection.d.ts +2 -0
- package/dist/hooks/use-model-selection.d.ts.map +1 -1
- package/dist/hooks/use-model-selection.js +3 -3
- package/dist/hooks/use-model-selection.js.map +1 -1
- package/dist/lib/agent-client.d.ts +4 -0
- package/dist/lib/agent-client.d.ts.map +1 -1
- package/dist/lib/agent-client.js +120 -23
- package/dist/lib/agent-client.js.map +1 -1
- package/dist/lib/agent-configuration.d.ts +2 -0
- package/dist/lib/agent-configuration.d.ts.map +1 -1
- package/dist/lib/agent-configuration.js +3 -0
- package/dist/lib/agent-configuration.js.map +1 -1
- package/dist/lib/agent-factory.d.ts +2 -0
- package/dist/lib/agent-factory.d.ts.map +1 -1
- package/dist/lib/agent-factory.js +1 -0
- package/dist/lib/agent-factory.js.map +1 -1
- package/dist/providers/aborted-stream-recorder.d.ts +26 -1
- package/dist/providers/aborted-stream-recorder.d.ts.map +1 -1
- package/dist/providers/aborted-stream-recorder.js +133 -0
- package/dist/providers/aborted-stream-recorder.js.map +1 -1
- package/dist/providers/ai-sdk-streamed-model.d.ts +5 -0
- package/dist/providers/ai-sdk-streamed-model.d.ts.map +1 -1
- package/dist/providers/ai-sdk-streamed-model.js +90 -1
- package/dist/providers/ai-sdk-streamed-model.js.map +1 -1
- package/dist/providers/codex-compact.d.ts +5 -4
- package/dist/providers/codex-compact.d.ts.map +1 -1
- package/dist/providers/codex-compact.js +5 -4
- package/dist/providers/codex-compact.js.map +1 -1
- package/dist/providers/codex-responses-model.d.ts.map +1 -1
- package/dist/providers/codex-responses-model.js +103 -20
- package/dist/providers/codex-responses-model.js.map +1 -1
- package/dist/providers/codex.provider.d.ts +1 -0
- package/dist/providers/codex.provider.d.ts.map +1 -1
- package/dist/providers/codex.provider.js +59 -3
- package/dist/providers/codex.provider.js.map +1 -1
- package/dist/providers/fetch/logging-middleware.d.ts +1 -0
- package/dist/providers/fetch/logging-middleware.d.ts.map +1 -1
- package/dist/providers/fetch/logging-middleware.js +24 -1
- package/dist/providers/fetch/logging-middleware.js.map +1 -1
- package/dist/providers/openai-chat-completions-model.d.ts.map +1 -1
- package/dist/providers/openai-chat-completions-model.js +99 -2
- package/dist/providers/openai-chat-completions-model.js.map +1 -1
- package/dist/providers/openai-responses-model.d.ts.map +1 -1
- package/dist/providers/openai-responses-model.js +21 -13
- package/dist/providers/openai-responses-model.js.map +1 -1
- package/dist/providers/retrying-model.d.ts +5 -1
- package/dist/providers/retrying-model.d.ts.map +1 -1
- package/dist/providers/retrying-model.js +29 -6
- package/dist/providers/retrying-model.js.map +1 -1
- package/dist/providers/websocket-abort-race.d.ts +13 -0
- package/dist/providers/websocket-abort-race.d.ts.map +1 -0
- package/dist/providers/websocket-abort-race.js +34 -0
- package/dist/providers/websocket-abort-race.js.map +1 -0
- package/dist/services/agent-runtime/application-run-loop.d.ts +7 -0
- package/dist/services/agent-runtime/application-run-loop.d.ts.map +1 -1
- package/dist/services/agent-runtime/application-run-loop.js +56 -7
- package/dist/services/agent-runtime/application-run-loop.js.map +1 -1
- package/dist/services/agent-runtime/context-compaction/context-milestone-reminder.d.ts +12 -0
- package/dist/services/agent-runtime/context-compaction/context-milestone-reminder.d.ts.map +1 -0
- package/dist/services/agent-runtime/context-compaction/context-milestone-reminder.js +23 -0
- package/dist/services/agent-runtime/context-compaction/context-milestone-reminder.js.map +1 -0
- package/dist/services/agent-runtime/executor.d.ts.map +1 -1
- package/dist/services/agent-runtime/executor.js +2 -0
- package/dist/services/agent-runtime/executor.js.map +1 -1
- package/dist/services/agent-runtime/types.d.ts +2 -2
- package/dist/services/agent-runtime/types.d.ts.map +1 -1
- package/dist/services/agent-stream.d.ts +13 -0
- package/dist/services/agent-stream.d.ts.map +1 -1
- package/dist/services/agent-stream.js +56 -0
- package/dist/services/agent-stream.js.map +1 -1
- package/dist/services/background-task-activity.d.ts +7 -0
- package/dist/services/background-task-activity.d.ts.map +1 -1
- package/dist/services/background-task-activity.js +17 -0
- package/dist/services/background-task-activity.js.map +1 -1
- package/dist/services/conversation/conversation-adapter.d.ts +1 -0
- package/dist/services/conversation/conversation-adapter.d.ts.map +1 -1
- package/dist/services/conversation/conversation-adapter.js +3 -0
- package/dist/services/conversation/conversation-adapter.js.map +1 -1
- package/dist/services/conversation/conversation-decoder.d.ts.map +1 -1
- package/dist/services/conversation/conversation-decoder.js +3 -0
- package/dist/services/conversation/conversation-decoder.js.map +1 -1
- package/dist/services/conversation/conversation-events.d.ts +45 -2
- package/dist/services/conversation/conversation-events.d.ts.map +1 -1
- package/dist/services/conversation/conversation-events.js +30 -1
- package/dist/services/conversation/conversation-events.js.map +1 -1
- package/dist/services/conversation/conversation-orchestrator.d.ts +4 -0
- package/dist/services/conversation/conversation-orchestrator.d.ts.map +1 -1
- package/dist/services/conversation/conversation-orchestrator.js +74 -4
- package/dist/services/conversation/conversation-orchestrator.js.map +1 -1
- package/dist/services/conversation/conversation-orchestrator.types.d.ts +4 -0
- package/dist/services/conversation/conversation-orchestrator.types.d.ts.map +1 -1
- package/dist/services/conversation/conversation-result-builder.d.ts.map +1 -1
- package/dist/services/conversation/conversation-result-builder.js +9 -5
- package/dist/services/conversation/conversation-result-builder.js.map +1 -1
- package/dist/services/conversation/conversation-service.d.ts +5 -0
- package/dist/services/conversation/conversation-service.d.ts.map +1 -1
- package/dist/services/conversation/conversation-service.js +31 -0
- package/dist/services/conversation/conversation-service.js.map +1 -1
- package/dist/services/conversation/session-browser.d.ts +1 -0
- package/dist/services/conversation/session-browser.d.ts.map +1 -1
- package/dist/services/conversation/session-browser.js +32 -38
- package/dist/services/conversation/session-browser.js.map +1 -1
- package/dist/services/conversation-agent-client.d.ts +7 -0
- package/dist/services/conversation-agent-client.d.ts.map +1 -1
- package/dist/services/logging/conversation-log-events.d.ts +6 -1
- package/dist/services/logging/conversation-log-events.d.ts.map +1 -1
- package/dist/services/logging/conversation-log-events.js.map +1 -1
- package/dist/services/logging/conversation-log-writer.d.ts +1 -1
- package/dist/services/logging/conversation-log-writer.d.ts.map +1 -1
- package/dist/services/logging/conversation-log-writer.js +6 -1
- package/dist/services/logging/conversation-log-writer.js.map +1 -1
- package/dist/services/logging/provider-traffic.d.ts +6 -1
- package/dist/services/logging/provider-traffic.d.ts.map +1 -1
- package/dist/services/logging/provider-traffic.js +29 -4
- package/dist/services/logging/provider-traffic.js.map +1 -1
- package/dist/services/models/model-catalog-session.d.ts +1 -2
- package/dist/services/models/model-catalog-session.d.ts.map +1 -1
- package/dist/services/retry/committed-tool-continuation.d.ts +4 -0
- package/dist/services/retry/committed-tool-continuation.d.ts.map +1 -0
- package/dist/services/retry/committed-tool-continuation.js +12 -0
- package/dist/services/retry/committed-tool-continuation.js.map +1 -0
- package/dist/services/retry/in-loop-model-retry.d.ts.map +1 -1
- package/dist/services/retry/in-loop-model-retry.js +9 -0
- package/dist/services/retry/in-loop-model-retry.js.map +1 -1
- package/dist/services/retry/provider-failure-classification.d.ts +12 -0
- package/dist/services/retry/provider-failure-classification.d.ts.map +1 -0
- package/dist/services/retry/provider-failure-classification.js +55 -0
- package/dist/services/retry/provider-failure-classification.js.map +1 -0
- package/dist/services/retry/retry-classifier.d.ts.map +1 -1
- package/dist/services/retry/retry-classifier.js +68 -0
- package/dist/services/retry/retry-classifier.js.map +1 -1
- package/dist/services/retry/retry-contracts.d.ts +24 -3
- package/dist/services/retry/retry-contracts.d.ts.map +1 -1
- package/dist/services/retry/retry-event-presenter.d.ts.map +1 -1
- package/dist/services/retry/retry-event-presenter.js +14 -4
- package/dist/services/retry/retry-event-presenter.js.map +1 -1
- package/dist/services/retry/retry-recovery-budget.d.ts +51 -0
- package/dist/services/retry/retry-recovery-budget.d.ts.map +1 -0
- package/dist/services/retry/retry-recovery-budget.js +84 -0
- package/dist/services/retry/retry-recovery-budget.js.map +1 -0
- package/dist/services/service-interfaces.d.ts +67 -3
- package/dist/services/service-interfaces.d.ts.map +1 -1
- package/dist/services/session/background-check-in-scheduler.d.ts +5 -0
- package/dist/services/session/background-check-in-scheduler.d.ts.map +1 -1
- package/dist/services/session/background-check-in-scheduler.js +83 -10
- package/dist/services/session/background-check-in-scheduler.js.map +1 -1
- package/dist/services/session/continuation-recovery-handler.d.ts +1 -0
- package/dist/services/session/continuation-recovery-handler.d.ts.map +1 -1
- package/dist/services/session/continuation-recovery-handler.js +42 -0
- package/dist/services/session/continuation-recovery-handler.js.map +1 -1
- package/dist/services/session/continuation-state.d.ts +4 -1
- package/dist/services/session/continuation-state.d.ts.map +1 -1
- package/dist/services/session/continuation-state.js +5 -1
- package/dist/services/session/continuation-state.js.map +1 -1
- package/dist/services/session/initial-turn-recovery-handler.d.ts +3 -0
- package/dist/services/session/initial-turn-recovery-handler.d.ts.map +1 -1
- package/dist/services/session/initial-turn-recovery-handler.js +70 -0
- package/dist/services/session/initial-turn-recovery-handler.js.map +1 -1
- package/dist/services/session/session-composition.d.ts.map +1 -1
- package/dist/services/session/session-composition.js +6 -0
- package/dist/services/session/session-composition.js.map +1 -1
- package/dist/services/session/session-tool-tracker.d.ts +6 -0
- package/dist/services/session/session-tool-tracker.d.ts.map +1 -1
- package/dist/services/session/session-tool-tracker.js +17 -0
- package/dist/services/session/session-tool-tracker.js.map +1 -1
- package/dist/services/session/terminal-result-collector.d.ts.map +1 -1
- package/dist/services/session/terminal-result-collector.js +3 -0
- package/dist/services/session/terminal-result-collector.js.map +1 -1
- package/dist/services/session/turn-attempt-factory.d.ts +2 -0
- package/dist/services/session/turn-attempt-factory.d.ts.map +1 -1
- package/dist/services/session/turn-attempt-factory.js +1 -0
- package/dist/services/session/turn-attempt-factory.js.map +1 -1
- package/dist/services/session/turn-attempt.d.ts +6 -0
- package/dist/services/session/turn-attempt.d.ts.map +1 -1
- package/dist/services/session/turn-attempt.js +16 -0
- package/dist/services/session/turn-attempt.js.map +1 -1
- package/dist/services/session/turn-workflow.d.ts +1 -1
- package/dist/services/session/turn-workflow.d.ts.map +1 -1
- package/dist/services/session/turn-workflow.js +83 -19
- package/dist/services/session/turn-workflow.js.map +1 -1
- package/dist/services/session-rollover/session-rollover-brief.d.ts +6 -0
- package/dist/services/session-rollover/session-rollover-brief.d.ts.map +1 -0
- package/dist/services/session-rollover/session-rollover-brief.js +27 -0
- package/dist/services/session-rollover/session-rollover-brief.js.map +1 -0
- package/dist/services/settings/settings-schema.d.ts +18 -0
- package/dist/services/settings/settings-schema.d.ts.map +1 -1
- package/dist/services/settings/settings-schema.js +19 -0
- package/dist/services/settings/settings-schema.js.map +1 -1
- package/dist/services/settings/settings-sources.d.ts.map +1 -1
- package/dist/services/settings/settings-sources.js +5 -0
- package/dist/services/settings/settings-sources.js.map +1 -1
- package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts +1 -0
- package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts.map +1 -1
- package/dist/services/settings/test-helpers/settings-consumer-inventory.js +5 -0
- package/dist/services/settings/test-helpers/settings-consumer-inventory.js.map +1 -1
- package/dist/services/subagents/execution-runner.d.ts.map +1 -1
- package/dist/services/subagents/execution-runner.js +39 -4
- package/dist/services/subagents/execution-runner.js.map +1 -1
- package/dist/services/subagents/nested-runner.d.ts.map +1 -1
- package/dist/services/subagents/nested-runner.js +23 -7
- package/dist/services/subagents/nested-runner.js.map +1 -1
- package/dist/services/subagents/subagent-async-registry.d.ts.map +1 -1
- package/dist/services/subagents/subagent-async-registry.js +28 -2
- package/dist/services/subagents/subagent-async-registry.js.map +1 -1
- package/dist/services/subagents/subagent-notification-store.d.ts +4 -14
- package/dist/services/subagents/subagent-notification-store.d.ts.map +1 -1
- package/dist/services/subagents/subagent-notification-store.js +3 -2
- package/dist/services/subagents/subagent-notification-store.js.map +1 -1
- package/dist/services/subagents/types.d.ts +31 -8
- package/dist/services/subagents/types.d.ts.map +1 -1
- package/dist/services/subagents/types.js +11 -0
- package/dist/services/subagents/types.js.map +1 -1
- package/dist/services/subagents/utils.d.ts.map +1 -1
- package/dist/services/subagents/utils.js +3 -0
- package/dist/services/subagents/utils.js.map +1 -1
- package/dist/test-helpers/terminal-e2e.d.ts +2 -0
- package/dist/test-helpers/terminal-e2e.d.ts.map +1 -1
- package/dist/test-helpers/terminal-e2e.js +13 -6
- package/dist/test-helpers/terminal-e2e.js.map +1 -1
- package/dist/test-helpers/vitest-network-guard.d.ts +2 -0
- package/dist/test-helpers/vitest-network-guard.d.ts.map +1 -0
- package/dist/test-helpers/vitest-network-guard.js +24 -0
- package/dist/test-helpers/vitest-network-guard.js.map +1 -0
- package/dist/tools/agent/run-subagent-async.d.ts +1 -1
- package/dist/tools/agent/run-subagent-async.d.ts.map +1 -1
- package/dist/tools/agent/run-subagent-async.js +25 -4
- package/dist/tools/agent/run-subagent-async.js.map +1 -1
- package/dist/tools/session-rollover/session-rollover-tool.d.ts +12 -0
- package/dist/tools/session-rollover/session-rollover-tool.d.ts.map +1 -0
- package/dist/tools/session-rollover/session-rollover-tool.js +35 -0
- package/dist/tools/session-rollover/session-rollover-tool.js.map +1 -0
- package/dist/tools/types.d.ts +4 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js.map +1 -1
- package/dist/types/message.d.ts +2 -0
- package/dist/types/message.d.ts.map +1 -1
- package/dist/types/message.js.map +1 -1
- package/dist/utils/ai/token-usage.d.ts +3 -0
- package/dist/utils/ai/token-usage.d.ts.map +1 -1
- package/dist/utils/ai/token-usage.js +29 -0
- package/dist/utils/ai/token-usage.js.map +1 -1
- package/dist/utils/conversation/conversation-event-handler.d.ts.map +1 -1
- package/dist/utils/conversation/conversation-event-handler.js +23 -1
- package/dist/utils/conversation/conversation-event-handler.js.map +1 -1
- package/dist/utils/streaming/streaming-session-factory.d.ts +4 -0
- package/dist/utils/streaming/streaming-session-factory.d.ts.map +1 -1
- package/dist/utils/streaming/streaming-session-factory.js +59 -9
- package/dist/utils/streaming/streaming-session-factory.js.map +1 -1
- package/dist/utils/streaming/streaming-speed-tracker.d.ts +99 -0
- package/dist/utils/streaming/streaming-speed-tracker.d.ts.map +1 -0
- package/dist/utils/streaming/streaming-speed-tracker.js +214 -0
- package/dist/utils/streaming/streaming-speed-tracker.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility for tracking token streaming speed (tokens per second / TPS).
|
|
3
|
+
*
|
|
4
|
+
* Handles both:
|
|
5
|
+
* 1. Live generation speed during streaming (using exact token updates or character heuristics).
|
|
6
|
+
* 2. Settled decoding speed calculated at the end of a generation turn.
|
|
7
|
+
*
|
|
8
|
+
* A single agent turn can involve multiple separate model requests interleaved with tool
|
|
9
|
+
* execution (model generates, calls a tool, tool runs, model resumes with a fresh request).
|
|
10
|
+
* Tool-execution latency is not generation, so the tracker is reset at each such boundary
|
|
11
|
+
* (see `reset()`) rather than averaged across the whole turn — each request's speed is measured
|
|
12
|
+
* independently, starting from zero.
|
|
13
|
+
*/
|
|
14
|
+
export interface StreamingSpeedSnapshot {
|
|
15
|
+
tps: number;
|
|
16
|
+
ttftMs?: number;
|
|
17
|
+
elapsedMs: number;
|
|
18
|
+
estimatedTokens: number;
|
|
19
|
+
}
|
|
20
|
+
export declare class StreamingSpeedTracker {
|
|
21
|
+
private startTime;
|
|
22
|
+
private firstTokenTime;
|
|
23
|
+
private lastUpdateTime;
|
|
24
|
+
private accumulatedChars;
|
|
25
|
+
private exactTokens;
|
|
26
|
+
/**
|
|
27
|
+
* Chars-per-token used for live estimates before exact usage arrives. Starts at
|
|
28
|
+
* `DEFAULT_CHARS_PER_TOKEN` and is recalibrated from each request's real usage in
|
|
29
|
+
* `recordUsageTokens`, so it survives `reset()` and carries forward to seed the next request's
|
|
30
|
+
* estimate within the same turn.
|
|
31
|
+
*/
|
|
32
|
+
private charsPerToken;
|
|
33
|
+
/** Rolling history of (time, cumulative token count) samples, oldest first, used for windowed live TPS. */
|
|
34
|
+
private samples;
|
|
35
|
+
constructor(options?: {
|
|
36
|
+
startTime?: number;
|
|
37
|
+
charsPerToken?: number;
|
|
38
|
+
});
|
|
39
|
+
/**
|
|
40
|
+
* Reset all accumulated state so the next recorded token starts a brand-new measurement,
|
|
41
|
+
* unrelated to anything recorded before this call. Call this at request boundaries within a
|
|
42
|
+
* turn — e.g. when a tool starts executing — so tool latency never mixes into decode speed and
|
|
43
|
+
* the next model request's speed isn't diluted by a previous request's average.
|
|
44
|
+
*
|
|
45
|
+
* `charsPerToken` is deliberately NOT reset — it carries the last request's calibrated ratio
|
|
46
|
+
* forward to seed the next request's live estimate.
|
|
47
|
+
*/
|
|
48
|
+
reset(now?: number): void;
|
|
49
|
+
private recordSample;
|
|
50
|
+
/**
|
|
51
|
+
* Record arrival of a text or reasoning delta string.
|
|
52
|
+
*/
|
|
53
|
+
recordDelta(text?: string | null, now?: number): void;
|
|
54
|
+
/**
|
|
55
|
+
* Record cumulative characters streamed (e.g. from tool call argument streaming).
|
|
56
|
+
*/
|
|
57
|
+
recordCumulativeChars(cumulativeChars: number, now?: number): void;
|
|
58
|
+
/**
|
|
59
|
+
* Record exact token counts if the provider streams usage updates.
|
|
60
|
+
*/
|
|
61
|
+
recordUsageTokens(completionTokens: number, now?: number): void;
|
|
62
|
+
/**
|
|
63
|
+
* Recalibrate the chars-per-token ratio from this request's real accumulated chars vs. its
|
|
64
|
+
* exact token count, so the NEXT request's live estimate (before its own usage arrives) starts
|
|
65
|
+
* from an observed ratio instead of the generic default. Ignored if there isn't enough
|
|
66
|
+
* accumulated text to trust the sample (e.g. a tool-only request with no generated text).
|
|
67
|
+
*/
|
|
68
|
+
private calibrateCharsPerToken;
|
|
69
|
+
/**
|
|
70
|
+
* Time to first token in milliseconds, or null if no tokens received yet.
|
|
71
|
+
*/
|
|
72
|
+
getTtftMs(): number | null;
|
|
73
|
+
/**
|
|
74
|
+
* Current estimated or exact token count generated so far.
|
|
75
|
+
*/
|
|
76
|
+
getEstimatedTokens(): number;
|
|
77
|
+
/**
|
|
78
|
+
* Get live tokens per second during an in-flight stream.
|
|
79
|
+
*
|
|
80
|
+
* Computed over a trailing window (LIVE_WINDOW_MS) of recent samples rather than the
|
|
81
|
+
* whole-request average, so the displayed number tracks current throughput instead of trailing
|
|
82
|
+
* behind a slow start. Falls back to the full-history average until enough time has elapsed
|
|
83
|
+
* since the first token to fill a window. `reset()` clears history at request boundaries, so
|
|
84
|
+
* this never spans across a tool-execution gap or a prior request.
|
|
85
|
+
*/
|
|
86
|
+
getLiveTps(now?: number): number | null;
|
|
87
|
+
/**
|
|
88
|
+
* Calculate exact settled tokens per second when generation finishes.
|
|
89
|
+
*
|
|
90
|
+
* @param finalCompletionTokens Exact completion tokens from provider's final usage.
|
|
91
|
+
* @param endTime Generation end timestamp.
|
|
92
|
+
*/
|
|
93
|
+
getSettledTps(finalCompletionTokens?: number, endTime?: number): number | null;
|
|
94
|
+
/**
|
|
95
|
+
* Returns a complete snapshot of current speed metrics.
|
|
96
|
+
*/
|
|
97
|
+
getSnapshot(now?: number): StreamingSpeedSnapshot | null;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=streaming-speed-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming-speed-tracker.d.ts","sourceRoot":"","sources":["../../../source/utils/streaming/streaming-speed-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CACzB;AAmBD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,WAAW,CAAuB;IAC1C;;;;;OAKG;IACH,OAAO,CAAC,aAAa,CAAS;IAC9B,2GAA2G;IAC3G,OAAO,CAAC,OAAO,CAAqB;IAEpC,YAAY,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,EAGnE;IAED;;;;;;;;OAQG;IACI,KAAK,CAAC,GAAG,GAAE,MAAmB,GAAG,IAAI,CAO3C;IAED,OAAO,CAAC,YAAY;IASpB;;OAEG;IACI,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,GAAE,MAAmB,GAAG,IAAI,CASvE;IAED;;OAEG;IACI,qBAAqB,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,IAAI,CAQpF;IAED;;OAEG;IACI,iBAAiB,CAAC,gBAAgB,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,IAAI,CAQjF;IAED;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IAO9B;;OAEG;IACI,SAAS,IAAI,MAAM,GAAG,IAAI,CAGhC;IAED;;OAEG;IACI,kBAAkB,IAAI,MAAM,CAKlC;IAED;;;;;;;;OAQG;IACI,UAAU,CAAC,GAAG,GAAE,MAAmB,GAAG,MAAM,GAAG,IAAI,CAkCzD;IAED;;;;;OAKG;IACI,aAAa,CAAC,qBAAqB,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,MAAmB,GAAG,MAAM,GAAG,IAAI,CAahG;IAED;;OAEG;IACI,WAAW,CAAC,GAAG,GAAE,MAAmB,GAAG,sBAAsB,GAAG,IAAI,CAU1E;CACF"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility for tracking token streaming speed (tokens per second / TPS).
|
|
3
|
+
*
|
|
4
|
+
* Handles both:
|
|
5
|
+
* 1. Live generation speed during streaming (using exact token updates or character heuristics).
|
|
6
|
+
* 2. Settled decoding speed calculated at the end of a generation turn.
|
|
7
|
+
*
|
|
8
|
+
* A single agent turn can involve multiple separate model requests interleaved with tool
|
|
9
|
+
* execution (model generates, calls a tool, tool runs, model resumes with a fresh request).
|
|
10
|
+
* Tool-execution latency is not generation, so the tracker is reset at each such boundary
|
|
11
|
+
* (see `reset()`) rather than averaged across the whole turn — each request's speed is measured
|
|
12
|
+
* independently, starting from zero.
|
|
13
|
+
*/
|
|
14
|
+
/** Average characters per token heuristic for English/code text when provider does not stream token counts. */
|
|
15
|
+
const DEFAULT_CHARS_PER_TOKEN = 3.8;
|
|
16
|
+
/** Live speed is computed over a trailing window so it tracks current throughput, not the whole-request average. */
|
|
17
|
+
const LIVE_WINDOW_MS = 3000;
|
|
18
|
+
/** Bounds for a request's observed chars-per-token ratio, so one noisy request can't skew future estimates wildly. */
|
|
19
|
+
const MIN_CALIBRATED_CHARS_PER_TOKEN = 1;
|
|
20
|
+
const MAX_CALIBRATED_CHARS_PER_TOKEN = 10;
|
|
21
|
+
/** Minimum accumulated characters required before trusting a request's ratio for calibration. */
|
|
22
|
+
const MIN_CHARS_FOR_CALIBRATION = 20;
|
|
23
|
+
export class StreamingSpeedTracker {
|
|
24
|
+
startTime;
|
|
25
|
+
firstTokenTime = null;
|
|
26
|
+
lastUpdateTime = null;
|
|
27
|
+
accumulatedChars = 0;
|
|
28
|
+
exactTokens = null;
|
|
29
|
+
/**
|
|
30
|
+
* Chars-per-token used for live estimates before exact usage arrives. Starts at
|
|
31
|
+
* `DEFAULT_CHARS_PER_TOKEN` and is recalibrated from each request's real usage in
|
|
32
|
+
* `recordUsageTokens`, so it survives `reset()` and carries forward to seed the next request's
|
|
33
|
+
* estimate within the same turn.
|
|
34
|
+
*/
|
|
35
|
+
charsPerToken;
|
|
36
|
+
/** Rolling history of (time, cumulative token count) samples, oldest first, used for windowed live TPS. */
|
|
37
|
+
samples = [];
|
|
38
|
+
constructor(options) {
|
|
39
|
+
this.startTime = options?.startTime ?? Date.now();
|
|
40
|
+
this.charsPerToken = options?.charsPerToken ?? DEFAULT_CHARS_PER_TOKEN;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Reset all accumulated state so the next recorded token starts a brand-new measurement,
|
|
44
|
+
* unrelated to anything recorded before this call. Call this at request boundaries within a
|
|
45
|
+
* turn — e.g. when a tool starts executing — so tool latency never mixes into decode speed and
|
|
46
|
+
* the next model request's speed isn't diluted by a previous request's average.
|
|
47
|
+
*
|
|
48
|
+
* `charsPerToken` is deliberately NOT reset — it carries the last request's calibrated ratio
|
|
49
|
+
* forward to seed the next request's live estimate.
|
|
50
|
+
*/
|
|
51
|
+
reset(now = Date.now()) {
|
|
52
|
+
this.startTime = now;
|
|
53
|
+
this.firstTokenTime = null;
|
|
54
|
+
this.lastUpdateTime = null;
|
|
55
|
+
this.accumulatedChars = 0;
|
|
56
|
+
this.exactTokens = null;
|
|
57
|
+
this.samples = [];
|
|
58
|
+
}
|
|
59
|
+
recordSample(now) {
|
|
60
|
+
this.samples.push({ time: now, tokens: this.getEstimatedTokens() });
|
|
61
|
+
// Drop samples older than the window plus one extra so we always have a boundary sample to interpolate from.
|
|
62
|
+
const cutoff = now - LIVE_WINDOW_MS * 2;
|
|
63
|
+
while (this.samples.length > 1 && this.samples[0].time < cutoff) {
|
|
64
|
+
this.samples.shift();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Record arrival of a text or reasoning delta string.
|
|
69
|
+
*/
|
|
70
|
+
recordDelta(text, now = Date.now()) {
|
|
71
|
+
const length = text?.length ?? 0;
|
|
72
|
+
if (length <= 0)
|
|
73
|
+
return;
|
|
74
|
+
if (this.firstTokenTime === null) {
|
|
75
|
+
this.firstTokenTime = now;
|
|
76
|
+
}
|
|
77
|
+
this.accumulatedChars += length;
|
|
78
|
+
this.lastUpdateTime = now;
|
|
79
|
+
this.recordSample(now);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Record cumulative characters streamed (e.g. from tool call argument streaming).
|
|
83
|
+
*/
|
|
84
|
+
recordCumulativeChars(cumulativeChars, now = Date.now()) {
|
|
85
|
+
if (cumulativeChars <= 0)
|
|
86
|
+
return;
|
|
87
|
+
if (this.firstTokenTime === null) {
|
|
88
|
+
this.firstTokenTime = now;
|
|
89
|
+
}
|
|
90
|
+
this.accumulatedChars = Math.max(this.accumulatedChars, cumulativeChars);
|
|
91
|
+
this.lastUpdateTime = now;
|
|
92
|
+
this.recordSample(now);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Record exact token counts if the provider streams usage updates.
|
|
96
|
+
*/
|
|
97
|
+
recordUsageTokens(completionTokens, now = Date.now()) {
|
|
98
|
+
if (this.firstTokenTime === null && completionTokens > 0) {
|
|
99
|
+
this.firstTokenTime = now;
|
|
100
|
+
}
|
|
101
|
+
this.exactTokens = completionTokens;
|
|
102
|
+
this.lastUpdateTime = now;
|
|
103
|
+
this.calibrateCharsPerToken(completionTokens);
|
|
104
|
+
this.recordSample(now);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Recalibrate the chars-per-token ratio from this request's real accumulated chars vs. its
|
|
108
|
+
* exact token count, so the NEXT request's live estimate (before its own usage arrives) starts
|
|
109
|
+
* from an observed ratio instead of the generic default. Ignored if there isn't enough
|
|
110
|
+
* accumulated text to trust the sample (e.g. a tool-only request with no generated text).
|
|
111
|
+
*/
|
|
112
|
+
calibrateCharsPerToken(exactTokens) {
|
|
113
|
+
if (exactTokens <= 0 || this.accumulatedChars < MIN_CHARS_FOR_CALIBRATION)
|
|
114
|
+
return;
|
|
115
|
+
const ratio = this.accumulatedChars / exactTokens;
|
|
116
|
+
if (!Number.isFinite(ratio) || ratio <= 0)
|
|
117
|
+
return;
|
|
118
|
+
this.charsPerToken = Math.min(MAX_CALIBRATED_CHARS_PER_TOKEN, Math.max(MIN_CALIBRATED_CHARS_PER_TOKEN, ratio));
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Time to first token in milliseconds, or null if no tokens received yet.
|
|
122
|
+
*/
|
|
123
|
+
getTtftMs() {
|
|
124
|
+
if (this.firstTokenTime === null)
|
|
125
|
+
return null;
|
|
126
|
+
return Math.max(0, this.firstTokenTime - this.startTime);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Current estimated or exact token count generated so far.
|
|
130
|
+
*/
|
|
131
|
+
getEstimatedTokens() {
|
|
132
|
+
if (this.exactTokens !== null) {
|
|
133
|
+
return this.exactTokens;
|
|
134
|
+
}
|
|
135
|
+
return Math.round(this.accumulatedChars / this.charsPerToken);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get live tokens per second during an in-flight stream.
|
|
139
|
+
*
|
|
140
|
+
* Computed over a trailing window (LIVE_WINDOW_MS) of recent samples rather than the
|
|
141
|
+
* whole-request average, so the displayed number tracks current throughput instead of trailing
|
|
142
|
+
* behind a slow start. Falls back to the full-history average until enough time has elapsed
|
|
143
|
+
* since the first token to fill a window. `reset()` clears history at request boundaries, so
|
|
144
|
+
* this never spans across a tool-execution gap or a prior request.
|
|
145
|
+
*/
|
|
146
|
+
getLiveTps(now = Date.now()) {
|
|
147
|
+
if (this.firstTokenTime === null)
|
|
148
|
+
return null;
|
|
149
|
+
const generationDurationMs = now - this.firstTokenTime;
|
|
150
|
+
// Require at least 200ms of generation to avoid huge spikes on the first chunk
|
|
151
|
+
if (generationDurationMs < 200) {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
const tokensNow = this.getEstimatedTokens();
|
|
155
|
+
if (tokensNow <= 0)
|
|
156
|
+
return null;
|
|
157
|
+
const windowStart = now - LIVE_WINDOW_MS;
|
|
158
|
+
// Find the newest sample at or before windowStart to anchor the window; if none exists
|
|
159
|
+
// (turn is younger than the window), anchor at the first token instead.
|
|
160
|
+
let anchor = null;
|
|
161
|
+
for (const sample of this.samples) {
|
|
162
|
+
if (sample.time <= windowStart) {
|
|
163
|
+
anchor = sample;
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
const anchorTime = anchor ? anchor.time : this.firstTokenTime;
|
|
170
|
+
const anchorTokens = anchor ? anchor.tokens : 0;
|
|
171
|
+
const durationMs = now - anchorTime;
|
|
172
|
+
const tokens = tokensNow - anchorTokens;
|
|
173
|
+
if (durationMs < 200 || tokens <= 0)
|
|
174
|
+
return null;
|
|
175
|
+
const durationSec = durationMs / 1000;
|
|
176
|
+
const tps = tokens / durationSec;
|
|
177
|
+
return Number.isFinite(tps) && tps > 0 ? Math.round(tps * 10) / 10 : null;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Calculate exact settled tokens per second when generation finishes.
|
|
181
|
+
*
|
|
182
|
+
* @param finalCompletionTokens Exact completion tokens from provider's final usage.
|
|
183
|
+
* @param endTime Generation end timestamp.
|
|
184
|
+
*/
|
|
185
|
+
getSettledTps(finalCompletionTokens, endTime = Date.now()) {
|
|
186
|
+
const tokens = finalCompletionTokens ?? this.getEstimatedTokens();
|
|
187
|
+
if (tokens <= 0)
|
|
188
|
+
return null;
|
|
189
|
+
// If firstTokenTime was never captured (e.g. non-streaming or instantaneous response),
|
|
190
|
+
// measure from request startTime.
|
|
191
|
+
const start = this.firstTokenTime ?? this.startTime;
|
|
192
|
+
const durationMs = endTime - start;
|
|
193
|
+
if (durationMs <= 0)
|
|
194
|
+
return null;
|
|
195
|
+
const durationSec = durationMs / 1000;
|
|
196
|
+
const tps = tokens / durationSec;
|
|
197
|
+
return Number.isFinite(tps) && tps > 0 ? Math.round(tps * 10) / 10 : null;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Returns a complete snapshot of current speed metrics.
|
|
201
|
+
*/
|
|
202
|
+
getSnapshot(now = Date.now()) {
|
|
203
|
+
const tps = this.getLiveTps(now);
|
|
204
|
+
if (tps === null)
|
|
205
|
+
return null;
|
|
206
|
+
return {
|
|
207
|
+
tps,
|
|
208
|
+
ttftMs: this.getTtftMs() ?? undefined,
|
|
209
|
+
elapsedMs: Math.max(0, now - this.startTime),
|
|
210
|
+
estimatedTokens: this.getEstimatedTokens(),
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=streaming-speed-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming-speed-tracker.js","sourceRoot":"","sources":["../../../source/utils/streaming/streaming-speed-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,+GAA+G;AAC/G,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC,oHAAoH;AACpH,MAAM,cAAc,GAAG,IAAI,CAAC;AAE5B,sHAAsH;AACtH,MAAM,8BAA8B,GAAG,CAAC,CAAC;AACzC,MAAM,8BAA8B,GAAG,EAAE,CAAC;AAC1C,iGAAiG;AACjG,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAOrC,MAAM,OAAO,qBAAqB;IACxB,SAAS,CAAS;IAClB,cAAc,GAAkB,IAAI,CAAC;IACrC,cAAc,GAAkB,IAAI,CAAC;IACrC,gBAAgB,GAAG,CAAC,CAAC;IACrB,WAAW,GAAkB,IAAI,CAAC;IAC1C;;;;;OAKG;IACK,aAAa,CAAS;IAC9B,2GAA2G;IACnG,OAAO,GAAkB,EAAE,CAAC;IAEpC,YAAY,OAAwD;QAClE,IAAI,CAAC,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QAClD,IAAI,CAAC,aAAa,GAAG,OAAO,EAAE,aAAa,IAAI,uBAAuB,CAAC;IACzE,CAAC;IAED;;;;;;;;OAQG;IACI,KAAK,CAAC,GAAG,GAAW,IAAI,CAAC,GAAG,EAAE;QACnC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;QACrB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACpB,CAAC;IAEO,YAAY,CAAC,GAAW;QAC9B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QACpE,6GAA6G;QAC7G,MAAM,MAAM,GAAG,GAAG,GAAG,cAAc,GAAG,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,EAAE,CAAC;YAChE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED;;OAEG;IACI,WAAW,CAAC,IAAoB,EAAE,GAAG,GAAW,IAAI,CAAC,GAAG,EAAE;QAC/D,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC;QACjC,IAAI,MAAM,IAAI,CAAC;YAAE,OAAO;QACxB,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;YACjC,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,gBAAgB,IAAI,MAAM,CAAC;QAChC,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;QAC1B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACI,qBAAqB,CAAC,eAAuB,EAAE,GAAG,GAAW,IAAI,CAAC,GAAG,EAAE;QAC5E,IAAI,eAAe,IAAI,CAAC;YAAE,OAAO;QACjC,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;YACjC,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;QACzE,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;QAC1B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACI,iBAAiB,CAAC,gBAAwB,EAAE,GAAG,GAAW,IAAI,CAAC,GAAG,EAAE;QACzE,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,IAAI,gBAAgB,GAAG,CAAC,EAAE,CAAC;YACzD,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,gBAAgB,CAAC;QACpC,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;QAC1B,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;QAC9C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED;;;;;OAKG;IACK,sBAAsB,CAAC,WAAmB;QAChD,IAAI,WAAW,IAAI,CAAC,IAAI,IAAI,CAAC,gBAAgB,GAAG,yBAAyB;YAAE,OAAO;QAClF,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;YAAE,OAAO;QAClD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,8BAA8B,EAAE,IAAI,CAAC,GAAG,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC,CAAC;IACjH,CAAC;IAED;;OAEG;IACI,SAAS;QACd,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC9C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACI,kBAAkB;QACvB,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,WAAW,CAAC;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;IAChE,CAAC;IAED;;;;;;;;OAQG;IACI,UAAU,CAAC,GAAG,GAAW,IAAI,CAAC,GAAG,EAAE;QACxC,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAE9C,MAAM,oBAAoB,GAAG,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC;QACvD,+EAA+E;QAC/E,IAAI,oBAAoB,GAAG,GAAG,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5C,IAAI,SAAS,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAEhC,MAAM,WAAW,GAAG,GAAG,GAAG,cAAc,CAAC;QACzC,uFAAuF;QACvF,wEAAwE;QACxE,IAAI,MAAM,GAAuB,IAAI,CAAC;QACtC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,MAAM,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC;gBAC/B,MAAM,GAAG,MAAM,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,MAAM;YACR,CAAC;QACH,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;QAC9D,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAEhD,MAAM,UAAU,GAAG,GAAG,GAAG,UAAU,CAAC;QACpC,MAAM,MAAM,GAAG,SAAS,GAAG,YAAY,CAAC;QACxC,IAAI,UAAU,GAAG,GAAG,IAAI,MAAM,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAEjD,MAAM,WAAW,GAAG,UAAU,GAAG,IAAI,CAAC;QACtC,MAAM,GAAG,GAAG,MAAM,GAAG,WAAW,CAAC;QACjC,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5E,CAAC;IAED;;;;;OAKG;IACI,aAAa,CAAC,qBAA8B,EAAE,OAAO,GAAW,IAAI,CAAC,GAAG,EAAE;QAC/E,MAAM,MAAM,GAAG,qBAAqB,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAClE,IAAI,MAAM,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAE7B,uFAAuF;QACvF,kCAAkC;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,SAAS,CAAC;QACpD,MAAM,UAAU,GAAG,OAAO,GAAG,KAAK,CAAC;QACnC,IAAI,UAAU,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAEjC,MAAM,WAAW,GAAG,UAAU,GAAG,IAAI,CAAC;QACtC,MAAM,GAAG,GAAG,MAAM,GAAG,WAAW,CAAC;QACjC,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5E,CAAC;IAED;;OAEG;IACI,WAAW,CAAC,GAAG,GAAW,IAAI,CAAC,GAAG,EAAE;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAE9B,OAAO;YACL,GAAG;YACH,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,SAAS;YACrC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC;YAC5C,eAAe,EAAE,IAAI,CAAC,kBAAkB,EAAE;SAC3C,CAAC;IACJ,CAAC;CACF"}
|