@sumicom/quicksave 0.8.8 → 0.8.9

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 (55) hide show
  1. package/dist/ai/cardBuilder.d.ts +3 -2
  2. package/dist/ai/cardBuilder.d.ts.map +1 -1
  3. package/dist/ai/cardBuilder.js +7 -3
  4. package/dist/ai/cardBuilder.js.map +1 -1
  5. package/dist/ai/claudeCliProvider.d.ts +1 -0
  6. package/dist/ai/claudeCliProvider.d.ts.map +1 -1
  7. package/dist/ai/claudeCliProvider.js +4 -1
  8. package/dist/ai/claudeCliProvider.js.map +1 -1
  9. package/dist/ai/claudeCodeProvider.d.ts +4 -0
  10. package/dist/ai/claudeCodeProvider.d.ts.map +1 -1
  11. package/dist/ai/claudeCodeProvider.js +39 -0
  12. package/dist/ai/claudeCodeProvider.js.map +1 -1
  13. package/dist/ai/claudeSdkProvider.d.ts +1 -0
  14. package/dist/ai/claudeSdkProvider.d.ts.map +1 -1
  15. package/dist/ai/claudeSdkProvider.js +1 -0
  16. package/dist/ai/claudeSdkProvider.js.map +1 -1
  17. package/dist/ai/codexAppServer/provider.d.ts +1 -0
  18. package/dist/ai/codexAppServer/provider.d.ts.map +1 -1
  19. package/dist/ai/codexAppServer/provider.js +1 -0
  20. package/dist/ai/codexAppServer/provider.js.map +1 -1
  21. package/dist/ai/openCodeProvider.d.ts +106 -0
  22. package/dist/ai/openCodeProvider.d.ts.map +1 -0
  23. package/dist/ai/openCodeProvider.js +617 -0
  24. package/dist/ai/openCodeProvider.js.map +1 -0
  25. package/dist/ai/openCodeServer.d.ts +88 -0
  26. package/dist/ai/openCodeServer.d.ts.map +1 -0
  27. package/dist/ai/openCodeServer.js +350 -0
  28. package/dist/ai/openCodeServer.js.map +1 -0
  29. package/dist/ai/provider.d.ts +25 -0
  30. package/dist/ai/provider.d.ts.map +1 -1
  31. package/dist/ai/provider.js +9 -0
  32. package/dist/ai/provider.js.map +1 -1
  33. package/dist/ai/sessionManager.d.ts +6 -1
  34. package/dist/ai/sessionManager.d.ts.map +1 -1
  35. package/dist/ai/sessionManager.js +76 -7
  36. package/dist/ai/sessionManager.js.map +1 -1
  37. package/dist/ai/systemPrompt.js +1 -1
  38. package/dist/ai/systemPrompt.js.map +1 -1
  39. package/dist/files/fileBrowser.d.ts.map +1 -1
  40. package/dist/files/fileBrowser.js +12 -0
  41. package/dist/files/fileBrowser.js.map +1 -1
  42. package/dist/handlers/legacyBusAdapter.d.ts.map +1 -1
  43. package/dist/handlers/legacyBusAdapter.js +1 -0
  44. package/dist/handlers/legacyBusAdapter.js.map +1 -1
  45. package/dist/handlers/messageHandler.d.ts +1 -0
  46. package/dist/handlers/messageHandler.d.ts.map +1 -1
  47. package/dist/handlers/messageHandler.js +21 -5
  48. package/dist/handlers/messageHandler.js.map +1 -1
  49. package/dist/index.js +2 -2
  50. package/dist/service/ipcClient.js +1 -1
  51. package/dist/service/run.d.ts.map +1 -1
  52. package/dist/service/run.js +8 -1
  53. package/dist/service/run.js.map +1 -1
  54. package/dist/service/types.js +1 -1
  55. package/package.json +3 -3
