@witqq/agent-sdk 0.1.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,718 @@
1
+ 'use strict';
2
+
3
+ // src/types.ts
4
+ function getTextContent(content) {
5
+ if (typeof content === "string") return content;
6
+ return content.filter((p) => p.type === "text").map((p) => p.text).join("\n");
7
+ }
8
+
9
+ // src/errors.ts
10
+ var AgentSDKError = class extends Error {
11
+ constructor(message, options) {
12
+ super(message, options);
13
+ this.name = "AgentSDKError";
14
+ }
15
+ };
16
+ var ReentrancyError = class extends AgentSDKError {
17
+ constructor() {
18
+ super("Agent is already running. Await the current run before starting another.");
19
+ this.name = "ReentrancyError";
20
+ }
21
+ };
22
+ var DisposedError = class extends AgentSDKError {
23
+ constructor(entity) {
24
+ super(`${entity} has been disposed and cannot be used.`);
25
+ this.name = "DisposedError";
26
+ }
27
+ };
28
+ var SubprocessError = class extends AgentSDKError {
29
+ constructor(message, options) {
30
+ super(message, options);
31
+ this.name = "SubprocessError";
32
+ }
33
+ };
34
+ var AbortError = class extends AgentSDKError {
35
+ constructor() {
36
+ super("Agent run was aborted.");
37
+ this.name = "AbortError";
38
+ }
39
+ };
40
+
41
+ // src/base-agent.ts
42
+ var BaseAgent = class {
43
+ state = "idle";
44
+ abortController = null;
45
+ config;
46
+ constructor(config) {
47
+ this.config = Object.freeze({ ...config });
48
+ }
49
+ // ─── Public Interface ─────────────────────────────────────────
50
+ async run(prompt, options) {
51
+ this.guardReentrancy();
52
+ this.guardDisposed();
53
+ const ac = this.createAbortController(options?.signal);
54
+ this.state = "running";
55
+ try {
56
+ const messages = [{ role: "user", content: prompt }];
57
+ return await this.executeRun(messages, options, ac.signal);
58
+ } finally {
59
+ this.state = "idle";
60
+ this.abortController = null;
61
+ }
62
+ }
63
+ async runWithContext(messages, options) {
64
+ this.guardReentrancy();
65
+ this.guardDisposed();
66
+ const ac = this.createAbortController(options?.signal);
67
+ this.state = "running";
68
+ try {
69
+ return await this.executeRun(messages, options, ac.signal);
70
+ } finally {
71
+ this.state = "idle";
72
+ this.abortController = null;
73
+ }
74
+ }
75
+ async runStructured(prompt, schema, options) {
76
+ this.guardReentrancy();
77
+ this.guardDisposed();
78
+ const ac = this.createAbortController(options?.signal);
79
+ this.state = "running";
80
+ try {
81
+ const messages = [{ role: "user", content: prompt }];
82
+ return await this.executeRunStructured(
83
+ messages,
84
+ schema,
85
+ options,
86
+ ac.signal
87
+ );
88
+ } finally {
89
+ this.state = "idle";
90
+ this.abortController = null;
91
+ }
92
+ }
93
+ async *stream(prompt, options) {
94
+ this.guardReentrancy();
95
+ this.guardDisposed();
96
+ const ac = this.createAbortController(options?.signal);
97
+ this.state = "streaming";
98
+ try {
99
+ const messages = [{ role: "user", content: prompt }];
100
+ yield* this.executeStream(messages, options, ac.signal);
101
+ } finally {
102
+ this.state = "idle";
103
+ this.abortController = null;
104
+ }
105
+ }
106
+ abort() {
107
+ if (this.abortController) {
108
+ this.abortController.abort();
109
+ }
110
+ }
111
+ getState() {
112
+ return this.state;
113
+ }
114
+ getConfig() {
115
+ return this.config;
116
+ }
117
+ /** Mark agent as disposed. Override to add cleanup. */
118
+ dispose() {
119
+ this.abort();
120
+ this.state = "disposed";
121
+ }
122
+ // ─── Guards ───────────────────────────────────────────────────
123
+ guardReentrancy() {
124
+ if (this.state === "running" || this.state === "streaming") {
125
+ throw new ReentrancyError();
126
+ }
127
+ }
128
+ guardDisposed() {
129
+ if (this.state === "disposed") {
130
+ throw new DisposedError("Agent");
131
+ }
132
+ }
133
+ /** Throw AbortError if signal is already aborted */
134
+ checkAbort(signal) {
135
+ if (signal.aborted) {
136
+ throw new AbortError();
137
+ }
138
+ }
139
+ // ─── Internal Helpers ─────────────────────────────────────────
140
+ createAbortController(externalSignal) {
141
+ const ac = new AbortController();
142
+ this.abortController = ac;
143
+ if (externalSignal) {
144
+ if (externalSignal.aborted) {
145
+ ac.abort();
146
+ } else {
147
+ externalSignal.addEventListener("abort", () => ac.abort(), {
148
+ once: true
149
+ });
150
+ }
151
+ }
152
+ return ac;
153
+ }
154
+ };
155
+
156
+ // src/utils/schema.ts
157
+ function zodToJsonSchema(schema) {
158
+ const schemaAny = schema;
159
+ if ("jsonSchema" in schema && typeof schemaAny.jsonSchema === "function") {
160
+ return schemaAny.jsonSchema();
161
+ }
162
+ return extractSchemaFromDef(schema);
163
+ }
164
+ function extractSchemaFromDef(schema) {
165
+ const def = schema._def;
166
+ const typeName = def.typeName;
167
+ switch (typeName) {
168
+ case "ZodString":
169
+ return { type: "string" };
170
+ case "ZodNumber":
171
+ return { type: "number" };
172
+ case "ZodBoolean":
173
+ return { type: "boolean" };
174
+ case "ZodNull":
175
+ return { type: "null" };
176
+ case "ZodArray":
177
+ return {
178
+ type: "array",
179
+ items: extractSchemaFromDef(def.type)
180
+ };
181
+ case "ZodObject": {
182
+ const shape = schema.shape;
183
+ const properties = {};
184
+ const required = [];
185
+ for (const [key, value] of Object.entries(shape)) {
186
+ const valueDef = value._def;
187
+ if (valueDef.typeName === "ZodOptional") {
188
+ properties[key] = extractSchemaFromDef(valueDef.innerType);
189
+ } else {
190
+ properties[key] = extractSchemaFromDef(value);
191
+ required.push(key);
192
+ }
193
+ }
194
+ return {
195
+ type: "object",
196
+ properties,
197
+ ...required.length > 0 ? { required } : {}
198
+ };
199
+ }
200
+ case "ZodOptional":
201
+ return extractSchemaFromDef(def.innerType);
202
+ case "ZodEnum":
203
+ return { type: "string", enum: def.values };
204
+ default:
205
+ return {};
206
+ }
207
+ }
208
+
209
+ // src/backends/claude.ts
210
+ var sdkModule = null;
211
+ async function loadSDK() {
212
+ if (sdkModule) return sdkModule;
213
+ try {
214
+ sdkModule = await import('@anthropic-ai/claude-agent-sdk');
215
+ return sdkModule;
216
+ } catch {
217
+ throw new SubprocessError(
218
+ "@anthropic-ai/claude-agent-sdk is not installed. Install it: npm install @anthropic-ai/claude-agent-sdk"
219
+ );
220
+ }
221
+ }
222
+ function _injectSDK(mock) {
223
+ sdkModule = mock;
224
+ }
225
+ function _resetSDK() {
226
+ sdkModule = null;
227
+ }
228
+ var CLAUDE_KNOWN_MODELS = [
229
+ { id: "claude-sonnet-4-5-20250514", name: "Claude Sonnet 4.5" },
230
+ { id: "claude-haiku-3-5-20241022", name: "Claude 3.5 Haiku" },
231
+ { id: "claude-opus-4-20250514", name: "Claude Opus 4" },
232
+ { id: "claude-sonnet-4-20250514", name: "Claude Sonnet 4" }
233
+ ];
234
+ function buildMcpServer(sdk, tools, toolResultCapture) {
235
+ if (tools.length === 0) return void 0;
236
+ const mcpTools = tools.map(
237
+ (tool) => sdk.tool(
238
+ tool.name,
239
+ tool.description ?? "",
240
+ zodToJsonSchema(tool.parameters),
241
+ async (args) => {
242
+ const result = await tool.execute(args);
243
+ if (toolResultCapture) {
244
+ toolResultCapture.set(tool.name, result);
245
+ }
246
+ return {
247
+ content: [
248
+ {
249
+ type: "text",
250
+ text: typeof result === "string" ? result : JSON.stringify(result)
251
+ }
252
+ ]
253
+ };
254
+ }
255
+ )
256
+ );
257
+ return sdk.createSdkMcpServer({
258
+ name: "agent-sdk-tools",
259
+ version: "1.0.0",
260
+ tools: mcpTools
261
+ });
262
+ }
263
+ function scopeToDestination(scope) {
264
+ switch (scope) {
265
+ case "once":
266
+ return "session";
267
+ case "session":
268
+ return "session";
269
+ case "project":
270
+ return "projectSettings";
271
+ case "always":
272
+ return "userSettings";
273
+ }
274
+ }
275
+ function destinationToScope(dest) {
276
+ switch (dest) {
277
+ case "session":
278
+ case "cliArg":
279
+ return "session";
280
+ case "projectSettings":
281
+ case "localSettings":
282
+ return "project";
283
+ case "userSettings":
284
+ return "always";
285
+ }
286
+ }
287
+ function extractSuggestedScope(suggestions) {
288
+ if (!suggestions || suggestions.length === 0) return void 0;
289
+ return destinationToScope(suggestions[0].destination);
290
+ }
291
+ function buildCanUseTool(config) {
292
+ const onPermission = config.supervisor?.onPermission;
293
+ if (!onPermission) return void 0;
294
+ const permissionStore = config.permissionStore;
295
+ return async (toolName, input, options) => {
296
+ if (permissionStore && await permissionStore.isApproved(toolName)) {
297
+ return {
298
+ behavior: "allow",
299
+ toolUseID: options.toolUseID
300
+ };
301
+ }
302
+ const unifiedRequest = {
303
+ toolName,
304
+ toolArgs: input,
305
+ suggestedScope: extractSuggestedScope(options.suggestions),
306
+ rawSDKRequest: { toolName, input, ...options }
307
+ };
308
+ const decision = await onPermission(
309
+ unifiedRequest,
310
+ options.signal
311
+ );
312
+ if (decision.allowed) {
313
+ if (permissionStore && decision.scope) {
314
+ await permissionStore.approve(toolName, decision.scope);
315
+ }
316
+ const result = {
317
+ behavior: "allow",
318
+ toolUseID: options.toolUseID
319
+ };
320
+ if (decision.modifiedInput) {
321
+ result.updatedInput = decision.modifiedInput;
322
+ }
323
+ if (decision.scope && decision.scope !== "once" && options.suggestions) {
324
+ result.updatedPermissions = options.suggestions.map((s) => ({
325
+ ...s,
326
+ destination: scopeToDestination(decision.scope)
327
+ }));
328
+ }
329
+ return result;
330
+ }
331
+ return {
332
+ behavior: "deny",
333
+ message: decision.reason ?? "Permission denied",
334
+ toolUseID: options.toolUseID
335
+ };
336
+ };
337
+ }
338
+ function aggregateUsage(modelUsage) {
339
+ let promptTokens = 0;
340
+ let completionTokens = 0;
341
+ for (const u of Object.values(modelUsage ?? {})) {
342
+ promptTokens += u.inputTokens ?? 0;
343
+ completionTokens += u.outputTokens ?? 0;
344
+ }
345
+ return { promptTokens, completionTokens };
346
+ }
347
+ function mapSDKMessage(msg, thinkingBlockIndices) {
348
+ switch (msg.type) {
349
+ case "assistant": {
350
+ const betaMessage = msg.message;
351
+ if (!betaMessage?.content) return null;
352
+ const events = [];
353
+ const textParts = betaMessage.content.filter((b) => b.type === "text" && b.text).map((b) => b.text).join("");
354
+ if (textParts) {
355
+ events.push({ type: "text_delta", text: textParts });
356
+ }
357
+ for (const block of betaMessage.content) {
358
+ if (block.type === "tool_use") {
359
+ events.push({
360
+ type: "tool_call_start",
361
+ toolName: block.name ?? "unknown",
362
+ args: block.input ?? {}
363
+ });
364
+ }
365
+ }
366
+ return events.length > 0 ? events : null;
367
+ }
368
+ case "user": {
369
+ const toolResult = msg.tool_use_result;
370
+ if (toolResult !== void 0) {
371
+ return null;
372
+ }
373
+ return null;
374
+ }
375
+ case "tool_use_summary": {
376
+ const summary = msg.summary;
377
+ const toolName = msg.tool_name ?? "unknown";
378
+ if (summary) {
379
+ return {
380
+ type: "tool_call_end",
381
+ toolName,
382
+ result: summary
383
+ };
384
+ }
385
+ return null;
386
+ }
387
+ case "stream_event": {
388
+ const event = msg.event;
389
+ if (!event) return null;
390
+ if (event.type === "content_block_delta" && event.delta?.type === "text_delta" && event.delta.text) {
391
+ return { type: "text_delta", text: event.delta.text };
392
+ }
393
+ if (event.type === "content_block_start" && event.content_block?.type === "thinking") {
394
+ if (thinkingBlockIndices && event.index !== void 0) {
395
+ thinkingBlockIndices.add(event.index);
396
+ }
397
+ return { type: "thinking_start" };
398
+ }
399
+ if (event.type === "content_block_stop" && event.index !== void 0 && thinkingBlockIndices?.has(event.index)) {
400
+ thinkingBlockIndices.delete(event.index);
401
+ return { type: "thinking_end" };
402
+ }
403
+ return null;
404
+ }
405
+ case "tool_progress": {
406
+ const toolName = msg.tool_name;
407
+ return toolName ? { type: "tool_call_start", toolName, args: {} } : null;
408
+ }
409
+ case "result": {
410
+ if (msg.subtype === "success") {
411
+ const r = msg;
412
+ return {
413
+ type: "usage_update",
414
+ ...aggregateUsage(r.modelUsage)
415
+ };
416
+ }
417
+ if (msg.is_error) {
418
+ const r = msg;
419
+ return {
420
+ type: "error",
421
+ error: r.errors?.join("; ") ?? "Unknown error",
422
+ recoverable: false
423
+ };
424
+ }
425
+ return null;
426
+ }
427
+ default:
428
+ return null;
429
+ }
430
+ }
431
+ var ClaudeAgent = class extends BaseAgent {
432
+ options;
433
+ tools;
434
+ canUseTool;
435
+ constructor(config, options) {
436
+ super(config);
437
+ this.options = options;
438
+ this.tools = config.tools;
439
+ this.canUseTool = buildCanUseTool(config);
440
+ if (config.supervisor?.onAskUser) {
441
+ console.warn(
442
+ "[agent-sdk/claude] supervisor.onAskUser is not supported by the Claude CLI backend. User interaction requests from the model will not be forwarded."
443
+ );
444
+ }
445
+ }
446
+ buildQueryOptions(signal) {
447
+ const ac = new AbortController();
448
+ signal.addEventListener("abort", () => ac.abort(), { once: true });
449
+ const opts = {
450
+ abortController: ac,
451
+ model: this.config.model,
452
+ maxTurns: this.options.maxTurns,
453
+ cwd: this.options.workingDirectory,
454
+ pathToClaudeCodeExecutable: this.options.cliPath,
455
+ persistSession: false,
456
+ includePartialMessages: true,
457
+ canUseTool: this.canUseTool
458
+ };
459
+ if (this.config.systemPrompt) {
460
+ opts.systemPrompt = this.config.systemPrompt;
461
+ }
462
+ return opts;
463
+ }
464
+ async buildMcpConfig(opts, toolResultCapture) {
465
+ if (this.tools.length === 0) return opts;
466
+ const sdk = await loadSDK();
467
+ const mcpServer = buildMcpServer(sdk, this.tools, toolResultCapture);
468
+ if (mcpServer) {
469
+ opts.mcpServers = {
470
+ "agent-sdk-tools": mcpServer
471
+ };
472
+ }
473
+ return opts;
474
+ }
475
+ // ─── executeRun ─────────────────────────────────────────────────
476
+ async executeRun(messages, _options, signal) {
477
+ this.checkAbort(signal);
478
+ const sdk = await loadSDK();
479
+ const prompt = extractLastUserPrompt(messages);
480
+ let opts = this.buildQueryOptions(signal);
481
+ const toolResultCapture = /* @__PURE__ */ new Map();
482
+ opts = await this.buildMcpConfig(opts, toolResultCapture);
483
+ const q = sdk.query({ prompt, options: opts });
484
+ const toolCalls = [];
485
+ let output = null;
486
+ let usage;
487
+ try {
488
+ for await (const msg of q) {
489
+ if (msg.type === "assistant") {
490
+ const betaMessage = msg.message;
491
+ if (betaMessage?.content) {
492
+ for (const block of betaMessage.content) {
493
+ if (block.type === "tool_use") {
494
+ const toolName = block.name ?? "unknown";
495
+ toolCalls.push({
496
+ toolName,
497
+ args: block.input ?? {},
498
+ result: toolResultCapture.get(toolName) ?? null,
499
+ approved: true
500
+ });
501
+ }
502
+ }
503
+ }
504
+ }
505
+ if (msg.type === "tool_use_summary" || msg.type === "result") {
506
+ for (const tc of toolCalls) {
507
+ if (tc.result === null) {
508
+ const captured = toolResultCapture.get(tc.toolName);
509
+ if (captured !== void 0) tc.result = captured;
510
+ }
511
+ }
512
+ }
513
+ if (msg.type === "result") {
514
+ if (msg.subtype === "success") {
515
+ const r = msg;
516
+ output = r.result;
517
+ usage = aggregateUsage(r.modelUsage);
518
+ } else if (msg.is_error) {
519
+ const r = msg;
520
+ throw new Error(
521
+ `Claude query failed: ${r.errors?.join("; ") ?? "unknown error"}`
522
+ );
523
+ }
524
+ }
525
+ }
526
+ } catch (e) {
527
+ if (signal.aborted) throw new AbortError();
528
+ throw e;
529
+ }
530
+ return {
531
+ output,
532
+ structuredOutput: void 0,
533
+ toolCalls,
534
+ messages: [
535
+ ...messages,
536
+ ...output !== null ? [{ role: "assistant", content: output }] : []
537
+ ],
538
+ usage
539
+ };
540
+ }
541
+ // ─── executeRunStructured ───────────────────────────────────────
542
+ async executeRunStructured(messages, schema, _options, signal) {
543
+ this.checkAbort(signal);
544
+ const sdk = await loadSDK();
545
+ const prompt = extractLastUserPrompt(messages);
546
+ let opts = this.buildQueryOptions(signal);
547
+ opts = await this.buildMcpConfig(opts);
548
+ const jsonSchema = zodToJsonSchema(schema.schema);
549
+ opts.outputFormat = {
550
+ type: "json_schema",
551
+ schema: jsonSchema
552
+ };
553
+ const q = sdk.query({ prompt, options: opts });
554
+ const toolCalls = [];
555
+ let output = null;
556
+ let structuredOutput;
557
+ let usage;
558
+ try {
559
+ for await (const msg of q) {
560
+ if (msg.type === "result" && msg.subtype === "success") {
561
+ const r = msg;
562
+ output = r.result;
563
+ if (r.structured_output !== void 0) {
564
+ try {
565
+ structuredOutput = schema.schema.parse(r.structured_output);
566
+ } catch {
567
+ try {
568
+ structuredOutput = schema.schema.parse(JSON.parse(r.result));
569
+ } catch {
570
+ }
571
+ }
572
+ } else if (r.result) {
573
+ try {
574
+ const jsonMatch = r.result.match(/```(?:json)?\s*([\s\S]*?)```/);
575
+ const raw = jsonMatch ? jsonMatch[1].trim() : r.result.trim();
576
+ structuredOutput = schema.schema.parse(JSON.parse(raw));
577
+ } catch {
578
+ }
579
+ }
580
+ usage = aggregateUsage(r.modelUsage);
581
+ } else if (msg.type === "result" && msg.is_error) {
582
+ const r = msg;
583
+ throw new Error(
584
+ `Claude query failed: ${r.errors?.join("; ") ?? "unknown error"}`
585
+ );
586
+ }
587
+ }
588
+ } catch (e) {
589
+ if (signal.aborted) throw new AbortError();
590
+ throw e;
591
+ }
592
+ return {
593
+ output,
594
+ structuredOutput,
595
+ toolCalls,
596
+ messages: [
597
+ ...messages,
598
+ ...output !== null ? [{ role: "assistant", content: output }] : []
599
+ ],
600
+ usage
601
+ };
602
+ }
603
+ // ─── executeStream ──────────────────────────────────────────────
604
+ async *executeStream(messages, _options, signal) {
605
+ this.checkAbort(signal);
606
+ const sdk = await loadSDK();
607
+ const prompt = extractLastUserPrompt(messages);
608
+ let opts = this.buildQueryOptions(signal);
609
+ opts = await this.buildMcpConfig(opts);
610
+ const q = sdk.query({ prompt, options: opts });
611
+ const thinkingBlockIndices = /* @__PURE__ */ new Set();
612
+ try {
613
+ for await (const msg of q) {
614
+ if (signal.aborted) throw new AbortError();
615
+ const event = mapSDKMessage(msg, thinkingBlockIndices);
616
+ if (event) {
617
+ if (Array.isArray(event)) {
618
+ for (const e of event) yield e;
619
+ } else {
620
+ yield event;
621
+ }
622
+ }
623
+ if (msg.type === "result" && msg.subtype === "success") {
624
+ const r = msg;
625
+ yield { type: "done", finalOutput: r.result };
626
+ }
627
+ }
628
+ } catch (e) {
629
+ if (signal.aborted) throw new AbortError();
630
+ throw e;
631
+ }
632
+ }
633
+ dispose() {
634
+ super.dispose();
635
+ }
636
+ };
637
+ function extractLastUserPrompt(messages) {
638
+ for (let i = messages.length - 1; i >= 0; i--) {
639
+ const msg = messages[i];
640
+ if (msg.role === "user") {
641
+ return getTextContent(msg.content);
642
+ }
643
+ }
644
+ return "";
645
+ }
646
+ var ClaudeAgentService = class {
647
+ name = "claude";
648
+ disposed = false;
649
+ options;
650
+ cachedModels = null;
651
+ constructor(options) {
652
+ this.options = options;
653
+ }
654
+ createAgent(config) {
655
+ if (this.disposed) throw new DisposedError("ClaudeAgentService");
656
+ return new ClaudeAgent(config, this.options);
657
+ }
658
+ async listModels() {
659
+ if (this.disposed) throw new DisposedError("ClaudeAgentService");
660
+ if (this.cachedModels) return this.cachedModels;
661
+ this.cachedModels = CLAUDE_KNOWN_MODELS.map((m) => ({
662
+ id: m.id,
663
+ name: m.name,
664
+ provider: "claude"
665
+ }));
666
+ return this.cachedModels;
667
+ }
668
+ async validate() {
669
+ if (this.disposed) throw new DisposedError("ClaudeAgentService");
670
+ const errors = [];
671
+ try {
672
+ await loadSDK();
673
+ } catch (e) {
674
+ errors.push(
675
+ e instanceof Error ? e.message : String(e)
676
+ );
677
+ return { valid: false, errors };
678
+ }
679
+ try {
680
+ const sdk = await loadSDK();
681
+ const q = sdk.query({
682
+ prompt: "echo test",
683
+ options: {
684
+ model: CLAUDE_KNOWN_MODELS[0].id,
685
+ pathToClaudeCodeExecutable: this.options.cliPath,
686
+ cwd: this.options.workingDirectory,
687
+ persistSession: false,
688
+ maxTurns: 1,
689
+ permissionMode: "plan"
690
+ }
691
+ });
692
+ const first = await q.next();
693
+ q.close();
694
+ if (first.done) {
695
+ errors.push("Claude CLI returned no messages \u2014 may not be authenticated.");
696
+ }
697
+ } catch (e) {
698
+ errors.push(
699
+ `Failed to connect to Claude CLI: ${e instanceof Error ? e.message : String(e)}`
700
+ );
701
+ }
702
+ return { valid: errors.length === 0, errors };
703
+ }
704
+ async dispose() {
705
+ if (this.disposed) return;
706
+ this.disposed = true;
707
+ this.cachedModels = null;
708
+ }
709
+ };
710
+ function createClaudeService(options) {
711
+ return new ClaudeAgentService(options);
712
+ }
713
+
714
+ exports._injectSDK = _injectSDK;
715
+ exports._resetSDK = _resetSDK;
716
+ exports.createClaudeService = createClaudeService;
717
+ //# sourceMappingURL=claude.cjs.map
718
+ //# sourceMappingURL=claude.cjs.map