@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,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*)
|
package/dist/ai/provider.d.ts
CHANGED
|
@@ -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":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/ai/provider.ts"],"names":[],"mappings":"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"}
|
package/dist/ai/provider.js
CHANGED
|
@@ -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
|
package/dist/ai/provider.js.map
CHANGED
|
@@ -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"}
|