@ariaflowagents/core 0.6.3 → 0.7.1

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.
Files changed (161) hide show
  1. package/README.md +58 -5
  2. package/dist/agents/Agent.d.ts +1 -0
  3. package/dist/agents/Agent.d.ts.map +1 -1
  4. package/dist/agents/Agent.js +10 -1
  5. package/dist/agents/Agent.js.map +1 -1
  6. package/dist/agents/CompositeAgent.d.ts +8 -12
  7. package/dist/agents/CompositeAgent.d.ts.map +1 -1
  8. package/dist/agents/CompositeAgent.js +30 -16
  9. package/dist/agents/CompositeAgent.js.map +1 -1
  10. package/dist/agents/FlowAgent.js +2 -2
  11. package/dist/agents/FlowAgent.js.map +1 -1
  12. package/dist/agents/LLMAgent.d.ts.map +1 -1
  13. package/dist/agents/LLMAgent.js +4 -25
  14. package/dist/agents/LLMAgent.js.map +1 -1
  15. package/dist/agents/TriageAgent.d.ts.map +1 -1
  16. package/dist/agents/TriageAgent.js +8 -29
  17. package/dist/agents/TriageAgent.js.map +1 -1
  18. package/dist/callbacks/httpCallback.d.ts +1 -0
  19. package/dist/callbacks/httpCallback.d.ts.map +1 -1
  20. package/dist/callbacks/httpCallback.js +20 -6
  21. package/dist/callbacks/httpCallback.js.map +1 -1
  22. package/dist/callbacks/streamCallback.d.ts +26 -0
  23. package/dist/callbacks/streamCallback.d.ts.map +1 -0
  24. package/dist/callbacks/streamCallback.js +281 -0
  25. package/dist/callbacks/streamCallback.js.map +1 -0
  26. package/dist/flows/FlowManager.d.ts +19 -4
  27. package/dist/flows/FlowManager.d.ts.map +1 -1
  28. package/dist/flows/FlowManager.js +360 -132
  29. package/dist/flows/FlowManager.js.map +1 -1
  30. package/dist/flows/extraction.d.ts +17 -0
  31. package/dist/flows/extraction.d.ts.map +1 -0
  32. package/dist/flows/extraction.js +56 -0
  33. package/dist/flows/extraction.js.map +1 -0
  34. package/dist/flows/index.d.ts +1 -2
  35. package/dist/flows/index.d.ts.map +1 -1
  36. package/dist/flows/index.js +1 -1
  37. package/dist/flows/index.js.map +1 -1
  38. package/dist/flows/template.d.ts +2 -2
  39. package/dist/flows/template.d.ts.map +1 -1
  40. package/dist/flows/template.js +13 -0
  41. package/dist/flows/template.js.map +1 -1
  42. package/dist/flows/validation.d.ts +7 -0
  43. package/dist/flows/validation.d.ts.map +1 -0
  44. package/dist/flows/validation.js +42 -0
  45. package/dist/flows/validation.js.map +1 -0
  46. package/dist/hooks/builtin/metrics.d.ts +4 -34
  47. package/dist/hooks/builtin/metrics.d.ts.map +1 -1
  48. package/dist/hooks/builtin/metrics.js +3 -65
  49. package/dist/hooks/builtin/metrics.js.map +1 -1
  50. package/dist/hooks/helpers.d.ts +8 -47
  51. package/dist/hooks/helpers.d.ts.map +1 -1
  52. package/dist/hooks/helpers.js +38 -104
  53. package/dist/hooks/helpers.js.map +1 -1
  54. package/dist/hooks/index.d.ts +4 -1
  55. package/dist/hooks/index.d.ts.map +1 -1
  56. package/dist/hooks/index.js +2 -0
  57. package/dist/hooks/index.js.map +1 -1
  58. package/dist/index.d.ts +4 -4
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +3 -2
  61. package/dist/index.js.map +1 -1
  62. package/dist/processors/ProcessorRunner.d.ts.map +1 -1
  63. package/dist/processors/ProcessorRunner.js +13 -0
  64. package/dist/processors/ProcessorRunner.js.map +1 -1
  65. package/dist/prompts/PromptBuilder.d.ts.map +1 -1
  66. package/dist/prompts/PromptBuilder.js +1 -0
  67. package/dist/prompts/PromptBuilder.js.map +1 -1
  68. package/dist/prompts/types.d.ts +2 -1
  69. package/dist/prompts/types.d.ts.map +1 -1
  70. package/dist/prompts/types.js +29 -7
  71. package/dist/prompts/types.js.map +1 -1
  72. package/dist/runtime/ContextManager.d.ts +1 -1
  73. package/dist/runtime/ContextManager.d.ts.map +1 -1
  74. package/dist/runtime/ContextManager.js +141 -20
  75. package/dist/runtime/ContextManager.js.map +1 -1
  76. package/dist/runtime/ExtractionEngine.d.ts +34 -0
  77. package/dist/runtime/ExtractionEngine.d.ts.map +1 -0
  78. package/dist/runtime/ExtractionEngine.js +155 -0
  79. package/dist/runtime/ExtractionEngine.js.map +1 -0
  80. package/dist/runtime/FlowExecutor.d.ts +51 -0
  81. package/dist/runtime/FlowExecutor.d.ts.map +1 -0
  82. package/dist/runtime/FlowExecutor.js +523 -0
  83. package/dist/runtime/FlowExecutor.js.map +1 -0
  84. package/dist/runtime/InjectionQueue.d.ts +8 -1
  85. package/dist/runtime/InjectionQueue.d.ts.map +1 -1
  86. package/dist/runtime/InjectionQueue.js +33 -0
  87. package/dist/runtime/InjectionQueue.js.map +1 -1
  88. package/dist/runtime/Runtime.d.ts +32 -2
  89. package/dist/runtime/Runtime.d.ts.map +1 -1
  90. package/dist/runtime/Runtime.js +513 -612
  91. package/dist/runtime/Runtime.js.map +1 -1
  92. package/dist/runtime/SessionEventManager.d.ts +17 -0
  93. package/dist/runtime/SessionEventManager.d.ts.map +1 -0
  94. package/dist/runtime/SessionEventManager.js +149 -0
  95. package/dist/runtime/SessionEventManager.js.map +1 -0
  96. package/dist/runtime/SuggestionManager.d.ts +7 -0
  97. package/dist/runtime/SuggestionManager.d.ts.map +1 -0
  98. package/dist/runtime/SuggestionManager.js +50 -0
  99. package/dist/runtime/SuggestionManager.js.map +1 -0
  100. package/dist/runtime/index.d.ts +1 -1
  101. package/dist/runtime/index.d.ts.map +1 -1
  102. package/dist/runtime/index.js +1 -1
  103. package/dist/runtime/index.js.map +1 -1
  104. package/dist/services/MetricsService.d.ts +55 -0
  105. package/dist/services/MetricsService.d.ts.map +1 -0
  106. package/dist/services/MetricsService.js +86 -0
  107. package/dist/services/MetricsService.js.map +1 -0
  108. package/dist/services/TracingService.d.ts +13 -0
  109. package/dist/services/TracingService.d.ts.map +1 -0
  110. package/dist/services/TracingService.js +62 -0
  111. package/dist/services/TracingService.js.map +1 -0
  112. package/dist/session/stores/MemoryStore.js +1 -1
  113. package/dist/session/stores/MemoryStore.js.map +1 -1
  114. package/dist/tools/Tool.d.ts +25 -3
  115. package/dist/tools/Tool.d.ts.map +1 -1
  116. package/dist/tools/Tool.js.map +1 -1
  117. package/dist/tools/errorHandling.d.ts +1 -1
  118. package/dist/tools/errorHandling.d.ts.map +1 -1
  119. package/dist/tools/errorHandling.js +27 -20
  120. package/dist/tools/errorHandling.js.map +1 -1
  121. package/dist/tools/http.d.ts.map +1 -1
  122. package/dist/tools/http.js +53 -17
  123. package/dist/tools/http.js.map +1 -1
  124. package/dist/types/index.d.ts +179 -3
  125. package/dist/types/index.d.ts.map +1 -1
  126. package/dist/types/index.js +1 -0
  127. package/dist/types/index.js.map +1 -1
  128. package/dist/types/telemetry.d.ts +52 -0
  129. package/dist/types/telemetry.d.ts.map +1 -0
  130. package/dist/types/telemetry.js +2 -0
  131. package/dist/types/telemetry.js.map +1 -0
  132. package/dist/utils/aiStream.d.ts +7 -0
  133. package/dist/utils/aiStream.d.ts.map +1 -0
  134. package/dist/utils/aiStream.js +41 -0
  135. package/dist/utils/aiStream.js.map +1 -0
  136. package/dist/utils/chrono.d.ts +3 -46
  137. package/dist/utils/chrono.d.ts.map +1 -1
  138. package/dist/utils/chrono.js.map +1 -1
  139. package/dist/utils/isRecord.d.ts +2 -0
  140. package/dist/utils/isRecord.d.ts.map +1 -0
  141. package/dist/utils/isRecord.js +4 -0
  142. package/dist/utils/isRecord.js.map +1 -0
  143. package/dist/utils/messageNormalization.d.ts +3 -0
  144. package/dist/utils/messageNormalization.d.ts.map +1 -0
  145. package/dist/utils/messageNormalization.js +121 -0
  146. package/dist/utils/messageNormalization.js.map +1 -0
  147. package/dist/utils/streamChunk.d.ts +5 -0
  148. package/dist/utils/streamChunk.d.ts.map +1 -0
  149. package/dist/utils/streamChunk.js +50 -0
  150. package/dist/utils/streamChunk.js.map +1 -0
  151. package/guides/EXAMPLE_VERIFICATION.md +53 -0
  152. package/guides/FLOWS.md +29 -0
  153. package/guides/GETTING_STARTED.md +14 -1
  154. package/guides/README.md +3 -1
  155. package/guides/RUNTIME.md +75 -0
  156. package/guides/TOOLS.md +6 -0
  157. package/package.json +2 -2
  158. package/dist/flows/AgentFlowManager.d.ts +0 -161
  159. package/dist/flows/AgentFlowManager.d.ts.map +0 -1
  160. package/dist/flows/AgentFlowManager.js +0 -448
  161. package/dist/flows/AgentFlowManager.js.map +0 -1
