opencastle 0.9.2 → 0.10.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.
@@ -3,14 +3,22 @@ import type { Task, ExecuteOptions, ExecuteResult } from '../../types.js';
3
3
  export declare const name = "copilot";
4
4
  /**
5
5
  * Check if the `copilot` CLI is available on the system PATH.
6
+ * The SDK communicates with the CLI in server mode, so it must be installed.
6
7
  */
7
8
  export declare function isAvailable(): Promise<boolean>;
8
9
  /**
9
- * Execute a task by invoking the Copilot CLI in autopilot mode.
10
+ * Execute a task using the Copilot SDK.
11
+ *
12
+ * Each task gets its own session with:
13
+ * - All tool permissions auto-approved (equivalent to `--allow-all-tools`)
14
+ * - No `ask_user` tool (autonomous — equivalent to `--no-ask-user`)
15
+ * - System message injected with the agent role
16
+ * - Streaming enabled in verbose mode for live output
10
17
  */
11
18
  export declare function execute(task: Task, options?: ExecuteOptions): Promise<ExecuteResult>;
12
19
  /**
13
- * Kill the process associated with a task (used by timeout enforcement).
20
+ * Abort and destroy the session associated with a task.
21
+ * Called by the executor when a task exceeds its timeout.
14
22
  */
15
23
  export declare function kill(task: Task): void;
16
24
  //# sourceMappingURL=copilot.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"copilot.d.ts","sourceRoot":"","sources":["../../../../src/cli/run/adapters/copilot.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAEzE,mBAAmB;AACnB,eAAO,MAAM,IAAI,YAAY,CAAA;AAE7B;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAMpD;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CA8D9F;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CASrC"}
