@openchamber/sdk 1.23.2-preview.1
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/API.md +529 -0
- package/DOCUMENTATION.md +81 -0
- package/GUEST_SERVICES.md +166 -0
- package/LICENSE +21 -0
- package/README.md +186 -0
- package/dist/api-version.d.ts +6 -0
- package/dist/api-version.js +5 -0
- package/dist/contract.d.ts +471 -0
- package/dist/contract.js +256 -0
- package/dist/host-version.d.ts +16 -0
- package/dist/host-version.js +50 -0
- package/dist/host.d.ts +101 -0
- package/dist/host.js +606 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +7 -0
- package/dist/manifest.d.ts +298 -0
- package/dist/manifest.js +224 -0
- package/dist/parse.d.ts +279 -0
- package/dist/parse.js +379 -0
- package/dist/protocol.d.ts +1092 -0
- package/dist/protocol.js +450 -0
- package/dist/schemas.d.ts +4 -0
- package/dist/schemas.js +6 -0
- package/dist/ui/badge.d.ts +10 -0
- package/dist/ui/badge.js +26 -0
- package/dist/ui/banner.d.ts +13 -0
- package/dist/ui/banner.js +48 -0
- package/dist/ui/button.d.ts +14 -0
- package/dist/ui/button.js +49 -0
- package/dist/ui/checkbox.d.ts +12 -0
- package/dist/ui/checkbox.js +45 -0
- package/dist/ui/dom.d.ts +15 -0
- package/dist/ui/dom.js +60 -0
- package/dist/ui/empty.d.ts +11 -0
- package/dist/ui/empty.js +44 -0
- package/dist/ui/field.d.ts +18 -0
- package/dist/ui/field.js +49 -0
- package/dist/ui/icons.d.ts +10 -0
- package/dist/ui/icons.js +23 -0
- package/dist/ui/index.d.ts +35 -0
- package/dist/ui/index.js +17 -0
- package/dist/ui/list.d.ts +26 -0
- package/dist/ui/list.js +90 -0
- package/dist/ui/menu.d.ts +20 -0
- package/dist/ui/menu.js +111 -0
- package/dist/ui/navigation.d.ts +18 -0
- package/dist/ui/navigation.js +38 -0
- package/dist/ui/option.d.ts +16 -0
- package/dist/ui/option.js +35 -0
- package/dist/ui/popup.d.ts +5 -0
- package/dist/ui/popup.js +43 -0
- package/dist/ui/progress.d.ts +11 -0
- package/dist/ui/progress.js +44 -0
- package/dist/ui/search.d.ts +11 -0
- package/dist/ui/search.js +62 -0
- package/dist/ui/select.d.ts +22 -0
- package/dist/ui/select.js +164 -0
- package/dist/ui/separator.d.ts +6 -0
- package/dist/ui/separator.js +26 -0
- package/dist/ui/spinner.d.ts +8 -0
- package/dist/ui/spinner.js +29 -0
- package/dist/ui/style.d.ts +1 -0
- package/dist/ui/style.js +190 -0
- package/dist/ui/tabs.d.ts +15 -0
- package/dist/ui/tabs.js +61 -0
- package/dist/ui/text.d.ts +23 -0
- package/dist/ui/text.js +89 -0
- package/dist/ui/theme.d.ts +22 -0
- package/dist/ui/theme.js +69 -0
- package/dist/workspace-schemas.d.ts +136 -0
- package/dist/workspace-schemas.js +44 -0
- package/dist/workspace.d.ts +109 -0
- package/dist/workspace.js +4 -0
- package/package.json +55 -0
- package/scripts/bundle-guest.ts +44 -0
package/dist/host.js
ADDED
|
@@ -0,0 +1,606 @@
|
|
|
1
|
+
import { OPENCHAMBER_SDK_API_VERSION, OPENCHAMBER_SDK_CHANNEL } from "./api-version.js";
|
|
2
|
+
import { GUEST_STORAGE_KEY_MAX, GUEST_STORAGE_VALUE_BYTES } from "./workspace.js";
|
|
3
|
+
import { GUEST_FILE_CONTENT_MAX, GUEST_FILE_PATH_MAX, GUEST_GENERATE_OUTPUT_TOKENS_MAX, GUEST_GENERATE_PROMPT_MAX, GUEST_GENERATE_SYSTEM_MAX, GUEST_GENERATE_TIMEOUT_MS, GUEST_REQUEST_TIMEOUT_MS, GUEST_RESOLVE_ERROR_MAX, isGuestFilePath, isGuestRequestPath, clampAttachRequest, clampBadgeCount, clampPromptRequest, clampStartSessionRequest, readHostMessage, isGenerateResult, isFileListResult, isFileReadResult, isFileStatResult, isJsonValue, isFileWriteResult, isServiceStatusResult, isGuestRequestResult, isPromptResult, isStartSessionResult, } from "./contract.js";
|
|
4
|
+
export class HostRequestError extends Error {
|
|
5
|
+
code;
|
|
6
|
+
constructor(code, message) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = 'HostRequestError';
|
|
9
|
+
this.code = code;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
// The host drops a message its schema rejects without answering, so a bad
|
|
13
|
+
// path would otherwise surface only as HOST_TIMEOUT twenty seconds later.
|
|
14
|
+
const rejectBadPath = () => Promise.reject(new HostRequestError('BAD_PATH', 'Request path must start with "/" and stay on the declared origin.'));
|
|
15
|
+
const rejectBadFilePath = () => Promise.reject(new HostRequestError('BAD_PATH', `File path must be 1 to ${GUEST_FILE_PATH_MAX} characters without NUL or backslash.`));
|
|
16
|
+
const nextId = (n) => {
|
|
17
|
+
n.value += 1;
|
|
18
|
+
return `oc-${n.value}`;
|
|
19
|
+
};
|
|
20
|
+
export const connectHost = (options = {}) => {
|
|
21
|
+
const target = options.target ?? ('window' in globalThis ? window : null);
|
|
22
|
+
if (!target) {
|
|
23
|
+
throw new HostRequestError('HOST_UNAVAILABLE', 'No window. connectHost runs in a browser frame.');
|
|
24
|
+
}
|
|
25
|
+
const acceptSource = options.acceptSource ?? ((source) => source === target.parent);
|
|
26
|
+
const requestTimeoutMs = options.requestTimeoutMs ?? GUEST_REQUEST_TIMEOUT_MS;
|
|
27
|
+
const readyListeners = new Set();
|
|
28
|
+
const directoryListeners = new Set();
|
|
29
|
+
const sessionListeners = new Set();
|
|
30
|
+
const lifecycleListeners = new Set();
|
|
31
|
+
const connectionListeners = new Set();
|
|
32
|
+
const settingsListeners = new Set();
|
|
33
|
+
const itemListeners = new Set();
|
|
34
|
+
let resolveHandler = null;
|
|
35
|
+
const pending = new Map();
|
|
36
|
+
const workspaceListeners = new Map();
|
|
37
|
+
let disposed = false;
|
|
38
|
+
const ids = { value: 0 };
|
|
39
|
+
let lastReady = null;
|
|
40
|
+
let lastLifecycle = null;
|
|
41
|
+
const lifecycleFromSession = (session) => {
|
|
42
|
+
if (!session)
|
|
43
|
+
return null;
|
|
44
|
+
return {
|
|
45
|
+
sessionId: session.id,
|
|
46
|
+
phase: session.busy ? 'started' : 'completed',
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
const post = (message) => {
|
|
50
|
+
target.parent.postMessage(message, '*');
|
|
51
|
+
};
|
|
52
|
+
// One listener that throws must not starve the ones after it; the error
|
|
53
|
+
// surfaces on the console the way an event handler's would.
|
|
54
|
+
const emit = (listeners, value) => {
|
|
55
|
+
for (const listener of listeners) {
|
|
56
|
+
try {
|
|
57
|
+
listener(value);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
console.error(error);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
const onMessage = (event) => {
|
|
65
|
+
if (!(event instanceof MessageEvent))
|
|
66
|
+
return;
|
|
67
|
+
if (!acceptSource(event.source))
|
|
68
|
+
return;
|
|
69
|
+
const message = readHostMessage(event.data);
|
|
70
|
+
if (!message)
|
|
71
|
+
return;
|
|
72
|
+
if (message.type === 'workspace') {
|
|
73
|
+
const listener = workspaceListeners.get(message.payload.subscriptionId);
|
|
74
|
+
if (listener)
|
|
75
|
+
emit([listener], message.payload.snapshot);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (message.type === 'ready') {
|
|
79
|
+
lastReady = message.payload;
|
|
80
|
+
lastLifecycle = lifecycleFromSession(message.payload.session);
|
|
81
|
+
emit(readyListeners, message.payload);
|
|
82
|
+
emit(directoryListeners, message.payload.directory);
|
|
83
|
+
emit(sessionListeners, message.payload.session);
|
|
84
|
+
if (lastLifecycle) {
|
|
85
|
+
emit(lifecycleListeners, lastLifecycle);
|
|
86
|
+
}
|
|
87
|
+
emit(connectionListeners, message.payload.connection);
|
|
88
|
+
emit(settingsListeners, message.payload.settings);
|
|
89
|
+
emit(itemListeners, message.payload.item);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (message.type === 'directory') {
|
|
93
|
+
if (lastReady) {
|
|
94
|
+
lastReady = { ...lastReady, directory: message.payload.directory };
|
|
95
|
+
}
|
|
96
|
+
emit(directoryListeners, message.payload.directory);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
if (message.type === 'session') {
|
|
100
|
+
if (lastReady) {
|
|
101
|
+
lastReady = { ...lastReady, session: message.payload.session };
|
|
102
|
+
}
|
|
103
|
+
if (!message.payload.session) {
|
|
104
|
+
lastLifecycle = null;
|
|
105
|
+
}
|
|
106
|
+
else if (lastLifecycle?.sessionId !== message.payload.session.id) {
|
|
107
|
+
lastLifecycle = lifecycleFromSession(message.payload.session);
|
|
108
|
+
}
|
|
109
|
+
emit(sessionListeners, message.payload.session);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (message.type === 'session-lifecycle') {
|
|
113
|
+
lastLifecycle = message.payload;
|
|
114
|
+
emit(lifecycleListeners, message.payload);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (message.type === 'connection') {
|
|
118
|
+
if (lastReady) {
|
|
119
|
+
lastReady = { ...lastReady, connection: message.payload.connection };
|
|
120
|
+
}
|
|
121
|
+
emit(connectionListeners, message.payload.connection);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
if (message.type === 'settings') {
|
|
125
|
+
if (lastReady) {
|
|
126
|
+
lastReady = { ...lastReady, settings: message.payload.settings };
|
|
127
|
+
}
|
|
128
|
+
emit(settingsListeners, message.payload.settings);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (message.type === 'item') {
|
|
132
|
+
if (lastReady) {
|
|
133
|
+
lastReady = { ...lastReady, item: message.payload.item };
|
|
134
|
+
}
|
|
135
|
+
emit(itemListeners, message.payload.item);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (message.type === 'resolve') {
|
|
139
|
+
const answer = (payload) => {
|
|
140
|
+
post({
|
|
141
|
+
channel: OPENCHAMBER_SDK_CHANNEL,
|
|
142
|
+
v: OPENCHAMBER_SDK_API_VERSION,
|
|
143
|
+
type: 'resolve-result',
|
|
144
|
+
id: message.id,
|
|
145
|
+
payload,
|
|
146
|
+
});
|
|
147
|
+
};
|
|
148
|
+
const handler = resolveHandler;
|
|
149
|
+
if (!handler) {
|
|
150
|
+
answer({ error: 'This extension does not resolve commands.' });
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
Promise.resolve()
|
|
154
|
+
.then(() => handler(message.payload))
|
|
155
|
+
.then((item) => answer({ item: item ? clampAttachRequest(item) : null }), (error) => {
|
|
156
|
+
const text = (error instanceof Error ? error.message : String(error)).trim();
|
|
157
|
+
answer({ error: (text || 'Command failed.').slice(0, GUEST_RESOLVE_ERROR_MAX) });
|
|
158
|
+
});
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
const waiter = pending.get(message.id);
|
|
162
|
+
if (!waiter)
|
|
163
|
+
return;
|
|
164
|
+
clearTimeout(waiter.timer);
|
|
165
|
+
pending.delete(message.id);
|
|
166
|
+
if (message.ok) {
|
|
167
|
+
waiter.resolve(message.payload);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
waiter.reject(new HostRequestError(message.code, message.error));
|
|
171
|
+
};
|
|
172
|
+
target.addEventListener('message', onMessage);
|
|
173
|
+
post({
|
|
174
|
+
channel: OPENCHAMBER_SDK_CHANNEL,
|
|
175
|
+
v: OPENCHAMBER_SDK_API_VERSION,
|
|
176
|
+
type: 'hello',
|
|
177
|
+
});
|
|
178
|
+
const send = (message, timeoutMs = requestTimeoutMs) => {
|
|
179
|
+
if (disposed || target.parent === target) {
|
|
180
|
+
return Promise.reject(new HostRequestError('HOST_UNAVAILABLE', 'No host frame. This page is not in an iframe.'));
|
|
181
|
+
}
|
|
182
|
+
return new Promise((resolve, reject) => {
|
|
183
|
+
const timer = setTimeout(() => {
|
|
184
|
+
pending.delete(message.id);
|
|
185
|
+
reject(new HostRequestError('HOST_TIMEOUT', 'Host did not answer in time.'));
|
|
186
|
+
}, timeoutMs);
|
|
187
|
+
pending.set(message.id, { resolve, reject, timer });
|
|
188
|
+
post(message);
|
|
189
|
+
});
|
|
190
|
+
};
|
|
191
|
+
const request = (message) => (send(message).then(() => undefined));
|
|
192
|
+
const envelope = { channel: OPENCHAMBER_SDK_CHANNEL, v: OPENCHAMBER_SDK_API_VERSION };
|
|
193
|
+
const requireIdentity = (value, maximum = 1024) => {
|
|
194
|
+
if (!value.trim() || value.length > maximum)
|
|
195
|
+
throw new HostRequestError('HOST_REJECTED', `Identity must contain 1 to ${maximum} characters.`);
|
|
196
|
+
};
|
|
197
|
+
const readWorkspace = async (query) => {
|
|
198
|
+
if (query.kind !== 'projects')
|
|
199
|
+
requireIdentity(query.projectId);
|
|
200
|
+
const result = await send({ ...envelope, type: 'workspace-read', id: nextId(ids), payload: query });
|
|
201
|
+
if (!result || !('kind' in result) || !('state' in result) || result.kind !== query.kind) {
|
|
202
|
+
throw new HostRequestError('HOST_REJECTED', 'Host did not return workspace data.');
|
|
203
|
+
}
|
|
204
|
+
return result;
|
|
205
|
+
};
|
|
206
|
+
const subscribeWorkspace = async (query, listener) => {
|
|
207
|
+
if (query.kind !== 'projects')
|
|
208
|
+
requireIdentity(query.projectId);
|
|
209
|
+
const subscriptionId = nextId(ids);
|
|
210
|
+
workspaceListeners.set(subscriptionId, listener);
|
|
211
|
+
try {
|
|
212
|
+
await request({ ...envelope, type: 'workspace-subscribe', id: nextId(ids), payload: { subscriptionId, query } });
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
workspaceListeners.delete(subscriptionId);
|
|
216
|
+
if (!disposed)
|
|
217
|
+
post({ ...envelope, type: 'workspace-unsubscribe', id: nextId(ids), payload: { subscriptionId } });
|
|
218
|
+
throw error;
|
|
219
|
+
}
|
|
220
|
+
return () => {
|
|
221
|
+
if (!workspaceListeners.delete(subscriptionId) || disposed)
|
|
222
|
+
return;
|
|
223
|
+
post({ ...envelope, type: 'workspace-unsubscribe', id: nextId(ids), payload: { subscriptionId } });
|
|
224
|
+
};
|
|
225
|
+
};
|
|
226
|
+
const storage = async (payload) => {
|
|
227
|
+
if ('key' in payload && (payload.key.length === 0 || payload.key.length > GUEST_STORAGE_KEY_MAX)) {
|
|
228
|
+
throw new HostRequestError('HOST_REJECTED', 'Storage key must contain 1 to 128 characters.');
|
|
229
|
+
}
|
|
230
|
+
if (payload.op === 'set' && !isJsonValue(payload.value)) {
|
|
231
|
+
throw new HostRequestError('HOST_REJECTED', 'Storage values must be JSON.');
|
|
232
|
+
}
|
|
233
|
+
if (payload.op === 'set' && new TextEncoder().encode(JSON.stringify(payload.value)).length > GUEST_STORAGE_VALUE_BYTES) {
|
|
234
|
+
throw new HostRequestError('HOST_REJECTED', 'Storage value exceeds 64 KiB.');
|
|
235
|
+
}
|
|
236
|
+
const result = await send({ ...envelope, type: 'storage', id: nextId(ids), payload });
|
|
237
|
+
if (!result || !('storage' in result) || result.op !== payload.op)
|
|
238
|
+
throw new HostRequestError('HOST_REJECTED', 'Host did not return storage data.');
|
|
239
|
+
return result;
|
|
240
|
+
};
|
|
241
|
+
return {
|
|
242
|
+
listProjects: async () => {
|
|
243
|
+
const result = await readWorkspace({ kind: 'projects' });
|
|
244
|
+
if (result.kind !== 'projects')
|
|
245
|
+
throw new HostRequestError('HOST_REJECTED', 'Expected projects.');
|
|
246
|
+
return result;
|
|
247
|
+
},
|
|
248
|
+
listWorktrees: async (projectId) => {
|
|
249
|
+
const result = await readWorkspace({ kind: 'worktrees', projectId });
|
|
250
|
+
if (result.kind !== 'worktrees')
|
|
251
|
+
throw new HostRequestError('HOST_REJECTED', 'Expected worktrees.');
|
|
252
|
+
return result;
|
|
253
|
+
},
|
|
254
|
+
listSessions: async (projectId) => {
|
|
255
|
+
const result = await readWorkspace({ kind: 'sessions', projectId });
|
|
256
|
+
if (result.kind !== 'sessions')
|
|
257
|
+
throw new HostRequestError('HOST_REJECTED', 'Expected sessions.');
|
|
258
|
+
return result;
|
|
259
|
+
},
|
|
260
|
+
onProjects: (listener) => subscribeWorkspace({ kind: 'projects' }, (snapshot) => { if (snapshot.kind === 'projects')
|
|
261
|
+
listener(snapshot); }),
|
|
262
|
+
onWorktrees: (projectId, listener) => subscribeWorkspace({ kind: 'worktrees', projectId }, (snapshot) => { if (snapshot.kind === 'worktrees')
|
|
263
|
+
listener(snapshot); }),
|
|
264
|
+
onSessions: (projectId, listener) => subscribeWorkspace({ kind: 'sessions', projectId }, (snapshot) => { if (snapshot.kind === 'sessions')
|
|
265
|
+
listener(snapshot); }),
|
|
266
|
+
openSession: async (sessionId) => {
|
|
267
|
+
requireIdentity(sessionId);
|
|
268
|
+
await request({ ...envelope, type: 'open-session', id: nextId(ids), payload: { sessionId } });
|
|
269
|
+
},
|
|
270
|
+
storage: {
|
|
271
|
+
get: async (key) => {
|
|
272
|
+
const result = await storage({ op: 'get', key });
|
|
273
|
+
return result.op === 'get' && result.found ? result.value : undefined;
|
|
274
|
+
},
|
|
275
|
+
set: async (key, value) => { await storage({ op: 'set', key, value }); },
|
|
276
|
+
delete: async (key) => { await storage({ op: 'delete', key }); },
|
|
277
|
+
keys: async () => {
|
|
278
|
+
const result = await storage({ op: 'keys' });
|
|
279
|
+
if (result.op !== 'keys')
|
|
280
|
+
throw new HostRequestError('HOST_REJECTED', 'Expected storage keys.');
|
|
281
|
+
return result.keys;
|
|
282
|
+
},
|
|
283
|
+
},
|
|
284
|
+
onReady: (listener) => {
|
|
285
|
+
readyListeners.add(listener);
|
|
286
|
+
if (lastReady)
|
|
287
|
+
listener(lastReady);
|
|
288
|
+
return () => {
|
|
289
|
+
readyListeners.delete(listener);
|
|
290
|
+
};
|
|
291
|
+
},
|
|
292
|
+
onDirectory: (listener) => {
|
|
293
|
+
directoryListeners.add(listener);
|
|
294
|
+
if (lastReady)
|
|
295
|
+
listener(lastReady.directory);
|
|
296
|
+
return () => {
|
|
297
|
+
directoryListeners.delete(listener);
|
|
298
|
+
};
|
|
299
|
+
},
|
|
300
|
+
onSession: (listener) => {
|
|
301
|
+
sessionListeners.add(listener);
|
|
302
|
+
if (lastReady)
|
|
303
|
+
listener(lastReady.session);
|
|
304
|
+
return () => {
|
|
305
|
+
sessionListeners.delete(listener);
|
|
306
|
+
};
|
|
307
|
+
},
|
|
308
|
+
onSessionLifecycle: (listener) => {
|
|
309
|
+
lifecycleListeners.add(listener);
|
|
310
|
+
if (lastLifecycle)
|
|
311
|
+
listener(lastLifecycle);
|
|
312
|
+
return () => {
|
|
313
|
+
lifecycleListeners.delete(listener);
|
|
314
|
+
};
|
|
315
|
+
},
|
|
316
|
+
onConnection: (listener) => {
|
|
317
|
+
connectionListeners.add(listener);
|
|
318
|
+
if (lastReady)
|
|
319
|
+
listener(lastReady.connection);
|
|
320
|
+
return () => {
|
|
321
|
+
connectionListeners.delete(listener);
|
|
322
|
+
};
|
|
323
|
+
},
|
|
324
|
+
onSettings: (listener) => {
|
|
325
|
+
settingsListeners.add(listener);
|
|
326
|
+
if (lastReady)
|
|
327
|
+
listener(lastReady.settings);
|
|
328
|
+
return () => {
|
|
329
|
+
settingsListeners.delete(listener);
|
|
330
|
+
};
|
|
331
|
+
},
|
|
332
|
+
onItem: (listener) => {
|
|
333
|
+
itemListeners.add(listener);
|
|
334
|
+
if (lastReady)
|
|
335
|
+
listener(lastReady.item);
|
|
336
|
+
return () => {
|
|
337
|
+
itemListeners.delete(listener);
|
|
338
|
+
};
|
|
339
|
+
},
|
|
340
|
+
onResolve: (handler) => {
|
|
341
|
+
resolveHandler = handler;
|
|
342
|
+
return () => {
|
|
343
|
+
if (resolveHandler === handler)
|
|
344
|
+
resolveHandler = null;
|
|
345
|
+
};
|
|
346
|
+
},
|
|
347
|
+
toast: (payload) => request({
|
|
348
|
+
channel: OPENCHAMBER_SDK_CHANNEL,
|
|
349
|
+
v: OPENCHAMBER_SDK_API_VERSION,
|
|
350
|
+
type: 'toast',
|
|
351
|
+
id: nextId(ids),
|
|
352
|
+
payload,
|
|
353
|
+
}),
|
|
354
|
+
openUrl: (url) => request({
|
|
355
|
+
channel: OPENCHAMBER_SDK_CHANNEL,
|
|
356
|
+
v: OPENCHAMBER_SDK_API_VERSION,
|
|
357
|
+
type: 'open-url',
|
|
358
|
+
id: nextId(ids),
|
|
359
|
+
payload: { url },
|
|
360
|
+
}),
|
|
361
|
+
openSurface: (surfaceId) => request({
|
|
362
|
+
channel: OPENCHAMBER_SDK_CHANNEL,
|
|
363
|
+
v: OPENCHAMBER_SDK_API_VERSION,
|
|
364
|
+
type: 'open-surface',
|
|
365
|
+
id: nextId(ids),
|
|
366
|
+
payload: { surfaceId },
|
|
367
|
+
}),
|
|
368
|
+
writeClipboard: (text) => request({
|
|
369
|
+
channel: OPENCHAMBER_SDK_CHANNEL,
|
|
370
|
+
v: OPENCHAMBER_SDK_API_VERSION,
|
|
371
|
+
type: 'clipboard-write',
|
|
372
|
+
id: nextId(ids),
|
|
373
|
+
payload: { text },
|
|
374
|
+
}),
|
|
375
|
+
compose: (payload) => request({
|
|
376
|
+
channel: OPENCHAMBER_SDK_CHANNEL,
|
|
377
|
+
v: OPENCHAMBER_SDK_API_VERSION,
|
|
378
|
+
type: 'compose',
|
|
379
|
+
id: nextId(ids),
|
|
380
|
+
payload,
|
|
381
|
+
}),
|
|
382
|
+
attach: (payload) => request({
|
|
383
|
+
channel: OPENCHAMBER_SDK_CHANNEL,
|
|
384
|
+
v: OPENCHAMBER_SDK_API_VERSION,
|
|
385
|
+
type: 'attach',
|
|
386
|
+
id: nextId(ids),
|
|
387
|
+
payload: clampAttachRequest(payload),
|
|
388
|
+
}),
|
|
389
|
+
startSession: async (payload) => {
|
|
390
|
+
if (payload.projectId !== undefined)
|
|
391
|
+
requireIdentity(payload.projectId);
|
|
392
|
+
const worktree = payload.worktree;
|
|
393
|
+
if (worktree && worktree !== true) {
|
|
394
|
+
if (worktree.kind === 'existing')
|
|
395
|
+
requireIdentity(worktree.directory);
|
|
396
|
+
else {
|
|
397
|
+
if (worktree.name !== undefined)
|
|
398
|
+
requireIdentity(worktree.name, 200);
|
|
399
|
+
if (worktree.baseBranch !== undefined)
|
|
400
|
+
requireIdentity(worktree.baseBranch, 200);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
const result = await send({
|
|
404
|
+
channel: OPENCHAMBER_SDK_CHANNEL,
|
|
405
|
+
v: OPENCHAMBER_SDK_API_VERSION,
|
|
406
|
+
type: 'start-session',
|
|
407
|
+
id: nextId(ids),
|
|
408
|
+
payload: clampStartSessionRequest(payload),
|
|
409
|
+
}, options.requestTimeoutMs ?? 180_000);
|
|
410
|
+
if (!isStartSessionResult(result)) {
|
|
411
|
+
throw new HostRequestError('HOST_REJECTED', 'Host did not return a session.');
|
|
412
|
+
}
|
|
413
|
+
return result;
|
|
414
|
+
},
|
|
415
|
+
prompt: (payload) => send({
|
|
416
|
+
channel: OPENCHAMBER_SDK_CHANNEL,
|
|
417
|
+
v: OPENCHAMBER_SDK_API_VERSION,
|
|
418
|
+
type: 'prompt',
|
|
419
|
+
id: nextId(ids),
|
|
420
|
+
payload: clampPromptRequest(payload),
|
|
421
|
+
}).then((result) => {
|
|
422
|
+
if (!isPromptResult(result)) {
|
|
423
|
+
throw new HostRequestError('HOST_REJECTED', 'Host did not return a prompt result.');
|
|
424
|
+
}
|
|
425
|
+
return result;
|
|
426
|
+
}),
|
|
427
|
+
sessionLink: (payload) => request({
|
|
428
|
+
channel: OPENCHAMBER_SDK_CHANNEL,
|
|
429
|
+
v: OPENCHAMBER_SDK_API_VERSION,
|
|
430
|
+
type: 'session-link',
|
|
431
|
+
id: nextId(ids),
|
|
432
|
+
payload: clampAttachRequest(payload),
|
|
433
|
+
}),
|
|
434
|
+
close: () => request({
|
|
435
|
+
channel: OPENCHAMBER_SDK_CHANNEL,
|
|
436
|
+
v: OPENCHAMBER_SDK_API_VERSION,
|
|
437
|
+
type: 'close',
|
|
438
|
+
id: nextId(ids),
|
|
439
|
+
}),
|
|
440
|
+
oauthStart: () => request({
|
|
441
|
+
channel: OPENCHAMBER_SDK_CHANNEL,
|
|
442
|
+
v: OPENCHAMBER_SDK_API_VERSION,
|
|
443
|
+
type: 'oauth-start',
|
|
444
|
+
id: nextId(ids),
|
|
445
|
+
}),
|
|
446
|
+
oauthDisconnect: () => request({
|
|
447
|
+
channel: OPENCHAMBER_SDK_CHANNEL,
|
|
448
|
+
v: OPENCHAMBER_SDK_API_VERSION,
|
|
449
|
+
type: 'oauth-disconnect',
|
|
450
|
+
id: nextId(ids),
|
|
451
|
+
}),
|
|
452
|
+
request: (payload) => (isGuestRequestPath(payload.path) ? send({
|
|
453
|
+
channel: OPENCHAMBER_SDK_CHANNEL,
|
|
454
|
+
v: OPENCHAMBER_SDK_API_VERSION,
|
|
455
|
+
type: 'request',
|
|
456
|
+
id: nextId(ids),
|
|
457
|
+
payload,
|
|
458
|
+
}) : rejectBadPath()).then((result) => {
|
|
459
|
+
if (!isGuestRequestResult(result)) {
|
|
460
|
+
throw new HostRequestError('HOST_REJECTED', 'Host request result was empty.');
|
|
461
|
+
}
|
|
462
|
+
return result;
|
|
463
|
+
}),
|
|
464
|
+
serviceRequest: (payload) => (isGuestRequestPath(payload.path) ? send({
|
|
465
|
+
channel: OPENCHAMBER_SDK_CHANNEL,
|
|
466
|
+
v: OPENCHAMBER_SDK_API_VERSION,
|
|
467
|
+
type: 'service-request',
|
|
468
|
+
id: nextId(ids),
|
|
469
|
+
payload,
|
|
470
|
+
}) : rejectBadPath()).then((result) => {
|
|
471
|
+
if (!isGuestRequestResult(result)) {
|
|
472
|
+
throw new HostRequestError('HOST_REJECTED', 'Host service request result was empty.');
|
|
473
|
+
}
|
|
474
|
+
return result;
|
|
475
|
+
}),
|
|
476
|
+
serviceStatus: () => send({
|
|
477
|
+
channel: OPENCHAMBER_SDK_CHANNEL,
|
|
478
|
+
v: OPENCHAMBER_SDK_API_VERSION,
|
|
479
|
+
type: 'service-status',
|
|
480
|
+
id: nextId(ids),
|
|
481
|
+
}).then((result) => {
|
|
482
|
+
if (!isServiceStatusResult(result)) {
|
|
483
|
+
throw new HostRequestError('HOST_REJECTED', 'Host did not return service status.');
|
|
484
|
+
}
|
|
485
|
+
return result;
|
|
486
|
+
}),
|
|
487
|
+
readFile: (path) => (isGuestFilePath(path) ? send({
|
|
488
|
+
channel: OPENCHAMBER_SDK_CHANNEL,
|
|
489
|
+
v: OPENCHAMBER_SDK_API_VERSION,
|
|
490
|
+
type: 'file-read',
|
|
491
|
+
id: nextId(ids),
|
|
492
|
+
payload: { path },
|
|
493
|
+
}) : rejectBadFilePath()).then((result) => {
|
|
494
|
+
if (!isFileReadResult(result)) {
|
|
495
|
+
throw new HostRequestError('HOST_REJECTED', 'Host did not return file content.');
|
|
496
|
+
}
|
|
497
|
+
return result;
|
|
498
|
+
}),
|
|
499
|
+
writeFile: (path, content) => {
|
|
500
|
+
if (!isGuestFilePath(path)) {
|
|
501
|
+
return rejectBadFilePath();
|
|
502
|
+
}
|
|
503
|
+
if (content.length > GUEST_FILE_CONTENT_MAX) {
|
|
504
|
+
return Promise.reject(new HostRequestError('FILE_TOO_LARGE', `Content is over ${GUEST_FILE_CONTENT_MAX} characters.`));
|
|
505
|
+
}
|
|
506
|
+
return send({
|
|
507
|
+
channel: OPENCHAMBER_SDK_CHANNEL,
|
|
508
|
+
v: OPENCHAMBER_SDK_API_VERSION,
|
|
509
|
+
type: 'file-write',
|
|
510
|
+
id: nextId(ids),
|
|
511
|
+
payload: { path, content },
|
|
512
|
+
}).then((result) => {
|
|
513
|
+
if (!isFileWriteResult(result)) {
|
|
514
|
+
throw new HostRequestError('HOST_REJECTED', 'Host did not confirm the write.');
|
|
515
|
+
}
|
|
516
|
+
return result;
|
|
517
|
+
});
|
|
518
|
+
},
|
|
519
|
+
listDir: (path) => (isGuestFilePath(path) ? send({
|
|
520
|
+
channel: OPENCHAMBER_SDK_CHANNEL,
|
|
521
|
+
v: OPENCHAMBER_SDK_API_VERSION,
|
|
522
|
+
type: 'file-list',
|
|
523
|
+
id: nextId(ids),
|
|
524
|
+
payload: { path },
|
|
525
|
+
}) : rejectBadFilePath()).then((result) => {
|
|
526
|
+
if (!isFileListResult(result)) {
|
|
527
|
+
throw new HostRequestError('HOST_REJECTED', 'Host did not return directory entries.');
|
|
528
|
+
}
|
|
529
|
+
return result;
|
|
530
|
+
}),
|
|
531
|
+
stat: (path) => (isGuestFilePath(path) ? send({
|
|
532
|
+
channel: OPENCHAMBER_SDK_CHANNEL,
|
|
533
|
+
v: OPENCHAMBER_SDK_API_VERSION,
|
|
534
|
+
type: 'file-stat',
|
|
535
|
+
id: nextId(ids),
|
|
536
|
+
payload: { path },
|
|
537
|
+
}) : rejectBadFilePath()).then((result) => {
|
|
538
|
+
if (!isFileStatResult(result)) {
|
|
539
|
+
throw new HostRequestError('HOST_REJECTED', 'Host did not return file status.');
|
|
540
|
+
}
|
|
541
|
+
return result;
|
|
542
|
+
}),
|
|
543
|
+
generate: (input) => {
|
|
544
|
+
const prompt = input.prompt.trim();
|
|
545
|
+
const system = input.system?.trim();
|
|
546
|
+
if (prompt.length === 0 || prompt.length > GUEST_GENERATE_PROMPT_MAX) {
|
|
547
|
+
return Promise.reject(new HostRequestError('HOST_REJECTED', `Prompt must be 1 to ${GUEST_GENERATE_PROMPT_MAX} characters.`));
|
|
548
|
+
}
|
|
549
|
+
if (system !== undefined && (system.length === 0 || system.length > GUEST_GENERATE_SYSTEM_MAX)) {
|
|
550
|
+
return Promise.reject(new HostRequestError('HOST_REJECTED', `System prompt must be 1 to ${GUEST_GENERATE_SYSTEM_MAX} characters.`));
|
|
551
|
+
}
|
|
552
|
+
const maxOutputTokens = input.maxOutputTokens === undefined
|
|
553
|
+
? undefined
|
|
554
|
+
: Math.min(GUEST_GENERATE_OUTPUT_TOKENS_MAX, Math.max(1, Math.floor(input.maxOutputTokens)));
|
|
555
|
+
if (maxOutputTokens !== undefined && !Number.isFinite(maxOutputTokens)) {
|
|
556
|
+
return Promise.reject(new HostRequestError('HOST_REJECTED', 'maxOutputTokens must be a number.'));
|
|
557
|
+
}
|
|
558
|
+
const payload = { prompt };
|
|
559
|
+
if (system !== undefined)
|
|
560
|
+
payload.system = system;
|
|
561
|
+
if (maxOutputTokens !== undefined)
|
|
562
|
+
payload.maxOutputTokens = maxOutputTokens;
|
|
563
|
+
// The model answers slower than any other host call, so this one waits longer.
|
|
564
|
+
return send({
|
|
565
|
+
channel: OPENCHAMBER_SDK_CHANNEL,
|
|
566
|
+
v: OPENCHAMBER_SDK_API_VERSION,
|
|
567
|
+
type: 'generate',
|
|
568
|
+
id: nextId(ids),
|
|
569
|
+
payload,
|
|
570
|
+
}, options.requestTimeoutMs ?? GUEST_GENERATE_TIMEOUT_MS).then((result) => {
|
|
571
|
+
if (!isGenerateResult(result)) {
|
|
572
|
+
throw new HostRequestError('HOST_REJECTED', 'Host did not return generated text.');
|
|
573
|
+
}
|
|
574
|
+
return result;
|
|
575
|
+
});
|
|
576
|
+
},
|
|
577
|
+
setBadge: (count) => request({
|
|
578
|
+
channel: OPENCHAMBER_SDK_CHANNEL,
|
|
579
|
+
v: OPENCHAMBER_SDK_API_VERSION,
|
|
580
|
+
type: 'badge',
|
|
581
|
+
id: nextId(ids),
|
|
582
|
+
payload: { count: clampBadgeCount(count) },
|
|
583
|
+
}),
|
|
584
|
+
dispose: () => {
|
|
585
|
+
for (const subscriptionId of workspaceListeners.keys()) {
|
|
586
|
+
post({ ...envelope, type: 'workspace-unsubscribe', id: nextId(ids), payload: { subscriptionId } });
|
|
587
|
+
}
|
|
588
|
+
workspaceListeners.clear();
|
|
589
|
+
disposed = true;
|
|
590
|
+
resolveHandler = null;
|
|
591
|
+
target.removeEventListener('message', onMessage);
|
|
592
|
+
for (const waiter of pending.values()) {
|
|
593
|
+
clearTimeout(waiter.timer);
|
|
594
|
+
waiter.reject(new HostRequestError('HOST_UNAVAILABLE', 'Host client was disposed.'));
|
|
595
|
+
}
|
|
596
|
+
pending.clear();
|
|
597
|
+
readyListeners.clear();
|
|
598
|
+
directoryListeners.clear();
|
|
599
|
+
sessionListeners.clear();
|
|
600
|
+
lifecycleListeners.clear();
|
|
601
|
+
connectionListeners.clear();
|
|
602
|
+
settingsListeners.clear();
|
|
603
|
+
itemListeners.clear();
|
|
604
|
+
},
|
|
605
|
+
};
|
|
606
|
+
};
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { OPENCHAMBER_SDK_API_VERSION, OPENCHAMBER_SDK_CHANNEL, OPENCHAMBER_SDK_MANIFEST_API_VERSIONS } from './api-version.ts';
|
|
2
|
+
export type { GuestLoadState, GuestProject, GuestWorktree, GuestSessionActivity, GuestSessionRecord, GuestDirectoryCoverage, GuestProjectsSnapshot, GuestWorktreesSnapshot, GuestSessionsSnapshot, GuestWorkspaceSnapshot, GuestWorkspaceQuery, GuestWorkspaceSubscription, GuestWorkspaceUpdate, GuestStorageRequest, GuestStorageResult, GuestSessionWorktree } from './workspace.ts';
|
|
3
|
+
export { GUEST_STORAGE_KEY_MAX, GUEST_STORAGE_KEYS_MAX, GUEST_STORAGE_VALUE_BYTES, GUEST_STORAGE_TOTAL_BYTES } from './workspace.ts';
|
|
4
|
+
export type { OpenChamberManifestApiVersion } from './api-version.ts';
|
|
5
|
+
export { compareOpenChamberVersions, hostMeetsOpenChamberEngine, openChamberEngineMinimum, OPENCHAMBER_ENGINE_PATTERN, parseOpenChamberVersion, } from './host-version.ts';
|
|
6
|
+
export { DECLARED_GUEST_CAPABILITIES, GUEST_ACTIONS_MAX, GUEST_ACTION_LABEL_MAX, GUEST_CAPABILITIES, GUEST_COMMANDS_MAX, GUEST_COMMAND_DESCRIPTION_MAX, GUEST_COMMAND_NAME, GUEST_TOOLS_MAX, GUEST_TOOL_COLUMNS_MAX, GUEST_TOOL_COLUMN_MAX, GUEST_TOOL_LANGUAGE_MAX, GUEST_TOOL_MATCH, GUEST_TOOL_MATCH_MAX, GUEST_TOOL_NAME_MAX, GUEST_TOOL_OUTPUTS, GUEST_TOOL_TEMPLATE_MAX, GUEST_TOOL_TEMPLATE_VALUE_MAX, guestActionsNeedConversation, GUEST_FILESYSTEM_PATTERN_MAX, GUEST_FILESYSTEM_PATTERNS_MAX, HOST_LINEAR_API_ORIGIN, isGuestFilesystemPattern, hasGuestCapability, hasGuestPage, isGuestApproved, isGuestPackageSvgIcon, requestedGuestCapabilities, resolveAttachEntry, resolvePageEntry, resolveAttachMode, resolveIntegrationApi, resolveIntegrationAuth, toPublicService, toPublicIntegration, } from './manifest.ts';
|
|
7
|
+
export type { ServiceContribution, ServicePermissions, GuestActionContribution, GuestActionPayload, GuestActionRole, GuestActionWhere, GuestCommandContribution, GuestToolContribution, GuestToolOutput, AttachContribution, AttachContributionObject, AttachMode, DeclaredGuestCapability, GuestAuthorization, GuestCapability, IntegrationAuth, IntegrationContribution, IntegrationHost, IntegrationHostProvider, IntegrationOAuth, IntegrationOAuthAccount, IntegrationSettingField, IntegrationToken, IntegrationTokenScheme, OpenChamberContributes, OpenChamberEngines, OpenChamberManifest, PanelContribution, PageContribution, ParseManifestErrorCode, ParseManifestFailure, ParseManifestResult, ParseManifestSuccess, PublicService, PublicServicePermissions, PublicGuestCapabilities, PublicIntegration, PublicIntegrationToken, PublicSocketBinding, ResolvedGuestApi, SocketBinding, SocketPlatform, } from './manifest.ts';
|
|
8
|
+
export { connectHost, HostRequestError } from './host.ts';
|
|
9
|
+
export type { HostClient, HostClientOptions, HostFrame } from './host.ts';
|
|
10
|
+
export { clampAttachRequest, clampBadgeCount, clampPromptRequest, clampStartSessionRequest, guestFileScope, isAttachData, isJsonValue, isFileListResult, isFileReadResult, isFileStatResult, isGenerateResult, isFileWriteResult, isGuestFilePath, isGuestAttachItem, isGuestMessageItem, isGuestSessionItem, isServiceStatusResult, isGuestRequestPath, isGuestRequestResult, isHostRequestErrorCode, isPromptResult, isStartSessionResult, readHostMessage, resolveHostRequestErrorCode, } from './contract.ts';
|
|
11
|
+
export type { BadgeRequest, GuestBadgeMessage, GuestItem, GuestItemRole, GuestMessageItem, GuestResolveResultMessage, GuestSessionItem, GuestSessionItemMessage, HostResolveMessage, ResolveRequest, ResolveResultPayload, FileListEntry, FileListRequest, FileListResult, FileReadRequest, FileReadResult, FileStatRequest, FileStatResult, FileWriteRequest, FileWriteResult, GenerateRequest, GenerateResult, GuestFileEntryKind, GuestFileListMessage, GuestFileReadMessage, GuestFileScope, GuestFileStatKind, GuestFileStatMessage, GuestGenerateMessage, GuestFileWriteMessage, ServiceStatus, ServiceStatusResult, HostRequestErrorCode, AttachBranches, AttachIssueRequest, AttachThreadKind, JsonValue, HostResultPayload, PromptRequest, PromptResult, SessionLifecycleEvent, SessionLifecyclePhase, StartSessionRequest, StartSessionResult, StartSessionSent, ComposeRequest, GuestServiceRequestMessage, GuestServiceStatusMessage, GuestAttachMessage, GuestClipboardWriteMessage, GuestCloseMessage, GuestComposeMessage, GuestConnection, GuestHelloMessage, GuestMessage, GuestOauthDisconnectMessage, GuestOauthStartMessage, GuestOpenSurfaceMessage, GuestOpenUrlMessage, GuestRequest, GuestRequestMessage, GuestRequestMethod, GuestPromptMessage, GuestSessionLinkMessage, GuestStartSessionMessage, GuestRequestResult, GuestSettings, GuestToastMessage, GuestHostSurface, HostConnectionMessage, HostDirectoryMessage, HostItemMessage, HostMessage, HostReadyContext, HostReadyMessage, HostResultMessage, HostSessionLifecycleMessage, HostSessionMessage, HostSettingsMessage, HostTheme, HostThemeMode, HostThemeTokens, SessionSnapshot, ToastKind, ToastRequest, } from './contract.ts';
|
|
12
|
+
export { EMPTY_GUEST_CONNECTION, GUEST_BADGE_MAX, GUEST_ITEM_MESSAGE_TEXT_MAX, GUEST_ITEM_SESSION_MAX, GUEST_RESOLVE_ERROR_MAX, GUEST_FILE_CONTENT_MAX, GUEST_FILE_ENTRY_KINDS, GUEST_FILE_LIST_MAX, GUEST_FILE_PATH_MAX, GUEST_GENERATE_OUTPUT_TOKENS_MAX, GUEST_GENERATE_PROMPT_MAX, GUEST_GENERATE_SYSTEM_MAX, GUEST_GENERATE_TEXT_MAX, GUEST_GENERATE_TIMEOUT_MS, GUEST_FILE_STAT_KINDS, SERVICE_STATUS_VALUES, HOST_REQUEST_ERROR_CODES, SESSION_LIFECYCLE_PHASES, START_SESSION_SENT, GUEST_ACCOUNT_MAX, GUEST_SESSION_AGENT_MAX, GUEST_SESSION_MODEL_MAX, GUEST_ATTACH_AUTHOR_MAX, GUEST_ATTACH_BRANCH_MAX, GUEST_ATTACH_DATA_MAX, GUEST_ATTACH_ID_MAX, GUEST_ATTACH_TEXT_MAX, GUEST_ATTACH_TITLE_MAX, GUEST_ATTACH_URL_MAX, GUEST_CLIPBOARD_TEXT_MAX, GUEST_TOAST_MAX, GUEST_COMPOSE_TEXT_MAX, GUEST_REQUEST_BODY_MAX, GUEST_REQUEST_PATH_MAX, GUEST_REQUEST_RESPONSE_MAX, GUEST_REQUEST_TIMEOUT_MS, GUEST_SETTING_VALUE_MAX, } from './contract.ts';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { OPENCHAMBER_SDK_API_VERSION, OPENCHAMBER_SDK_CHANNEL, OPENCHAMBER_SDK_MANIFEST_API_VERSIONS } from "./api-version.js";
|
|
2
|
+
export { GUEST_STORAGE_KEY_MAX, GUEST_STORAGE_KEYS_MAX, GUEST_STORAGE_VALUE_BYTES, GUEST_STORAGE_TOTAL_BYTES } from "./workspace.js";
|
|
3
|
+
export { compareOpenChamberVersions, hostMeetsOpenChamberEngine, openChamberEngineMinimum, OPENCHAMBER_ENGINE_PATTERN, parseOpenChamberVersion, } from "./host-version.js";
|
|
4
|
+
export { DECLARED_GUEST_CAPABILITIES, GUEST_ACTIONS_MAX, GUEST_ACTION_LABEL_MAX, GUEST_CAPABILITIES, GUEST_COMMANDS_MAX, GUEST_COMMAND_DESCRIPTION_MAX, GUEST_COMMAND_NAME, GUEST_TOOLS_MAX, GUEST_TOOL_COLUMNS_MAX, GUEST_TOOL_COLUMN_MAX, GUEST_TOOL_LANGUAGE_MAX, GUEST_TOOL_MATCH, GUEST_TOOL_MATCH_MAX, GUEST_TOOL_NAME_MAX, GUEST_TOOL_OUTPUTS, GUEST_TOOL_TEMPLATE_MAX, GUEST_TOOL_TEMPLATE_VALUE_MAX, guestActionsNeedConversation, GUEST_FILESYSTEM_PATTERN_MAX, GUEST_FILESYSTEM_PATTERNS_MAX, HOST_LINEAR_API_ORIGIN, isGuestFilesystemPattern, hasGuestCapability, hasGuestPage, isGuestApproved, isGuestPackageSvgIcon, requestedGuestCapabilities, resolveAttachEntry, resolvePageEntry, resolveAttachMode, resolveIntegrationApi, resolveIntegrationAuth, toPublicService, toPublicIntegration, } from "./manifest.js";
|
|
5
|
+
export { connectHost, HostRequestError } from "./host.js";
|
|
6
|
+
export { clampAttachRequest, clampBadgeCount, clampPromptRequest, clampStartSessionRequest, guestFileScope, isAttachData, isJsonValue, isFileListResult, isFileReadResult, isFileStatResult, isGenerateResult, isFileWriteResult, isGuestFilePath, isGuestAttachItem, isGuestMessageItem, isGuestSessionItem, isServiceStatusResult, isGuestRequestPath, isGuestRequestResult, isHostRequestErrorCode, isPromptResult, isStartSessionResult, readHostMessage, resolveHostRequestErrorCode, } from "./contract.js";
|
|
7
|
+
export { EMPTY_GUEST_CONNECTION, GUEST_BADGE_MAX, GUEST_ITEM_MESSAGE_TEXT_MAX, GUEST_ITEM_SESSION_MAX, GUEST_RESOLVE_ERROR_MAX, GUEST_FILE_CONTENT_MAX, GUEST_FILE_ENTRY_KINDS, GUEST_FILE_LIST_MAX, GUEST_FILE_PATH_MAX, GUEST_GENERATE_OUTPUT_TOKENS_MAX, GUEST_GENERATE_PROMPT_MAX, GUEST_GENERATE_SYSTEM_MAX, GUEST_GENERATE_TEXT_MAX, GUEST_GENERATE_TIMEOUT_MS, GUEST_FILE_STAT_KINDS, SERVICE_STATUS_VALUES, HOST_REQUEST_ERROR_CODES, SESSION_LIFECYCLE_PHASES, START_SESSION_SENT, GUEST_ACCOUNT_MAX, GUEST_SESSION_AGENT_MAX, GUEST_SESSION_MODEL_MAX, GUEST_ATTACH_AUTHOR_MAX, GUEST_ATTACH_BRANCH_MAX, GUEST_ATTACH_DATA_MAX, GUEST_ATTACH_ID_MAX, GUEST_ATTACH_TEXT_MAX, GUEST_ATTACH_TITLE_MAX, GUEST_ATTACH_URL_MAX, GUEST_CLIPBOARD_TEXT_MAX, GUEST_TOAST_MAX, GUEST_COMPOSE_TEXT_MAX, GUEST_REQUEST_BODY_MAX, GUEST_REQUEST_PATH_MAX, GUEST_REQUEST_RESPONSE_MAX, GUEST_REQUEST_TIMEOUT_MS, GUEST_SETTING_VALUE_MAX, } from "./contract.js";
|