@superblocksteam/clark 2.0.0-SNAPSHOT.a1e14d6b7a1bcd87

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.
Files changed (62) hide show
  1. package/LICENSE.txt +87 -0
  2. package/dist/clark-chat-settings.d.ts +11 -0
  3. package/dist/clark-chat-settings.d.ts.map +1 -0
  4. package/dist/clark-chat-settings.js +12 -0
  5. package/dist/clark-chat-settings.js.map +1 -0
  6. package/dist/clark-error-handler.d.ts +17 -0
  7. package/dist/clark-error-handler.d.ts.map +1 -0
  8. package/dist/clark-error-handler.js +21 -0
  9. package/dist/clark-error-handler.js.map +1 -0
  10. package/dist/clark-language-model.d.ts +67 -0
  11. package/dist/clark-language-model.d.ts.map +1 -0
  12. package/dist/clark-language-model.js +862 -0
  13. package/dist/clark-language-model.js.map +1 -0
  14. package/dist/clark-provider.d.ts +66 -0
  15. package/dist/clark-provider.d.ts.map +1 -0
  16. package/dist/clark-provider.js +72 -0
  17. package/dist/clark-provider.js.map +1 -0
  18. package/dist/clark-stream-telemetry.d.ts +72 -0
  19. package/dist/clark-stream-telemetry.d.ts.map +1 -0
  20. package/dist/clark-stream-telemetry.js +22 -0
  21. package/dist/clark-stream-telemetry.js.map +1 -0
  22. package/dist/content-block-utils.d.ts +55 -0
  23. package/dist/content-block-utils.d.ts.map +1 -0
  24. package/dist/content-block-utils.js +122 -0
  25. package/dist/content-block-utils.js.map +1 -0
  26. package/dist/index.d.ts +11 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +10 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/mcp/docs-mcp.d.ts +23 -0
  31. package/dist/mcp/docs-mcp.d.ts.map +1 -0
  32. package/dist/mcp/docs-mcp.js +95 -0
  33. package/dist/mcp/docs-mcp.js.map +1 -0
  34. package/dist/mcp/extract-mcp-text-content.d.ts +11 -0
  35. package/dist/mcp/extract-mcp-text-content.d.ts.map +1 -0
  36. package/dist/mcp/extract-mcp-text-content.js +37 -0
  37. package/dist/mcp/extract-mcp-text-content.js.map +1 -0
  38. package/dist/mcp/index.d.ts +5 -0
  39. package/dist/mcp/index.d.ts.map +1 -0
  40. package/dist/mcp/index.js +4 -0
  41. package/dist/mcp/index.js.map +1 -0
  42. package/dist/mcp/mcp-client.d.ts +52 -0
  43. package/dist/mcp/mcp-client.d.ts.map +1 -0
  44. package/dist/mcp/mcp-client.js +164 -0
  45. package/dist/mcp/mcp-client.js.map +1 -0
  46. package/dist/mcp/types.d.ts +55 -0
  47. package/dist/mcp/types.d.ts.map +1 -0
  48. package/dist/mcp/types.js +8 -0
  49. package/dist/mcp/types.js.map +1 -0
  50. package/dist/snowflake-cortex-fetch.d.ts +21 -0
  51. package/dist/snowflake-cortex-fetch.d.ts.map +1 -0
  52. package/dist/snowflake-cortex-fetch.js +349 -0
  53. package/dist/snowflake-cortex-fetch.js.map +1 -0
  54. package/dist/stall-timeout.d.ts +5 -0
  55. package/dist/stall-timeout.d.ts.map +1 -0
  56. package/dist/stall-timeout.js +30 -0
  57. package/dist/stall-timeout.js.map +1 -0
  58. package/dist/thinking-options.d.ts +18 -0
  59. package/dist/thinking-options.d.ts.map +1 -0
  60. package/dist/thinking-options.js +53 -0
  61. package/dist/thinking-options.js.map +1 -0
  62. package/package.json +66 -0
