@clampd/sdk 0.4.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,76 @@
1
+ /**
2
+ * Clampd TypeScript SDK — Guard AI agent tool calls in 1 line.
3
+ *
4
+ * @example
5
+ * ```ts
6
+ * import clampd from "@clampd/sdk";
7
+ *
8
+ * // Guard OpenAI tool calls
9
+ * const client = clampd.openai(new OpenAI(), { agentId: "my-agent" });
10
+ *
11
+ * // Guard Anthropic/Claude tool calls
12
+ * const client = clampd.anthropic(new Anthropic(), { agentId: "my-agent" });
13
+ *
14
+ * // Guard any function
15
+ * const safeFn = clampd.guard(myFn, { agentId: "my-agent", toolName: "db.query" });
16
+ *
17
+ * // Guard OpenAI tool definitions
18
+ * const safeTools = clampd.tools(myTools, { agentId: "my-agent" });
19
+ * ```
20
+ */
21
+ import { ClampdClient } from "./client.js";
22
+ import { type OpenAITool } from "./interceptor.js";
23
+ import { delegationHeaders } from "./delegation.js";
24
+ export { ClampdClient, type ClampdClientOptions, type ProxyResponse, type ScanResponse, type ScanOutputResponse } from "./client.js";
25
+ export { makeAgentJwt } from "./auth.js";
26
+ export { ClampdBlockedError, type OpenAITool } from "./interceptor.js";
27
+ export { withDelegation, getDelegation, getCallerAgentId, delegationHeaders, type DelegationContext } from "./delegation.js";
28
+ export { verifyScopeToken, requireScope, getCurrentScopeToken, ScopeVerificationError, withScopeToken, setScopeToken, fetchJwks, invalidateJwksCache } from "./tool-verify.js";
29
+ export type { ScopeTokenClaims } from "./tool-verify.js";
30
+ interface InitOptions {
31
+ agentId: string;
32
+ gatewayUrl?: string;
33
+ apiKey?: string;
34
+ secret?: string;
35
+ }
36
+ interface GuardOptions {
37
+ agentId?: string;
38
+ toolName: string;
39
+ targetUrl?: string;
40
+ failOpen?: boolean;
41
+ checkResponse?: boolean;
42
+ }
43
+ interface WrapOptions {
44
+ agentId?: string;
45
+ targetUrl?: string;
46
+ failOpen?: boolean;
47
+ checkResponse?: boolean;
48
+ scanInput?: boolean;
49
+ scanOutput?: boolean;
50
+ }
51
+ declare function init(opts: InitOptions): ClampdClient;
52
+ declare function guard<TArgs extends unknown[], TReturn>(fn: (...args: TArgs) => Promise<TReturn>, opts: GuardOptions): (...args: TArgs) => Promise<TReturn>;
53
+ declare function tools(toolDefs: OpenAITool[], opts: WrapOptions): OpenAITool[];
54
+ type AnyFunction = (...args: any[]) => Promise<unknown>;
55
+ declare function openai<T extends {
56
+ chat: {
57
+ completions: {
58
+ create: AnyFunction;
59
+ };
60
+ };
61
+ }>(client: T, opts: WrapOptions): T;
62
+ declare function anthropic<T extends {
63
+ messages: {
64
+ create: AnyFunction;
65
+ };
66
+ }>(client: T, opts: WrapOptions): T;
67
+ declare const clampd: {
68
+ init: typeof init;
69
+ guard: typeof guard;
70
+ tools: typeof tools;
71
+ openai: typeof openai;
72
+ anthropic: typeof anthropic;
73
+ delegationHeaders: typeof delegationHeaders;
74
+ };
75
+ export default clampd;
76
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EAAE,YAAY,EAA4F,MAAM,aAAa,CAAC;AAErI,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAmD,iBAAiB,EAA0B,MAAM,iBAAiB,CAAC;AAE7H,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACrI,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC7H,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC/K,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAMzD,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,YAAY;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,UAAU,WAAW;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAuBD,iBAAS,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,YAAY,CAQ7C;AA6BD,iBAAS,KAAK,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,EAC7C,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,EACxC,IAAI,EAAE,YAAY,GACjB,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,CAkDtC;AAID,iBAAS,KAAK,CACZ,QAAQ,EAAE,UAAU,EAAE,EACtB,IAAI,EAAE,WAAW,GAChB,UAAU,EAAE,CAiCd;AA+BD,KAAK,WAAW,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAIxD,iBAAS,MAAM,CAAC,CAAC,SAAS;IAAE,IAAI,EAAE;QAAE,WAAW,EAAE;YAAE,MAAM,EAAE,WAAW,CAAA;SAAE,CAAA;KAAE,CAAA;CAAE,EAC1E,MAAM,EAAE,CAAC,EACT,IAAI,EAAE,WAAW,GAChB,CAAC,CAiJH;AAID,iBAAS,SAAS,CAAC,CAAC,SAAS;IAAE,QAAQ,EAAE;QAAE,MAAM,EAAE,WAAW,CAAA;KAAE,CAAA;CAAE,EAChE,MAAM,EAAE,CAAC,EACT,IAAI,EAAE,WAAW,GAChB,CAAC,CA+JH;AAID,QAAA,MAAM,MAAM;;;;;;;CAA+D,CAAC;AAC5E,eAAe,MAAM,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,472 @@
1
+ /**
2
+ * Clampd TypeScript SDK — Guard AI agent tool calls in 1 line.
3
+ *
4
+ * @example
5
+ * ```ts
6
+ * import clampd from "@clampd/sdk";
7
+ *
8
+ * // Guard OpenAI tool calls
9
+ * const client = clampd.openai(new OpenAI(), { agentId: "my-agent" });
10
+ *
11
+ * // Guard Anthropic/Claude tool calls
12
+ * const client = clampd.anthropic(new Anthropic(), { agentId: "my-agent" });
13
+ *
14
+ * // Guard any function
15
+ * const safeFn = clampd.guard(myFn, { agentId: "my-agent", toolName: "db.query" });
16
+ *
17
+ * // Guard OpenAI tool definitions
18
+ * const safeTools = clampd.tools(myTools, { agentId: "my-agent" });
19
+ * ```
20
+ */
21
+ import { createHash } from "node:crypto";
22
+ import { ClampdClient } from "./client.js";
23
+ import { ClampdBlockedError } from "./interceptor.js";
24
+ import { withDelegation, getDelegation, getCallerAgentId, delegationHeaders } from "./delegation.js";
25
+ export { ClampdClient } from "./client.js";
26
+ export { makeAgentJwt } from "./auth.js";
27
+ export { ClampdBlockedError } from "./interceptor.js";
28
+ export { withDelegation, getDelegation, getCallerAgentId, delegationHeaders } from "./delegation.js";
29
+ export { verifyScopeToken, requireScope, getCurrentScopeToken, ScopeVerificationError, withScopeToken, setScopeToken, fetchJwks, invalidateJwksCache } from "./tool-verify.js";
30
+ // ── Global config ─────────────────────────────────────────────────
31
+ let defaultClient = null;
32
+ function getClient(opts) {
33
+ if (defaultClient)
34
+ return defaultClient;
35
+ const agentId = opts?.agentId || process.env.CLAMPD_AGENT_ID || "";
36
+ if (!agentId) {
37
+ throw new Error("No agentId provided. Call clampd.init({ agentId }) first, " +
38
+ "or pass agentId to each function, or set CLAMPD_AGENT_ID env var.");
39
+ }
40
+ return new ClampdClient({
41
+ agentId,
42
+ gatewayUrl: opts?.gatewayUrl || process.env.CLAMPD_GATEWAY_URL,
43
+ apiKey: opts?.apiKey || process.env.CLAMPD_API_KEY,
44
+ secret: opts?.secret,
45
+ });
46
+ }
47
+ // ── clampd.init() ─────────────────────────────────────────────────
48
+ function init(opts) {
49
+ defaultClient = new ClampdClient({
50
+ agentId: opts.agentId,
51
+ gatewayUrl: opts.gatewayUrl,
52
+ apiKey: opts.apiKey,
53
+ secret: opts.secret,
54
+ });
55
+ return defaultClient;
56
+ }
57
+ // ── Response inspection helper ────────────────────────────────────
58
+ async function inspectResponse(client, tool, responseData, requestId = "", failOpen = false, scopeToken = "") {
59
+ try {
60
+ const res = await client.inspect(tool, responseData, requestId || undefined, scopeToken || undefined);
61
+ if (!res.allowed) {
62
+ throw new ClampdBlockedError(res);
63
+ }
64
+ }
65
+ catch (e) {
66
+ if (e instanceof ClampdBlockedError)
67
+ throw e;
68
+ if (!failOpen)
69
+ throw new ClampdBlockedError({
70
+ request_id: "error", allowed: false, risk_score: 1.0,
71
+ denial_reason: `Response inspection failed: ${e}`, latency_ms: 0,
72
+ degraded_stages: [], session_flags: [],
73
+ });
74
+ }
75
+ }
76
+ // ── clampd.guard() — wrap any async function ──────────────────────
77
+ function guard(fn, opts) {
78
+ const client = getClient({ agentId: opts.agentId });
79
+ const { toolName, targetUrl = "", failOpen = false, checkResponse: shouldCheckResponse = false } = opts;
80
+ // Compute tool descriptor hash for rug-pull detection
81
+ const hashInput = `${toolName}:${fn.toString()}`;
82
+ const descriptorHash = createHash("sha256").update(hashInput).digest("hex");
83
+ return async (...args) => {
84
+ return withDelegation(opts.agentId ?? client.agentId, async () => {
85
+ const params = args.length === 1 && typeof args[0] === "object" && args[0] !== null && !Array.isArray(args[0])
86
+ ? args[0]
87
+ : { args };
88
+ const delegation = getDelegation();
89
+ const proxyParams = { ...params };
90
+ if (delegation && delegation.chain.length > 1) {
91
+ proxyParams._delegation = {
92
+ caller_agent_id: getCallerAgentId(),
93
+ delegation_chain: delegation.chain,
94
+ delegation_trace_id: delegation.traceId,
95
+ };
96
+ }
97
+ let requestId = "";
98
+ let scopeToken = "";
99
+ try {
100
+ const res = await client.proxy(toolName, proxyParams, targetUrl, undefined, descriptorHash);
101
+ requestId = res.request_id;
102
+ scopeToken = res.scope_token ?? "";
103
+ if (!res.allowed) {
104
+ throw new ClampdBlockedError(res);
105
+ }
106
+ }
107
+ catch (e) {
108
+ if (e instanceof ClampdBlockedError)
109
+ throw e;
110
+ if (!failOpen)
111
+ throw new ClampdBlockedError({
112
+ request_id: "error", allowed: false, risk_score: 1.0,
113
+ denial_reason: String(e), latency_ms: 0, degraded_stages: [], session_flags: [],
114
+ });
115
+ }
116
+ const result = await fn(...args);
117
+ if (shouldCheckResponse) {
118
+ await inspectResponse(client, toolName, result, requestId, failOpen, scopeToken);
119
+ }
120
+ return result;
121
+ });
122
+ };
123
+ }
124
+ // ── clampd.tools() — wrap OpenAI tool definitions ─────────────────
125
+ function tools(toolDefs, opts) {
126
+ const client = getClient({ agentId: opts.agentId });
127
+ const { targetUrl = "", failOpen = false, scanInput = true, scanOutput = true } = opts;
128
+ return toolDefs.map((tool) => {
129
+ const original = tool.function.execute;
130
+ if (typeof original !== "function")
131
+ return tool;
132
+ const wrapped = async (args) => {
133
+ return withDelegation(opts.agentId ?? "", async () => {
134
+ const delegation = getDelegation();
135
+ const proxyParams = { ...args };
136
+ if (delegation && delegation.chain.length > 1) {
137
+ proxyParams._delegation = {
138
+ caller_agent_id: getCallerAgentId(),
139
+ delegation_chain: delegation.chain,
140
+ delegation_trace_id: delegation.traceId,
141
+ };
142
+ }
143
+ try {
144
+ const res = await client.proxy(tool.function.name, proxyParams, targetUrl);
145
+ if (!res.allowed)
146
+ throw new ClampdBlockedError(res);
147
+ }
148
+ catch (e) {
149
+ if (e instanceof ClampdBlockedError)
150
+ throw e;
151
+ if (!failOpen)
152
+ throw e;
153
+ }
154
+ return original(args);
155
+ });
156
+ };
157
+ return { ...tool, function: { ...tool.function, execute: wrapped } };
158
+ });
159
+ }
160
+ // ── clampd.openai() — wrap OpenAI client ──────────────────────────
161
+ function openai(client, opts) {
162
+ const clampdClient = getClient({ agentId: opts.agentId });
163
+ const { targetUrl = "", failOpen = false, scanInput = true, scanOutput = true } = opts;
164
+ const originalCreate = client.chat.completions.create.bind(client.chat.completions);
165
+ client.chat.completions.create = async (...args) => {
166
+ const params = args[0];
167
+ // ── STREAMING PASSTHROUGH ──
168
+ // Streaming responses deliver tool calls via stream events, not the response body,
169
+ // so tool-call interception cannot work. Run scanInput if enabled, then pass through.
170
+ if (params?.stream) {
171
+ if (scanInput && params.messages) {
172
+ const messages = params.messages;
173
+ const userMessages = messages
174
+ .filter((m) => m.role === "user" || m.role === "tool" || m.role === "function")
175
+ .map((m) => typeof m.content === "string" ? m.content : JSON.stringify(m.content))
176
+ .filter(Boolean)
177
+ .join("\n");
178
+ if (userMessages.trim()) {
179
+ try {
180
+ const inputResult = await clampdClient.scanInput(userMessages, messages.length);
181
+ if (!inputResult.allowed) {
182
+ throw new ClampdBlockedError({
183
+ request_id: "scan-input",
184
+ allowed: false,
185
+ risk_score: inputResult.risk_score,
186
+ denial_reason: inputResult.denial_reason || "Input blocked by guardrail",
187
+ latency_ms: inputResult.latency_ms,
188
+ degraded_stages: [],
189
+ session_flags: [],
190
+ });
191
+ }
192
+ }
193
+ catch (e) {
194
+ if (e instanceof ClampdBlockedError)
195
+ throw e;
196
+ if (!failOpen)
197
+ throw e;
198
+ }
199
+ }
200
+ }
201
+ return originalCreate(...args);
202
+ }
203
+ // ── INPUT GUARDRAIL ──
204
+ if (scanInput && params?.messages) {
205
+ const messages = params.messages;
206
+ const userMessages = messages
207
+ .filter((m) => m.role === "user" || m.role === "tool" || m.role === "function")
208
+ .map((m) => typeof m.content === "string" ? m.content : JSON.stringify(m.content))
209
+ .filter(Boolean)
210
+ .join("\n");
211
+ if (userMessages.trim()) {
212
+ try {
213
+ const inputResult = await clampdClient.scanInput(userMessages, messages.length);
214
+ if (!inputResult.allowed) {
215
+ throw new ClampdBlockedError({
216
+ request_id: "scan-input",
217
+ allowed: false,
218
+ risk_score: inputResult.risk_score,
219
+ denial_reason: inputResult.denial_reason || "Input blocked by guardrail",
220
+ latency_ms: inputResult.latency_ms,
221
+ degraded_stages: [],
222
+ session_flags: [],
223
+ });
224
+ }
225
+ }
226
+ catch (e) {
227
+ if (e instanceof ClampdBlockedError)
228
+ throw e;
229
+ if (!failOpen)
230
+ throw e;
231
+ // fail-open: continue
232
+ }
233
+ }
234
+ }
235
+ const response = await originalCreate(...args);
236
+ // ── OUTPUT GUARDRAIL ──
237
+ if (scanOutput) {
238
+ const content = response.choices?.[0]?.message?.content;
239
+ if (content && content.length > 10) {
240
+ try {
241
+ const outputResult = await clampdClient.scanOutput(content);
242
+ if (!outputResult.allowed) {
243
+ throw new ClampdBlockedError({
244
+ request_id: "scan-output",
245
+ allowed: false,
246
+ risk_score: outputResult.risk_score,
247
+ denial_reason: outputResult.denial_reason || "Output blocked by guardrail",
248
+ latency_ms: outputResult.latency_ms,
249
+ degraded_stages: [],
250
+ session_flags: [],
251
+ });
252
+ }
253
+ }
254
+ catch (e) {
255
+ if (e instanceof ClampdBlockedError)
256
+ throw e;
257
+ if (!failOpen)
258
+ throw e;
259
+ }
260
+ }
261
+ }
262
+ const choice = response.choices?.[0];
263
+ if (choice?.finish_reason !== "tool_calls" || !choice.message?.tool_calls?.length) {
264
+ return response;
265
+ }
266
+ if (!choice.message.tool_calls || !Array.isArray(choice.message.tool_calls)) {
267
+ return response;
268
+ }
269
+ for (const tc of choice.message.tool_calls) {
270
+ let toolArgs;
271
+ try {
272
+ toolArgs = typeof tc.function.arguments === "string"
273
+ ? JSON.parse(tc.function.arguments)
274
+ : tc.function.arguments;
275
+ }
276
+ catch {
277
+ toolArgs = { raw: tc.function.arguments };
278
+ }
279
+ await withDelegation(opts.agentId ?? "", async () => {
280
+ const delegation = getDelegation();
281
+ const proxyParams = { ...toolArgs };
282
+ if (delegation && delegation.chain.length > 1) {
283
+ proxyParams._delegation = {
284
+ caller_agent_id: getCallerAgentId(),
285
+ delegation_chain: delegation.chain,
286
+ delegation_trace_id: delegation.traceId,
287
+ };
288
+ }
289
+ try {
290
+ const res = await clampdClient.proxy(tc.function.name, proxyParams, targetUrl);
291
+ if (!res.allowed) {
292
+ throw new ClampdBlockedError(res);
293
+ }
294
+ }
295
+ catch (e) {
296
+ if (e instanceof ClampdBlockedError)
297
+ throw e;
298
+ if (!failOpen)
299
+ throw e;
300
+ }
301
+ });
302
+ }
303
+ return response;
304
+ };
305
+ return client;
306
+ }
307
+ // ── clampd.anthropic() — wrap Anthropic client ────────────────────
308
+ function anthropic(client, opts) {
309
+ const clampdClient = getClient({ agentId: opts.agentId });
310
+ const { targetUrl = "", failOpen = false, scanInput = true, scanOutput = true } = opts;
311
+ const originalCreate = client.messages.create.bind(client.messages);
312
+ client.messages.create = async (...args) => {
313
+ const params = args[0];
314
+ // ── STREAMING PASSTHROUGH ──
315
+ // Streaming responses deliver tool calls via stream events, not the response body,
316
+ // so tool-call interception cannot work. Run scanInput if enabled, then pass through.
317
+ if (params?.stream) {
318
+ if (scanInput && params.messages) {
319
+ const messages = params.messages;
320
+ const userMessages = messages
321
+ .filter((m) => m.role === "user" || m.role === "tool" || m.role === "function")
322
+ .map((m) => {
323
+ if (typeof m.content === "string")
324
+ return m.content;
325
+ if (Array.isArray(m.content)) {
326
+ return m.content
327
+ .filter((b) => b.type === "text")
328
+ .map((b) => b.text)
329
+ .join("\n");
330
+ }
331
+ return JSON.stringify(m.content);
332
+ })
333
+ .filter(Boolean)
334
+ .join("\n");
335
+ if (userMessages.trim()) {
336
+ try {
337
+ const inputResult = await clampdClient.scanInput(userMessages, messages.length);
338
+ if (!inputResult.allowed) {
339
+ throw new ClampdBlockedError({
340
+ request_id: "scan-input",
341
+ allowed: false,
342
+ risk_score: inputResult.risk_score,
343
+ denial_reason: inputResult.denial_reason || "Input blocked by guardrail",
344
+ latency_ms: inputResult.latency_ms,
345
+ degraded_stages: [],
346
+ session_flags: [],
347
+ });
348
+ }
349
+ }
350
+ catch (e) {
351
+ if (e instanceof ClampdBlockedError)
352
+ throw e;
353
+ if (!failOpen)
354
+ throw e;
355
+ }
356
+ }
357
+ }
358
+ return originalCreate(...args);
359
+ }
360
+ // ── INPUT GUARDRAIL ──
361
+ if (scanInput && params?.messages) {
362
+ const messages = params.messages;
363
+ const userMessages = messages
364
+ .filter((m) => m.role === "user" || m.role === "tool" || m.role === "function")
365
+ .map((m) => {
366
+ if (typeof m.content === "string")
367
+ return m.content;
368
+ if (Array.isArray(m.content)) {
369
+ return m.content
370
+ .filter((b) => b.type === "text")
371
+ .map((b) => b.text)
372
+ .join("\n");
373
+ }
374
+ return JSON.stringify(m.content);
375
+ })
376
+ .filter(Boolean)
377
+ .join("\n");
378
+ if (userMessages.trim()) {
379
+ try {
380
+ const inputResult = await clampdClient.scanInput(userMessages, messages.length);
381
+ if (!inputResult.allowed) {
382
+ throw new ClampdBlockedError({
383
+ request_id: "scan-input",
384
+ allowed: false,
385
+ risk_score: inputResult.risk_score,
386
+ denial_reason: inputResult.denial_reason || "Input blocked by guardrail",
387
+ latency_ms: inputResult.latency_ms,
388
+ degraded_stages: [],
389
+ session_flags: [],
390
+ });
391
+ }
392
+ }
393
+ catch (e) {
394
+ if (e instanceof ClampdBlockedError)
395
+ throw e;
396
+ if (!failOpen)
397
+ throw e;
398
+ }
399
+ }
400
+ }
401
+ const response = await originalCreate(...args);
402
+ // ── OUTPUT GUARDRAIL ──
403
+ if (scanOutput) {
404
+ const contentArr = Array.isArray(response.content) ? response.content : [];
405
+ const textContent = contentArr
406
+ .filter((b) => b.type === "text" && b.text)
407
+ .map((b) => b.text)
408
+ .join("\n");
409
+ if (textContent.length > 10) {
410
+ try {
411
+ const outputResult = await clampdClient.scanOutput(textContent);
412
+ if (!outputResult.allowed) {
413
+ throw new ClampdBlockedError({
414
+ request_id: "scan-output",
415
+ allowed: false,
416
+ risk_score: outputResult.risk_score,
417
+ denial_reason: outputResult.denial_reason || "Output blocked by guardrail",
418
+ latency_ms: outputResult.latency_ms,
419
+ degraded_stages: [],
420
+ session_flags: [],
421
+ });
422
+ }
423
+ }
424
+ catch (e) {
425
+ if (e instanceof ClampdBlockedError)
426
+ throw e;
427
+ if (!failOpen)
428
+ throw e;
429
+ }
430
+ }
431
+ }
432
+ if (response.stop_reason !== "tool_use")
433
+ return response;
434
+ if (!response.content || !Array.isArray(response.content)) {
435
+ return response;
436
+ }
437
+ for (const block of response.content) {
438
+ if (block.type !== "tool_use")
439
+ continue;
440
+ const toolArgs = typeof block.input === "object" ? block.input : {};
441
+ await withDelegation(opts.agentId ?? "", async () => {
442
+ const delegation = getDelegation();
443
+ const proxyParams = { ...toolArgs };
444
+ if (delegation && delegation.chain.length > 1) {
445
+ proxyParams._delegation = {
446
+ caller_agent_id: getCallerAgentId(),
447
+ delegation_chain: delegation.chain,
448
+ delegation_trace_id: delegation.traceId,
449
+ };
450
+ }
451
+ try {
452
+ const res = await clampdClient.proxy(block.name ?? "unknown", proxyParams, targetUrl);
453
+ if (!res.allowed) {
454
+ throw new ClampdBlockedError(res);
455
+ }
456
+ }
457
+ catch (e) {
458
+ if (e instanceof ClampdBlockedError)
459
+ throw e;
460
+ if (!failOpen)
461
+ throw e;
462
+ }
463
+ });
464
+ }
465
+ return response;
466
+ };
467
+ return client;
468
+ }
469
+ // ── Default export ────────────────────────────────────────────────
470
+ const clampd = { init, guard, tools, openai, anthropic, delegationHeaders };
471
+ export default clampd;
472
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}