@getpaseo/server 0.1.99 → 0.1.101

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 (83) hide show
  1. package/dist/server/executable-resolution/windows.js +3 -0
  2. package/dist/server/server/agent/agent-manager.d.ts +10 -0
  3. package/dist/server/server/agent/agent-manager.js +65 -27
  4. package/dist/server/server/agent/agent-sdk-types.d.ts +8 -0
  5. package/dist/server/server/agent/mcp-server.d.ts +2 -45
  6. package/dist/server/server/agent/mcp-server.js +45 -1985
  7. package/dist/server/server/agent/prompt-attachments.js +6 -2
  8. package/dist/server/server/agent/provider-registry.js +1 -0
  9. package/dist/server/server/agent/provider-snapshot-manager.d.ts +4 -0
  10. package/dist/server/server/agent/provider-snapshot-manager.js +58 -13
  11. package/dist/server/server/agent/providers/acp-agent.d.ts +39 -2
  12. package/dist/server/server/agent/providers/acp-agent.js +281 -20
  13. package/dist/server/server/agent/providers/claude/agent.js +96 -62
  14. package/dist/server/server/agent/providers/codex-app-server-agent.js +6 -57
  15. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +2 -1
  16. package/dist/server/server/agent/providers/copilot-acp-agent.js +10 -0
  17. package/dist/server/server/agent/providers/diagnostic-utils.d.ts +1 -0
  18. package/dist/server/server/agent/providers/diagnostic-utils.js +1 -1
  19. package/dist/server/server/agent/providers/generic-acp-agent.d.ts +3 -0
  20. package/dist/server/server/agent/providers/generic-acp-agent.js +41 -23
  21. package/dist/server/server/agent/providers/mock-load-test-agent.js +4 -2
  22. package/dist/server/server/agent/providers/opencode/server-manager.d.ts +14 -11
  23. package/dist/server/server/agent/providers/opencode/server-manager.js +149 -91
  24. package/dist/server/server/agent/providers/opencode/test-server-manager.d.ts +6 -5
  25. package/dist/server/server/agent/providers/opencode/test-server-manager.js +13 -3
  26. package/dist/server/server/agent/providers/opencode/test-utils/{test-opencode-runtime.d.ts → test-opencode-harness.d.ts} +11 -11
  27. package/dist/server/server/agent/providers/opencode/test-utils/{test-opencode-runtime.js → test-opencode-harness.js} +23 -10
  28. package/dist/server/server/agent/providers/opencode-agent.d.ts +9 -3
  29. package/dist/server/server/agent/providers/opencode-agent.js +26 -38
  30. package/dist/server/server/agent/providers/pi/agent.d.ts +4 -2
  31. package/dist/server/server/agent/providers/pi/agent.js +8 -3
  32. package/dist/server/server/agent/providers/pi/cli-runtime.d.ts +3 -0
  33. package/dist/server/server/agent/providers/pi/cli-runtime.js +6 -3
  34. package/dist/server/server/agent/providers/pi/rpc-types.d.ts +2 -1
  35. package/dist/server/server/agent/providers/provider-image-output.d.ts +5 -0
  36. package/dist/server/server/agent/providers/provider-image-output.js +55 -0
  37. package/dist/server/server/agent/tools/paseo-tools.d.ts +48 -0
  38. package/dist/server/server/agent/tools/paseo-tools.js +2121 -0
  39. package/dist/server/server/agent/tools/types.d.ts +36 -0
  40. package/dist/server/server/agent/tools/types.js +2 -0
  41. package/dist/server/server/bootstrap.js +71 -62
  42. package/dist/server/server/persisted-config.d.ts +5 -0
  43. package/dist/server/server/persisted-config.js +10 -2
  44. package/dist/server/server/session/agent-updates/agent-updates-service.d.ts +59 -0
  45. package/dist/server/server/session/agent-updates/agent-updates-service.js +220 -0
  46. package/dist/server/server/session/checkout/checkout-session.d.ts +13 -15
  47. package/dist/server/server/session/checkout/checkout-session.js +18 -16
  48. package/dist/server/server/session/checkout/git-metadata-generator.d.ts +53 -0
  49. package/dist/server/server/session/checkout/git-metadata-generator.js +159 -0
  50. package/dist/server/server/session/daemon/daemon-session.d.ts +14 -0
  51. package/dist/server/server/session/daemon/daemon-session.js +38 -0
  52. package/dist/server/server/session/daemon/diagnostics.d.ts +41 -0
  53. package/dist/server/server/session/daemon/diagnostics.js +421 -0
  54. package/dist/server/server/session/git-mutation/git-mutation-service.d.ts +34 -0
  55. package/dist/server/server/session/git-mutation/git-mutation-service.js +71 -0
  56. package/dist/server/server/session/workspace-git-observer/workspace-git-observer-service.d.ts +36 -0
  57. package/dist/server/server/session/workspace-git-observer/workspace-git-observer-service.js +134 -0
  58. package/dist/server/server/session/workspace-provisioning/workspace-provisioning-service.d.ts +34 -0
  59. package/dist/server/server/session/workspace-provisioning/workspace-provisioning-service.js +190 -0
  60. package/dist/server/server/session/workspace-scripts/workspace-scripts-service.d.ts +41 -0
  61. package/dist/server/server/session/workspace-scripts/workspace-scripts-service.js +100 -0
  62. package/dist/server/server/session.d.ts +7 -51
  63. package/dist/server/server/session.js +113 -938
  64. package/dist/server/server/speech/providers/openai/config.d.ts +1 -2
  65. package/dist/server/server/speech/providers/openai/config.js +13 -9
  66. package/dist/server/server/speech/providers/openai/runtime.js +2 -16
  67. package/dist/server/server/speech/providers/openai/stt.d.ts +1 -0
  68. package/dist/server/server/speech/providers/openai/stt.js +4 -2
  69. package/dist/server/server/speech/providers/openai/tts.d.ts +1 -0
  70. package/dist/server/server/speech/providers/openai/tts.js +1 -0
  71. package/dist/server/server/websocket/runtime-metrics.d.ts +20 -0
  72. package/dist/server/server/websocket-server.d.ts +1 -2
  73. package/dist/server/server/websocket-server.js +26 -21
  74. package/dist/server/server/worktree-bootstrap.d.ts +1 -1
  75. package/dist/server/server/worktree-branch-name-generator.js +3 -1
  76. package/dist/server/utils/checkout-git.js +51 -26
  77. package/dist/src/executable-resolution/windows.js +3 -0
  78. package/dist/src/server/persisted-config.js +10 -2
  79. package/package.json +5 -5
  80. package/dist/server/server/agent/providers/opencode/runtime.d.ts +0 -28
  81. package/dist/server/server/agent/providers/opencode/runtime.js +0 -5
  82. package/dist/server/server/speech/providers/openai/realtime-transcription-session.d.ts +0 -42
  83. package/dist/server/server/speech/providers/openai/realtime-transcription-session.js +0 -168
