@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.
Files changed (122) hide show
  1. package/dist/ai/cardBuilder.d.ts +65 -4
  2. package/dist/ai/cardBuilder.d.ts.map +1 -1
  3. package/dist/ai/cardBuilder.js +338 -28
  4. package/dist/ai/cardBuilder.js.map +1 -1
  5. package/dist/ai/claudeCliProvider.d.ts +15 -0
  6. package/dist/ai/claudeCliProvider.d.ts.map +1 -1
  7. package/dist/ai/claudeCliProvider.js +87 -3
  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 +41 -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 +14 -2
  16. package/dist/ai/claudeSdkProvider.js.map +1 -1
  17. package/dist/ai/claudeTerminal/cardSynth.d.ts +63 -0
  18. package/dist/ai/claudeTerminal/cardSynth.d.ts.map +1 -0
  19. package/dist/ai/claudeTerminal/cardSynth.js +92 -0
  20. package/dist/ai/claudeTerminal/cardSynth.js.map +1 -0
  21. package/dist/ai/claudeTerminal/hookBridge.d.ts +56 -0
  22. package/dist/ai/claudeTerminal/hookBridge.d.ts.map +1 -0
  23. package/dist/ai/claudeTerminal/hookBridge.js +131 -0
  24. package/dist/ai/claudeTerminal/hookBridge.js.map +1 -0
  25. package/dist/ai/claudeTerminal/hookHandler.d.ts +18 -0
  26. package/dist/ai/claudeTerminal/hookHandler.d.ts.map +1 -0
  27. package/dist/ai/claudeTerminal/hookHandler.js +124 -0
  28. package/dist/ai/claudeTerminal/hookHandler.js.map +1 -0
  29. package/dist/ai/claudeTerminal/index.d.ts +5 -0
  30. package/dist/ai/claudeTerminal/index.d.ts.map +1 -0
  31. package/dist/ai/claudeTerminal/index.js +7 -0
  32. package/dist/ai/claudeTerminal/index.js.map +1 -0
  33. package/dist/ai/claudeTerminal/jsonlTail.d.ts +40 -0
  34. package/dist/ai/claudeTerminal/jsonlTail.d.ts.map +1 -0
  35. package/dist/ai/claudeTerminal/jsonlTail.js +129 -0
  36. package/dist/ai/claudeTerminal/jsonlTail.js.map +1 -0
  37. package/dist/ai/claudeTerminal/provider.d.ts +106 -0
  38. package/dist/ai/claudeTerminal/provider.d.ts.map +1 -0
  39. package/dist/ai/claudeTerminal/provider.js +579 -0
  40. package/dist/ai/claudeTerminal/provider.js.map +1 -0
  41. package/dist/ai/claudeTerminal/settingsBuilder.d.ts +44 -0
  42. package/dist/ai/claudeTerminal/settingsBuilder.d.ts.map +1 -0
  43. package/dist/ai/claudeTerminal/settingsBuilder.js +40 -0
  44. package/dist/ai/claudeTerminal/settingsBuilder.js.map +1 -0
  45. package/dist/ai/codexAppServer/cardAdapter.d.ts.map +1 -1
  46. package/dist/ai/codexAppServer/cardAdapter.js +13 -5
  47. package/dist/ai/codexAppServer/cardAdapter.js.map +1 -1
  48. package/dist/ai/codexAppServer/provider.d.ts +10 -2
  49. package/dist/ai/codexAppServer/provider.d.ts.map +1 -1
  50. package/dist/ai/codexAppServer/provider.js +158 -22
  51. package/dist/ai/codexAppServer/provider.js.map +1 -1
  52. package/dist/ai/openCodeProvider.d.ts +106 -0
  53. package/dist/ai/openCodeProvider.d.ts.map +1 -0
  54. package/dist/ai/openCodeProvider.js +617 -0
  55. package/dist/ai/openCodeProvider.js.map +1 -0
  56. package/dist/ai/openCodeServer.d.ts +88 -0
  57. package/dist/ai/openCodeServer.d.ts.map +1 -0
  58. package/dist/ai/openCodeServer.js +350 -0
  59. package/dist/ai/openCodeServer.js.map +1 -0
  60. package/dist/ai/profiles/project-sandbox.sb +26 -0
  61. package/dist/ai/provider.d.ts +54 -1
  62. package/dist/ai/provider.d.ts.map +1 -1
  63. package/dist/ai/provider.js +10 -0
  64. package/dist/ai/provider.js.map +1 -1
  65. package/dist/ai/queuedUserPrompts.d.ts +8 -0
  66. package/dist/ai/queuedUserPrompts.d.ts.map +1 -0
  67. package/dist/ai/queuedUserPrompts.js +19 -0
  68. package/dist/ai/queuedUserPrompts.js.map +1 -0
  69. package/dist/ai/realtimeTranscription.d.ts +39 -0
  70. package/dist/ai/realtimeTranscription.d.ts.map +1 -0
  71. package/dist/ai/realtimeTranscription.js +154 -0
  72. package/dist/ai/realtimeTranscription.js.map +1 -0
  73. package/dist/ai/sandboxMcp.d.ts +7 -0
  74. package/dist/ai/sandboxMcp.d.ts.map +1 -1
  75. package/dist/ai/sandboxMcp.js +4 -0
  76. package/dist/ai/sandboxMcp.js.map +1 -1
  77. package/dist/ai/sandboxMcpStdio.d.ts +1 -1
  78. package/dist/ai/sandboxMcpStdio.js +120 -47
  79. package/dist/ai/sandboxMcpStdio.js.map +1 -1
  80. package/dist/ai/sessionManager.d.ts +20 -1
  81. package/dist/ai/sessionManager.d.ts.map +1 -1
  82. package/dist/ai/sessionManager.js +220 -10
  83. package/dist/ai/sessionManager.js.map +1 -1
  84. package/dist/ai/sessionRegistry.d.ts +6 -0
  85. package/dist/ai/sessionRegistry.d.ts.map +1 -1
  86. package/dist/ai/sessionRegistry.js +13 -0
  87. package/dist/ai/sessionRegistry.js.map +1 -1
  88. package/dist/ai/sessionRegistryLocator.d.ts +14 -0
  89. package/dist/ai/sessionRegistryLocator.d.ts.map +1 -0
  90. package/dist/ai/sessionRegistryLocator.js +44 -0
  91. package/dist/ai/sessionRegistryLocator.js.map +1 -0
  92. package/dist/ai/systemPrompt.d.ts.map +1 -1
  93. package/dist/ai/systemPrompt.js +2 -1
  94. package/dist/ai/systemPrompt.js.map +1 -1
  95. package/dist/ai/voiceStream.d.ts +74 -0
  96. package/dist/ai/voiceStream.d.ts.map +1 -0
  97. package/dist/ai/voiceStream.js +179 -0
  98. package/dist/ai/voiceStream.js.map +1 -0
  99. package/dist/ai/voiceTranscription.d.ts +33 -0
  100. package/dist/ai/voiceTranscription.d.ts.map +1 -0
  101. package/dist/ai/voiceTranscription.js +122 -0
  102. package/dist/ai/voiceTranscription.js.map +1 -0
  103. package/dist/files/fileBrowser.d.ts.map +1 -1
  104. package/dist/files/fileBrowser.js +15 -2
  105. package/dist/files/fileBrowser.js.map +1 -1
  106. package/dist/handlers/legacyBusAdapter.d.ts +1 -1
  107. package/dist/handlers/legacyBusAdapter.d.ts.map +1 -1
  108. package/dist/handlers/legacyBusAdapter.js +7 -1
  109. package/dist/handlers/legacyBusAdapter.js.map +1 -1
  110. package/dist/handlers/messageHandler.d.ts +6 -0
  111. package/dist/handlers/messageHandler.d.ts.map +1 -1
  112. package/dist/handlers/messageHandler.js +119 -8
  113. package/dist/handlers/messageHandler.js.map +1 -1
  114. package/dist/index.js +2 -2
  115. package/dist/index.js.map +1 -1
  116. package/dist/service/ipcClient.js +1 -1
  117. package/dist/service/ipcClient.js.map +1 -1
  118. package/dist/service/run.d.ts.map +1 -1
  119. package/dist/service/run.js +81 -3
  120. package/dist/service/run.js.map +1 -1
  121. package/dist/service/types.js +1 -1
  122. package/package.json +6 -3
