@getpaseo/server 0.1.71 → 0.1.72

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 (79) hide show
  1. package/dist/server/server/agent/agent-response-loop.d.ts.map +1 -1
  2. package/dist/server/server/agent/agent-response-loop.js +2 -1
  3. package/dist/server/server/agent/agent-response-loop.js.map +1 -1
  4. package/dist/server/server/agent/create-agent-title.d.ts +8 -0
  5. package/dist/server/server/agent/create-agent-title.d.ts.map +1 -0
  6. package/dist/server/server/agent/create-agent-title.js +29 -0
  7. package/dist/server/server/agent/create-agent-title.js.map +1 -0
  8. package/dist/server/server/agent/import-sessions.d.ts +20 -1
  9. package/dist/server/server/agent/import-sessions.d.ts.map +1 -1
  10. package/dist/server/server/agent/import-sessions.js +101 -0
  11. package/dist/server/server/agent/import-sessions.js.map +1 -1
  12. package/dist/server/server/agent/provider-registry.d.ts.map +1 -1
  13. package/dist/server/server/agent/provider-registry.js +2 -1
  14. package/dist/server/server/agent/provider-registry.js.map +1 -1
  15. package/dist/server/server/agent/providers/codex/app-server-transport.d.ts +25 -0
  16. package/dist/server/server/agent/providers/codex/app-server-transport.d.ts.map +1 -0
  17. package/dist/server/server/agent/providers/codex/app-server-transport.js +183 -0
  18. package/dist/server/server/agent/providers/codex/app-server-transport.js.map +1 -0
  19. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +1 -21
  20. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
  21. package/dist/server/server/agent/providers/codex-app-server-agent.js +1 -170
  22. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
  23. package/dist/server/server/agent/providers/opencode/runtime.d.ts +27 -0
  24. package/dist/server/server/agent/providers/opencode/runtime.d.ts.map +1 -0
  25. package/dist/server/server/agent/providers/opencode/runtime.js +5 -0
  26. package/dist/server/server/agent/providers/opencode/runtime.js.map +1 -0
  27. package/dist/server/server/agent/providers/opencode/server-manager.d.ts +55 -0
  28. package/dist/server/server/agent/providers/opencode/server-manager.d.ts.map +1 -0
  29. package/dist/server/server/agent/providers/opencode/server-manager.js +255 -0
  30. package/dist/server/server/agent/providers/opencode/server-manager.js.map +1 -0
  31. package/dist/server/server/agent/providers/opencode/test-server-manager.d.ts +22 -0
  32. package/dist/server/server/agent/providers/opencode/test-server-manager.d.ts.map +1 -0
  33. package/dist/server/server/agent/providers/opencode/test-server-manager.js +28 -0
  34. package/dist/server/server/agent/providers/opencode/test-server-manager.js.map +1 -0
  35. package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.d.ts +75 -0
  36. package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.d.ts.map +1 -0
  37. package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.js +169 -0
  38. package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.js.map +1 -0
  39. package/dist/server/server/agent/providers/opencode-agent.d.ts +5 -35
  40. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
  41. package/dist/server/server/agent/providers/opencode-agent.js +28 -258
  42. package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
  43. package/dist/server/server/agent/providers/pi-direct-agent.d.ts +8 -3
  44. package/dist/server/server/agent/providers/pi-direct-agent.d.ts.map +1 -1
  45. package/dist/server/server/agent/providers/pi-direct-agent.js +44 -34
  46. package/dist/server/server/agent/providers/pi-direct-agent.js.map +1 -1
  47. package/dist/server/server/checkout/status-projection.d.ts +19 -0
  48. package/dist/server/server/checkout/status-projection.d.ts.map +1 -0
  49. package/dist/server/server/checkout/status-projection.js +98 -0
  50. package/dist/server/server/checkout/status-projection.js.map +1 -0
  51. package/dist/server/server/paseo-worktree-service.d.ts +2 -1
  52. package/dist/server/server/paseo-worktree-service.d.ts.map +1 -1
  53. package/dist/server/server/paseo-worktree-service.js +30 -3
  54. package/dist/server/server/paseo-worktree-service.js.map +1 -1
  55. package/dist/server/server/session.d.ts +1 -17
  56. package/dist/server/server/session.d.ts.map +1 -1
  57. package/dist/server/server/session.js +24 -233
  58. package/dist/server/server/session.js.map +1 -1
  59. package/dist/server/server/workspace-directory.d.ts +0 -2
  60. package/dist/server/server/workspace-directory.d.ts.map +1 -1
  61. package/dist/server/server/workspace-directory.js +9 -26
  62. package/dist/server/server/workspace-directory.js.map +1 -1
  63. package/dist/server/shared/agent-state-bucket.d.ts +13 -0
  64. package/dist/server/shared/agent-state-bucket.d.ts.map +1 -0
  65. package/dist/server/shared/agent-state-bucket.js +41 -0
  66. package/dist/server/shared/agent-state-bucket.js.map +1 -0
  67. package/dist/server/shared/git-remote.d.ts +16 -0
  68. package/dist/server/shared/git-remote.d.ts.map +1 -0
  69. package/dist/server/shared/git-remote.js +72 -0
  70. package/dist/server/shared/git-remote.js.map +1 -0
  71. package/dist/server/utils/checkout-git.d.ts +1 -0
  72. package/dist/server/utils/checkout-git.d.ts.map +1 -1
  73. package/dist/server/utils/checkout-git.js +3 -0
  74. package/dist/server/utils/checkout-git.js.map +1 -1
  75. package/dist/server/utils/github-remote.d.ts +3 -7
  76. package/dist/server/utils/github-remote.d.ts.map +1 -1
  77. package/dist/server/utils/github-remote.js +4 -70
  78. package/dist/server/utils/github-remote.js.map +1 -1
  79. package/package.json +4 -4