@@ -0,0 +1,349 @@
1
+ const HTTP_STATUS_TO_ERROR_TYPE = {
2
+ 400: "invalid_request_error",
3
+ 401: "authentication_error",
4
+ 403: "permission_error",
5
+ 404: "not_found_error",
6
+ 429: "rate_limit_error",
7
+ 500: "api_error",
8
+ 529: "overloaded_error",
9
+ };
10
+ // Header names that carry the upstream request identifier, in priority order.
11
+ // Snowflake and Anthropic-compatible gateways differ in which one they set.
12
+ const UPSTREAM_REQUEST_ID_HEADERS = [
13
+ "sf-request-id",
14
+ "x-snowflake-request-id",
15
+ "x-request-id",
16
+ "request-id",
17
+ "anthropic-request-id",
18
+ ];
19
+ function extractUpstreamRequestId(headers) {
20
+ for (const header of UPSTREAM_REQUEST_ID_HEADERS) {
21
+ const value = headers.get(header);
22
+ if (value) {
23
+ return value;
24
+ }
25
+ }
26
+ return undefined;
27
+ }
28
+ function formatSnowflakeErrorMessage(error, fallback) {
29
+ const base = error.message ?? fallback;
30
+ const requestId = error.request_id;
31
+ return requestId ? `${base} (request_id: ${requestId})` : base;
32
+ }
33
+ function normalizeSnowflakeErrorEvent(body, fallback, status) {
34
+ // Already an Anthropic-shaped event ({"type":"error",...}) or any success
35
+ // SSE chunk ({"type":"message_start",...}) — leave it untouched.
36
+ if (body?.type) {
37
+ return undefined;
38
+ }
39
+ // Cortex error bodies come in two shapes:
40
+ // wrapped: {"error":{"message":...,"request_id":...}}
41
+ // top-level: {"message":...,"request_id":...} — used by request-validation
42
+ // rejections, e.g. the 100-page PDF limit (APPS-4563).
43
+ const payload = body?.error
44
+ ? body.error
45
+ : typeof body?.message === "string"
46
+ ? { message: body.message, request_id: body.request_id }
47
+ : undefined;
48
+ if (!payload) {
49
+ return undefined;
50
+ }
51
+ const errorType = (status !== undefined ? HTTP_STATUS_TO_ERROR_TYPE[status] : undefined) ??
52
+ "api_error";
53
+ return {
54
+ type: "error",
55
+ error: {
56
+ type: errorType,
57
+ message: formatSnowflakeErrorMessage(payload, fallback),
58
+ },
59
+ };
60
+ }
61
+ function normalizeErrorResponse(response, text) {
62
+ try {
63
+ const body = JSON.parse(text);
64
+ const normalized = normalizeSnowflakeErrorEvent(body, text, response.status);
65
+ if (normalized) {
66
+ return new Response(JSON.stringify(normalized), {
67
+ status: response.status,
68
+ statusText: response.statusText,
69
+ headers: response.headers,
70
+ });
71
+ }
72
+ }
73
+ catch {
74
+ // not JSON
75
+ }
76
+ return new Response(text, {
77
+ status: response.status,
78
+ statusText: response.statusText,
79
+ headers: response.headers,
80
+ });
81
+ }
82
+ function normalizeSseEventData(data) {
83
+ try {
84
+ const parsed = JSON.parse(data);
85
+ const normalized = normalizeSnowflakeErrorEvent(parsed, data);
86
+ if (normalized) {
87
+ return JSON.stringify(normalized);
88
+ }
89
+ // Pass non-error events through untouched — only the Snowflake error
90
+ // shape breaks AI SDK validation, so there is no reason to re-serialize
91
+ // (and pay parse/stringify cost on) every success chunk.
92
+ return data;
93
+ }
94
+ catch {
95
+ return data;
96
+ }
97
+ }
98
+ function wrapSseResponse(response) {
99
+ if (!response.body) {
100
+ return response;
101
+ }
102
+ let buffer = "";
103
+ const encoder = new TextEncoder();
104
+ const decoder = new TextDecoder();
105
+ const transformed = response.body.pipeThrough(new TransformStream({
106
+ transform(chunk, controller) {
107
+ buffer += decoder.decode(chunk, { stream: true });
108
+ let newlineIndex;
109
+ while ((newlineIndex = buffer.indexOf("\n")) !== -1) {
110
+ let line = buffer.slice(0, newlineIndex);
111
+ buffer = buffer.slice(newlineIndex + 1);
112
+ if (line.endsWith("\r")) {
113
+ line = line.slice(0, -1);
114
+ }
115
+ if (line.startsWith("data: ")) {
116
+ const payload = line.slice("data: ".length);
117
+ line = `data: ${normalizeSseEventData(payload)}`;
118
+ }
119
+ controller.enqueue(encoder.encode(`${line}\n`));
120
+ }
121
+ },
122
+ flush(controller) {
123
+ // Finalize the decoder so any bytes held back from an incomplete
124
+ // multi-byte sequence in the last chunk are emitted.
125
+ buffer += decoder.decode();
126
+ if (buffer.length === 0) {
127
+ return;
128
+ }
129
+ let line = buffer;
130
+ if (line.endsWith("\r")) {
131
+ line = line.slice(0, -1);
132
+ }
133
+ if (line.startsWith("data: ")) {
134
+ const payload = line.slice("data: ".length);
135
+ line = `data: ${normalizeSseEventData(payload)}`;
136
+ }
137
+ controller.enqueue(encoder.encode(line));
138
+ },
139
+ }));
140
+ return new Response(transformed, {
141
+ status: response.status,
142
+ statusText: response.statusText,
143
+ headers: response.headers,
144
+ });
145
+ }
146
+ function normalizeSuccessfulResponseBody(value) {
147
+ if (Array.isArray(value)) {
148
+ return value.map(normalizeSuccessfulResponseBody);
149
+ }
150
+ if (value && typeof value === "object") {
151
+ return Object.fromEntries(Object.entries(value).map(([key, nestedValue]) => {
152
+ if (key === "citations" && nestedValue === null) {
153
+ return [key, []];
154
+ }
155
+ if ((key === "cache_creation_input_tokens" ||
156
+ key === "cache_read_input_tokens") &&
157
+ nestedValue === null) {
158
+ return [key, 0];
159
+ }
160
+ return [key, normalizeSuccessfulResponseBody(nestedValue)];
161
+ }));
162
+ }
163
+ return value;
164
+ }
165
+ function normalizeSuccessResponse(response, text) {
166
+ try {
167
+ return new Response(JSON.stringify(normalizeSuccessfulResponseBody(JSON.parse(text))), {
168
+ status: response.status,
169
+ statusText: response.statusText,
170
+ headers: response.headers,
171
+ });
172
+ }
173
+ catch {
174
+ return new Response(text, {
175
+ status: response.status,
176
+ statusText: response.statusText,
177
+ headers: response.headers,
178
+ });
179
+ }
180
+ }
181
+ function stripCacheControl(value) {
182
+ if (Array.isArray(value)) {
183
+ return value.map(stripCacheControl);
184
+ }
185
+ if (value && typeof value === "object") {
186
+ return Object.fromEntries(Object.entries(value)
187
+ .filter(([key]) => key !== "cache_control")
188
+ .map(([key, nested]) => [key, stripCacheControl(nested)]));
189
+ }
190
+ return value;
191
+ }
192
+ function stripCortexUnsupportedCacheControl(body) {
193
+ if (!body || typeof body !== "object") {
194
+ return body;
195
+ }
196
+ const result = {
197
+ ...body,
198
+ };
199
+ delete result.cache_control;
200
+ if (Array.isArray(result.messages)) {
201
+ result.messages = result.messages.map((message) => message &&
202
+ typeof message === "object" &&
203
+ message.role === "user"
204
+ ? message
205
+ : stripCacheControl(message));
206
+ }
207
+ if (Array.isArray(result.tools)) {
208
+ result.tools = result.tools.map(stripCacheControl);
209
+ }
210
+ return result;
211
+ }
212
+ const UNSUPPORTED_SCHEMA_KEYWORDS = new Set([
213
+ "minLength",
214
+ "maxLength",
215
+ "pattern",
216
+ "format",
217
+ "minimum",
218
+ "maximum",
219
+ "exclusiveMinimum",
220
+ "exclusiveMaximum",
221
+ "multipleOf",
222
+ "minItems",
223
+ "maxItems",
224
+ "uniqueItems",
225
+ "contains",
226
+ "minContains",
227
+ "maxContains",
228
+ "minProperties",
229
+ "maxProperties",
230
+ "patternProperties",
231
+ "propertyNames",
232
+ ]);
233
+ const SCHEMA_MAP_KEYWORDS = new Set(["properties", "$defs", "definitions"]);
234
+ const OPAQUE_SCHEMA_KEYWORDS = new Set([
235
+ "enum",
236
+ "const",
237
+ "default",
238
+ "examples",
239
+ ]);
240
+ function sanitizeJsonSchema(node) {
241
+ if (Array.isArray(node)) {
242
+ return node.map(sanitizeJsonSchema);
243
+ }
244
+ if (node && typeof node === "object") {
245
+ const sanitized = {};
246
+ for (const [key, value] of Object.entries(node)) {
247
+ if (UNSUPPORTED_SCHEMA_KEYWORDS.has(key)) {
248
+ continue;
249
+ }
250
+ if (OPAQUE_SCHEMA_KEYWORDS.has(key)) {
251
+ sanitized[key] = value;
252
+ }
253
+ else if (SCHEMA_MAP_KEYWORDS.has(key) &&
254
+ value &&
255
+ typeof value === "object" &&
256
+ !Array.isArray(value)) {
257
+ sanitized[key] = Object.fromEntries(Object.entries(value).map(([name, subSchema]) => [name, sanitizeJsonSchema(subSchema)]));
258
+ }
259
+ else {
260
+ sanitized[key] = sanitizeJsonSchema(value);
261
+ }
262
+ }
263
+ return sanitized;
264
+ }
265
+ return node;
266
+ }
267
+ function stripUnsupportedSchemaKeywords(value) {
268
+ if (Array.isArray(value)) {
269
+ return value.map(stripUnsupportedSchemaKeywords);
270
+ }
271
+ if (value && typeof value === "object") {
272
+ return Object.fromEntries(Object.entries(value).map(([key, nested]) => key === "input_schema"
273
+ ? [key, sanitizeJsonSchema(nested)]
274
+ : [key, stripUnsupportedSchemaKeywords(nested)]));
275
+ }
276
+ return value;
277
+ }
278
+ function sanitizeRequestInit(init, forwardCacheControl) {
279
+ if (!init || typeof init.body !== "string") {
280
+ return init;
281
+ }
282
+ try {
283
+ const parsed = JSON.parse(init.body);
284
+ const afterCacheControl = forwardCacheControl
285
+ ? stripCortexUnsupportedCacheControl(parsed)
286
+ : stripCacheControl(parsed);
287
+ const cleaned = stripUnsupportedSchemaKeywords(afterCacheControl);
288
+ return { ...init, body: JSON.stringify(cleaned) };
289
+ }
290
+ catch {
291
+ return init;
292
+ }
293
+ }
294
+ export function createSnowflakeCortexFetch({ forwardCacheControl, onPromptCachingRejected, onUpstreamResponse, }) {
295
+ return async (input, init) => {
296
+ const url = typeof input === "string"
297
+ ? input
298
+ : input instanceof URL
299
+ ? input.href
300
+ : input.url;
301
+ // Telemetry must never fail the inference request it is observing.
302
+ const notifyUpstreamResponse = (response) => {
303
+ try {
304
+ onUpstreamResponse?.({
305
+ requestId: extractUpstreamRequestId(response.headers),
306
+ status: response.status,
307
+ url,
308
+ });
309
+ }
310
+ catch {
311
+ // Swallow observer errors; the response is still relayed.
312
+ }
313
+ };
314
+ let response = await globalThis.fetch(input, sanitizeRequestInit(init, forwardCacheControl));
315
+ notifyUpstreamResponse(response);
316
+ if (forwardCacheControl && response.status === 400) {
317
+ const text = await response.text();
318
+ if (/cache_control/i.test(text)) {
319
+ onPromptCachingRejected?.();
320
+ response = await globalThis.fetch(input, sanitizeRequestInit(init, false));
321
+ notifyUpstreamResponse(response);
322
+ }
323
+ else {
324
+ return normalizeErrorResponse(new Response(text, {
325
+ status: response.status,
326
+ statusText: response.statusText,
327
+ headers: response.headers,
328
+ }), text);
329
+ }
330
+ }
331
+ if (!response.ok) {
332
+ const text = await response.text();
333
+ return normalizeErrorResponse(response, text);
334
+ }
335
+ const contentType = response.headers.get("content-type") ?? "";
336
+ if (contentType.includes("application/json")) {
337
+ const text = await response.text();
338
+ return normalizeSuccessResponse(response, text);
339
+ }
340
+ if (contentType.includes("text/event-stream")) {
341
+ return wrapSseResponse(response);
342
+ }
343
+ return response;
344
+ };
345
+ }
346
+ export const snowflakeCortexFetch = createSnowflakeCortexFetch({
347
+ forwardCacheControl: false,
348
+ });
349
+ //# sourceMappingURL=snowflake-cortex-fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snowflake-cortex-fetch.js","sourceRoot":"","sources":["../src/snowflake-cortex-fetch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare const UPSTREAM_STALL_TIMEOUT_EXTENDED_MS = 900000;
2
+ export declare const UPSTREAM_STALL_TIMEOUT_STANDARD_MS = 450000;
3
+ export declare function isExtendedThinkingModel(coreModel: string | undefined): boolean;
4
+ export declare function upstreamStallTimeoutMsFor(coreModel: string | undefined): number;
5
+ //# sourceMappingURL=stall-timeout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stall-timeout.d.ts","sourceRoot":"","sources":["../src/stall-timeout.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,kCAAkC,SAAU,CAAC;AAC1D,eAAO,MAAM,kCAAkC,SAAU,CAAC;AAM1D,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,OAAO,CAET;AAED,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,MAAM,CAIR"}
@@ -0,0 +1,30 @@
1
+ import { usesAdaptiveEffort } from "./thinking-options.js";
2
+ // Single source of truth for the upstream-silence stall bound. Two layers share
3
+ // this contract but live in packages that cannot import each other (the server
4
+ // AI proxy in `@superblocks/server` enforces the bound on its relay loop; the
5
+ // dev-server LLM client in `vite-plugin-file-sync` floors its `maxTotalTimeMs`
6
+ // at the same value so it never tears the request down before the proxy can
7
+ // emit its retryable stall frame). Both already depend on `@superblocksteam/clark`,
8
+ // so defining the bound here removes the previously hand-synced duplicate
9
+ // constants and classification that could silently drift.
10
+ // Per-attempt bound on UPSTREAM silence (no real chunk, including native pings).
11
+ // Extended-thinking models stream no content for the whole thinking phase (Opus
12
+ // 4.7 adaptive thinking) and that phase can run minutes, so they get a longer
13
+ // bound. The client's `maxTotalTimeMs` is kept ABOVE this value so a single
14
+ // stall still leaves room for a same-provider retry (reaching a fallback
15
+ // provider does not depend on it — see RetryEngine.getRetryDecision).
16
+ export const UPSTREAM_STALL_TIMEOUT_EXTENDED_MS = 900_000; // 15 min
17
+ export const UPSTREAM_STALL_TIMEOUT_STANDARD_MS = 450_000; // 7.5 min
18
+ // Models whose thinking phase can stay content-silent long enough to need the
19
+ // extended stall bound: adaptive-effort models (Opus 4.7+) plus Opus 4.6, which
20
+ // was measured at ~96-110s to first content in prod and shares the extended
21
+ // idle/total budgets on the client.
22
+ export function isExtendedThinkingModel(coreModel) {
23
+ return usesAdaptiveEffort(coreModel) || coreModel === "claude-opus-4-6";
24
+ }
25
+ export function upstreamStallTimeoutMsFor(coreModel) {
26
+ return isExtendedThinkingModel(coreModel)
27
+ ? UPSTREAM_STALL_TIMEOUT_EXTENDED_MS
28
+ : UPSTREAM_STALL_TIMEOUT_STANDARD_MS;
29
+ }
30
+ //# sourceMappingURL=stall-timeout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stall-timeout.js","sourceRoot":"","sources":["../src/stall-timeout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,gFAAgF;AAChF,+EAA+E;AAC/E,8EAA8E;AAC9E,+EAA+E;AAC/E,4EAA4E;AAC5E,oFAAoF;AACpF,0EAA0E;AAC1E,0DAA0D;AAE1D,iFAAiF;AACjF,gFAAgF;AAChF,8EAA8E;AAC9E,4EAA4E;AAC5E,yEAAyE;AACzE,sEAAsE;AACtE,MAAM,CAAC,MAAM,kCAAkC,GAAG,OAAO,CAAC,CAAC,SAAS;AACpE,MAAM,CAAC,MAAM,kCAAkC,GAAG,OAAO,CAAC,CAAC,UAAU;AAErE,8EAA8E;AAC9E,gFAAgF;AAChF,4EAA4E;AAC5E,oCAAoC;AACpC,MAAM,UAAU,uBAAuB,CACrC,SAA6B;IAE7B,OAAO,kBAAkB,CAAC,SAAS,CAAC,IAAI,SAAS,KAAK,iBAAiB,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,SAA6B;IAE7B,OAAO,uBAAuB,CAAC,SAAS,CAAC;QACvC,CAAC,CAAC,kCAAkC;QACpC,CAAC,CAAC,kCAAkC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,18 @@
1
+ export interface ThinkingOptionsParams {
2
+ thinkingEnabled: boolean;
3
+ thinkingBudgetTokens: number;
4
+ interleavedThinking: boolean;
5
+ }
6
+ export interface ThinkingProviderOptions {
7
+ anthropic?: {
8
+ thinking: Record<string, unknown>;
9
+ effort?: string;
10
+ };
11
+ bedrock?: {
12
+ additionalModelRequestFields: Record<string, unknown>;
13
+ };
14
+ headers: Record<string, string | undefined>;
15
+ }
16
+ export declare function usesAdaptiveEffort(coreModel: string | undefined): boolean;
17
+ export declare function buildThinkingProviderOptions(coreModel: string | undefined, params: ThinkingOptionsParams): ThinkingProviderOptions;
18
+ //# sourceMappingURL=thinking-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thinking-options.d.ts","sourceRoot":"","sources":["../src/thinking-options.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,eAAe,EAAE,OAAO,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAKD,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,OAAO,CAAC,EAAE;QACR,4BAA4B,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACvD,CAAC;IACF,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CAC7C;AAcD,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEzE;AAID,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,MAAM,EAAE,qBAAqB,GAC5B,uBAAuB,CA4CzB"}
@@ -0,0 +1,53 @@
1
+ const INTERLEAVED_THINKING_BETA = "interleaved-thinking-2025-05-14";
2
+ // Opus 4.7+ rejects `thinking: { type: "enabled" }` with a 400; it requires the
3
+ // adaptive-thinking API with `output_config.effort`. Effort is hardcoded to
4
+ // "high" — the legacy budgetTokens knob does not apply.
5
+ const ADAPTIVE_EFFORT_MODELS = new Set([
6
+ "claude-opus-4-7",
7
+ "claude-opus-4-8",
8
+ "claude-opus-5",
9
+ ]);
10
+ const HARDCODED_EFFORT = "high";
11
+ export function usesAdaptiveEffort(coreModel) {
12
+ return coreModel !== undefined && ADAPTIVE_EFFORT_MODELS.has(coreModel);
13
+ }
14
+ // Pure function so retries that swap models (e.g. opus-4-7 → sonnet-4-6 →
15
+ // opus-4-7) can call it per attempt to emit the shape the current model accepts.
16
+ export function buildThinkingProviderOptions(coreModel, params) {
17
+ const { thinkingEnabled, thinkingBudgetTokens, interleavedThinking } = params;
18
+ if (usesAdaptiveEffort(coreModel)) {
19
+ // Adaptive thinking and effort are GA on Bedrock; no beta header is
20
+ // required and interleaved thinking is automatically enabled for adaptive
21
+ // mode. Don't send anthropic_beta on this path — stale beta flags can
22
+ // surface as invalid-beta 400s upstream even when the rest of the shape
23
+ // is correct. (AWS docs: claude-messages-adaptive-thinking.)
24
+ const anthropic = {
25
+ thinking: { type: "adaptive", display: "summarized" },
26
+ effort: HARDCODED_EFFORT,
27
+ };
28
+ const bedrock = {
29
+ additionalModelRequestFields: {
30
+ thinking: { type: "adaptive", display: "summarized" },
31
+ output_config: { effort: HARDCODED_EFFORT },
32
+ },
33
+ };
34
+ return { anthropic, bedrock, headers: {} };
35
+ }
36
+ if (!thinkingEnabled) {
37
+ return { headers: {} };
38
+ }
39
+ const anthropic = {
40
+ thinking: { type: "enabled", budgetTokens: thinkingBudgetTokens },
41
+ };
42
+ const bedrock = {
43
+ additionalModelRequestFields: {
44
+ thinking: { type: "enabled", budget_tokens: thinkingBudgetTokens },
45
+ anthropic_beta: [INTERLEAVED_THINKING_BETA],
46
+ },
47
+ };
48
+ const headers = interleavedThinking
49
+ ? { "anthropic-beta": INTERLEAVED_THINKING_BETA }
50
+ : {};
51
+ return { anthropic, bedrock, headers };
52
+ }
53
+ //# sourceMappingURL=thinking-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thinking-options.js","sourceRoot":"","sources":["../src/thinking-options.ts"],"names":[],"mappings":"AAoBA,MAAM,yBAAyB,GAAG,iCAAiC,CAAC;AAEpE,gFAAgF;AAChF,4EAA4E;AAC5E,wDAAwD;AACxD,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACrC,iBAAiB;IACjB,iBAAiB;IACjB,eAAe;CAChB,CAAC,CAAC;AACH,MAAM,gBAAgB,GAAG,MAAe,CAAC;AAEzC,MAAM,UAAU,kBAAkB,CAAC,SAA6B;IAC9D,OAAO,SAAS,KAAK,SAAS,IAAI,sBAAsB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC1E,CAAC;AAED,0EAA0E;AAC1E,iFAAiF;AACjF,MAAM,UAAU,4BAA4B,CAC1C,SAA6B,EAC7B,MAA6B;IAE7B,MAAM,EAAE,eAAe,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAAC;IAE9E,IAAI,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC;QAClC,oEAAoE;QACpE,0EAA0E;QAC1E,sEAAsE;QACtE,wEAAwE;QACxE,6DAA6D;QAC7D,MAAM,SAAS,GAAG;YAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE;YACrD,MAAM,EAAE,gBAAgB;SACzB,CAAC;QAEF,MAAM,OAAO,GAAG;YACd,4BAA4B,EAAE;gBAC5B,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE;gBACrD,aAAa,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE;aAC5C;SACF,CAAC;QAEF,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC7C,CAAC;IAED,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,SAAS,GAAG;QAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,oBAAoB,EAAE;KAClE,CAAC;IAEF,MAAM,OAAO,GAAG;QACd,4BAA4B,EAAE;YAC5B,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,oBAAoB,EAAE;YAClE,cAAc,EAAE,CAAC,yBAAyB,CAAC;SAC5C;KACF,CAAC;IAEF,MAAM,OAAO,GAAuC,mBAAmB;QACrE,CAAC,CAAC,EAAE,gBAAgB,EAAE,yBAAyB,EAAE;QACjD,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AACzC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@superblocksteam/clark",
3
+ "version": "2.0.0-SNAPSHOT.a1e14d6b7a1bcd87",
4
+ "description": "Clark model provider extracted for reuse and testing",
5
+ "license": "Superblocks Community Software License",
6
+ "files": [
7
+ "dist"
8
+ ],
9
+ "type": "module",
10
+ "main": "./dist/index.js",
11
+ "types": "./dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "default": "./dist/index.js"
16
+ }
17
+ },
18
+ "dependencies": {
19
+ "@ai-sdk/provider": "^3.0.8",
20
+ "@ai-sdk/provider-utils": "^4.0.15",
21
+ "eventsource-parser": "^3.0.3",
22
+ "zod": "3.25.76"
23
+ },
24
+ "devDependencies": {
25
+ "@ai-sdk/test-server": "^1.0.3",
26
+ "@eslint/js": "^9.39.2",
27
+ "@superblocksteam/library-shared": "2.0.0-SNAPSHOT.e23850f62ce6bf23",
28
+ "@types/node": "^24",
29
+ "@vitest/coverage-v8": "^4.0.17",
30
+ "@vitest/eslint-plugin": "^1.6.7",
31
+ "ai": "6.0.97",
32
+ "eslint": "^9.39.2",
33
+ "eslint-config-prettier": "^10.1.8",
34
+ "eslint-config-turbo": "^2.9.16",
35
+ "eslint-plugin-import": "^2.32.0",
36
+ "eslint-plugin-unicorn": "^62.0.0",
37
+ "eslint-plugin-unused-imports": "^4.3.0",
38
+ "globals": "^17.3.0",
39
+ "premove": "^4.0.0",
40
+ "typescript": "^6.0.3",
41
+ "typescript-eslint": "^8.59.2",
42
+ "vitest": "^4.0.17"
43
+ },
44
+ "peerDependencies": {
45
+ "ai": ">=6.0.0"
46
+ },
47
+ "engines": {
48
+ "node": ">=24",
49
+ "npm": ">=10.x"
50
+ },
51
+ "publishConfig": {
52
+ "registry": "https://registry.npmjs.org"
53
+ },
54
+ "scripts": {
55
+ "build": "tsc --build tsconfig.build.json",
56
+ "check": "pnpm lint && pnpm typecheck",
57
+ "clean": "premove dist *.tsbuildinfo",
58
+ "dev": "tsc --build tsconfig.build.json --watch --preserveWatchOutput",
59
+ "lint": "eslint --concurrency=2",
60
+ "lint:fix": "eslint --fix --concurrency=2",
61
+ "publish-package": "pnpm publish",
62
+ "test": "vitest run --reporter=verbose",
63
+ "test:watch": "vitest --ui",
64
+ "typecheck": "tsc --build tsconfig.json"
65
+ }
66
+ }