package/README.md CHANGED
@@ -20,9 +20,9 @@ This package is built on top of the Vercel AI SDK v6.
20
20
  This package exports:
21
21
  - **Agents:** `Agent`, `LLMAgent`, `FlowAgent`, `TriageAgent`, `CompositeAgent`
22
22
  - **Runtime:** `Runtime`, `createRuntime`
23
- - **Flows:** `FlowManager`, `FlowGraph`, `FlowNode`, `createFlowTransition`
24
- - **Session:** `SessionManager`, `SessionStore`, `MemoryStore`
25
- - **Tools:** `createTool`, `createToolWithFiller`, `createHandoffTool`
23
+ - **Flows:** `FlowManager`, `FlowGraph`, `FlowNode`, `createFlowTransition`, `validateFlowConfig`
24
+ - **Session:** `SessionManager`, `SessionStore`, `MemoryStore`, `RedisStore`
25
+ - **Tools:** `createTool`, `createToolWithFiller`, `createHandoffTool`, `createHttpTool`
26
26
  - **System Injections:** `InjectionQueue`, `commonInjections`
27
27
  - **Prompts:** `PromptTemplateBuilder`, `PromptBuilder`
28
28
  - **Hooks:** `HookRunner`, `loggingHooks`, `createMetricsHooks`