@@ -0,0 +1,88 @@
1
+ /** Shape of a single SSE envelope from `/event`. */
2
+ export interface OpenCodeEvent {
3
+ id: string;
4
+ type: string;
5
+ properties: Record<string, unknown> & {
6
+ sessionID?: string;
7
+ };
8
+ }
9
+ export interface CreateSessionOpts {
10
+ directory: string;
11
+ title?: string;
12
+ agent?: string;
13
+ }
14
+ export interface PromptOpts {
15
+ messageID?: string;
16
+ text: string;
17
+ model: {
18
+ providerID: string;
19
+ modelID: string;
20
+ };
21
+ agent?: string;
22
+ variant?: string;
23
+ system?: string;
24
+ }
25
+ export interface PromptPart {
26
+ type: 'text';
27
+ text: string;
28
+ }
29
+ declare class OpenCodeServer {
30
+ private proc;
31
+ private port;
32
+ private startPromise;
33
+ private sseAbort;
34
+ private shuttingDown;
35
+ /** Per-sessionID listeners. Each call registers; returns disposer. */
36
+ private listeners;
37
+ /** Global listeners (every event regardless of sessionID). */
38
+ private globalListeners;
39
+ /** Ensure the server is up. Idempotent; concurrent callers share the spawn. */
40
+ ensureRunning(): Promise<{
41
+ baseUrl: string;
42
+ }>;
43
+ private spawnAndAwaitReady;
44
+ /** Connect to /event as a long-lived SSE stream. Auto-reconnects until shutdown. */
45
+ private startEventStream;
46
+ private handleSseFrame;
47
+ private broadcast;
48
+ /** Subscribe to events for one session. Returns a disposer. */
49
+ subscribe(sessionID: string, listener: (event: OpenCodeEvent) => void): () => void;
50
+ /** Subscribe to every event (used by tests / debugging). */
51
+ subscribeAll(listener: (event: OpenCodeEvent) => void): () => void;
52
+ private req;
53
+ createSession(opts: CreateSessionOpts): Promise<{
54
+ id: string;
55
+ }>;
56
+ deleteSession(sessionID: string): Promise<void>;
57
+ sendPromptAsync(sessionID: string, opts: PromptOpts): Promise<void>;
58
+ /** Fetch every message + part for a session via the REST API.
59
+ *
60
+ * Tool calls in opencode 1.14 are NOT pushed via SSE — only `message.part.delta`
61
+ * (text/reasoning), `session.status`, `session.diff`, and `session.idle` ever
62
+ * appear on `/event`. The authoritative list of tool parts (with `input`,
63
+ * `output`, `state.status`) lives only on `GET /session/{id}/message`.
64
+ *
65
+ * Shape:
66
+ * [{ info: { id, role, ... }, parts: [{ type: 'tool'|'text'|..., ... }] }]
67
+ */
68
+ getMessages(sessionID: string): Promise<Array<{
69
+ info: Record<string, unknown>;
70
+ parts: Array<Record<string, unknown>>;
71
+ }>>;
72
+ abortSession(sessionID: string): Promise<void>;
73
+ replyPermission(requestID: string, reply: 'once' | 'always' | 'reject'): Promise<void>;
74
+ /** Shutdown the server. Idempotent.
75
+ *
76
+ * Awaits actual child exit. Without this, callers (notably the daemon's
77
+ * SIGTERM handler) `process.exit()` the moment SIGTERM was *sent*, leaving
78
+ * the opencode child reparented to PID 1 — that's how we ended up with 8
79
+ * orphaned `opencode serve` processes. */
80
+ shutdown(): Promise<void>;
81
+ /** @internal for tests */
82
+ get _port(): number | null;
83
+ }
84
+ export declare function getOpenCodeServer(): OpenCodeServer;
85
+ /** Test-only: blow away the singleton (won't shut down a running server). */
86
+ export declare function _resetOpenCodeServer(): void;
87
+ export type { OpenCodeServer };
88
+ //# sourceMappingURL=openCodeServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openCodeServer.d.ts","sourceRoot":"","sources":["../../src/ai/openCodeServer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,350 @@
1
+ // SPDX-FileCopyrightText: 2026 King Young Technology
2
+ // SPDX-License-Identifier: MIT
3
+ //
4
+ // OpenCode headless-server lifecycle.
5
+ //
6
+ // We spawn `opencode serve --port 0` lazily on first OpenCodeProvider call
7
+ // and keep it alive for the rest of the daemon's lifetime. One server backs
8
+ // every opencode session in this daemon — it handles its own session DB,
9
+ // SSE multiplexing, and provider/model resolution. Quicksave only needs to:
10
+ // 1. Create sessions (POST /session)
11
+ // 2. Send prompts (POST /session/{id}/prompt_async)
12
+ // 3. Subscribe to /event (one SSE stream, fan out by sessionID)
13
+ // 4. Abort / delete on close
14
+ //
15
+ // Restart policy: if the child exits unexpectedly we mark `ready = null`
16
+ // and let the next caller re-spawn. We don't attempt mid-turn recovery —
17
+ // the affected session just sees a streamEnd with success=false.
18
+ import { spawn } from 'child_process';
19
+ import { getOpenCodeBin } from './openCodeProvider.js';
20
+ class OpenCodeServer {
21
+ proc = null;
22
+ port = null;
23
+ startPromise = null;
24
+ sseAbort = null;
25
+ shuttingDown = false;
26
+ /** Per-sessionID listeners. Each call registers; returns disposer. */
27
+ listeners = new Map();
28
+ /** Global listeners (every event regardless of sessionID). */
29
+ globalListeners = new Set();
30
+ /** Ensure the server is up. Idempotent; concurrent callers share the spawn. */
31
+ async ensureRunning() {
32
+ if (this.port && this.proc && !this.proc.killed) {
33
+ return { baseUrl: `http://127.0.0.1:${this.port}` };
34
+ }
35
+ if (!this.startPromise)
36
+ this.startPromise = this.spawnAndAwaitReady();
37
+ await this.startPromise;
38
+ if (!this.port)
39
+ throw new Error('opencode server failed to report a port');
40
+ return { baseUrl: `http://127.0.0.1:${this.port}` };
41
+ }
42
+ spawnAndAwaitReady() {
43
+ return new Promise((resolve, reject) => {
44
+ const bin = getOpenCodeBin();
45
+ // --port 0 → let kernel pick a free port; we parse it from stdout.
46
+ // --hostname 127.0.0.1 (default) keeps the server localhost-only.
47
+ // --print-logs forces the "listening on …" banner to stderr where we
48
+ // can read it; without it the banner only goes to ~/.local/share log
49
+ // files and we'd have to poll.
50
+ const proc = spawn(bin, ['serve', '--port', '0', '--print-logs'], {
51
+ stdio: ['ignore', 'pipe', 'pipe'],
52
+ env: {
53
+ ...process.env,
54
+ ...(process.env.OPENCODE_API_KEY ? { OPENCODE_API_KEY: process.env.OPENCODE_API_KEY } : {}),
55
+ ...(process.env.OPENAI_API_KEY ? { OPENAI_API_KEY: process.env.OPENAI_API_KEY } : {}),
56
+ },
57
+ });
58
+ this.proc = proc;
59
+ const onLine = (chunk) => {
60
+ const text = chunk.toString();
61
+ // Banner format: "opencode server listening on http://127.0.0.1:NNNN"
62
+ const m = text.match(/listening on https?:\/\/[^:]+:(\d+)/);
63
+ if (m && m[1]) {
64
+ this.port = Number(m[1]);
65
+ proc.stdout?.off('data', onLine);
66
+ proc.stderr?.off('data', onLine);
67
+ // Start the SSE multiplexer in the background once the port is known.
68
+ void this.startEventStream();
69
+ resolve();
70
+ }
71
+ };
72
+ proc.stdout?.on('data', onLine);
73
+ proc.stderr?.on('data', onLine);
74
+ proc.on('error', (err) => {
75
+ if (this.port)
76
+ return; // already resolved
77
+ reject(err);
78
+ });
79
+ proc.on('exit', (code, signal) => {
80
+ const wasReady = !!this.port;
81
+ this.port = null;
82
+ this.proc = null;
83
+ this.startPromise = null;
84
+ const ac = this.sseAbort;
85
+ this.sseAbort = null;
86
+ ac?.abort();
87
+ if (!wasReady) {
88
+ reject(new Error(`opencode serve exited before ready (code=${code} signal=${signal})`));
89
+ }
90
+ if (!this.shuttingDown) {
91
+ console.warn(`[openCode:server] exited unexpectedly code=${code} signal=${signal}`);
92
+ // Synthesise a "disposed" event so per-session consumers can give
93
+ // up cleanly instead of waiting forever.
94
+ this.broadcast({
95
+ id: `local-${Date.now()}`,
96
+ type: 'server.disposed',
97
+ properties: {},
98
+ });
99
+ }
100
+ });
101
+ // Spawn timeout — the docs claim < 1s start, but cold-start with
102
+ // many plugins can take longer. 15s is generous.
103
+ setTimeout(() => {
104
+ if (!this.port) {
105
+ reject(new Error('opencode serve did not report a port within 15s'));
106
+ try {
107
+ proc.kill('SIGTERM');
108
+ }
109
+ catch { /* ignore */ }
110
+ }
111
+ }, 15_000);
112
+ });
113
+ }
114
+ /** Connect to /event as a long-lived SSE stream. Auto-reconnects until shutdown. */
115
+ async startEventStream() {
116
+ if (!this.port)
117
+ return;
118
+ const ac = new AbortController();
119
+ this.sseAbort = ac;
120
+ const baseUrl = `http://127.0.0.1:${this.port}`;
121
+ while (!ac.signal.aborted && this.port) {
122
+ try {
123
+ const resp = await fetch(`${baseUrl}/event`, { signal: ac.signal });
124
+ if (!resp.ok || !resp.body) {
125
+ throw new Error(`/event returned ${resp.status}`);
126
+ }
127
+ const reader = resp.body.getReader();
128
+ const decoder = new TextDecoder();
129
+ let buffer = '';
130
+ while (!ac.signal.aborted) {
131
+ const { value, done } = await reader.read();
132
+ if (done)
133
+ break;
134
+ buffer += decoder.decode(value, { stream: true });
135
+ // SSE frames are separated by blank lines; each `data:` line is
136
+ // JSON. Multi-line `data:` blocks are joined with '\n'.
137
+ let idx;
138
+ while ((idx = buffer.indexOf('\n\n')) !== -1) {
139
+ const frame = buffer.slice(0, idx);
140
+ buffer = buffer.slice(idx + 2);
141
+ this.handleSseFrame(frame);
142
+ }
143
+ }
144
+ }
145
+ catch (err) {
146
+ if (ac.signal.aborted)
147
+ return;
148
+ console.warn('[openCode:server] SSE stream error, retrying in 1s:', err);
149
+ await new Promise((r) => setTimeout(r, 1_000));
150
+ }
151
+ }
152
+ }
153
+ handleSseFrame(frame) {
154
+ const dataLines = [];
155
+ for (const line of frame.split('\n')) {
156
+ if (line.startsWith('data:'))
157
+ dataLines.push(line.slice(5).trimStart());
158
+ }
159
+ if (dataLines.length === 0)
160
+ return;
161
+ try {
162
+ const event = JSON.parse(dataLines.join('\n'));
163
+ this.broadcast(event);
164
+ }
165
+ catch {
166
+ // Non-JSON keep-alive frames etc. — ignore.
167
+ }
168
+ }
169
+ broadcast(event) {
170
+ for (const listener of this.globalListeners) {
171
+ try {
172
+ listener(event);
173
+ }
174
+ catch (err) {
175
+ console.error('[openCode:server] global listener error', err);
176
+ }
177
+ }
178
+ const sid = event.properties?.sessionID;
179
+ if (typeof sid === 'string') {
180
+ const set = this.listeners.get(sid);
181
+ if (set)
182
+ for (const l of set) {
183
+ try {
184
+ l(event);
185
+ }
186
+ catch (err) {
187
+ console.error('[openCode:server] session listener error', err);
188
+ }
189
+ }
190
+ }
191
+ }
192
+ /** Subscribe to events for one session. Returns a disposer. */
193
+ subscribe(sessionID, listener) {
194
+ let set = this.listeners.get(sessionID);
195
+ if (!set) {
196
+ set = new Set();
197
+ this.listeners.set(sessionID, set);
198
+ }
199
+ set.add(listener);
200
+ return () => {
201
+ const s = this.listeners.get(sessionID);
202
+ if (!s)
203
+ return;
204
+ s.delete(listener);
205
+ if (s.size === 0)
206
+ this.listeners.delete(sessionID);
207
+ };
208
+ }
209
+ /** Subscribe to every event (used by tests / debugging). */
210
+ subscribeAll(listener) {
211
+ this.globalListeners.add(listener);
212
+ return () => { this.globalListeners.delete(listener); };
213
+ }
214
+ // ── REST helpers ───────────────────────────────────────────────────────────
215
+ async req(path, init = {}) {
216
+ const { baseUrl } = await this.ensureRunning();
217
+ const resp = await fetch(`${baseUrl}${path}`, {
218
+ ...init,
219
+ headers: {
220
+ 'content-type': 'application/json',
221
+ ...(init.headers ?? {}),
222
+ },
223
+ });
224
+ if (!resp.ok) {
225
+ let body = '';
226
+ try {
227
+ body = await resp.text();
228
+ }
229
+ catch { /* ignore */ }
230
+ throw new Error(`opencode ${init.method ?? 'GET'} ${path} failed: ${resp.status} ${body.slice(0, 500)}`);
231
+ }
232
+ if (resp.status === 204)
233
+ return undefined;
234
+ return (await resp.json());
235
+ }
236
+ async createSession(opts) {
237
+ const body = { directory: opts.directory };
238
+ if (opts.title)
239
+ body.title = opts.title;
240
+ if (opts.agent)
241
+ body.agent = opts.agent;
242
+ return this.req('/session', {
243
+ method: 'POST',
244
+ body: JSON.stringify(body),
245
+ });
246
+ }
247
+ async deleteSession(sessionID) {
248
+ await this.req(`/session/${encodeURIComponent(sessionID)}`, { method: 'DELETE' });
249
+ }
250
+ async sendPromptAsync(sessionID, opts) {
251
+ const body = {
252
+ model: { providerID: opts.model.providerID, modelID: opts.model.modelID },
253
+ parts: [{ type: 'text', text: opts.text }],
254
+ };
255
+ if (opts.messageID)
256
+ body.messageID = opts.messageID;
257
+ if (opts.agent)
258
+ body.agent = opts.agent;
259
+ if (opts.variant)
260
+ body.variant = opts.variant;
261
+ if (opts.system)
262
+ body.system = opts.system;
263
+ await this.req(`/session/${encodeURIComponent(sessionID)}/prompt_async`, {
264
+ method: 'POST',
265
+ body: JSON.stringify(body),
266
+ });
267
+ }
268
+ /** Fetch every message + part for a session via the REST API.
269
+ *
270
+ * Tool calls in opencode 1.14 are NOT pushed via SSE — only `message.part.delta`
271
+ * (text/reasoning), `session.status`, `session.diff`, and `session.idle` ever
272
+ * appear on `/event`. The authoritative list of tool parts (with `input`,
273
+ * `output`, `state.status`) lives only on `GET /session/{id}/message`.
274
+ *
275
+ * Shape:
276
+ * [{ info: { id, role, ... }, parts: [{ type: 'tool'|'text'|..., ... }] }]
277
+ */
278
+ async getMessages(sessionID) {
279
+ return this.req(`/session/${encodeURIComponent(sessionID)}/message`);
280
+ }
281
+ async abortSession(sessionID) {
282
+ try {
283
+ await this.req(`/session/${encodeURIComponent(sessionID)}/abort`, { method: 'POST' });
284
+ }
285
+ catch (err) {
286
+ // Aborting a session that's already idle returns 400 — tolerate it.
287
+ console.debug('[openCode:server] abort returned error (probably already idle)', err);
288
+ }
289
+ }
290
+ async replyPermission(requestID, reply) {
291
+ await this.req(`/permission/${encodeURIComponent(requestID)}/reply`, {
292
+ method: 'POST',
293
+ body: JSON.stringify({ reply }),
294
+ });
295
+ }
296
+ /** Shutdown the server. Idempotent.
297
+ *
298
+ * Awaits actual child exit. Without this, callers (notably the daemon's
299
+ * SIGTERM handler) `process.exit()` the moment SIGTERM was *sent*, leaving
300
+ * the opencode child reparented to PID 1 — that's how we ended up with 8
301
+ * orphaned `opencode serve` processes. */
302
+ async shutdown() {
303
+ this.shuttingDown = true;
304
+ this.sseAbort?.abort();
305
+ this.sseAbort = null;
306
+ const proc = this.proc;
307
+ this.proc = null;
308
+ this.port = null;
309
+ this.startPromise = null;
310
+ this.listeners.clear();
311
+ this.globalListeners.clear();
312
+ if (!proc || proc.killed || proc.exitCode !== null)
313
+ return;
314
+ // Polite HTTP dispose first (may quietly fail if server already gone).
315
+ try {
316
+ await this.req('/global/dispose', { method: 'POST' }).catch(() => { });
317
+ }
318
+ catch { /* ignore */ }
319
+ if (proc.exitCode !== null)
320
+ return;
321
+ const exited = new Promise((resolve) => proc.once('exit', () => resolve()));
322
+ try {
323
+ proc.kill('SIGTERM');
324
+ }
325
+ catch { /* ignore */ }
326
+ const killer = setTimeout(() => {
327
+ if (proc.exitCode === null) {
328
+ try {
329
+ proc.kill('SIGKILL');
330
+ }
331
+ catch { /* ignore */ }
332
+ }
333
+ }, 3_000);
334
+ await exited;
335
+ clearTimeout(killer);
336
+ }
337
+ /** @internal for tests */
338
+ get _port() { return this.port; }
339
+ }
340
+ let _instance = null;
341
+ export function getOpenCodeServer() {
342
+ if (!_instance)
343
+ _instance = new OpenCodeServer();
344
+ return _instance;
345
+ }
346
+ /** Test-only: blow away the singleton (won't shut down a running server). */
347
+ export function _resetOpenCodeServer() {
348
+ _instance = null;
349
+ }
350
+ //# sourceMappingURL=openCodeServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openCodeServer.js","sourceRoot":"","sources":["../../src/ai/openCodeServer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ (version 1)
2
+ (deny default)
3
+ (import "system.sb")
4
+
5
+ ;; Allow all file reads
6
+ (allow file-read*)
7
+
8
+ ;; Deny all file writes by default
9
+ (deny file-write*)
10
+
11
+ ;; Allow writes ONLY within the project directory (excluding .git/)
12
+ (allow file-write* (subpath (param "CWD")))
13
+ (deny file-write* (subpath (string-append (param "CWD") "/.git")))
14
+
15
+ ;; Allow process execution
16
+ (allow process-fork)
17
+ (allow process-exec)
18
+
19
+ ;; Allow signals to own process
20
+ (allow signal (target self))
21
+
22
+ ;; Allow sysctl reads (needed by many tools)
23
+ (allow sysctl-read)
24
+
25
+ ;; Allow network access (builds may need to fetch dependencies)
26
+ (allow network*)
@@ -1,4 +1,4 @@
1
- import type { AgentId, Attachment, CardEvent, CardStreamEnd, ContextUsageBreakdown } from '@sumicom/quicksave-shared';
1
+ import type { AgentId, Attachment, CardEvent, CardStreamEnd, ContextUsageBreakdown, SessionQueueState } from '@sumicom/quicksave-shared';
2
2
  import type { StreamCardBuilder } from './cardBuilder.js';
