@clampd/sdk 0.5.2 → 0.6.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.
@@ -0,0 +1,245 @@
1
+ /**
2
+ * Stream interception for OpenAI and Anthropic streaming responses.
3
+ *
4
+ * Accumulates tool call chunks from streaming responses, guards them
5
+ * through the Clampd proxy, and only releases chunks once approved.
6
+ * Text/content chunks pass through immediately with zero added latency.
7
+ */
8
+ import { ClampdBlockedError } from "./interceptor.js";
9
+ import { withDelegation, getDelegation, getCallerAgentId } from "./delegation.js";
10
+ // ── Proxy helper ─────────────────────────────────────────────────
11
+ async function guardToolCall(client, toolName, toolArgs, opts) {
12
+ await withDelegation(opts.agentId, async () => {
13
+ const delegation = getDelegation();
14
+ const proxyParams = { ...toolArgs };
15
+ if (delegation && delegation.chain.length > 1) {
16
+ proxyParams._delegation = {
17
+ caller_agent_id: getCallerAgentId(),
18
+ delegation_chain: delegation.chain,
19
+ delegation_trace_id: delegation.traceId,
20
+ };
21
+ }
22
+ try {
23
+ const res = await client.proxy(toolName, proxyParams, opts.targetUrl ?? "", undefined, undefined, opts.authorizedTools);
24
+ if (!res.allowed) {
25
+ // Respect failOpen for gateway errors
26
+ if (opts.failOpen && res._gatewayError) {
27
+ return;
28
+ }
29
+ throw new ClampdBlockedError(res);
30
+ }
31
+ }
32
+ catch (e) {
33
+ if (e instanceof ClampdBlockedError)
34
+ throw e;
35
+ if (!opts.failOpen)
36
+ throw new ClampdBlockedError({
37
+ request_id: "error",
38
+ allowed: false,
39
+ risk_score: 1.0,
40
+ denial_reason: String(e),
41
+ latency_ms: 0,
42
+ degraded_stages: [],
43
+ session_flags: [],
44
+ });
45
+ }
46
+ });
47
+ }
48
+ // ── OpenAI stream guard ──────────────────────────────────────────
49
+ /**
50
+ * Wraps an OpenAI streaming async iterable to intercept tool calls.
51
+ * Text chunks pass through immediately. Tool call chunks are buffered
52
+ * until complete, then guarded through the proxy before being released.
53
+ *
54
+ * Uses a SHARED buffer (not per-tool-call) for two reasons:
55
+ *
56
+ * 1. OpenAI sends a single chunk with deltas for multiple tool calls.
57
+ * Per-tool-call buffers would either lose chunks (only store in one)
58
+ * or duplicate them (store in all, yield the same chunk N times).
59
+ *
60
+ * 2. Parallel tool calls in the same LLM response are atomic — if the
61
+ * model says "call weather AND calendar", both must be approved before
62
+ * either executes. If one is denied, the entire response is blocked.
63
+ * Partial release of one tool call's chunks would give the consumer
64
+ * an incomplete response that can't be acted on.
65
+ */
66
+ export function guardOpenAIStream(stream, client, opts) {
67
+ const guardedIterator = async function* () {
68
+ const pending = new Map();
69
+ // Shared buffer: all tool call chunks held until ALL tool calls are guarded.
70
+ const bufferedChunks = [];
71
+ let hasToolCalls = false;
72
+ for await (const rawChunk of stream) {
73
+ const chunk = rawChunk;
74
+ const choice = chunk.choices?.[0];
75
+ if (!choice?.delta?.tool_calls?.length) {
76
+ // No tool call data — yield text/other chunks immediately
77
+ // But only if we haven't started accumulating tool calls,
78
+ // or if this is a non-tool chunk interleaved
79
+ if (!hasToolCalls) {
80
+ yield chunk;
81
+ continue;
82
+ }
83
+ // Buffer finish chunks until tool calls are guarded
84
+ if (choice?.finish_reason) {
85
+ // Guard all accumulated tool calls now
86
+ for (const [, tc] of pending) {
87
+ const argsStr = tc.argumentFragments.join("");
88
+ let toolArgs;
89
+ try {
90
+ toolArgs = JSON.parse(argsStr);
91
+ }
92
+ catch {
93
+ toolArgs = { raw: argsStr };
94
+ }
95
+ await guardToolCall(client, tc.name, toolArgs, opts);
96
+ }
97
+ // Release all buffered chunks
98
+ for (const buffered of bufferedChunks) {
99
+ yield buffered;
100
+ }
101
+ bufferedChunks.length = 0;
102
+ pending.clear();
103
+ hasToolCalls = false;
104
+ // Now yield the finish chunk
105
+ yield chunk;
106
+ continue;
107
+ }
108
+ yield chunk;
109
+ continue;
110
+ }
111
+ // Tool call deltas present — buffer them
112
+ hasToolCalls = true;
113
+ for (const tcDelta of choice.delta.tool_calls) {
114
+ const idx = tcDelta.index;
115
+ if (!pending.has(idx)) {
116
+ pending.set(idx, {
117
+ index: idx,
118
+ name: tcDelta.function?.name ?? "unknown",
119
+ argumentFragments: [],
120
+ });
121
+ }
122
+ const tc = pending.get(idx);
123
+ if (tcDelta.function?.name && !tc.name) {
124
+ tc.name = tcDelta.function.name;
125
+ }
126
+ if (tcDelta.function?.arguments) {
127
+ tc.argumentFragments.push(tcDelta.function.arguments);
128
+ }
129
+ }
130
+ // Buffer the entire chunk (released after guard approval)
131
+ bufferedChunks.push(chunk);
132
+ }
133
+ // Stream ended — guard any remaining tool calls
134
+ if (pending.size > 0) {
135
+ for (const [, tc] of pending) {
136
+ const argsStr = tc.argumentFragments.join("");
137
+ let toolArgs;
138
+ try {
139
+ toolArgs = JSON.parse(argsStr);
140
+ }
141
+ catch {
142
+ toolArgs = { raw: argsStr };
143
+ }
144
+ await guardToolCall(client, tc.name, toolArgs, opts);
145
+ }
146
+ for (const buffered of bufferedChunks) {
147
+ yield buffered;
148
+ }
149
+ }
150
+ };
151
+ // Return a Proxy that intercepts Symbol.asyncIterator but delegates
152
+ // everything else (e.g. .controller, .toReadableStream()) to the original
153
+ return new Proxy(stream, {
154
+ get(target, prop, receiver) {
155
+ if (prop === Symbol.asyncIterator) {
156
+ return () => guardedIterator();
157
+ }
158
+ return Reflect.get(target, prop, receiver);
159
+ },
160
+ });
161
+ }
162
+ // ── Anthropic stream guard ───────────────────────────────────────
163
+ /**
164
+ * Wraps an Anthropic streaming async iterable to intercept tool_use blocks.
165
+ * Text events pass through immediately. Tool use events are buffered per-block,
166
+ * guarded at content_block_stop, then released.
167
+ */
168
+ export function guardAnthropicStream(stream, client, opts) {
169
+ const guardedIterator = async function* () {
170
+ let currentToolCall = null;
171
+ for await (const rawEvent of stream) {
172
+ const event = rawEvent;
173
+ switch (event.type) {
174
+ case "content_block_start": {
175
+ if (event.content_block?.type === "tool_use") {
176
+ // Start buffering a tool_use block
177
+ currentToolCall = {
178
+ blockIndex: event.index ?? 0,
179
+ name: event.content_block.name ?? "unknown",
180
+ jsonFragments: [],
181
+ bufferedEvents: [event],
182
+ };
183
+ }
184
+ else {
185
+ // Text block start — pass through
186
+ yield event;
187
+ }
188
+ break;
189
+ }
190
+ case "content_block_delta": {
191
+ if (currentToolCall && event.delta?.type === "input_json_delta") {
192
+ // Accumulate JSON fragments for the tool call
193
+ if (event.delta.partial_json) {
194
+ currentToolCall.jsonFragments.push(event.delta.partial_json);
195
+ }
196
+ currentToolCall.bufferedEvents.push(event);
197
+ }
198
+ else {
199
+ // Text delta — pass through
200
+ yield event;
201
+ }
202
+ break;
203
+ }
204
+ case "content_block_stop": {
205
+ if (currentToolCall && event.index === currentToolCall.blockIndex) {
206
+ // Tool block complete — guard it
207
+ currentToolCall.bufferedEvents.push(event);
208
+ const argsStr = currentToolCall.jsonFragments.join("");
209
+ let toolArgs;
210
+ try {
211
+ toolArgs = argsStr ? JSON.parse(argsStr) : {};
212
+ }
213
+ catch {
214
+ toolArgs = { raw: argsStr };
215
+ }
216
+ await guardToolCall(client, currentToolCall.name, toolArgs, opts);
217
+ // Allowed — release buffered events
218
+ for (const buffered of currentToolCall.bufferedEvents) {
219
+ yield buffered;
220
+ }
221
+ currentToolCall = null;
222
+ }
223
+ else {
224
+ // Text block stop — pass through
225
+ yield event;
226
+ }
227
+ break;
228
+ }
229
+ default:
230
+ // message_start, message_delta, message_stop, ping — pass through
231
+ yield event;
232
+ break;
233
+ }
234
+ }
235
+ };
236
+ return new Proxy(stream, {
237
+ get(target, prop, receiver) {
238
+ if (prop === Symbol.asyncIterator) {
239
+ return () => guardedIterator();
240
+ }
241
+ return Reflect.get(target, prop, receiver);
242
+ },
243
+ });
244
+ }
245
+ //# sourceMappingURL=stream-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-guard.js","sourceRoot":"","sources":["../src/stream-guard.ts"],"names":[],"mappings":"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"}
@@ -136,7 +136,7 @@ export async function verifyScopeToken(token, publicKey, gatewayUrl) {
136
136
  throw new ScopeVerificationError(`Signature decode error: ${e}`);
137
137
  }
