@ariaflowagents/core 0.8.1 → 0.9.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 (142) hide show
  1. package/dist/capabilities/AutoRetrieveCapability.d.ts +30 -0
  2. package/dist/capabilities/AutoRetrieveCapability.d.ts.map +1 -0
  3. package/dist/capabilities/AutoRetrieveCapability.js +36 -0
  4. package/dist/capabilities/AutoRetrieveCapability.js.map +1 -0
  5. package/dist/capabilities/ExtractionCapability.d.ts +25 -0
  6. package/dist/capabilities/ExtractionCapability.d.ts.map +1 -0
  7. package/dist/capabilities/ExtractionCapability.js +74 -0
  8. package/dist/capabilities/ExtractionCapability.js.map +1 -0
  9. package/dist/capabilities/FlowCapability.d.ts +81 -0
  10. package/dist/capabilities/FlowCapability.d.ts.map +1 -0
  11. package/dist/capabilities/FlowCapability.js +482 -0
  12. package/dist/capabilities/FlowCapability.js.map +1 -0
  13. package/dist/capabilities/GuardrailCapability.d.ts +30 -0
  14. package/dist/capabilities/GuardrailCapability.d.ts.map +1 -0
  15. package/dist/capabilities/GuardrailCapability.js +38 -0
  16. package/dist/capabilities/GuardrailCapability.js.map +1 -0
  17. package/dist/capabilities/HandoffCapability.d.ts +19 -0
  18. package/dist/capabilities/HandoffCapability.d.ts.map +1 -0
  19. package/dist/capabilities/HandoffCapability.js +58 -0
  20. package/dist/capabilities/HandoffCapability.js.map +1 -0
  21. package/dist/capabilities/LivePromptAssembler.d.ts +108 -0
  22. package/dist/capabilities/LivePromptAssembler.d.ts.map +1 -0
  23. package/dist/capabilities/LivePromptAssembler.js +157 -0
  24. package/dist/capabilities/LivePromptAssembler.js.map +1 -0
  25. package/dist/capabilities/TriageCapability.d.ts +16 -0
  26. package/dist/capabilities/TriageCapability.d.ts.map +1 -0
  27. package/dist/capabilities/TriageCapability.js +61 -0
  28. package/dist/capabilities/TriageCapability.js.map +1 -0
  29. package/dist/capabilities/adapters/ai-sdk.d.ts +14 -0
  30. package/dist/capabilities/adapters/ai-sdk.d.ts.map +1 -0
  31. package/dist/capabilities/adapters/ai-sdk.js +29 -0
  32. package/dist/capabilities/adapters/ai-sdk.js.map +1 -0
  33. package/dist/capabilities/adapters/gemini.d.ts +15 -0
  34. package/dist/capabilities/adapters/gemini.d.ts.map +1 -0
  35. package/dist/capabilities/adapters/gemini.js +40 -0
  36. package/dist/capabilities/adapters/gemini.js.map +1 -0
  37. package/dist/capabilities/index.d.ts +154 -0
  38. package/dist/capabilities/index.d.ts.map +1 -0
  39. package/dist/capabilities/index.js +128 -0
  40. package/dist/capabilities/index.js.map +1 -0
  41. package/dist/eval/EvalRunner.d.ts +12 -0
  42. package/dist/eval/EvalRunner.d.ts.map +1 -0
  43. package/dist/eval/EvalRunner.js +64 -0
  44. package/dist/eval/EvalRunner.js.map +1 -0
  45. package/dist/eval/scoring.d.ts +15 -0
  46. package/dist/eval/scoring.d.ts.map +1 -0
  47. package/dist/eval/scoring.js +152 -0
  48. package/dist/eval/scoring.js.map +1 -0
  49. package/dist/eval/types.d.ts +59 -0
  50. package/dist/eval/types.d.ts.map +1 -0
  51. package/dist/eval/types.js +2 -0
  52. package/dist/eval/types.js.map +1 -0
  53. package/dist/flows/FlowGraph.d.ts +3 -1
  54. package/dist/flows/FlowGraph.d.ts.map +1 -1
  55. package/dist/flows/FlowGraph.js +5 -0
  56. package/dist/flows/FlowGraph.js.map +1 -1
  57. package/dist/flows/FlowManager.d.ts +60 -1
  58. package/dist/flows/FlowManager.d.ts.map +1 -1
  59. package/dist/flows/FlowManager.js +467 -34
  60. package/dist/flows/FlowManager.js.map +1 -1
  61. package/dist/flows/extraction.d.ts +16 -1
  62. package/dist/flows/extraction.d.ts.map +1 -1
  63. package/dist/flows/extraction.js +34 -0
  64. package/dist/flows/extraction.js.map +1 -1
  65. package/dist/flows/index.d.ts +2 -0
  66. package/dist/flows/index.d.ts.map +1 -1
  67. package/dist/flows/index.js +1 -0
  68. package/dist/flows/index.js.map +1 -1
  69. package/dist/flows/validation.d.ts +1 -1
  70. package/dist/flows/validation.d.ts.map +1 -1
  71. package/dist/flows/validation.js +13 -1
  72. package/dist/flows/validation.js.map +1 -1
  73. package/dist/hooks/HookRunner.d.ts +3 -1
  74. package/dist/hooks/HookRunner.d.ts.map +1 -1
  75. package/dist/hooks/HookRunner.js +3 -0
  76. package/dist/hooks/HookRunner.js.map +1 -1
  77. package/dist/hooks/builtin/metrics.d.ts.map +1 -1
  78. package/dist/hooks/builtin/metrics.js +12 -0
  79. package/dist/hooks/builtin/metrics.js.map +1 -1
  80. package/dist/hooks/builtin/observability.d.ts +21 -0
  81. package/dist/hooks/builtin/observability.d.ts.map +1 -0
  82. package/dist/hooks/builtin/observability.js +535 -0
  83. package/dist/hooks/builtin/observability.js.map +1 -0
  84. package/dist/index.d.ts +11 -1
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js +7 -1
  87. package/dist/index.js.map +1 -1
  88. package/dist/orchestration/DefaultOrchestrationAuthority.d.ts +91 -0
  89. package/dist/orchestration/DefaultOrchestrationAuthority.d.ts.map +1 -0
  90. package/dist/orchestration/DefaultOrchestrationAuthority.js +786 -0
  91. package/dist/orchestration/DefaultOrchestrationAuthority.js.map +1 -0
  92. package/dist/orchestration/OrchestrationAuthority.d.ts +119 -0
  93. package/dist/orchestration/OrchestrationAuthority.d.ts.map +1 -0
  94. package/dist/orchestration/OrchestrationAuthority.js +2 -0
  95. package/dist/orchestration/OrchestrationAuthority.js.map +1 -0
  96. package/dist/orchestration/RealtimeExtractionRunner.d.ts +25 -0
  97. package/dist/orchestration/RealtimeExtractionRunner.d.ts.map +1 -0
  98. package/dist/orchestration/RealtimeExtractionRunner.js +62 -0
  99. package/dist/orchestration/RealtimeExtractionRunner.js.map +1 -0
  100. package/dist/orchestration/index.d.ts +5 -0
  101. package/dist/orchestration/index.d.ts.map +1 -0
  102. package/dist/orchestration/index.js +4 -0
  103. package/dist/orchestration/index.js.map +1 -0
  104. package/dist/orchestration/types.d.ts +134 -0
  105. package/dist/orchestration/types.d.ts.map +1 -0
  106. package/dist/orchestration/types.js +2 -0
  107. package/dist/orchestration/types.js.map +1 -0
  108. package/dist/realtime/RealtimeAudioClient.d.ts +105 -0
  109. package/dist/realtime/RealtimeAudioClient.d.ts.map +1 -0
  110. package/dist/realtime/RealtimeAudioClient.js +15 -0
  111. package/dist/realtime/RealtimeAudioClient.js.map +1 -0
  112. package/dist/realtime/RealtimeRuntime.d.ts +136 -0
  113. package/dist/realtime/RealtimeRuntime.d.ts.map +1 -0
  114. package/dist/realtime/RealtimeRuntime.js +270 -0
  115. package/dist/realtime/RealtimeRuntime.js.map +1 -0
  116. package/dist/realtime/index.d.ts +4 -0
  117. package/dist/realtime/index.d.ts.map +1 -0
  118. package/dist/realtime/index.js +2 -0
  119. package/dist/realtime/index.js.map +1 -0
  120. package/dist/runtime/ExtractionEngine.d.ts +2 -1
  121. package/dist/runtime/ExtractionEngine.d.ts.map +1 -1
  122. package/dist/runtime/ExtractionEngine.js +11 -0
  123. package/dist/runtime/ExtractionEngine.js.map +1 -1
  124. package/dist/runtime/FlowExecutor.d.ts +7 -5
  125. package/dist/runtime/FlowExecutor.d.ts.map +1 -1
  126. package/dist/runtime/FlowExecutor.js +71 -12
  127. package/dist/runtime/FlowExecutor.js.map +1 -1
  128. package/dist/runtime/Runtime.d.ts +22 -0
  129. package/dist/runtime/Runtime.d.ts.map +1 -1
  130. package/dist/runtime/Runtime.js +47 -0
  131. package/dist/runtime/Runtime.js.map +1 -1
  132. package/dist/runtime/pipeline/AgentExecuteStage.d.ts.map +1 -1
  133. package/dist/runtime/pipeline/AgentExecuteStage.js +94 -25
  134. package/dist/runtime/pipeline/AgentExecuteStage.js.map +1 -1
  135. package/dist/runtime/pipeline/ContextAssembleStage.js +1 -1
  136. package/dist/types/index.d.ts +61 -3
  137. package/dist/types/index.d.ts.map +1 -1
  138. package/dist/types/index.js +4 -0
  139. package/dist/types/index.js.map +1 -1
  140. package/dist/types/telemetry.d.ts +107 -0
  141. package/dist/types/telemetry.d.ts.map +1 -1
  142. package/package.json +15 -2