@@ -68,6 +68,55 @@ const run = async () => {
68
68
  run();
69
69
  ```
70
70
 
71
+ ## Stream Callback Defaults (Message-Oriented)
72
+
73
+ `streamCallback` is non-blocking and pluggable (file/http/db/custom sinks).
74
+ Current defaults are optimized for persistence pipelines:
75
+
76
+ - no implicit sink (if `sinks` is omitted, callback is a no-op)
77
+ - message mode by default (`input`, `done`, `error`, `tripwire`, tool events, and transition events)
78
+ - token deltas off by default
79
+ - final assistant text included as `fullText` on terminal events
80
+
81
+ ```ts
82
+ import { Runtime, createFileStreamSink } from '@ariaflowagents/core';
83
+
84
+ const runtime = new Runtime({
85
+ agents: [supportAgent],
86
+ defaultAgentId: 'support',
87
+ streamCallback: {
88
+ sinks: [createFileStreamSink({ directory: './transcripts' })],
89
+ // defaults shown explicitly:
90
+ eventMode: 'message',
91
+ emitToolEvents: true,
92
+ emitTransitionEvents: true,
93
+ emitTextDeltas: false,
94
+ emitFinalText: true,
95
+ },
96
+ });
97
+ ```
98
+
99
+ ## Runtime Durability Defaults
100
+
101
+ Runtime now applies lightweight durability hardening by default:
102
+
103
+ - session checkpoints are persisted on `tool-result`, `tool-error`, and `flow-transition`
104
+ - handoff state changes are checkpointed immediately after routing updates
105
+ - replay-friendly per-turn events are stored in `session.workingMemory.runtimeEventLog`
106
+ (`user`, `assistant_final`, `tool_call`, `tool_result`, `tool_error`, `transition`)
107
+
108
+ Tool execution context also includes `idempotencyKey` in `experimental_context`, which can be forwarded to external systems.
109
+
110
+ For high-volume token streaming, opt in:
111
+
112
+ ```ts
113
+ streamCallback: {
114
+ sinks: [createFileStreamSink({ directory: './transcripts' })],
115
+ eventMode: 'all',
116
+ emitTextDeltas: true,
117
+ }
118
+ ```
119
+
71
120
  ## Routing & Handoffs (Important Defaults)
72
121
 
73
122
  AriaFlow supports invisible multi-agent routing via a `handoff` tool.
@@ -198,15 +247,19 @@ The `Runtime` class orchestrates multiple agents with seamless handoffs:
198
247
  - **TriageAgent**: Routes requests to the appropriate specialist
199
248
  - **Agent Handoffs**: Transfer conversation context between agents
200
249
  - **Session Persistence**: Maintains conversation state
250
+ - **Flow Snapshot Memory**: Persists flow progress in `session.workingMemory.flowStateByAgent`
201
251
 
202
- ### AgentFlowManager (Single Flow)
252
+ ### FlowManager (Single Flow)
203
253
 
204
- The `AgentFlowManager` class manages structured, node-based conversations:
254
+ The `FlowManager` class manages structured, node-based conversations:
205
255
 
206
256
  - **Flow Nodes**: Each node has a specific purpose and tools
207
257
  - **State Transitions**: Tools drive transitions via `createFlowTransition()`
258
+ - **Declarative Edge Tools**: `FlowManager` auto-injects tools for `transitions[].on` edges
208
259
  - **Flow Hooks**: Observe lifecycle events (onFlowStart, onTransition, etc.)
209
260
  - **Context Strategies**: Control memory management (append, reset, summarize)
261
+ - **Prompt Composition**: Global role prompt + node prompt (per-node opt-out via `addGlobalPrompt: false`)
262
+ - **Transition Contracts**: `contract.toolOnly` and `contract.requiresUserTurn` are enforced at runtime
210
263
 
211
264
  ### Date Parsing Utilities
212
265
 
@@ -11,5 +11,6 @@ export declare abstract class Agent<TConfig extends AgentConfig = AgentConfig> {
11
11
  cleanup(_context: AgentContext): Promise<void>;
12
12
  get canHandoffTo(): string[];
13
13
  protected buildSystemPrompt(context: AgentContext): string;
14
+ protected getSystemPromptString(): string;
14
15
  }
15
16
  //# sourceMappingURL=Agent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Agent.d.ts","sourceRoot":"","sources":["../../src/agents/Agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpF,8BAAsB,KAAK,CAAC,OAAO,SAAS,WAAW,GAAG,WAAW;IACnE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC;gBAEd,MAAM,EAAE,OAAO;IAO3B,QAAQ,CAAC,OAAO,CACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,YAAY,GACpB,cAAc,CAAC,eAAe,CAAC;IAE5B,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAInE,UAAU,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD,OAAO,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpD,IAAI,YAAY,IAAI,MAAM,EAAE,CAE3B;IAED,SAAS,CAAC,iBAAiB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM;CAU3D"}
1
+ {"version":3,"file":"Agent.d.ts","sourceRoot":"","sources":["../../src/agents/Agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpF,8BAAsB,KAAK,CAAC,OAAO,SAAS,WAAW,GAAG,WAAW;IACnE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC;gBAEd,MAAM,EAAE,OAAO;IAO3B,QAAQ,CAAC,OAAO,CACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,YAAY,GACpB,cAAc,CAAC,eAAe,CAAC;IAE5B,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAInE,UAAU,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD,OAAO,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpD,IAAI,YAAY,IAAI,MAAM,EAAE,CAE3B;IAED,SAAS,CAAC,iBAAiB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM;IAW1D,SAAS,CAAC,qBAAqB,IAAI,MAAM;CAQ1C"}
@@ -1,3 +1,4 @@
1
+ import { PromptBuilder } from '../prompts/PromptBuilder.js';
1
2
  export class Agent {
2
3
  id;
3
4
  name;
@@ -22,12 +23,20 @@ export class Agent {
22
23
  return this.config.canHandoffTo ?? [];
23
24
  }
24
25
  buildSystemPrompt(context) {
25
- let prompt = this.config.systemPrompt;
26
+ let prompt = this.getSystemPromptString();
26
27
  const memory = context.workingMemory.toJSON();
27
28
  if (Object.keys(memory).length > 0) {
28
29
  prompt += `\n\n## Known Information\n${JSON.stringify(memory, null, 2)}`;
29
30
  }
30
31
  return prompt;
31
32
  }
33
+ getSystemPromptString() {
34
+ const sp = this.config.systemPrompt;
35
+ if (typeof sp === 'string') {
36
+ return sp;
37
+ }
38
+ // It's a PromptTemplate
39
+ return new PromptBuilder(sp).build();
40
+ }
32
41
  }