@@ -0,0 +1,169 @@
1
+ export class TestOpenCodeRuntime {
2
+ constructor() {
3
+ this.acquisitions = [];
4
+ this.clientCreations = [];
5
+ this.clients = [];
6
+ this.server = { port: 1234, url: "http://127.0.0.1:1234" };
7
+ }
8
+ enqueueClient(client) {
9
+ this.clients.push(client);
10
+ }
11
+ async acquireServer(options) {
12
+ const acquisition = { force: options.force, releaseCount: 0 };
13
+ this.acquisitions.push(acquisition);
14
+ return {
15
+ server: this.server,
16
+ release: () => {
17
+ acquisition.releaseCount += 1;
18
+ },
19
+ };
20
+ }
21
+ async ensureServerRunning() {
22
+ return this.server;
23
+ }
24
+ createClient(options) {
25
+ this.clientCreations.push(options);
26
+ const client = this.clients.shift() ?? new TestOpenCodeClient();
27
+ return client.asSdkClient();
28
+ }
29
+ async shutdown() { }
30
+ }
31
+ export class TestOpenCodeClient {
32
+ constructor() {
33
+ this.calls = {
34
+ appAgents: [],
35
+ commandList: [],
36
+ eventSubscribe: [],
37
+ permissionReply: [],
38
+ providerList: [],
39
+ questionReject: [],
40
+ questionReply: [],
41
+ sessionAbort: [],
42
+ sessionCommand: [],
43
+ sessionCreate: [],
44
+ sessionDelete: [],
45
+ sessionMessages: [],
46
+ sessionPromptAsync: [],
47
+ sessionSummarize: [],
48
+ sessionUpdate: [],
49
+ };
50
+ this.appAgentsResponse = { data: [] };
51
+ this.commandListResponse = { data: [] };
52
+ this.eventStream = createEventStream([idleEvent()]);
53
+ this.permissionReplyResponse = {};
54
+ this.providerListResponse = { data: { connected: [], all: [] } };
55
+ this.providerListImplementation = null;
56
+ this.questionRejectResponse = {};
57
+ this.questionReplyResponse = {};
58
+ this.sessionAbortResponse = {};
59
+ this.sessionCommandError = null;
60
+ this.sessionCommandResponse = {};
61
+ this.sessionCreateResponse = { data: { id: "session-1" } };
62
+ this.sessionDeleteResponse = {};
63
+ this.sessionMessagesResponse = { data: [] };
64
+ this.sessionPromptAsyncResponse = {};
65
+ this.sessionSummarizeResponse = { data: {} };
66
+ this.sessionUpdateResponse = {};
67
+ }
68
+ asSdkClient() {
69
+ return {
70
+ app: {
71
+ agents: async (parameters) => {
72
+ this.calls.appAgents.push(parameters);
73
+ return this.appAgentsResponse;
74
+ },
75
+ },
76
+ command: {
77
+ list: async (parameters) => {
78
+ this.calls.commandList.push(parameters);
79
+ return this.commandListResponse;
80
+ },
81
+ },
82
+ event: {
83
+ subscribe: async (parameters, options) => {
84
+ this.calls.eventSubscribe.push({ parameters, options });
85
+ return { stream: this.eventStream };
86
+ },
87
+ },
88
+ mcp: {
89
+ add: async () => ({}),
90
+ connect: async () => ({}),
91
+ },
92
+ permission: {
93
+ reply: async (parameters) => {
94
+ this.calls.permissionReply.push(parameters);
95
+ return this.permissionReplyResponse;
96
+ },
97
+ },
98
+ provider: {
99
+ list: async (parameters) => {
100
+ this.calls.providerList.push(parameters);
101
+ return this.providerListImplementation
102
+ ? await this.providerListImplementation()
103
+ : this.providerListResponse;
104
+ },
105
+ },
106
+ question: {
107
+ reject: async (parameters) => {
108
+ this.calls.questionReject.push(parameters);
109
+ return this.questionRejectResponse;
110
+ },
111
+ reply: async (parameters) => {
112
+ this.calls.questionReply.push(parameters);
113
+ return this.questionReplyResponse;
114
+ },
115
+ },
116
+ session: {
117
+ abort: async (parameters) => {
118
+ this.calls.sessionAbort.push(parameters);
119
+ return this.sessionAbortResponse;
120
+ },
121
+ command: async (parameters) => {
122
+ this.calls.sessionCommand.push(parameters);
123
+ if (this.sessionCommandError) {
124
+ throw this.sessionCommandError;
125
+ }
126
+ return this.sessionCommandResponse;
127
+ },
128
+ create: async (parameters) => {
129
+ this.calls.sessionCreate.push(parameters);
130
+ return this.sessionCreateResponse;
131
+ },
132
+ delete: async (parameters) => {
133
+ this.calls.sessionDelete.push(parameters);
134
+ return this.sessionDeleteResponse;
135
+ },
136
+ messages: async (parameters) => {
137
+ this.calls.sessionMessages.push(parameters);
138
+ return this.sessionMessagesResponse;
139
+ },
140
+ promptAsync: async (parameters) => {
141
+ this.calls.sessionPromptAsync.push(parameters);
142
+ return this.sessionPromptAsyncResponse;
143
+ },
144
+ summarize: async (parameters) => {
145
+ this.calls.sessionSummarize.push(parameters);
146
+ return this.sessionSummarizeResponse;
147
+ },
148
+ update: async (parameters) => {
149
+ this.calls.sessionUpdate.push(parameters);
150
+ return this.sessionUpdateResponse;
151
+ },
152
+ },
153
+ };
154
+ }
155
+ }
156
+ export function createEventStream(events) {
157
+ return (async function* () {
158
+ for (const event of events) {
159
+ yield event;
160
+ }
161
+ })();
162
+ }
163
+ export function idleEvent() {
164
+ return {
165
+ type: "session.idle",
166
+ properties: { sessionID: "session-1" },
167
+ };
168
+ }
169
+ //# sourceMappingURL=test-opencode-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-opencode-runtime.js","sourceRoot":"","sources":["../../../../../../../src/server/agent/providers/opencode/test-utils/test-opencode-runtime.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { type AssistantMessage as OpenCodeAssistantMessage, type Event as OpenCo
2
2
  import type { Logger } from "pino";