3
3
  export declare const CLAUDE_PERMISSION_MODES: readonly ["default", "acceptEdits", "bypassPermissions", "plan", "auto"];
4
4
  export declare const CODEX_PERMISSION_PRESETS: readonly ["read-only", "default", "auto-review", "full-access"];
@@ -15,9 +15,24 @@ export type ProviderHistoryMode = 'claude-jsonl' | 'memory';
15
15
  /** Represents a running provider session. */
16
16
  export interface ProviderSession {
17
17
  sendUserMessage(prompt: string, attachments?: readonly Attachment[]): void;
18
+ interruptThenSendUserMessage?(prompt: string, attachments?: readonly Attachment[]): void;
18
19
  interrupt(): void;
19
20
  kill(): void;
20
21
  readonly alive: boolean;
22
+ /** Optional — `terminalManager` terminal id when this provider owns a PTY
23
+ * the PWA should render alongside the structured card stream. Only the
24
+ * `claude-terminal` provider sets this today. SessionManager copies it into
25
+ * the session config so the PWA can pick it up via the existing
26
+ * config-updated channel. */
27
+ readonly terminalId?: string;
28
+ /** Optional in-memory queue snapshot for provider sessions that serialize
29
+ * user turns instead of accepting mid-turn input directly. */
30
+ getQueueState?(): SessionQueueState | null;
31
+ /** Optional — inject the provider's queued user message into the current
32
+ * active turn instead of waiting for the next turn. */
33
+ steerQueuedMessage?(opts?: {
34
+ interruptCurrentTurn?: boolean;
35
+ }): Promise<boolean> | boolean;
21
36
  /** Optional — ask the provider for a breakdown of current context window
22
37
  * usage. Only supported by the Claude Code CLI (via `get_context_usage`
23
38
  * control_request). Returns null on providers that don't support it. */
@@ -56,6 +71,8 @@ export interface ProviderCallbacks {
56
71
  * resets the 5-minute (or 1h) cache TTL on the server. SessionManager uses
57
72
  * this to anchor the PWA's countdown without waiting for the turn to end. */
58
73
  onCacheTouch?(sessionId: string): void;
74
+ /** Fired when a provider's in-memory user-message queue changes. */
75
+ onQueueStateChange?(sessionId: string): void;
59
76
  onModelDetected(model: string): void;
60
77
  /** Fired when the underlying provider process has fully exited. SessionManager
61
78
  * uses this to remove the session from its in-memory map and emit
@@ -91,6 +108,10 @@ export interface StartSessionOpts {
91
108
  * hook consults to auto-approve every tool. Presence of the file means bypass
92
109
  * is active. Only ClaudeCliProvider uses it; other providers ignore it. */
93
110
  bypassFlagPath?: string;
111
+ /** Correlation id minted by the daemon at spawn. Threaded into the sandbox
112
+ * MCP server's `--corr` so it can locate this session's registry entry
113
+ * before the real sessionId exists. See `sandboxMcp.ts` / `sandboxMcpStdio.ts`. */
114
+ mcpCorrId?: string;
94
115
  }
95
116
  export interface ResumeSessionOpts {
96
117
  sessionId: string;
@@ -105,10 +126,39 @@ export interface ResumeSessionOpts {
105
126
  reasoningEffort?: string;
106
127
  contextWindow?: number;
107
128
  bypassFlagPath?: string;
129
+ /** See {@link StartSessionOpts.mcpCorrId}. On resume the stdio server also
130
+ * gets `--session-id`, so this is belt-and-suspenders for cold re-spawns. */
131
+ mcpCorrId?: string;
108
132
  }
133
+ export declare const DEFAULT_AGENT_LABELS: Record<AgentId, string>;
134
+ export declare function getAgentLabel(agentId: AgentId): string;
135
+ export interface AgentCapabilities {
136
+ hasApiKey: boolean;
137
+ hasCli: boolean;
138
+ hasPlugin: boolean;
139
+ supportsResume: boolean;
140
+ supportsSandbox: boolean;
141
+ supportsStreaming: boolean;
142
+ /** Opt-in only: true when attachments are forwarded into the provider turn. */
143
+ supportsAttachments?: true;
144
+ /** Positive list of attachment kinds the provider forwards. */
145
+ supportedAttachmentKinds?: Array<Attachment['kind']>;
146
+ }
147
+ export type ProbeResult = {
148
+ version?: string;
149
+ capabilities: AgentCapabilities;
150
+ models?: Array<{
151
+ id: string;
152
+ name: string;
153
+ }>;
154
+ };
109
155
  export interface CodingAgentProvider {
110
156
  readonly id: AgentId;
111
157
  readonly historyMode: ProviderHistoryMode;
158
+ /** Display name surfaced in handshake metadata and `agent:probe` responses.
159
+ * Optional so providers compile without metadata; the probe path falls
160
+ * back to {@link DEFAULT_AGENT_LABELS} when omitted. */
161
+ readonly label?: string;
112
162
  startSession(opts: StartSessionOpts, cardBuilder: StreamCardBuilder, callbacks: ProviderCallbacks): Promise<{
113
163
  sessionId: string;
114
164
  session: ProviderSession;
@@ -117,5 +167,8 @@ export interface CodingAgentProvider {
117
167
  sessionId: string;
118
168
  session: ProviderSession;
119
169
  }>;
170
+ /** Optional capability probe. Providers that omit it advertise only `id`
171
+ * and `label` in the `availableProviders` list (with zero capabilities). */
172
+ probeProvider?(): Promise<ProbeResult>;
120
173
  }
121
174
  //# sourceMappingURL=provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/ai/provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/ai/provider.ts"],"names":[],"mappings":"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"}
@@ -54,4 +54,14 @@ export function isFullAccessPermission(agentId, level) {
54
54
  ? level === 'full-access'
55
55
  : level === 'bypassPermissions';
56
56
  }
57
+ export const DEFAULT_AGENT_LABELS = {
58
+ 'claude-code': 'Claude Code',
59
+ 'claude-terminal': 'Claude (Terminal)',
60
+ 'codex': 'Codex',
61
+ 'opencode': 'OpenCode',
62
+ 'pi': 'Pi',
63
+ };
64
+ export function getAgentLabel(agentId) {
65
+ return DEFAULT_AGENT_LABELS[agentId] ?? agentId;
66
+ }
57
67
  //# sourceMappingURL=provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/ai/provider.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,SAAS;IACT,aAAa;IACb,mBAAmB;IACnB,MAAM;IACN,MAAM;CACE,CAAC;AAEX,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,WAAW;IACX,SAAS;IACT,aAAa;IACb,aAAa;CACL,CAAC;AAMX,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,uBAA6C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACrG,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,wBAA8C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACtG,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,OAAgB;IAC7D,OAAO,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,OAAgB,EAAE,KAAc;IAChF,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO,uBAAuB,CAAC,KAAK,CAAC;eAChC,KAAK,KAAK,mBAAmB;eAC7B,KAAK,KAAK,MAAM;eAChB,KAAK,KAAK,MAAM;eAChB,KAAK,KAAK,aAAa,CAAC;IAC/B,CAAC;IACD,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,OAAgB,EAChB,KAAc;IAEd,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,IAAI,uBAAuB,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACjD,2EAA2E;QAC3E,IAAI,KAAK,KAAK,mBAAmB;YAAE,OAAO,aAAa,CAAC;QACxD,IAAI,KAAK,KAAK,MAAM;YAAE,OAAO,WAAW,CAAC;QACzC,IAAI,KAAK,KAAK,MAAM;YAAE,OAAO,aAAa,CAAC;QAC3C,IAAI,KAAK,KAAK,aAAa;YAAE,OAAO,SAAS,CAAC;QAC9C,OAAO,8BAA8B,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,sBAAsB,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAChD,OAAO,8BAA8B,CAAC,OAAO,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAgB,EAAE,KAAsB;IAC7E,OAAO,OAAO,KAAK,OAAO;QACxB,CAAC,CAAC,KAAK,KAAK,aAAa;QACzB,CAAC,CAAC,KAAK,KAAK,mBAAmB,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/ai/provider.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,SAAS;IACT,aAAa;IACb,mBAAmB;IACnB,MAAM;IACN,MAAM;CACE,CAAC;AAEX,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,WAAW;IACX,SAAS;IACT,aAAa;IACb,aAAa;CACL,CAAC;AAMX,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,uBAA6C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACrG,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,wBAA8C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACtG,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,OAAgB;IAC7D,OAAO,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,OAAgB,EAAE,KAAc;IAChF,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO,uBAAuB,CAAC,KAAK,CAAC;eAChC,KAAK,KAAK,mBAAmB;eAC7B,KAAK,KAAK,MAAM;eAChB,KAAK,KAAK,MAAM;eAChB,KAAK,KAAK,aAAa,CAAC;IAC/B,CAAC;IACD,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,OAAgB,EAChB,KAAc;IAEd,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,IAAI,uBAAuB,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACjD,2EAA2E;QAC3E,IAAI,KAAK,KAAK,mBAAmB;YAAE,OAAO,aAAa,CAAC;QACxD,IAAI,KAAK,KAAK,MAAM;YAAE,OAAO,WAAW,CAAC;QACzC,IAAI,KAAK,KAAK,MAAM;YAAE,OAAO,aAAa,CAAC;QAC3C,IAAI,KAAK,KAAK,aAAa;YAAE,OAAO,SAAS,CAAC;QAC9C,OAAO,8BAA8B,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,sBAAsB,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAChD,OAAO,8BAA8B,CAAC,OAAO,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAgB,EAAE,KAAsB;IAC7E,OAAO,OAAO,KAAK,OAAO;QACxB,CAAC,CAAC,KAAK,KAAK,aAAa;QACzB,CAAC,CAAC,KAAK,KAAK,mBAAmB,CAAC;AACpC,CAAC;AA2HD,MAAM,CAAC,MAAM,oBAAoB,GAA4B;IAC3D,aAAa,EAAE,aAAa;IAC5B,iBAAiB,EAAE,mBAAmB;IACtC,OAAO,EAAE,OAAO;IAChB,UAAU,EAAE,UAAU;IACtB,IAAI,EAAE,IAAI;CACX,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,OAAO,oBAAoB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC;AAClD,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { Attachment, SessionQueueState } from '@sumicom/quicksave-shared';
2
+ export interface QueuedUserPrompt {
3
+ prompt: string;
4
+ attachments?: readonly Attachment[];
5
+ }
6
+ export declare function previewQueuedPrompt(prompt: string): string;
7
+ export declare function queueStateFor(queued: readonly QueuedUserPrompt[], canInterruptCurrentTurn: boolean): SessionQueueState | null;
8
+ //# sourceMappingURL=queuedUserPrompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queuedUserPrompts.d.ts","sourceRoot":"","sources":["../../src/ai/queuedUserPrompts.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAI/E,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;CACrC;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAK1D;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,gBAAgB,EAAE,EACnC,uBAAuB,EAAE,OAAO,GAC/B,iBAAiB,GAAG,IAAI,CAS1B"}