sylas-opencode-runner 0.2.21
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/dist/OpenCodeRunner.d.ts +88 -0
- package/dist/OpenCodeRunner.d.ts.map +1 -0
- package/dist/OpenCodeRunner.js +394 -0
- package/dist/OpenCodeRunner.js.map +1 -0
- package/dist/adapters.d.ts +245 -0
- package/dist/adapters.d.ts.map +1 -0
- package/dist/adapters.js +544 -0
- package/dist/adapters.js.map +1 -0
- package/dist/formatter.d.ts +28 -0
- package/dist/formatter.d.ts.map +1 -0
- package/dist/formatter.js +251 -0
- package/dist/formatter.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/portAllocator.d.ts +117 -0
- package/dist/portAllocator.d.ts.map +1 -0
- package/dist/portAllocator.js +146 -0
- package/dist/portAllocator.js.map +1 -0
- package/dist/types.d.ts +346 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +48 -0
- package/dist/types.js.map +1 -0
- package/package.json +30 -0
package/dist/adapters.js
ADDED
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode Event Adapters
|
|
3
|
+
*
|
|
4
|
+
* Converts OpenCode SSE events to SDKMessage format for compatibility
|
|
5
|
+
* with the Sylas infrastructure. Follows the adapter pattern used in gemini-runner.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
import crypto from "node:crypto";
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// CLI Event Type Guards
|
|
12
|
+
// ============================================================================
|
|
13
|
+
export function isCLIEvent(event) {
|
|
14
|
+
if (typeof event !== "object" || event === null)
|
|
15
|
+
return false;
|
|
16
|
+
const e = event;
|
|
17
|
+
return (typeof e.sessionID === "string" &&
|
|
18
|
+
typeof e.type === "string" &&
|
|
19
|
+
!e.type.includes("."));
|
|
20
|
+
}
|
|
21
|
+
export function isCLIStepStart(event) {
|
|
22
|
+
return event.type === "step_start";
|
|
23
|
+
}
|
|
24
|
+
export function isCLIText(event) {
|
|
25
|
+
return event.type === "text";
|
|
26
|
+
}
|
|
27
|
+
export function isCLIToolUse(event) {
|
|
28
|
+
return event.type === "tool_use";
|
|
29
|
+
}
|
|
30
|
+
export function isCLIStepFinish(event) {
|
|
31
|
+
return event.type === "step_finish";
|
|
32
|
+
}
|
|
33
|
+
// ============================================================================
|
|
34
|
+
// Helper Functions
|
|
35
|
+
// ============================================================================
|
|
36
|
+
/**
|
|
37
|
+
* Create a minimal BetaMessage for assistant responses.
|
|
38
|
+
*
|
|
39
|
+
* Since we're adapting from OpenCode to Claude SDK format, we create
|
|
40
|
+
* a minimal valid BetaMessage structure with placeholder values for fields
|
|
41
|
+
* that OpenCode doesn't provide (stop_reason, usage, etc.).
|
|
42
|
+
*/
|
|
43
|
+
function createBetaMessage(content, messageId = crypto.randomUUID()) {
|
|
44
|
+
// Convert string to content blocks, or use array directly
|
|
45
|
+
const contentBlocks = (typeof content === "string"
|
|
46
|
+
? [{ type: "text", text: content }]
|
|
47
|
+
: content);
|
|
48
|
+
return {
|
|
49
|
+
id: messageId,
|
|
50
|
+
type: "message",
|
|
51
|
+
role: "assistant",
|
|
52
|
+
content: contentBlocks,
|
|
53
|
+
model: "opencode",
|
|
54
|
+
stop_reason: null,
|
|
55
|
+
stop_sequence: null,
|
|
56
|
+
usage: {
|
|
57
|
+
input_tokens: 0,
|
|
58
|
+
output_tokens: 0,
|
|
59
|
+
cache_creation_input_tokens: 0,
|
|
60
|
+
cache_read_input_tokens: 0,
|
|
61
|
+
cache_creation: null,
|
|
62
|
+
server_tool_use: null,
|
|
63
|
+
service_tier: null,
|
|
64
|
+
inference_geo: "",
|
|
65
|
+
iterations: [],
|
|
66
|
+
},
|
|
67
|
+
container: null,
|
|
68
|
+
context_management: null,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Create token usage object from OpenCode token metrics.
|
|
73
|
+
*/
|
|
74
|
+
function createUsage(tokens) {
|
|
75
|
+
return {
|
|
76
|
+
input_tokens: tokens?.input || 0,
|
|
77
|
+
output_tokens: tokens?.output || 0,
|
|
78
|
+
cache_creation_input_tokens: tokens?.cache?.write || 0,
|
|
79
|
+
cache_read_input_tokens: tokens?.cache?.read || 0,
|
|
80
|
+
cache_creation: {
|
|
81
|
+
ephemeral_1h_input_tokens: 0,
|
|
82
|
+
ephemeral_5m_input_tokens: 0,
|
|
83
|
+
},
|
|
84
|
+
server_tool_use: {
|
|
85
|
+
web_fetch_requests: 0,
|
|
86
|
+
web_search_requests: 0,
|
|
87
|
+
},
|
|
88
|
+
service_tier: "standard",
|
|
89
|
+
inference_geo: "",
|
|
90
|
+
iterations: [],
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
// ============================================================================
|
|
94
|
+
// Event Type Guards
|
|
95
|
+
// ============================================================================
|
|
96
|
+
/**
|
|
97
|
+
* Check if event is a message part update.
|
|
98
|
+
*/
|
|
99
|
+
export function isMessagePartUpdated(event) {
|
|
100
|
+
return event.type === "message.part.updated";
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Check if event is a message update.
|
|
104
|
+
*/
|
|
105
|
+
export function isMessageUpdated(event) {
|
|
106
|
+
return event.type === "message.updated";
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Check if event is a session idle event.
|
|
110
|
+
*/
|
|
111
|
+
export function isSessionIdle(event) {
|
|
112
|
+
return event.type === "session.idle";
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Check if event is a session error event.
|
|
116
|
+
*/
|
|
117
|
+
export function isSessionError(event) {
|
|
118
|
+
return event.type === "session.error";
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Check if event is a session status event.
|
|
122
|
+
*/
|
|
123
|
+
export function isSessionStatus(event) {
|
|
124
|
+
return event.type === "session.status";
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Check if a part is a text part.
|
|
128
|
+
*/
|
|
129
|
+
export function isTextPart(part) {
|
|
130
|
+
return part.type === "text";
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Check if a part is a tool part.
|
|
134
|
+
*/
|
|
135
|
+
export function isToolPart(part) {
|
|
136
|
+
return part.type === "tool";
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Check if tool state is completed.
|
|
140
|
+
*/
|
|
141
|
+
export function isToolStateCompleted(state) {
|
|
142
|
+
return state.status === "completed";
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Check if tool state is error.
|
|
146
|
+
*/
|
|
147
|
+
export function isToolStateError(state) {
|
|
148
|
+
return state.status === "error";
|
|
149
|
+
}
|
|
150
|
+
// ============================================================================
|
|
151
|
+
// Part Conversion Functions
|
|
152
|
+
// ============================================================================
|
|
153
|
+
/**
|
|
154
|
+
* Convert an OpenCode TextPart to SDK text content block.
|
|
155
|
+
*/
|
|
156
|
+
export function textPartToContentBlock(part) {
|
|
157
|
+
return {
|
|
158
|
+
type: "text",
|
|
159
|
+
text: part.text,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Convert an OpenCode ToolPart to SDK tool_use content block.
|
|
164
|
+
*
|
|
165
|
+
* Note: Only tool parts in "running" or later states have meaningful data.
|
|
166
|
+
* "pending" state may have incomplete input (raw JSON string).
|
|
167
|
+
*/
|
|
168
|
+
export function toolPartToToolUseBlock(part) {
|
|
169
|
+
return {
|
|
170
|
+
type: "tool_use",
|
|
171
|
+
id: part.callID,
|
|
172
|
+
name: part.tool,
|
|
173
|
+
input: part.state.input || {},
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Convert a completed ToolPart to SDK tool_result content block.
|
|
178
|
+
*
|
|
179
|
+
* This is used when we need to emit the tool result as a user message.
|
|
180
|
+
*/
|
|
181
|
+
export function toolPartToToolResultBlock(part) {
|
|
182
|
+
if (isToolStateCompleted(part.state)) {
|
|
183
|
+
return {
|
|
184
|
+
type: "tool_result",
|
|
185
|
+
tool_use_id: part.callID,
|
|
186
|
+
content: part.state.output,
|
|
187
|
+
is_error: false,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
else if (isToolStateError(part.state)) {
|
|
191
|
+
return {
|
|
192
|
+
type: "tool_result",
|
|
193
|
+
tool_use_id: part.callID,
|
|
194
|
+
content: part.state.error,
|
|
195
|
+
is_error: true,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
// For pending/running states, return empty result
|
|
199
|
+
return {
|
|
200
|
+
type: "tool_result",
|
|
201
|
+
tool_use_id: part.callID,
|
|
202
|
+
content: "",
|
|
203
|
+
is_error: false,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
// ============================================================================
|
|
207
|
+
// Message Conversion Functions
|
|
208
|
+
// ============================================================================
|
|
209
|
+
/**
|
|
210
|
+
* Convert an OpenCode message part update event to SDK message.
|
|
211
|
+
*
|
|
212
|
+
* This handles individual part updates as they stream in.
|
|
213
|
+
* The caller is responsible for accumulating parts into complete messages.
|
|
214
|
+
*
|
|
215
|
+
* @param event - The message.part.updated event
|
|
216
|
+
* @param sessionId - Current session ID
|
|
217
|
+
* @returns SDKMessage or null if part type doesn't map to a message
|
|
218
|
+
*/
|
|
219
|
+
export function partEventToSDKMessage(event, sessionId) {
|
|
220
|
+
const part = event.properties.part;
|
|
221
|
+
const delta = event.properties.delta;
|
|
222
|
+
if (isTextPart(part)) {
|
|
223
|
+
// Text part - emit as assistant message
|
|
224
|
+
const text = delta !== undefined ? delta : part.text;
|
|
225
|
+
const assistantMessage = {
|
|
226
|
+
type: "assistant",
|
|
227
|
+
message: createBetaMessage([{ type: "text", text }], part.messageID),
|
|
228
|
+
parent_tool_use_id: null,
|
|
229
|
+
uuid: crypto.randomUUID(),
|
|
230
|
+
session_id: sessionId || "pending",
|
|
231
|
+
};
|
|
232
|
+
return assistantMessage;
|
|
233
|
+
}
|
|
234
|
+
if (isToolPart(part)) {
|
|
235
|
+
// Tool part - handle based on state
|
|
236
|
+
if (part.state.status === "running") {
|
|
237
|
+
// Tool invocation - emit as assistant message with tool_use
|
|
238
|
+
const assistantMessage = {
|
|
239
|
+
type: "assistant",
|
|
240
|
+
message: createBetaMessage([toolPartToToolUseBlock(part)], part.messageID),
|
|
241
|
+
parent_tool_use_id: null,
|
|
242
|
+
uuid: crypto.randomUUID(),
|
|
243
|
+
session_id: sessionId || "pending",
|
|
244
|
+
};
|
|
245
|
+
return assistantMessage;
|
|
246
|
+
}
|
|
247
|
+
if (part.state.status === "completed" || part.state.status === "error") {
|
|
248
|
+
// Tool result - emit as user message with tool_result
|
|
249
|
+
const toolResultMessage = {
|
|
250
|
+
type: "user",
|
|
251
|
+
message: {
|
|
252
|
+
role: "user",
|
|
253
|
+
content: [toolPartToToolResultBlock(part)],
|
|
254
|
+
},
|
|
255
|
+
parent_tool_use_id: null,
|
|
256
|
+
session_id: sessionId || "pending",
|
|
257
|
+
};
|
|
258
|
+
return toolResultMessage;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
// Other part types (file, snapshot, patch, etc.) - not mapped
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Convert an OpenCode message update event to SDK message.
|
|
266
|
+
*
|
|
267
|
+
* This handles complete message updates (not individual parts).
|
|
268
|
+
*
|
|
269
|
+
* @param event - The message.updated event
|
|
270
|
+
* @param sessionId - Current session ID
|
|
271
|
+
* @returns SDKMessage or null
|
|
272
|
+
*/
|
|
273
|
+
export function messageEventToSDKMessage(event, sessionId) {
|
|
274
|
+
const message = event.properties.info;
|
|
275
|
+
if (message.role === "user") {
|
|
276
|
+
// User message - rarely needed but included for completeness
|
|
277
|
+
const userMsg = message;
|
|
278
|
+
const userMessage = {
|
|
279
|
+
type: "user",
|
|
280
|
+
message: {
|
|
281
|
+
role: "user",
|
|
282
|
+
content: userMsg.summary?.title || "User message",
|
|
283
|
+
},
|
|
284
|
+
parent_tool_use_id: null,
|
|
285
|
+
session_id: sessionId || "pending",
|
|
286
|
+
};
|
|
287
|
+
return userMessage;
|
|
288
|
+
}
|
|
289
|
+
// Assistant message - this is typically the completion signal
|
|
290
|
+
// We use this to check for completion state via time.completed
|
|
291
|
+
return null;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Synthesize an SDKResultMessage from completion state.
|
|
295
|
+
*
|
|
296
|
+
* OpenCode doesn't have a dedicated result message - we synthesize from:
|
|
297
|
+
* - AssistantMessage.finish === "stop"
|
|
298
|
+
* - AssistantMessage.time.completed set
|
|
299
|
+
* - session.idle event
|
|
300
|
+
*
|
|
301
|
+
* @param sessionId - Current session ID
|
|
302
|
+
* @param lastAssistantMessage - Last assistant message for content extraction
|
|
303
|
+
* @param assistantInfo - Optional AssistantMessage info for token metrics
|
|
304
|
+
* @returns SDKResultMessage
|
|
305
|
+
*/
|
|
306
|
+
export function synthesizeResultMessage(sessionId, lastAssistantMessage, assistantInfo) {
|
|
307
|
+
// Extract result content from last assistant message
|
|
308
|
+
let resultContent = "Session completed successfully";
|
|
309
|
+
if (lastAssistantMessage?.message?.content) {
|
|
310
|
+
const content = lastAssistantMessage.message.content;
|
|
311
|
+
if (Array.isArray(content) && content.length > 0) {
|
|
312
|
+
const textBlock = content.find((block) => block.type === "text");
|
|
313
|
+
if (textBlock && "text" in textBlock) {
|
|
314
|
+
resultContent = textBlock.text;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
// Calculate duration if we have timing info
|
|
319
|
+
let durationMs = 0;
|
|
320
|
+
if (assistantInfo?.time?.created && assistantInfo?.time?.completed) {
|
|
321
|
+
durationMs = assistantInfo.time.completed - assistantInfo.time.created;
|
|
322
|
+
}
|
|
323
|
+
return {
|
|
324
|
+
type: "result",
|
|
325
|
+
subtype: "success",
|
|
326
|
+
duration_ms: durationMs,
|
|
327
|
+
duration_api_ms: 0,
|
|
328
|
+
is_error: false,
|
|
329
|
+
num_turns: 0, // OpenCode doesn't track this directly
|
|
330
|
+
result: resultContent,
|
|
331
|
+
stop_reason: "end_turn",
|
|
332
|
+
total_cost_usd: assistantInfo?.cost || 0,
|
|
333
|
+
usage: createUsage(assistantInfo?.tokens),
|
|
334
|
+
modelUsage: {},
|
|
335
|
+
permission_denials: [],
|
|
336
|
+
uuid: crypto.randomUUID(),
|
|
337
|
+
session_id: sessionId || "pending",
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Convert a session error event to SDKResultMessage.
|
|
342
|
+
*
|
|
343
|
+
* @param event - The session.error event
|
|
344
|
+
* @param sessionId - Current session ID
|
|
345
|
+
* @returns SDKResultMessage with error info
|
|
346
|
+
*/
|
|
347
|
+
export function errorEventToSDKMessage(event, sessionId) {
|
|
348
|
+
const error = event.properties.error;
|
|
349
|
+
// Format error message based on error type
|
|
350
|
+
let errorMessage = "Unknown error";
|
|
351
|
+
if (error) {
|
|
352
|
+
// Extract message from error data if available
|
|
353
|
+
const errorData = error.data;
|
|
354
|
+
errorMessage = errorData?.message || error.name;
|
|
355
|
+
if (errorData?.statusCode !== undefined) {
|
|
356
|
+
errorMessage += ` (status: ${errorData.statusCode})`;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
return {
|
|
360
|
+
type: "result",
|
|
361
|
+
subtype: "error_during_execution",
|
|
362
|
+
duration_ms: 0,
|
|
363
|
+
duration_api_ms: 0,
|
|
364
|
+
is_error: true,
|
|
365
|
+
num_turns: 0,
|
|
366
|
+
errors: [errorMessage],
|
|
367
|
+
stop_reason: null,
|
|
368
|
+
total_cost_usd: 0,
|
|
369
|
+
usage: createUsage(),
|
|
370
|
+
modelUsage: {},
|
|
371
|
+
permission_denials: [],
|
|
372
|
+
uuid: crypto.randomUUID(),
|
|
373
|
+
session_id: sessionId || "pending",
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
// ============================================================================
|
|
377
|
+
// CLI Event Conversion Functions
|
|
378
|
+
// ============================================================================
|
|
379
|
+
function cliTextToSDKMessage(event, sessionId) {
|
|
380
|
+
const text = event.content || event.part?.text || "";
|
|
381
|
+
if (!text)
|
|
382
|
+
return null;
|
|
383
|
+
return {
|
|
384
|
+
type: "assistant",
|
|
385
|
+
message: createBetaMessage([{ type: "text", text }], event.part?.messageID || crypto.randomUUID()),
|
|
386
|
+
parent_tool_use_id: null,
|
|
387
|
+
uuid: crypto.randomUUID(),
|
|
388
|
+
session_id: sessionId || "pending",
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
function cliToolUseToSDKMessage(event, sessionId) {
|
|
392
|
+
const part = event.part;
|
|
393
|
+
if (!part)
|
|
394
|
+
return null;
|
|
395
|
+
const status = part.state?.status || "running";
|
|
396
|
+
const toolId = part.callID || part.id || crypto.randomUUID();
|
|
397
|
+
if (status === "running" || status === "pending") {
|
|
398
|
+
const assistantMessage = {
|
|
399
|
+
type: "assistant",
|
|
400
|
+
message: createBetaMessage([
|
|
401
|
+
{
|
|
402
|
+
type: "tool_use",
|
|
403
|
+
id: toolId,
|
|
404
|
+
name: part.tool || "unknown_tool",
|
|
405
|
+
input: part.state?.input || {},
|
|
406
|
+
},
|
|
407
|
+
], part.messageID || crypto.randomUUID()),
|
|
408
|
+
parent_tool_use_id: null,
|
|
409
|
+
uuid: crypto.randomUUID(),
|
|
410
|
+
session_id: sessionId || "pending",
|
|
411
|
+
};
|
|
412
|
+
return assistantMessage;
|
|
413
|
+
}
|
|
414
|
+
if (status === "completed" || status === "error") {
|
|
415
|
+
const toolResultMessage = {
|
|
416
|
+
type: "user",
|
|
417
|
+
message: {
|
|
418
|
+
role: "user",
|
|
419
|
+
content: [
|
|
420
|
+
{
|
|
421
|
+
type: "tool_result",
|
|
422
|
+
tool_use_id: toolId,
|
|
423
|
+
content: status === "completed"
|
|
424
|
+
? part.state?.output || ""
|
|
425
|
+
: part.state?.error || "Tool error",
|
|
426
|
+
is_error: status === "error",
|
|
427
|
+
},
|
|
428
|
+
],
|
|
429
|
+
},
|
|
430
|
+
parent_tool_use_id: null,
|
|
431
|
+
session_id: sessionId || "pending",
|
|
432
|
+
};
|
|
433
|
+
return toolResultMessage;
|
|
434
|
+
}
|
|
435
|
+
return null;
|
|
436
|
+
}
|
|
437
|
+
// ============================================================================
|
|
438
|
+
// Main Adapter Function
|
|
439
|
+
// ============================================================================
|
|
440
|
+
/**
|
|
441
|
+
* Convert an OpenCode event to sylas-core SDKMessage format.
|
|
442
|
+
*
|
|
443
|
+
* This adapter maps OpenCode's SSE events to the sylas-core SDKMessage format,
|
|
444
|
+
* allowing OpenCodeRunner to implement the IAgentRunner interface.
|
|
445
|
+
*
|
|
446
|
+
* NOTE: This adapter is stateless for most events. For complete message
|
|
447
|
+
* accumulation, the caller (OpenCodeRunner) should track parts and build
|
|
448
|
+
* complete messages.
|
|
449
|
+
*
|
|
450
|
+
* @param event - OpenCode SSE event
|
|
451
|
+
* @param sessionId - Current session ID (may be null initially)
|
|
452
|
+
* @param lastAssistantMessage - Last assistant message for result coercion (optional)
|
|
453
|
+
* @param lastAssistantInfo - Last assistant message info for metrics (optional)
|
|
454
|
+
* @returns SDKMessage or null if event type doesn't map to a message
|
|
455
|
+
*/
|
|
456
|
+
export function openCodeEventToSDKMessage(event, sessionId, lastAssistantMessage, lastAssistantInfo) {
|
|
457
|
+
// CLI format: events from `opencode run --format json`
|
|
458
|
+
// Detected by root-level sessionID + non-dotted type string
|
|
459
|
+
if (isCLIEvent(event)) {
|
|
460
|
+
const cliEvent = event;
|
|
461
|
+
if (isCLIText(cliEvent)) {
|
|
462
|
+
return cliTextToSDKMessage(cliEvent, sessionId);
|
|
463
|
+
}
|
|
464
|
+
if (isCLIToolUse(cliEvent)) {
|
|
465
|
+
return cliToolUseToSDKMessage(cliEvent, sessionId);
|
|
466
|
+
}
|
|
467
|
+
// step_start / step_finish: no SDK message needed
|
|
468
|
+
// Result is synthesized at process exit in OpenCodeRunner
|
|
469
|
+
return null;
|
|
470
|
+
}
|
|
471
|
+
// SDK SSE format: events from OpenCode SDK server
|
|
472
|
+
if (isMessagePartUpdated(event)) {
|
|
473
|
+
return partEventToSDKMessage(event, sessionId);
|
|
474
|
+
}
|
|
475
|
+
if (isMessageUpdated(event)) {
|
|
476
|
+
const message = event.properties.info;
|
|
477
|
+
if (message.role === "assistant") {
|
|
478
|
+
const assistantMsg = message;
|
|
479
|
+
if (assistantMsg.finish === "stop" && assistantMsg.time?.completed) {
|
|
480
|
+
// Defer result to session.idle
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
return messageEventToSDKMessage(event, sessionId);
|
|
484
|
+
}
|
|
485
|
+
if (isSessionIdle(event)) {
|
|
486
|
+
return synthesizeResultMessage(sessionId, lastAssistantMessage, lastAssistantInfo);
|
|
487
|
+
}
|
|
488
|
+
if (isSessionError(event)) {
|
|
489
|
+
return errorEventToSDKMessage(event, sessionId);
|
|
490
|
+
}
|
|
491
|
+
return null;
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
494
|
+
* Extract session ID from an OpenCode event.
|
|
495
|
+
*
|
|
496
|
+
* @param event - OpenCode event
|
|
497
|
+
* @returns Session ID if available, null otherwise
|
|
498
|
+
*/
|
|
499
|
+
export function extractSessionId(event) {
|
|
500
|
+
// CLI format: all CLI events have sessionID at root level
|
|
501
|
+
const anyEvent = event;
|
|
502
|
+
if (typeof anyEvent.sessionID === "string" && anyEvent.sessionID) {
|
|
503
|
+
return anyEvent.sessionID;
|
|
504
|
+
}
|
|
505
|
+
// SDK SSE format
|
|
506
|
+
if (isMessagePartUpdated(event)) {
|
|
507
|
+
return event.properties.part.sessionID;
|
|
508
|
+
}
|
|
509
|
+
if (isMessageUpdated(event)) {
|
|
510
|
+
return event.properties.info.sessionID;
|
|
511
|
+
}
|
|
512
|
+
if (isSessionIdle(event)) {
|
|
513
|
+
return event.properties.sessionID;
|
|
514
|
+
}
|
|
515
|
+
if (isSessionError(event)) {
|
|
516
|
+
return event.properties.sessionID || null;
|
|
517
|
+
}
|
|
518
|
+
if (isSessionStatus(event)) {
|
|
519
|
+
return event.properties.sessionID;
|
|
520
|
+
}
|
|
521
|
+
return null;
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* Create a Sylas Core SDK UserMessage from a plain string prompt.
|
|
525
|
+
*
|
|
526
|
+
* Helper function to create properly formatted SDKUserMessage objects
|
|
527
|
+
* for sending to OpenCode.
|
|
528
|
+
*
|
|
529
|
+
* @param content - The prompt text
|
|
530
|
+
* @param sessionId - Current session ID (may be null for initial message)
|
|
531
|
+
* @returns Formatted SDKUserMessage
|
|
532
|
+
*/
|
|
533
|
+
export function createUserMessage(content, sessionId) {
|
|
534
|
+
return {
|
|
535
|
+
type: "user",
|
|
536
|
+
message: {
|
|
537
|
+
role: "user",
|
|
538
|
+
content: content,
|
|
539
|
+
},
|
|
540
|
+
parent_tool_use_id: null,
|
|
541
|
+
session_id: sessionId || "pending",
|
|
542
|
+
};
|
|
543
|
+
}
|
|
544
|
+
//# sourceMappingURL=adapters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapters.js","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode Message Formatter
|
|
3
|
+
*
|
|
4
|
+
* Implements message formatting for OpenCode tool messages.
|
|
5
|
+
* Converts tool use/result messages into human-readable content for Linear.
|
|
6
|
+
*
|
|
7
|
+
* OpenCode tool names follow a pattern similar to Claude's tools:
|
|
8
|
+
* - read: Read file contents
|
|
9
|
+
* - write: Write content to a file
|
|
10
|
+
* - edit: Edit file contents
|
|
11
|
+
* - bash: Execute shell commands
|
|
12
|
+
* - glob: Find files matching patterns
|
|
13
|
+
* - grep: Search file contents
|
|
14
|
+
* - todowrite: Update task list
|
|
15
|
+
*
|
|
16
|
+
* @packageDocumentation
|
|
17
|
+
*/
|
|
18
|
+
import type { IMessageFormatter } from "sylas-core";
|
|
19
|
+
type ToolInput = Record<string, unknown>;
|
|
20
|
+
export declare class OpenCodeMessageFormatter implements IMessageFormatter {
|
|
21
|
+
formatTaskParameter(toolName: string, toolInput: ToolInput): string;
|
|
22
|
+
formatTodoWriteParameter(jsonContent: string): string;
|
|
23
|
+
formatToolParameter(toolName: string, toolInput: ToolInput): string;
|
|
24
|
+
formatToolActionName(toolName: string, toolInput: ToolInput, isError: boolean): string;
|
|
25
|
+
formatToolResult(toolName: string, toolInput: ToolInput, result: string, isError: boolean): string;
|
|
26
|
+
}
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=formatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../src/formatter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAYzC,qBAAa,wBAAyB,YAAW,iBAAiB;IACjE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,MAAM;IAwCnE,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IA+BrD,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,MAAM;IAyEnE,oBAAoB,CACnB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,OAAO,GACd,MAAM;IAWT,gBAAgB,CACf,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,GACd,MAAM;CA+DT"}
|