@ariaflowagents/core 0.8.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/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 +60 -1
- package/dist/flows/FlowManager.d.ts.map +1 -1
- package/dist/flows/FlowManager.js +467 -34
- 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/hooks/HookRunner.d.ts +3 -1
- package/dist/hooks/HookRunner.d.ts.map +1 -1
- package/dist/hooks/HookRunner.js +3 -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 +11 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- 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/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/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 +7 -5
- package/dist/runtime/FlowExecutor.d.ts.map +1 -1
- package/dist/runtime/FlowExecutor.js +71 -12
- package/dist/runtime/FlowExecutor.js.map +1 -1
- package/dist/runtime/Runtime.d.ts +22 -0
- package/dist/runtime/Runtime.d.ts.map +1 -1
- package/dist/runtime/Runtime.js +47 -0
- package/dist/runtime/Runtime.js.map +1 -1
- package/dist/runtime/pipeline/AgentExecuteStage.d.ts.map +1 -1
- package/dist/runtime/pipeline/AgentExecuteStage.js +94 -25
- package/dist/runtime/pipeline/AgentExecuteStage.js.map +1 -1
- package/dist/runtime/pipeline/ContextAssembleStage.js +1 -1
- package/dist/types/index.d.ts +61 -3
- 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/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"}
|