@anthropic-ai/claude-agent-sdk 0.1.72 → 0.1.74
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/cli.js +1375 -1433
- package/entrypoints/agentSdkTypes.d.ts +11 -7
- package/package.json +1 -1
- package/sdk-tools.d.ts +0 -8
- package/sdk.mjs +59 -42
|
@@ -311,14 +311,14 @@ export type HookJSONOutput = AsyncHookJSONOutput | SyncHookJSONOutput;
|
|
|
311
311
|
*/
|
|
312
312
|
export type PermissionMode = 'default' | 'acceptEdits' | 'bypassPermissions' | 'plan' | 'delegate' | 'dontAsk';
|
|
313
313
|
/**
|
|
314
|
-
* Information about an available
|
|
314
|
+
* Information about an available skill (invoked via /command syntax).
|
|
315
315
|
*/
|
|
316
316
|
export type SlashCommand = {
|
|
317
|
-
/**
|
|
317
|
+
/** Skill name (without the leading slash) */
|
|
318
318
|
name: string;
|
|
319
|
-
/** Description of what the
|
|
319
|
+
/** Description of what the skill does */
|
|
320
320
|
description: string;
|
|
321
|
-
/** Hint for
|
|
321
|
+
/** Hint for skill arguments (e.g., "<file>") */
|
|
322
322
|
argumentHint: string;
|
|
323
323
|
};
|
|
324
324
|
/**
|
|
@@ -561,9 +561,9 @@ export interface Query extends AsyncGenerator<SDKMessage, void> {
|
|
|
561
561
|
*/
|
|
562
562
|
setMaxThinkingTokens(maxThinkingTokens: number | null): Promise<void>;
|
|
563
563
|
/**
|
|
564
|
-
* Get the list of available
|
|
564
|
+
* Get the list of available skills for the current session.
|
|
565
565
|
*
|
|
566
|
-
* @returns Array of available
|
|
566
|
+
* @returns Array of available skills with their names and descriptions
|
|
567
567
|
*/
|
|
568
568
|
supportedCommands(): Promise<SlashCommand[]>;
|
|
569
569
|
/**
|
|
@@ -596,13 +596,17 @@ export interface Query extends AsyncGenerator<SDKMessage, void> {
|
|
|
596
596
|
* This replaces the current set of dynamically-added MCP servers with the provided set.
|
|
597
597
|
* Servers that are removed will be disconnected, and new servers will be connected.
|
|
598
598
|
*
|
|
599
|
+
* Supports both process-based servers (stdio, sse, http) and SDK servers (in-process).
|
|
600
|
+
* SDK servers are handled locally in the SDK process, while process-based servers
|
|
601
|
+
* are managed by the CLI subprocess.
|
|
602
|
+
*
|
|
599
603
|
* Note: This only affects servers added dynamically via this method or the SDK.
|
|
600
604
|
* Servers configured via settings files are not affected.
|
|
601
605
|
*
|
|
602
606
|
* @param servers - Record of server name to configuration. Pass an empty object to remove all dynamic servers.
|
|
603
607
|
* @returns Information about which servers were added, removed, and any connection errors
|
|
604
608
|
*/
|
|
605
|
-
setMcpServers(servers: Record<string,
|
|
609
|
+
setMcpServers(servers: Record<string, McpServerConfig>): Promise<McpSetServersResult>;
|
|
606
610
|
/**
|
|
607
611
|
* Stream input messages to the query.
|
|
608
612
|
* Used internally for multi-turn conversations.
|
package/package.json
CHANGED
package/sdk-tools.d.ts
CHANGED
|
@@ -102,14 +102,6 @@ export interface TaskOutputInput {
|
|
|
102
102
|
timeout?: number;
|
|
103
103
|
}
|
|
104
104
|
export interface ExitPlanModeInput {
|
|
105
|
-
/**
|
|
106
|
-
* Whether to launch a swarm to implement the plan
|
|
107
|
-
*/
|
|
108
|
-
launchSwarm?: boolean;
|
|
109
|
-
/**
|
|
110
|
-
* Number of teammates to spawn in the swarm
|
|
111
|
-
*/
|
|
112
|
-
teammateCount?: number;
|
|
113
105
|
[k: string]: unknown;
|
|
114
106
|
}
|
|
115
107
|
export interface FileEditInput {
|
package/sdk.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// (c) Anthropic PBC. All rights reserved. Use is subject to the Legal Agreements outlined here: https://code.claude.com/docs/en/legal-and-compliance.
|
|
3
3
|
|
|
4
|
-
// Version: 0.1.
|
|
4
|
+
// Version: 0.1.74
|
|
5
5
|
|
|
6
6
|
// Want to see the unminified source? We're hiring!
|
|
7
7
|
// https://job-boards.greenhouse.io/anthropic/jobs/4816199008
|
|
@@ -12599,6 +12599,7 @@ function getInitialState() {
|
|
|
12599
12599
|
needsPlanModeExitAttachment: false,
|
|
12600
12600
|
hasExitedDelegateMode: false,
|
|
12601
12601
|
needsDelegateModeExitAttachment: false,
|
|
12602
|
+
lspRecommendationShownThisSession: false,
|
|
12602
12603
|
initJsonSchema: null,
|
|
12603
12604
|
registeredHooks: null,
|
|
12604
12605
|
planSlugCache: new Map,
|
|
@@ -13513,14 +13514,10 @@ class Query {
|
|
|
13513
13514
|
hookCallbacks = new Map;
|
|
13514
13515
|
nextCallbackId = 0;
|
|
13515
13516
|
sdkMcpTransports = new Map;
|
|
13517
|
+
sdkMcpServerInstances = new Map;
|
|
13516
13518
|
pendingMcpResponses = new Map;
|
|
13517
|
-
lastActivityTime = Date.now();
|
|
13518
|
-
userInputEndedResolve;
|
|
13519
|
-
streamCloseTimeout;
|
|
13520
13519
|
firstResultReceivedResolve;
|
|
13521
|
-
|
|
13522
|
-
this.lastActivityTime = Date.now();
|
|
13523
|
-
}
|
|
13520
|
+
firstResultReceived = false;
|
|
13524
13521
|
hasBidirectionalNeeds() {
|
|
13525
13522
|
return this.sdkMcpTransports.size > 0 || this.hooks !== undefined && Object.keys(this.hooks).length > 0 || this.canUseTool !== undefined;
|
|
13526
13523
|
}
|
|
@@ -13532,14 +13529,8 @@ class Query {
|
|
|
13532
13529
|
this.abortController = abortController;
|
|
13533
13530
|
this.jsonSchema = jsonSchema;
|
|
13534
13531
|
this.initConfig = initConfig;
|
|
13535
|
-
this.streamCloseTimeout = 5000;
|
|
13536
|
-
if (typeof process !== "undefined" && process.env?.CLAUDE_CODE_STREAM_CLOSE_TIMEOUT) {
|
|
13537
|
-
this.streamCloseTimeout = parseInt(process.env.CLAUDE_CODE_STREAM_CLOSE_TIMEOUT);
|
|
13538
|
-
}
|
|
13539
13532
|
for (const [name, server] of sdkMcpServers) {
|
|
13540
|
-
|
|
13541
|
-
this.sdkMcpTransports.set(name, sdkTransport);
|
|
13542
|
-
server.connect(sdkTransport);
|
|
13533
|
+
this.connectSdkMcpServer(name, server);
|
|
13543
13534
|
}
|
|
13544
13535
|
this.sdkMessages = this.readSdkMessages();
|
|
13545
13536
|
this.readMessages();
|
|
@@ -13590,7 +13581,6 @@ class Query {
|
|
|
13590
13581
|
async readMessages() {
|
|
13591
13582
|
try {
|
|
13592
13583
|
for await (const message of this.transport.readMessages()) {
|
|
13593
|
-
this.resetLastActivityTime();
|
|
13594
13584
|
if (message.type === "control_response") {
|
|
13595
13585
|
const handler = this.pendingControlResponses.get(message.response.request_id);
|
|
13596
13586
|
if (handler) {
|
|
@@ -13607,6 +13597,7 @@ class Query {
|
|
|
13607
13597
|
continue;
|
|
13608
13598
|
}
|
|
13609
13599
|
if (message.type === "result") {
|
|
13600
|
+
this.firstResultReceived = true;
|
|
13610
13601
|
if (this.firstResultReceivedResolve) {
|
|
13611
13602
|
this.firstResultReceivedResolve();
|
|
13612
13603
|
}
|
|
@@ -13617,14 +13608,14 @@ class Query {
|
|
|
13617
13608
|
}
|
|
13618
13609
|
this.inputStream.enqueue(message);
|
|
13619
13610
|
}
|
|
13620
|
-
if (this.
|
|
13621
|
-
this.
|
|
13611
|
+
if (this.firstResultReceivedResolve) {
|
|
13612
|
+
this.firstResultReceivedResolve();
|
|
13622
13613
|
}
|
|
13623
13614
|
this.inputStream.done();
|
|
13624
13615
|
this.cleanup();
|
|
13625
13616
|
} catch (error) {
|
|
13626
|
-
if (this.
|
|
13627
|
-
this.
|
|
13617
|
+
if (this.firstResultReceivedResolve) {
|
|
13618
|
+
this.firstResultReceivedResolve();
|
|
13628
13619
|
}
|
|
13629
13620
|
this.inputStream.error(error);
|
|
13630
13621
|
this.cleanup(error);
|
|
@@ -13817,9 +13808,34 @@ class Query {
|
|
|
13817
13808
|
return mcpStatusResponse.mcpServers;
|
|
13818
13809
|
}
|
|
13819
13810
|
async setMcpServers(servers) {
|
|
13811
|
+
const sdkServers = {};
|
|
13812
|
+
const processServers = {};
|
|
13813
|
+
for (const [name, config] of Object.entries(servers)) {
|
|
13814
|
+
if (config.type === "sdk" && "instance" in config) {
|
|
13815
|
+
sdkServers[name] = config.instance;
|
|
13816
|
+
} else {
|
|
13817
|
+
processServers[name] = config;
|
|
13818
|
+
}
|
|
13819
|
+
}
|
|
13820
|
+
const currentSdkNames = new Set(this.sdkMcpServerInstances.keys());
|
|
13821
|
+
const newSdkNames = new Set(Object.keys(sdkServers));
|
|
13822
|
+
for (const name of currentSdkNames) {
|
|
13823
|
+
if (!newSdkNames.has(name)) {
|
|
13824
|
+
await this.disconnectSdkMcpServer(name);
|
|
13825
|
+
}
|
|
13826
|
+
}
|
|
13827
|
+
for (const [name, server] of Object.entries(sdkServers)) {
|
|
13828
|
+
if (!currentSdkNames.has(name)) {
|
|
13829
|
+
this.connectSdkMcpServer(name, server);
|
|
13830
|
+
}
|
|
13831
|
+
}
|
|
13832
|
+
const sdkServerConfigs = {};
|
|
13833
|
+
for (const name of Object.keys(sdkServers)) {
|
|
13834
|
+
sdkServerConfigs[name] = { type: "sdk", name };
|
|
13835
|
+
}
|
|
13820
13836
|
const response = await this.request({
|
|
13821
13837
|
subtype: "mcp_set_servers",
|
|
13822
|
-
servers
|
|
13838
|
+
servers: { ...processServers, ...sdkServerConfigs }
|
|
13823
13839
|
});
|
|
13824
13840
|
return response.response;
|
|
13825
13841
|
}
|
|
@@ -13840,8 +13856,8 @@ class Query {
|
|
|
13840
13856
|
}
|
|
13841
13857
|
logForDebugging(`[Query.streamInput] Finished processing ${messageCount} messages from input stream`);
|
|
13842
13858
|
if (this.hasBidirectionalNeeds()) {
|
|
13843
|
-
logForDebugging(`[Query.streamInput] Has bidirectional needs, waiting for
|
|
13844
|
-
await this.
|
|
13859
|
+
logForDebugging(`[Query.streamInput] Has bidirectional needs, waiting for first result`);
|
|
13860
|
+
await this.waitForFirstResult();
|
|
13845
13861
|
}
|
|
13846
13862
|
logForDebugging(`[Query] Calling transport.endInput() to close stdin to CLI process`);
|
|
13847
13863
|
this.transport.endInput();
|
|
@@ -13851,10 +13867,12 @@ class Query {
|
|
|
13851
13867
|
}
|
|
13852
13868
|
}
|
|
13853
13869
|
}
|
|
13854
|
-
|
|
13855
|
-
|
|
13870
|
+
waitForFirstResult() {
|
|
13871
|
+
if (this.firstResultReceived) {
|
|
13872
|
+
logForDebugging(`[Query.waitForFirstResult] Result already received, returning immediately`);
|
|
13873
|
+
return Promise.resolve();
|
|
13874
|
+
}
|
|
13856
13875
|
return new Promise((resolve) => {
|
|
13857
|
-
this.userInputEndedResolve = resolve;
|
|
13858
13876
|
if (this.abortController?.signal.aborted) {
|
|
13859
13877
|
resolve();
|
|
13860
13878
|
return;
|
|
@@ -13862,22 +13880,7 @@ class Query {
|
|
|
13862
13880
|
this.abortController?.signal.addEventListener("abort", () => resolve(), {
|
|
13863
13881
|
once: true
|
|
13864
13882
|
});
|
|
13865
|
-
|
|
13866
|
-
if (this.abortController?.signal.aborted) {
|
|
13867
|
-
resolve();
|
|
13868
|
-
return;
|
|
13869
|
-
}
|
|
13870
|
-
const elapsed = Date.now() - this.lastActivityTime;
|
|
13871
|
-
if (elapsed >= this.streamCloseTimeout) {
|
|
13872
|
-
logForDebugging(`[Query.waitForInactivity] Inactivity timeout reached (${elapsed}ms elapsed). ` + `Closing stdin. If your tools or hooks need more time, set CLAUDE_CODE_STREAM_CLOSE_TIMEOUT ` + `to a higher value (current: ${this.streamCloseTimeout}ms).`);
|
|
13873
|
-
resolve();
|
|
13874
|
-
} else {
|
|
13875
|
-
const remaining = this.streamCloseTimeout - elapsed;
|
|
13876
|
-
logForDebugging(`[Query.waitForInactivity] Still active, checking again in ${remaining}ms`);
|
|
13877
|
-
setTimeout(checkInactivity, remaining);
|
|
13878
|
-
}
|
|
13879
|
-
};
|
|
13880
|
-
checkInactivity();
|
|
13883
|
+
this.firstResultReceivedResolve = resolve;
|
|
13881
13884
|
});
|
|
13882
13885
|
}
|
|
13883
13886
|
handleHookCallbacks(callbackId, input, toolUseID, abortSignal) {
|
|
@@ -13889,6 +13892,20 @@ class Query {
|
|
|
13889
13892
|
signal: abortSignal
|
|
13890
13893
|
});
|
|
13891
13894
|
}
|
|
13895
|
+
connectSdkMcpServer(name, server) {
|
|
13896
|
+
const sdkTransport = new SdkControlServerTransport((message) => this.sendMcpServerMessageToCli(name, message));
|
|
13897
|
+
this.sdkMcpTransports.set(name, sdkTransport);
|
|
13898
|
+
this.sdkMcpServerInstances.set(name, server);
|
|
13899
|
+
server.connect(sdkTransport);
|
|
13900
|
+
}
|
|
13901
|
+
async disconnectSdkMcpServer(name) {
|
|
13902
|
+
const transport = this.sdkMcpTransports.get(name);
|
|
13903
|
+
if (transport) {
|
|
13904
|
+
await transport.close();
|
|
13905
|
+
this.sdkMcpTransports.delete(name);
|
|
13906
|
+
}
|
|
13907
|
+
this.sdkMcpServerInstances.delete(name);
|
|
13908
|
+
}
|
|
13892
13909
|
sendMcpServerMessageToCli(serverName, message) {
|
|
13893
13910
|
if ("id" in message && message.id !== null && message.id !== undefined) {
|
|
13894
13911
|
const key = `${serverName}:${message.id}`;
|
|
@@ -26708,7 +26725,7 @@ function query({
|
|
|
26708
26725
|
const dirname2 = join5(filename, "..");
|
|
26709
26726
|
pathToClaudeCodeExecutable = join5(dirname2, "cli.js");
|
|
26710
26727
|
}
|
|
26711
|
-
process.env.CLAUDE_AGENT_SDK_VERSION = "0.1.
|
|
26728
|
+
process.env.CLAUDE_AGENT_SDK_VERSION = "0.1.74";
|
|
26712
26729
|
const {
|
|
26713
26730
|
abortController = createAbortController(),
|
|
26714
26731
|
additionalDirectories = [],
|