@ariaflowagents/core 0.7.1 → 0.9.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/README.md +90 -1
- package/dist/agents/Agent.d.ts +188 -9
- package/dist/agents/Agent.d.ts.map +1 -1
- package/dist/agents/Agent.js +246 -24
- package/dist/agents/Agent.js.map +1 -1
- package/dist/agents/CompositeAgent.d.ts +4 -3
- package/dist/agents/CompositeAgent.d.ts.map +1 -1
- package/dist/agents/CompositeAgent.js +19 -9
- package/dist/agents/CompositeAgent.js.map +1 -1
- package/dist/agents/FlowAgent.d.ts +3 -2
- package/dist/agents/FlowAgent.d.ts.map +1 -1
- package/dist/agents/FlowAgent.js +16 -6
- package/dist/agents/FlowAgent.js.map +1 -1
- package/dist/agents/TriageAgent.d.ts +8 -2
- package/dist/agents/TriageAgent.d.ts.map +1 -1
- package/dist/agents/TriageAgent.js +39 -6
- package/dist/agents/TriageAgent.js.map +1 -1
- package/dist/agents/index.d.ts +1 -1
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +0 -1
- package/dist/agents/index.js.map +1 -1
- package/dist/capabilities/AutoRetrieveCapability.d.ts +30 -0
- package/dist/capabilities/AutoRetrieveCapability.d.ts.map +1 -0
- package/dist/capabilities/AutoRetrieveCapability.js +36 -0
- package/dist/capabilities/AutoRetrieveCapability.js.map +1 -0
- package/dist/capabilities/ExtractionCapability.d.ts +25 -0
- package/dist/capabilities/ExtractionCapability.d.ts.map +1 -0
- package/dist/capabilities/ExtractionCapability.js +74 -0
- package/dist/capabilities/ExtractionCapability.js.map +1 -0
- package/dist/capabilities/FlowCapability.d.ts +81 -0
- package/dist/capabilities/FlowCapability.d.ts.map +1 -0
- package/dist/capabilities/FlowCapability.js +482 -0
- package/dist/capabilities/FlowCapability.js.map +1 -0
- package/dist/capabilities/GuardrailCapability.d.ts +30 -0
- package/dist/capabilities/GuardrailCapability.d.ts.map +1 -0
- package/dist/capabilities/GuardrailCapability.js +38 -0
- package/dist/capabilities/GuardrailCapability.js.map +1 -0
- package/dist/capabilities/HandoffCapability.d.ts +19 -0
- package/dist/capabilities/HandoffCapability.d.ts.map +1 -0
- package/dist/capabilities/HandoffCapability.js +58 -0
- package/dist/capabilities/HandoffCapability.js.map +1 -0
- package/dist/capabilities/LivePromptAssembler.d.ts +108 -0
- package/dist/capabilities/LivePromptAssembler.d.ts.map +1 -0
- package/dist/capabilities/LivePromptAssembler.js +157 -0
- package/dist/capabilities/LivePromptAssembler.js.map +1 -0
- package/dist/capabilities/TriageCapability.d.ts +16 -0
- package/dist/capabilities/TriageCapability.d.ts.map +1 -0
- package/dist/capabilities/TriageCapability.js +61 -0
- package/dist/capabilities/TriageCapability.js.map +1 -0
- package/dist/capabilities/adapters/ai-sdk.d.ts +14 -0
- package/dist/capabilities/adapters/ai-sdk.d.ts.map +1 -0
- package/dist/capabilities/adapters/ai-sdk.js +29 -0
- package/dist/capabilities/adapters/ai-sdk.js.map +1 -0
- package/dist/capabilities/adapters/gemini.d.ts +15 -0
- package/dist/capabilities/adapters/gemini.d.ts.map +1 -0
- package/dist/capabilities/adapters/gemini.js +40 -0
- package/dist/capabilities/adapters/gemini.js.map +1 -0
- package/dist/capabilities/index.d.ts +154 -0
- package/dist/capabilities/index.d.ts.map +1 -0
- package/dist/capabilities/index.js +128 -0
- package/dist/capabilities/index.js.map +1 -0
- package/dist/eval/EvalRunner.d.ts +12 -0
- package/dist/eval/EvalRunner.d.ts.map +1 -0
- package/dist/eval/EvalRunner.js +64 -0
- package/dist/eval/EvalRunner.js.map +1 -0
- package/dist/eval/scoring.d.ts +15 -0
- package/dist/eval/scoring.d.ts.map +1 -0
- package/dist/eval/scoring.js +152 -0
- package/dist/eval/scoring.js.map +1 -0
- package/dist/eval/types.d.ts +59 -0
- package/dist/eval/types.d.ts.map +1 -0
- package/dist/eval/types.js +2 -0
- package/dist/eval/types.js.map +1 -0
- package/dist/flows/FlowGraph.d.ts +3 -1
- package/dist/flows/FlowGraph.d.ts.map +1 -1
- package/dist/flows/FlowGraph.js +5 -0
- package/dist/flows/FlowGraph.js.map +1 -1
- package/dist/flows/FlowManager.d.ts +68 -1
- package/dist/flows/FlowManager.d.ts.map +1 -1
- package/dist/flows/FlowManager.js +499 -36
- package/dist/flows/FlowManager.js.map +1 -1
- package/dist/flows/extraction.d.ts +16 -1
- package/dist/flows/extraction.d.ts.map +1 -1
- package/dist/flows/extraction.js +34 -0
- package/dist/flows/extraction.js.map +1 -1
- package/dist/flows/index.d.ts +2 -0
- package/dist/flows/index.d.ts.map +1 -1
- package/dist/flows/index.js +1 -0
- package/dist/flows/index.js.map +1 -1
- package/dist/flows/validation.d.ts +1 -1
- package/dist/flows/validation.d.ts.map +1 -1
- package/dist/flows/validation.js +13 -1
- package/dist/flows/validation.js.map +1 -1
- package/dist/foundation/AgentDefinition.d.ts +18 -0
- package/dist/foundation/AgentDefinition.d.ts.map +1 -0
- package/dist/foundation/AgentDefinition.js +2 -0
- package/dist/foundation/AgentDefinition.js.map +1 -0
- package/dist/foundation/AgentStateController.d.ts +26 -0
- package/dist/foundation/AgentStateController.d.ts.map +1 -0
- package/dist/foundation/AgentStateController.js +2 -0
- package/dist/foundation/AgentStateController.js.map +1 -0
- package/dist/foundation/ConversationEventLog.d.ts +72 -0
- package/dist/foundation/ConversationEventLog.d.ts.map +1 -0
- package/dist/foundation/ConversationEventLog.js +2 -0
- package/dist/foundation/ConversationEventLog.js.map +1 -0
- package/dist/foundation/ConversationState.d.ts +31 -0
- package/dist/foundation/ConversationState.d.ts.map +1 -0
- package/dist/foundation/ConversationState.js +2 -0
- package/dist/foundation/ConversationState.js.map +1 -0
- package/dist/foundation/DefaultAgentStateController.d.ts +24 -0
- package/dist/foundation/DefaultAgentStateController.d.ts.map +1 -0
- package/dist/foundation/DefaultAgentStateController.js +49 -0
- package/dist/foundation/DefaultAgentStateController.js.map +1 -0
- package/dist/foundation/DefaultConversationEventLog.d.ts +28 -0
- package/dist/foundation/DefaultConversationEventLog.d.ts.map +1 -0
- package/dist/foundation/DefaultConversationEventLog.js +195 -0
- package/dist/foundation/DefaultConversationEventLog.js.map +1 -0
- package/dist/foundation/DefaultConversationState.d.ts +34 -0
- package/dist/foundation/DefaultConversationState.d.ts.map +1 -0
- package/dist/foundation/DefaultConversationState.js +100 -0
- package/dist/foundation/DefaultConversationState.js.map +1 -0
- package/dist/foundation/DefaultToolExecutor.d.ts +58 -0
- package/dist/foundation/DefaultToolExecutor.d.ts.map +1 -0
- package/dist/foundation/DefaultToolExecutor.js +128 -0
- package/dist/foundation/DefaultToolExecutor.js.map +1 -0
- package/dist/foundation/ToolExecutor.d.ts +44 -0
- package/dist/foundation/ToolExecutor.d.ts.map +1 -0
- package/dist/foundation/ToolExecutor.js +2 -0
- package/dist/foundation/ToolExecutor.js.map +1 -0
- package/dist/foundation/createFoundation.d.ts +33 -0
- package/dist/foundation/createFoundation.d.ts.map +1 -0
- package/dist/foundation/createFoundation.js +34 -0
- package/dist/foundation/createFoundation.js.map +1 -0
- package/dist/foundation/index.d.ts +15 -0
- package/dist/foundation/index.d.ts.map +1 -0
- package/dist/foundation/index.js +8 -0
- package/dist/foundation/index.js.map +1 -0
- package/dist/hooks/HookRunner.d.ts +5 -1
- package/dist/hooks/HookRunner.d.ts.map +1 -1
- package/dist/hooks/HookRunner.js +7 -0
- package/dist/hooks/HookRunner.js.map +1 -1
- package/dist/hooks/builtin/metrics.d.ts.map +1 -1
- package/dist/hooks/builtin/metrics.js +12 -0
- package/dist/hooks/builtin/metrics.js.map +1 -1
- package/dist/hooks/builtin/observability.d.ts +21 -0
- package/dist/hooks/builtin/observability.d.ts.map +1 -0
- package/dist/hooks/builtin/observability.js +535 -0
- package/dist/hooks/builtin/observability.js.map +1 -0
- package/dist/index.d.ts +24 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -2
- package/dist/index.js.map +1 -1
- package/dist/memory/MemoryService.d.ts +40 -0
- package/dist/memory/MemoryService.d.ts.map +1 -0
- package/dist/memory/MemoryService.js +2 -0
- package/dist/memory/MemoryService.js.map +1 -0
- package/dist/memory/index.d.ts +5 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +3 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/preloadMemory.d.ts +17 -0
- package/dist/memory/preloadMemory.d.ts.map +1 -0
- package/dist/memory/preloadMemory.js +62 -0
- package/dist/memory/preloadMemory.js.map +1 -0
- package/dist/memory/stores/InMemoryMemoryService.d.ts +20 -0
- package/dist/memory/stores/InMemoryMemoryService.d.ts.map +1 -0
- package/dist/memory/stores/InMemoryMemoryService.js +92 -0
- package/dist/memory/stores/InMemoryMemoryService.js.map +1 -0
- package/dist/memory/types.d.ts +49 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +8 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/orchestration/DefaultOrchestrationAuthority.d.ts +91 -0
- package/dist/orchestration/DefaultOrchestrationAuthority.d.ts.map +1 -0
- package/dist/orchestration/DefaultOrchestrationAuthority.js +786 -0
- package/dist/orchestration/DefaultOrchestrationAuthority.js.map +1 -0
- package/dist/orchestration/OrchestrationAuthority.d.ts +119 -0
- package/dist/orchestration/OrchestrationAuthority.d.ts.map +1 -0
- package/dist/orchestration/OrchestrationAuthority.js +2 -0
- package/dist/orchestration/OrchestrationAuthority.js.map +1 -0
- package/dist/orchestration/RealtimeExtractionRunner.d.ts +25 -0
- package/dist/orchestration/RealtimeExtractionRunner.d.ts.map +1 -0
- package/dist/orchestration/RealtimeExtractionRunner.js +62 -0
- package/dist/orchestration/RealtimeExtractionRunner.js.map +1 -0
- package/dist/orchestration/index.d.ts +5 -0
- package/dist/orchestration/index.d.ts.map +1 -0
- package/dist/orchestration/index.js +4 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/orchestration/types.d.ts +134 -0
- package/dist/orchestration/types.d.ts.map +1 -0
- package/dist/orchestration/types.js +2 -0
- package/dist/orchestration/types.js.map +1 -0
- package/dist/prompts/AgentPrompt.d.ts +110 -0
- package/dist/prompts/AgentPrompt.d.ts.map +1 -0
- package/dist/prompts/AgentPrompt.js +373 -0
- package/dist/prompts/AgentPrompt.js.map +1 -0
- package/dist/prompts/PromptAssembly.d.ts +119 -0
- package/dist/prompts/PromptAssembly.d.ts.map +1 -0
- package/dist/prompts/PromptAssembly.js +150 -0
- package/dist/prompts/PromptAssembly.js.map +1 -0
- package/dist/prompts/PromptBuilder.d.ts +22 -3
- package/dist/prompts/PromptBuilder.d.ts.map +1 -1
- package/dist/prompts/PromptBuilder.js +242 -13
- package/dist/prompts/PromptBuilder.js.map +1 -1
- package/dist/prompts/PromptRenderer.d.ts +43 -0
- package/dist/prompts/PromptRenderer.d.ts.map +1 -0
- package/dist/prompts/PromptRenderer.js +114 -0
- package/dist/prompts/PromptRenderer.js.map +1 -0
- package/dist/prompts/brandVoice.d.ts +10 -0
- package/dist/prompts/brandVoice.d.ts.map +1 -0
- package/dist/prompts/brandVoice.js +87 -0
- package/dist/prompts/brandVoice.js.map +1 -0
- package/dist/prompts/index.d.ts +11 -4
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +7 -2
- package/dist/prompts/index.js.map +1 -1
- package/dist/prompts/security.d.ts +5 -0
- package/dist/prompts/security.d.ts.map +1 -0
- package/dist/prompts/security.js +52 -0
- package/dist/prompts/security.js.map +1 -0
- package/dist/prompts/types.d.ts +65 -1
- package/dist/prompts/types.d.ts.map +1 -1
- package/dist/prompts/types.js +26 -0
- package/dist/prompts/types.js.map +1 -1
- package/dist/realtime/RealtimeAudioClient.d.ts +105 -0
- package/dist/realtime/RealtimeAudioClient.d.ts.map +1 -0
- package/dist/realtime/RealtimeAudioClient.js +15 -0
- package/dist/realtime/RealtimeAudioClient.js.map +1 -0
- package/dist/realtime/RealtimeRuntime.d.ts +136 -0
- package/dist/realtime/RealtimeRuntime.d.ts.map +1 -0
- package/dist/realtime/RealtimeRuntime.js +270 -0
- package/dist/realtime/RealtimeRuntime.js.map +1 -0
- package/dist/realtime/index.d.ts +4 -0
- package/dist/realtime/index.d.ts.map +1 -0
- package/dist/realtime/index.js +2 -0
- package/dist/realtime/index.js.map +1 -0
- package/dist/runtime/ContextBudget.d.ts +57 -0
- package/dist/runtime/ContextBudget.d.ts.map +1 -0
- package/dist/runtime/ContextBudget.js +103 -0
- package/dist/runtime/ContextBudget.js.map +1 -0
- package/dist/runtime/ContextManager.d.ts +8 -5
- package/dist/runtime/ContextManager.d.ts.map +1 -1
- package/dist/runtime/ContextManager.js +47 -14
- package/dist/runtime/ContextManager.js.map +1 -1
- package/dist/runtime/ExtractionEngine.d.ts +2 -1
- package/dist/runtime/ExtractionEngine.d.ts.map +1 -1
- package/dist/runtime/ExtractionEngine.js +11 -0
- package/dist/runtime/ExtractionEngine.js.map +1 -1
- package/dist/runtime/FlowExecutor.d.ts +22 -15
- package/dist/runtime/FlowExecutor.d.ts.map +1 -1
- package/dist/runtime/FlowExecutor.js +102 -149
- package/dist/runtime/FlowExecutor.js.map +1 -1
- package/dist/runtime/Runtime.d.ts +53 -78
- package/dist/runtime/Runtime.d.ts.map +1 -1
- package/dist/runtime/Runtime.js +272 -1406
- package/dist/runtime/Runtime.js.map +1 -1
- package/dist/runtime/SessionCache.d.ts +16 -0
- package/dist/runtime/SessionCache.d.ts.map +1 -0
- package/dist/runtime/SessionCache.js +49 -0
- package/dist/runtime/SessionCache.js.map +1 -0
- package/dist/runtime/SessionMutex.d.ts +37 -0
- package/dist/runtime/SessionMutex.d.ts.map +1 -0
- package/dist/runtime/SessionMutex.js +59 -0
- package/dist/runtime/SessionMutex.js.map +1 -0
- package/dist/runtime/StreamEmitter.d.ts +34 -0
- package/dist/runtime/StreamEmitter.d.ts.map +1 -0
- package/dist/runtime/StreamEmitter.js +91 -0
- package/dist/runtime/StreamEmitter.js.map +1 -0
- package/dist/runtime/handoffFilters.d.ts +60 -0
- package/dist/runtime/handoffFilters.d.ts.map +1 -0
- package/dist/runtime/handoffFilters.js +95 -0
- package/dist/runtime/handoffFilters.js.map +1 -0
- package/dist/runtime/pipeline/AgentExecuteStage.d.ts +22 -0
- package/dist/runtime/pipeline/AgentExecuteStage.d.ts.map +1 -0
- package/dist/runtime/pipeline/AgentExecuteStage.js +958 -0
- package/dist/runtime/pipeline/AgentExecuteStage.js.map +1 -0
- package/dist/runtime/pipeline/ContextAssembleStage.d.ts +26 -0
- package/dist/runtime/pipeline/ContextAssembleStage.d.ts.map +1 -0
- package/dist/runtime/pipeline/ContextAssembleStage.js +253 -0
- package/dist/runtime/pipeline/ContextAssembleStage.js.map +1 -0
- package/dist/runtime/pipeline/ContextGatherStage.d.ts +21 -0
- package/dist/runtime/pipeline/ContextGatherStage.d.ts.map +1 -0
- package/dist/runtime/pipeline/ContextGatherStage.js +161 -0
- package/dist/runtime/pipeline/ContextGatherStage.js.map +1 -0
- package/dist/runtime/pipeline/IntakeStage.d.ts +25 -0
- package/dist/runtime/pipeline/IntakeStage.d.ts.map +1 -0
- package/dist/runtime/pipeline/IntakeStage.js +126 -0
- package/dist/runtime/pipeline/IntakeStage.js.map +1 -0
- package/dist/runtime/pipeline/PostStreamStage.d.ts +26 -0
- package/dist/runtime/pipeline/PostStreamStage.d.ts.map +1 -0
- package/dist/runtime/pipeline/PostStreamStage.js +129 -0
- package/dist/runtime/pipeline/PostStreamStage.js.map +1 -0
- package/dist/runtime/pipeline/TurnPipeline.d.ts +54 -0
- package/dist/runtime/pipeline/TurnPipeline.d.ts.map +1 -0
- package/dist/runtime/pipeline/TurnPipeline.js +15 -0
- package/dist/runtime/pipeline/TurnPipeline.js.map +1 -0
- package/dist/runtime/pipeline/TurnServices.d.ts +48 -0
- package/dist/runtime/pipeline/TurnServices.d.ts.map +1 -0
- package/dist/runtime/pipeline/TurnServices.js +2 -0
- package/dist/runtime/pipeline/TurnServices.js.map +1 -0
- package/dist/runtime/pipeline/agentTypeGuards.d.ts +4 -0
- package/dist/runtime/pipeline/agentTypeGuards.d.ts.map +1 -0
- package/dist/runtime/pipeline/agentTypeGuards.js +7 -0
- package/dist/runtime/pipeline/agentTypeGuards.js.map +1 -0
- package/dist/runtime/pipeline/index.d.ts +11 -0
- package/dist/runtime/pipeline/index.d.ts.map +1 -0
- package/dist/runtime/pipeline/index.js +13 -0
- package/dist/runtime/pipeline/index.js.map +1 -0
- package/dist/runtime/pipeline/outputProcessing.d.ts +23 -0
- package/dist/runtime/pipeline/outputProcessing.d.ts.map +1 -0
- package/dist/runtime/pipeline/outputProcessing.js +63 -0
- package/dist/runtime/pipeline/outputProcessing.js.map +1 -0
- package/dist/runtime/pipeline/sessionUtils.d.ts +12 -0
- package/dist/runtime/pipeline/sessionUtils.d.ts.map +1 -0
- package/dist/runtime/pipeline/sessionUtils.js +73 -0
- package/dist/runtime/pipeline/sessionUtils.js.map +1 -0
- package/dist/tools/Tool.d.ts +7 -0
- package/dist/tools/Tool.d.ts.map +1 -1
- package/dist/tools/Tool.js +12 -3
- package/dist/tools/Tool.js.map +1 -1
- package/dist/tools/memory.d.ts +26 -0
- package/dist/tools/memory.d.ts.map +1 -0
- package/dist/tools/memory.js +51 -0
- package/dist/tools/memory.js.map +1 -0
- package/dist/types/index.d.ts +238 -9
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/telemetry.d.ts +107 -0
- package/dist/types/telemetry.d.ts.map +1 -1
- package/guides/AGENTS.md +173 -0
- package/guides/README.md +12 -0
- package/guides/TOOLS.md +93 -27
- package/package.json +25 -4
- package/dist/agents/LLMAgent.d.ts +0 -11
- package/dist/agents/LLMAgent.d.ts.map +0 -1
- package/dist/agents/LLMAgent.js +0 -31
- package/dist/agents/LLMAgent.js.map +0 -1
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
// ─── RealtimeRuntime ────────────────────────────────────────────────────────
|
|
2
|
+
/**
|
|
3
|
+
* Core-owned realtime execution facade.
|
|
4
|
+
*
|
|
5
|
+
* Accepts the same AgentConfig[] as the text Runtime, composes the
|
|
6
|
+
* OrchestrationAuthority for transport-agnostic semantics, and runs
|
|
7
|
+
* an event-driven loop over a RealtimeAudioClient.
|
|
8
|
+
*
|
|
9
|
+
* This facade is provider-agnostic — it works with any RealtimeAudioClient
|
|
10
|
+
* (Gemini, OpenAI, fake test client). Provider-specific concerns
|
|
11
|
+
* (wire format, reconnect, audio encoding) stay in the client adapter.
|
|
12
|
+
*
|
|
13
|
+
* @see RFC-REALTIME-RUNTIME-AUTHORITY.md §4.3
|
|
14
|
+
*/
|
|
15
|
+
export class RealtimeRuntime {
|
|
16
|
+
authority;
|
|
17
|
+
activeSessions = new Map();
|
|
18
|
+
constructor(config) {
|
|
19
|
+
this.authority = config.authority;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Start a realtime session.
|
|
23
|
+
*
|
|
24
|
+
* This is the canonical entry point for persistent realtime execution.
|
|
25
|
+
* It:
|
|
26
|
+
* 1. Opens a session through the authority
|
|
27
|
+
* 2. Prepares initial model config (prompt + tools)
|
|
28
|
+
* 3. Connects the model client
|
|
29
|
+
* 4. Wires the event loop (audio, transcripts, tool calls, turns)
|
|
30
|
+
* 5. Returns a handle for external control
|
|
31
|
+
*/
|
|
32
|
+
async startSession(params) {
|
|
33
|
+
const { modelClient, transport, sessionId, userId, agentId } = params;
|
|
34
|
+
// 1. Open session through authority — fires onStart + onAgentStart hooks
|
|
35
|
+
const handle = await this.authority.openSession({
|
|
36
|
+
sessionId,
|
|
37
|
+
userId,
|
|
38
|
+
agentId,
|
|
39
|
+
mode: 'realtime',
|
|
40
|
+
});
|
|
41
|
+
const callId = handle.session.id;
|
|
42
|
+
// 2. Prepare initial model config
|
|
43
|
+
const initialConfig = await this.authority.prepareRealtimeConfig(handle);
|
|
44
|
+
// 3. Track this session
|
|
45
|
+
const active = {
|
|
46
|
+
handle,
|
|
47
|
+
modelClient,
|
|
48
|
+
transport,
|
|
49
|
+
aborted: false,
|
|
50
|
+
};
|
|
51
|
+
this.activeSessions.set(callId, active);
|
|
52
|
+
// 4. Connect model client
|
|
53
|
+
await modelClient.connect(initialConfig);
|
|
54
|
+
// 5. Wire the event loop
|
|
55
|
+
this.wireEventLoop(active);
|
|
56
|
+
// 6. Return external handle
|
|
57
|
+
return {
|
|
58
|
+
sessionId: handle.session.id,
|
|
59
|
+
callId,
|
|
60
|
+
stop: () => this.stopSession(callId),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Stop a running session by call ID.
|
|
65
|
+
*/
|
|
66
|
+
async stopSession(callId) {
|
|
67
|
+
const active = this.activeSessions.get(callId);
|
|
68
|
+
if (!active)
|
|
69
|
+
return;
|
|
70
|
+
active.aborted = true;
|
|
71
|
+
this.activeSessions.delete(callId);
|
|
72
|
+
// Disconnect model client
|
|
73
|
+
await active.modelClient.disconnect().catch(() => { });
|
|
74
|
+
// Close session through authority — fires lifecycle hooks, persists
|
|
75
|
+
await this.authority.closeSession(active.handle, { success: true });
|
|
76
|
+
// Close transport
|
|
77
|
+
try {
|
|
78
|
+
active.transport.close();
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// Ignore transport close errors
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Stop all active sessions.
|
|
86
|
+
*/
|
|
87
|
+
async shutdown() {
|
|
88
|
+
const callIds = Array.from(this.activeSessions.keys());
|
|
89
|
+
await Promise.allSettled(callIds.map(id => this.stopSession(id)));
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Get an active session by call ID.
|
|
93
|
+
*/
|
|
94
|
+
getSession(callId) {
|
|
95
|
+
const active = this.activeSessions.get(callId);
|
|
96
|
+
if (!active)
|
|
97
|
+
return undefined;
|
|
98
|
+
return {
|
|
99
|
+
sessionId: active.handle.session.id,
|
|
100
|
+
callId,
|
|
101
|
+
stop: () => this.stopSession(callId),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
// ─── Private: Event loop ────────────────────────────────────────────────────
|
|
105
|
+
/**
|
|
106
|
+
* Wire the event loop between transport, model client, and authority.
|
|
107
|
+
*
|
|
108
|
+
* This is the heart of the realtime runtime. It maps provider events
|
|
109
|
+
* to authority operations and authority outcomes to transport/model actions.
|
|
110
|
+
*
|
|
111
|
+
* The event loop matches the pseudocode in RFC-REALTIME-RUNTIME-AUTHORITY.md §5.
|
|
112
|
+
*/
|
|
113
|
+
wireEventLoop(active) {
|
|
114
|
+
const { handle, modelClient, transport } = active;
|
|
115
|
+
// Transport audio → Model (user speaking)
|
|
116
|
+
transport.onAudio((data) => {
|
|
117
|
+
if (active.aborted)
|
|
118
|
+
return;
|
|
119
|
+
modelClient.sendAudio(data);
|
|
120
|
+
});
|
|
121
|
+
// Transport close → stop session
|
|
122
|
+
transport.onClose(() => {
|
|
123
|
+
this.stopSession(handle.session.id).catch((err) => {
|
|
124
|
+
console.error('[RealtimeRuntime] Error stopping session on transport close:', err);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
// Model audio → Transport (assistant speaking)
|
|
128
|
+
modelClient.on('audio', (data) => {
|
|
129
|
+
if (active.aborted)
|
|
130
|
+
return;
|
|
131
|
+
transport.sendAudio(data);
|
|
132
|
+
});
|
|
133
|
+
// Model transcripts → Authority (record in session)
|
|
134
|
+
modelClient.on('transcript', (text, role) => {
|
|
135
|
+
if (active.aborted)
|
|
136
|
+
return;
|
|
137
|
+
if (role === 'user') {
|
|
138
|
+
this.authority.recordUserInput(handle, text).catch((err) => {
|
|
139
|
+
console.error('[RealtimeRuntime] Error recording user input:', err);
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
this.authority.recordAssistantOutput(handle, text).catch((err) => {
|
|
144
|
+
console.error('[RealtimeRuntime] Error recording assistant output:', err);
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
// Model tool calls → Authority (execute + route + respond)
|
|
149
|
+
modelClient.on('tool-call', (id, name, args) => {
|
|
150
|
+
if (active.aborted)
|
|
151
|
+
return;
|
|
152
|
+
this.handleToolCall(active, id, name, args).catch((err) => {
|
|
153
|
+
console.error(`[RealtimeRuntime] Tool call error for ${name}:`, err);
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
// Model interrupted → clear transport buffer (barge-in)
|
|
157
|
+
modelClient.on('interrupted', () => {
|
|
158
|
+
if (active.aborted)
|
|
159
|
+
return;
|
|
160
|
+
console.log('[RealtimeRuntime] Barge-in detected — clearing audio buffer');
|
|
161
|
+
transport.clearAudioBuffer?.();
|
|
162
|
+
});
|
|
163
|
+
// Model turn complete → Authority (extraction, persistence, memory)
|
|
164
|
+
modelClient.on('turn-complete', () => {
|
|
165
|
+
if (active.aborted)
|
|
166
|
+
return;
|
|
167
|
+
this.authority.completeTurn(handle).catch((err) => {
|
|
168
|
+
console.error('[RealtimeRuntime] Error completing turn:', err);
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
// Model error → Authority (fail session)
|
|
172
|
+
modelClient.on('error', (error) => {
|
|
173
|
+
if (active.aborted)
|
|
174
|
+
return;
|
|
175
|
+
console.error(`[RealtimeRuntime] Model error: ${error}`);
|
|
176
|
+
this.authority.failSession(handle, new Error(error)).then(() => {
|
|
177
|
+
this.activeSessions.delete(handle.session.id);
|
|
178
|
+
try {
|
|
179
|
+
transport.close();
|
|
180
|
+
}
|
|
181
|
+
catch { /* ignore */ }
|
|
182
|
+
}).catch((err) => {
|
|
183
|
+
console.error('[RealtimeRuntime] Error failing session:', err);
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
// Model disconnected → stop session
|
|
187
|
+
modelClient.on('disconnected', () => {
|
|
188
|
+
if (active.aborted)
|
|
189
|
+
return;
|
|
190
|
+
this.stopSession(handle.session.id).catch((err) => {
|
|
191
|
+
console.error('[RealtimeRuntime] Error stopping session on disconnect:', err);
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Handle a tool call from the model:
|
|
197
|
+
* 1. Execute through authority (enforcement, hooks, capability routing)
|
|
198
|
+
* 2. Send tool response back to model
|
|
199
|
+
* 3. Act on the outcome (reconfigure, handoff, end)
|
|
200
|
+
*/
|
|
201
|
+
async handleToolCall(active, id, name, args) {
|
|
202
|
+
const { handle, modelClient } = active;
|
|
203
|
+
// Execute through authority — fires hooks, routes through CapabilityHost
|
|
204
|
+
const outcome = await this.authority.executeToolCall(handle, { id, name, args });
|
|
205
|
+
// Send tool response to model
|
|
206
|
+
modelClient.sendToolResponse([outcome.toolResponse]);
|
|
207
|
+
// Act on the outcome
|
|
208
|
+
switch (outcome.action.type) {
|
|
209
|
+
case 'reconfigure': {
|
|
210
|
+
// Flow transitioned — let the model finish responding to the tool
|
|
211
|
+
// result before reconfiguring. Without this, the model's acknowledgment
|
|
212
|
+
// (e.g., "I found your order") is lost in the reconnect.
|
|
213
|
+
if (outcome.nextRealtimeConfig) {
|
|
214
|
+
await this.waitForTurnComplete(modelClient, 10000);
|
|
215
|
+
await modelClient.updateConfig(outcome.nextRealtimeConfig);
|
|
216
|
+
}
|
|
217
|
+
if (modelClient.requestResponse) {
|
|
218
|
+
const transitionCtx = outcome.action.transition;
|
|
219
|
+
const instruction = transitionCtx
|
|
220
|
+
? `You just transitioned to the "${transitionCtx.to}" phase. Continue with the new task using the available tools.`
|
|
221
|
+
: 'Continue with the current task.';
|
|
222
|
+
modelClient.requestResponse(instruction);
|
|
223
|
+
}
|
|
224
|
+
break;
|
|
225
|
+
}
|
|
226
|
+
case 'handoff': {
|
|
227
|
+
// Agent handoff — stop this session
|
|
228
|
+
// The caller (VoiceEngine) is responsible for starting a new session
|
|
229
|
+
// with the target agent.
|
|
230
|
+
await this.stopSession(handle.session.id);
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
case 'end': {
|
|
234
|
+
// Flow or conversation ended — stop session
|
|
235
|
+
await this.stopSession(handle.session.id);
|
|
236
|
+
break;
|
|
237
|
+
}
|
|
238
|
+
case 'continue':
|
|
239
|
+
case 'extraction-complete':
|
|
240
|
+
default:
|
|
241
|
+
// Regular tool result — model drives the next response
|
|
242
|
+
break;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Wait for the model to emit turn-complete after a tool response.
|
|
247
|
+
* This gives the model time to generate a verbal acknowledgment
|
|
248
|
+
* before the session reconfigures (disconnect + reconnect).
|
|
249
|
+
*
|
|
250
|
+
* Times out if the model doesn't complete within the budget —
|
|
251
|
+
* this prevents hanging if the model enters a tool-call loop
|
|
252
|
+
* or the connection drops before turn-complete fires.
|
|
253
|
+
*/
|
|
254
|
+
waitForTurnComplete(modelClient, timeoutMs) {
|
|
255
|
+
return new Promise((resolve) => {
|
|
256
|
+
const timer = setTimeout(() => {
|
|
257
|
+
modelClient.off('turn-complete', handler);
|
|
258
|
+
console.warn('[RealtimeRuntime] turn-complete timeout before reconfigure — proceeding');
|
|
259
|
+
resolve();
|
|
260
|
+
}, timeoutMs);
|
|
261
|
+
const handler = () => {
|
|
262
|
+
clearTimeout(timer);
|
|
263
|
+
modelClient.off('turn-complete', handler);
|
|
264
|
+
resolve();
|
|
265
|
+
};
|
|
266
|
+
modelClient.on('turn-complete', handler);
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=RealtimeRuntime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RealtimeRuntime.js","sourceRoot":"","sources":["../../src/realtime/RealtimeRuntime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type { RealtimeAudioClient, RealtimeSessionConfig, RealtimeAudioConfig, RealtimeToolResponse, RealtimeEventMap, } from './RealtimeAudioClient.js';
|
|
2
|
+
export { RealtimeRuntime } from './RealtimeRuntime.js';
|
|
3
|
+
export type { RealtimeRuntimeConfig, RealtimeTransportSession, StartRealtimeSessionParams, RealtimeSessionHandle, } from './RealtimeRuntime.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/realtime/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EACV,qBAAqB,EACrB,wBAAwB,EACxB,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/realtime/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Budget System for AriaFlow.
|
|
3
|
+
*
|
|
4
|
+
* Manages token allocation across the multiple content sources that compose
|
|
5
|
+
* each LLM request. Ensures no single section can monopolize the context window.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* ContextBudgetConfig defines the token allocation strategy for the LLM
|
|
9
|
+
* context window. It governs how the finite context window is partitioned
|
|
10
|
+
* across the multiple content sources that compose each LLM request.
|
|
11
|
+
*/
|
|
12
|
+
export interface ContextBudgetConfig {
|
|
13
|
+
/** Total context window size of the target model, in tokens. Default: 128,000. */
|
|
14
|
+
modelContextWindow: number;
|
|
15
|
+
/** Tokens reserved for the LLM's response generation. Default: 4,096. */
|
|
16
|
+
responseReserve: number;
|
|
17
|
+
/** Maximum tokens allocated to auto-retrieve (RAG) context injection. Default: 4,000. */
|
|
18
|
+
maxAutoRetrieveTokens: number;
|
|
19
|
+
/** Maximum tokens allocated to the working memory section. Default: 2,000. */
|
|
20
|
+
maxWorkingMemoryTokens: number;
|
|
21
|
+
/** Maximum tokens allocated to the extraction snapshot section. Default: 2,000. */
|
|
22
|
+
maxExtractionTokens: number;
|
|
23
|
+
/** Maximum tokens allocated to cross-session long-term memory. Default: 2,000. */
|
|
24
|
+
maxLongTermMemoryTokens: number;
|
|
25
|
+
/**
|
|
26
|
+
* Maximum tokens allocated to the base system prompt.
|
|
27
|
+
* 0 means no limit — the base prompt is measured, not capped.
|
|
28
|
+
* Default: 0.
|
|
29
|
+
*/
|
|
30
|
+
maxBasePromptTokens: number;
|
|
31
|
+
}
|
|
32
|
+
export declare const DEFAULT_CONTEXT_BUDGET: ContextBudgetConfig;
|
|
33
|
+
/**
|
|
34
|
+
* Token estimation function. Uses a rough 4:1 character-to-token ratio.
|
|
35
|
+
* Consistent with ContextManager.ts.
|
|
36
|
+
*/
|
|
37
|
+
export declare function estimateTokenCount(text: string): number;
|
|
38
|
+
/**
|
|
39
|
+
* Computes the remaining token budget available for message history after
|
|
40
|
+
* all system prompt sections have been allocated.
|
|
41
|
+
*
|
|
42
|
+
* Floors at 1000 tokens to ensure the LLM always sees at least minimal
|
|
43
|
+
* conversation history.
|
|
44
|
+
*/
|
|
45
|
+
export declare function computeMessageHistoryBudget(config: ContextBudgetConfig, measuredBasePromptTokens: number, measuredPolicyInjectionTokens: number): number;
|
|
46
|
+
/**
|
|
47
|
+
* Truncates a text string to fit within a token budget.
|
|
48
|
+
* Truncation is at the nearest sentence boundary when possible.
|
|
49
|
+
*/
|
|
50
|
+
export declare function truncateToTokenBudget(text: string, maxTokens: number): string;
|
|
51
|
+
/**
|
|
52
|
+
* Budget-aware working memory formatter.
|
|
53
|
+
* Iterates entries in insertion order, dropping entries that exceed the budget.
|
|
54
|
+
* Entries are atomic — they are either fully included or fully dropped.
|
|
55
|
+
*/
|
|
56
|
+
export declare function formatMemoryWithBudget(memory: Record<string, unknown>, maxTokens: number, allowlist?: string[]): string;
|
|
57
|
+
//# sourceMappingURL=ContextBudget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextBudget.d.ts","sourceRoot":"","sources":["../../src/runtime/ContextBudget.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,kFAAkF;IAClF,kBAAkB,EAAE,MAAM,CAAC;IAE3B,yEAAyE;IACzE,eAAe,EAAE,MAAM,CAAC;IAExB,yFAAyF;IACzF,qBAAqB,EAAE,MAAM,CAAC;IAE9B,8EAA8E;IAC9E,sBAAsB,EAAE,MAAM,CAAC;IAE/B,mFAAmF;IACnF,mBAAmB,EAAE,MAAM,CAAC;IAE5B,kFAAkF;IAClF,uBAAuB,EAAE,MAAM,CAAC;IAEhC;;;;OAIG;IACH,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,sBAAsB,EAAE,mBAQpC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,mBAAmB,EAC3B,wBAAwB,EAAE,MAAM,EAChC,6BAA6B,EAAE,MAAM,GACpC,MAAM,CAuBR;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAqB7E;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,EAAE,GACnB,MAAM,CAiCR"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Budget System for AriaFlow.
|
|
3
|
+
*
|
|
4
|
+
* Manages token allocation across the multiple content sources that compose
|
|
5
|
+
* each LLM request. Ensures no single section can monopolize the context window.
|
|
6
|
+
*/
|
|
7
|
+
export const DEFAULT_CONTEXT_BUDGET = {
|
|
8
|
+
modelContextWindow: 128_000,
|
|
9
|
+
responseReserve: 4_096,
|
|
10
|
+
maxAutoRetrieveTokens: 4_000,
|
|
11
|
+
maxWorkingMemoryTokens: 2_000,
|
|
12
|
+
maxExtractionTokens: 2_000,
|
|
13
|
+
maxLongTermMemoryTokens: 2_000,
|
|
14
|
+
maxBasePromptTokens: 0,
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Token estimation function. Uses a rough 4:1 character-to-token ratio.
|
|
18
|
+
* Consistent with ContextManager.ts.
|
|
19
|
+
*/
|
|
20
|
+
export function estimateTokenCount(text) {
|
|
21
|
+
if (!text)
|
|
22
|
+
return 0;
|
|
23
|
+
return Math.ceil(text.length / 4);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Computes the remaining token budget available for message history after
|
|
27
|
+
* all system prompt sections have been allocated.
|
|
28
|
+
*
|
|
29
|
+
* Floors at 1000 tokens to ensure the LLM always sees at least minimal
|
|
30
|
+
* conversation history.
|
|
31
|
+
*/
|
|
32
|
+
export function computeMessageHistoryBudget(config, measuredBasePromptTokens, measuredPolicyInjectionTokens) {
|
|
33
|
+
const systemBudget = measuredBasePromptTokens +
|
|
34
|
+
config.maxAutoRetrieveTokens +
|
|
35
|
+
config.maxWorkingMemoryTokens +
|
|
36
|
+
config.maxExtractionTokens +
|
|
37
|
+
config.maxLongTermMemoryTokens +
|
|
38
|
+
measuredPolicyInjectionTokens;
|
|
39
|
+
const available = config.modelContextWindow - config.responseReserve - systemBudget;
|
|
40
|
+
if (available < 1000) {
|
|
41
|
+
console.warn('[AriaFlow] Context budget exhausted: system prompt sections consume ' +
|
|
42
|
+
`${systemBudget} tokens, leaving only ${available} tokens for message ` +
|
|
43
|
+
'history. Consider reducing maxAutoRetrieveTokens, maxWorkingMemoryTokens, ' +
|
|
44
|
+
'or the base system prompt size.');
|
|
45
|
+
return Math.max(available, 1000);
|
|
46
|
+
}
|
|
47
|
+
return available;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Truncates a text string to fit within a token budget.
|
|
51
|
+
* Truncation is at the nearest sentence boundary when possible.
|
|
52
|
+
*/
|
|
53
|
+
export function truncateToTokenBudget(text, maxTokens) {
|
|
54
|
+
if (maxTokens <= 0)
|
|
55
|
+
return '';
|
|
56
|
+
const estimated = estimateTokenCount(text);
|
|
57
|
+
if (estimated <= maxTokens)
|
|
58
|
+
return text;
|
|
59
|
+
// Convert token budget to approximate character count
|
|
60
|
+
const maxChars = maxTokens * 4;
|
|
61
|
+
const truncatedRegion = text.slice(0, maxChars);
|
|
62
|
+
// Find the last sentence boundary within the character budget
|
|
63
|
+
const lastSentenceEnd = Math.max(truncatedRegion.lastIndexOf('. '), truncatedRegion.lastIndexOf('.\n'));
|
|
64
|
+
if (lastSentenceEnd > maxChars * 0.5) {
|
|
65
|
+
return truncatedRegion.slice(0, lastSentenceEnd + 1) + '\n[truncated]';
|
|
66
|
+
}
|
|
67
|
+
// No good sentence boundary — hard truncate
|
|
68
|
+
return truncatedRegion + '\n[truncated]';
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Budget-aware working memory formatter.
|
|
72
|
+
* Iterates entries in insertion order, dropping entries that exceed the budget.
|
|
73
|
+
* Entries are atomic — they are either fully included or fully dropped.
|
|
74
|
+
*/
|
|
75
|
+
export function formatMemoryWithBudget(memory, maxTokens, allowlist) {
|
|
76
|
+
if (maxTokens <= 0)
|
|
77
|
+
return '';
|
|
78
|
+
const entries = Object.entries(memory);
|
|
79
|
+
const filteredEntries = allowlist
|
|
80
|
+
? entries.filter(([key]) => allowlist.includes(key))
|
|
81
|
+
: entries;
|
|
82
|
+
if (filteredEntries.length === 0)
|
|
83
|
+
return '';
|
|
84
|
+
const headerLine = '\n\n## Known Information';
|
|
85
|
+
let tokenCount = estimateTokenCount(headerLine);
|
|
86
|
+
const lines = [headerLine];
|
|
87
|
+
let omitted = 0;
|
|
88
|
+
for (const [key, value] of filteredEntries) {
|
|
89
|
+
const line = `\n- **${key}**: ${typeof value === 'object' ? JSON.stringify(value) : value}`;
|
|
90
|
+
const lineTokens = estimateTokenCount(line);
|
|
91
|
+
if (tokenCount + lineTokens > maxTokens) {
|
|
92
|
+
omitted++;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
lines.push(line);
|
|
96
|
+
tokenCount += lineTokens;
|
|
97
|
+
}
|
|
98
|
+
if (omitted > 0) {
|
|
99
|
+
lines.push(`\n[${omitted} entries omitted due to context budget]`);
|
|
100
|
+
}
|
|
101
|
+
return lines.join('');
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=ContextBudget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextBudget.js","sourceRoot":"","sources":["../../src/runtime/ContextBudget.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,12 +10,15 @@ export interface ContextManagerOptions {
|
|
|
10
10
|
keepSystemPrompt?: boolean;
|
|
11
11
|
transformer?: MessageTransformer;
|
|
12
12
|
}
|
|
13
|
+
export interface ContextManagerContext {
|
|
14
|
+
turnCount: number;
|
|
15
|
+
totalTokens: number;
|
|
16
|
+
sessionId: string;
|
|
17
|
+
/** When provided, overrides the configured maxTokens for this turn. */
|
|
18
|
+
maxTokensOverride?: number;
|
|
19
|
+
}
|
|
13
20
|
export interface ContextManager {
|
|
14
|
-
beforeTurn(messages: ModelMessage[], context:
|
|
15
|
-
turnCount: number;
|
|
16
|
-
totalTokens: number;
|
|
17
|
-
sessionId: string;
|
|
18
|
-
}): Promise<ModelMessage[]> | ModelMessage[];
|
|
21
|
+
beforeTurn(messages: ModelMessage[], context: ContextManagerContext): Promise<ModelMessage[]> | ModelMessage[];
|
|
19
22
|
}
|
|
20
23
|
export declare function createContextManager(options?: ContextManagerOptions): ContextManager;
|
|
21
24
|
export declare function createSummarizingContextManager(summarizeFn: (messages: ModelMessage[]) => Promise<string> | string, options?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextManager.d.ts","sourceRoot":"","sources":["../../src/runtime/ContextManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAEvC,MAAM,MAAM,kBAAkB,GAAG,CAC/B,QAAQ,EAAE,YAAY,EAAE,EACxB,OAAO,EAAE;IACP,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB,KACE,OAAO,CAAC,YAAY,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC;AAE9C,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC;AAED,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"ContextManager.d.ts","sourceRoot":"","sources":["../../src/runtime/ContextManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAEvC,MAAM,MAAM,kBAAkB,GAAG,CAC/B,QAAQ,EAAE,YAAY,EAAE,EACxB,OAAO,EAAE;IACP,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB,KACE,OAAO,CAAC,YAAY,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC;AAE9C,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC;CAChH;AAoID,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B,GAAG,cAAc,CAkHxF;AAED,wBAAgB,+BAA+B,CAC7C,WAAW,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,EACnE,OAAO,GAAE;IACP,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,WAAW,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;CAC1C,GACL,cAAc,CAoDhB"}
|
|
@@ -121,20 +121,39 @@ function estimateMessageTokens(message) {
|
|
|
121
121
|
}
|
|
122
122
|
export function createContextManager(options = {}) {
|
|
123
123
|
const { maxTokens = 100000, maxMessages = 50, keepSystemPrompt = true, transformer, } = options;
|
|
124
|
-
function pruneByTokenBudget(messages) {
|
|
125
|
-
|
|
124
|
+
function pruneByTokenBudget(messages, tokenLimit) {
|
|
125
|
+
const effectiveLimit = tokenLimit ?? maxTokens;
|
|
126
|
+
if (effectiveLimit === 0)
|
|
126
127
|
return messages;
|
|
127
|
-
|
|
128
|
-
|
|
128
|
+
// Iterate back-to-front so we keep the most recent messages (recency bias).
|
|
129
|
+
// System messages are always kept regardless of budget.
|
|
130
|
+
const systemMessages = [];
|
|
131
|
+
const otherMessages = [];
|
|
129
132
|
for (const msg of messages) {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
+
if (msg.role === 'system' && keepSystemPrompt) {
|
|
134
|
+
systemMessages.push(msg);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
otherMessages.push(msg);
|
|
133
138
|
}
|
|
139
|
+
}
|
|
140
|
+
let tokenCount = systemMessages.reduce((sum, m) => sum + estimateMessageTokens(m), 0);
|
|
141
|
+
let startIndex = otherMessages.length;
|
|
142
|
+
for (let i = otherMessages.length - 1; i >= 0; i--) {
|
|
143
|
+
const msgTokens = estimateMessageTokens(otherMessages[i]);
|
|
144
|
+
if (tokenCount + msgTokens > effectiveLimit)
|
|
145
|
+
break;
|
|
134
146
|
tokenCount += msgTokens;
|
|
135
|
-
|
|
147
|
+
startIndex = i;
|
|
136
148
|
}
|
|
137
|
-
|
|
149
|
+
// Walk startIndex backward to avoid splitting tool-call/result pairs.
|
|
150
|
+
while (startIndex > 0) {
|
|
151
|
+
const violation = firstToolBoundaryViolationIndex(otherMessages, startIndex);
|
|
152
|
+
if (violation < 0)
|
|
153
|
+
break;
|
|
154
|
+
startIndex = violation;
|
|
155
|
+
}
|
|
156
|
+
return [...systemMessages, ...otherMessages.slice(startIndex)];
|
|
138
157
|
}
|
|
139
158
|
function pruneByMessageCount(messages) {
|
|
140
159
|
if (maxMessages === 0)
|
|
@@ -152,8 +171,15 @@ export function createContextManager(options = {}) {
|
|
|
152
171
|
}
|
|
153
172
|
}
|
|
154
173
|
const keep = Math.min(maxMessages - systemMessages.length, otherMessages.length);
|
|
155
|
-
|
|
156
|
-
|
|
174
|
+
let startIndex = otherMessages.length - keep;
|
|
175
|
+
// Walk startIndex backward to avoid splitting tool-call/result pairs.
|
|
176
|
+
while (startIndex > 0) {
|
|
177
|
+
const violation = firstToolBoundaryViolationIndex(otherMessages, startIndex);
|
|
178
|
+
if (violation < 0)
|
|
179
|
+
break;
|
|
180
|
+
startIndex = violation;
|
|
181
|
+
}
|
|
182
|
+
return [...systemMessages, ...otherMessages.slice(startIndex)];
|
|
157
183
|
}
|
|
158
184
|
function slidingWindow(messages, windowSize = 10) {
|
|
159
185
|
if (windowSize === 0)
|
|
@@ -168,8 +194,15 @@ export function createContextManager(options = {}) {
|
|
|
168
194
|
otherMessages.push(msg);
|
|
169
195
|
}
|
|
170
196
|
}
|
|
171
|
-
|
|
172
|
-
|
|
197
|
+
let startIndex = Math.max(0, otherMessages.length - windowSize);
|
|
198
|
+
// Walk startIndex backward to avoid splitting tool-call/result pairs.
|
|
199
|
+
while (startIndex > 0) {
|
|
200
|
+
const violation = firstToolBoundaryViolationIndex(otherMessages, startIndex);
|
|
201
|
+
if (violation < 0)
|
|
202
|
+
break;
|
|
203
|
+
startIndex = violation;
|
|
204
|
+
}
|
|
205
|
+
return [...systemMessages, ...otherMessages.slice(startIndex)];
|
|
173
206
|
}
|
|
174
207
|
return {
|
|
175
208
|
async beforeTurn(messages, context) {
|
|
@@ -177,7 +210,7 @@ export function createContextManager(options = {}) {
|
|
|
177
210
|
if (transformer) {
|
|
178
211
|
result = (await transformer(result, context)) || result;
|
|
179
212
|
}
|
|
180
|
-
result = pruneByTokenBudget(result);
|
|
213
|
+
result = pruneByTokenBudget(result, context.maxTokensOverride);
|
|
181
214
|
result = pruneByMessageCount(result);
|
|
182
215
|
result = slidingWindow(result, maxMessages);
|
|
183
216
|
return result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextManager.js","sourceRoot":"","sources":["../../src/runtime/ContextManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ContextManager.js","sourceRoot":"","sources":["../../src/runtime/ContextManager.ts"],"names":[],"mappings":"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"}
|