@@ -0,0 +1,482 @@
1
+ import { z } from 'zod';
2
+ import { isExtractionNode } from '../types/index.js';
3
+ import { createFlowTransition, isFlowTransition } from '../flows/transitions.js';
4
+ import { isHandoffResult } from '../tools/handoff.js';
5
+ import { isFinalResult } from '../tools/final.js';
6
+ import { mergeExtractionData, computeMissingFields, toExtractionSubmissionSchema } from '../flows/extraction.js';
7
+ import { validateFlowConfig } from '../flows/validation.js';
8
+ import { renderNodePrompt } from '../flows/template.js';
9
+ // ─── Constants ───────────────────────────────────────────────────────────────
10
+ const DEFAULT_MAX_OSCILLATIONS = 2;
11
+ const transitionToolInputSchema = z.object({
12
+ data: z.record(z.unknown()).optional().describe('Optional data to pass to the next node'),
13
+ message: z.string().optional().describe('Optional message explaining the transition'),
14
+ });
15
+ // ─── FlowCapability ──────────────────────────────────────────────────────────
16
+ /**
17
+ * Headless flow state machine that exposes flow behavior as tools.
18
+ *
19
+ * Owns: node graph, transitions, current node, collectedData,
20
+ * oscillation tracking, extraction node handling, contract validation.
21
+ *
22
+ * Does NOT own: LLM calls, streaming, AI SDK imports. The host
23
+ * (Gemini Live, AI SDK, LiveKit) handles inference.
24
+ */
25
+ export class FlowCapability {
26
+ nodes = new Map();
27
+ transitions = new Map();
28
+ context;
29
+ currentNodeConfig = null;
30
+ initialized = false;
31
+ flowEnded = false;
32
+ _justTransitioned = null;
33
+ maxOscillations;
34
+ defaultRolePrompt;
35
+ /** Tracks transition edges within a single process() call for oscillation detection. */
36
+ turnTransitionCounts = new Map();
37
+ /** Events emitted during transitions (node-enter, node-exit, flow-transition, etc.). */
38
+ pendingEvents = [];
39
+ constructor(config) {
40
+ validateFlowConfig(config.flow, config.initialNode);
41
+ this.maxOscillations = config.flow.maxOscillations ?? DEFAULT_MAX_OSCILLATIONS;
42
+ this.defaultRolePrompt = config.defaultRolePrompt ?? config.flow.defaultRolePrompt;
43
+ for (const node of config.flow.nodes) {
44
+ this.nodes.set(node.id, node);
45
+ }
46
+ for (const transition of config.flow.transitions ?? []) {
47
+ const existing = this.transitions.get(transition.from) ?? [];
48
+ existing.push(transition);
49
+ this.transitions.set(transition.from, existing);
50
+ }
51
+ if (config.state) {
52
+ this.context = config.state.context;
53
+ this.initialized = config.state.initialized;
54
+ this.flowEnded = config.state.flowEnded;
55
+ if (this.initialized) {
56
+ this.currentNodeConfig = this.nodes.get(this.context.currentNode) ?? null;
57
+ }
58
+ }
59
+ else {
60
+ this.context = {
61
+ currentNode: config.initialNode,
62
+ collectedData: {},
63
+ nodeHistory: [],
64
+ nodeTurnCounts: {},
65
+ messages: [],
66
+ };
67
+ }
68
+ }
69
+ // ─── Capability Interface ────────────────────────────────────────────────
70
+ getTools() {
71
+ if (!this.currentNodeConfig || this.flowEnded)
72
+ return [];
73
+ const tools = [];
74
+ // 1. Implicit transition tools from outbound edges
75
+ const nodeTransitions = this.transitions.get(this.currentNodeConfig.id) ?? [];
76
+ const seenNames = new Set();
77
+ for (const t of nodeTransitions) {
78
+ const eventName = typeof t.on === 'string' ? t.on.trim() : '';
79
+ if (!eventName || seenNames.has(eventName))
80
+ continue;
81
+ seenNames.add(eventName);
82
+ const descParts = [
83
+ `Transition from "${this.currentNodeConfig.id}" to "${t.to}".`,
84
+ t.contract?.label ? `Label: ${t.contract.label}.` : '',
85
+ t.contract?.conditionText ? `Condition: ${t.contract.conditionText}.` : '',
86
+ 'Call only when transition criteria are satisfied.',
87
+ ].filter(Boolean);
88
+ const targetNode = t.to;
89
+ tools.push({
90
+ name: eventName,
91
+ description: descParts.join(' '),
92
+ parameters: transitionToolInputSchema,
93
+ execute: async (args) => createFlowTransition(targetNode, args.data, args.message),
94
+ });
95
+ }
96
+ // 2. Extraction tool (if current node is extraction type)
97
+ if (isExtractionNode(this.currentNodeConfig)) {
98
+ const node = this.currentNodeConfig;
99
+ const missing = this.getMissingExtractionFields(node);
100
+ tools.push({
101
+ name: `submit_${node.id}_data`,
102
+ description: [
103
+ `Submit collected information for "${node.name ?? node.id}".`,
104
+ `Extract these fields from the conversation.`,
105
+ missing.length > 0 ? `Still needed: ${missing.join(', ')}.` : 'All fields collected.',
106
+ 'Only submit values explicitly provided by the user.',
107
+ 'Omit fields or use null when the value is still unknown.',
108
+ 'Call this tool every time you learn new field values.',
109
+ 'After submitting: acknowledge what was received in a brief spoken sentence, then ask for only the next missing field.',
110
+ ].join(' '),
111
+ parameters: toExtractionSubmissionSchema(node.extractionSchema),
112
+ execute: async (args) => args, // pass through — processToolResult handles merging
113
+ });
114
+ }
115
+ // 3. Explicit node tools
116
+ const nodeTools = typeof this.currentNodeConfig.tools === 'function'
117
+ ? this.currentNodeConfig.tools(this.context)
118
+ : this.currentNodeConfig.tools;
119
+ if (nodeTools) {
120
+ const hints = this.currentNodeConfig.toolHints;
121
+ for (const [name, toolDef] of Object.entries(nodeTools)) {
122
+ if (seenNames.has(name))
123
+ continue; // explicit tools don't override implicit
124
+ const baseDesc = toolDef.description ?? '';
125
+ const hint = hints?.[name];
126
+ const enhancedDesc = hint
127
+ ? [
128
+ baseDesc,
129
+ hint.invocationCondition ? `INVOCATION: ${hint.invocationCondition}` : '',
130
+ hint.afterResult ? `AFTER RESULT: ${hint.afterResult}` : '',
131
+ ].filter(Boolean).join(' ')
132
+ : baseDesc;
133
+ tools.push({
134
+ name,
135
+ description: enhancedDesc,
136
+ parameters: toolDef.parameters ?? toolDef.inputSchema ?? z.object({}),
137
+ execute: toolDef.execute,
138
+ });
139
+ }
140
+ }
141
+ return tools;
142
+ }
143
+ getPromptSections() {
144
+ const sections = [];
145
+ if (!this.currentNodeConfig)
146
+ return sections;
147
+ // Role prompt (cacheable base)
148
+ if (this.defaultRolePrompt) {
149
+ sections.push({ role: 'role', content: this.defaultRolePrompt });
150
+ }
151
+ // Node task prompt
152
+ const renderedPrompt = renderNodePrompt(this.currentNodeConfig.prompt, this.context);
153
+ sections.push({ role: 'task', content: renderedPrompt });
154
+ // Collected data state (filtered by relevantFields if specified)
155
+ const relevantData = this.getRelevantCollectedData();
156
+ if (Object.keys(relevantData).length > 0) {
157
+ sections.push({
158
+ role: 'state',
159
+ content: `Information collected so far:\n${JSON.stringify(relevantData, null, 2)}`,
160
+ });
161
+ }
162
+ // Missing fields for extraction nodes
163
+ if (isExtractionNode(this.currentNodeConfig)) {
164
+ const missing = this.getMissingExtractionFields(this.currentNodeConfig);
165
+ if (missing.length > 0) {
166
+ const relevantData = this.getRelevantCollectedData();
167
+ sections.push({
168
+ role: 'extraction',
169
+ content: [
170
+ '## Data Collection Status',
171
+ `Collected so far: ${JSON.stringify(relevantData)}`,
172
+ `Still required: ${missing.join(', ')}`,
173
+ '',
174
+ 'Rules:',
175
+ '- Acknowledge what was just provided before asking for more.',
176
+ '- Ask for ONLY the next missing field. Do not list all missing fields at once.',
177
+ '- When all required fields are collected, the system will advance automatically.',
178
+ ].join('\n'),
179
+ });
180
+ }
181
+ }
182
+ // Post-transition context (one-shot: consumed after first prompt assembly)
183
+ if (this._justTransitioned) {
184
+ const { from, to } = this._justTransitioned;
185
+ const dataCtx = Object.keys(this.context.collectedData).length > 0
186
+ ? `\nCollected data: ${JSON.stringify(this.context.collectedData)}`
187
+ : '';
188
+ sections.push({
189
+ role: 'state',
190
+ content: [
191
+ '## Just Transitioned',
192
+ `You just moved from "${from}" to "${to}".`,
193
+ 'Continue the new task now. Use available tools immediately if the task requires it and all inputs are available.',
194
+ dataCtx,
195
+ ].filter(Boolean).join('\n'),
196
+ });
197
+ this._justTransitioned = null;
198
+ }
199
+ // Node history context
200
+ if (this.context.nodeHistory.length > 1) {
201
+ const recent = this.context.nodeHistory.slice(-5);
202
+ sections.push({
203
+ role: 'state',
204
+ content: `Conversation flow so far: ${recent.join(' → ')}`,
205
+ });
206
+ }
207
+ return sections;
208
+ }
209
+ processToolResult(toolName, args, result) {
210
+ // 1. Check: is this a flow transition?
211
+ if (isFlowTransition(result)) {
212
+ const fromNode = this.currentNodeConfig?.id ?? '';
213
+ const outcome = this.executeTransition(result.targetNode, result.data);
214
+ if (outcome.error) {
215
+ // Oscillation or validation blocked — don't transition, treat as regular tool
216
+ return { type: 'continue' };
217
+ }
218
+ return {
219
+ type: 'reconfigure',
220
+ transition: { from: fromNode, to: result.targetNode },
221
+ };
222
+ }
223
+ // 2. Check: is this an extraction submission?
224
+ // Guard with isExtractionNode to avoid false-positives on regular tools
225
+ // whose names happen to match the submit_*_data pattern.
226
+ if (toolName.startsWith('submit_') &&
227
+ toolName.endsWith('_data') &&
228
+ this.currentNodeConfig &&
229
+ isExtractionNode(this.currentNodeConfig)) {
230
+ const extrNode = this.currentNodeConfig;
231
+ const argsRecord = args && typeof args === 'object' && !Array.isArray(args)
232
+ ? args
233
+ : {};
234
+ this.mergeExtractedData(argsRecord);
235
+ const completion = this.checkExtractionComplete();
236
+ if (completion.complete && completion.nextNode) {
237
+ const fromNode = this.currentNodeConfig?.id ?? '';
238
+ const outcome = this.executeTransition(completion.nextNode, this.context.collectedData);
239
+ if (!outcome.error) {
240
+ return {
241
+ type: 'reconfigure',
242
+ transition: { from: fromNode, to: completion.nextNode, triggerTool: toolName },
243
+ };
244
+ }
245
+ }
246
+ if (completion.complete) {
247
+ return { type: 'extraction-complete', data: this.context.collectedData };
248
+ }
249
+ const override = this.buildExtractionContinueEnvelope(extrNode, argsRecord);
250
+ return { type: 'continue', toolResponseOverride: override };
251
+ }
252
+ // 3. Check: is this a handoff?
253
+ if (isHandoffResult(result)) {
254
+ this.flowEnded = true;
255
+ const target = result.targetAgentId ?? result.targetAgent;
256
+ return { type: 'handoff', targetAgent: target, reason: result.reason };
257
+ }
258
+ // 4. Check: is this a final result (flow end)?
259
+ if (isFinalResult(result)) {
260
+ this.flowEnded = true;
261
+ return { type: 'end', reason: result.reason };
262
+ }
263
+ // Not ours
264
+ return null;
265
+ }
266
+ // ─── Public Flow API ─────────────────────────────────────────────────────
267
+ /** Initialize the flow (transition to initial node). */
268
+ initialize() {
269
+ if (this.initialized)
270
+ return [];
271
+ this.pendingEvents = [];
272
+ this.executeTransition(this.context.currentNode);
273
+ this.initialized = true;
274
+ return this.drainEvents();
275
+ }
276
+ /** Call at the start of each user turn to reset oscillation tracking. */
277
+ resetTurnTracking() {
278
+ this.turnTransitionCounts.clear();
279
+ }
280
+ /** Record a user message in the flow context. */
281
+ appendUserMessage(content) {
282
+ this.context.messages.push({ role: 'user', content });
283
+ if (this.currentNodeConfig) {
284
+ const nodeId = this.currentNodeConfig.id;
285
+ this.context.nodeTurnCounts[nodeId] = (this.context.nodeTurnCounts[nodeId] ?? 0) + 1;
286
+ }
287
+ }
288
+ /** Record an assistant message in the flow context. */
289
+ appendAssistantMessage(content) {
290
+ this.context.messages.push({ role: 'assistant', content });
291
+ }
292
+ get currentNode() {
293
+ return this.currentNodeConfig?.id;
294
+ }
295
+ currentNodeIsExtractionNode() {
296
+ return !!this.currentNodeConfig && isExtractionNode(this.currentNodeConfig);
297
+ }
298
+ currentExtractionNode() {
299
+ if (!this.currentNodeConfig || !isExtractionNode(this.currentNodeConfig)) {
300
+ return null;
301
+ }
302
+ return this.currentNodeConfig;
303
+ }
304
+ get collectedData() {
305
+ return this.context.collectedData;
306
+ }
307
+ updateCollectedData(verified) {
308
+ const before = JSON.stringify(this.context.collectedData);
309
+ this.context.collectedData = mergeExtractionData(this.context.collectedData, verified);
310
+ return JSON.stringify(this.context.collectedData) !== before;
311
+ }
312
+ get hasEnded() {
313
+ return this.flowEnded;
314
+ }
315
+ get isInitialized() {
316
+ return this.initialized;
317
+ }
318
+ getState() {
319
+ return {
320
+ context: this.context,
321
+ initialized: this.initialized,
322
+ flowEnded: this.flowEnded,
323
+ };
324
+ }
325
+ /** Drain accumulated flow events (node-enter, node-exit, etc.). */
326
+ drainEvents() {
327
+ const events = [...this.pendingEvents];
328
+ this.pendingEvents = [];
329
+ return events;
330
+ }
331
+ // ─── Private: Transition ─────────────────────────────────────────────────
332
+ executeTransition(nodeId, data) {
333
+ const previousNode = this.currentNodeConfig;
334
+ // Oscillation detection
335
+ if (previousNode) {
336
+ const edgeKey = `${previousNode.id}->${nodeId}`;
337
+ const count = (this.turnTransitionCounts.get(edgeKey) ?? 0) + 1;
338
+ this.turnTransitionCounts.set(edgeKey, count);
339
+ if (count > this.maxOscillations) {
340
+ return { error: `Oscillation detected on ${edgeKey} (${count} times)` };
341
+ }
342
+ }
343
+ // Output contract validation
344
+ if (previousNode?.outputSchema) {
345
+ const valid = previousNode.outputSchema.safeParse(this.context.collectedData);
346
+ if (!valid.success) {
347
+ return { error: `Output contract violation on "${previousNode.id}": ${valid.error.message}` };
348
+ }
349
+ }
350
+ // Emit node-exit
351
+ if (previousNode) {
352
+ this.pendingEvents.push({ type: 'node-exit', nodeName: previousNode.name ?? previousNode.id });
353
+ }
354
+ // Look up target node
355
+ const nextNode = this.nodes.get(nodeId);
356
+ if (!nextNode) {
357
+ return { error: `Node "${nodeId}" not found` };
358
+ }
359
+ // Update state
360
+ this.currentNodeConfig = nextNode;
361
+ this.context.currentNode = nodeId;
362
+ this.context.nodeHistory.push(nodeId);
363
+ if (data) {
364
+ Object.assign(this.context.collectedData, data);
365
+ }
366
+ // Context strategy
367
+ this.applyContextStrategy(nextNode);
368
+ // Input contract validation
369
+ if (nextNode.inputSchema) {
370
+ const valid = nextNode.inputSchema.safeParse(this.context.collectedData);
371
+ if (!valid.success) {
372
+ return { error: `Input contract violation on "${nextNode.id}": ${valid.error.message}` };
373
+ }
374
+ }
375
+ // Track transition for one-shot prompt context
376
+ if (previousNode) {
377
+ this._justTransitioned = { from: previousNode.id, to: nextNode.id };
378
+ }
379
+ // Emit node-enter and flow-transition
380
+ this.pendingEvents.push({ type: 'node-enter', nodeName: nextNode.name ?? nextNode.id });
381
+ if (previousNode) {
382
+ this.pendingEvents.push({ type: 'flow-transition', from: previousNode.id, to: nextNode.id });
383
+ }
384
+ // Handle end nodes
385
+ if (nextNode.nodeType === 'end') {
386
+ this.flowEnded = true;
387
+ this.pendingEvents.push({ type: 'flow-end', reason: 'end node reached' });
388
+ }
389
+ return {};
390
+ }
391
+ // ─── Private: Extraction ─────────────────────────────────────────────────
392
+ mergeExtractedData(data) {
393
+ this.context.collectedData = mergeExtractionData(this.context.collectedData, data);
394
+ }
395
+ checkExtractionComplete() {
396
+ if (!this.currentNodeConfig || !isExtractionNode(this.currentNodeConfig)) {
397
+ return { complete: false };
398
+ }
399
+ const node = this.currentNodeConfig;
400
+ const missing = this.getMissingExtractionFields(node);
401
+ if (missing.length > 0) {
402
+ return { complete: false };
403
+ }
404
+ return {
405
+ complete: true,
406
+ nextNode: node.extractionCompleteTransition,
407
+ };
408
+ }
409
+ getMissingExtractionFields(node) {
410
+ const required = node.extractionRequiredFields ?? [];
411
+ if (required.length === 0) {
412
+ // If no explicit required fields, try safeParse to check completeness
413
+ const result = node.extractionSchema.safeParse(this.context.collectedData);
414
+ if (result.success)
415
+ return [];
416
+ // Extract field names from Zod errors
417
+ const fieldNames = (result.error.issues ?? [])
418
+ .map(issue => issue.path.join('.'))
419
+ .filter(Boolean);
420
+ return [...new Set(fieldNames)];
421
+ }
422
+ return computeMissingFields(this.context.collectedData, required);
423
+ }
424
+ // ─── Private: Context Strategy ───────────────────────────────────────────
425
+ applyContextStrategy(node) {
426
+ const strategy = node.contextStrategy ?? this.nodes.get(this.context.currentNode)?.contextStrategy ?? 'append';
427
+ switch (strategy) {
428
+ case 'reset':
429
+ this.context.messages = [];
430
+ break;
431
+ case 'reset_with_summary':
432
+ // In the headless capability, we can't call an LLM for summarization.
433
+ // Reset messages and add a note about prior context.
434
+ this.context.messages = [];
435
+ break;
436
+ case 'append':
437
+ default:
438
+ // Keep all messages
439
+ break;
440
+ }
441
+ }
442
+ // ─── Private: Helpers ────────────────────────────────────────────────────
443
+ getRelevantCollectedData() {
444
+ const fields = this.currentNodeConfig?.relevantFields;
445
+ if (!fields || fields.length === 0) {
446
+ return this.context.collectedData;
447
+ }
448
+ const filtered = {};
449
+ for (const field of fields) {
450
+ if (field in this.context.collectedData) {
451
+ filtered[field] = this.context.collectedData[field];
452
+ }
453
+ }
454
+ return filtered;
455
+ }
456
+ buildExtractionContinueEnvelope(node, argsRecord) {
457
+ const missingAfter = this.getMissingExtractionFields(node);
458
+ const fieldsReceived = Object.entries(argsRecord)
459
+ .filter(([, v]) => v !== null && v !== undefined && v !== '')
460
+ .map(([k]) => k);
461
+ let instruction;
462
+ if (fieldsReceived.length > 0) {
463
+ instruction = `Acknowledge receipt of ${fieldsReceived.join(', ')}.`;
464
+ if (missingAfter[0]) {
465
+ instruction += ` Ask for the ${missingAfter[0]}.`;
466
+ }
467
+ }
468
+ else if (missingAfter[0]) {
469
+ instruction = `Ask for the ${missingAfter[0]}.`;
470
+ }
471
+ else {
472
+ instruction = 'Continue the conversation naturally.';
473
+ }
474
+ return {
475
+ accepted: true,
476
+ fieldsReceived,
477
+ fieldsStillRequired: missingAfter,
478
+ instruction,
479
+ };
480
+ }
481
+ }
482
+ //# sourceMappingURL=FlowCapability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FlowCapability.js","sourceRoot":"","sources":["../../src/capabilities/FlowCapability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { Capability, ToolDeclaration, PromptSection, CapabilityAction } from './index.js';
2
+ /**
3
+ * Injects policy text into the system prompt as 'policy' sections.
4
+ * Optionally filters input/output text — currently a passthrough placeholder
5
+ * that future processor integration can populate.
6
+ */
7
+ export declare class GuardrailCapability implements Capability {
8
+ private policies;
9
+ constructor(policies: string[]);
10
+ getTools(): ToolDeclaration[];
11
+ getPromptSections(): PromptSection[];
12
+ processToolResult(_toolName: string, _args: unknown, _result: unknown): CapabilityAction | null;
13
+ /**
14
+ * Evaluate whether an input text is permitted by this guardrail.
15
+ * Returns `{ allowed: true }` until a processor is wired in.
16
+ */
17
+ filterInput(_text: string): {
18
+ allowed: boolean;
19
+ reason?: string;
20
+ };
21
+ /**
22
+ * Evaluate whether an output text is permitted and optionally modify it.
23
+ * Returns `{ allowed: true }` until a processor is wired in.
24
+ */
25
+ filterOutput(_text: string): {
26
+ allowed: boolean;
27
+ modified?: string;
28
+ };
29
+ }
30
+ //# sourceMappingURL=GuardrailCapability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GuardrailCapability.d.ts","sourceRoot":"","sources":["../../src/capabilities/GuardrailCapability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAI/F;;;;GAIG;AACH,qBAAa,mBAAoB,YAAW,UAAU;IACpD,OAAO,CAAC,QAAQ,CAAW;gBAEf,QAAQ,EAAE,MAAM,EAAE;IAI9B,QAAQ,IAAI,eAAe,EAAE;IAI7B,iBAAiB,IAAI,aAAa,EAAE;IAMpC,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI;IAI/F;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAIjE;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;CAGrE"}
@@ -0,0 +1,38 @@
1
+ // ─── GuardrailCapability ─────────────────────────────────────────────────────
2
+ /**
3
+ * Injects policy text into the system prompt as 'policy' sections.
4
+ * Optionally filters input/output text — currently a passthrough placeholder
5
+ * that future processor integration can populate.
6
+ */
7
+ export class GuardrailCapability {
8
+ policies;
9
+ constructor(policies) {
10
+ this.policies = policies;
11
+ }
12
+ getTools() {
13
+ return [];
14
+ }
15
+ getPromptSections() {
16
+ return this.policies
17
+ .filter(p => p.trim().length > 0)
18
+ .map(policy => ({ role: 'policy', content: policy }));
19
+ }
20
+ processToolResult(_toolName, _args, _result) {
21
+ return null;
22
+ }
23
+ /**
24
+ * Evaluate whether an input text is permitted by this guardrail.
25
+ * Returns `{ allowed: true }` until a processor is wired in.
26
+ */
27
+ filterInput(_text) {
28
+ return { allowed: true };
29
+ }
30
+ /**
31
+ * Evaluate whether an output text is permitted and optionally modify it.
32
+ * Returns `{ allowed: true }` until a processor is wired in.
33
+ */
34
+ filterOutput(_text) {
35
+ return { allowed: true };
36
+ }
37
+ }
38
+ //# sourceMappingURL=GuardrailCapability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GuardrailCapability.js","sourceRoot":"","sources":["../../src/capabilities/GuardrailCapability.ts"],"names":[],"mappings":"AAEA,gFAAgF;AAEhF;;;;GAIG;AACH,MAAM,OAAO,mBAAmB;IACtB,QAAQ,CAAW;IAE3B,YAAY,QAAkB;QAC5B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,QAAQ;QACN,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,QAAQ;aACjB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;aAChC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,iBAAiB,CAAC,SAAiB,EAAE,KAAc,EAAE,OAAgB;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,KAAa;QACvB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,KAAa;QACxB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ import type { Capability, ToolDeclaration, PromptSection, CapabilityAction } from './index.js';
2
+ export interface HandoffTarget {
3
+ id: string;
4
+ name: string;
5
+ description?: string;
6
+ }
7
+ /**
8
+ * Exposes a single `transfer_to_agent` tool for agents that have explicit
9
+ * `canHandoffTo` targets. Unlike TriageCapability (one tool per route),
10
+ * this uses a single tool with an enum parameter for the target agent.
11
+ */
12
+ export declare class HandoffCapability implements Capability {
13
+ private targets;
14
+ constructor(targets: HandoffTarget[]);
15
+ getTools(): ToolDeclaration[];
16
+ getPromptSections(): PromptSection[];
17
+ processToolResult(toolName: string, args: unknown, result: unknown): CapabilityAction | null;
18
+ }
19
+ //# sourceMappingURL=HandoffCapability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HandoffCapability.d.ts","sourceRoot":"","sources":["../../src/capabilities/HandoffCapability.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAK/F,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAID;;;;GAIG;AACH,qBAAa,iBAAkB,YAAW,UAAU;IAClD,OAAO,CAAC,OAAO,CAAkB;gBAErB,OAAO,EAAE,aAAa,EAAE;IAIpC,QAAQ,IAAI,eAAe,EAAE;IAgC7B,iBAAiB,IAAI,aAAa,EAAE;IAIpC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI;CAW7F"}