@@ -0,0 +1,617 @@
1
+ // SPDX-FileCopyrightText: 2026 King Young Technology
2
+ // SPDX-License-Identifier: MIT
3
+ //
4
+ // OpenCode HTTP-server provider.
5
+ //
6
+ // Earlier revisions of this file drove the `opencode run --format json` CLI
7
+ // per turn. That works once but is single-shot — there's no way to resume the
8
+ // same conversation, the CLI hangs on open stdin pipes, and the process spin
9
+ // up cost (~3s) hits every prompt. We now talk to a single long-lived
10
+ // `opencode serve` instance over HTTP + SSE; see `openCodeServer.ts` for the
11
+ // shared lifecycle.
12
+ //
13
+ // Event → Card translation (verified against opencode 1.14):
14
+ // • `message.part.updated` is the source of truth for each part. We use it
15
+ // in preference to `message.part.delta` so the implementation is
16
+ // idempotent and easy to test (Card emission per Part snapshot, not per
17
+ // delta byte). Each Part type maps as:
18
+ // - TextPart → assistantText + finalize
19
+ // - ReasoningPart → thinkingBlock
20
+ // - ToolPart → toolUse / toolResult (depending on state.status)
21
+ // Step / file / patch / snapshot parts are ignored — they have no card.
22
+ // • `session.idle` is the canonical end-of-turn signal. We emit `streamEnd`
23
+ // from there.
24
+ // • `session.error` becomes a visible `[opencode error]` card and a failed
25
+ // `streamEnd`.
26
+ // • `permission.asked` is forwarded to the PWA via the usual
27
+ // `handlePermissionRequest` callback; the reply is POSTed back to
28
+ // `/permission/{id}/reply`.
29
+ import { execSync } from 'child_process';
30
+ import { existsSync, readdirSync, readFileSync } from 'fs';
31
+ import { join } from 'path';
32
+ import { getOpenCodeServer } from './openCodeServer.js';
33
+ // ── Model id validation ──────────────────────────────────────────────────────
34
+ //
35
+ // opencode's HTTP API takes `{ providerID, modelID }` as a structured object,
36
+ // not the slashed `provider/model` form the CLI accepted. We keep accepting
37
+ // the slashed form from quicksave callers (so existing prefs keep working)
38
+ // and split it on the first `/`. Anything without a slash is invalid; the
39
+ // server has no concept of a default fallback per request — the provider
40
+ // must be named explicitly — so we surface the failure up-front rather than
41
+ // silently sending nothing.
42
+ const OPENCODE_MODEL_RE = /^[^/\s]+\/[^\s]+$/;
43
+ export function isValidOpenCodeModelId(model) {
44
+ return typeof model === 'string' && OPENCODE_MODEL_RE.test(model);
45
+ }
46
+ export function parseModelId(model) {
47
+ const idx = model.indexOf('/');
48
+ return { providerID: model.slice(0, idx), modelID: model.slice(idx + 1) };
49
+ }
50
+ // ── Binary resolution (still needed for the `opencode models` probe + serve spawn) ──
51
+ let _opencodeBin;
52
+ export function _resetOpenCodeBinCache() { _opencodeBin = undefined; }
53
+ export function getOpenCodeBin() {
54
+ if (_opencodeBin)
55
+ return _opencodeBin;
56
+ try {
57
+ const resolved = execSync('which opencode', { encoding: 'utf-8', timeout: 5_000 }).trim();
58
+ if (resolved) {
59
+ _opencodeBin = resolved;
60
+ return _opencodeBin;
61
+ }
62
+ }
63
+ catch { /* not in PATH */ }
64
+ const home = process.env.HOME ?? '';
65
+ const candidates = [
66
+ join(home, '.nvm', 'versions', 'node', 'bin', 'opencode'),
67
+ join(home, '.npm-global', 'bin', 'opencode'),
68
+ join(home, '.local', 'bin', 'opencode'),
69
+ '/usr/local/bin/opencode',
70
+ ];
71
+ try {
72
+ const nvmDir = join(home, '.nvm', 'versions', 'node');
73
+ if (existsSync(nvmDir)) {
74
+ for (const ver of readdirSync(nvmDir)) {
75
+ candidates.push(join(nvmDir, ver, 'bin', 'opencode'));
76
+ }
77
+ }
78
+ }
79
+ catch { /* ignore */ }
80
+ for (const c of candidates)
81
+ if (existsSync(c)) {
82
+ _opencodeBin = c;
83
+ return _opencodeBin;
84
+ }
85
+ _opencodeBin = 'opencode';
86
+ return _opencodeBin;
87
+ }
88
+ export class OpencodeSession {
89
+ /** opencode server's `ses_…` id. Stable across turns; we use it for
90
+ * follow-up prompts and abort. */
91
+ opencodeSessionId;
92
+ server;
93
+ router = null;
94
+ dispose = () => { };
95
+ aliveFlag = true;
96
+ turnConfig;
97
+ cb = null;
98
+ callbacks = null;
99
+ constructor(opencodeSessionId, server, turnConfig) {
100
+ this.opencodeSessionId = opencodeSessionId;
101
+ this.server = server;
102
+ this.turnConfig = turnConfig;
103
+ }
104
+ /** @internal wires the per-session SSE consumer state for follow-ups. */
105
+ _setTurnWiring(cb, callbacks, router, dispose) {
106
+ this.cb = cb;
107
+ this.callbacks = callbacks;
108
+ this.router = router;
109
+ this.dispose = dispose;
110
+ }
111
+ /** Hot resume entry: SessionManager calls this for in-process follow-ups.
112
+ * Kicks off a new turn against the same opencode session. */
113
+ sendUserMessage(prompt, attachments) {
114
+ if (!this.aliveFlag || !this.cb || !this.callbacks || !this.router) {
115
+ console.warn('[openCode] sendUserMessage on a dead session — ignoring');
116
+ return;
117
+ }
118
+ // Emit the user card immediately so the PWA reflects the prompt without
119
+ // waiting for SSE round-trip.
120
+ if (prompt || (attachments && attachments.length > 0)) {
121
+ this.callbacks.emitCardEvent(this.cb.userMessage(prompt, attachments));
122
+ }
123
+ this.cb.startNewTurn();
124
+ this.router.resetForNewTurn();
125
+ this.server.sendPromptAsync(this.opencodeSessionId, {
126
+ text: prompt,
127
+ model: this.turnConfig.model,
128
+ ...(this.turnConfig.variant ? { variant: this.turnConfig.variant } : {}),
129
+ ...(this.turnConfig.system ? { system: this.turnConfig.system } : {}),
130
+ }).catch((err) => {
131
+ console.error('[openCode] follow-up prompt_async failed:', err);
132
+ this.router?.finalize(false, err.message);
133
+ });
134
+ }
135
+ interrupt() {
136
+ void this.server.abortSession(this.opencodeSessionId).catch(() => { });
137
+ }
138
+ kill() {
139
+ if (!this.aliveFlag)
140
+ return;
141
+ this.aliveFlag = false;
142
+ void this.server.abortSession(this.opencodeSessionId).catch(() => { });
143
+ this.dispose();
144
+ }
145
+ get alive() { return this.aliveFlag; }
146
+ async getContextUsage() { return null; }
147
+ }
148
+ // ── Provider ─────────────────────────────────────────────────────────────────
149
+ export class OpenCodeProvider {
150
+ id = 'opencode';
151
+ historyMode = 'memory';
152
+ label = 'OpenCode';
153
+ async probeProvider() {
154
+ const hasCli = this.isCliAvailable();
155
+ const capabilities = {
156
+ hasApiKey: !!process.env.OPENCODE_API_KEY || !!process.env.OPENAI_API_KEY,
157
+ hasCli,
158
+ hasPlugin: false,
159
+ // We DO support resume now (HTTP-server keeps session alive across turns).
160
+ supportsResume: true,
161
+ supportsSandbox: false,
162
+ supportsStreaming: true,
163
+ };
164
+ return { capabilities, models: hasCli ? this.listAvailableModels() : [] };
165
+ }
166
+ // Read models from user's opencode.json. Previously shelled out to
167
+ // `opencode models`, but every invocation leaks an 8MB libopentui.so into
168
+ // /tmp (sst/opencode#4605, #13479; open since Feb, no fix in sight).
169
+ // Trade-off: built-in `opencode/*` free models only show up if the user
170
+ // adds them to their own config.
171
+ listAvailableModels() {
172
+ return Array.from(this.readConfigModelNames().entries()).map(([id, name]) => ({ id, name }));
173
+ }
174
+ readConfigModelNames() {
175
+ const names = new Map();
176
+ try {
177
+ const home = process.env.HOME ?? '';
178
+ const configPath = join(home, '.config', 'opencode', 'opencode.json');
179
+ if (!existsSync(configPath))
180
+ return names;
181
+ const config = JSON.parse(readFileSync(configPath, 'utf-8'));
182
+ const providers = config?.provider;
183
+ if (!providers)
184
+ return names;
185
+ for (const [providerID, cfg] of Object.entries(providers)) {
186
+ for (const [modelID, modelCfg] of Object.entries(cfg.models ?? {})) {
187
+ const full = `${providerID}/${modelID}`;
188
+ names.set(full, modelCfg.name ?? full);
189
+ }
190
+ }
191
+ }
192
+ catch { /* ignore */ }
193
+ return names;
194
+ }
195
+ isCliAvailable() {
196
+ try {
197
+ const bin = getOpenCodeBin();
198
+ execSync(`"${bin}" --version`, { timeout: 3_000, encoding: 'utf-8' });
199
+ return true;
200
+ }
201
+ catch {
202
+ return false;
203
+ }
204
+ }
205
+ // ── startSession ────────────────────────────────────────────────────────────
206
+ async startSession(opts, cardBuilder, callbacks) {
207
+ if (!opts.model || !isValidOpenCodeModelId(opts.model)) {
208
+ throw new Error(opts.model
209
+ ? `opencode model id "${opts.model}" is invalid (must be provider/model)`
210
+ : 'opencode requires an explicit model id (provider/model)');
211
+ }
212
+ const server = getOpenCodeServer();
213
+ const { id: opencodeSessionId } = await server.createSession({
214
+ directory: opts.cwd,
215
+ agent: 'build',
216
+ });
217
+ const turnConfig = {
218
+ model: parseModelId(opts.model),
219
+ ...(opts.reasoningEffort ? { variant: opts.reasoningEffort } : {}),
220
+ ...(opts.systemPrompt ? { system: opts.systemPrompt } : {}),
221
+ };
222
+ const session = new OpencodeSession(opencodeSessionId, server, turnConfig);
223
+ cardBuilder.updateSessionId(opencodeSessionId);
224
+ if (opts.prompt || (opts.attachments && opts.attachments.length > 0)) {
225
+ callbacks.emitCardEvent(cardBuilder.userMessage(opts.prompt, opts.attachments));
226
+ }
227
+ cardBuilder.startNewTurn();
228
+ const router = new SessionEventRouter(opencodeSessionId, cardBuilder, callbacks, server);
229
+ const unsub = server.subscribe(opencodeSessionId, (ev) => router.handle(ev));
230
+ session._setTurnWiring(cardBuilder, callbacks, router, unsub);
231
+ server.sendPromptAsync(opencodeSessionId, {
232
+ text: opts.prompt,
233
+ model: turnConfig.model,
234
+ ...(turnConfig.variant ? { variant: turnConfig.variant } : {}),
235
+ ...(turnConfig.system ? { system: turnConfig.system } : {}),
236
+ }).catch((err) => {
237
+ console.error('[openCode] prompt_async failed:', err);
238
+ router.finalize(false, err.message);
239
+ });
240
+ return { sessionId: opencodeSessionId, session };
241
+ }
242
+ // ── resumeSession ───────────────────────────────────────────────────────────
243
+ async resumeSession(opts, cardBuilder, callbacks) {
244
+ if (!opts.model || !isValidOpenCodeModelId(opts.model)) {
245
+ throw new Error(opts.model
246
+ ? `opencode model id "${opts.model}" is invalid (must be provider/model)`
247
+ : 'opencode requires an explicit model id (provider/model)');
248
+ }
249
+ const server = getOpenCodeServer();
250
+ // `opts.sessionId` from SessionManager IS opencode's ses_… (we returned
251
+ // it from startSession). Reuse it directly — no createSession.
252
+ const opencodeSessionId = opts.sessionId;
253
+ const turnConfig = {
254
+ model: parseModelId(opts.model),
255
+ ...(opts.reasoningEffort ? { variant: opts.reasoningEffort } : {}),
256
+ ...(opts.systemPrompt ? { system: opts.systemPrompt } : {}),
257
+ };
258
+ const session = new OpencodeSession(opencodeSessionId, server, turnConfig);
259
+ cardBuilder.updateSessionId(opencodeSessionId);
260
+ if (opts.prompt || (opts.attachments && opts.attachments.length > 0)) {
261
+ callbacks.emitCardEvent(cardBuilder.userMessage(opts.prompt, opts.attachments));
262
+ }
263
+ cardBuilder.startNewTurn();
264
+ const router = new SessionEventRouter(opencodeSessionId, cardBuilder, callbacks, server);
265
+ const unsub = server.subscribe(opencodeSessionId, (ev) => router.handle(ev));
266
+ session._setTurnWiring(cardBuilder, callbacks, router, unsub);
267
+ server.sendPromptAsync(opencodeSessionId, {
268
+ text: opts.prompt,
269
+ model: turnConfig.model,
270
+ ...(turnConfig.variant ? { variant: turnConfig.variant } : {}),
271
+ ...(turnConfig.system ? { system: turnConfig.system } : {}),
272
+ }).catch((err) => {
273
+ console.error('[openCode] resume prompt_async failed:', err);
274
+ router.finalize(false, err.message);
275
+ });
276
+ return { sessionId: opencodeSessionId, session };
277
+ }
278
+ }
279
+ // ── SSE → CardEvent router ───────────────────────────────────────────────────
280
+ /** @internal exposed for tests; do not use outside this module. */
281
+ export class SessionEventRouter {
282
+ sessionId;
283
+ cb;
284
+ callbacks;
285
+ server;
286
+ finalized = false;
287
+ /** Track which parts we've already emitted as cards so re-emits become
288
+ * no-ops. opencode publishes both `delta` and `updated` events for the
289
+ * same Part; we listen only to `updated` but the same part can update
290
+ * many times (e.g. tool state transitions). For text parts we coalesce
291
+ * by holding only the latest snapshot. */
292
+ toolCards = new Set(); // callIDs we've emitted toolUse for
293
+ toolResults = new Set(); // callIDs we've emitted toolResult for
294
+ textPartIds = new Map(); // partID → emitted text (for dedupe)
295
+ reasoningPartIds = new Set();
296
+ constructor(sessionId, cb, callbacks, server) {
297
+ this.sessionId = sessionId;
298
+ this.cb = cb;
299
+ this.callbacks = callbacks;
300
+ this.server = server;
301
+ }
302
+ /** Reset turn-scoped state so the next opencode turn streams into a fresh
303
+ * set of cards. Per-session disposers and the SSE subscription stay live. */
304
+ resetForNewTurn() {
305
+ this.finalized = false;
306
+ this.toolCards.clear();
307
+ this.toolResults.clear();
308
+ this.textPartIds.clear();
309
+ this.reasoningPartIds.clear();
310
+ this.deltaBuf.clear();
311
+ }
312
+ handle(ev) {
313
+ if (this.finalized)
314
+ return;
315
+ switch (ev.type) {
316
+ case 'message.part.delta':
317
+ // Streaming text/reasoning chunks. opencode does NOT also emit a
318
+ // terminal `message.part.updated` for these (verified empirically),
319
+ // so the delta event IS our source of truth.
320
+ this.handleDelta(ev.properties);
321
+ break;
322
+ case 'message.part.updated':
323
+ // Tool parts and any other structured part. opencode 1.14's SSE
324
+ // stream does NOT actually emit this for tool parts (verified
325
+ // empirically), so we also poll REST `/session/{id}/message` on
326
+ // session.diff / session.idle / new text partID. Kept here in case
327
+ // a future opencode version starts emitting it.
328
+ this.handlePart(ev.properties.part);
329
+ break;
330
+ case 'session.diff':
331
+ // File-mutating tools (bash with redirects, edit, write, patch)
332
+ // emit a session.diff once they finish. Use it as an early trigger
333
+ // to surface the tool card BEFORE the model's follow-up text streams.
334
+ this.scheduleToolSync();
335
+ break;
336
+ case 'session.idle':
337
+ this.finalize(true);
338
+ break;
339
+ case 'session.error': {
340
+ const err = ev.properties.error;
341
+ const msg = err?.data?.message || err?.name || 'opencode session error';
342
+ this.emitErrorCard(msg);
343
+ this.finalize(false, msg);
344
+ break;
345
+ }
346
+ case 'permission.asked':
347
+ void this.handlePermissionAsked(ev);
348
+ break;
349
+ case 'server.disposed':
350
+ this.finalize(false, 'opencode server exited');
351
+ break;
352
+ default:
353
+ // Many event types we don't care about (lsp.*, file.*, vcs.*,
354
+ // session.updated metadata, server.heartbeat, etc.).
355
+ break;
356
+ }
357
+ }
358
+ /** Coalesce concurrent tool-sync requests into a single in-flight fetch.
359
+ * Subsequent callers wait on the same promise so the REST endpoint is
360
+ * hit at most once per "cycle". */
361
+ toolSyncPending = null;
362
+ scheduleToolSync() {
363
+ if (this.toolSyncPending)
364
+ return;
365
+ this.toolSyncPending = this.syncToolPartsFromRest()
366
+ .catch((err) => { console.warn('[openCode] tool sync failed:', err); })
367
+ .finally(() => { this.toolSyncPending = null; });
368
+ }
369
+ /** Wait for any in-flight tool sync to complete. Used by finalize() so
370
+ * the final stream-end fires AFTER all tool cards have been emitted. */
371
+ async waitForToolSync() {
372
+ if (this.toolSyncPending) {
373
+ try {
374
+ await this.toolSyncPending;
375
+ }
376
+ catch { /* logged above */ }
377
+ }
378
+ }
379
+ /** Pull message parts from REST and emit cards for any tool parts we
380
+ * haven't seen yet. Idempotent — relies on `toolCards` / `toolResults`
381
+ * sets keyed by callID to dedup against earlier syncs and against any
382
+ * future SSE-delivered `message.part.updated` events. */
383
+ async syncToolPartsFromRest() {
384
+ if (this.finalized)
385
+ return;
386
+ const messages = await this.server.getMessages(this.sessionId);
387
+ // Finalize any open text card BEFORE emitting tool cards so they
388
+ // interleave in the correct chat order (text → tool → follow-up text).
389
+ let flushedText = false;
390
+ for (const msg of messages) {
391
+ for (const part of msg.parts) {
392
+ if (part?.type !== 'tool')
393
+ continue;
394
+ const callID = part.callID;
395
+ const toolName = part.tool;
396
+ if (!callID || !toolName)
397
+ continue;
398
+ const state = (part.state ?? {});
399
+ const input = state.input ?? {};
400
+ if (!this.toolCards.has(callID)) {
401
+ if (!flushedText) {
402
+ const fin = this.cb.finalizeAssistantText();
403
+ if (fin)
404
+ this.callbacks.emitCardEvent(fin);
405
+ flushedText = true;
406
+ }
407
+ this.toolCards.add(callID);
408
+ this.callbacks.onToolUse?.(this.sessionId, toolName, input);
409
+ this.callbacks.emitCardEvent(this.cb.toolUse(toolName, input, callID));
410
+ }
411
+ if ((state.status === 'completed' || state.status === 'error') && !this.toolResults.has(callID)) {
412
+ this.toolResults.add(callID);
413
+ const isError = state.status === 'error';
414
+ const content = isError
415
+ ? (state.error || state.output || 'Tool failed')
416
+ : (state.output ?? '');
417
+ const evt = this.cb.toolResult(callID, content, isError);
418
+ if (evt)
419
+ this.callbacks.emitCardEvent(evt);
420
+ }
421
+ }
422
+ }
423
+ }
424
+ /** Incremental delta on a `text` or `reasoning` part. We accumulate per
425
+ * partID and emit per-card for clean bubble grouping. */
426
+ deltaBuf = new Map();
427
+ handleDelta(p) {
428
+ if (!p.partID || !p.delta)
429
+ return;
430
+ if (p.field !== 'text' && p.field !== 'reasoning')
431
+ return;
432
+ let state = this.deltaBuf.get(p.partID);
433
+ if (!state) {
434
+ state = { field: p.field, text: '', cardOpen: false };
435
+ this.deltaBuf.set(p.partID, state);
436
+ }
437
+ state.text += p.delta;
438
+ if (state.field === 'text') {
439
+ // First chunk for this partID closes any other open text card, then
440
+ // creates a fresh one. Subsequent chunks append to the same card via
441
+ // assistantText() which the StreamCardBuilder coalesces.
442
+ if (!state.cardOpen) {
443
+ const fin = this.cb.finalizeAssistantText();
444
+ if (fin)
445
+ this.callbacks.emitCardEvent(fin);
446
+ state.cardOpen = true;
447
+ // A new text part starting may mean a tool just completed (opencode
448
+ // doesn't push tool parts via SSE — we poll REST). Debounced, so a
449
+ // spurious sync at the very first text card of the turn is cheap.
450
+ this.scheduleToolSync();
451
+ }
452
+ this.callbacks.emitCardEvent(this.cb.assistantText(p.delta));
453
+ }
454
+ // reasoning deltas: buffer until we see a terminator. opencode doesn't
455
+ // emit a per-part `complete` event, so we flush reasoning on the next
456
+ // text card OR on finalize. See flushPendingReasoning().
457
+ }
458
+ /** Flush buffered reasoning chunks (collected via handleDelta) into a
459
+ * single thinkingBlock per part. Idempotent. */
460
+ flushPendingReasoning() {
461
+ for (const [partID, state] of this.deltaBuf) {
462
+ if (state.field === 'reasoning' && state.text) {
463
+ this.callbacks.emitCardEvent(this.cb.thinkingBlock(state.text));
464
+ state.text = '';
465
+ }
466
+ if (state.field === 'text' && state.cardOpen) {
467
+ const fin = this.cb.finalizeAssistantText();
468
+ if (fin)
469
+ this.callbacks.emitCardEvent(fin);
470
+ state.cardOpen = false;
471
+ }
472
+ void partID;
473
+ }
474
+ }
475
+ handlePart(part) {
476
+ if (!part || typeof part.type !== 'string')
477
+ return;
478
+ if (part.type === 'text') {
479
+ const tp = part;
480
+ if (tp.ignored || !tp.text)
481
+ return;
482
+ // We may see the same partID several times as the model streams; replay
483
+ // only the latest snapshot, replacing whatever we showed before. The
484
+ // CardBuilder doesn't support in-place text replace, so the practical
485
+ // pattern is: don't emit until the part stops growing. opencode emits
486
+ // a final `message.part.updated` once the part is done, but it also
487
+ // emits intermediate snapshots. To avoid bubble churn we emit on the
488
+ // FIRST snapshot we see for each partID (the assistant-text card will
489
+ // append further chunks via assistantText() in the rare case the part
490
+ // grows — they go to a new card so the chat looks like clean blocks).
491
+ if (!this.textPartIds.has(tp.id)) {
492
+ this.textPartIds.set(tp.id, tp.text);
493
+ this.callbacks.emitCardEvent(this.cb.assistantText(tp.text));
494
+ const fin = this.cb.finalizeAssistantText();
495
+ if (fin)
496
+ this.callbacks.emitCardEvent(fin);
497
+ }
498
+ else if (this.textPartIds.get(tp.id) !== tp.text) {
499
+ // Late growth — append the delta so we don't lose tokens.
500
+ const prev = this.textPartIds.get(tp.id) ?? '';
501
+ const delta = tp.text.startsWith(prev) ? tp.text.slice(prev.length) : tp.text;
502
+ this.textPartIds.set(tp.id, tp.text);
503
+ if (delta) {
504
+ this.callbacks.emitCardEvent(this.cb.assistantText(delta));
505
+ const fin = this.cb.finalizeAssistantText();
506
+ if (fin)
507
+ this.callbacks.emitCardEvent(fin);
508
+ }
509
+ }
510
+ return;
511
+ }
512
+ if (part.type === 'reasoning') {
513
+ const rp = part;
514
+ if (!rp.text || this.reasoningPartIds.has(rp.id))
515
+ return;
516
+ this.reasoningPartIds.add(rp.id);
517
+ this.callbacks.emitCardEvent(this.cb.thinkingBlock(rp.text));
518
+ return;
519
+ }
520
+ if (part.type === 'tool') {
521
+ const tp = part;
522
+ const input = (tp.state?.input ?? {});
523
+ if (!this.toolCards.has(tp.callID)) {
524
+ this.toolCards.add(tp.callID);
525
+ this.callbacks.onToolUse?.(this.sessionId, tp.tool, input);
526
+ this.callbacks.emitCardEvent(this.cb.toolUse(tp.tool, input, tp.callID));
527
+ }
528
+ if ((tp.state?.status === 'completed' || tp.state?.status === 'error') && !this.toolResults.has(tp.callID)) {
529
+ this.toolResults.add(tp.callID);
530
+ const isError = tp.state.status === 'error';
531
+ const content = isError
532
+ ? (tp.state.error || tp.state.output || 'Tool failed')
533
+ : (tp.state.output ?? '');
534
+ const evt = this.cb.toolResult(tp.callID, content, isError);
535
+ if (evt)
536
+ this.callbacks.emitCardEvent(evt);
537
+ }
538
+ return;
539
+ }
540
+ // step / file / snapshot / patch / agent / retry / compaction → no card.
541
+ }
542
+ async handlePermissionAsked(ev) {
543
+ // Verified payload (opencode 1.14):
544
+ // { id, sessionID, permission, patterns, metadata, always,
545
+ // tool: { messageID, callID } }
546
+ // The `tool.callID` lets us bind the request to the in-flight tool_call
547
+ // card; `metadata` carries tool-specific args (e.g. {filepath} for read).
548
+ const req = ev.properties;
549
+ const requestID = req.id;
550
+ if (!requestID)
551
+ return;
552
+ const toolName = req.permission ?? req.title ?? 'permission';
553
+ const toolInput = (req.metadata ?? {});
554
+ try {
555
+ const decision = await this.callbacks.handlePermissionRequest(this.sessionId, {
556
+ toolName,
557
+ toolInput,
558
+ toolUseId: requestID,
559
+ });
560
+ const reply = decision.action === 'allow' ? 'once' : 'reject';
561
+ await this.server.replyPermission(requestID, reply);
562
+ }
563
+ catch (err) {
564
+ console.error('[openCode] permission handling failed', err);
565
+ await this.server.replyPermission(requestID, 'reject').catch(() => { });
566
+ }
567
+ }
568
+ emitErrorCard(msg) {
569
+ const fin = this.cb.finalizeAssistantText();
570
+ if (fin)
571
+ this.callbacks.emitCardEvent(fin);
572
+ this.callbacks.emitCardEvent(this.cb.assistantText(`[opencode error] ${msg}`));
573
+ const fin2 = this.cb.finalizeAssistantText();
574
+ if (fin2)
575
+ this.callbacks.emitCardEvent(fin2);
576
+ }
577
+ finalize(success, error) {
578
+ if (this.finalized)
579
+ return;
580
+ // Drain any tool sync in-flight, then run one last sweep so every tool
581
+ // part REST knows about lands in the card list before stream-end. This
582
+ // is the "A" half of the catch-up policy ("B" = mid-turn polls on
583
+ // session.diff / new text partID).
584
+ void this.finalizeAsync(success, error);
585
+ }
586
+ async finalizeAsync(success, error) {
587
+ if (this.finalized)
588
+ return;
589
+ await this.waitForToolSync();
590
+ try {
591
+ await this.syncToolPartsFromRest();
592
+ }
593
+ catch (err) {
594
+ console.warn('[openCode] final tool sync failed:', err);
595
+ }
596
+ if (this.finalized)
597
+ return;
598
+ this.finalized = true;
599
+ this.flushPendingReasoning();
600
+ const fin = this.cb.finalizeAssistantText();
601
+ if (fin)
602
+ this.callbacks.emitCardEvent(fin);
603
+ const end = {
604
+ sessionId: this.sessionId,
605
+ success,
606
+ ...(error ? { error } : {}),
607
+ };
608
+ this.callbacks.emitStreamEnd(end);
609
+ // Notify SessionManager so it can mark the session inactive between
610
+ // turns. The OpencodeSession is still alive (server keeps it) — we just
611
+ // stop streaming this turn.
612
+ // We deliberately do NOT call onSessionExited here: the session lives
613
+ // on the server and can be resumed. SessionManager will reuse the same
614
+ // session reference on the next resumeSession call.
615
+ }
616
+ }
617
+ //# sourceMappingURL=openCodeProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openCodeProvider.js","sourceRoot":"","sources":["../../src/ai/openCodeProvider.ts"],"names":[],"mappings":"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"}