@@ -16,10 +16,10 @@ export interface OpenCodeServerManagerLike {
16
16
  port: number;
17
17
  url: string;
18
18
  }>;
19
- acquire(options: {
20
- force: boolean;
21
- env?: Record<string, string>;
22
- }): Promise<OpenCodeServerAcquisition>;
19
+ acquireCurrent(): Promise<OpenCodeServerAcquisition>;
20
+ acquireNew(): Promise<OpenCodeServerAcquisition>;
21
+ acquireDedicated(env: Record<string, string>): Promise<OpenCodeServerAcquisition>;
22
+ shutdown(): Promise<void>;
23
23
  }
24
24
  export interface OpenCodeServerGeneration {
25
25
  process: ChildProcess;
@@ -27,7 +27,11 @@ export interface OpenCodeServerGeneration {
27
27
  url: string;
28
28
  refCount: number;
29
29
  retired: boolean;
30
+ ready: Promise<void>;
30
31
  managedProcessId?: string;
32
+ managedProcessRecord?: Promise<{
33
+ id: string;
34
+ } | null>;
31
35
  }
32
36
  export type OpenCodePortAllocator = () => Promise<number>;
33
37
  export type OpenCodeCommandPrefixResolver = () => Promise<{
@@ -50,7 +54,7 @@ export declare class OpenCodeServerManager implements OpenCodeServerManagerLike
50
54
  private currentServer;
51
55
  private retiredServers;
52
56
  private startPromise;
53
- private forcedRefreshPromise;
57
+ private newServerPromise;
54
58
  private readonly logger;
55
59
  private readonly runtimeSettings?;
56
60
  private readonly runtimeSettingsKey;
@@ -66,21 +70,20 @@ export declare class OpenCodeServerManager implements OpenCodeServerManagerLike
66
70
  port: number;
67
71
  url: string;
68
72
  }>;
69
- acquire(options: {
70
- force: boolean;
71
- env?: Record<string, string>;
72
- }): Promise<OpenCodeServerAcquisition>;
73
+ acquireCurrent(): Promise<OpenCodeServerAcquisition>;
74
+ acquireNew(): Promise<OpenCodeServerAcquisition>;
75
+ acquireDedicated(env: Record<string, string>): Promise<OpenCodeServerAcquisition>;
73
76
  private acquireServer;
74
- private getForcedRefreshServer;
77
+ private getNewServer;
75
78
  private getCurrentServer;
76
79
  private rotateCurrentServer;
77
- private startDedicatedServer;
78
80
  private startServer;
79
81
  shutdown(): Promise<void>;
80
82
  private cleanupRetiredServers;
81
83
  private killServer;
82
84
  private recordManagedServerProcess;
83
85
  private removeManagedProcessRecordWhenResolved;
86
+ private removeManagedServerRecord;
84
87
  private removeManagedProcessId;
85
88
  }
