mcp-subagents-opencode 1.1.0 → 1.2.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.
- package/build/helpers.d.ts +43 -0
- package/build/helpers.d.ts.map +1 -1
- package/build/helpers.js +99 -8
- package/build/helpers.js.map +1 -1
- package/build/index.js +8 -3
- package/build/index.js.map +1 -1
- package/build/server/register-notifications.d.ts +5 -0
- package/build/server/register-notifications.d.ts.map +1 -1
- package/build/server/register-notifications.js +28 -3
- package/build/server/register-notifications.js.map +1 -1
- package/build/server/register-resources.d.ts.map +1 -1
- package/build/server/register-resources.js +9 -4
- package/build/server/register-resources.js.map +1 -1
- package/build/server/register-tasks.d.ts.map +1 -1
- package/build/server/register-tasks.js +13 -6
- package/build/server/register-tasks.js.map +1 -1
- package/build/server/register-tools.d.ts.map +1 -1
- package/build/server/register-tools.js +4 -3
- package/build/server/register-tools.js.map +1 -1
- package/build/services/opencode-client.d.ts +15 -1
- package/build/services/opencode-client.d.ts.map +1 -1
- package/build/services/opencode-client.js +229 -8
- package/build/services/opencode-client.js.map +1 -1
- package/build/services/opencode-spawner.d.ts +8 -2
- package/build/services/opencode-spawner.d.ts.map +1 -1
- package/build/services/opencode-spawner.js +331 -28
- package/build/services/opencode-spawner.js.map +1 -1
- package/build/services/output-file.d.ts +7 -5
- package/build/services/output-file.d.ts.map +1 -1
- package/build/services/output-file.js +28 -31
- package/build/services/output-file.js.map +1 -1
- package/build/services/task-manager.d.ts +6 -2
- package/build/services/task-manager.d.ts.map +1 -1
- package/build/services/task-manager.js +34 -5
- package/build/services/task-manager.js.map +1 -1
- package/build/services/task-persistence.d.ts +3 -3
- package/build/services/task-persistence.d.ts.map +1 -1
- package/build/services/task-persistence.js +15 -13
- package/build/services/task-persistence.js.map +1 -1
- package/build/tools/answer-question.d.ts.map +1 -1
- package/build/tools/answer-question.js +4 -3
- package/build/tools/answer-question.js.map +1 -1
- package/build/tools/cancel-task.d.ts.map +1 -1
- package/build/tools/cancel-task.js +6 -2
- package/build/tools/cancel-task.js.map +1 -1
- package/build/tools/send-message.d.ts.map +1 -1
- package/build/tools/send-message.js +13 -2
- package/build/tools/send-message.js.map +1 -1
- package/build/tools/shared-spawn.d.ts.map +1 -1
- package/build/tools/shared-spawn.js +19 -2
- package/build/tools/shared-spawn.js.map +1 -1
- package/package.json +1 -1
|
@@ -7,15 +7,22 @@ export interface OpenCodeClientOptions {
|
|
|
7
7
|
username?: string;
|
|
8
8
|
password?: string;
|
|
9
9
|
}
|
|
10
|
+
/** Structured error categories for actionable user guidance. */
|
|
11
|
+
export type OpenCodeErrorCategory = 'connection_refused' | 'dns_resolution' | 'auth_failed' | 'not_found' | 'rate_limited' | 'server_error' | 'timeout' | 'network_error' | 'invalid_response';
|
|
10
12
|
export declare class OpenCodeError extends Error {
|
|
11
13
|
readonly status: number;
|
|
12
14
|
readonly method: string;
|
|
13
15
|
readonly path: string;
|
|
14
16
|
readonly body: string;
|
|
15
|
-
|
|
17
|
+
readonly category: OpenCodeErrorCategory;
|
|
18
|
+
constructor(message: string, status: number, method: string, path: string, body: string, category?: OpenCodeErrorCategory);
|
|
19
|
+
private static categorizeStatus;
|
|
16
20
|
get isTransient(): boolean;
|
|
17
21
|
get isNotFound(): boolean;
|
|
18
22
|
get isAuth(): boolean;
|
|
23
|
+
get isRateLimit(): boolean;
|
|
24
|
+
/** User-facing guidance for this error. */
|
|
25
|
+
get guidance(): string;
|
|
19
26
|
}
|
|
20
27
|
export declare class OpenCodeClient {
|
|
21
28
|
private baseUrl;
|
|
@@ -34,7 +41,14 @@ export declare class OpenCodeClient {
|
|
|
34
41
|
delete<T = unknown>(path: string, query?: Record<string, string>, directory?: string): Promise<T>;
|
|
35
42
|
/**
|
|
36
43
|
* Check if the OpenCode server is healthy.
|
|
44
|
+
* Uses the /global/health endpoint which returns {healthy: true, version: "..."}.
|
|
37
45
|
*/
|
|
38
46
|
isHealthy(): Promise<boolean>;
|
|
47
|
+
/** Fallback health check for older OpenCode versions without /global/health. */
|
|
48
|
+
private isHealthyFallback;
|
|
49
|
+
/**
|
|
50
|
+
* Get a diagnostic summary of connection state for error messages.
|
|
51
|
+
*/
|
|
52
|
+
diagnose(): Promise<string>;
|
|
39
53
|
}
|
|
40
54
|
//# sourceMappingURL=opencode-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode-client.d.ts","sourceRoot":"","sources":["../../src/services/opencode-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,aAAc,SAAQ,KAAK;
|
|
1
|
+
{"version":3,"file":"opencode-client.d.ts","sourceRoot":"","sources":["../../src/services/opencode-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,gEAAgE;AAChE,MAAM,MAAM,qBAAqB,GAC7B,oBAAoB,GACpB,gBAAgB,GAChB,aAAa,GACb,WAAW,GACX,cAAc,GACd,cAAc,GACd,SAAS,GACT,eAAe,GACf,kBAAkB,CAAC;AAEvB,qBAAa,aAAc,SAAQ,KAAK;aAKpB,MAAM,EAAE,MAAM;aACd,MAAM,EAAE,MAAM;aACd,IAAI,EAAE,MAAM;aACZ,IAAI,EAAE,MAAM;IAP9B,SAAgB,QAAQ,EAAE,qBAAqB,CAAC;gBAG9C,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAC5B,QAAQ,CAAC,EAAE,qBAAqB;IAOlC,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAQ/B,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,2CAA2C;IAC3C,IAAI,QAAQ,IAAI,MAAM,CAuBrB;CACF;AA2CD,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAC,CAAS;gBAEhB,OAAO,EAAE,qBAAqB;IAQ1C,UAAU,IAAI,MAAM;IAIpB,OAAO,CAAC,QAAQ;IAYhB,OAAO,CAAC,OAAO;YAcD,OAAO;IA0If,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAI9F,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,CAAC;IAI5G,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAIhF,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAIvG;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IA+BnC,gFAAgF;YAClE,iBAAiB;IAY/B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;CAsClC"}
|
|
@@ -7,13 +7,26 @@ export class OpenCodeError extends Error {
|
|
|
7
7
|
method;
|
|
8
8
|
path;
|
|
9
9
|
body;
|
|
10
|
-
|
|
10
|
+
category;
|
|
11
|
+
constructor(message, status, method, path, body, category) {
|
|
11
12
|
super(message);
|
|
12
13
|
this.status = status;
|
|
13
14
|
this.method = method;
|
|
14
15
|
this.path = path;
|
|
15
16
|
this.body = body;
|
|
16
17
|
this.name = 'OpenCodeError';
|
|
18
|
+
this.category = category ?? OpenCodeError.categorizeStatus(status);
|
|
19
|
+
}
|
|
20
|
+
static categorizeStatus(status) {
|
|
21
|
+
if (status === 401 || status === 403)
|
|
22
|
+
return 'auth_failed';
|
|
23
|
+
if (status === 404)
|
|
24
|
+
return 'not_found';
|
|
25
|
+
if (status === 429)
|
|
26
|
+
return 'rate_limited';
|
|
27
|
+
if (status >= 500)
|
|
28
|
+
return 'server_error';
|
|
29
|
+
return 'network_error';
|
|
17
30
|
}
|
|
18
31
|
get isTransient() {
|
|
19
32
|
return this.status === 429 || this.status === 502 || this.status === 503 || this.status === 504;
|
|
@@ -24,6 +37,74 @@ export class OpenCodeError extends Error {
|
|
|
24
37
|
get isAuth() {
|
|
25
38
|
return this.status === 401 || this.status === 403;
|
|
26
39
|
}
|
|
40
|
+
get isRateLimit() {
|
|
41
|
+
return this.status === 429;
|
|
42
|
+
}
|
|
43
|
+
/** User-facing guidance for this error. */
|
|
44
|
+
get guidance() {
|
|
45
|
+
switch (this.category) {
|
|
46
|
+
case 'connection_refused':
|
|
47
|
+
return 'The OpenCode server is not running or not reachable. Start it with `opencode serve` and ensure OPENCODE_BASE_URL is correct.';
|
|
48
|
+
case 'dns_resolution':
|
|
49
|
+
return 'Cannot resolve the OpenCode server hostname. Check OPENCODE_BASE_URL for typos.';
|
|
50
|
+
case 'auth_failed':
|
|
51
|
+
return this.status === 401
|
|
52
|
+
? 'Authentication failed. Check OPENCODE_SERVER_USERNAME and OPENCODE_SERVER_PASSWORD environment variables.'
|
|
53
|
+
: 'Access forbidden (403). The configured credentials may lack required permissions.';
|
|
54
|
+
case 'not_found':
|
|
55
|
+
return `The requested resource was not found (${this.method} ${this.path}). The session may have expired or the endpoint may not exist.`;
|
|
56
|
+
case 'rate_limited':
|
|
57
|
+
return 'Rate limited by the AI provider. The task will auto-retry with exponential backoff.';
|
|
58
|
+
case 'server_error':
|
|
59
|
+
return `OpenCode server returned an internal error (${this.status}). Check the OpenCode server logs for details.`;
|
|
60
|
+
case 'timeout':
|
|
61
|
+
return 'The request to OpenCode timed out. The server may be overloaded or the task may be too large.';
|
|
62
|
+
case 'invalid_response':
|
|
63
|
+
return 'Received an unexpected response from OpenCode. Check that the server version is compatible.';
|
|
64
|
+
default:
|
|
65
|
+
return 'An unexpected network error occurred communicating with the OpenCode server.';
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/** Classify a fetch/network error into an OpenCodeError with proper category. */
|
|
70
|
+
function classifyNetworkError(error, method, path, baseUrl) {
|
|
71
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
72
|
+
const lowerMsg = msg.toLowerCase();
|
|
73
|
+
let category;
|
|
74
|
+
let userMessage;
|
|
75
|
+
if (lowerMsg.includes('econnrefused') || lowerMsg.includes('connection refused')) {
|
|
76
|
+
category = 'connection_refused';
|
|
77
|
+
userMessage = `Cannot connect to OpenCode server at ${baseUrl} — connection refused. Is \`opencode serve\` running?`;
|
|
78
|
+
}
|
|
79
|
+
else if (lowerMsg.includes('enotfound') || lowerMsg.includes('getaddrinfo')) {
|
|
80
|
+
category = 'dns_resolution';
|
|
81
|
+
userMessage = `Cannot resolve hostname for OpenCode server (${baseUrl}). Check OPENCODE_BASE_URL for typos.`;
|
|
82
|
+
}
|
|
83
|
+
else if (lowerMsg.includes('etimedout') || lowerMsg.includes('timeout') || lowerMsg.includes('aborted')) {
|
|
84
|
+
category = 'timeout';
|
|
85
|
+
userMessage = `Request to OpenCode server timed out (${method} ${path}). The server may be overloaded.`;
|
|
86
|
+
}
|
|
87
|
+
else if (lowerMsg.includes('econnreset') || lowerMsg.includes('socket hang up')) {
|
|
88
|
+
// ECONNRESET means an established connection was dropped (load shedding, proxy timeout,
|
|
89
|
+
// server crash mid-request). This is NOT connection_refused (nothing listening).
|
|
90
|
+
// Use network_error so the polling loop applies the lenient 10-failure threshold,
|
|
91
|
+
// not the fast 3-failure kill path for connection_refused.
|
|
92
|
+
category = 'network_error';
|
|
93
|
+
userMessage = `Connection to OpenCode server was reset (${method} ${path}). The server may be overloaded or restarting.`;
|
|
94
|
+
}
|
|
95
|
+
else if (lowerMsg.includes('epipe') || lowerMsg.includes('broken pipe')) {
|
|
96
|
+
category = 'network_error';
|
|
97
|
+
userMessage = `Broken pipe communicating with OpenCode server (${method} ${path}). The connection was lost mid-request.`;
|
|
98
|
+
}
|
|
99
|
+
else if (lowerMsg.includes('cert') || lowerMsg.includes('ssl') || lowerMsg.includes('tls')) {
|
|
100
|
+
category = 'network_error';
|
|
101
|
+
userMessage = `TLS/SSL error connecting to OpenCode server at ${baseUrl}. Check the server URL scheme (http vs https).`;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
category = 'network_error';
|
|
105
|
+
userMessage = `Network error communicating with OpenCode server: ${msg}`;
|
|
106
|
+
}
|
|
107
|
+
return new OpenCodeError(userMessage, 0, method, path, '', category);
|
|
27
108
|
}
|
|
28
109
|
const MAX_RETRIES = 2;
|
|
29
110
|
const BASE_DELAY_MS = 500;
|
|
@@ -69,7 +150,8 @@ export class OpenCodeClient {
|
|
|
69
150
|
let lastError;
|
|
70
151
|
for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
|
|
71
152
|
if (attempt > 0) {
|
|
72
|
-
|
|
153
|
+
// Exponential backoff with jitter to avoid thundering herd
|
|
154
|
+
const delay = BASE_DELAY_MS * Math.pow(2, attempt - 1) + Math.random() * 200;
|
|
73
155
|
await new Promise((r) => setTimeout(r, delay));
|
|
74
156
|
}
|
|
75
157
|
try {
|
|
@@ -86,8 +168,50 @@ export class OpenCodeClient {
|
|
|
86
168
|
if (timeoutId)
|
|
87
169
|
clearTimeout(timeoutId);
|
|
88
170
|
if (!res.ok) {
|
|
89
|
-
const text = await res.text();
|
|
90
|
-
|
|
171
|
+
const text = await res.text().catch(() => '');
|
|
172
|
+
// Truncate response body to avoid leaking sensitive data or huge payloads
|
|
173
|
+
const truncatedBody = text.length > 500 ? text.slice(0, 500) + '...(truncated)' : text;
|
|
174
|
+
// Try to parse OpenCode's structured error format: {"name": "ErrorName", "data": {"message": "..."}}
|
|
175
|
+
let userMessage = `OpenCode ${method} ${path} failed (HTTP ${res.status})`;
|
|
176
|
+
let category;
|
|
177
|
+
try {
|
|
178
|
+
const parsed = JSON.parse(text);
|
|
179
|
+
if (parsed && typeof parsed === 'object' && parsed.name) {
|
|
180
|
+
const errorName = parsed.name;
|
|
181
|
+
const errorData = parsed.data;
|
|
182
|
+
const dataMessage = errorData?.message ? String(errorData.message) : '';
|
|
183
|
+
if (errorName === 'NotFoundError') {
|
|
184
|
+
category = 'not_found';
|
|
185
|
+
userMessage = dataMessage || `Resource not found: ${method} ${path}`;
|
|
186
|
+
}
|
|
187
|
+
else if (errorName === 'ProviderAuthError') {
|
|
188
|
+
category = 'auth_failed';
|
|
189
|
+
userMessage = dataMessage || `Provider authentication failed for ${errorData?.providerID || 'unknown provider'}`;
|
|
190
|
+
}
|
|
191
|
+
else if (errorName === 'ProviderModelNotFoundError') {
|
|
192
|
+
category = 'invalid_response';
|
|
193
|
+
const suggestions = errorData?.suggestions?.join(', ') || '';
|
|
194
|
+
userMessage = `Model "${errorData?.modelID || 'unknown'}" not found for provider "${errorData?.providerID || 'unknown'}"${suggestions ? `. Try: ${suggestions}` : ''}`;
|
|
195
|
+
}
|
|
196
|
+
else if (errorName === 'UnknownError') {
|
|
197
|
+
userMessage = dataMessage || `Unknown OpenCode error on ${method} ${path}`;
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
userMessage = `${errorName}: ${dataMessage || truncatedBody || '(no details)'}`;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
userMessage += `: ${truncatedBody || '(empty response)'}`;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
// Not JSON - use raw body
|
|
209
|
+
userMessage += `: ${truncatedBody || '(empty response)'}`;
|
|
210
|
+
}
|
|
211
|
+
const err = new OpenCodeError(userMessage, res.status, method, path, truncatedBody, category);
|
|
212
|
+
// Don't retry auth errors - they won't resolve by retrying
|
|
213
|
+
if (err.isAuth)
|
|
214
|
+
throw err;
|
|
91
215
|
if (err.isTransient && attempt < MAX_RETRIES) {
|
|
92
216
|
lastError = err;
|
|
93
217
|
continue;
|
|
@@ -102,19 +226,30 @@ export class OpenCodeClient {
|
|
|
102
226
|
if (!text || text.trim() === '')
|
|
103
227
|
return undefined;
|
|
104
228
|
if (contentType.includes('application/json')) {
|
|
105
|
-
|
|
229
|
+
try {
|
|
230
|
+
return JSON.parse(text);
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
throw new OpenCodeError(`OpenCode returned invalid JSON for ${method} ${path}: ${text.slice(0, 200)}`, res.status, method, path, text.slice(0, 500), 'invalid_response');
|
|
234
|
+
}
|
|
106
235
|
}
|
|
107
236
|
return text;
|
|
108
237
|
}
|
|
109
238
|
catch (e) {
|
|
110
239
|
if (e instanceof OpenCodeError)
|
|
111
240
|
throw e;
|
|
112
|
-
|
|
241
|
+
// Classify raw network errors (ECONNREFUSED, DNS failures, timeouts, etc.)
|
|
242
|
+
const classified = classifyNetworkError(e, method, path, this.baseUrl);
|
|
243
|
+
// Connection refused and DNS errors won't resolve by retrying
|
|
244
|
+
if (classified.category === 'connection_refused' || classified.category === 'dns_resolution') {
|
|
245
|
+
throw classified;
|
|
246
|
+
}
|
|
247
|
+
lastError = classified;
|
|
113
248
|
if (attempt >= MAX_RETRIES)
|
|
114
249
|
break;
|
|
115
250
|
}
|
|
116
251
|
}
|
|
117
|
-
throw lastError ?? new
|
|
252
|
+
throw lastError ?? new OpenCodeError(`OpenCode ${method} ${path} failed after ${MAX_RETRIES + 1} attempts`, 0, method, path, '', 'network_error');
|
|
118
253
|
}
|
|
119
254
|
async get(path, query, directory) {
|
|
120
255
|
return this.request('GET', path, { query, directory });
|
|
@@ -130,11 +265,48 @@ export class OpenCodeClient {
|
|
|
130
265
|
}
|
|
131
266
|
/**
|
|
132
267
|
* Check if the OpenCode server is healthy.
|
|
268
|
+
* Uses the /global/health endpoint which returns {healthy: true, version: "..."}.
|
|
133
269
|
*/
|
|
134
270
|
async isHealthy() {
|
|
271
|
+
try {
|
|
272
|
+
const res = await fetch(`${this.baseUrl}/global/health`, {
|
|
273
|
+
headers: this.headers(),
|
|
274
|
+
signal: AbortSignal.timeout(5000),
|
|
275
|
+
});
|
|
276
|
+
if (!res.ok) {
|
|
277
|
+
if (res.status === 401 || res.status === 403) {
|
|
278
|
+
console.error(`[opencode-client] Health check failed: authentication error (${res.status}). Check OPENCODE_SERVER_USERNAME/PASSWORD.`);
|
|
279
|
+
}
|
|
280
|
+
else if (res.status === 404) {
|
|
281
|
+
// Older OpenCode versions may not have /global/health — fall back to /session
|
|
282
|
+
return this.isHealthyFallback();
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
console.error(`[opencode-client] Health check failed: HTTP ${res.status}`);
|
|
286
|
+
}
|
|
287
|
+
return false;
|
|
288
|
+
}
|
|
289
|
+
return true;
|
|
290
|
+
}
|
|
291
|
+
catch (err) {
|
|
292
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
293
|
+
if (msg.includes('ECONNREFUSED')) {
|
|
294
|
+
console.error(`[opencode-client] Health check failed: connection refused at ${this.baseUrl}. Is \`opencode serve\` running?`);
|
|
295
|
+
}
|
|
296
|
+
else if (msg.includes('ENOTFOUND')) {
|
|
297
|
+
console.error(`[opencode-client] Health check failed: cannot resolve hostname. Check OPENCODE_BASE_URL.`);
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
console.error(`[opencode-client] Health check failed: ${msg}`);
|
|
301
|
+
}
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
/** Fallback health check for older OpenCode versions without /global/health. */
|
|
306
|
+
async isHealthyFallback() {
|
|
135
307
|
try {
|
|
136
308
|
const res = await fetch(`${this.baseUrl}/session`, {
|
|
137
|
-
headers:
|
|
309
|
+
headers: this.headers(),
|
|
138
310
|
signal: AbortSignal.timeout(5000),
|
|
139
311
|
});
|
|
140
312
|
return res.ok;
|
|
@@ -143,5 +315,54 @@ export class OpenCodeClient {
|
|
|
143
315
|
return false;
|
|
144
316
|
}
|
|
145
317
|
}
|
|
318
|
+
/**
|
|
319
|
+
* Get a diagnostic summary of connection state for error messages.
|
|
320
|
+
*/
|
|
321
|
+
async diagnose() {
|
|
322
|
+
try {
|
|
323
|
+
const res = await fetch(`${this.baseUrl}/global/health`, {
|
|
324
|
+
headers: this.headers(),
|
|
325
|
+
signal: AbortSignal.timeout(3000),
|
|
326
|
+
});
|
|
327
|
+
if (res.ok) {
|
|
328
|
+
try {
|
|
329
|
+
const data = await res.json();
|
|
330
|
+
const version = data?.version ? ` (v${data.version})` : '';
|
|
331
|
+
return `OpenCode server is reachable and healthy${version}`;
|
|
332
|
+
}
|
|
333
|
+
catch {
|
|
334
|
+
return 'OpenCode server is reachable and healthy';
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
if (res.status === 401)
|
|
338
|
+
return 'OpenCode server is reachable but authentication failed (401). Check OPENCODE_SERVER_USERNAME/PASSWORD.';
|
|
339
|
+
if (res.status === 403)
|
|
340
|
+
return 'OpenCode server is reachable but access is forbidden (403). Check credentials.';
|
|
341
|
+
if (res.status === 404) {
|
|
342
|
+
// Try fallback for older versions
|
|
343
|
+
try {
|
|
344
|
+
const fallbackRes = await fetch(`${this.baseUrl}/session`, {
|
|
345
|
+
headers: this.headers(),
|
|
346
|
+
signal: AbortSignal.timeout(3000),
|
|
347
|
+
});
|
|
348
|
+
if (fallbackRes.ok)
|
|
349
|
+
return 'OpenCode server is reachable (legacy version without /global/health endpoint)';
|
|
350
|
+
return `OpenCode server responded with HTTP ${fallbackRes.status}`;
|
|
351
|
+
}
|
|
352
|
+
catch {
|
|
353
|
+
return 'OpenCode server health endpoint not found. Check server version.';
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
return `OpenCode server responded with HTTP ${res.status}`;
|
|
357
|
+
}
|
|
358
|
+
catch (err) {
|
|
359
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
360
|
+
if (msg.includes('ECONNREFUSED'))
|
|
361
|
+
return `OpenCode server is not running at ${this.baseUrl}. Start it with \`opencode serve\`.`;
|
|
362
|
+
if (msg.includes('ENOTFOUND'))
|
|
363
|
+
return `Cannot resolve hostname for ${this.baseUrl}. Check OPENCODE_BASE_URL.`;
|
|
364
|
+
return `Cannot reach OpenCode server: ${msg}`;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
146
367
|
}
|
|
147
368
|
//# sourceMappingURL=opencode-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode-client.js","sourceRoot":"","sources":["../../src/services/opencode-client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"opencode-client.js","sourceRoot":"","sources":["../../src/services/opencode-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* - Get results
|
|
11
11
|
*/
|
|
12
12
|
import { type SpawnOptions, type TaskState } from '../types.js';
|
|
13
|
-
import type
|
|
13
|
+
import { type OpenCodeClient } from './opencode-client.js';
|
|
14
14
|
/**
|
|
15
15
|
* Initialize the spawner with the OpenCode client instance.
|
|
16
16
|
*/
|
|
@@ -24,7 +24,7 @@ export declare function spawnOpenCodeTask(options: SpawnOptions): Promise<string
|
|
|
24
24
|
*/
|
|
25
25
|
export declare function executeWaitingTask(task: TaskState): Promise<void>;
|
|
26
26
|
/**
|
|
27
|
-
* Cancel a running task.
|
|
27
|
+
* Cancel a running task. Aborts polling and tells OpenCode to stop the session.
|
|
28
28
|
*/
|
|
29
29
|
export declare function cancelOpenCodeTask(taskId: string): Promise<boolean>;
|
|
30
30
|
export { cancelOpenCodeTask as cancelTask };
|
|
@@ -40,6 +40,10 @@ export declare function sendMessageToSession(taskId: string, message: string): P
|
|
|
40
40
|
* Check if the OpenCode server is healthy.
|
|
41
41
|
*/
|
|
42
42
|
export declare function checkOpenCodeAvailable(): Promise<boolean>;
|
|
43
|
+
/**
|
|
44
|
+
* Get a diagnostic summary for error messages.
|
|
45
|
+
*/
|
|
46
|
+
export declare function diagnoseConnection(): Promise<string>;
|
|
43
47
|
/**
|
|
44
48
|
* Shutdown the spawner - cancel all active pollers.
|
|
45
49
|
*/
|
|
@@ -50,6 +54,8 @@ export declare function shutdownSpawner(): void;
|
|
|
50
54
|
export declare function getSpawnerStats(): {
|
|
51
55
|
activeTasks: number;
|
|
52
56
|
activePollers: number;
|
|
57
|
+
queuedTasks: number;
|
|
58
|
+
maxConcurrent: number;
|
|
53
59
|
clientInitialized: boolean;
|
|
54
60
|
baseUrl: string;
|
|
55
61
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode-spawner.d.ts","sourceRoot":"","sources":["../../src/services/opencode-spawner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,OAAO,EAAc,KAAK,YAAY,EAAE,KAAK,SAAS,EAAoB,MAAM,aAAa,CAAC;AAC9F,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"opencode-spawner.d.ts","sourceRoot":"","sources":["../../src/services/opencode-spawner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,OAAO,EAAc,KAAK,YAAY,EAAE,KAAK,SAAS,EAAoB,MAAM,aAAa,CAAC;AAC9F,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAoD1E;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAExD;AAmBD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CA4C9E;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCvE;AAofD;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA8BzE;AAED,OAAO,EAAE,kBAAkB,IAAI,UAAU,EAAE,CAAC;AAE5C;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAyC5I;AAED;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC,CAG/D;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAG1D;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAMtC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB,CASA"}
|