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.
@@ -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"}