@mindburn/helm-ai-kernel 0.5.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.
package/README.md ADDED
@@ -0,0 +1,89 @@
1
+ # HELM SDK - TypeScript
2
+
3
+ Typed TypeScript client for the retained HELM kernel API.
4
+
5
+ ## Local Install
6
+
7
+ ```bash
8
+ cd sdk/ts
9
+ npm ci
10
+ npm run build
11
+ ```
12
+
13
+ Package metadata declares version `0.5.1` in `package.json`; this README does
14
+ not claim that a registry package has been published.
15
+
16
+ ## Local Development
17
+
18
+ ```bash
19
+ npm ci
20
+ npm test -- --run
21
+ npm run build
22
+ ```
23
+
24
+ ## Source Layout
25
+
26
+ - `src/client.ts` is the hand-maintained HTTP wrapper.
27
+ - `src/types.gen.ts` contains OpenAPI-derived model types.
28
+ - `src/adapters/agent-frameworks.ts` contains the source-backed framework
29
+ adapter helpers.
30
+ - Protobuf bindings under `src/generated/` are generated from
31
+ `protocols/proto/` with `ts-proto` when codegen has been run.
32
+
33
+ ## Usage
34
+
35
+ ```ts
36
+ import { HelmClient } from "@mindburn/helm-ai-kernel";
37
+
38
+ const client = new HelmClient({ baseUrl: "http://127.0.0.1:7715" });
39
+ const decision = await client.evaluateDecision({
40
+ principal: "example-agent",
41
+ action: "read-ticket",
42
+ resource: "ticket:123",
43
+ });
44
+ console.log(decision.verdict); // ALLOW, DENY, or ESCALATE
45
+ ```
46
+
47
+ Run the first-class local example with `make sdk-examples-smoke` or directly
48
+ from `examples/ts_sdk/`.
49
+
50
+ ## Agent Framework Adapters
51
+
52
+ The TypeScript SDK includes lightweight adapter helpers for LangGraph, CrewAI, OpenAI Agents SDK, PydanticAI, and LlamaIndex tool-call events. These helpers normalize each framework event into a HELM governance request and submit it through `chatCompletionsWithReceipt`, preserving the kernel receipt returned in `X-Helm-*` headers.
53
+
54
+ ```ts
55
+ import { HelmClient, createAgentFrameworkAdapter, fromOpenAIAgentsToolCall } from "@mindburn/helm-ai-kernel";
56
+
57
+ const helm = new HelmClient({ baseUrl: "http://127.0.0.1:7714" });
58
+ const adapter = createAgentFrameworkAdapter(helm, { model: "helm-governance" });
59
+
60
+ const result = await adapter.submit(
61
+ fromOpenAIAgentsToolCall({
62
+ id: "call_123",
63
+ function: {
64
+ name: "crm.update_customer",
65
+ arguments: '{"customer_id":"cus_123","tier":"enterprise"}',
66
+ },
67
+ }),
68
+ );
69
+
70
+ console.log(result.governance.receiptId);
71
+ ```
72
+
73
+ The helpers do not add Microsoft Agent Governance Toolkit as a dependency and
74
+ do not claim Microsoft certification. They cover the same framework families
75
+ so HELM can sit behind AGT or another orchestrator as the receipt-bearing
76
+ enforcement boundary.
77
+
78
+ ## Execution Boundary Methods
79
+
80
+ The client also exposes methods for proof-bearing boundary operations:
81
+ evidence envelope manifests, boundary records and checkpoints, conformance
82
+ vectors, MCP quarantine and authorization profiles, sandbox profiles and
83
+ grants, authz snapshots, approvals, budgets, telemetry export, and coexistence
84
+ capabilities. These methods keep external envelopes, MCP quarantine decisions,
85
+ and sandbox grants attached to HELM-native receipts and EvidencePacks.
86
+
87
+ ## Release Notes
88
+
89
+ `0.5.1` is the release-hardening patch with the retained OpenAPI client surface and protobuf message bindings.
@@ -0,0 +1,160 @@
1
+ import type { ChatCompletionWithReceipt } from "../client.js";
2
+ import type { ChatCompletionRequest, ChatCompletionRequestToolsInner } from "../types.gen.js";
3
+ export type AgentFramework = "langchain" | "langgraph" | "autogen" | "crewai" | "openai-agents" | "semantic-kernel" | "pydantic-ai" | "llamaindex" | "litellm" | "n8n" | "zapier-webhook" | "raw-mcp";
4
+ export interface AgentFrameworkAdapterMetadata {
5
+ framework: AgentFramework;
6
+ displayName: string;
7
+ status: "compatible";
8
+ source: string;
9
+ }
10
+ export declare const agentFrameworkAdapters: AgentFrameworkAdapterMetadata[];
11
+ export interface AgentFrameworkAction {
12
+ framework: AgentFramework;
13
+ toolName: string;
14
+ arguments: Record<string, unknown>;
15
+ toolCallId?: string;
16
+ agentId?: string;
17
+ runId?: string;
18
+ taskId?: string;
19
+ actor?: string;
20
+ description?: string;
21
+ metadata?: Record<string, unknown>;
22
+ }
23
+ export interface FrameworkAdapterOptions {
24
+ model: string;
25
+ policyPrompt?: string;
26
+ temperature?: number;
27
+ maxTokens?: number;
28
+ }
29
+ export interface FrameworkAdapterDefaults extends FrameworkAdapterOptions {
30
+ metadata?: Record<string, unknown>;
31
+ }
32
+ export interface HelmGovernanceClient {
33
+ chatCompletionsWithReceipt(req: ChatCompletionRequest): Promise<ChatCompletionWithReceipt>;
34
+ }
35
+ export interface GovernedFrameworkResult extends ChatCompletionWithReceipt {
36
+ request: ChatCompletionRequest;
37
+ action: AgentFrameworkAction;
38
+ }
39
+ export interface LangGraphToolCall {
40
+ id?: string;
41
+ name?: string;
42
+ tool?: string;
43
+ args?: unknown;
44
+ arguments?: unknown;
45
+ metadata?: Record<string, unknown>;
46
+ }
47
+ export interface LangChainToolCall extends LangGraphToolCall {
48
+ runId?: string;
49
+ }
50
+ export interface CrewAITaskCall {
51
+ id?: string;
52
+ task?: string;
53
+ taskId?: string;
54
+ tool?: string | {
55
+ name?: string;
56
+ description?: string;
57
+ };
58
+ input?: unknown;
59
+ args?: unknown;
60
+ agent?: string;
61
+ crew?: string;
62
+ metadata?: Record<string, unknown>;
63
+ }
64
+ export interface OpenAIAgentsToolCall {
65
+ id?: string;
66
+ name?: string;
67
+ arguments?: unknown;
68
+ function?: {
69
+ name?: string;
70
+ arguments?: unknown;
71
+ };
72
+ metadata?: Record<string, unknown>;
73
+ }
74
+ export interface AutoGenToolCall {
75
+ id?: string;
76
+ name?: string;
77
+ tool?: string;
78
+ arguments?: unknown;
79
+ args?: unknown;
80
+ agent?: string;
81
+ conversationId?: string;
82
+ metadata?: Record<string, unknown>;
83
+ }
84
+ export interface SemanticKernelFunctionCall {
85
+ id?: string;
86
+ functionName?: string;
87
+ pluginName?: string;
88
+ arguments?: unknown;
89
+ args?: unknown;
90
+ metadata?: Record<string, unknown>;
91
+ }
92
+ export interface PydanticAIToolCall {
93
+ id?: string;
94
+ tool_call_id?: string;
95
+ tool_name?: string;
96
+ name?: string;
97
+ args?: unknown;
98
+ arguments?: unknown;
99
+ agent?: string;
100
+ metadata?: Record<string, unknown>;
101
+ }
102
+ export interface LlamaIndexToolCall {
103
+ id?: string;
104
+ toolName?: string;
105
+ tool_name?: string;
106
+ name?: string;
107
+ kwargs?: unknown;
108
+ input?: unknown;
109
+ agent?: string;
110
+ metadata?: Record<string, unknown>;
111
+ }
112
+ export interface LiteLLMToolCall extends OpenAIAgentsToolCall {
113
+ model?: string;
114
+ }
115
+ export interface N8NNodeExecution {
116
+ id?: string;
117
+ node?: string;
118
+ name?: string;
119
+ parameters?: unknown;
120
+ input?: unknown;
121
+ workflowId?: string;
122
+ metadata?: Record<string, unknown>;
123
+ }
124
+ export interface ZapierWebhookCall {
125
+ id?: string;
126
+ zapId?: string;
127
+ action?: string;
128
+ tool?: string;
129
+ payload?: unknown;
130
+ metadata?: Record<string, unknown>;
131
+ }
132
+ export interface RawMCPToolCall {
133
+ id?: string;
134
+ serverId?: string;
135
+ name?: string;
136
+ toolName?: string;
137
+ arguments?: unknown;
138
+ args?: unknown;
139
+ scopes?: string[];
140
+ metadata?: Record<string, unknown>;
141
+ }
142
+ export declare function fromLangGraphToolCall(call: LangGraphToolCall): AgentFrameworkAction;
143
+ export declare function fromLangChainToolCall(call: LangChainToolCall): AgentFrameworkAction;
144
+ export declare function fromCrewAITask(call: CrewAITaskCall): AgentFrameworkAction;
145
+ export declare function fromOpenAIAgentsToolCall(call: OpenAIAgentsToolCall): AgentFrameworkAction;
146
+ export declare function fromAutoGenToolCall(call: AutoGenToolCall): AgentFrameworkAction;
147
+ export declare function fromSemanticKernelFunctionCall(call: SemanticKernelFunctionCall): AgentFrameworkAction;
148
+ export declare function fromPydanticAIToolCall(call: PydanticAIToolCall): AgentFrameworkAction;
149
+ export declare function fromLlamaIndexToolCall(call: LlamaIndexToolCall): AgentFrameworkAction;
150
+ export declare function fromLiteLLMToolCall(call: LiteLLMToolCall): AgentFrameworkAction;
151
+ export declare function fromN8NNodeExecution(call: N8NNodeExecution): AgentFrameworkAction;
152
+ export declare function fromZapierWebhookCall(call: ZapierWebhookCall): AgentFrameworkAction;
153
+ export declare function fromRawMCPToolCall(call: RawMCPToolCall): AgentFrameworkAction;
154
+ export declare function buildGovernedToolRequest(action: AgentFrameworkAction, options: FrameworkAdapterOptions): ChatCompletionRequest;
155
+ export declare function toOpenAIFunctionTool(action: AgentFrameworkAction): ChatCompletionRequestToolsInner;
156
+ export declare function submitGovernedToolIntent(client: HelmGovernanceClient, action: AgentFrameworkAction, options: FrameworkAdapterOptions): Promise<GovernedFrameworkResult>;
157
+ export declare function createAgentFrameworkAdapter(client: HelmGovernanceClient, defaults: FrameworkAdapterDefaults): {
158
+ buildRequest(action: AgentFrameworkAction, options?: Partial<FrameworkAdapterOptions>): ChatCompletionRequest;
159
+ submit(action: AgentFrameworkAction, options?: Partial<FrameworkAdapterOptions>): Promise<GovernedFrameworkResult>;
160
+ };
@@ -0,0 +1,289 @@
1
+ export const agentFrameworkAdapters = [
2
+ {
3
+ framework: "langchain",
4
+ displayName: "LangChain",
5
+ status: "compatible",
6
+ source: "TypeScript SDK",
7
+ },
8
+ {
9
+ framework: "langgraph",
10
+ displayName: "LangGraph",
11
+ status: "compatible",
12
+ source: "TypeScript SDK",
13
+ },
14
+ {
15
+ framework: "autogen",
16
+ displayName: "AutoGen",
17
+ status: "compatible",
18
+ source: "TypeScript SDK",
19
+ },
20
+ {
21
+ framework: "crewai",
22
+ displayName: "CrewAI",
23
+ status: "compatible",
24
+ source: "TypeScript SDK",
25
+ },
26
+ {
27
+ framework: "openai-agents",
28
+ displayName: "OpenAI Agents SDK",
29
+ status: "compatible",
30
+ source: "TypeScript SDK",
31
+ },
32
+ {
33
+ framework: "semantic-kernel",
34
+ displayName: "Semantic Kernel",
35
+ status: "compatible",
36
+ source: "TypeScript SDK",
37
+ },
38
+ {
39
+ framework: "pydantic-ai",
40
+ displayName: "PydanticAI",
41
+ status: "compatible",
42
+ source: "TypeScript SDK",
43
+ },
44
+ {
45
+ framework: "llamaindex",
46
+ displayName: "LlamaIndex",
47
+ status: "compatible",
48
+ source: "TypeScript SDK",
49
+ },
50
+ {
51
+ framework: "litellm",
52
+ displayName: "LiteLLM",
53
+ status: "compatible",
54
+ source: "TypeScript SDK",
55
+ },
56
+ {
57
+ framework: "n8n",
58
+ displayName: "n8n",
59
+ status: "compatible",
60
+ source: "TypeScript SDK",
61
+ },
62
+ {
63
+ framework: "zapier-webhook",
64
+ displayName: "Zapier-style webhook",
65
+ status: "compatible",
66
+ source: "TypeScript SDK",
67
+ },
68
+ {
69
+ framework: "raw-mcp",
70
+ displayName: "Raw MCP client",
71
+ status: "compatible",
72
+ source: "TypeScript SDK",
73
+ },
74
+ ];
75
+ const DEFAULT_POLICY_PROMPT = "Evaluate whether this agent framework tool call may execute through HELM policy. Return a normal chat completion and rely on HELM response headers for the governance receipt.";
76
+ export function fromLangGraphToolCall(call) {
77
+ return frameworkAction("langgraph", call.name ?? call.tool, call.args ?? call.arguments, {
78
+ toolCallId: call.id,
79
+ metadata: call.metadata,
80
+ });
81
+ }
82
+ export function fromLangChainToolCall(call) {
83
+ return frameworkAction("langchain", call.name ?? call.tool, call.args ?? call.arguments, {
84
+ toolCallId: call.id,
85
+ runId: call.runId,
86
+ metadata: call.metadata,
87
+ });
88
+ }
89
+ export function fromCrewAITask(call) {
90
+ const tool = typeof call.tool === "string" ? call.tool : call.tool?.name;
91
+ return frameworkAction("crewai", tool, call.input ?? call.args, {
92
+ toolCallId: call.id,
93
+ taskId: call.taskId ?? call.task,
94
+ agentId: call.agent ?? call.crew,
95
+ description: typeof call.tool === "string" ? undefined : call.tool?.description,
96
+ metadata: call.metadata,
97
+ });
98
+ }
99
+ export function fromOpenAIAgentsToolCall(call) {
100
+ return frameworkAction("openai-agents", call.function?.name ?? call.name, call.function?.arguments ?? call.arguments, {
101
+ toolCallId: call.id,
102
+ metadata: call.metadata,
103
+ });
104
+ }
105
+ export function fromAutoGenToolCall(call) {
106
+ return frameworkAction("autogen", call.name ?? call.tool, call.arguments ?? call.args, {
107
+ toolCallId: call.id,
108
+ agentId: call.agent,
109
+ runId: call.conversationId,
110
+ metadata: call.metadata,
111
+ });
112
+ }
113
+ export function fromSemanticKernelFunctionCall(call) {
114
+ const toolName = call.pluginName && call.functionName
115
+ ? `${call.pluginName}.${call.functionName}`
116
+ : call.functionName;
117
+ return frameworkAction("semantic-kernel", toolName, call.arguments ?? call.args, {
118
+ toolCallId: call.id,
119
+ metadata: call.metadata,
120
+ });
121
+ }
122
+ export function fromPydanticAIToolCall(call) {
123
+ return frameworkAction("pydantic-ai", call.tool_name ?? call.name, call.args ?? call.arguments, {
124
+ toolCallId: call.tool_call_id ?? call.id,
125
+ agentId: call.agent,
126
+ metadata: call.metadata,
127
+ });
128
+ }
129
+ export function fromLlamaIndexToolCall(call) {
130
+ return frameworkAction("llamaindex", call.toolName ?? call.tool_name ?? call.name, call.kwargs ?? call.input, {
131
+ toolCallId: call.id,
132
+ agentId: call.agent,
133
+ metadata: call.metadata,
134
+ });
135
+ }
136
+ export function fromLiteLLMToolCall(call) {
137
+ const action = fromOpenAIAgentsToolCall(call);
138
+ return {
139
+ ...action,
140
+ framework: "litellm",
141
+ metadata: { model: call.model, ...action.metadata },
142
+ };
143
+ }
144
+ export function fromN8NNodeExecution(call) {
145
+ return frameworkAction("n8n", call.node ?? call.name, call.parameters ?? call.input, {
146
+ toolCallId: call.id,
147
+ runId: call.workflowId,
148
+ metadata: call.metadata,
149
+ });
150
+ }
151
+ export function fromZapierWebhookCall(call) {
152
+ return frameworkAction("zapier-webhook", call.action ?? call.tool, call.payload, {
153
+ toolCallId: call.id,
154
+ runId: call.zapId,
155
+ metadata: call.metadata,
156
+ });
157
+ }
158
+ export function fromRawMCPToolCall(call) {
159
+ return frameworkAction("raw-mcp", call.toolName ?? call.name, call.arguments ?? call.args, {
160
+ toolCallId: call.id,
161
+ agentId: call.serverId,
162
+ metadata: { scopes: call.scopes, ...call.metadata },
163
+ });
164
+ }
165
+ export function buildGovernedToolRequest(action, options) {
166
+ const tool = toOpenAIFunctionTool(action);
167
+ const payload = {
168
+ framework: action.framework,
169
+ tool_name: action.toolName,
170
+ tool_call_id: action.toolCallId,
171
+ agent_id: action.agentId,
172
+ run_id: action.runId,
173
+ task_id: action.taskId,
174
+ actor: action.actor,
175
+ arguments: action.arguments,
176
+ metadata: action.metadata,
177
+ };
178
+ return {
179
+ model: options.model,
180
+ temperature: options.temperature ?? 0,
181
+ max_tokens: options.maxTokens,
182
+ messages: [
183
+ {
184
+ role: "system",
185
+ content: options.policyPrompt ?? DEFAULT_POLICY_PROMPT,
186
+ },
187
+ {
188
+ role: "user",
189
+ content: `Authorize this ${displayName(action.framework)} tool call before execution.\n${JSON.stringify(payload, null, 2)}`,
190
+ },
191
+ ],
192
+ tools: [tool],
193
+ };
194
+ }
195
+ export function toOpenAIFunctionTool(action) {
196
+ return {
197
+ type: "function",
198
+ _function: {
199
+ name: normalizeToolName(action.toolName),
200
+ description: action.description ??
201
+ `${displayName(action.framework)} tool call: ${action.toolName}`,
202
+ parameters: {
203
+ type: "object",
204
+ additionalProperties: true,
205
+ properties: {},
206
+ },
207
+ },
208
+ };
209
+ }
210
+ export async function submitGovernedToolIntent(client, action, options) {
211
+ const request = buildGovernedToolRequest(action, options);
212
+ const result = await client.chatCompletionsWithReceipt(request);
213
+ return { ...result, request, action };
214
+ }
215
+ export function createAgentFrameworkAdapter(client, defaults) {
216
+ return {
217
+ buildRequest(action, options = {}) {
218
+ return buildGovernedToolRequest(mergeDefaults(action, defaults), mergeOptions(defaults, options));
219
+ },
220
+ submit(action, options = {}) {
221
+ const mergedAction = mergeDefaults(action, defaults);
222
+ return submitGovernedToolIntent(client, mergedAction, mergeOptions(defaults, options));
223
+ },
224
+ };
225
+ }
226
+ function frameworkAction(framework, toolName, args, optional) {
227
+ if (!toolName?.trim()) {
228
+ throw new TypeError(`${framework} adapter requires a tool name`);
229
+ }
230
+ return {
231
+ framework,
232
+ toolName,
233
+ arguments: normalizeArguments(args),
234
+ ...optional,
235
+ };
236
+ }
237
+ function normalizeArguments(args) {
238
+ if (args == null)
239
+ return {};
240
+ if (typeof args === "string") {
241
+ const trimmed = args.trim();
242
+ if (!trimmed)
243
+ return {};
244
+ try {
245
+ return normalizeArguments(JSON.parse(trimmed));
246
+ }
247
+ catch {
248
+ return { value: args };
249
+ }
250
+ }
251
+ if (Array.isArray(args)) {
252
+ return { items: args };
253
+ }
254
+ if (typeof args === "object") {
255
+ return args;
256
+ }
257
+ return { value: args };
258
+ }
259
+ function normalizeToolName(name) {
260
+ const normalized = name
261
+ .trim()
262
+ .replace(/[^A-Za-z0-9_-]/g, "_")
263
+ .slice(0, 64);
264
+ if (!normalized) {
265
+ throw new TypeError("tool name normalizes to an empty OpenAI function name");
266
+ }
267
+ return normalized;
268
+ }
269
+ function mergeDefaults(action, defaults) {
270
+ return {
271
+ ...action,
272
+ metadata: {
273
+ ...defaults.metadata,
274
+ ...action.metadata,
275
+ },
276
+ };
277
+ }
278
+ function mergeOptions(defaults, options) {
279
+ return {
280
+ model: options.model ?? defaults.model,
281
+ policyPrompt: options.policyPrompt ?? defaults.policyPrompt,
282
+ temperature: options.temperature ?? defaults.temperature,
283
+ maxTokens: options.maxTokens ?? defaults.maxTokens,
284
+ };
285
+ }
286
+ function displayName(framework) {
287
+ return (agentFrameworkAdapters.find((adapter) => adapter.framework === framework)
288
+ ?.displayName ?? framework);
289
+ }
@@ -0,0 +1 @@
1
+ export {};