@github/copilot-sdk 0.1.29 → 0.1.31-unstable.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.
@@ -2,7 +2,7 @@
2
2
  * The SDK protocol version.
3
3
  * This must match the version expected by the copilot-agent-runtime server.
4
4
  */
5
- export declare const SDK_PROTOCOL_VERSION = 2;
5
+ export declare const SDK_PROTOCOL_VERSION = 3;
6
6
  /**
7
7
  * Gets the SDK protocol version.
8
8
  * @returns The protocol version number
@@ -1,4 +1,4 @@
1
- const SDK_PROTOCOL_VERSION = 2;
1
+ const SDK_PROTOCOL_VERSION = 3;
2
2
  function getSdkProtocolVersion() {
3
3
  return SDK_PROTOCOL_VERSION;
4
4
  }
package/dist/session.d.ts CHANGED
@@ -4,7 +4,7 @@
4
4
  */
5
5
  import type { MessageConnection } from "vscode-jsonrpc/node";
6
6
  import { createSessionRpc } from "./generated/rpc.js";
7
- import type { MessageOptions, PermissionHandler, PermissionRequestResult, SessionEvent, SessionEventHandler, SessionEventType, SessionHooks, Tool, ToolHandler, TypedSessionEventHandler, UserInputHandler, UserInputResponse } from "./types.js";
7
+ import type { MessageOptions, PermissionHandler, SessionEvent, SessionEventHandler, SessionEventType, SessionHooks, Tool, ToolHandler, TypedSessionEventHandler, UserInputHandler, UserInputResponse } from "./types.js";
8
8
  /** Assistant message event - the final response from the assistant. */
