@intentic/extension-api 1.326.0 → 1.327.0
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/README.md +26 -1
- package/dist/api.d.ts +2 -3
- package/dist/api.d.ts.map +1 -1
- package/dist/background.d.ts +4 -9
- package/dist/background.d.ts.map +1 -1
- package/dist/background.js.map +1 -1
- package/dist/diff.d.ts +2 -2
- package/dist/diff.d.ts.map +1 -1
- package/dist/disposable.d.ts +4 -0
- package/dist/disposable.d.ts.map +1 -0
- package/dist/disposable.js +2 -0
- package/dist/disposable.js.map +1 -0
- package/dist/runtime.d.ts +49 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +359 -0
- package/dist/runtime.js.map +1 -0
- package/dist/server.d.ts +40 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/stream.d.ts.map +1 -1
- package/dist/stream.js +2 -50
- package/dist/stream.js.map +1 -1
- package/dist/testing.d.ts +47 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +152 -0
- package/dist/testing.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +41 -5
- package/src/api.ts +2 -3
- package/src/background.ts +5 -12
- package/src/diff.ts +4 -4
- package/src/disposable.ts +5 -0
- package/src/runtime.integration.test.ts +159 -0
- package/src/runtime.ts +535 -0
- package/src/server.ts +91 -4
- package/src/stream.ts +4 -55
- package/src/surface.json +482 -0
- package/src/testing.ts +237 -0
- package/src/version.ts +23 -1
package/dist/runtime.js
ADDED
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import { isAbsolute, relative, resolve } from "node:path";
|
|
4
|
+
import { createBackoff, sleep } from "@intentic/base/async";
|
|
5
|
+
import { errorMessage, undefinedIfMissing } from "@intentic/base/errors";
|
|
6
|
+
import { queueOnFile, writeFileAtomic } from "@intentic/base/fs";
|
|
7
|
+
import { sandboxRouteAllowed } from "@intentic/extension-manifest/permissions";
|
|
8
|
+
import { readDocument } from "@intentic/sandbox-contract/documents";
|
|
9
|
+
import { EXTENSION_EVENT_KINDS, EXTENSION_EVENTS_HEARTBEAT_MS, EXTENSION_PROCESS_ENV, ExtensionEventSchema, extensionEventsUrl, ExtensionHealthSchema, ExtensionOwnSettingsSchema, ExtensionPermissionsSchema, extensionSettingsUrl, } from "@intentic/sandbox-contract/extension-protocol";
|
|
10
|
+
import { EXTENSION_TOKEN_HEADER } from "@intentic/sandbox-contract/headers";
|
|
11
|
+
import { extensionApiVersion } from "./version.js";
|
|
12
|
+
const load = createRequire(import.meta.url);
|
|
13
|
+
const typedClient = (options, send) => {
|
|
14
|
+
const contract = load("@intentic/sandbox-contract");
|
|
15
|
+
const { createORPCClient } = load("@orpc/client");
|
|
16
|
+
const { OpenAPILink } = load("@orpc/openapi-client/fetch");
|
|
17
|
+
return createORPCClient(new OpenAPILink(contract.sandboxContract, {
|
|
18
|
+
url: options.url,
|
|
19
|
+
headers: { [EXTENSION_TOKEN_HEADER]: options.token },
|
|
20
|
+
fetch: (request, init) => send(request, init),
|
|
21
|
+
interceptors: [
|
|
22
|
+
({ path, input, next }) => {
|
|
23
|
+
const request = contract.sandboxRequestFor(path, input);
|
|
24
|
+
if (request === undefined) {
|
|
25
|
+
throw new Error(`extension "${options.id}" called daemon procedure ${path.join(".")}, which this build's contract does not declare`);
|
|
26
|
+
}
|
|
27
|
+
if (!sandboxRouteAllowed(options.permissions, request.method, request.path)) {
|
|
28
|
+
throw new Error(`extension "${options.id}" called undeclared daemon route ${request.method} ${request.path}: declare it in permissions.daemon in the manifest`);
|
|
29
|
+
}
|
|
30
|
+
return next();
|
|
31
|
+
},
|
|
32
|
+
async ({ path, next }) => {
|
|
33
|
+
const answer = await next();
|
|
34
|
+
const schema = contract.sandboxAnswerSchema(path);
|
|
35
|
+
return schema === undefined ? answer : schema.parse(answer);
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
}));
|
|
39
|
+
};
|
|
40
|
+
export const createDaemonApi = (options) => {
|
|
41
|
+
const send = (input, init) => (options.fetch ?? globalThis.fetch)(input, init);
|
|
42
|
+
const granted = (init) => {
|
|
43
|
+
const headers = new Headers(init?.headers);
|
|
44
|
+
headers.set(EXTENSION_TOKEN_HEADER, options.token);
|
|
45
|
+
return headers;
|
|
46
|
+
};
|
|
47
|
+
let client;
|
|
48
|
+
return {
|
|
49
|
+
get rpc() {
|
|
50
|
+
client ??= typedClient(options, send);
|
|
51
|
+
return client;
|
|
52
|
+
},
|
|
53
|
+
request: (path, init) => send(`${options.url}${path}`, { ...init, headers: granted(init) }),
|
|
54
|
+
json: async (path, init) => {
|
|
55
|
+
const headers = granted(init);
|
|
56
|
+
if (init?.body !== undefined && !headers.has("content-type")) {
|
|
57
|
+
headers.set("content-type", "application/json");
|
|
58
|
+
}
|
|
59
|
+
const response = await send(`${options.url}${path}`, { ...init, headers });
|
|
60
|
+
if (!response.ok) {
|
|
61
|
+
throw new Error(`daemon answered ${response.status} for ${init?.method ?? "GET"} ${path}: ${await response.text()}`);
|
|
62
|
+
}
|
|
63
|
+
return (await response.json());
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
const SILENCE_MS = EXTENSION_EVENTS_HEARTBEAT_MS * 3;
|
|
68
|
+
const splitLines = (buffer) => {
|
|
69
|
+
const parts = buffer.split("\n");
|
|
70
|
+
const rest = parts.pop() ?? "";
|
|
71
|
+
return { lines: parts.map((line) => line.trim()).filter((line) => line !== ""), rest };
|
|
72
|
+
};
|
|
73
|
+
const frameOf = (line) => {
|
|
74
|
+
let raw;
|
|
75
|
+
try {
|
|
76
|
+
raw = JSON.parse(line);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
const parsed = ExtensionEventSchema.safeParse(raw);
|
|
82
|
+
if (!parsed.success) {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
const event = parsed.data;
|
|
86
|
+
switch (event.kind) {
|
|
87
|
+
case "heartbeat":
|
|
88
|
+
return undefined;
|
|
89
|
+
case "files":
|
|
90
|
+
return { kind: event.kind, values: event.paths };
|
|
91
|
+
case "settings":
|
|
92
|
+
return { kind: event.kind, values: event.keys };
|
|
93
|
+
default:
|
|
94
|
+
return { kind: event.kind, values: event.repos };
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const createEventHub = (open, log) => {
|
|
98
|
+
const listeners = new Map(EXTENSION_EVENT_KINDS.map((kind) => [kind, new Set()]));
|
|
99
|
+
let running;
|
|
100
|
+
const count = () => [...listeners.values()].reduce((sum, set) => sum + set.size, 0);
|
|
101
|
+
const deliver = (kind, values) => {
|
|
102
|
+
for (const listener of listeners.get(kind) ?? []) {
|
|
103
|
+
try {
|
|
104
|
+
listener(values);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
log(`a ${kind} listener threw: ${errorMessage(error)}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
const connect = async (outer) => {
|
|
112
|
+
const connection = new AbortController();
|
|
113
|
+
const abort = () => connection.abort();
|
|
114
|
+
outer.addEventListener("abort", abort, { once: true });
|
|
115
|
+
let silence = setTimeout(abort, SILENCE_MS);
|
|
116
|
+
try {
|
|
117
|
+
const response = await open(connection.signal);
|
|
118
|
+
if (!response.ok || response.body === null) {
|
|
119
|
+
throw new Error(`the daemon answered ${response.status}`);
|
|
120
|
+
}
|
|
121
|
+
const reader = response.body.getReader();
|
|
122
|
+
const decoder = new TextDecoder();
|
|
123
|
+
let buffer = "";
|
|
124
|
+
for (let chunk = await reader.read(); !chunk.done; chunk = await reader.read()) {
|
|
125
|
+
clearTimeout(silence);
|
|
126
|
+
silence = setTimeout(abort, SILENCE_MS);
|
|
127
|
+
const split = splitLines(buffer + decoder.decode(chunk.value, { stream: true }));
|
|
128
|
+
buffer = split.rest;
|
|
129
|
+
for (const line of split.lines) {
|
|
130
|
+
const frame = frameOf(line);
|
|
131
|
+
if (frame !== undefined) {
|
|
132
|
+
deliver(frame.kind, frame.values);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
finally {
|
|
138
|
+
clearTimeout(silence);
|
|
139
|
+
outer.removeEventListener("abort", abort);
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
const run = async (signal) => {
|
|
143
|
+
let connections = 0;
|
|
144
|
+
const backoff = createBackoff({ floorMs: 1_000, capMs: 30_000, stableMs: SILENCE_MS });
|
|
145
|
+
while (!signal.aborted) {
|
|
146
|
+
if (connections > 0) {
|
|
147
|
+
for (const kind of EXTENSION_EVENT_KINDS) {
|
|
148
|
+
deliver(kind, []);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
connections += 1;
|
|
152
|
+
const opened = Date.now();
|
|
153
|
+
try {
|
|
154
|
+
await connect(signal);
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
if (!signal.aborted) {
|
|
158
|
+
log(`the event stream dropped (${errorMessage(error)}); reconnecting`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (signal.aborted) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
await sleep(backoff.next(Date.now() - opened), { signal, unref: true });
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
const subscribe = (kind, listener) => {
|
|
168
|
+
listeners.get(kind)?.add(listener);
|
|
169
|
+
if (running === undefined) {
|
|
170
|
+
running = new AbortController();
|
|
171
|
+
void run(running.signal);
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
dispose: () => {
|
|
175
|
+
listeners.get(kind)?.delete(listener);
|
|
176
|
+
if (count() === 0) {
|
|
177
|
+
running?.abort();
|
|
178
|
+
running = undefined;
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
};
|
|
183
|
+
return {
|
|
184
|
+
subscribe,
|
|
185
|
+
close: () => {
|
|
186
|
+
for (const set of listeners.values()) {
|
|
187
|
+
set.clear();
|
|
188
|
+
}
|
|
189
|
+
running?.abort();
|
|
190
|
+
running = undefined;
|
|
191
|
+
},
|
|
192
|
+
};
|
|
193
|
+
};
|
|
194
|
+
const openDocument = (stateDir, path, options) => {
|
|
195
|
+
const file = resolve(stateDir, path);
|
|
196
|
+
const inside = relative(stateDir, file);
|
|
197
|
+
if (inside === "" || inside.startsWith("..") || isAbsolute(inside)) {
|
|
198
|
+
throw new Error(`document "${path}" must name a file inside the extension's state directory`);
|
|
199
|
+
}
|
|
200
|
+
const evolution = { history: options.history ?? [], granularity: options.granularity ?? "object" };
|
|
201
|
+
const readAs = async () => {
|
|
202
|
+
const text = await readFile(file, "utf8").catch(undefinedIfMissing);
|
|
203
|
+
return text === undefined ? undefined : readDocument(text, evolution, { kind: "whole", parse: (raw) => options.parse(raw) });
|
|
204
|
+
};
|
|
205
|
+
return {
|
|
206
|
+
read: async () => (await readAs())?.value ?? options.fallback(),
|
|
207
|
+
update: (change) => queueOnFile(file, async () => {
|
|
208
|
+
const stored = await readAs();
|
|
209
|
+
if (stored !== undefined && stored.value === undefined) {
|
|
210
|
+
throw new Error(`${path} holds what this version of the extension cannot read; it is left as it is`, { cause: stored.problems[0] });
|
|
211
|
+
}
|
|
212
|
+
const before = stored?.value ?? options.fallback();
|
|
213
|
+
const after = change(before);
|
|
214
|
+
if (after === before) {
|
|
215
|
+
return before;
|
|
216
|
+
}
|
|
217
|
+
const written = stored === undefined ? after : stored.carry(after);
|
|
218
|
+
await writeFileAtomic(file, `${JSON.stringify(written, undefined, 2)}\n`);
|
|
219
|
+
return after;
|
|
220
|
+
}),
|
|
221
|
+
};
|
|
222
|
+
};
|
|
223
|
+
export const createExtensionRuntime = (options) => {
|
|
224
|
+
const log = options.log ?? ((message) => void process.stdout.write(`[${options.id}] ${message}\n`));
|
|
225
|
+
const daemon = createDaemonApi({ url: options.daemonUrl, token: options.token, id: options.id, permissions: options.permissions, fetch: options.fetch });
|
|
226
|
+
const events = createEventHub((signal) => daemon.request(extensionEventsUrl(), { signal }), log);
|
|
227
|
+
return {
|
|
228
|
+
api: {
|
|
229
|
+
apiVersion: extensionApiVersion,
|
|
230
|
+
workspaceRoot: options.workspaceRoot,
|
|
231
|
+
extensionDir: options.extensionDir,
|
|
232
|
+
stateDir: options.stateDir,
|
|
233
|
+
cacheDir: options.cacheDir,
|
|
234
|
+
log,
|
|
235
|
+
daemon,
|
|
236
|
+
document: (path, documentOptions) => openDocument(options.stateDir, path, documentOptions),
|
|
237
|
+
settings: {
|
|
238
|
+
get: async () => ExtensionOwnSettingsSchema.parse(await (await daemon.request(extensionSettingsUrl())).json()).settings,
|
|
239
|
+
onDidChange: (listener) => events.subscribe("settings", listener),
|
|
240
|
+
},
|
|
241
|
+
workspace: {
|
|
242
|
+
onDidChangeFiles: (listener) => events.subscribe("files", listener),
|
|
243
|
+
onDidChangeRefs: (listener) => events.subscribe("refs", listener),
|
|
244
|
+
onDidChangeRepos: (listener) => events.subscribe("repos", listener),
|
|
245
|
+
},
|
|
246
|
+
},
|
|
247
|
+
close: events.close,
|
|
248
|
+
};
|
|
249
|
+
};
|
|
250
|
+
export const createServerApi = (options) => {
|
|
251
|
+
const runtime = createExtensionRuntime(options);
|
|
252
|
+
let mounted;
|
|
253
|
+
let tools;
|
|
254
|
+
return {
|
|
255
|
+
api: {
|
|
256
|
+
...runtime.api,
|
|
257
|
+
routes: {
|
|
258
|
+
mount: (handler) => {
|
|
259
|
+
mounted = handler;
|
|
260
|
+
},
|
|
261
|
+
},
|
|
262
|
+
tools: {
|
|
263
|
+
serve: (source) => {
|
|
264
|
+
tools = source;
|
|
265
|
+
},
|
|
266
|
+
},
|
|
267
|
+
},
|
|
268
|
+
handler: () => mounted,
|
|
269
|
+
tools: () => tools,
|
|
270
|
+
close: runtime.close,
|
|
271
|
+
};
|
|
272
|
+
};
|
|
273
|
+
export const activateServerModule = async (imported, api, context) => {
|
|
274
|
+
const resolved = imported.default ?? imported;
|
|
275
|
+
if (resolved.activateServer === undefined) {
|
|
276
|
+
throw new Error("the server bundle exports no activateServer(api, context)");
|
|
277
|
+
}
|
|
278
|
+
return (await resolved.activateServer(api, context)) ?? {};
|
|
279
|
+
};
|
|
280
|
+
export const DEACTIVATE_DEADLINE_MS = 2_500;
|
|
281
|
+
export const HEALTH_DEADLINE_MS = 2_000;
|
|
282
|
+
const within = async (work, ms, late) => {
|
|
283
|
+
let timer;
|
|
284
|
+
const lateness = new Promise((settle) => {
|
|
285
|
+
timer = setTimeout(() => settle(late), ms);
|
|
286
|
+
timer.unref();
|
|
287
|
+
});
|
|
288
|
+
try {
|
|
289
|
+
return await Promise.race([Promise.resolve().then(work), lateness]);
|
|
290
|
+
}
|
|
291
|
+
finally {
|
|
292
|
+
clearTimeout(timer);
|
|
293
|
+
}
|
|
294
|
+
};
|
|
295
|
+
export const deactivateWithin = async (activation, log) => {
|
|
296
|
+
const deactivate = activation.deactivate;
|
|
297
|
+
if (deactivate === undefined) {
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
try {
|
|
301
|
+
const outcome = await within(async () => {
|
|
302
|
+
await deactivate();
|
|
303
|
+
return "done";
|
|
304
|
+
}, DEACTIVATE_DEADLINE_MS, "late");
|
|
305
|
+
if (outcome === "late") {
|
|
306
|
+
log(`deactivate did not finish within ${DEACTIVATE_DEADLINE_MS} ms; its code is replaced anyway`);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
catch (error) {
|
|
310
|
+
log(`deactivate threw: ${errorMessage(error)}`);
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
export const healthWithin = async (activation) => {
|
|
314
|
+
const health = activation.health;
|
|
315
|
+
if (health === undefined) {
|
|
316
|
+
return { state: "ok" };
|
|
317
|
+
}
|
|
318
|
+
const late = { state: "degraded", detail: `its health check did not answer within ${HEALTH_DEADLINE_MS} ms` };
|
|
319
|
+
try {
|
|
320
|
+
const answer = await within(health, HEALTH_DEADLINE_MS, late);
|
|
321
|
+
const parsed = ExtensionHealthSchema.safeParse(answer);
|
|
322
|
+
if (!parsed.success) {
|
|
323
|
+
return { state: "degraded", detail: "its health check answered something other than ok, starting, degraded or failed" };
|
|
324
|
+
}
|
|
325
|
+
return parsed.data.detail === undefined ? { state: parsed.data.state } : { state: parsed.data.state, detail: parsed.data.detail };
|
|
326
|
+
}
|
|
327
|
+
catch (error) {
|
|
328
|
+
return { state: "degraded", detail: `its health check threw: ${errorMessage(error)}` };
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
const required = (env, name) => {
|
|
332
|
+
const value = env[name];
|
|
333
|
+
if (value === undefined || value === "") {
|
|
334
|
+
throw new Error(`missing ${name}: an extension's process is started by the sandbox daemon, which sets it`);
|
|
335
|
+
}
|
|
336
|
+
return value;
|
|
337
|
+
};
|
|
338
|
+
const permissionsOf = (raw) => {
|
|
339
|
+
if (raw === undefined || raw === "") {
|
|
340
|
+
return [];
|
|
341
|
+
}
|
|
342
|
+
const parsed = ExtensionPermissionsSchema.safeParse(JSON.parse(raw));
|
|
343
|
+
if (!parsed.success) {
|
|
344
|
+
throw new Error(`${EXTENSION_PROCESS_ENV.permissions} is not a JSON array of permissions`);
|
|
345
|
+
}
|
|
346
|
+
return parsed.data;
|
|
347
|
+
};
|
|
348
|
+
export const connectExtensionProcess = (env = process.env, options = {}) => createExtensionRuntime({
|
|
349
|
+
id: required(env, EXTENSION_PROCESS_ENV.id),
|
|
350
|
+
daemonUrl: required(env, EXTENSION_PROCESS_ENV.daemon),
|
|
351
|
+
token: required(env, EXTENSION_PROCESS_ENV.token),
|
|
352
|
+
permissions: permissionsOf(env[EXTENSION_PROCESS_ENV.permissions]),
|
|
353
|
+
workspaceRoot: required(env, EXTENSION_PROCESS_ENV.workspace),
|
|
354
|
+
extensionDir: env[EXTENSION_PROCESS_ENV.dir] ?? process.cwd(),
|
|
355
|
+
stateDir: required(env, EXTENSION_PROCESS_ENV.state),
|
|
356
|
+
cacheDir: required(env, EXTENSION_PROCESS_ENV.cache),
|
|
357
|
+
log: options.log,
|
|
358
|
+
});
|
|
359
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { sandboxContract } from "@intentic/sandbox-contract";
|
|
2
|
+
import type { Conversion, Granularity } from "@intentic/sandbox-contract/documents";
|
|
2
3
|
import type { ToolEffect } from "@intentic/sandbox-contract/peer-mcp-server";
|
|
3
4
|
import type { ContractRouterClient } from "@orpc/contract";
|
|
5
|
+
import type { Disposable } from "./disposable.js";
|
|
4
6
|
export type { ToolEffect };
|
|
5
7
|
export interface ToolCard {
|
|
6
8
|
readonly id: string;
|
|
@@ -20,7 +22,7 @@ export interface ToolResult {
|
|
|
20
22
|
}
|
|
21
23
|
export interface ToolCallContext {
|
|
22
24
|
readonly signal: AbortSignal;
|
|
23
|
-
readonly conversationId?: string;
|
|
25
|
+
readonly conversationId?: string | undefined;
|
|
24
26
|
}
|
|
25
27
|
export interface ToolDefinition {
|
|
26
28
|
readonly name: string;
|
|
@@ -30,11 +32,46 @@ export interface ToolDefinition {
|
|
|
30
32
|
readonly call: (args: Readonly<Record<string, unknown>>, context: ToolCallContext) => Promise<ToolResult | string | unknown> | ToolResult | string | unknown;
|
|
31
33
|
}
|
|
32
34
|
export type BackendRouteHandler = (request: Request) => Promise<Response | undefined>;
|
|
35
|
+
export type ExtensionSettingValues = Readonly<Record<string, string | number | boolean>>;
|
|
36
|
+
export interface ServerDocument<T> {
|
|
37
|
+
read(): Promise<T>;
|
|
38
|
+
update(change: (current: T) => T): Promise<T>;
|
|
39
|
+
}
|
|
40
|
+
export type StoredJson = string | number | boolean | null | readonly StoredJson[] | {
|
|
41
|
+
readonly [key: string]: StoredJson;
|
|
42
|
+
};
|
|
43
|
+
export interface ServerDocumentOptions<T> {
|
|
44
|
+
readonly parse: (raw: StoredJson) => T | undefined;
|
|
45
|
+
readonly fallback: () => T;
|
|
46
|
+
readonly history?: readonly Conversion[];
|
|
47
|
+
readonly granularity?: Granularity;
|
|
48
|
+
}
|
|
49
|
+
export type ExtensionHealthState = "ok" | "starting" | "degraded" | "failed";
|
|
50
|
+
export interface ExtensionHealth {
|
|
51
|
+
readonly state: ExtensionHealthState;
|
|
52
|
+
readonly detail?: string;
|
|
53
|
+
}
|
|
54
|
+
export interface ServerActivation {
|
|
55
|
+
readonly deactivate?: () => void | Promise<void>;
|
|
56
|
+
readonly health?: () => ExtensionHealth | Promise<ExtensionHealth>;
|
|
57
|
+
}
|
|
33
58
|
export interface ExtensionServerApi {
|
|
34
59
|
readonly apiVersion: string;
|
|
35
60
|
readonly workspaceRoot: string;
|
|
36
61
|
readonly extensionDir: string;
|
|
62
|
+
readonly stateDir: string;
|
|
63
|
+
readonly cacheDir: string;
|
|
37
64
|
readonly log: (message: string) => void;
|
|
65
|
+
readonly document: <T>(path: string, options: ServerDocumentOptions<T>) => ServerDocument<T>;
|
|
66
|
+
readonly settings: {
|
|
67
|
+
get(): Promise<ExtensionSettingValues>;
|
|
68
|
+
onDidChange(listener: (keys: readonly string[]) => void): Disposable;
|
|
69
|
+
};
|
|
70
|
+
readonly workspace: {
|
|
71
|
+
onDidChangeFiles(listener: (paths: readonly string[]) => void): Disposable;
|
|
72
|
+
onDidChangeRefs(listener: (repos: readonly string[]) => void): Disposable;
|
|
73
|
+
onDidChangeRepos(listener: (repos: readonly string[]) => void): Disposable;
|
|
74
|
+
};
|
|
38
75
|
readonly routes: {
|
|
39
76
|
mount(handler: BackendRouteHandler): void;
|
|
40
77
|
};
|
|
@@ -50,7 +87,8 @@ export interface ExtensionServerApi {
|
|
|
50
87
|
export interface ExtensionServerContext {
|
|
51
88
|
readonly extensionId: string;
|
|
52
89
|
}
|
|
90
|
+
export type ExtensionProcessApi = Omit<ExtensionServerApi, "routes" | "tools">;
|
|
53
91
|
export interface ExtensionServerModule {
|
|
54
|
-
activateServer(api: ExtensionServerApi, context: ExtensionServerContext): void | Promise<void>;
|
|
92
|
+
activateServer(api: ExtensionServerApi, context: ExtensionServerContext): void | ServerActivation | Promise<void | ServerActivation>;
|
|
55
93
|
}
|
|
56
94
|
//# sourceMappingURL=server.d.ts.map
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4CAA4C,CAAC;AAC7E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/stream.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAOA,wBAAuB,gBAAgB,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAmBjH"}
|
package/dist/stream.js
CHANGED
|
@@ -1,55 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
async function* sseFrames(body) {
|
|
3
|
-
const reader = body.getReader();
|
|
4
|
-
const decoder = new TextDecoder();
|
|
5
|
-
let buffer = "";
|
|
6
|
-
try {
|
|
7
|
-
for (;;) {
|
|
8
|
-
let timer;
|
|
9
|
-
const idle = new Promise((resolve) => {
|
|
10
|
-
timer = setTimeout(() => resolve("idle"), SSE_IDLE_MS);
|
|
11
|
-
});
|
|
12
|
-
const result = await Promise.race([reader.read(), idle]);
|
|
13
|
-
clearTimeout(timer);
|
|
14
|
-
if (result === "idle") {
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
const { done, value } = result;
|
|
18
|
-
if (done) {
|
|
19
|
-
break;
|
|
20
|
-
}
|
|
21
|
-
buffer += decoder.decode(value, { stream: true });
|
|
22
|
-
let separator = buffer.indexOf("\n\n");
|
|
23
|
-
while (separator !== -1) {
|
|
24
|
-
yield buffer.slice(0, separator);
|
|
25
|
-
buffer = buffer.slice(separator + 2);
|
|
26
|
-
separator = buffer.indexOf("\n\n");
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
finally {
|
|
31
|
-
await reader.cancel().catch(() => { });
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
const dataOf = (frame) => {
|
|
35
|
-
const line = frame.split("\n").find((entry) => entry.startsWith("data:"));
|
|
36
|
-
if (line === undefined) {
|
|
37
|
-
return undefined;
|
|
38
|
-
}
|
|
39
|
-
const payload = line.slice(5).trim();
|
|
40
|
-
if (payload.length === 0) {
|
|
41
|
-
return undefined;
|
|
42
|
-
}
|
|
43
|
-
try {
|
|
44
|
-
return JSON.parse(payload);
|
|
45
|
-
}
|
|
46
|
-
catch {
|
|
47
|
-
return undefined;
|
|
48
|
-
}
|
|
49
|
-
};
|
|
1
|
+
import { sseData, sseFrames } from "@intentic/sandbox-contract";
|
|
50
2
|
export async function* readDaemonStream(body) {
|
|
51
3
|
for await (const frame of sseFrames(body)) {
|
|
52
|
-
const parsed =
|
|
4
|
+
const parsed = sseData(frame);
|
|
53
5
|
if (typeof parsed !== "object" || parsed === null) {
|
|
54
6
|
continue;
|
|
55
7
|
}
|
package/dist/stream.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAOhE,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,gBAAgB,CAAC,IAAgC;IACpE,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAChD,SAAS;QACb,CAAC;QACD,MAAM,MAAM,GAAG,MAAiC,CAAC;QACjD,MAAM,OAAO,GACT,KAAK;aACA,KAAK,CAAC,IAAI,CAAC;aACX,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC1C,EAAE,KAAK,CAAC,CAAC,CAAC;aACT,IAAI,EAAE,KAAK,OAAO,CAAC;QAC5B,IAAI,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,sBAAsB,EAAE,CAAC;YACrH,SAAS;QACb,CAAC;QACD,MAAM,MAAM,CAAC;IACjB,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type ExtensionEvent } from "@intentic/sandbox-contract/extension-protocol";
|
|
2
|
+
import type { ExtensionHealth, ExtensionServerApi, ExtensionServerModule, ExtensionSettingValues, ToolCard, ToolCallContext, ToolDefinition } from "./server.js";
|
|
3
|
+
export interface FakeManifest {
|
|
4
|
+
readonly publisher: string;
|
|
5
|
+
readonly name: string;
|
|
6
|
+
readonly permissions?: {
|
|
7
|
+
readonly daemon?: readonly string[];
|
|
8
|
+
};
|
|
9
|
+
readonly contributes?: {
|
|
10
|
+
readonly listener?: {
|
|
11
|
+
readonly provider: string;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export interface FakeExtensionOptions {
|
|
16
|
+
readonly manifest: FakeManifest;
|
|
17
|
+
readonly daemon?: (request: Request) => Response | undefined | Promise<Response | undefined>;
|
|
18
|
+
readonly settings?: ExtensionSettingValues;
|
|
19
|
+
readonly workspaceRoot?: string;
|
|
20
|
+
readonly extensionDir?: string;
|
|
21
|
+
readonly stateDir?: string;
|
|
22
|
+
readonly cacheDir?: string;
|
|
23
|
+
}
|
|
24
|
+
type ToolArguments = Parameters<ToolDefinition["call"]>[0];
|
|
25
|
+
export interface FakeDaemonCall {
|
|
26
|
+
readonly line: string;
|
|
27
|
+
readonly admitted: boolean;
|
|
28
|
+
}
|
|
29
|
+
export interface FakeExtension {
|
|
30
|
+
readonly api: ExtensionServerApi;
|
|
31
|
+
readonly calls: readonly FakeDaemonCall[];
|
|
32
|
+
readonly logs: readonly string[];
|
|
33
|
+
activate(module: Partial<ExtensionServerModule> & {
|
|
34
|
+
default?: ExtensionServerModule;
|
|
35
|
+
}): Promise<void>;
|
|
36
|
+
route(path: string, init?: RequestInit): Promise<Response>;
|
|
37
|
+
tools(card?: ToolCard): Promise<readonly ToolDefinition[]>;
|
|
38
|
+
callTool(name: string, args?: ToolArguments, card?: ToolCard, context?: Partial<ToolCallContext>): ReturnType<ToolDefinition["call"]>;
|
|
39
|
+
setSettings(values: ExtensionSettingValues): void;
|
|
40
|
+
emit(event: ExtensionEvent): void;
|
|
41
|
+
health(): Promise<ExtensionHealth>;
|
|
42
|
+
deactivate(): Promise<void>;
|
|
43
|
+
dispose(): Promise<void>;
|
|
44
|
+
}
|
|
45
|
+
export declare const fakeExtensionApi: (options: FakeExtensionOptions) => Promise<FakeExtension>;
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=testing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,cAAc,EAA4C,MAAM,+CAA+C,CAAC;AAG9H,OAAO,KAAK,EACR,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EAEtB,QAAQ,EACR,eAAe,EACf,cAAc,EACjB,MAAM,aAAa,CAAC;AAarB,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC;IAC/D,QAAQ,CAAC,WAAW,CAAC,EAAE;QAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE;YAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;CAChF;AAED,MAAM,WAAW,oBAAoB;IACjC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAGhC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC;IAC7F,QAAQ,CAAC,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAE3C,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC9B;AAGD,KAAK,aAAa,GAAG,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAG3D,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,GAAG,EAAE,kBAAkB,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IAEjC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,GAAG;QAAE,OAAO,CAAC,EAAE,qBAAqB,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE3D,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC,CAAC;IAG3D,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IAEtI,WAAW,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAElD,IAAI,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IAElC,MAAM,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IAEnC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAQD,eAAO,MAAM,gBAAgB,YAAmB,oBAAoB,KAAG,OAAO,CAAC,aAAa,CAmJ3F,CAAC"}
|