86
89
  //# sourceMappingURL=server-manager.d.ts.map
@@ -11,7 +11,7 @@ export class OpenCodeServerManager {
11
11
  this.currentServer = null;
12
12
  this.retiredServers = new Set();
13
13
  this.startPromise = null;
14
- this.forcedRefreshPromise = null;
14
+ this.newServerPromise = null;
15
15
  this.logger = options.logger;
16
16
  this.runtimeSettings = options.runtimeSettings;
17
17
  this.runtimeSettingsKey = JSON.stringify(this.runtimeSettings ?? {});
@@ -55,20 +55,32 @@ export class OpenCodeServerManager {
55
55
  process.on("SIGINT", cleanup);
56
56
  }
57
57
  async ensureRunning() {
58
- const acquisition = await this.acquire({ force: false });
58
+ const acquisition = await this.acquireCurrent();
59
59
  acquisition.release();
60
60
  return acquisition.server;
61
61
  }
62
- async acquire(options) {
63
- if (options.env) {
64
- const server = await this.startDedicatedServer(options.env);
65
- return this.acquireServer(server);
66
- }
67
- const server = options.force
68
- ? await this.getForcedRefreshServer()
69
- : await this.getCurrentServer();
62
+ async acquireCurrent() {
63
+ const server = await this.getCurrentServer();
64
+ return this.acquireServer(server);
65
+ }
66
+ async acquireNew() {
67
+ const server = await this.getNewServer();
70
68
  return this.acquireServer(server);
71
69
  }
70
+ async acquireDedicated(env) {
71
+ const server = await this.startServer(env);
72
+ server.retired = true;
73
+ this.retiredServers.add(server);
74
+ const acquisition = this.acquireServer(server);
75
+ try {
76
+ await server.ready;
77
+ return acquisition;
78
+ }
79
+ catch (error) {
80
+ acquisition.release();
81
+ throw error;
82
+ }
83
+ }
72
84
  acquireServer(server) {
73
85
  server.refCount += 1;
74
86
  let released = false;
@@ -84,38 +96,52 @@ export class OpenCodeServerManager {
84
96
  },
85
97
  };
86
98
  }
87
- async getForcedRefreshServer() {
88
- if (this.forcedRefreshPromise) {
89
- return this.forcedRefreshPromise;
99
+ async getNewServer() {
100
+ if (this.newServerPromise) {
101
+ return this.newServerPromise;
90
102
  }
91
- this.forcedRefreshPromise = Promise.resolve()
103
+ this.newServerPromise = Promise.resolve()
92
104
  .then(async () => {
93
105
  await this.rotateCurrentServer();
94
- return this.getCurrentServer();
106
+ const server = await this.startServer();
107
+ if (!server.retired) {
108
+ this.currentServer = server;
109
+ }
110
+ await server.ready;
111
+ return server;
95
112
  })
96
113
  .finally(() => {
97
- this.forcedRefreshPromise = null;
114
+ this.newServerPromise = null;
98
115
  });
99
- return this.forcedRefreshPromise;
116
+ return this.newServerPromise;
100
117
  }
101
118
  async getCurrentServer() {
119
+ if (this.newServerPromise) {
120
+ return this.newServerPromise;
121
+ }
102
122
  if (this.startPromise) {
103
- return this.startPromise;
123
+ const server = await this.startPromise;
124
+ await server.ready;
125
+ return server;
104
126
  }
105
127
  if (this.currentServer && !this.currentServer.process.killed) {
128
+ await this.currentServer.ready;
106
129
  return this.currentServer;
107
130
  }
108
- this.startPromise = this.startServer();
109
- try {
110
- const result = await this.startPromise;
111
- if (!result.retired) {
112
- this.currentServer = result;
131
+ this.startPromise = this.startServer().then((server) => {
132
+ if (!server.retired) {
133
+ this.currentServer = server;
113
134
  }
114
- return result;
115
- }
116
- finally {
117
- this.startPromise = null;
118
- }
135
+ return server;
136
+ });
137
+ const currentStart = this.startPromise;
138
+ const result = await currentStart.finally(() => {
139
+ if (this.startPromise === currentStart) {
140
+ this.startPromise = null;
141
+ }
142
+ });
143
+ await result.ready;
144
+ return result;
119
145
  }
120
146
  async rotateCurrentServer() {
121
147
  const existing = this.currentServer;
@@ -133,79 +159,89 @@ export class OpenCodeServerManager {
133
159
  this.cleanupRetiredServers();
134
160
  }
135
161
  }
136
- async startDedicatedServer(env) {
137
- const server = await this.startServer(env);
138
- server.retired = true;
139
- this.retiredServers.add(server);
140
- return server;
141
- }
142
162
  async startServer(launchEnv) {
143
163
  const port = await this.portAllocator();
144
164
  const url = `http://127.0.0.1:${port}`;
145
165
  const launchPrefix = await this.resolveCommandPrefix();
146
166
  const serverArgs = [...launchPrefix.args, "serve", "--port", String(port)];
147
167
  const serverCwd = os.homedir();
148
- return new Promise((resolve, reject) => {
149
- const serverProcess = this.spawnServerProcess(launchPrefix.command, serverArgs, {
150
- cwd: serverCwd,
151
- detached: process.platform !== "win32",
152
- stdio: ["ignore", "pipe", "pipe"],
153
- ...createProviderEnvSpec({
154
- runtimeSettings: this.runtimeSettings,
155
- overlays: [launchEnv],
156
- }),
157
- });
158
- const managedProcessRecord = this.recordManagedServerProcess({
159
- process: serverProcess,
160
- command: launchPrefix.command,
161
- args: serverArgs,
162
- port,
163
- });
164
- let started = false;
165
- let stderrBuffer = "";
166
- let stdoutBuffer = "";
167
- const STARTUP_BUFFER_CAP = 8192;
168
- const appendCapped = (current, chunk) => {
169
- if (current.length >= STARTUP_BUFFER_CAP) {
170
- return current;
171
- }
172
- const remaining = STARTUP_BUFFER_CAP - current.length;
173
- return current + chunk.slice(0, remaining);
174
- };
175
- const buildStartupErrorMessage = (headline) => {
176
- const sections = [headline];
177
- const stderrTrimmed = stderrBuffer.trim();
178
- if (stderrTrimmed.length > 0) {
179
- sections.push(`stderr: ${stderrTrimmed}`);
180
- }
181
- const stdoutTrimmed = stdoutBuffer.trim();
182
- if (stdoutTrimmed.length > 0) {
183
- sections.push(`stdout: ${stdoutTrimmed}`);
168
+ const serverProcess = this.spawnServerProcess(launchPrefix.command, serverArgs, {
169
+ cwd: serverCwd,
170
+ detached: process.platform !== "win32",
171
+ stdio: ["ignore", "pipe", "pipe"],
172
+ ...createProviderEnvSpec({
173
+ runtimeSettings: this.runtimeSettings,
174
+ overlays: [launchEnv],
175
+ }),
176
+ });
177
+ const managedProcessRecord = this.recordManagedServerProcess({
178
+ process: serverProcess,
179
+ command: launchPrefix.command,
180
+ args: serverArgs,
181
+ port,
182
+ });
183
+ const server = {
184
+ process: serverProcess,
185
+ port,
186
+ url,
187
+ refCount: 0,
188
+ retired: false,
189
+ ready: Promise.resolve(),
190
+ managedProcessRecord,
191
+ };
192
+ void managedProcessRecord.then((record) => {
193
+ if (record && server.managedProcessRecord === managedProcessRecord) {
194
+ server.managedProcessId = record.id;
195
+ }
196
+ return undefined;
197
+ });
198
+ let started = false;
199
+ let settled = false;
200
+ let stderrBuffer = "";
201
+ let stdoutBuffer = "";
202
+ const STARTUP_BUFFER_CAP = 8192;
203
+ const appendCapped = (current, chunk) => {
204
+ if (current.length >= STARTUP_BUFFER_CAP) {
205
+ return current;
206
+ }
207
+ const remaining = STARTUP_BUFFER_CAP - current.length;
208
+ return current + chunk.slice(0, remaining);
209
+ };
210
+ const buildStartupErrorMessage = (headline) => {
211
+ const sections = [headline];
212
+ const stderrTrimmed = stderrBuffer.trim();
213
+ if (stderrTrimmed.length > 0) {
214
+ sections.push(`stderr: ${stderrTrimmed}`);
215
+ }
216
+ const stdoutTrimmed = stdoutBuffer.trim();
217
+ if (stdoutTrimmed.length > 0) {
218
+ sections.push(`stdout: ${stdoutTrimmed}`);
219
+ }
220
+ return sections.join("\n");
221
+ };
222
+ const ready = new Promise((resolve, reject) => {
223
+ let timeout;
224
+ const failStartup = (error) => {
225
+ if (settled) {
226
+ return;
184
227
  }
185
- return sections.join("\n");
228
+ settled = true;
229
+ clearTimeout(timeout);
230
+ reject(error);
186
231
  };
187
- const timeout = setTimeout(() => {
232
+ timeout = setTimeout(() => {
188
233
  if (!started) {
189
- reject(new Error(buildStartupErrorMessage("OpenCode server startup timeout")));
234
+ failStartup(new Error(buildStartupErrorMessage("OpenCode server startup timeout")));
190
235
  }
191
236
  }, 30000);
192
237
  serverProcess.stdout?.on("data", (data) => {
193
238
  const output = data.toString();
194
239
  stdoutBuffer = appendCapped(stdoutBuffer, output);
195
- if (output.includes("listening on") && !started) {
240
+ if (output.includes("listening on") && !settled) {
196
241
  started = true;
242
+ settled = true;
197
243
  clearTimeout(timeout);
198
- void (async () => {
199
- const record = await managedProcessRecord;
200
- resolve({
201
- process: serverProcess,
202
- port,
203
- url,
204
- refCount: 0,
205
- retired: false,
206
- ...(record ? { managedProcessId: record.id } : {}),
207
- });
208
- })();
244
+ resolve();
209
245
  }
210
246
  });
211
247
  serverProcess.stderr?.on("data", (data) => {
@@ -214,16 +250,13 @@ export class OpenCodeServerManager {
214
250
  this.logger.error({ stderr: output.trim() }, "OpenCode server stderr");
215
251
  });
216
252
  serverProcess.on("error", (error) => {
217
- clearTimeout(timeout);
218
- this.removeManagedProcessRecordWhenResolved(managedProcessRecord);
219
253
  const headline = error instanceof Error ? error.message : String(error);
220
- reject(new Error(buildStartupErrorMessage(headline)));
254
+ failStartup(new Error(buildStartupErrorMessage(headline)));
221
255
  });
222
256
  serverProcess.on("exit", (code) => {
223
- this.removeManagedProcessRecordWhenResolved(managedProcessRecord);
257
+ this.removeManagedServerRecord(server);
224
258
  if (!started) {
225
- clearTimeout(timeout);
226
- reject(new Error(buildStartupErrorMessage(`OpenCode server exited with code ${code}`)));
259
+ failStartup(new Error(buildStartupErrorMessage(`OpenCode server exited with code ${code}`)));
227
260
  }
228
261
  if (this.currentServer?.process === serverProcess) {
229
262
  this.currentServer = null;
@@ -235,6 +268,15 @@ export class OpenCodeServerManager {
235
268
  }
236
269
  });
237
270
  });
271
+ server.ready = ready.catch(async (error) => {
272
+ await this.killServer(server);
273
+ if (this.currentServer === server) {
274
+ this.currentServer = null;
275
+ }
276
+ this.retiredServers.delete(server);
277
+ throw error;
278
+ });
279
+ return server;
238
280
  }
239
281
  async shutdown() {
240
282
  const servers = [
@@ -271,6 +313,10 @@ export class OpenCodeServerManager {
271
313
  if (server.managedProcessId) {
272
314
  await this.removeManagedProcessId(server.managedProcessId);
273
315
  server.managedProcessId = undefined;
316
+ server.managedProcessRecord = undefined;
317
+ }
318
+ else {
319
+ this.removeManagedServerRecord(server);
274
320
  }
275
321
  }
276
322
  async recordManagedServerProcess(options) {
@@ -300,6 +346,18 @@ export class OpenCodeServerManager {
300
346
  return undefined;
301
347
  });
302
348
  }
349
+ removeManagedServerRecord(server) {
350
+ const record = server.managedProcessRecord;
351
+ server.managedProcessRecord = undefined;
352
+ if (server.managedProcessId) {
353
+ void this.removeManagedProcessId(server.managedProcessId);
354
+ server.managedProcessId = undefined;
355
+ return;
356
+ }
357
+ if (record) {
358
+ this.removeManagedProcessRecordWhenResolved(record);
359
+ }
360
+ }
303
361
  async removeManagedProcessId(id) {
304
362
  try {
305
363
  await this.managedProcesses?.remove(id);
@@ -1,6 +1,6 @@
1
1
  import type { OpenCodeServerAcquisition, OpenCodeServerManagerLike } from "./server-manager.js";
2
2
  export interface TestOpenCodeServerAcquisition {
3
- force: boolean;
3
+ kind: "current" | "new" | "dedicated";
4
4
  env?: Record<string, string>;
5
5
  released: boolean;
6
6
  }
@@ -15,10 +15,11 @@ export declare class TestOpenCodeServerManager implements OpenCodeServerManagerL
15
15
  port: number;
16
16
  url: string;
17
17
  }>;
18
- acquire(options: {
19
- force: boolean;
20
- env?: Record<string, string>;
21
- }): Promise<OpenCodeServerAcquisition>;
18
+ acquireCurrent(): Promise<OpenCodeServerAcquisition>;
19
+ acquireNew(): Promise<OpenCodeServerAcquisition>;
20
+ acquireDedicated(env: Record<string, string>): Promise<OpenCodeServerAcquisition>;
21
+ private recordAcquisition;
22
+ shutdown(): Promise<void>;
22
23
  }
23
24
  export declare function createTestOpenCodeServerManager(): TestOpenCodeServerManager;
24
25
  //# sourceMappingURL=test-server-manager.d.ts.map
@@ -8,11 +8,20 @@ export class TestOpenCodeServerManager {
8
8
  this.ensureRunningCount += 1;
9
9
  return this.server;
10
10
  }
11
- async acquire(options) {
11
+ async acquireCurrent() {
12
+ return this.recordAcquisition({ kind: "current" });
13
+ }
14
+ async acquireNew() {
15
+ return this.recordAcquisition({ kind: "new" });
16
+ }
17
+ async acquireDedicated(env) {
18
+ return this.recordAcquisition({ kind: "dedicated", env });
19
+ }
20
+ recordAcquisition(input) {
12
21
  const acquisition = {
13
- force: options.force,
14
- env: options.env,
22
+ kind: input.kind,
15
23
  released: false,
24
+ ...(input.env ? { env: input.env } : {}),
16
25
  };
17
26
  this.acquisitions.push(acquisition);
18
27
  return {
@@ -22,6 +31,7 @@ export class TestOpenCodeServerManager {
22
31
  },
23
32
  };
24
33
  }
34
+ async shutdown() { }
25
35
  }
26
36
  export function createTestOpenCodeServerManager() {
27
37
  return new TestOpenCodeServerManager();
@@ -1,12 +1,12 @@
1
1
  import type { OpencodeClient } from "@opencode-ai/sdk/v2/client";
2
- import type { OpenCodeRuntime, OpenCodeServerAcquisition } from "../runtime.js";
2
+ import type { OpenCodeServerAcquisition, OpenCodeServerManagerLike } from "../server-manager.js";
3
3
  interface OpenCodeResponse {
4
4
  data?: unknown;
5
5
  error?: unknown;
6
6
  }
7
- export declare class TestOpenCodeRuntime implements OpenCodeRuntime {
7
+ export declare class TestOpenCodeHarness implements OpenCodeServerManagerLike {
8
8
  readonly acquisitions: Array<{
9
- force: boolean;
9
+ kind: "current" | "new" | "dedicated";
10
10
  env?: Record<string, string>;
11
11
  releaseCount: number;
12
12
  }>;
@@ -20,18 +20,18 @@ export declare class TestOpenCodeRuntime implements OpenCodeRuntime {
20
20
  url: string;
21
21
  };
22
22
  enqueueClient(client: TestOpenCodeClient): void;
23
- acquireServer(options: {
24
- force: boolean;
25
- env?: Record<string, string>;
26
- }): Promise<OpenCodeServerAcquisition>;
27
- ensureServerRunning(): Promise<{
23
+ acquireCurrent(): Promise<OpenCodeServerAcquisition>;
24
+ acquireNew(): Promise<OpenCodeServerAcquisition>;
25
+ acquireDedicated(env: Record<string, string>): Promise<OpenCodeServerAcquisition>;
26
+ private recordAcquisition;
27
+ ensureRunning(): Promise<{
28
28
  port: number;
29
29
  url: string;
30
30
  }>;
31
- createClient(options: {
31
+ readonly createClient: (options: {
32
32
  baseUrl: string;
33
33
  directory: string;
34
- }): OpencodeClient;
34
+ }) => OpencodeClient;
35
35
  shutdown(): Promise<void>;
36
36
  }
37
37
  export declare class TestOpenCodeClient {
@@ -89,4 +89,4 @@ export declare class TestOpenCodeClient {
89
89
  export declare function createEventStream(events: unknown[]): AsyncGenerator<unknown>;
90
90
  export declare function idleEvent(): unknown;
91
91
  export {};
92
- //# sourceMappingURL=test-opencode-runtime.d.ts.map
92
+ //# sourceMappingURL=test-opencode-harness.d.ts.map
@@ -1,15 +1,33 @@
1
- export class TestOpenCodeRuntime {
1
+ export class TestOpenCodeHarness {
2
2
  constructor() {
3
3
  this.acquisitions = [];
4
4
  this.clientCreations = [];
5
5
  this.clients = [];
6
6
  this.server = { port: 1234, url: "http://127.0.0.1:1234" };
7
+ this.createClient = (options) => {
8
+ this.clientCreations.push(options);
9
+ const client = this.clients.shift() ?? new TestOpenCodeClient();
10
+ return client.asSdkClient();
11
+ };
7
12
  }
8
13
  enqueueClient(client) {
9
14
  this.clients.push(client);
10
15
  }
11
- async acquireServer(options) {
12
- const acquisition = { force: options.force, env: options.env, releaseCount: 0 };
16
+ async acquireCurrent() {
17
+ return this.recordAcquisition({ kind: "current" });
18
+ }
19
+ async acquireNew() {
20
+ return this.recordAcquisition({ kind: "new" });
21
+ }
22
+ async acquireDedicated(env) {
23
+ return this.recordAcquisition({ kind: "dedicated", env });
24
+ }
25
+ recordAcquisition(input) {
26
+ const acquisition = {
27
+ kind: input.kind,
28
+ releaseCount: 0,
29
+ ...(input.env ? { env: input.env } : {}),
30
+ };
13
31
  this.acquisitions.push(acquisition);
14
32
  return {
15
33
  server: this.server,
@@ -18,14 +36,9 @@ export class TestOpenCodeRuntime {
18
36
  },
19
37
  };
20
38
  }
21
- async ensureServerRunning() {
39
+ async ensureRunning() {
22
40
  return this.server;
23
41
  }
24
- createClient(options) {
25
- this.clientCreations.push(options);
26
- const client = this.clients.shift() ?? new TestOpenCodeClient();
27
- return client.asSdkClient();
28
- }
29
42
  async shutdown() { }
30
43
  }
31
44
  export class TestOpenCodeClient {
@@ -244,4 +257,4 @@ export function idleEvent() {
244
257
  properties: { sessionID: "session-1" },
245
258
  };
246
259
  }
247
- //# sourceMappingURL=test-opencode-runtime.js.map
260
+ //# sourceMappingURL=test-opencode-harness.js.map
@@ -3,7 +3,7 @@ import type { Logger } from "pino";
3
3
  import { type AgentCapabilityFlags, type AgentClient, type AgentCreateSessionOptions, type AgentFeature, type AgentLaunchContext, type AgentMode, type AgentModelDefinition, type AgentPermissionRequest, type AgentPermissionResponse, type AgentPersistenceHandle, type AgentPromptInput, type AgentRunOptions, type AgentRunResult, type AgentRuntimeInfo, type AgentSession, type AgentSessionConfig, type AgentSlashCommand, type AgentStreamEvent, type AgentTimelineItem, type AgentUsage, type FetchCatalogOptions, type ImportableProviderSession, type ImportProviderSessionContext, type ImportProviderSessionInput, type ListImportableSessionsOptions, type ResolveAgentCreateConfigInput, type ResolveAgentCreateConfigResult, type ProviderCatalog, type ToolCallTimelineItem } from "../agent-sdk-types.js";
4
4
  import { isDefaultAgentCreateConfigUnattended } from "../create-agent-mode.js";
5
5
  import { type ProviderRuntimeSettings } from "../provider-launch-config.js";
6
- import { type OpenCodeRuntime } from "./opencode/runtime.js";
6
+ import { type OpenCodeServerManagerLike } from "./opencode/server-manager.js";
7
7
  import type { ManagedProcessRegistry } from "../../managed-processes/managed-processes.js";
8
8
  declare function resolveOpenCodeCreateConfig(input: ResolveAgentCreateConfigInput): ResolveAgentCreateConfigResult;
9
9
  declare function isOpenCodeCreateConfigUnattended(input: Parameters<typeof isDefaultAgentCreateConfigUnattended>[0]): boolean;
@@ -103,15 +103,21 @@ export declare const __openCodeInternals: {
103
103
  readonly OpenCodeAgentSession: typeof OpenCodeAgentSession;
104
104
  };
105
105
  interface OpenCodeAgentClientDeps {
106
- runtime?: OpenCodeRuntime;
106
+ serverManager?: OpenCodeServerManagerLike;
107
+ createClient?: OpenCodeClientFactory;
107
108
  managedProcesses?: ManagedProcessRegistry;
108
109
  }
110
+ type OpenCodeClientFactory = (options: {
111
+ baseUrl: string;
112
+ directory: string;
113
+ }) => OpencodeClient;
109
114
  export declare class OpenCodeAgentClient implements AgentClient {
110
115
  readonly provider: "opencode";
111
116
  readonly capabilities: AgentCapabilityFlags;
112
117
  readonly resolveCreateConfig: typeof resolveOpenCodeCreateConfig;
113
118
  readonly isCreateConfigUnattended: typeof isOpenCodeCreateConfigUnattended;
114
- private readonly runtime;
119
+ private readonly serverManager;
120
+ private readonly createOpenCodeClient;
115
121
  private readonly logger;
116
122
  private readonly runtimeSettings?;
117
123
  private readonly modelContextWindows;