@clampd/sdk 0.5.1 → 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.
- package/README.md +76 -23
- package/dist/client.d.ts +29 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +104 -39
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +63 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +226 -22
- package/dist/index.js.map +1 -1
- package/dist/langchain.d.ts +30 -0
- package/dist/langchain.d.ts.map +1 -0
- package/dist/langchain.js +66 -0
- package/dist/langchain.js.map +1 -0
- package/dist/stream-guard.d.ts +39 -0
- package/dist/stream-guard.d.ts.map +1 -0
- package/dist/stream-guard.js +245 -0
- package/dist/stream-guard.js.map +1 -0
- package/dist/tool-verify.js +1 -1
- package/dist/tool-verify.js.map +1 -1
- package/package.json +14 -4
|
@@ -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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"}
|
package/dist/tool-verify.js
CHANGED
|
@@ -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(
|
|
139
|
+
const isValid = verify(null, Buffer.from(payloadB64), pubKey, sigBytes);
|
|
140
140
|
if (!isValid) {
|
|
141
141
|
invalidateJwksCache();
|
|
142
142
|
throw new ScopeVerificationError("Invalid signature");
|
package/dist/tool-verify.js.map
CHANGED
|
@@ -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,15 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clampd/sdk",
|
|
3
|
-
"version": "0.
|
|
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
|
-
|
|
12
|
+
"require": "./dist/index.cjs"
|
|
13
|
+
},
|
|
14
|
+
"./langchain": {
|
|
15
|
+
"types": "./dist/langchain.d.ts",
|
|
16
|
+
"import": "./dist/langchain.js"
|
|
13
17
|
}
|
|
14
18
|
},
|
|
15
19
|
"files": [
|
|
@@ -45,9 +49,11 @@
|
|
|
45
49
|
"node": ">=18.0.0"
|
|
46
50
|
},
|
|
47
51
|
"devDependencies": {
|
|
52
|
+
"@langchain/core": "^1.1.35",
|
|
48
53
|
"@types/node": "^20.14.0",
|
|
49
54
|
"typescript": "^5.9.3",
|
|
50
|
-
"vitest": "^3.2.4"
|
|
55
|
+
"vitest": "^3.2.4",
|
|
56
|
+
"zod": "^4.3.6"
|
|
51
57
|
},
|
|
52
58
|
"peerDependencies": {
|
|
53
59
|
"@langchain/core": ">=0.2.0"
|
|
@@ -56,5 +62,9 @@
|
|
|
56
62
|
"@langchain/core": {
|
|
57
63
|
"optional": true
|
|
58
64
|
}
|
|
65
|
+
},
|
|
66
|
+
"dependencies": {
|
|
67
|
+
"dotenv": "^17.3.1",
|
|
68
|
+
"openai": "^6.33.0"
|
|
59
69
|
}
|
|
60
70
|
}
|