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,245 @@
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 type { AssistantMessage, Event, EventMessagePartUpdated, EventMessageUpdated, EventSessionError, EventSessionIdle, EventSessionStatus, Part, TextPart, ToolPart, ToolStateCompleted, ToolStateError } from "@opencode-ai/sdk";
10
+ import type { SDKAssistantMessage, SDKMessage, SDKResultMessage, SDKUserMessage } from "sylas-core";
11
+ /**
12
+ * Accumulated message state for building complete messages from parts.
13
+ */
14
+ export interface AccumulatedMessage {
15
+ messageId: string;
16
+ sessionId: string;
17
+ role: "user" | "assistant";
18
+ contentBlocks: Array<{
19
+ type: "text" | "tool_use" | "tool_result";
20
+ id?: string;
21
+ text?: string;
22
+ name?: string;
23
+ input?: Record<string, unknown>;
24
+ tool_use_id?: string;
25
+ content?: string;
26
+ is_error?: boolean;
27
+ }>;
28
+ tokenMetrics?: {
29
+ inputTokens: number;
30
+ outputTokens: number;
31
+ };
32
+ }
33
+ /**
34
+ * OpenCode event that we process - a subset of all Event types.
35
+ */
36
+ export type ProcessableEvent = EventMessagePartUpdated | EventMessageUpdated | EventSessionIdle | EventSessionError | EventSessionStatus;
37
+ /**
38
+ * CLI events are structurally different from SDK SSE events:
39
+ * SDK: { type: "message.part.updated", properties: { part: {...} } }
40
+ * CLI: { type: "text", sessionID: "ses_...", timestamp: 123, ... }
41
+ *
42
+ * The CLI outputs newline-delimited JSON with these event types:
43
+ * step_start, text, tool_use, step_finish
44
+ */
45
+ interface CLIEventBase {
46
+ type: string;
47
+ timestamp: number;
48
+ sessionID: string;
49
+ }
50
+ export interface CLIStepStartEvent extends CLIEventBase {
51
+ type: "step_start";
52
+ part?: {
53
+ id?: string;
54
+ sessionID?: string;
55
+ messageID?: string;
56
+ };
57
+ }
58
+ export interface CLITextEvent extends CLIEventBase {
59
+ type: "text";
60
+ content?: string;
61
+ part?: {
62
+ id?: string;
63
+ sessionID?: string;
64
+ messageID?: string;
65
+ type?: string;
66
+ text?: string;
67
+ };
68
+ }
69
+ export interface CLIToolUseEvent extends CLIEventBase {
70
+ type: "tool_use";
71
+ part?: {
72
+ id?: string;
73
+ sessionID?: string;
74
+ messageID?: string;
75
+ type?: string;
76
+ tool?: string;
77
+ callID?: string;
78
+ state?: {
79
+ status?: string;
80
+ input?: Record<string, unknown>;
81
+ output?: string;
82
+ error?: string;
83
+ };
84
+ };
85
+ }
86
+ export interface CLIStepFinishEvent extends CLIEventBase {
87
+ type: "step_finish";
88
+ part?: {
89
+ id?: string;
90
+ sessionID?: string;
91
+ messageID?: string;
92
+ };
93
+ }
94
+ export type CLIEvent = CLIStepStartEvent | CLITextEvent | CLIToolUseEvent | CLIStepFinishEvent;
95
+ export declare function isCLIEvent(event: unknown): event is CLIEvent;
96
+ export declare function isCLIStepStart(event: CLIEvent): event is CLIStepStartEvent;
97
+ export declare function isCLIText(event: CLIEvent): event is CLITextEvent;
98
+ export declare function isCLIToolUse(event: CLIEvent): event is CLIToolUseEvent;
99
+ export declare function isCLIStepFinish(event: CLIEvent): event is CLIStepFinishEvent;
100
+ /**
101
+ * Check if event is a message part update.
102
+ */
103
+ export declare function isMessagePartUpdated(event: Event): event is EventMessagePartUpdated;
104
+ /**
105
+ * Check if event is a message update.
106
+ */
107
+ export declare function isMessageUpdated(event: Event): event is EventMessageUpdated;
108
+ /**
109
+ * Check if event is a session idle event.
110
+ */
111
+ export declare function isSessionIdle(event: Event): event is EventSessionIdle;
112
+ /**
113
+ * Check if event is a session error event.
114
+ */
115
+ export declare function isSessionError(event: Event): event is EventSessionError;
116
+ /**
117
+ * Check if event is a session status event.
118
+ */
119
+ export declare function isSessionStatus(event: Event): event is EventSessionStatus;
120
+ /**
121
+ * Check if a part is a text part.
122
+ */
123
+ export declare function isTextPart(part: Part): part is TextPart;
124
+ /**
125
+ * Check if a part is a tool part.
126
+ */
127
+ export declare function isToolPart(part: Part): part is ToolPart;
128
+ /**
129
+ * Check if tool state is completed.
130
+ */
131
+ export declare function isToolStateCompleted(state: ToolPart["state"]): state is ToolStateCompleted;
132
+ /**
133
+ * Check if tool state is error.
134
+ */
135
+ export declare function isToolStateError(state: ToolPart["state"]): state is ToolStateError;
136
+ /**
137
+ * Convert an OpenCode TextPart to SDK text content block.
138
+ */
139
+ export declare function textPartToContentBlock(part: TextPart): {
140
+ type: "text";
141
+ text: string;
142
+ };
143
+ /**
144
+ * Convert an OpenCode ToolPart to SDK tool_use content block.
145
+ *
146
+ * Note: Only tool parts in "running" or later states have meaningful data.
147
+ * "pending" state may have incomplete input (raw JSON string).
148
+ */
149
+ export declare function toolPartToToolUseBlock(part: ToolPart): {
150
+ type: "tool_use";
151
+ id: string;
152
+ name: string;
153
+ input: Record<string, unknown>;
154
+ };
155
+ /**
156
+ * Convert a completed ToolPart to SDK tool_result content block.
157
+ *
158
+ * This is used when we need to emit the tool result as a user message.
159
+ */
160
+ export declare function toolPartToToolResultBlock(part: ToolPart): {
161
+ type: "tool_result";
162
+ tool_use_id: string;
163
+ content: string;
164
+ is_error: boolean;
165
+ };
166
+ /**
167
+ * Convert an OpenCode message part update event to SDK message.
168
+ *
169
+ * This handles individual part updates as they stream in.
170
+ * The caller is responsible for accumulating parts into complete messages.
171
+ *
172
+ * @param event - The message.part.updated event
173
+ * @param sessionId - Current session ID
174
+ * @returns SDKMessage or null if part type doesn't map to a message
175
+ */
176
+ export declare function partEventToSDKMessage(event: EventMessagePartUpdated, sessionId: string | null): SDKMessage | null;
177
+ /**
178
+ * Convert an OpenCode message update event to SDK message.
179
+ *
180
+ * This handles complete message updates (not individual parts).
181
+ *
182
+ * @param event - The message.updated event
183
+ * @param sessionId - Current session ID
184
+ * @returns SDKMessage or null
185
+ */
186
+ export declare function messageEventToSDKMessage(event: EventMessageUpdated, sessionId: string | null): SDKMessage | null;
187
+ /**
188
+ * Synthesize an SDKResultMessage from completion state.
189
+ *
190
+ * OpenCode doesn't have a dedicated result message - we synthesize from:
191
+ * - AssistantMessage.finish === "stop"
192
+ * - AssistantMessage.time.completed set
193
+ * - session.idle event
194
+ *
195
+ * @param sessionId - Current session ID
196
+ * @param lastAssistantMessage - Last assistant message for content extraction
197
+ * @param assistantInfo - Optional AssistantMessage info for token metrics
198
+ * @returns SDKResultMessage
199
+ */
200
+ export declare function synthesizeResultMessage(sessionId: string | null, lastAssistantMessage?: SDKAssistantMessage | null, assistantInfo?: AssistantMessage | null): SDKResultMessage;
201
+ /**
202
+ * Convert a session error event to SDKResultMessage.
203
+ *
204
+ * @param event - The session.error event
205
+ * @param sessionId - Current session ID
206
+ * @returns SDKResultMessage with error info
207
+ */
208
+ export declare function errorEventToSDKMessage(event: EventSessionError, sessionId: string | null): SDKResultMessage;
209
+ /**
210
+ * Convert an OpenCode event to sylas-core SDKMessage format.
211
+ *
212
+ * This adapter maps OpenCode's SSE events to the sylas-core SDKMessage format,
213
+ * allowing OpenCodeRunner to implement the IAgentRunner interface.
214
+ *
215
+ * NOTE: This adapter is stateless for most events. For complete message
216
+ * accumulation, the caller (OpenCodeRunner) should track parts and build
217
+ * complete messages.
218
+ *
219
+ * @param event - OpenCode SSE event
220
+ * @param sessionId - Current session ID (may be null initially)
221
+ * @param lastAssistantMessage - Last assistant message for result coercion (optional)
222
+ * @param lastAssistantInfo - Last assistant message info for metrics (optional)
223
+ * @returns SDKMessage or null if event type doesn't map to a message
224
+ */
225
+ export declare function openCodeEventToSDKMessage(event: Event, sessionId: string | null, lastAssistantMessage?: SDKAssistantMessage | null, lastAssistantInfo?: AssistantMessage | null): SDKMessage | null;
226
+ /**
227
+ * Extract session ID from an OpenCode event.
228
+ *
229
+ * @param event - OpenCode event
230
+ * @returns Session ID if available, null otherwise
231
+ */
232
+ export declare function extractSessionId(event: Event): string | null;
233
+ /**
234
+ * Create a Sylas Core SDK UserMessage from a plain string prompt.
235
+ *
236
+ * Helper function to create properly formatted SDKUserMessage objects
237
+ * for sending to OpenCode.
238
+ *
239
+ * @param content - The prompt text
240
+ * @param sessionId - Current session ID (may be null for initial message)
241
+ * @returns Formatted SDKUserMessage
242
+ */
243
+ export declare function createUserMessage(content: string, sessionId: string | null): SDKUserMessage;
244
+ export {};
245
+ //# sourceMappingURL=adapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"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"}