3
3
  import type { AgentCapabilityFlags, AgentClient, AgentCreateSessionOptions, AgentLaunchContext, AgentMode, AgentModelDefinition, AgentPermissionRequest, AgentPermissionResponse, AgentPersistenceHandle, AgentPromptInput, AgentRunOptions, AgentRunResult, AgentRuntimeInfo, AgentSession, AgentSessionConfig, AgentSlashCommand, AgentStreamEvent, AgentUsage, ListModelsOptions, ListModesOptions, ListPersistedAgentsOptions, PersistedAgentDescriptor, ToolCallTimelineItem } from "../agent-sdk-types.js";
4
4
  import { type ProviderRuntimeSettings } from "../provider-launch-config.js";
5
+ import { type OpenCodeRuntime } from "./opencode/runtime.js";
5
6
  type OpenCodeAgentConfig = AgentSessionConfig & {
6
7
  provider: "opencode";
7
8
  };
@@ -82,49 +83,18 @@ export declare const __openCodeInternals: {
82
83
  isSelectableOpenCodeAgent: typeof isSelectableOpenCodeAgent;
83
84
  readonly OpenCodeAgentSession: typeof OpenCodeAgentSession;
84
85
  };
85
- export declare class OpenCodeServerManager {
86
- private static instance;
87
- private static exitHandlerRegistered;
88
- private currentServer;
89
- private retiredServers;
90
- private startPromise;
91
- private forcedRefreshPromise;
92
- private readonly logger;
93
- private readonly runtimeSettings?;
94
- private readonly runtimeSettingsKey;
95
- private constructor();
96
- static getInstance(logger: Logger, runtimeSettings?: ProviderRuntimeSettings): OpenCodeServerManager;
97
- private static registerExitHandler;
98
- ensureRunning(): Promise<{
99
- port: number;
100
- url: string;
101
- }>;
102
- acquire(options: {
103
- force: boolean;
104
- }): Promise<{
105
- server: {
106
- port: number;
107
- url: string;
108
- };
109
- release: () => void;
110
- }>;
111
- private getForcedRefreshServer;
112
- private getCurrentServer;
113
- private rotateCurrentServer;
114
- private startServer;
115
- shutdown(): Promise<void>;
116
- private cleanupRetiredServers;
117
- private killServer;
86
+ interface OpenCodeAgentClientDeps {
87
+ runtime?: OpenCodeRuntime;
118
88
  }
119
89
  export declare class OpenCodeAgentClient implements AgentClient {
120
90
  readonly provider: "opencode";
121
91
  readonly capabilities: AgentCapabilityFlags;
122
- private readonly serverManager;
92
+ private readonly runtime;
123
93
  private readonly logger;
124
94
  private readonly runtimeSettings?;
125
95
  private readonly modelContextWindows;
126
96
  private readonly storageRoot;
127
- constructor(logger: Logger, runtimeSettings?: ProviderRuntimeSettings, storageRoot?: string);
97
+ constructor(logger: Logger, runtimeSettings?: ProviderRuntimeSettings, storageRoot?: string, deps?: OpenCodeAgentClientDeps);
128
98
  createSession(config: AgentSessionConfig, _launchContext?: AgentLaunchContext, options?: AgentCreateSessionOptions): Promise<AgentSession>;
129
99
  resumeSession(handle: AgentPersistenceHandle, overrides?: Partial<AgentSessionConfig>, _launchContext?: AgentLaunchContext): Promise<AgentSession>;
130
100
  listModels(options: ListModelsOptions): Promise<AgentModelDefinition[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-agent.d.ts","sourceRoot":"","sources":["../../../../../src/server/agent/providers/opencode-agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"opencode-agent.d.ts","sourceRoot":"","sources":["../../../../../src/server/agent/providers/opencode-agent.ts"],"names":[],"mappings":"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"}
@@ -1,19 +1,18 @@
1
1
  import { readdir, readFile } from "node:fs/promises";
2
2
  import { homedir } from "node:os";
3
3
  import path from "node:path";
4
- import { createOpencodeClient, } from "@opencode-ai/sdk/v2/client";
5
- import net from "node:net";
6
- import { z } from "zod";
7
- import { createProviderEnvSpec, resolveProviderCommandPrefix, } from "../provider-launch-config.js";
8
4
  import { findExecutable, isCommandAvailable } from "../../../utils/executable.js";
9
- import { terminateWithTreeKill } from "../../../utils/tree-kill.js";
5
+ import { z } from "zod";
6
+ import { createProviderEnvSpec } from "../provider-launch-config.js";
10
7
  import { withTimeout } from "../../../utils/promise-timeout.js";
11
- import { execCommand, spawnProcess } from "../../../utils/spawn.js";
8
+ import { execCommand } from "../../../utils/spawn.js";
12
9
  import { buildToolCallDisplayModel } from "../../../shared/tool-call-display.js";
13
10
  import { mapOpencodeToolCall } from "./opencode/tool-call-mapper.js";
11
+ import { OpenCodeServerManager } from "./opencode/server-manager.js";
14
12
  import { formatDiagnosticStatus, formatProviderDiagnostic, formatProviderDiagnosticError, resolveBinaryVersion, toDiagnosticErrorMessage, } from "./diagnostic-utils.js";
15
13
  import { runProviderTurn } from "./provider-runner.js";
16
14
  import { renderPromptAttachmentAsText } from "../prompt-attachments.js";
15
+ import { createSdkOpenCodeClient, } from "./opencode/runtime.js";
17
16
  const OPENCODE_CAPABILITIES = {
18
17
  supportsStreaming: true,
19
18
  supportsSessionPersistence: true,
@@ -82,8 +81,6 @@ const OpenCodeStoredPartSchema = z
82
81
  .passthrough();
83
82
  const MCP_ALREADY_PRESENT_ERROR_TOKENS = ["already", "exists", "connected"];
84
83
  const OPENCODE_PROVIDER_LIST_TIMEOUT_MS = 30000;
85
- const OPENCODE_SERVER_GRACEFUL_SHUTDOWN_TIMEOUT_MS = 5000;
86
- const OPENCODE_SERVER_FORCE_SHUTDOWN_TIMEOUT_MS = 1000;
87
84
  const OPENCODE_HANDLED_BUILTIN_SLASH_COMMANDS = [
88
85
  { name: "compact", description: "Compact the current session", argumentHint: "" },
89
86
  { name: "summarize", description: "Compact the current session", argumentHint: "" },
@@ -162,13 +159,6 @@ const OpencodeToolPartToTimelineItemSchema = OpencodeToolPartTimelineEnvelopeSch
162
159
  output: part.output,
163
160
  error: part.error,
164
161
  }));
165
- async function resolveOpenCodeBinary() {
166
- const found = await findExecutable("opencode");
167
- if (found) {
168
- return found;
169
- }
170
- throw new Error("OpenCode binary not found. Install OpenCode (https://github.com/opencode-ai/opencode) and ensure it is available in your shell PATH.");
171
- }
172
162
  function toOpenCodeMcpConfig(config) {
173
163
  if (config.type === "stdio") {
174
164
  return {
@@ -278,22 +268,6 @@ function isAlreadyPresentMcpError(error) {
278
268
  const normalized = toDiagnosticErrorMessage(error).toLowerCase();
279
269
  return MCP_ALREADY_PRESENT_ERROR_TOKENS.some((token) => normalized.includes(token));
280
270
  }
281
- async function findAvailablePort() {
282
- return new Promise((resolve, reject) => {
283
- const server = net.createServer();
284
- server.listen(0, () => {
285
- const address = server.address();
286
- if (address && typeof address === "object") {
287
- const port = address.port;
288
- server.close(() => resolve(port));
289
- }
290
- else {
291
- server.close(() => reject(new Error("Failed to get port")));
292
- }
293
- });
294
- server.on("error", reject);
295
- });
296
- }
297
271
  function resolvePartDedupeKey(part, partType) {
298
272
  if (part.id.trim().length > 0) {
299
273
  return `${partType}:${part.id}`;
@@ -670,244 +644,40 @@ export const __openCodeInternals = {
670
644
  return OpenCodeAgentSession;
671
645
  },
672
646
  };
673
- export class OpenCodeServerManager {
674
- constructor(logger, runtimeSettings) {
675
- this.currentServer = null;
676
- this.retiredServers = new Set();
677
- this.startPromise = null;
678
- this.forcedRefreshPromise = null;
679
- this.logger = logger;
680
- this.runtimeSettings = runtimeSettings;
681
- this.runtimeSettingsKey = JSON.stringify(runtimeSettings ?? {});
647
+ class ProductionOpenCodeRuntime {
648
+ constructor(serverManager) {
649
+ this.serverManager = serverManager;
682
650
  }
683
- static getInstance(logger, runtimeSettings) {
684
- const nextSettingsKey = JSON.stringify(runtimeSettings ?? {});
685
- if (!OpenCodeServerManager.instance) {
686
- OpenCodeServerManager.instance = new OpenCodeServerManager(logger, runtimeSettings);
687
- OpenCodeServerManager.registerExitHandler();
688
- }
689
- else if (OpenCodeServerManager.instance.runtimeSettingsKey !== nextSettingsKey) {
690
- logger.warn({
691
- existingRuntimeSettings: OpenCodeServerManager.instance.runtimeSettingsKey,
692
- requestedRuntimeSettings: nextSettingsKey,
693
- }, "OpenCode server manager already initialized with different runtime settings");
694
- }
695
- return OpenCodeServerManager.instance;
651
+ async acquireServer(options) {
652
+ return this.serverManager.acquire(options);
696
653
  }
697
- static registerExitHandler() {
698
- if (OpenCodeServerManager.exitHandlerRegistered) {
699
- return;
700
- }
701
- OpenCodeServerManager.exitHandlerRegistered = true;
702
- const cleanup = () => {
703
- const instance = OpenCodeServerManager.instance;
704
- void instance?.shutdown();
705
- };
706
- process.on("exit", cleanup);
707
- process.on("SIGTERM", cleanup);
708
- process.on("SIGINT", cleanup);
709
- }
710
- async ensureRunning() {
711
- const acquisition = await this.acquire({ force: false });
712
- acquisition.release();
713
- return acquisition.server;
714
- }
715
- async acquire(options) {
716
- const server = options.force
717
- ? await this.getForcedRefreshServer()
718
- : await this.getCurrentServer();
719
- server.refCount += 1;
720
- let released = false;
721
- return {
722
- server: { port: server.port, url: server.url },
723
- release: () => {
724
- if (released) {
725
- return;
726
- }
727
- released = true;
728
- server.refCount -= 1;
729
- this.cleanupRetiredServers();
730
- },
731
- };
732
- }
733
- async getForcedRefreshServer() {
734
- if (this.forcedRefreshPromise) {
735
- return this.forcedRefreshPromise;
736
- }
737
- this.forcedRefreshPromise = Promise.resolve()
738
- .then(async () => {
739
- await this.rotateCurrentServer();
740
- return this.getCurrentServer();
741
- })
742
- .finally(() => {
743
- this.forcedRefreshPromise = null;
744
- });
745
- return this.forcedRefreshPromise;
654
+ async ensureServerRunning() {
655
+ return this.serverManager.ensureRunning();
746
656
  }
747
- async getCurrentServer() {
748
- if (this.startPromise) {
749
- return this.startPromise;
750
- }
751
- if (this.currentServer && !this.currentServer.process.killed) {
752
- return this.currentServer;
753
- }
754
- this.startPromise = this.startServer();
755
- try {
756
- const result = await this.startPromise;
757
- if (!result.retired) {
758
- this.currentServer = result;
759
- }
760
- return result;
761
- }
762
- finally {
763
- this.startPromise = null;
764
- }
765
- }
766
- async rotateCurrentServer() {
767
- const existing = this.currentServer;
768
- if (existing) {
769
- existing.retired = true;
770
- this.retiredServers.add(existing);
771
- this.currentServer = null;
772
- this.cleanupRetiredServers();
773
- }
774
- if (this.startPromise) {
775
- const pending = await this.startPromise;
776
- pending.retired = true;
777
- this.retiredServers.add(pending);
778
- this.currentServer = null;
779
- this.cleanupRetiredServers();
780
- }
781
- }
782
- async startServer() {
783
- const port = await findAvailablePort();
784
- const url = `http://127.0.0.1:${port}`;
785
- const launchPrefix = await resolveProviderCommandPrefix(this.runtimeSettings?.command, resolveOpenCodeBinary);
786
- return new Promise((resolve, reject) => {
787
- const serverProcess = spawnProcess(launchPrefix.command, [...launchPrefix.args, "serve", "--port", String(port)], {
788
- detached: process.platform !== "win32",
789
- stdio: ["ignore", "pipe", "pipe"],
790
- ...createProviderEnvSpec({ runtimeSettings: this.runtimeSettings }),
791
- });
792
- let started = false;
793
- let stderrBuffer = "";
794
- let stdoutBuffer = "";
795
- const STARTUP_BUFFER_CAP = 8192;
796
- const appendCapped = (current, chunk) => {
797
- if (current.length >= STARTUP_BUFFER_CAP) {
798
- return current;
799
- }
800
- const remaining = STARTUP_BUFFER_CAP - current.length;
801
- return current + chunk.slice(0, remaining);
802
- };
803
- const buildStartupErrorMessage = (headline) => {
804
- const sections = [headline];
805
- const stderrTrimmed = stderrBuffer.trim();
806
- if (stderrTrimmed.length > 0) {
807
- sections.push(`stderr: ${stderrTrimmed}`);
808
- }
809
- const stdoutTrimmed = stdoutBuffer.trim();
810
- if (stdoutTrimmed.length > 0) {
811
- sections.push(`stdout: ${stdoutTrimmed}`);
812
- }
813
- return sections.join("\n");
814
- };
815
- const timeout = setTimeout(() => {
816
- if (!started) {
817
- reject(new Error(buildStartupErrorMessage("OpenCode server startup timeout")));
818
- }
819
- }, 30000);
820
- serverProcess.stdout?.on("data", (data) => {
821
- const output = data.toString();
822
- stdoutBuffer = appendCapped(stdoutBuffer, output);
823
- if (output.includes("listening on") && !started) {
824
- started = true;
825
- clearTimeout(timeout);
826
- resolve({
827
- process: serverProcess,
828
- port,
829
- url,
830
- refCount: 0,
831
- retired: false,
832
- });
833
- }
834
- });
835
- serverProcess.stderr?.on("data", (data) => {
836
- const output = data.toString();
837
- stderrBuffer = appendCapped(stderrBuffer, output);
838
- this.logger.error({ stderr: output.trim() }, "OpenCode server stderr");
839
- });
840
- serverProcess.on("error", (error) => {
841
- clearTimeout(timeout);
842
- const headline = error instanceof Error ? error.message : String(error);
843
- reject(new Error(buildStartupErrorMessage(headline)));
844
- });
845
- serverProcess.on("exit", (code) => {
846
- if (!started) {
847
- clearTimeout(timeout);
848
- reject(new Error(buildStartupErrorMessage(`OpenCode server exited with code ${code}`)));
849
- }
850
- if (this.currentServer?.process === serverProcess) {
851
- this.currentServer = null;
852
- }
853
- for (const retired of Array.from(this.retiredServers)) {
854
- if (retired.process === serverProcess) {
855
- this.retiredServers.delete(retired);
856
- }
857
- }
858
- });
859
- });
657
+ createClient(options) {
658
+ return createSdkOpenCodeClient(options);
860
659
  }
861
660
  async shutdown() {
862
- const servers = [
863
- ...(this.currentServer ? [this.currentServer] : []),
864
- ...Array.from(this.retiredServers),
865
- ];
866
- await Promise.all(servers.map((server) => this.killServer(server)));
867
- this.currentServer = null;
868
- this.retiredServers.clear();
869
- }
870
- cleanupRetiredServers() {
871
- for (const server of Array.from(this.retiredServers)) {
872
- if (server.refCount === 0) {
873
- this.retiredServers.delete(server);
874
- void this.killServer(server);
875
- }
876
- }
877
- }
878
- async killServer(server) {
879
- if (server.process.killed) {
880
- return;
881
- }
882
- const result = await terminateWithTreeKill(server.process, {
883
- gracefulTimeoutMs: OPENCODE_SERVER_GRACEFUL_SHUTDOWN_TIMEOUT_MS,
884
- forceTimeoutMs: OPENCODE_SERVER_FORCE_SHUTDOWN_TIMEOUT_MS,
885
- onForceSignal: () => {
886
- this.logger.warn({ timeoutMs: OPENCODE_SERVER_GRACEFUL_SHUTDOWN_TIMEOUT_MS }, "OpenCode server did not exit after SIGTERM; sending SIGKILL");
887
- },
888
- });
889
- if (result === "kill-timeout") {
890
- this.logger.warn({ timeoutMs: OPENCODE_SERVER_FORCE_SHUTDOWN_TIMEOUT_MS }, "OpenCode server did not report exit after SIGKILL");
891
- }
661
+ await this.serverManager.shutdown();
892
662
  }
893
663
  }
894
- OpenCodeServerManager.instance = null;
895
- OpenCodeServerManager.exitHandlerRegistered = false;
896
664
  export class OpenCodeAgentClient {
897
- constructor(logger, runtimeSettings, storageRoot) {
665
+ constructor(logger, runtimeSettings, storageRoot, deps = {}) {
898
666
  this.provider = "opencode";
899
667
  this.capabilities = OPENCODE_CAPABILITIES;
900
668
  this.modelContextWindows = new Map();
901
669
  this.logger = logger.child({ module: "agent", provider: "opencode" });
902
670
  this.runtimeSettings = runtimeSettings;
903
671
  this.storageRoot = storageRoot ?? resolveOpenCodeStorageRoot();
904
- this.serverManager = OpenCodeServerManager.getInstance(this.logger, runtimeSettings);
672
+ this.runtime =
673
+ deps.runtime ??
674
+ new ProductionOpenCodeRuntime(OpenCodeServerManager.getInstance(this.logger, runtimeSettings));
905
675
  }
906
676
  async createSession(config, _launchContext, options) {
907
677
  const openCodeConfig = this.assertConfig(config);
908
- const acquisition = await this.serverManager.acquire({ force: false });
678
+ const acquisition = await this.runtime.acquireServer({ force: false });
909
679
  const { url } = acquisition.server;
910
- const client = createOpencodeClient({
680
+ const client = this.runtime.createClient({
911
681
  baseUrl: url,
912
682
  directory: openCodeConfig.cwd,
913
683
  });
@@ -939,9 +709,9 @@ export class OpenCodeAgentClient {
939
709
  ...overrides,
940
710
  };
941
711
  const openCodeConfig = this.assertConfig(config);
942
- const acquisition = await this.serverManager.acquire({ force: false });
712
+ const acquisition = await this.runtime.acquireServer({ force: false });
943
713
  const { url } = acquisition.server;
944
- const client = createOpencodeClient({
714
+ const client = this.runtime.createClient({
945
715
  baseUrl: url,
946
716
  directory: openCodeConfig.cwd,
947
717
  });
@@ -955,9 +725,9 @@ export class OpenCodeAgentClient {
955
725
  }
956
726
  }
957
727
  async listModels(options) {
958
- const acquisition = await this.serverManager.acquire({ force: options.force });
728
+ const acquisition = await this.runtime.acquireServer({ force: options.force });
959
729
  const { url } = acquisition.server;
960
- const client = createOpencodeClient({
730
+ const client = this.runtime.createClient({
961
731
  baseUrl: url,
962
732
  directory: options.cwd,
963
733
  });
@@ -1001,10 +771,10 @@ export class OpenCodeAgentClient {
1001
771
  }
1002
772
  }
1003
773
  async listModes(options) {
1004
- const acquisition = await this.serverManager.acquire({ force: options.force });
774
+ const acquisition = await this.runtime.acquireServer({ force: options.force });
1005
775
  const { url } = acquisition.server;
1006
776
  const directory = options.cwd;
1007
- const client = createOpencodeClient({ baseUrl: url, directory });
777
+ const client = this.runtime.createClient({ baseUrl: url, directory });
1008
778
  try {
1009
779
  const response = await withTimeout(client.app.agents({ directory }), 10000, "OpenCode app.agents timed out after 10s");
1010
780
  if (response.error || !response.data) {
@@ -1041,7 +811,7 @@ export class OpenCodeAgentClient {
1041
811
  let modelsValue = "Not checked";
1042
812
  let status = formatDiagnosticStatus(available);
1043
813
  try {
1044
- const { url } = await this.serverManager.ensureRunning();
814
+ const { url } = await this.runtime.ensureServerRunning();
1045
815
  serverStatus = `Running (${url})`;
1046
816
  }
1047
817
  catch (error) {