33
42
  //# sourceMappingURL=Agent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Agent.js","sourceRoot":"","sources":["../../src/agents/Agent.ts"],"names":[],"mappings":"AAEA,MAAM,OAAgB,KAAK;IAChB,EAAE,CAAS;IACX,IAAI,CAAS;IACb,WAAW,CAAU;IACpB,MAAM,CAAU;IAE1B,YAAY,MAAe;QACzB,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAOD,KAAK,CAAC,SAAS,CAAC,MAAc,EAAE,QAAsB;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAsB;QACrC,yBAAyB;IAC3B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,QAAsB;QAClC,yBAAyB;IAC3B,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;IACxC,CAAC;IAES,iBAAiB,CAAC,OAAqB;QAC/C,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;QAEtC,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;QAC9C,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,6BAA6B,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAC3E,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
1
+ {"version":3,"file":"Agent.js","sourceRoot":"","sources":["../../src/agents/Agent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,MAAM,OAAgB,KAAK;IAChB,EAAE,CAAS;IACX,IAAI,CAAS;IACb,WAAW,CAAU;IACpB,MAAM,CAAU;IAE1B,YAAY,MAAe;QACzB,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAOD,KAAK,CAAC,SAAS,CAAC,MAAc,EAAE,QAAsB;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAsB;QACrC,yBAAyB;IAC3B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,QAAsB;QAClC,yBAAyB;IAC3B,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;IACxC,CAAC;IAES,iBAAiB,CAAC,OAAqB;QAC/C,IAAI,MAAM,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAE1C,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;QAC9C,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,6BAA6B,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAC3E,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAES,qBAAqB;QAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;QACpC,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;YAC3B,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,wBAAwB;QACxB,OAAO,IAAI,aAAa,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IACvC,CAAC;CACF"}
@@ -1,24 +1,20 @@
1
- import type { AgentContext, AgentStreamPart } from '../types/index.js';
2
- import type { Agent } from './Agent.js';
3
- export interface CompositeAgentConfig {
4
- id: string;
5
- name: string;
6
- description?: string;
1
+ import type { AgentConfig, AgentContext, AgentStreamPart } from '../types/index.js';
2
+ import { Agent } from './Agent.js';
3
+ export interface CompositeAgentConfig extends AgentConfig {
4
+ type: 'composite';
7
5
  agents: Agent[];
8
6
  entryAgent: string;
9
7
  maxHandoffs?: number;
10
8
  }
11
- export declare class CompositeAgent {
12
- readonly id: string;
13
- readonly name: string;
14
- readonly description?: string;
9
+ export declare class CompositeAgent extends Agent<CompositeAgentConfig> {
15
10
  private agents;
16
11
  private entryAgentId;
17
12
  private maxHandoffs;
18
13
  constructor(config: CompositeAgentConfig);
14
+ initialize(context: AgentContext): Promise<void>;
15
+ cleanup(context: AgentContext): Promise<void>;
19
16
  process(input: string, context: AgentContext): AsyncGenerator<AgentStreamPart>;
20
17
  getAgent(id: string): Agent | undefined;
21
- get agentIds(): string[];
22
- get entryAgent(): string;
18
+ get subAgentIds(): string[];
23
19
  }
24
20
  //# sourceMappingURL=CompositeAgent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CompositeAgent.d.ts","sourceRoot":"","sources":["../../src/agents/CompositeAgent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,cAAc;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,oBAAoB;IAYjC,OAAO,CACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,YAAY,GACpB,cAAc,CAAC,eAAe,CAAC;IAwClC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAIvC,IAAI,QAAQ,IAAI,MAAM,EAAE,CAEvB;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;CACF"}
1
+ {"version":3,"file":"CompositeAgent.d.ts","sourceRoot":"","sources":["../../src/agents/CompositeAgent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpF,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,WAAW,oBAAqB,SAAQ,WAAW;IACvD,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,cAAe,SAAQ,KAAK,CAAC,oBAAoB,CAAC;IAC7D,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,oBAAoB;IAUlC,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhD,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5C,OAAO,CACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,YAAY,GACpB,cAAc,CAAC,eAAe,CAAC;IAmDlC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAIvC,IAAI,WAAW,IAAI,MAAM,EAAE,CAE1B;CACF"}
@@ -1,32 +1,41 @@
1
- export class CompositeAgent {
2
- id;
3
- name;
4
- description;
1
+ import { Agent } from './Agent.js';
2
+ export class CompositeAgent extends Agent {
5
3
  agents = new Map();
6
4
  entryAgentId;
7
5
  maxHandoffs;
8
6
  constructor(config) {
9
- this.id = config.id;
10
- this.name = config.name;
11
- this.description = config.description;
7
+ super(config);
12
8
  this.entryAgentId = config.entryAgent;
13
9
  this.maxHandoffs = config.maxHandoffs ?? 10;
14
10
  for (const agent of config.agents) {
15
11
  this.agents.set(agent.id, agent);
16
12
  }
17
13
  }
14
+ async initialize(context) {
15
+ await super.initialize(context);
16
+ for (const agent of this.agents.values()) {
17
+ await agent.initialize(context);
18
+ }
19
+ }
20
+ async cleanup(context) {
21
+ for (const agent of this.agents.values()) {
22
+ await agent.cleanup(context);
23
+ }
24
+ await super.cleanup(context);
25
+ }
18
26
  async *process(input, context) {
19
- let currentAgentId = context.currentAgent || this.entryAgentId;
27
+ let currentAgentId = context.session.activeAgentId || this.entryAgentId;
20
28
  let currentInput = input;
21
29
  let handoffCount = 0;
22
30
  while (handoffCount < this.maxHandoffs) {
23
31
  const agent = this.agents.get(currentAgentId);
24
32
  if (!agent) {
25
- yield { type: 'error', error: `Agent "${currentAgentId}" not found` };
33
+ yield { type: 'error', error: `Agent "${currentAgentId}" not found in composite agent "${this.id}"` };
26
34
  return;
27
35
  }
28
36
  let handoffTriggered = false;
29
37
  let nextAgentId;
38
+ // Delegate processing to the sub-agent
30
39
  for await (const part of agent.process(currentInput, context)) {
31
40
  yield part;
32
41
  if (part.type === 'handoff') {
@@ -34,26 +43,31 @@ export class CompositeAgent {
34
43
  nextAgentId = part.targetAgent;
35
44
  handoffCount += 1;
36
45
  }
46
+ if (part.type === 'turn-end' && part.metadata?.response) {
47
+ // In a composite agent, we might want to collect all messages
48
+ // but for now we just yield it up so the orchestrator can persist.
49
+ }
37
50
  }
38
51
  if (!handoffTriggered || !nextAgentId) {
39
52
  break;
40
53
  }
54
+ // If the target agent is not part of this composite, stop internal loop and let runtime handle it
55
+ if (!this.agents.has(nextAgentId)) {
56
+ break;
57
+ }
41
58
  currentAgentId = nextAgentId;
42
- context.currentAgent = nextAgentId;
43
- currentInput = '';
59
+ context.session.activeAgentId = nextAgentId;
60
+ currentInput = ''; // Clear input for the next agent in the sequence
44
61
  }
45
62
  if (handoffCount >= this.maxHandoffs) {
46
- yield { type: 'error', error: 'Maximum handoffs exceeded' };
63
+ yield { type: 'error', error: `Maximum internal handoffs (${this.maxHandoffs}) exceeded in composite agent "${this.id}"` };
47
64
  }
48
65
  }
49
66
  getAgent(id) {
50
67
  return this.agents.get(id);
51
68
  }
52
- get agentIds() {
69
+ get subAgentIds() {
53
70
  return Array.from(this.agents.keys());
54
71
  }
55
- get entryAgent() {
56
- return this.entryAgentId;
57
- }
58
72
  }
59
73
  //# sourceMappingURL=CompositeAgent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CompositeAgent.js","sourceRoot":"","sources":["../../src/agents/CompositeAgent.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,cAAc;IAChB,EAAE,CAAS;IACX,IAAI,CAAS;IACb,WAAW,CAAU;IACtB,MAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;IAClC,YAAY,CAAS;IACrB,WAAW,CAAS;IAE5B,YAAY,MAA4B;QACtC,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC;QACtC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;QAE5C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,CAAC,OAAO,CACZ,KAAa,EACb,OAAqB;QAErB,IAAI,cAAc,GAAG,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC;QAC/D,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,OAAO,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAE9C,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,cAAc,aAAa,EAAE,CAAC;gBACtE,OAAO;YACT,CAAC;YAED,IAAI,gBAAgB,GAAG,KAAK,CAAC;YAC7B,IAAI,WAA+B,CAAC;YAEpC,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC9D,MAAM,IAAI,CAAC;gBAEX,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC5B,gBAAgB,GAAG,IAAI,CAAC;oBACxB,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;oBAC/B,YAAY,IAAI,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;YAED,IAAI,CAAC,gBAAgB,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtC,MAAM;YACR,CAAC;YAED,cAAc,GAAG,WAAW,CAAC;YAC7B,OAAO,CAAC,YAAY,GAAG,WAAW,CAAC;YACnC,YAAY,GAAG,EAAE,CAAC;QACpB,CAAC;QAED,IAAI,YAAY,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,EAAU;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;CACF"}
1
+ {"version":3,"file":"CompositeAgent.js","sourceRoot":"","sources":["../../src/agents/CompositeAgent.ts"],"names":[],"mappings":"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"}
@@ -14,9 +14,9 @@ export class FlowAgent extends Agent {
14
14
  flow: this.config.flow,
15
15
  initialNode: this.config.initialNode,
16
16
  model: this.config.model,
17
- defaultRolePrompt: this.config.systemPrompt,
17
+ defaultRolePrompt: this.getSystemPromptString(),
18
18
  contextMessages: context.messages,
19
- sessionMessages: context.session.messages,
19
+ abortSignal: context.abortSignal,
20
20
  });
21
21
  for await (const part of this.flowManager.initialize()) {
22
22
  yield part;
@@ -1 +1 @@
1
- {"version":3,"file":"FlowAgent.js","sourceRoot":"","sources":["../../src/agents/FlowAgent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGtD,MAAM,OAAO,SAAU,SAAQ,KAAsB;IAC3C,WAAW,CAAe;IAElC,YAAY,MAAuB;QACjC,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,cAAc,MAAM,CAAC,EAAE,oBAAoB,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,CAAC,OAAO,CACZ,KAAa,EACb,OAAqB;QAErB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC;gBACjC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;gBACtB,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;gBACpC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAM;gBACzB,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;gBAC3C,eAAe,EAAE,OAAO,CAAC,QAAQ;gBACjC,eAAe,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ;aAC1C,CAAC,CAAC;YAEH,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC;gBACvD,MAAM,IAAI,CAAC;YACb,CAAC;QACH,CAAC;QAED,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,CAAC;YAEX,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC7B,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,WAAW,EAAE,aAAa,IAAI,EAAE,CAAC;IAC/C,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,IAAY;QAC7B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"FlowAgent.js","sourceRoot":"","sources":["../../src/agents/FlowAgent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGtD,MAAM,OAAO,SAAU,SAAQ,KAAsB;IAC3C,WAAW,CAAe;IAElC,YAAY,MAAuB;QACjC,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,cAAc,MAAM,CAAC,EAAE,oBAAoB,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,CAAC,OAAO,CACZ,KAAa,EACb,OAAqB;QAErB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC;gBACjC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;gBACtB,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;gBACpC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAM;gBACzB,iBAAiB,EAAE,IAAI,CAAC,qBAAqB,EAAE;gBAC/C,eAAe,EAAE,OAAO,CAAC,QAAQ;gBACjC,WAAW,EAAE,OAAO,CAAC,WAAW;aACjC,CAAC,CAAC;YAEH,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC;gBACvD,MAAM,IAAI,CAAC;YACb,CAAC;QACH,CAAC;QAED,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,CAAC;YAEX,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC7B,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,WAAW,EAAE,aAAa,IAAI,EAAE,CAAC;IAC/C,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,IAAY;QAC7B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"LLMAgent.d.ts","sourceRoot":"","sources":["../../src/agents/LLMAgent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,OAAO,EAAE,MAAM,IAAI,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGvF,qBAAa,QAAS,SAAQ,KAAK,CAAC,cAAc,CAAC;IACjD,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,KAAK,CAAU;gBAEX,MAAM,EAAE,cAAc;IAS3B,OAAO,CACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,YAAY,GACpB,cAAc,CAAC,eAAe,CAAC;IAyClC,SAAS,CAAC,kBAAkB,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO;CAG9D"}
1
+ {"version":3,"file":"LLMAgent.d.ts","sourceRoot":"","sources":["../../src/agents/LLMAgent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,OAAO,EAAE,MAAM,IAAI,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAIvF,qBAAa,QAAS,SAAQ,KAAK,CAAC,cAAc,CAAC;IACjD,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,KAAK,CAAU;gBAEX,MAAM,EAAE,cAAc;IAS3B,OAAO,CACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,YAAY,GACpB,cAAc,CAAC,eAAe,CAAC;IAgBlC,SAAS,CAAC,kBAAkB,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO;CAG9D"}
@@ -1,6 +1,6 @@
1
1
  import { streamText } from 'ai';
2
2
  import { Agent } from './Agent.js';
3
- import { isHandoffResult } from '../tools/handoff.js';
3
+ import { processAIStream } from '../utils/aiStream.js';
4
4
  export class LLMAgent extends Agent {
5
5
  model;
6
6
  tools;
@@ -19,31 +19,10 @@ export class LLMAgent extends Agent {
19
19
  system: systemPrompt,
20
20
  messages: context.messages,
21
21
  tools: this.getToolsForContext(context),
22
+ abortSignal: context.abortSignal,
22
23
  });
23
- for await (const chunk of result.fullStream) {
24
- if (chunk.type === 'text-delta') {
25
- yield { type: 'text-delta', text: chunk.text };
26
- }
27
- if (chunk.type === 'tool-call') {
28
- const args = 'args' in chunk ? chunk.args : chunk.input;
29
- yield { type: 'tool-call', toolName: chunk.toolName, args };
30
- }
31
- if (chunk.type === 'tool-result') {
32
- const toolResult = 'result' in chunk ? chunk.result : chunk.output;
33
- yield { type: 'tool-result', toolName: chunk.toolName, result: toolResult };
34
- if (isHandoffResult(toolResult)) {
35
- const targetAgent = toolResult.targetAgent ?? toolResult.targetAgentId;
36
- yield {
37
- type: 'handoff',
38
- targetAgent,
39
- reason: toolResult.reason,
40
- };
41
- }
42
- }
43
- }
44
- const response = await result.response;
45
- context.session.messages.push(...response.messages);
46
- yield { type: 'turn-end' };
24
+ yield* processAIStream(result.fullStream);
25
+ yield { type: 'turn-end', metadata: { response: await result.response } };
47
26
  }
48
27
  getToolsForContext(_context) {
49
28
  return this.tools;
@@ -1 +1 @@
1
- {"version":3,"file":"LLMAgent.js","sourceRoot":"","sources":["../../src/agents/LLMAgent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAoC,MAAM,IAAI,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,OAAO,QAAS,SAAQ,KAAqB;IACzC,KAAK,CAAgB;IACrB,KAAK,CAAU;IAEvB,YAAY,MAAsB;QAChC,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,aAAa,MAAM,CAAC,EAAE,oBAAoB,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,CAAC,OAAO,CACZ,MAAc,EACd,OAAqB;QAErB,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAErD,MAAM,MAAM,GAAG,UAAU,CAAC;YACxB,KAAK,EAAE,IAAI,CAAC,KAAY;YACxB,MAAM,EAAE,YAAY;YACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK,EAAE,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;SACxC,CAAC,CAAC;QAEH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YAC5C,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAChC,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;YACjD,CAAC;YAED,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC/B,MAAM,IAAI,GAAG,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAE,KAAa,CAAC,KAAK,CAAC;gBACjE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;YAC9D,CAAC;YAED,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBACjC,MAAM,UAAU,GAAG,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAE,KAAa,CAAC,MAAM,CAAC;gBAC5E,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;gBAE5E,IAAI,eAAe,CAAC,UAAU,CAAC,EAAE,CAAC;oBAChC,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,IAAI,UAAU,CAAC,aAAa,CAAC;oBACvE,MAAM;wBACJ,IAAI,EAAE,SAAS;wBACf,WAAW;wBACX,MAAM,EAAE,UAAU,CAAC,MAAM;qBAC1B,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;QACvC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEpD,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC7B,CAAC;IAES,kBAAkB,CAAC,QAAsB;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
1
+ {"version":3,"file":"LLMAgent.js","sourceRoot":"","sources":["../../src/agents/LLMAgent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAoC,MAAM,IAAI,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,OAAO,QAAS,SAAQ,KAAqB;IACzC,KAAK,CAAgB;IACrB,KAAK,CAAU;IAEvB,YAAY,MAAsB;QAChC,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,aAAa,MAAM,CAAC,EAAE,oBAAoB,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,CAAC,OAAO,CACZ,MAAc,EACd,OAAqB;QAErB,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAErD,MAAM,MAAM,GAAG,UAAU,CAAC;YACxB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,YAAY;YACpB,QAAQ,EAAE,OAAO,CAAC,QAAe;YACjC,KAAK,EAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAS;YAChD,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAC;QAEH,KAAK,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAE1C,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;IAC5E,CAAC;IAES,kBAAkB,CAAC,QAAsB;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"TriageAgent.d.ts","sourceRoot":"","sources":["../../src/agents/TriageAgent.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,EAAE,YAAY,EAAc,eAAe,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGtG,qBAAa,WAAY,SAAQ,KAAK,CAAC,iBAAiB,CAAC;IACvD,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,YAAY,CAAC,CAAS;gBAElB,MAAM,EAAE,iBAAiB;IAS9B,OAAO,CACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,YAAY,GACpB,cAAc,CAAC,eAAe,CAAC;IA6ClC,OAAO,CAAC,kBAAkB;IAsB1B,OAAO,CAAC,iBAAiB;CAmB1B"}
1
+ {"version":3,"file":"TriageAgent.d.ts","sourceRoot":"","sources":["../../src/agents/TriageAgent.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,EAAE,YAAY,EAAc,eAAe,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAKtG,qBAAa,WAAY,SAAQ,KAAK,CAAC,iBAAiB,CAAC;IACvD,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,YAAY,CAAC,CAAS;gBAElB,MAAM,EAAE,iBAAiB;IAS9B,OAAO,CACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,YAAY,GACpB,cAAc,CAAC,eAAe,CAAC;IAoBlC,OAAO,CAAC,kBAAkB;IAsB1B,OAAO,CAAC,iBAAiB;CAmB1B"}
@@ -1,7 +1,7 @@
1
1
  import { streamText, tool } from 'ai';
2
2
  import { z } from 'zod';
3
3
  import { Agent } from './Agent.js';
4
- import { isHandoffResult } from '../tools/handoff.js';
4
+ import { processAIStream } from '../utils/aiStream.js';
5
5
  export class TriageAgent extends Agent {
6
6
  routes;
7
7
  defaultAgent;
@@ -14,50 +14,29 @@ export class TriageAgent extends Agent {
14
14
  this.defaultAgent = config.defaultAgent;
15
15
  }
16
16
  async *process(_input, context) {
17
- const systemPrompt = this.buildRoutingPrompt();
17
+ const systemPrompt = this.buildRoutingPrompt(context);
18
18
  const handoffTool = this.createHandoffTool();
19
19
  const result = streamText({
20
20
  model: this.config.model,
21
21
  system: systemPrompt,
22
22
  messages: context.messages,
23
+ abortSignal: context.abortSignal,
23
24
  tools: {
24
25
  handoff_to_agent: handoffTool,
25
26
  ...this.config.tools,
26
27
  },
27
28
  });
28
- for await (const chunk of result.fullStream) {
29
- if (chunk.type === 'text-delta') {
30
- yield { type: 'text-delta', text: chunk.text };
31
- }
32
- if (chunk.type === 'tool-call') {
33
- const args = 'args' in chunk ? chunk.args : chunk.input;
34
- yield { type: 'tool-call', toolName: chunk.toolName, args };
35
- }
36
- if (chunk.type === 'tool-result') {
37
- const toolResult = 'result' in chunk ? chunk.result : chunk.output;
38
- yield { type: 'tool-result', toolName: chunk.toolName, result: toolResult };
39
- if (isHandoffResult(toolResult)) {
40
- const targetAgent = toolResult.targetAgent ?? toolResult.targetAgentId;
41
- yield {
42
- type: 'handoff',
43
- targetAgent,
44
- reason: toolResult.reason,
45
- };
46
- }
47
- }
48
- }
49
- const response = await result.response;
50
- context.session.messages.push(...response.messages);
51
- yield { type: 'turn-end' };
29
+ yield* processAIStream(result.fullStream);
30
+ yield { type: 'turn-end', metadata: { response: await result.response } };
52
31
  }
53
- buildRoutingPrompt() {
32
+ buildRoutingPrompt(context) {
54
33
  const routeDescriptions = this.routes
55
34
  .map(route => `- **${route.agentId}**: ${route.description}`)
56
35
  .join('\n');
57
36
  const defaultNote = this.defaultAgent
58
37
  ? `\n- Use "${this.defaultAgent}" when no specialist applies.`
59
38
  : '';
60
- return `${this.config.systemPrompt}
39
+ return `${this.buildSystemPrompt(context)}
61
40
 
62
41
  ## Available Specialists
63
42
  ${routeDescriptions}
@@ -65,7 +44,7 @@ ${routeDescriptions}
65
44
  ## Instructions
66
45
  - Follow the system prompt above.
67
46
  - Use the handoff_to_agent tool when a specialist is needed.
68
- - Provide a very brief, natural transition (e.g., "I'll check that for you...") instead of stating "I am handing you off".
47
+ - You MAY provide a very brief, natural transition (e.g., "I'll check that for you...") or remain silent. Do not state "I am handing you off".
69
48
  - Keep the transition content separate from the specialist's likely greeting.
70
49
  - Always provide a reason for the handoff via the tool${defaultNote}`;
71
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TriageAgent.js","sourceRoot":"","sources":["../../src/agents/TriageAgent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TriageAgent.js","sourceRoot":"","sources":["../../src/agents/TriageAgent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAInC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,OAAO,WAAY,SAAQ,KAAwB;IAC/C,MAAM,CAAe;IACrB,YAAY,CAAU;IAE9B,YAAY,MAAyB;QACnC,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,gBAAgB,MAAM,CAAC,EAAE,oBAAoB,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,CAAC,OAAO,CACZ,MAAc,EACd,OAAqB;QAErB,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE7C,MAAM,MAAM,GAAG,UAAU,CAAC;YACxB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAM;YACzB,MAAM,EAAE,YAAY;YACpB,QAAQ,EAAE,OAAO,CAAC,QAAe;YACjC,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,KAAK,EAAE;gBACL,gBAAgB,EAAE,WAAW;gBAC7B,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK;aACd;SACT,CAAC,CAAC;QAEH,KAAK,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAE1C,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;IAC5E,CAAC;IAEO,kBAAkB,CAAC,OAAqB;QAC9C,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM;aAClC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,KAAK,CAAC,OAAO,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;aAC5D,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY;YACnC,CAAC,CAAC,YAAY,IAAI,CAAC,YAAY,+BAA+B;YAC9D,CAAC,CAAC,EAAE,CAAC;QAEP,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;;;EAG3C,iBAAiB;;;;;;;wDAOqC,WAAW,EAAE,CAAC;IACpE,CAAC;IAEO,iBAAiB;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEzD,OAAO,IAAI,CAAC;YACV,WAAW,EAAE,wEAAwE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC1G,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;gBACpB,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,QAAiC,CAAC;gBACxD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;aAC9D,CAAC;YACF,OAAO,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE;gBAC3C,OAAO;oBACL,SAAS,EAAE,IAAI;oBACf,aAAa;oBACb,WAAW,EAAE,aAAa;oBAC1B,MAAM;iBACP,CAAC;YACJ,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -6,6 +6,7 @@ export interface HttpCallbackConfig {
6
6
  allowList?: string[];
7
7
  denyList?: string[];
8
8
  includeFullText?: boolean;
9
+ timeoutMs?: number;
9
10
  }
10
11
  export interface HttpCallbackPayload {
11
12
  sessionId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"httpCallback.d.ts","sourceRoot":"","sources":["../../src/callbacks/httpCallback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEvE,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAoCD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAqC9H;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAE5D"}
1
+ {"version":3,"file":"httpCallback.d.ts","sourceRoot":"","sources":["../../src/callbacks/httpCallback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEvE,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAkDD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAgD9H;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAE5D"}
@@ -14,31 +14,44 @@ function shouldSendEvent(eventType, config) {
14
14
  }
15
15
  return true;
16
16
  }
17
- async function sendHttpRequest(url, method, headers, payload) {
17
+ async function sendHttpRequest(url, method, headers, payload, timeoutMs) {
18
+ const controller = new AbortController();
19
+ const timeout = setTimeout(() => controller.abort('HTTP callback timeout'), timeoutMs);
18
20
  try {
19
- await fetch(url, {
21
+ const response = await fetch(url, {
20
22
  method,
21
23
  headers: {
22
24
  'Content-Type': 'application/json',
23
25
  ...headers,
24
26
  },
25
27
  body: JSON.stringify(payload),
28
+ signal: controller.signal,
26
29
  });
30
+ if (!response.ok) {
31
+ console.error(`[HttpCallback] Webhook returned ${response.status}`);
32
+ }
27
33
  }
28
34
  catch (error) {
29
35
  console.error(`[HttpCallback] Failed to send webhook: ${error.message}`);
30
36
  }
37
+ finally {
38
+ clearTimeout(timeout);
39
+ }
31
40
  }
32
41
  export function createHttpCallback(config) {
33
42
  const resolvedHeaders = config.headers
34
43
  ? Object.fromEntries(Object.entries(config.headers).map(([key, value]) => [key, resolveEnvVars(value)]))
35
44
  : undefined;
36
45
  return async (context, part) => {
46
+ const isTerminal = part.type === 'turn-end' || part.type === 'error' || part.type === 'done';
37
47
  if (part.type === 'text-delta') {
38
48
  const currentText = TEXT_ACCUMULATOR.get(context.session.id) || '';
39
49
  TEXT_ACCUMULATOR.set(context.session.id, currentText + part.text);
40
50
  }
41
51
  if (!shouldSendEvent(part.type, config)) {
52
+ if (isTerminal) {
53
+ TEXT_ACCUMULATOR.delete(context.session.id);
54
+ }
42
55
  return;
43
56
  }
44
57
  const payload = {
@@ -53,10 +66,11 @@ export function createHttpCallback(config) {
53
66
  payload.fullText = fullText;
54
67
  }
55
68
  }
56
- if (part.type === 'turn-end' || part.type === 'error' || part.type === 'done') {
57
- TEXT_ACCUMULATOR.delete(context.session.id);
58
- }
59
- sendHttpRequest(resolveEnvVars(config.url), config.method || 'POST', resolvedHeaders, payload);
69
+ void sendHttpRequest(resolveEnvVars(config.url), config.method || 'POST', resolvedHeaders, payload, config.timeoutMs ?? 5000).finally(() => {
70
+ if (isTerminal) {
71
+ TEXT_ACCUMULATOR.delete(context.session.id);
72
+ }
73
+ });
60
74
  };
61
75
  }
62
76
  export function clearTextAccumulator(sessionId) {
@@ -1 +1 @@
1
- {"version":3,"file":"httpCallback.js","sourceRoot":"","sources":["../../src/callbacks/httpCallback.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"httpCallback.js","sourceRoot":"","sources":["../../src/callbacks/httpCallback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { HarnessStreamPart, RunContext, StreamCallbackConfig, StreamCallbackPayload, StreamCallbackSink } from '../types/index.js';
2
+ export interface StreamCallbackAdapter {
3
+ onStreamPart: (context: RunContext, part: HarnessStreamPart) => Promise<void>;
4
+ flush: (timeoutMs?: number) => Promise<void>;
5
+ close: (timeoutMs?: number) => Promise<void>;
6
+ }
7
+ export declare function createConsoleStreamSink(options?: {
8
+ logger?: Pick<Console, 'log'>;
9
+ prefix?: string;
10
+ }): StreamCallbackSink;
11
+ export declare function createFileStreamSink(config: {
12
+ path?: string;
13
+ directory?: string;
14
+ filename?: string | ((payload: StreamCallbackPayload) => string);
15
+ mkdirp?: boolean;
16
+ format?: 'jsonl' | 'text';
17
+ }): StreamCallbackSink;
18
+ export declare function createFunctionStreamSink(handler: (payload: StreamCallbackPayload) => Promise<void> | void, name?: string): StreamCallbackSink;
19
+ export declare function createHttpStreamSink(config: {
20
+ url: string;
21
+ method?: 'POST' | 'PUT';
22
+ headers?: Record<string, string>;
23
+ timeoutMs?: number;
24
+ }): StreamCallbackSink;
25
+ export declare function createStreamCallbackAdapter(config?: StreamCallbackConfig): StreamCallbackAdapter;
26
+ //# sourceMappingURL=streamCallback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamCallback.d.ts","sourceRoot":"","sources":["../../src/callbacks/streamCallback.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AA8HxI,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C;AAED,wBAAgB,uBAAuB,CAAC,OAAO,GAAE;IAC/C,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;CACZ,GAAG,kBAAkB,CAU1B;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,qBAAqB,KAAK,MAAM,CAAC,CAAC;IACjE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC3B,GAAG,kBAAkB,CA8CrB;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,EACjE,IAAI,GAAE,MAAmB,GACxB,kBAAkB,CAOpB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,kBAAkB,CAoCrB;AAED,wBAAgB,2BAA2B,CAAC,MAAM,GAAE,oBAAyB,GAAG,qBAAqB,CAsFpG"}