138
138
  // Verify Ed25519 signature
139
- const isValid = verify("ed25519", Buffer.from(payloadB64), pubKey, sigBytes);
139
+ const isValid = verify(null, Buffer.from(payloadB64), pubKey, sigBytes);
140
140
  if (!isValid) {
141
141
  invalidateJwksCache();
142
142
  throw new ScopeVerificationError("Invalid signature");
@@ -1 +1 @@
1
- {"version":3,"file":"tool-verify.js","sourceRoot":"","sources":["../src/tool-verify.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tool-verify.js","sourceRoot":"","sources":["../src/tool-verify.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,19 +1,19 @@
1
1
  {
2
2
  "name": "@clampd/sdk",
3
- "version": "0.5.2",
3
+ "version": "0.6.0",
4
4
  "description": "Runtime security SDK for AI agents — guard tool calls in 1 line",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
8
8
  "exports": {
9
9
  ".": {
10
+ "types": "./dist/index.d.ts",
10
11
  "import": "./dist/index.js",
11
- "require": "./dist/index.cjs",
12
- "types": "./dist/index.d.ts"
12
+ "require": "./dist/index.cjs"
13
13
  },
14
14
  "./langchain": {
15
- "import": "./dist/langchain.js",
16
- "types": "./dist/langchain.d.ts"
15
+ "types": "./dist/langchain.d.ts",
16
+ "import": "./dist/langchain.js"
17
17
  }
18
18
  },
19
19
  "files": [
@@ -62,5 +62,9 @@
62
62
  "@langchain/core": {
63
63
  "optional": true
64
64
  }
65
+ },
66
+ "dependencies": {
67
+ "dotenv": "^17.3.1",
68
+ "openai": "^6.33.0"
65
69
  }
66
70
  }