9
9
  export type AssistantMessageEvent = Extract<SessionEvent, {
10
10
  type: "assistant.message";
@@ -155,11 +155,29 @@ export declare class CopilotSession {
155
155
  on(handler: SessionEventHandler): () => void;
156
156
  /**
157
157
  * Dispatches an event to all registered handlers.
158
+ * Also handles broadcast request events internally (external tool calls, permissions).
158
159
  *
159
160
  * @param event - The session event to dispatch
160
161
  * @internal This method is for internal use by the SDK.
161
162
  */
162
163
  _dispatchEvent(event: SessionEvent): void;
164
+ /**
165
+ * Handles broadcast request events by executing local handlers and responding via RPC.
166
+ * Handlers are dispatched as fire-and-forget — rejections propagate as unhandled promise
167
+ * rejections, consistent with standard EventEmitter / event handler semantics.
168
+ * @internal
169
+ */
170
+ private _handleBroadcastEvent;
171
+ /**
172
+ * Executes a tool handler and sends the result back via RPC.
173
+ * @internal
174
+ */
175
+ private _executeToolAndRespond;
176
+ /**
177
+ * Executes a permission handler and sends the result back via RPC.
178
+ * @internal
179
+ */
180
+ private _executePermissionAndRespond;
163
181
  /**
164
182
  * Registers custom tool handlers for this session.
165
183
  *
@@ -208,14 +226,6 @@ export declare class CopilotSession {
208
226
  * @internal This method is typically called internally when creating a session.
209
227
  */
210
228
  registerHooks(hooks?: SessionHooks): void;
211
- /**
212
- * Handles a permission request from the Copilot CLI.
213
- *
214
- * @param request - The permission request data from the CLI
215
- * @returns A promise that resolves with the permission decision
216
- * @internal This method is for internal use by the SDK.
217
- */
218
- _handlePermissionRequest(request: unknown): Promise<PermissionRequestResult>;
219
229
  /**
220
230
  * Handles a user input request from the Copilot CLI.
221
231
  *
@@ -291,4 +301,16 @@ export declare class CopilotSession {
291
301
  * ```
292
302
  */
293
303
  abort(): Promise<void>;
304
+ /**
305
+ * Change the model for this session.
306
+ * The new model takes effect for the next message. Conversation history is preserved.
307
+ *
308
+ * @param model - Model ID to switch to
309
+ *
310
+ * @example
311
+ * ```typescript
312
+ * await session.setModel("gpt-4.1");
313
+ * ```
314
+ */
315
+ setModel(model: string): Promise<void>;
294
316
  }
package/dist/session.js CHANGED
@@ -152,11 +152,13 @@ class CopilotSession {
152
152
  }
153
153
  /**
154
154
  * Dispatches an event to all registered handlers.
155
+ * Also handles broadcast request events internally (external tool calls, permissions).
155
156
  *
156
157
  * @param event - The session event to dispatch
157
158
  * @internal This method is for internal use by the SDK.
158
159
  */
159
160
  _dispatchEvent(event) {
161
+ this._handleBroadcastEvent(event);
160
162
  const typedHandlers = this.typedEventHandlers.get(event.type);
161
163
  if (typedHandlers) {
162
164
  for (const handler of typedHandlers) {
@@ -173,6 +175,73 @@ class CopilotSession {
173
175
  }
174
176
  }
175
177
  }
178
+ /**
179
+ * Handles broadcast request events by executing local handlers and responding via RPC.
180
+ * Handlers are dispatched as fire-and-forget — rejections propagate as unhandled promise
181
+ * rejections, consistent with standard EventEmitter / event handler semantics.
182
+ * @internal
183
+ */
184
+ _handleBroadcastEvent(event) {
185
+ if (event.type === "external_tool.requested") {
186
+ const { requestId, toolName } = event.data;
187
+ const args = event.data.arguments;
188
+ const toolCallId = event.data.toolCallId;
189
+ const handler = this.toolHandlers.get(toolName);
190
+ if (handler) {
191
+ void this._executeToolAndRespond(requestId, toolName, toolCallId, args, handler);
192
+ }
193
+ } else if (event.type === "permission.requested") {
194
+ const { requestId, permissionRequest } = event.data;
195
+ if (this.permissionHandler) {
196
+ void this._executePermissionAndRespond(requestId, permissionRequest);
197
+ }
198
+ }
199
+ }
200
+ /**
201
+ * Executes a tool handler and sends the result back via RPC.
202
+ * @internal
203
+ */
204
+ async _executeToolAndRespond(requestId, toolName, toolCallId, args, handler) {
205
+ try {
206
+ const rawResult = await handler(args, {
207
+ sessionId: this.sessionId,
208
+ toolCallId,
209
+ toolName,
210
+ arguments: args
211
+ });
212
+ let result;
213
+ if (rawResult == null) {
214
+ result = "";
215
+ } else if (typeof rawResult === "string") {
216
+ result = rawResult;
217
+ } else {
218
+ result = JSON.stringify(rawResult);
219
+ }
220
+ await this.rpc.tools.handlePendingToolCall({ requestId, result });
221
+ } catch (error) {
222
+ const message = error instanceof Error ? error.message : String(error);
223
+ await this.rpc.tools.handlePendingToolCall({ requestId, error: message });
224
+ }
225
+ }
226
+ /**
227
+ * Executes a permission handler and sends the result back via RPC.
228
+ * @internal
229
+ */
230
+ async _executePermissionAndRespond(requestId, permissionRequest) {
231
+ try {
232
+ const result = await this.permissionHandler(permissionRequest, {
233
+ sessionId: this.sessionId
234
+ });
235
+ await this.rpc.permissions.handlePendingPermissionRequest({ requestId, result });
236
+ } catch (_error) {
237
+ await this.rpc.permissions.handlePendingPermissionRequest({
238
+ requestId,
239
+ result: {
240
+ kind: "denied-no-approval-rule-and-could-not-request-from-user"
241
+ }
242
+ });
243
+ }
244
+ }
176
245
  /**
177
246
  * Registers custom tool handlers for this session.
178
247
  *
@@ -237,26 +306,6 @@ class CopilotSession {
237
306
  registerHooks(hooks) {
238
307
  this.hooks = hooks;
239
308
  }
240
- /**
241
- * Handles a permission request from the Copilot CLI.
242
- *
243
- * @param request - The permission request data from the CLI
244
- * @returns A promise that resolves with the permission decision
245
- * @internal This method is for internal use by the SDK.
246
- */
247
- async _handlePermissionRequest(request) {
248
- if (!this.permissionHandler) {
249
- return { kind: "denied-no-approval-rule-and-could-not-request-from-user" };
250
- }
251
- try {
252
- const result = await this.permissionHandler(request, {
253
- sessionId: this.sessionId
254
- });
255
- return result;
256
- } catch (_error) {
257
- return { kind: "denied-no-approval-rule-and-could-not-request-from-user" };
258
- }
259
- }
260
309
  /**
261
310
  * Handles a user input request from the Copilot CLI.
262
311
  *
@@ -383,6 +432,20 @@ class CopilotSession {
383
432
  sessionId: this.sessionId
384
433
  });
385
434
  }
435
+ /**
436
+ * Change the model for this session.
437
+ * The new model takes effect for the next message. Conversation history is preserved.
438
+ *
439
+ * @param model - Model ID to switch to
440
+ *
441
+ * @example
442
+ * ```typescript
443
+ * await session.setModel("gpt-4.1");
444
+ * ```
445
+ */
446
+ async setModel(model) {
447
+ await this.rpc.model.switchTo({ modelId: model });
448
+ }
386
449
  }
387
450
  export {
388
451
  CopilotSession
package/dist/types.d.ts CHANGED
@@ -32,6 +32,12 @@ export interface CopilotClientOptions {
32
32
  * @default true
33
33
  */
34
34
  useStdio?: boolean;
35
+ /**
36
+ * When true, indicates the SDK is running as a child process of the Copilot CLI server, and should
37
+ * use its own stdio for communicating with the existing parent process. Can only be used in combination
38
+ * with useStdio: true.
39
+ */
40
+ isChildProcess?: boolean;
35
41
  /**
36
42
  * URL of an existing Copilot CLI server to connect to over TCP
37
43
  * When provided, the client will not spawn a CLI process
@@ -117,6 +123,12 @@ export interface Tool<TArgs = unknown> {
117
123
  description?: string;
118
124
  parameters?: ZodSchema<TArgs> | Record<string, unknown>;
119
125
  handler: ToolHandler<TArgs>;
126
+ /**
127
+ * When true, explicitly indicates this tool is intended to override a built-in tool
128
+ * of the same name. If not set and the name clashes with a built-in tool, the runtime
129
+ * will return an error.
130
+ */
131
+ overridesBuiltInTool?: boolean;
120
132
  }
121
133
  /**
122
134
  * Helper to define a tool with Zod schema and get type inference for the handler.
@@ -126,6 +138,7 @@ export declare function defineTool<T = unknown>(name: string, config: {
126
138
  description?: string;
127
139
  parameters?: ZodSchema<T> | Record<string, unknown>;
128
140
  handler: ToolHandler<T>;
141
+ overridesBuiltInTool?: boolean;
129
142
  }): Tool<T>;
130
143
  export interface ToolCallRequestPayload {
131
144
  sessionId: string;
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "type": "git",
5
5
  "url": "https://github.com/github/copilot-sdk.git"
6
6
  },
7
- "version": "0.1.29",
7
+ "version": "0.1.31-unstable.0",
8
8
  "description": "TypeScript SDK for programmatic control of GitHub Copilot CLI via JSON-RPC",
9
9
  "main": "./dist/index.js",
10
10
  "types": "./dist/index.d.ts",
@@ -12,6 +12,10 @@
12
12
  ".": {
13
13
  "import": "./dist/index.js",
14
14
  "types": "./dist/index.d.ts"
15
+ },
16
+ "./extension": {
17
+ "import": "./dist/extension.js",
18
+ "types": "./dist/extension.d.ts"
15
19
  }
16
20
  },
17
21
  "type": "module",
@@ -40,7 +44,7 @@
40
44
  "author": "GitHub",
41
45
  "license": "MIT",
42
46
  "dependencies": {
43
- "@github/copilot": "^0.0.420",
47
+ "@github/copilot": "^0.0.421",
44
48
  "vscode-jsonrpc": "^8.2.1",
45
49
  "zod": "^4.3.6"
46
50
  },