@axonflow/sdk 4.1.0 → 4.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/cjs/adapters/langgraph.d.ts +284 -0
- package/dist/cjs/adapters/langgraph.d.ts.map +1 -0
- package/dist/cjs/adapters/langgraph.js +364 -0
- package/dist/cjs/adapters/langgraph.js.map +1 -0
- package/dist/cjs/client.d.ts +82 -2
- package/dist/cjs/client.d.ts.map +1 -1
- package/dist/cjs/client.js +173 -2
- package/dist/cjs/client.js.map +1 -1
- package/dist/cjs/index.d.ts +3 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +6 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/telemetry.js +1 -1
- package/dist/cjs/telemetry.js.map +1 -1
- package/dist/cjs/types/gateway.d.ts +65 -0
- package/dist/cjs/types/gateway.d.ts.map +1 -1
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/adapters/langgraph.d.ts +284 -0
- package/dist/esm/adapters/langgraph.d.ts.map +1 -0
- package/dist/esm/adapters/langgraph.js +358 -0
- package/dist/esm/adapters/langgraph.js.map +1 -0
- package/dist/esm/client.d.ts +82 -2
- package/dist/esm/client.d.ts.map +1 -1
- package/dist/esm/client.js +173 -2
- package/dist/esm/client.js.map +1 -1
- package/dist/esm/index.d.ts +3 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/telemetry.js +1 -1
- package/dist/esm/telemetry.js.map +1 -1
- package/dist/esm/types/gateway.d.ts +65 -0
- package/dist/esm/types/gateway.d.ts.map +1 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -804,7 +804,7 @@ console.log('Message sent:', result.success);
|
|
|
804
804
|
| Amadeus GDS | Travel | Flight/hotel booking |
|
|
805
805
|
| Cassandra | NoSQL | Distributed database |
|
|
806
806
|
|
|
807
|
-
For complete connector documentation, see [https://docs.getaxonflow.com/mcp](https://docs.getaxonflow.com/mcp)
|
|
807
|
+
For complete connector documentation, see [https://docs.getaxonflow.com/docs/mcp/overview](https://docs.getaxonflow.com/docs/mcp/overview)
|
|
808
808
|
|
|
809
809
|
## MCP Policy Features (v3.3.0)
|
|
810
810
|
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LangGraph Adapter for AxonFlow Workflow Control Plane.
|
|
3
|
+
*
|
|
4
|
+
* This adapter wraps LangGraph workflows with AxonFlow governance gates,
|
|
5
|
+
* providing policy enforcement at step transitions.
|
|
6
|
+
*
|
|
7
|
+
* "LangGraph runs the workflow. AxonFlow decides when it's allowed to move forward."
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* import { AxonFlow, AxonFlowLangGraphAdapter } from '@axonflow/sdk';
|
|
12
|
+
*
|
|
13
|
+
* const client = new AxonFlow({ endpoint: 'http://localhost:8080' });
|
|
14
|
+
* const adapter = new AxonFlowLangGraphAdapter(client, 'my-workflow');
|
|
15
|
+
*
|
|
16
|
+
* // Start workflow and register with AxonFlow
|
|
17
|
+
* await adapter.startWorkflow();
|
|
18
|
+
*
|
|
19
|
+
* // Before each step, check the gate
|
|
20
|
+
* if (await adapter.checkGate('generate_code', 'llm_call', { model: 'gpt-4' })) {
|
|
21
|
+
* const result = await executeStep();
|
|
22
|
+
* await adapter.stepCompleted('generate_code');
|
|
23
|
+
* }
|
|
24
|
+
*
|
|
25
|
+
* // Complete workflow
|
|
26
|
+
* await adapter.completeWorkflow();
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
import { AxonFlow } from '../client';
|
|
30
|
+
import { AxonFlowError } from '../errors';
|
|
31
|
+
import type { StepType, ToolContext, WorkflowSource } from '../types/workflows';
|
|
32
|
+
/**
|
|
33
|
+
* Error thrown when a workflow step is blocked by policy.
|
|
34
|
+
*/
|
|
35
|
+
export declare class WorkflowBlockedError extends AxonFlowError {
|
|
36
|
+
readonly stepId?: string;
|
|
37
|
+
readonly reason?: string;
|
|
38
|
+
readonly policyIds: string[];
|
|
39
|
+
constructor(message: string, stepId?: string, reason?: string, policyIds?: string[]);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Error thrown when a workflow step requires approval.
|
|
43
|
+
*/
|
|
44
|
+
export declare class WorkflowApprovalRequiredError extends AxonFlowError {
|
|
45
|
+
readonly stepId?: string;
|
|
46
|
+
readonly approvalUrl?: string;
|
|
47
|
+
readonly reason?: string;
|
|
48
|
+
constructor(message: string, stepId?: string, approvalUrl?: string, reason?: string);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Options for the MCP tool interceptor.
|
|
52
|
+
*/
|
|
53
|
+
export interface MCPInterceptorOptions {
|
|
54
|
+
/**
|
|
55
|
+
* Optional function that maps an MCP request to a connector type string.
|
|
56
|
+
* Defaults to `${request.serverName}.${request.name}`.
|
|
57
|
+
*/
|
|
58
|
+
connectorTypeFn?: (request: any) => string;
|
|
59
|
+
/**
|
|
60
|
+
* Operation type passed to mcp_check_input.
|
|
61
|
+
* Defaults to "execute". Set to "query" for known read-only tool calls.
|
|
62
|
+
*/
|
|
63
|
+
operation?: string;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Options for the LangGraph adapter constructor.
|
|
67
|
+
*/
|
|
68
|
+
export interface LangGraphAdapterOptions {
|
|
69
|
+
/** Workflow source (defaults to 'langgraph') */
|
|
70
|
+
source?: WorkflowSource;
|
|
71
|
+
/**
|
|
72
|
+
* If true, checkGate raises WorkflowBlockedError on block.
|
|
73
|
+
* If false, returns false and caller handles it.
|
|
74
|
+
* Defaults to true.
|
|
75
|
+
*/
|
|
76
|
+
autoBlock?: boolean;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Options for checkGate method.
|
|
80
|
+
*/
|
|
81
|
+
export interface CheckGateOptions {
|
|
82
|
+
/** Optional step ID (auto-generated if not provided) */
|
|
83
|
+
stepId?: string;
|
|
84
|
+
/** Input data for the step (for policy evaluation) */
|
|
85
|
+
stepInput?: Record<string, unknown>;
|
|
86
|
+
/** LLM model being used */
|
|
87
|
+
model?: string;
|
|
88
|
+
/** LLM provider being used */
|
|
89
|
+
provider?: string;
|
|
90
|
+
/** Tool context for per-tool governance within tool_call steps */
|
|
91
|
+
toolContext?: ToolContext;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Options for stepCompleted method.
|
|
95
|
+
*/
|
|
96
|
+
export interface StepCompletedOptions {
|
|
97
|
+
/** Optional step ID (must match the one used in checkGate) */
|
|
98
|
+
stepId?: string;
|
|
99
|
+
/** Output data from the step */
|
|
100
|
+
output?: Record<string, unknown>;
|
|
101
|
+
/** Additional metadata */
|
|
102
|
+
metadata?: Record<string, unknown>;
|
|
103
|
+
/** Input tokens consumed */
|
|
104
|
+
tokensIn?: number;
|
|
105
|
+
/** Output tokens produced */
|
|
106
|
+
tokensOut?: number;
|
|
107
|
+
/** Cost in USD */
|
|
108
|
+
costUsd?: number;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Options for checkToolGate method.
|
|
112
|
+
*/
|
|
113
|
+
export interface CheckToolGateOptions {
|
|
114
|
+
/** Step name (defaults to "tools/{toolName}") */
|
|
115
|
+
stepName?: string;
|
|
116
|
+
/** Optional step ID (auto-generated if not provided) */
|
|
117
|
+
stepId?: string;
|
|
118
|
+
/** Input arguments for the tool */
|
|
119
|
+
toolInput?: Record<string, unknown>;
|
|
120
|
+
/** LLM model being used */
|
|
121
|
+
model?: string;
|
|
122
|
+
/** LLM provider being used */
|
|
123
|
+
provider?: string;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Options for toolCompleted method.
|
|
127
|
+
*/
|
|
128
|
+
export interface ToolCompletedOptions {
|
|
129
|
+
/** Step name (defaults to "tools/{toolName}") */
|
|
130
|
+
stepName?: string;
|
|
131
|
+
/** Optional step ID (must match the one used in checkToolGate) */
|
|
132
|
+
stepId?: string;
|
|
133
|
+
/** Output data from the tool */
|
|
134
|
+
output?: Record<string, unknown>;
|
|
135
|
+
/** Input tokens consumed */
|
|
136
|
+
tokensIn?: number;
|
|
137
|
+
/** Output tokens produced */
|
|
138
|
+
tokensOut?: number;
|
|
139
|
+
/** Cost in USD */
|
|
140
|
+
costUsd?: number;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Options for waitForApproval method.
|
|
144
|
+
*/
|
|
145
|
+
export interface WaitForApprovalOptions {
|
|
146
|
+
/** Seconds between polls (default 5) */
|
|
147
|
+
pollInterval?: number;
|
|
148
|
+
/** Maximum seconds to wait (default 300) */
|
|
149
|
+
timeout?: number;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Wraps LangGraph workflows with AxonFlow governance gates.
|
|
153
|
+
*
|
|
154
|
+
* This adapter provides a simple interface for integrating AxonFlow's
|
|
155
|
+
* Workflow Control Plane with LangGraph workflows. It handles workflow
|
|
156
|
+
* registration, step gate checks, and workflow lifecycle management.
|
|
157
|
+
*
|
|
158
|
+
* @example
|
|
159
|
+
* ```typescript
|
|
160
|
+
* const adapter = new AxonFlowLangGraphAdapter(client, 'code-review-pipeline');
|
|
161
|
+
* await adapter.startWorkflow();
|
|
162
|
+
*
|
|
163
|
+
* // Before each LangGraph node execution
|
|
164
|
+
* if (await adapter.checkGate('analyze', 'llm_call')) {
|
|
165
|
+
* const result = await analyzeCode(state);
|
|
166
|
+
* await adapter.stepCompleted('analyze');
|
|
167
|
+
* }
|
|
168
|
+
* ```
|
|
169
|
+
*/
|
|
170
|
+
export declare class AxonFlowLangGraphAdapter {
|
|
171
|
+
readonly client: AxonFlow;
|
|
172
|
+
readonly workflowName: string;
|
|
173
|
+
readonly source: WorkflowSource;
|
|
174
|
+
workflowId: string | null;
|
|
175
|
+
private _stepCounter;
|
|
176
|
+
private readonly _autoBlock;
|
|
177
|
+
constructor(client: AxonFlow, workflowName: string, options?: LangGraphAdapterOptions);
|
|
178
|
+
/**
|
|
179
|
+
* Register the workflow with AxonFlow.
|
|
180
|
+
*
|
|
181
|
+
* Call this at the start of your LangGraph workflow execution.
|
|
182
|
+
*
|
|
183
|
+
* @param metadata - Additional workflow metadata
|
|
184
|
+
* @param traceId - External trace ID for correlation (Langsmith, Datadog, OTel)
|
|
185
|
+
* @returns The assigned workflow ID
|
|
186
|
+
*/
|
|
187
|
+
startWorkflow(metadata?: Record<string, unknown>, traceId?: string): Promise<string>;
|
|
188
|
+
/**
|
|
189
|
+
* Check if a step is allowed to proceed.
|
|
190
|
+
*
|
|
191
|
+
* Call this before executing each LangGraph node to check policy approval.
|
|
192
|
+
*
|
|
193
|
+
* @param stepName - Human-readable step name
|
|
194
|
+
* @param stepType - Type of step (llm_call, tool_call, connector_call, human_task)
|
|
195
|
+
* @param opts - Additional options
|
|
196
|
+
* @returns True if step is allowed, false if blocked (when autoBlock=false)
|
|
197
|
+
* @throws WorkflowBlockedError if step is blocked and autoBlock=true
|
|
198
|
+
* @throws WorkflowApprovalRequiredError if step requires approval
|
|
199
|
+
* @throws Error if workflow not started
|
|
200
|
+
*/
|
|
201
|
+
checkGate(stepName: string, stepType: StepType, opts?: CheckGateOptions): Promise<boolean>;
|
|
202
|
+
/**
|
|
203
|
+
* Mark a step as completed.
|
|
204
|
+
*
|
|
205
|
+
* Call this after successfully executing a LangGraph node.
|
|
206
|
+
*
|
|
207
|
+
* @param stepName - Step name (used to generate step_id if not provided)
|
|
208
|
+
* @param opts - Additional options
|
|
209
|
+
*/
|
|
210
|
+
stepCompleted(stepName: string, opts?: StepCompletedOptions): Promise<void>;
|
|
211
|
+
/**
|
|
212
|
+
* Check if a specific tool invocation is allowed.
|
|
213
|
+
*
|
|
214
|
+
* Convenience wrapper around checkGate() that sets step_type='tool_call'
|
|
215
|
+
* and includes ToolContext for per-tool governance.
|
|
216
|
+
*
|
|
217
|
+
* @param toolName - Name of the tool being invoked
|
|
218
|
+
* @param toolType - Tool type (function, mcp, api)
|
|
219
|
+
* @param opts - Additional options
|
|
220
|
+
* @returns True if tool invocation is allowed, false if blocked (when autoBlock=false)
|
|
221
|
+
*/
|
|
222
|
+
checkToolGate(toolName: string, toolType?: string, opts?: CheckToolGateOptions): Promise<boolean>;
|
|
223
|
+
/**
|
|
224
|
+
* Mark a tool invocation as completed.
|
|
225
|
+
*
|
|
226
|
+
* Convenience wrapper around stepCompleted() for tool-level tracking.
|
|
227
|
+
*
|
|
228
|
+
* @param toolName - Name of the tool that was invoked
|
|
229
|
+
* @param opts - Additional options
|
|
230
|
+
*/
|
|
231
|
+
toolCompleted(toolName: string, opts?: ToolCompletedOptions): Promise<void>;
|
|
232
|
+
/**
|
|
233
|
+
* Mark the workflow as completed.
|
|
234
|
+
*
|
|
235
|
+
* Call this when your LangGraph workflow finishes successfully.
|
|
236
|
+
*/
|
|
237
|
+
completeWorkflow(): Promise<void>;
|
|
238
|
+
/**
|
|
239
|
+
* Abort the workflow.
|
|
240
|
+
*
|
|
241
|
+
* Call this when your LangGraph workflow fails or is cancelled.
|
|
242
|
+
*
|
|
243
|
+
* @param reason - Reason for aborting
|
|
244
|
+
*/
|
|
245
|
+
abortWorkflow(reason?: string): Promise<void>;
|
|
246
|
+
/**
|
|
247
|
+
* Fail the workflow.
|
|
248
|
+
*
|
|
249
|
+
* Call this when your LangGraph workflow has encountered an unrecoverable error.
|
|
250
|
+
*
|
|
251
|
+
* @param reason - Reason for the failure
|
|
252
|
+
*/
|
|
253
|
+
failWorkflow(reason?: string): Promise<void>;
|
|
254
|
+
/**
|
|
255
|
+
* Wait for a step to be approved.
|
|
256
|
+
*
|
|
257
|
+
* Poll the workflow status until the step is approved or rejected.
|
|
258
|
+
*
|
|
259
|
+
* @param stepId - Step ID to wait for
|
|
260
|
+
* @param opts - Polling options
|
|
261
|
+
* @returns True if approved, false if rejected
|
|
262
|
+
* @throws Error if approval not received within timeout
|
|
263
|
+
*/
|
|
264
|
+
waitForApproval(stepId: string, opts?: WaitForApprovalOptions): Promise<boolean>;
|
|
265
|
+
/**
|
|
266
|
+
* Return an async MCP tool interceptor for use with MultiServerMCPClient.
|
|
267
|
+
*
|
|
268
|
+
* The interceptor enforces AxonFlow input and output policies around every
|
|
269
|
+
* MCP tool call.
|
|
270
|
+
*
|
|
271
|
+
* @example
|
|
272
|
+
* ```typescript
|
|
273
|
+
* const mcp = new MultiServerMCPClient(
|
|
274
|
+
* { 'my-server': { url: '...', transport: 'http' } },
|
|
275
|
+
* { toolInterceptors: [adapter.mcpToolInterceptor()] },
|
|
276
|
+
* );
|
|
277
|
+
* ```
|
|
278
|
+
*
|
|
279
|
+
* @param opts - Optional interceptor options
|
|
280
|
+
* @returns An async callable (request, handler) => result
|
|
281
|
+
*/
|
|
282
|
+
mcpToolInterceptor(opts?: MCPInterceptorOptions): (request: any, handler: (request: any) => Promise<any>) => Promise<any>;
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=langgraph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"langgraph.d.ts","sourceRoot":"","sources":["../../../src/adapters/langgraph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* LangGraph Adapter for AxonFlow Workflow Control Plane.
|
|
4
|
+
*
|
|
5
|
+
* This adapter wraps LangGraph workflows with AxonFlow governance gates,
|
|
6
|
+
* providing policy enforcement at step transitions.
|
|
7
|
+
*
|
|
8
|
+
* "LangGraph runs the workflow. AxonFlow decides when it's allowed to move forward."
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import { AxonFlow, AxonFlowLangGraphAdapter } from '@axonflow/sdk';
|
|
13
|
+
*
|
|
14
|
+
* const client = new AxonFlow({ endpoint: 'http://localhost:8080' });
|
|
15
|
+
* const adapter = new AxonFlowLangGraphAdapter(client, 'my-workflow');
|
|
16
|
+
*
|
|
17
|
+
* // Start workflow and register with AxonFlow
|
|
18
|
+
* await adapter.startWorkflow();
|
|
19
|
+
*
|
|
20
|
+
* // Before each step, check the gate
|
|
21
|
+
* if (await adapter.checkGate('generate_code', 'llm_call', { model: 'gpt-4' })) {
|
|
22
|
+
* const result = await executeStep();
|
|
23
|
+
* await adapter.stepCompleted('generate_code');
|
|
24
|
+
* }
|
|
25
|
+
*
|
|
26
|
+
* // Complete workflow
|
|
27
|
+
* await adapter.completeWorkflow();
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.AxonFlowLangGraphAdapter = exports.WorkflowApprovalRequiredError = exports.WorkflowBlockedError = void 0;
|
|
32
|
+
const errors_1 = require("../errors");
|
|
33
|
+
/**
|
|
34
|
+
* Error thrown when a workflow step is blocked by policy.
|
|
35
|
+
*/
|
|
36
|
+
class WorkflowBlockedError extends errors_1.AxonFlowError {
|
|
37
|
+
constructor(message, stepId, reason, policyIds) {
|
|
38
|
+
super(message, { stepId, reason, policyIds: policyIds || [] });
|
|
39
|
+
this.name = 'WorkflowBlockedError';
|
|
40
|
+
this.stepId = stepId;
|
|
41
|
+
this.reason = reason;
|
|
42
|
+
this.policyIds = policyIds || [];
|
|
43
|
+
Object.setPrototypeOf(this, WorkflowBlockedError.prototype);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.WorkflowBlockedError = WorkflowBlockedError;
|
|
47
|
+
/**
|
|
48
|
+
* Error thrown when a workflow step requires approval.
|
|
49
|
+
*/
|
|
50
|
+
class WorkflowApprovalRequiredError extends errors_1.AxonFlowError {
|
|
51
|
+
constructor(message, stepId, approvalUrl, reason) {
|
|
52
|
+
super(message, { stepId, approvalUrl, reason });
|
|
53
|
+
this.name = 'WorkflowApprovalRequiredError';
|
|
54
|
+
this.stepId = stepId;
|
|
55
|
+
this.approvalUrl = approvalUrl;
|
|
56
|
+
this.reason = reason;
|
|
57
|
+
Object.setPrototypeOf(this, WorkflowApprovalRequiredError.prototype);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.WorkflowApprovalRequiredError = WorkflowApprovalRequiredError;
|
|
61
|
+
/**
|
|
62
|
+
* Wraps LangGraph workflows with AxonFlow governance gates.
|
|
63
|
+
*
|
|
64
|
+
* This adapter provides a simple interface for integrating AxonFlow's
|
|
65
|
+
* Workflow Control Plane with LangGraph workflows. It handles workflow
|
|
66
|
+
* registration, step gate checks, and workflow lifecycle management.
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```typescript
|
|
70
|
+
* const adapter = new AxonFlowLangGraphAdapter(client, 'code-review-pipeline');
|
|
71
|
+
* await adapter.startWorkflow();
|
|
72
|
+
*
|
|
73
|
+
* // Before each LangGraph node execution
|
|
74
|
+
* if (await adapter.checkGate('analyze', 'llm_call')) {
|
|
75
|
+
* const result = await analyzeCode(state);
|
|
76
|
+
* await adapter.stepCompleted('analyze');
|
|
77
|
+
* }
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
class AxonFlowLangGraphAdapter {
|
|
81
|
+
constructor(client, workflowName, options) {
|
|
82
|
+
this.workflowId = null;
|
|
83
|
+
this._stepCounter = 0;
|
|
84
|
+
this.client = client;
|
|
85
|
+
this.workflowName = workflowName;
|
|
86
|
+
this.source = options?.source ?? 'langgraph';
|
|
87
|
+
this._autoBlock = options?.autoBlock ?? true;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Register the workflow with AxonFlow.
|
|
91
|
+
*
|
|
92
|
+
* Call this at the start of your LangGraph workflow execution.
|
|
93
|
+
*
|
|
94
|
+
* @param metadata - Additional workflow metadata
|
|
95
|
+
* @param traceId - External trace ID for correlation (Langsmith, Datadog, OTel)
|
|
96
|
+
* @returns The assigned workflow ID
|
|
97
|
+
*/
|
|
98
|
+
async startWorkflow(metadata, traceId) {
|
|
99
|
+
const response = await this.client.createWorkflow({
|
|
100
|
+
workflow_name: this.workflowName,
|
|
101
|
+
source: this.source,
|
|
102
|
+
metadata: metadata || {},
|
|
103
|
+
trace_id: traceId,
|
|
104
|
+
});
|
|
105
|
+
this.workflowId = response.workflow_id;
|
|
106
|
+
return this.workflowId;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Check if a step is allowed to proceed.
|
|
110
|
+
*
|
|
111
|
+
* Call this before executing each LangGraph node to check policy approval.
|
|
112
|
+
*
|
|
113
|
+
* @param stepName - Human-readable step name
|
|
114
|
+
* @param stepType - Type of step (llm_call, tool_call, connector_call, human_task)
|
|
115
|
+
* @param opts - Additional options
|
|
116
|
+
* @returns True if step is allowed, false if blocked (when autoBlock=false)
|
|
117
|
+
* @throws WorkflowBlockedError if step is blocked and autoBlock=true
|
|
118
|
+
* @throws WorkflowApprovalRequiredError if step requires approval
|
|
119
|
+
* @throws Error if workflow not started
|
|
120
|
+
*/
|
|
121
|
+
async checkGate(stepName, stepType, opts) {
|
|
122
|
+
if (!this.workflowId) {
|
|
123
|
+
throw new Error('Workflow not started. Call startWorkflow() first.');
|
|
124
|
+
}
|
|
125
|
+
// Generate step ID if not provided
|
|
126
|
+
let stepId = opts?.stepId;
|
|
127
|
+
if (!stepId) {
|
|
128
|
+
this._stepCounter += 1;
|
|
129
|
+
const safeName = stepName.toLowerCase().replace(/ /g, '-').replace(/\//g, '-');
|
|
130
|
+
stepId = `step-${this._stepCounter}-${safeName}`;
|
|
131
|
+
}
|
|
132
|
+
const response = await this.client.stepGate(this.workflowId, stepId, {
|
|
133
|
+
step_name: stepName,
|
|
134
|
+
step_type: stepType,
|
|
135
|
+
step_input: opts?.stepInput || {},
|
|
136
|
+
model: opts?.model,
|
|
137
|
+
provider: opts?.provider,
|
|
138
|
+
tool_context: opts?.toolContext,
|
|
139
|
+
});
|
|
140
|
+
if (response.decision === 'block') {
|
|
141
|
+
if (this._autoBlock) {
|
|
142
|
+
throw new WorkflowBlockedError(`Step '${stepName}' blocked: ${response.reason}`, response.step_id, response.reason, response.policy_ids);
|
|
143
|
+
}
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
if (response.decision === 'require_approval') {
|
|
147
|
+
throw new WorkflowApprovalRequiredError(`Step '${stepName}' requires approval`, response.step_id, response.approval_url, response.reason);
|
|
148
|
+
}
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Mark a step as completed.
|
|
153
|
+
*
|
|
154
|
+
* Call this after successfully executing a LangGraph node.
|
|
155
|
+
*
|
|
156
|
+
* @param stepName - Step name (used to generate step_id if not provided)
|
|
157
|
+
* @param opts - Additional options
|
|
158
|
+
*/
|
|
159
|
+
async stepCompleted(stepName, opts) {
|
|
160
|
+
if (!this.workflowId) {
|
|
161
|
+
throw new Error('Workflow not started. Call startWorkflow() first.');
|
|
162
|
+
}
|
|
163
|
+
// Generate step ID if not provided (must match checkGate)
|
|
164
|
+
let stepId = opts?.stepId;
|
|
165
|
+
if (!stepId) {
|
|
166
|
+
const safeName = stepName.toLowerCase().replace(/ /g, '-').replace(/\//g, '-');
|
|
167
|
+
stepId = `step-${this._stepCounter}-${safeName}`;
|
|
168
|
+
}
|
|
169
|
+
await this.client.markStepCompleted(this.workflowId, stepId, {
|
|
170
|
+
output: opts?.output || {},
|
|
171
|
+
metadata: opts?.metadata || {},
|
|
172
|
+
tokens_in: opts?.tokensIn,
|
|
173
|
+
tokens_out: opts?.tokensOut,
|
|
174
|
+
cost_usd: opts?.costUsd,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Check if a specific tool invocation is allowed.
|
|
179
|
+
*
|
|
180
|
+
* Convenience wrapper around checkGate() that sets step_type='tool_call'
|
|
181
|
+
* and includes ToolContext for per-tool governance.
|
|
182
|
+
*
|
|
183
|
+
* @param toolName - Name of the tool being invoked
|
|
184
|
+
* @param toolType - Tool type (function, mcp, api)
|
|
185
|
+
* @param opts - Additional options
|
|
186
|
+
* @returns True if tool invocation is allowed, false if blocked (when autoBlock=false)
|
|
187
|
+
*/
|
|
188
|
+
async checkToolGate(toolName, toolType, opts) {
|
|
189
|
+
const stepName = opts?.stepName ?? `tools/${toolName}`;
|
|
190
|
+
const toolContext = {
|
|
191
|
+
tool_name: toolName,
|
|
192
|
+
tool_type: toolType,
|
|
193
|
+
tool_input: opts?.toolInput || {},
|
|
194
|
+
};
|
|
195
|
+
return this.checkGate(stepName, 'tool_call', {
|
|
196
|
+
stepId: opts?.stepId,
|
|
197
|
+
model: opts?.model,
|
|
198
|
+
provider: opts?.provider,
|
|
199
|
+
toolContext,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Mark a tool invocation as completed.
|
|
204
|
+
*
|
|
205
|
+
* Convenience wrapper around stepCompleted() for tool-level tracking.
|
|
206
|
+
*
|
|
207
|
+
* @param toolName - Name of the tool that was invoked
|
|
208
|
+
* @param opts - Additional options
|
|
209
|
+
*/
|
|
210
|
+
async toolCompleted(toolName, opts) {
|
|
211
|
+
const stepName = opts?.stepName ?? `tools/${toolName}`;
|
|
212
|
+
await this.stepCompleted(stepName, {
|
|
213
|
+
stepId: opts?.stepId,
|
|
214
|
+
output: opts?.output,
|
|
215
|
+
tokensIn: opts?.tokensIn,
|
|
216
|
+
tokensOut: opts?.tokensOut,
|
|
217
|
+
costUsd: opts?.costUsd,
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Mark the workflow as completed.
|
|
222
|
+
*
|
|
223
|
+
* Call this when your LangGraph workflow finishes successfully.
|
|
224
|
+
*/
|
|
225
|
+
async completeWorkflow() {
|
|
226
|
+
if (!this.workflowId) {
|
|
227
|
+
throw new Error('Workflow not started. Call startWorkflow() first.');
|
|
228
|
+
}
|
|
229
|
+
await this.client.completeWorkflow(this.workflowId);
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Abort the workflow.
|
|
233
|
+
*
|
|
234
|
+
* Call this when your LangGraph workflow fails or is cancelled.
|
|
235
|
+
*
|
|
236
|
+
* @param reason - Reason for aborting
|
|
237
|
+
*/
|
|
238
|
+
async abortWorkflow(reason) {
|
|
239
|
+
if (!this.workflowId) {
|
|
240
|
+
throw new Error('Workflow not started. Call startWorkflow() first.');
|
|
241
|
+
}
|
|
242
|
+
await this.client.abortWorkflow(this.workflowId, reason);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Fail the workflow.
|
|
246
|
+
*
|
|
247
|
+
* Call this when your LangGraph workflow has encountered an unrecoverable error.
|
|
248
|
+
*
|
|
249
|
+
* @param reason - Reason for the failure
|
|
250
|
+
*/
|
|
251
|
+
async failWorkflow(reason) {
|
|
252
|
+
if (!this.workflowId) {
|
|
253
|
+
throw new Error('Workflow not started. Call startWorkflow() first.');
|
|
254
|
+
}
|
|
255
|
+
await this.client.failWorkflow(this.workflowId, reason);
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Wait for a step to be approved.
|
|
259
|
+
*
|
|
260
|
+
* Poll the workflow status until the step is approved or rejected.
|
|
261
|
+
*
|
|
262
|
+
* @param stepId - Step ID to wait for
|
|
263
|
+
* @param opts - Polling options
|
|
264
|
+
* @returns True if approved, false if rejected
|
|
265
|
+
* @throws Error if approval not received within timeout
|
|
266
|
+
*/
|
|
267
|
+
async waitForApproval(stepId, opts) {
|
|
268
|
+
if (!this.workflowId) {
|
|
269
|
+
throw new Error('Workflow not started. Call startWorkflow() first.');
|
|
270
|
+
}
|
|
271
|
+
const pollInterval = opts?.pollInterval ?? 5;
|
|
272
|
+
const timeout = opts?.timeout ?? 300;
|
|
273
|
+
let elapsed = 0;
|
|
274
|
+
while (elapsed < timeout) {
|
|
275
|
+
const status = await this.client.getWorkflow(this.workflowId);
|
|
276
|
+
// Find the step
|
|
277
|
+
if (status.steps) {
|
|
278
|
+
for (const step of status.steps) {
|
|
279
|
+
if (step.step_id === stepId) {
|
|
280
|
+
if (step.approval_status) {
|
|
281
|
+
if (step.approval_status === 'approved') {
|
|
282
|
+
return true;
|
|
283
|
+
}
|
|
284
|
+
if (step.approval_status === 'rejected') {
|
|
285
|
+
return false;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
await new Promise(resolve => setTimeout(resolve, pollInterval * 1000));
|
|
293
|
+
elapsed += pollInterval;
|
|
294
|
+
}
|
|
295
|
+
throw new errors_1.TimeoutError(timeout * 1000);
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Return an async MCP tool interceptor for use with MultiServerMCPClient.
|
|
299
|
+
*
|
|
300
|
+
* The interceptor enforces AxonFlow input and output policies around every
|
|
301
|
+
* MCP tool call.
|
|
302
|
+
*
|
|
303
|
+
* @example
|
|
304
|
+
* ```typescript
|
|
305
|
+
* const mcp = new MultiServerMCPClient(
|
|
306
|
+
* { 'my-server': { url: '...', transport: 'http' } },
|
|
307
|
+
* { toolInterceptors: [adapter.mcpToolInterceptor()] },
|
|
308
|
+
* );
|
|
309
|
+
* ```
|
|
310
|
+
*
|
|
311
|
+
* @param opts - Optional interceptor options
|
|
312
|
+
* @returns An async callable (request, handler) => result
|
|
313
|
+
*/
|
|
314
|
+
mcpToolInterceptor(opts) {
|
|
315
|
+
const operation = opts?.operation ?? 'execute';
|
|
316
|
+
const defaultConnectorType = (request) => {
|
|
317
|
+
return `${request.serverName}.${request.name}`;
|
|
318
|
+
};
|
|
319
|
+
const resolveConnectorType = opts?.connectorTypeFn ?? defaultConnectorType;
|
|
320
|
+
return async (request, handler) => {
|
|
321
|
+
const connectorType = resolveConnectorType(request);
|
|
322
|
+
let argsStr = '{}';
|
|
323
|
+
if (request.args) {
|
|
324
|
+
try {
|
|
325
|
+
argsStr = JSON.stringify(request.args);
|
|
326
|
+
}
|
|
327
|
+
catch {
|
|
328
|
+
argsStr = String(request.args);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
const statement = `${connectorType}(${argsStr})`;
|
|
332
|
+
const preCheck = await this.client.mcpCheckInput({
|
|
333
|
+
connectorType,
|
|
334
|
+
statement,
|
|
335
|
+
operation,
|
|
336
|
+
parameters: request.args,
|
|
337
|
+
});
|
|
338
|
+
if (!preCheck.allowed) {
|
|
339
|
+
throw new errors_1.PolicyViolationError(preCheck.block_reason || 'Tool call blocked by policy');
|
|
340
|
+
}
|
|
341
|
+
const result = await handler(request);
|
|
342
|
+
let resultStr;
|
|
343
|
+
try {
|
|
344
|
+
resultStr = JSON.stringify(result);
|
|
345
|
+
}
|
|
346
|
+
catch {
|
|
347
|
+
resultStr = String(result);
|
|
348
|
+
}
|
|
349
|
+
const outputCheck = await this.client.mcpCheckOutput({
|
|
350
|
+
connectorType,
|
|
351
|
+
message: resultStr,
|
|
352
|
+
});
|
|
353
|
+
if (!outputCheck.allowed) {
|
|
354
|
+
throw new errors_1.PolicyViolationError(outputCheck.block_reason || 'Tool result blocked by policy');
|
|
355
|
+
}
|
|
356
|
+
if (outputCheck.redacted_data !== undefined && outputCheck.redacted_data !== null) {
|
|
357
|
+
return outputCheck.redacted_data;
|
|
358
|
+
}
|
|
359
|
+
return result;
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
exports.AxonFlowLangGraphAdapter = AxonFlowLangGraphAdapter;
|
|
364
|
+
//# sourceMappingURL=langgraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"langgraph.js","sourceRoot":"","sources":["../../../src/adapters/langgraph.ts"],"names":[],"mappings":"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"}
|