1
+ {"version":3,"file":"copilot.d.ts","sourceRoot":"","sources":["../../../../src/cli/run/adapters/copilot.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAEzE,mBAAmB;AACnB,eAAO,MAAM,IAAI,YAAY,CAAA;AAe7B;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAMpD;AAsBD;;;;;;;;GAQG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CAkD9F;AAED;;;GAGG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAOrC"}
@@ -1,8 +1,19 @@
1
1
  import { spawn } from 'node:child_process';
2
2
  /** Adapter name */
3
3
  export const name = 'copilot';
4
+ /**
5
+ * Lazy-initialized shared client instance.
6
+ * The client manages a single Copilot CLI server process; all task sessions
7
+ * multiplex over it via JSON-RPC.
8
+ */
9
+ let clientPromise = null;
10
+ /** Cached permission handler from the SDK module. */
11
+ let cachedApproveAll = null;
12
+ /** Active sessions keyed by task id — used by `kill()` for timeout enforcement. */
13
+ const activeSessions = new Map();
4
14
  /**
5
15
  * Check if the `copilot` CLI is available on the system PATH.
16
+ * The SDK communicates with the CLI in server mode, so it must be installed.
6
17
  */
7
18
  export async function isAvailable() {
8
19
  return new Promise((resolve) => {
@@ -12,73 +23,89 @@ export async function isAvailable() {
12
23
  });
13
24
  }
14
25
  /**
15
- * Execute a task by invoking the Copilot CLI in autopilot mode.
26
+ * Get or create the shared CopilotClient.
27
+ * The client is started once and reused across all task executions.
28
+ */
29
+ async function getClient() {
30
+ if (!clientPromise) {
31
+ clientPromise = (async () => {
32
+ const { CopilotClient, approveAll } = await import('@github/copilot-sdk');
33
+ cachedApproveAll = approveAll;
34
+ const client = new CopilotClient({
35
+ autoStart: false,
36
+ logLevel: 'error',
37
+ });
38
+ await client.start();
39
+ return client;
40
+ })();
41
+ }
42
+ return clientPromise;
43
+ }
44
+ /**
45
+ * Execute a task using the Copilot SDK.
46
+ *
47
+ * Each task gets its own session with:
48
+ * - All tool permissions auto-approved (equivalent to `--allow-all-tools`)
49
+ * - No `ask_user` tool (autonomous — equivalent to `--no-ask-user`)
50
+ * - System message injected with the agent role
51
+ * - Streaming enabled in verbose mode for live output
16
52
  */
17
53
  export async function execute(task, options = {}) {
18
54
  let prompt = `You are a ${task.agent}. ${task.prompt}`;
19
55
  if (task.files && task.files.length > 0) {
20
56
  prompt += `\n\nOnly modify files under: ${task.files.join(', ')}`;
21
57
  }
22
- const args = [
23
- '-p',
24
- prompt,
25
- '--autopilot',
26
- '--allow-all-tools',
27
- '--no-ask-user',
28
- '-s',
29
- '--max-autopilot-continues',
30
- '50',
31
- ];
32
- return new Promise((resolve) => {
33
- const proc = spawn('copilot', args, {
34
- stdio: ['ignore', 'pipe', 'pipe'],
35
- env: { ...process.env },
36
- cwd: process.cwd(),
37
- });
38
- let stdout = '';
39
- let stderr = '';
40
- proc.stdout.on('data', (chunk) => {
41
- stdout += chunk.toString();
42
- if (options.verbose) {
43
- process.stdout.write(chunk);
44
- }
45
- });
46
- proc.stderr.on('data', (chunk) => {
47
- stderr += chunk.toString();
48
- if (options.verbose) {
49
- process.stderr.write(chunk);
50
- }
51
- });
52
- proc.on('close', (code) => {
53
- const output = [stdout, stderr].filter(Boolean).join('\n');
54
- resolve({
55
- success: code === 0,
56
- output: output.slice(0, 10000), // Cap output size
57
- exitCode: code ?? -1,
58
- });
59
- });
60
- proc.on('error', (err) => {
61
- resolve({
62
- success: false,
63
- output: `Failed to spawn copilot: ${err.message}`,
64
- exitCode: -1,
65
- });
66
- });
67
- // Store process ref for potential timeout kill
68
- task._process = proc;
58
+ const client = await getClient();
59
+ const session = await client.createSession({
60
+ onPermissionRequest: cachedApproveAll,
61
+ systemMessage: {
62
+ content: [
63
+ `You are a ${task.agent}.`,
64
+ 'Work autonomously without asking questions.',
65
+ 'Follow all instructions precisely.',
66
+ ].join(' '),
67
+ },
68
+ infiniteSessions: { enabled: false },
69
+ ...(options.verbose ? { streaming: true } : {}),
69
70
  });
71
+ activeSessions.set(task.id, session);
72
+ // Stream deltas to stdout in verbose mode
73
+ if (options.verbose) {
74
+ session.on('assistant.message_delta', (event) => {
75
+ process.stdout.write(event.data.deltaContent);
76
+ });
77
+ }
78
+ try {
79
+ const response = await session.sendAndWait({ prompt });
80
+ const output = response?.data?.content ?? '';
81
+ return {
82
+ success: true,
83
+ output: output.slice(0, 10_000),
84
+ exitCode: 0,
85
+ };
86
+ }
87
+ catch (err) {
88
+ return {
89
+ success: false,
90
+ output: `Copilot SDK error: ${err.message}`,
91
+ exitCode: 1,
92
+ };
93
+ }
94
+ finally {
95
+ activeSessions.delete(task.id);
96
+ await session.destroy().catch(() => { });
97
+ }
70
98
  }
71
99
  /**
72
- * Kill the process associated with a task (used by timeout enforcement).
100
+ * Abort and destroy the session associated with a task.
101
+ * Called by the executor when a task exceeds its timeout.
73
102
  */
74
103
  export function kill(task) {
75
- if (task._process && !task._process.killed) {
76
- task._process.kill('SIGTERM');
77
- setTimeout(() => {
78
- if (task._process && !task._process.killed) {
79
- task._process.kill('SIGKILL');
80
- }
81
- }, 5000);
104
+ const session = activeSessions.get(task.id);
105
+ if (session) {
106
+ session.abort().catch(() => { });
107
+ session.destroy().catch(() => { });
108
+ activeSessions.delete(task.id);
82
109
  }
83
110
  }
84
111
  //# sourceMappingURL=copilot.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../../../src/cli/run/adapters/copilot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../../../src/cli/run/adapters/copilot.ts"],"names":[],"mappings":"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"}
package/dist/cli/run.js CHANGED
@@ -120,8 +120,8 @@ export default async function run({ args }) {
120
120
  const hints = {
121
121
  'claude-code': ' Install: npm install -g @anthropic-ai/claude-code\n' +
122
122
  ' Docs: https://docs.anthropic.com/en/docs/claude-code',
123
- copilot: ' Install: npm install -g @anthropic-ai/claude-code (or use VS Code)\n' +
124
- ' The Copilot CLI is bundled with GitHub Copilot in VS Code.\n' +
123
+ copilot: ' Requires the Copilot CLI installed and authenticated:\n' +
124
+ ' https://docs.github.com/en/copilot/how-tos/set-up/install-copilot-cli\n' +
125
125
  ' Docs: https://docs.github.com/en/copilot',
126
126
  cursor: ' The Cursor agent CLI ships with the Cursor editor.\n' +
127
127
  ' Install Cursor from https://cursor.com and ensure the\n' +
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAGtE,MAAM,IAAI,GAAG;;;;;;;;;;;;;CAaZ,CAAA;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,IAAI,GAAe;QACvB,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,KAAK;QACb,WAAW,EAAE,IAAI;QACjB,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,IAAI;QACf,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,KAAK;KACZ,CAAA;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QACnB,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,QAAQ,CAAC;YACd,KAAK,IAAI;gBACP,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;gBAChB,MAAK;YACP,KAAK,QAAQ,CAAC;YACd,KAAK,IAAI;gBACP,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBAAC,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBAAC,CAAC;gBAC/F,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;gBACrB,MAAK;YACP,KAAK,WAAW;gBACd,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;gBAClB,MAAK;YACP,KAAK,eAAe,CAAC;YACrB,KAAK,IAAI,CAAC,CAAC,CAAC;gBACV,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBAAC,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBAAC,CAAC;gBACxG,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;gBACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;oBACrC,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAA;oBAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACjB,CAAC;gBACD,IAAI,CAAC,WAAW,GAAG,GAAG,CAAA;gBACtB,MAAK;YACP,CAAC;YACD,KAAK,WAAW,CAAC;YACjB,KAAK,IAAI;gBACP,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBAAC,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBAAC,CAAC;gBAClG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;gBACxB,MAAK;YACP,KAAK,cAAc;gBACjB,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBAAC,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBAAC,CAAC;gBACrG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;gBAC1B,MAAK;YACP,KAAK,WAAW;gBACd,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;gBACnB,MAAK;YACP;gBACE,OAAO,CAAC,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAA;gBAC3C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;gBACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACnB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,GAAG,CAAC,EAAE,IAAI,EAAc;IACpD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAE5B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACjB,OAAM;IACR,CAAC;IAED,iEAAiE;IACjE,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;IAClD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAA;IAE1C,sBAAsB;IACtB,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI;QAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;IAClE,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI;QAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;IACtD,IAAI,IAAI,CAAC,OAAO;QAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;IAEtC,gEAAgE;IAChE,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAEtC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAChC,OAAM;IACR,CAAC;IAED,gEAAgE;IAChE,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC9C,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAA;IAC7C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,KAAK,GAA2B;YACpC,aAAa,EACX,yDAAyD;gBACzD,6DAA6D;YAC/D,OAAO,EACL,0EAA0E;gBAC1E,kEAAkE;gBAClE,iDAAiD;YACnD,MAAM,EACJ,0DAA0D;gBAC1D,6DAA6D;gBAC7D,6DAA6D;SAChE,CAAA;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,KAAK,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAA;QACxE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;QACtC,OAAO,CAAC,KAAK,CACX,gBAAgB,IAAI,CAAC,OAAO,uBAAuB;YACjD,sBAAsB,OAAO,wCAAwC;YACrE,IAAI,CACP,CAAA;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,gEAAgE;IAChE,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;IAClD,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,IAAI,mBAAmB,IAAI,CAAC,WAAW,aAAa,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAA;IAE1G,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,EAAE;QACpC,SAAS,EAAE,IAAI,CAAC,SAAS;YACvB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC;YACxC,CAAC,CAAC,SAAS;QACb,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC,CAAA;IAEF,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;IACxD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAA;IAEnC,gEAAgE;IAChE,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IAChF,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACnC,CAAC"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencastle",
3
- "version": "0.9.2",
3
+ "version": "0.10.0",
4
4
  "type": "module",
5
5
  "description": "Multi-agent orchestration framework for AI coding assistants",
6
6
  "bin": {
@@ -57,6 +57,7 @@
57
57
  "vitest": "^4.0.18"
58
58
  },
59
59
  "dependencies": {
60
+ "@github/copilot-sdk": "^0.1.30",
60
61
  "yaml": "^2.8.2"
61
62
  }
62
63
  }
@@ -1,11 +1,26 @@
1
1
  import { spawn } from 'node:child_process'
2
+ import type { CopilotClient as CopilotClientType, CopilotSession, PermissionHandler } from '@github/copilot-sdk'
2
3
  import type { Task, ExecuteOptions, ExecuteResult } from '../../types.js'
3
4
 
4
5
  /** Adapter name */
5
6
  export const name = 'copilot'
6
7
 
8
+ /**
9
+ * Lazy-initialized shared client instance.
10
+ * The client manages a single Copilot CLI server process; all task sessions
11
+ * multiplex over it via JSON-RPC.
12
+ */
13
+ let clientPromise: Promise<CopilotClientType> | null = null
14
+
15
+ /** Cached permission handler from the SDK module. */
16
+ let cachedApproveAll: PermissionHandler | null = null
17
+
18
+ /** Active sessions keyed by task id — used by `kill()` for timeout enforcement. */
19
+ const activeSessions = new Map<string, CopilotSession>()
20
+
7
21
  /**
8
22
  * Check if the `copilot` CLI is available on the system PATH.
23
+ * The SDK communicates with the CLI in server mode, so it must be installed.
9
24
  */
10
25
  export async function isAvailable(): Promise<boolean> {
11
26
  return new Promise((resolve) => {
@@ -16,7 +31,33 @@ export async function isAvailable(): Promise<boolean> {
16
31
  }
17
32
 
18
33
  /**
19
- * Execute a task by invoking the Copilot CLI in autopilot mode.
34
+ * Get or create the shared CopilotClient.
35
+ * The client is started once and reused across all task executions.
36
+ */
37
+ async function getClient(): Promise<CopilotClientType> {
38
+ if (!clientPromise) {
39
+ clientPromise = (async () => {
40
+ const { CopilotClient, approveAll } = await import('@github/copilot-sdk')
41
+ cachedApproveAll = approveAll
42
+ const client = new CopilotClient({
43
+ autoStart: false,
44
+ logLevel: 'error',
45
+ })
46
+ await client.start()
47
+ return client
48
+ })()
49
+ }
50
+ return clientPromise
51
+ }
52
+
53
+ /**
54
+ * Execute a task using the Copilot SDK.
55
+ *
56
+ * Each task gets its own session with:
57
+ * - All tool permissions auto-approved (equivalent to `--allow-all-tools`)
58
+ * - No `ask_user` tool (autonomous — equivalent to `--no-ask-user`)
59
+ * - System message injected with the agent role
60
+ * - Streaming enabled in verbose mode for live output
20
61
  */
21
62
  export async function execute(task: Task, options: ExecuteOptions = {}): Promise<ExecuteResult> {
22
63
  let prompt = `You are a ${task.agent}. ${task.prompt}`
@@ -25,73 +66,60 @@ export async function execute(task: Task, options: ExecuteOptions = {}): Promise
25
66
  prompt += `\n\nOnly modify files under: ${task.files.join(', ')}`
26
67
  }
27
68
 
28
- const args = [
29
- '-p',
30
- prompt,
31
- '--autopilot',
32
- '--allow-all-tools',
33
- '--no-ask-user',
34
- '-s',
35
- '--max-autopilot-continues',
36
- '50',
37
- ]
38
-
39
- return new Promise((resolve) => {
40
- const proc = spawn('copilot', args, {
41
- stdio: ['ignore', 'pipe', 'pipe'],
42
- env: { ...process.env },
43
- cwd: process.cwd(),
44
- })
45
-
46
- let stdout = ''
47
- let stderr = ''
69
+ const client = await getClient()
48
70
 
49
- proc.stdout.on('data', (chunk: Buffer) => {
50
- stdout += chunk.toString()
51
- if (options.verbose) {
52
- process.stdout.write(chunk)
53
- }
54
- })
71
+ const session = await client.createSession({
72
+ onPermissionRequest: cachedApproveAll!,
73
+ systemMessage: {
74
+ content: [
75
+ `You are a ${task.agent}.`,
76
+ 'Work autonomously without asking questions.',
77
+ 'Follow all instructions precisely.',
78
+ ].join(' '),
79
+ },
80
+ infiniteSessions: { enabled: false },
81
+ ...(options.verbose ? { streaming: true } : {}),
82
+ })
55
83
 
56
- proc.stderr.on('data', (chunk: Buffer) => {
57
- stderr += chunk.toString()
58
- if (options.verbose) {
59
- process.stderr.write(chunk)
60
- }
61
- })
84
+ activeSessions.set(task.id, session)
62
85
 
63
- proc.on('close', (code) => {
64
- const output = [stdout, stderr].filter(Boolean).join('\n')
65
- resolve({
66
- success: code === 0,
67
- output: output.slice(0, 10000), // Cap output size
68
- exitCode: code ?? -1,
69
- })
86
+ // Stream deltas to stdout in verbose mode
87
+ if (options.verbose) {
88
+ session.on('assistant.message_delta', (event: { data: { deltaContent: string } }) => {
89
+ process.stdout.write(event.data.deltaContent)
70
90
  })
91
+ }
71
92
 
72
- proc.on('error', (err) => {
73
- resolve({
74
- success: false,
75
- output: `Failed to spawn copilot: ${err.message}`,
76
- exitCode: -1,
77
- })
78
- })
93
+ try {
94
+ const response = await session.sendAndWait({ prompt })
95
+ const output = response?.data?.content ?? ''
79
96
 
80
- // Store process ref for potential timeout kill
81
- task._process = proc
82
- })
97
+ return {
98
+ success: true,
99
+ output: output.slice(0, 10_000),
100
+ exitCode: 0,
101
+ }
102
+ } catch (err: unknown) {
103
+ return {
104
+ success: false,
105
+ output: `Copilot SDK error: ${(err as Error).message}`,
106
+ exitCode: 1,
107
+ }
108
+ } finally {
109
+ activeSessions.delete(task.id)
110
+ await session.destroy().catch(() => {})
111
+ }
83
112
  }
84
113
 
85
114
  /**
86
- * Kill the process associated with a task (used by timeout enforcement).
115
+ * Abort and destroy the session associated with a task.
116
+ * Called by the executor when a task exceeds its timeout.
87
117
  */
88
118
  export function kill(task: Task): void {
89
- if (task._process && !task._process.killed) {
90
- task._process.kill('SIGTERM')
91
- setTimeout(() => {
92
- if (task._process && !task._process.killed) {
93
- task._process.kill('SIGKILL')
94
- }
95
- }, 5000)
119
+ const session = activeSessions.get(task.id)
120
+ if (session) {
121
+ session.abort().catch(() => {})
122
+ session.destroy().catch(() => {})
123
+ activeSessions.delete(task.id)
96
124
  }
97
125
  }
package/src/cli/run.ts CHANGED
@@ -119,8 +119,8 @@ export default async function run({ args }: CliContext): Promise<void> {
119
119
  ' Install: npm install -g @anthropic-ai/claude-code\n' +
120
120
  ' Docs: https://docs.anthropic.com/en/docs/claude-code',
121
121
  copilot:
122
- ' Install: npm install -g @anthropic-ai/claude-code (or use VS Code)\n' +
123
- ' The Copilot CLI is bundled with GitHub Copilot in VS Code.\n' +
122
+ ' Requires the Copilot CLI installed and authenticated:\n' +
123
+ ' https://docs.github.com/en/copilot/how-tos/set-up/install-copilot-cli\n' +
124
124
  ' Docs: https://docs.github.com/en/copilot',
125
125
  cursor:
126
126
  ' The Cursor agent CLI ships with the Cursor editor.\n' +
@@ -1,25 +1,25 @@
1
1
  {
2
- "hash": "7bf3afa3",
2
+ "hash": "2334c6c2",
3
3
  "configHash": "30f8ea04",
4
- "lockfileHash": "4dee6fd1",
5
- "browserHash": "388c1549",
4
+ "lockfileHash": "cf5af1b6",
5
+ "browserHash": "31dc1dac",
6
6
  "optimized": {
7
7
  "astro > cssesc": {
8
8
  "src": "../../../../../node_modules/cssesc/cssesc.js",
9
9
  "file": "astro___cssesc.js",
10
- "fileHash": "8b8909d3",
10
+ "fileHash": "432d0522",
11
11
  "needsInterop": true
12
12
  },
13
13
  "astro > aria-query": {
14
14
  "src": "../../../../../node_modules/aria-query/lib/index.js",
15
15
  "file": "astro___aria-query.js",
16
- "fileHash": "6711698e",
16
+ "fileHash": "5d3ca12d",
17
17
  "needsInterop": true
18
18
  },
19
19
  "astro > axobject-query": {
20
20
  "src": "../../../../../node_modules/axobject-query/lib/index.js",
21
21
  "file": "astro___axobject-query.js",
22
- "fileHash": "c309d205",
22
+ "fileHash": "4a0f4a6f",
23
23
  "needsInterop": true
24
24
  }
25
25
  },
@@ -56,7 +56,7 @@ Available values for the `agent` field:
56
56
  | Adapter | CLI binary | Notes |
57
57
  |---------|-----------|-------|
58
58
  | `claude-code` | `claude` | Default. JSON output, max-turns flag. |
59
- | `copilot` | `copilot` | Uses `--autopilot --allow-all-tools`. |
59
+ | `copilot` | `copilot` | Uses the Copilot SDK for structured JSON-RPC sessions. |
60
60
  | `cursor` | `agent` | Uses `--force` for unattended file writes. |
61
61
 
62
62
  ---