@sumicom/quicksave 0.8.8 → 0.8.10
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/ai/cardBuilder.d.ts +65 -4
- package/dist/ai/cardBuilder.d.ts.map +1 -1
- package/dist/ai/cardBuilder.js +338 -28
- package/dist/ai/cardBuilder.js.map +1 -1
- package/dist/ai/claudeCliProvider.d.ts +15 -0
- package/dist/ai/claudeCliProvider.d.ts.map +1 -1
- package/dist/ai/claudeCliProvider.js +87 -3
- package/dist/ai/claudeCliProvider.js.map +1 -1
- package/dist/ai/claudeCodeProvider.d.ts +4 -0
- package/dist/ai/claudeCodeProvider.d.ts.map +1 -1
- package/dist/ai/claudeCodeProvider.js +41 -0
- package/dist/ai/claudeCodeProvider.js.map +1 -1
- package/dist/ai/claudeSdkProvider.d.ts +1 -0
- package/dist/ai/claudeSdkProvider.d.ts.map +1 -1
- package/dist/ai/claudeSdkProvider.js +14 -2
- package/dist/ai/claudeSdkProvider.js.map +1 -1
- package/dist/ai/claudeTerminal/cardSynth.d.ts +63 -0
- package/dist/ai/claudeTerminal/cardSynth.d.ts.map +1 -0
- package/dist/ai/claudeTerminal/cardSynth.js +92 -0
- package/dist/ai/claudeTerminal/cardSynth.js.map +1 -0
- package/dist/ai/claudeTerminal/hookBridge.d.ts +56 -0
- package/dist/ai/claudeTerminal/hookBridge.d.ts.map +1 -0
- package/dist/ai/claudeTerminal/hookBridge.js +131 -0
- package/dist/ai/claudeTerminal/hookBridge.js.map +1 -0
- package/dist/ai/claudeTerminal/hookHandler.d.ts +18 -0
- package/dist/ai/claudeTerminal/hookHandler.d.ts.map +1 -0
- package/dist/ai/claudeTerminal/hookHandler.js +124 -0
- package/dist/ai/claudeTerminal/hookHandler.js.map +1 -0
- package/dist/ai/claudeTerminal/index.d.ts +5 -0
- package/dist/ai/claudeTerminal/index.d.ts.map +1 -0
- package/dist/ai/claudeTerminal/index.js +7 -0
- package/dist/ai/claudeTerminal/index.js.map +1 -0
- package/dist/ai/claudeTerminal/jsonlTail.d.ts +40 -0
- package/dist/ai/claudeTerminal/jsonlTail.d.ts.map +1 -0
- package/dist/ai/claudeTerminal/jsonlTail.js +129 -0
- package/dist/ai/claudeTerminal/jsonlTail.js.map +1 -0
- package/dist/ai/claudeTerminal/provider.d.ts +106 -0
- package/dist/ai/claudeTerminal/provider.d.ts.map +1 -0
- package/dist/ai/claudeTerminal/provider.js +579 -0
- package/dist/ai/claudeTerminal/provider.js.map +1 -0
- package/dist/ai/claudeTerminal/settingsBuilder.d.ts +44 -0
- package/dist/ai/claudeTerminal/settingsBuilder.d.ts.map +1 -0
- package/dist/ai/claudeTerminal/settingsBuilder.js +40 -0
- package/dist/ai/claudeTerminal/settingsBuilder.js.map +1 -0
- package/dist/ai/codexAppServer/cardAdapter.d.ts.map +1 -1
- package/dist/ai/codexAppServer/cardAdapter.js +13 -5
- package/dist/ai/codexAppServer/cardAdapter.js.map +1 -1
- package/dist/ai/codexAppServer/provider.d.ts +10 -2
- package/dist/ai/codexAppServer/provider.d.ts.map +1 -1
- package/dist/ai/codexAppServer/provider.js +158 -22
- package/dist/ai/codexAppServer/provider.js.map +1 -1
- package/dist/ai/openCodeProvider.d.ts +106 -0
- package/dist/ai/openCodeProvider.d.ts.map +1 -0
- package/dist/ai/openCodeProvider.js +617 -0
- package/dist/ai/openCodeProvider.js.map +1 -0
- package/dist/ai/openCodeServer.d.ts +88 -0
- package/dist/ai/openCodeServer.d.ts.map +1 -0
- package/dist/ai/openCodeServer.js +350 -0
- package/dist/ai/openCodeServer.js.map +1 -0
- package/dist/ai/profiles/project-sandbox.sb +26 -0
- package/dist/ai/provider.d.ts +54 -1
- package/dist/ai/provider.d.ts.map +1 -1
- package/dist/ai/provider.js +10 -0
- package/dist/ai/provider.js.map +1 -1
- package/dist/ai/queuedUserPrompts.d.ts +8 -0
- package/dist/ai/queuedUserPrompts.d.ts.map +1 -0
- package/dist/ai/queuedUserPrompts.js +19 -0
- package/dist/ai/queuedUserPrompts.js.map +1 -0
- package/dist/ai/realtimeTranscription.d.ts +39 -0
- package/dist/ai/realtimeTranscription.d.ts.map +1 -0
- package/dist/ai/realtimeTranscription.js +154 -0
- package/dist/ai/realtimeTranscription.js.map +1 -0
- package/dist/ai/sandboxMcp.d.ts +7 -0
- package/dist/ai/sandboxMcp.d.ts.map +1 -1
- package/dist/ai/sandboxMcp.js +4 -0
- package/dist/ai/sandboxMcp.js.map +1 -1
- package/dist/ai/sandboxMcpStdio.d.ts +1 -1
- package/dist/ai/sandboxMcpStdio.js +120 -47
- package/dist/ai/sandboxMcpStdio.js.map +1 -1
- package/dist/ai/sessionManager.d.ts +20 -1
- package/dist/ai/sessionManager.d.ts.map +1 -1
- package/dist/ai/sessionManager.js +220 -10
- package/dist/ai/sessionManager.js.map +1 -1
- package/dist/ai/sessionRegistry.d.ts +6 -0
- package/dist/ai/sessionRegistry.d.ts.map +1 -1
- package/dist/ai/sessionRegistry.js +13 -0
- package/dist/ai/sessionRegistry.js.map +1 -1
- package/dist/ai/sessionRegistryLocator.d.ts +14 -0
- package/dist/ai/sessionRegistryLocator.d.ts.map +1 -0
- package/dist/ai/sessionRegistryLocator.js +44 -0
- package/dist/ai/sessionRegistryLocator.js.map +1 -0
- package/dist/ai/systemPrompt.d.ts.map +1 -1
- package/dist/ai/systemPrompt.js +2 -1
- package/dist/ai/systemPrompt.js.map +1 -1
- package/dist/ai/voiceStream.d.ts +74 -0
- package/dist/ai/voiceStream.d.ts.map +1 -0
- package/dist/ai/voiceStream.js +179 -0
- package/dist/ai/voiceStream.js.map +1 -0
- package/dist/ai/voiceTranscription.d.ts +33 -0
- package/dist/ai/voiceTranscription.d.ts.map +1 -0
- package/dist/ai/voiceTranscription.js +122 -0
- package/dist/ai/voiceTranscription.js.map +1 -0
- package/dist/files/fileBrowser.d.ts.map +1 -1
- package/dist/files/fileBrowser.js +15 -2
- package/dist/files/fileBrowser.js.map +1 -1
- package/dist/handlers/legacyBusAdapter.d.ts +1 -1
- package/dist/handlers/legacyBusAdapter.d.ts.map +1 -1
- package/dist/handlers/legacyBusAdapter.js +7 -1
- package/dist/handlers/legacyBusAdapter.js.map +1 -1
- package/dist/handlers/messageHandler.d.ts +6 -0
- package/dist/handlers/messageHandler.d.ts.map +1 -1
- package/dist/handlers/messageHandler.js +119 -8
- package/dist/handlers/messageHandler.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/service/ipcClient.js +1 -1
- package/dist/service/ipcClient.js.map +1 -1
- package/dist/service/run.d.ts.map +1 -1
- package/dist/service/run.js +81 -3
- package/dist/service/run.js.map +1 -1
- package/dist/service/types.js +1 -1
- package/package.json +6 -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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"}
|