@xenosystem/acp-agent 0.2.0 → 0.2.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/dist/acpAgentServer.d.ts.map +1 -1
- package/dist/acpAgentServer.js +56 -0
- package/dist/acpAgentServer.js.map +1 -1
- package/dist/fixtureProvider.d.ts +13 -0
- package/dist/fixtureProvider.d.ts.map +1 -0
- package/dist/fixtureProvider.js +86 -0
- package/dist/fixtureProvider.js.map +1 -0
- package/dist/hosted/xeno-agents-client.d.ts +306 -0
- package/dist/hosted/xeno-agents-client.d.ts.map +1 -0
- package/dist/hosted/xeno-agents-client.js +520 -0
- package/dist/hosted/xeno-agents-client.js.map +1 -0
- package/dist/providers/fixtureProvider.d.ts.map +1 -1
- package/dist/providers/fixtureProvider.js +20 -0
- package/dist/providers/fixtureProvider.js.map +1 -1
- package/dist/providers/providerTypes.d.ts +25 -0
- package/dist/providers/providerTypes.d.ts.map +1 -1
- package/dist/providers/xenoAgentsApiEventMapper.d.ts +52 -0
- package/dist/providers/xenoAgentsApiEventMapper.d.ts.map +1 -0
- package/dist/providers/xenoAgentsApiEventMapper.js +152 -0
- package/dist/providers/xenoAgentsApiEventMapper.js.map +1 -0
- package/dist/providers/xenoAgentsApiProvider.d.ts +60 -0
- package/dist/providers/xenoAgentsApiProvider.d.ts.map +1 -0
- package/dist/providers/xenoAgentsApiProvider.js +302 -0
- package/dist/providers/xenoAgentsApiProvider.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,520 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @xeno/agents-client — the SHARED, portable client for the hosted agent-runs API
|
|
3
|
+
* (`xeno-agents-api`, live at https://api.xenostudio.ai/v1/agents).
|
|
4
|
+
*
|
|
5
|
+
* CANONICAL. Every XENO product (Hub, the desktop apps, the web console, agents,
|
|
6
|
+
* SDKs) vendors THIS single file to dispatch and stream cloud agent runs — nobody
|
|
7
|
+
* re-implements the wire contract. It is the generalized, framework-agnostic
|
|
8
|
+
* distillation of the contract the XENO Agent CLI already speaks in its
|
|
9
|
+
* `remote.ts` (capability negotiation + start/list/get/stop/events/attach with
|
|
10
|
+
* SSE + NDJSON parsing). See `XENO AGENTS API - SPEC.md` §4–6.
|
|
11
|
+
*
|
|
12
|
+
* Zero dependencies. Works in Node ≥18, Electron (main or renderer) and browsers:
|
|
13
|
+
* uses only global `fetch`, `ReadableStream`, `TextDecoder`, `AbortController`.
|
|
14
|
+
* NO node-only imports, NO npm deps.
|
|
15
|
+
*
|
|
16
|
+
* Auth reality (2026-07): the server today accepts a platform **OIDC JWT**;
|
|
17
|
+
* **API-key support is being added separately** (§13 caveat). This client is
|
|
18
|
+
* auth-agnostic — it just sends `Authorization: Bearer <token>` — so it works with
|
|
19
|
+
* either the moment the server accepts it.
|
|
20
|
+
*
|
|
21
|
+
* Usage:
|
|
22
|
+
* import { createAgentsClient } from './xeno-agents-client';
|
|
23
|
+
* const agents = createAgentsClient({ token: myPlatformJwt });
|
|
24
|
+
* const run = await agents.createRun({ prompt: 'Fix the failing tests', model: 'gpt-5.5' });
|
|
25
|
+
* for await (const ev of agents.attach(run.runId)) console.log(ev.type, ev.payload);
|
|
26
|
+
* await agents.stopRun(run.runId);
|
|
27
|
+
*/
|
|
28
|
+
/* ------------------------------------------------------------------ *
|
|
29
|
+
* Wire types — LOCKED cross-repo contract (SPEC §5, server src/types.ts).
|
|
30
|
+
* Re-derived from the server projection; do NOT invent shapes here.
|
|
31
|
+
* ------------------------------------------------------------------ */
|
|
32
|
+
export const SCHEMA_VERSION = 1;
|
|
33
|
+
/** Terminal states — a run in one of these will never transition again. */
|
|
34
|
+
export const TERMINAL_STATUSES = new Set([
|
|
35
|
+
"completed",
|
|
36
|
+
"failed",
|
|
37
|
+
"skipped",
|
|
38
|
+
"cancelled",
|
|
39
|
+
"interrupted",
|
|
40
|
+
]);
|
|
41
|
+
export function isTerminalStatus(status) {
|
|
42
|
+
return TERMINAL_STATUSES.has(status);
|
|
43
|
+
}
|
|
44
|
+
/** Terminal lifecycle event types — the attach stream ends after one of these. */
|
|
45
|
+
export const TERMINAL_LIFECYCLE_EVENTS = new Set([
|
|
46
|
+
"run.completed",
|
|
47
|
+
"run.failed",
|
|
48
|
+
"run.cancelled",
|
|
49
|
+
]);
|
|
50
|
+
/** The v0.1 required capability set the CLI negotiates against (SPEC §4.1). */
|
|
51
|
+
export const REQUIRED_CAPABILITIES = [
|
|
52
|
+
"runs.start",
|
|
53
|
+
"runs.list",
|
|
54
|
+
"runs.get",
|
|
55
|
+
"runs.events",
|
|
56
|
+
"runs.attach",
|
|
57
|
+
"runs.stop",
|
|
58
|
+
];
|
|
59
|
+
const STATUS_TO_CODE = {
|
|
60
|
+
400: "invalid_request",
|
|
61
|
+
401: "unauthorized",
|
|
62
|
+
402: "insufficient_credits",
|
|
63
|
+
403: "forbidden",
|
|
64
|
+
404: "run_not_found",
|
|
65
|
+
429: "rate_limited",
|
|
66
|
+
};
|
|
67
|
+
/** Typed API error carrying the server's error code + HTTP status. */
|
|
68
|
+
export class AgentsApiError extends Error {
|
|
69
|
+
code;
|
|
70
|
+
status;
|
|
71
|
+
/** True when caused by a fetch/abort/timeout rather than an HTTP response. */
|
|
72
|
+
isNetwork;
|
|
73
|
+
// `override` required by xeno-acp's stricter tsconfig (noImplicitOverride); Error declares `cause`.
|
|
74
|
+
cause;
|
|
75
|
+
constructor(code, message, status = 0, opts) {
|
|
76
|
+
super(message);
|
|
77
|
+
this.name = "AgentsApiError";
|
|
78
|
+
this.code = code;
|
|
79
|
+
this.status = status;
|
|
80
|
+
this.isNetwork = opts?.isNetwork ?? false;
|
|
81
|
+
this.cause = opts?.cause;
|
|
82
|
+
}
|
|
83
|
+
get isBudgetExceeded() {
|
|
84
|
+
return this.code === "budget_exceeded";
|
|
85
|
+
}
|
|
86
|
+
get isInsufficientCredits() {
|
|
87
|
+
return this.code === "insufficient_credits";
|
|
88
|
+
}
|
|
89
|
+
get isUnauthorized() {
|
|
90
|
+
return this.code === "unauthorized";
|
|
91
|
+
}
|
|
92
|
+
get isNotFound() {
|
|
93
|
+
return this.code === "run_not_found" || this.code === "not_found";
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export function isAgentsApiError(err) {
|
|
97
|
+
return err instanceof AgentsApiError;
|
|
98
|
+
}
|
|
99
|
+
const DEFAULT_BASE_URL = "https://api.xenostudio.ai/v1/agents";
|
|
100
|
+
export function createAgentsClient(config) {
|
|
101
|
+
const rawBase = (config.baseUrl || DEFAULT_BASE_URL).replace(/\/+$/, "");
|
|
102
|
+
// `new URL(path, base)` needs a trailing slash on base to treat it as a dir.
|
|
103
|
+
const baseWithSlash = `${rawBase}/`;
|
|
104
|
+
const f = config.fetchImpl || globalThis.fetch;
|
|
105
|
+
const defaultTimeout = config.timeoutMs ?? 30_000;
|
|
106
|
+
if (typeof f !== "function") {
|
|
107
|
+
throw new AgentsApiError("network_error", "No fetch implementation available; pass { fetchImpl } (Node < 18).");
|
|
108
|
+
}
|
|
109
|
+
function url(path, query) {
|
|
110
|
+
const u = new URL(path.replace(/^\/+/, ""), baseWithSlash);
|
|
111
|
+
if (query) {
|
|
112
|
+
for (const [k, v] of Object.entries(query)) {
|
|
113
|
+
if (v !== undefined)
|
|
114
|
+
u.searchParams.set(k, String(v));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return u.toString();
|
|
118
|
+
}
|
|
119
|
+
async function authHeaders(json, extra) {
|
|
120
|
+
const t = typeof config.token === "function" ? await config.token() : config.token;
|
|
121
|
+
const h = { accept: "application/json" };
|
|
122
|
+
if (t)
|
|
123
|
+
h.authorization = `Bearer ${t}`;
|
|
124
|
+
if (json)
|
|
125
|
+
h["content-type"] = "application/json";
|
|
126
|
+
if (config.workspace)
|
|
127
|
+
h["x-xeno-workspace"] = config.workspace;
|
|
128
|
+
return { ...h, ...(extra || {}) };
|
|
129
|
+
}
|
|
130
|
+
/** Compose the caller's AbortSignal with a timeout (Node ≥18 safe). */
|
|
131
|
+
function withTimeout(signal, timeoutMs) {
|
|
132
|
+
const ctl = new AbortController();
|
|
133
|
+
const onAbort = () => ctl.abort(signal?.reason);
|
|
134
|
+
if (signal) {
|
|
135
|
+
if (signal.aborted)
|
|
136
|
+
ctl.abort(signal.reason);
|
|
137
|
+
else
|
|
138
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
139
|
+
}
|
|
140
|
+
let timer;
|
|
141
|
+
if (timeoutMs > 0) {
|
|
142
|
+
timer = setTimeout(() => ctl.abort(new AgentsApiError("network_error", `Request timed out after ${timeoutMs}ms`)), timeoutMs);
|
|
143
|
+
if (typeof timer.unref === "function")
|
|
144
|
+
timer.unref();
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
signal: ctl.signal,
|
|
148
|
+
cancel: () => {
|
|
149
|
+
if (timer)
|
|
150
|
+
clearTimeout(timer);
|
|
151
|
+
if (signal)
|
|
152
|
+
signal.removeEventListener("abort", onAbort);
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
function normalizeNetworkError(err) {
|
|
157
|
+
if (isAgentsApiError(err))
|
|
158
|
+
return err;
|
|
159
|
+
const anyErr = err;
|
|
160
|
+
if (anyErr?.name === "AbortError") {
|
|
161
|
+
return new AgentsApiError("network_error", anyErr.message || "Request aborted", 0, { isNetwork: true, cause: err });
|
|
162
|
+
}
|
|
163
|
+
return new AgentsApiError("network_error", anyErr?.message || String(err), 0, { isNetwork: true, cause: err });
|
|
164
|
+
}
|
|
165
|
+
/** Map a non-2xx response body `{ error: "<code>" }` to a typed AgentsApiError. */
|
|
166
|
+
async function toError(res) {
|
|
167
|
+
let code;
|
|
168
|
+
let bodyText = "";
|
|
169
|
+
try {
|
|
170
|
+
bodyText = await res.text();
|
|
171
|
+
const parsed = bodyText ? JSON.parse(bodyText) : undefined;
|
|
172
|
+
// Server shape: { "error": "<code>" }. Also tolerate { error: { code } }.
|
|
173
|
+
const raw = typeof parsed?.error === "string"
|
|
174
|
+
? parsed.error
|
|
175
|
+
: typeof parsed?.error?.code === "string"
|
|
176
|
+
? parsed.error.code
|
|
177
|
+
: undefined;
|
|
178
|
+
if (raw)
|
|
179
|
+
code = raw;
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
/* non-JSON body */
|
|
183
|
+
}
|
|
184
|
+
const resolved = code ?? STATUS_TO_CODE[res.status] ?? "http_error";
|
|
185
|
+
const message = code
|
|
186
|
+
? `Agents API error: ${code} (HTTP ${res.status})`
|
|
187
|
+
: `Agents API request failed (HTTP ${res.status})${bodyText ? `: ${bodyText.slice(0, 200)}` : ""}`;
|
|
188
|
+
return new AgentsApiError(resolved, message, res.status);
|
|
189
|
+
}
|
|
190
|
+
async function requestJson(method, path, opts) {
|
|
191
|
+
const { signal, cancel } = withTimeout(opts?.signal, opts?.timeoutMs ?? defaultTimeout);
|
|
192
|
+
try {
|
|
193
|
+
const res = await f(url(path, opts?.query), {
|
|
194
|
+
method,
|
|
195
|
+
headers: await authHeaders(opts?.body !== undefined, opts?.headers),
|
|
196
|
+
body: opts?.body !== undefined ? JSON.stringify(opts.body) : undefined,
|
|
197
|
+
signal,
|
|
198
|
+
});
|
|
199
|
+
if (!res.ok)
|
|
200
|
+
throw await toError(res);
|
|
201
|
+
return (await res.json());
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
throw normalizeNetworkError(err);
|
|
205
|
+
}
|
|
206
|
+
finally {
|
|
207
|
+
cancel();
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/* ----------------------------- streaming ----------------------------- */
|
|
211
|
+
/** One connection's worth of the attach stream. Yields parsed RunEvents. */
|
|
212
|
+
async function* streamOnce(runId, opts) {
|
|
213
|
+
const sse = opts.transport === "sse";
|
|
214
|
+
const headers = await authHeaders(false, {
|
|
215
|
+
accept: sse ? "text/event-stream" : "application/x-ndjson",
|
|
216
|
+
// SSE resume: header wins over ?since server-side.
|
|
217
|
+
...(sse && opts.since !== undefined ? { "last-event-id": String(opts.since) } : {}),
|
|
218
|
+
});
|
|
219
|
+
const res = await f(url(`runs/${encodeURIComponent(runId)}/attach`, {
|
|
220
|
+
follow: "true",
|
|
221
|
+
tail: opts.tail,
|
|
222
|
+
since: !sse ? opts.since : undefined,
|
|
223
|
+
}), { method: "GET", headers, signal: opts.signal });
|
|
224
|
+
if (!res.ok)
|
|
225
|
+
throw await toError(res);
|
|
226
|
+
if (!res.body)
|
|
227
|
+
return;
|
|
228
|
+
const reader = res.body.getReader();
|
|
229
|
+
const decoder = new TextDecoder();
|
|
230
|
+
let buffer = "";
|
|
231
|
+
const emit = function* (chunk) {
|
|
232
|
+
const evt = parseEventLine(chunk);
|
|
233
|
+
if (evt)
|
|
234
|
+
yield evt;
|
|
235
|
+
};
|
|
236
|
+
try {
|
|
237
|
+
for (;;) {
|
|
238
|
+
const { done, value } = await reader.read();
|
|
239
|
+
if (done)
|
|
240
|
+
break;
|
|
241
|
+
buffer += decoder.decode(value, { stream: true });
|
|
242
|
+
if (sse) {
|
|
243
|
+
// SSE frames are separated by a blank line.
|
|
244
|
+
let idx;
|
|
245
|
+
while ((idx = indexOfFrameBreak(buffer)) !== -1) {
|
|
246
|
+
const frame = buffer.slice(0, idx);
|
|
247
|
+
buffer = buffer.slice(idx).replace(/^(\r?\n){1,2}/, "");
|
|
248
|
+
const parsed = parseSseFrame(frame);
|
|
249
|
+
if (parsed === "DONE")
|
|
250
|
+
return;
|
|
251
|
+
if (parsed)
|
|
252
|
+
yield parsed;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
let nl;
|
|
257
|
+
while ((nl = buffer.indexOf("\n")) !== -1) {
|
|
258
|
+
const line = buffer.slice(0, nl);
|
|
259
|
+
buffer = buffer.slice(nl + 1);
|
|
260
|
+
yield* emit(line);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// flush tail
|
|
265
|
+
buffer += decoder.decode();
|
|
266
|
+
if (sse) {
|
|
267
|
+
const parsed = parseSseFrame(buffer);
|
|
268
|
+
if (parsed && parsed !== "DONE")
|
|
269
|
+
yield parsed;
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
yield* emit(buffer);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
finally {
|
|
276
|
+
try {
|
|
277
|
+
await reader.cancel();
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
/* ignore */
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Attach to a run and stream its events as an async iterator (SPEC §4.6, §6.3).
|
|
286
|
+
* Default NDJSON; pass `{ transport: 'sse' }` for Server-Sent Events. With
|
|
287
|
+
* `{ reconnect: true }` a dropped stream auto-resumes from the last `sequence`.
|
|
288
|
+
*/
|
|
289
|
+
async function* attach(runId, options = {}) {
|
|
290
|
+
const transport = options.transport ?? "ndjson";
|
|
291
|
+
const reconnectDelay = options.reconnectDelayMs ?? 1000;
|
|
292
|
+
const maxReconnects = options.maxReconnects ?? 5;
|
|
293
|
+
let since = options.since;
|
|
294
|
+
let tail = options.tail;
|
|
295
|
+
let attempts = 0;
|
|
296
|
+
let sawTerminal = false;
|
|
297
|
+
for (;;) {
|
|
298
|
+
try {
|
|
299
|
+
for await (const ev of streamOnce(runId, { tail, since, transport, signal: options.signal })) {
|
|
300
|
+
// advance the resume cursor
|
|
301
|
+
if (typeof ev.sequence === "number")
|
|
302
|
+
since = ev.sequence;
|
|
303
|
+
tail = undefined; // after first connect, resume by sequence, not tail
|
|
304
|
+
attempts = 0; // a clean event resets the backoff budget
|
|
305
|
+
yield ev;
|
|
306
|
+
if (TERMINAL_LIFECYCLE_EVENTS.has(ev.type)) {
|
|
307
|
+
sawTerminal = true;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
catch (err) {
|
|
312
|
+
const e = normalizeNetworkError(err);
|
|
313
|
+
// Aborted by the caller, or a real HTTP error → do not reconnect.
|
|
314
|
+
if (options.signal?.aborted || !e.isNetwork || !options.reconnect)
|
|
315
|
+
throw e;
|
|
316
|
+
if (++attempts > maxReconnects)
|
|
317
|
+
throw e;
|
|
318
|
+
await delay(reconnectDelay * attempts, options.signal);
|
|
319
|
+
continue;
|
|
320
|
+
}
|
|
321
|
+
// Stream ended cleanly.
|
|
322
|
+
if (sawTerminal || !options.reconnect || options.signal?.aborted)
|
|
323
|
+
return;
|
|
324
|
+
if (++attempts > maxReconnects)
|
|
325
|
+
return;
|
|
326
|
+
// Non-terminal end (e.g. idle server close) — resume from cursor.
|
|
327
|
+
await delay(reconnectDelay * attempts, options.signal);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Convenience callback wrapper over `attach`. Returns a controller with a
|
|
332
|
+
* `close()` and a `done` promise that resolves when the stream ends.
|
|
333
|
+
*/
|
|
334
|
+
function onEvent(runId, handler, options = {}) {
|
|
335
|
+
const ctl = new AbortController();
|
|
336
|
+
const signal = options.signal
|
|
337
|
+
? anySignal([options.signal, ctl.signal])
|
|
338
|
+
: ctl.signal;
|
|
339
|
+
const done = (async () => {
|
|
340
|
+
for await (const ev of attach(runId, { ...options, signal })) {
|
|
341
|
+
await handler(ev);
|
|
342
|
+
}
|
|
343
|
+
})();
|
|
344
|
+
return { close: () => ctl.abort(), done };
|
|
345
|
+
}
|
|
346
|
+
/* ------------------------------- API -------------------------------- */
|
|
347
|
+
return {
|
|
348
|
+
/** Resolved base URL (with trailing path stripped). */
|
|
349
|
+
baseUrl: rawBase,
|
|
350
|
+
/** GET /status — capability negotiation (SPEC §4.1). */
|
|
351
|
+
status: (opts) => requestJson("GET", "status", { signal: opts?.signal }),
|
|
352
|
+
/** True iff the server advertises every required v0.1 capability. */
|
|
353
|
+
async supportsRequiredCapabilities(opts) {
|
|
354
|
+
const s = await this.status(opts);
|
|
355
|
+
return REQUIRED_CAPABILITIES.every((c) => s.capabilities.includes(c));
|
|
356
|
+
},
|
|
357
|
+
/** POST /runs — create a durable, asynchronous run (SPEC §4.2). */
|
|
358
|
+
async createRun(input, opts) {
|
|
359
|
+
if (!input.prompt || !input.prompt.trim()) {
|
|
360
|
+
throw new AgentsApiError("invalid_request", "createRun requires a non-empty prompt");
|
|
361
|
+
}
|
|
362
|
+
const { idempotencyKey, ...rest } = input;
|
|
363
|
+
const res = await requestJson("POST", "runs", {
|
|
364
|
+
body: { schemaVersion: SCHEMA_VERSION, ...rest },
|
|
365
|
+
signal: opts?.signal,
|
|
366
|
+
...(idempotencyKey ? { headers: { "idempotency-key": idempotencyKey } } : {}),
|
|
367
|
+
});
|
|
368
|
+
return res.run;
|
|
369
|
+
},
|
|
370
|
+
/** GET /runs?limit=<n> — list the caller's runs (SPEC §4.3). */
|
|
371
|
+
async listRuns(options = {}) {
|
|
372
|
+
const res = await requestJson("GET", "runs", {
|
|
373
|
+
query: { limit: options.limit },
|
|
374
|
+
signal: options.signal,
|
|
375
|
+
});
|
|
376
|
+
return res.runs;
|
|
377
|
+
},
|
|
378
|
+
/** GET /runs/:id — fetch one run (SPEC §4.4). 404 → run_not_found. */
|
|
379
|
+
async getRun(runId, opts) {
|
|
380
|
+
const res = await requestJson("GET", `runs/${encodeURIComponent(runId)}`, { signal: opts?.signal });
|
|
381
|
+
return res.run;
|
|
382
|
+
},
|
|
383
|
+
/** GET /runs/:id/events — event history, no follow (SPEC §4.5). */
|
|
384
|
+
async getEvents(runId, options = {}) {
|
|
385
|
+
const res = await requestJson("GET", `runs/${encodeURIComponent(runId)}/events`, { query: { tail: options.tail, since: options.since }, signal: options.signal });
|
|
386
|
+
return (res.events || []).map((e) => (isRunEventLike(e) ? hoistRunEvent(e) : e));
|
|
387
|
+
},
|
|
388
|
+
/** POST /runs/:id/stop — graceful stop (SPEC §4.7). */
|
|
389
|
+
async stopRun(runId, opts) {
|
|
390
|
+
const res = await requestJson("POST", `runs/${encodeURIComponent(runId)}/stop`, { signal: opts?.signal });
|
|
391
|
+
return res.run;
|
|
392
|
+
},
|
|
393
|
+
attach,
|
|
394
|
+
onEvent,
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
/* ------------------------------------------------------------------ *
|
|
398
|
+
* Internal parsing / stream helpers (module-scoped, pure).
|
|
399
|
+
* ------------------------------------------------------------------ */
|
|
400
|
+
/** Parse a single NDJSON line into a RunEvent (skips blanks / [DONE]). */
|
|
401
|
+
function parseEventLine(line) {
|
|
402
|
+
const trimmed = line.trim();
|
|
403
|
+
if (!trimmed || trimmed === "[DONE]" || trimmed === "data: [DONE]")
|
|
404
|
+
return null;
|
|
405
|
+
const data = trimmed.startsWith("data:") ? trimmed.slice(5).trim() : trimmed;
|
|
406
|
+
if (!data || data === "[DONE]")
|
|
407
|
+
return null;
|
|
408
|
+
try {
|
|
409
|
+
const parsed = JSON.parse(data);
|
|
410
|
+
return isRunEventLike(parsed) ? hoistRunEvent(parsed) : null;
|
|
411
|
+
}
|
|
412
|
+
catch {
|
|
413
|
+
return null;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Parse one SSE frame (lines up to a blank line). Returns the RunEvent, the
|
|
418
|
+
* sentinel "DONE", or null (comment/heartbeat/unparseable). Honors `data:` and
|
|
419
|
+
* ignores `: ping` comments and bare `id:` lines.
|
|
420
|
+
*/
|
|
421
|
+
function parseSseFrame(frame) {
|
|
422
|
+
const lines = frame.split(/\r?\n/);
|
|
423
|
+
const dataParts = [];
|
|
424
|
+
for (const line of lines) {
|
|
425
|
+
if (!line || line.startsWith(":"))
|
|
426
|
+
continue; // comment / heartbeat
|
|
427
|
+
if (line.startsWith("data:")) {
|
|
428
|
+
dataParts.push(line.slice(5).replace(/^ /, ""));
|
|
429
|
+
}
|
|
430
|
+
// `id:` / `event:` lines carry no payload for us — the cursor comes from the
|
|
431
|
+
// event's own `sequence`.
|
|
432
|
+
}
|
|
433
|
+
if (dataParts.length === 0)
|
|
434
|
+
return null;
|
|
435
|
+
const data = dataParts.join("\n").trim();
|
|
436
|
+
if (!data)
|
|
437
|
+
return null;
|
|
438
|
+
if (data === "[DONE]")
|
|
439
|
+
return "DONE";
|
|
440
|
+
try {
|
|
441
|
+
const parsed = JSON.parse(data);
|
|
442
|
+
return isRunEventLike(parsed) ? hoistRunEvent(parsed) : null;
|
|
443
|
+
}
|
|
444
|
+
catch {
|
|
445
|
+
return null;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
/** Index of the SSE frame separator (`\n\n` or `\r\n\r\n`) in the buffer, or -1. */
|
|
449
|
+
function indexOfFrameBreak(buffer) {
|
|
450
|
+
const a = buffer.indexOf("\n\n");
|
|
451
|
+
const b = buffer.indexOf("\r\n\r\n");
|
|
452
|
+
if (a === -1)
|
|
453
|
+
return b;
|
|
454
|
+
if (b === -1)
|
|
455
|
+
return a;
|
|
456
|
+
return Math.min(a, b);
|
|
457
|
+
}
|
|
458
|
+
function isRunEventLike(v) {
|
|
459
|
+
return (typeof v === "object" &&
|
|
460
|
+
v !== null &&
|
|
461
|
+
typeof v.type === "string" &&
|
|
462
|
+
typeof v.sequence === "number");
|
|
463
|
+
}
|
|
464
|
+
// Common SDK event fields live under `payload` on the wire. Hoist them to the top
|
|
465
|
+
// of the RunEvent so consumers can read `ev.text` / `ev.toolName` / `ev.usage`
|
|
466
|
+
// directly. Additive + non-destructive: `payload` is preserved and an existing
|
|
467
|
+
// top-level field is never overwritten.
|
|
468
|
+
const HOISTED_PAYLOAD_FIELDS = [
|
|
469
|
+
"text", "toolName", "inputPreview", "resultPreview",
|
|
470
|
+
"tokenUsage", "usage", "creditsSettled", "outputPreview",
|
|
471
|
+
"error", "reason", "status", "statusReason",
|
|
472
|
+
];
|
|
473
|
+
function hoistRunEvent(ev) {
|
|
474
|
+
const p = ev.payload;
|
|
475
|
+
if (p && typeof p === "object") {
|
|
476
|
+
const top = ev;
|
|
477
|
+
for (const k of HOISTED_PAYLOAD_FIELDS) {
|
|
478
|
+
if (p[k] !== undefined && top[k] === undefined)
|
|
479
|
+
top[k] = p[k];
|
|
480
|
+
}
|
|
481
|
+
// `model.text.delta` sometimes carries the chunk as `delta`; normalize to `text`.
|
|
482
|
+
if (top.text === undefined && typeof p.delta === "string")
|
|
483
|
+
top.text = p.delta;
|
|
484
|
+
}
|
|
485
|
+
return ev;
|
|
486
|
+
}
|
|
487
|
+
/** Abortable delay. Rejects nothing — resolves early if the signal aborts. */
|
|
488
|
+
function delay(ms, signal) {
|
|
489
|
+
return new Promise((resolve) => {
|
|
490
|
+
if (signal?.aborted)
|
|
491
|
+
return resolve();
|
|
492
|
+
const t = setTimeout(() => {
|
|
493
|
+
cleanup();
|
|
494
|
+
resolve();
|
|
495
|
+
}, ms);
|
|
496
|
+
const onAbort = () => {
|
|
497
|
+
cleanup();
|
|
498
|
+
resolve();
|
|
499
|
+
};
|
|
500
|
+
const cleanup = () => {
|
|
501
|
+
clearTimeout(t);
|
|
502
|
+
signal?.removeEventListener("abort", onAbort);
|
|
503
|
+
};
|
|
504
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
505
|
+
});
|
|
506
|
+
}
|
|
507
|
+
/** Combine multiple AbortSignals into one (Node ≥18 safe; no AbortSignal.any dep). */
|
|
508
|
+
function anySignal(signals) {
|
|
509
|
+
const ctl = new AbortController();
|
|
510
|
+
const onAbort = (s) => () => ctl.abort(s.reason);
|
|
511
|
+
for (const s of signals) {
|
|
512
|
+
if (s.aborted) {
|
|
513
|
+
ctl.abort(s.reason);
|
|
514
|
+
break;
|
|
515
|
+
}
|
|
516
|
+
s.addEventListener("abort", onAbort(s), { once: true });
|
|
517
|
+
}
|
|
518
|
+
return ctl.signal;
|
|
519
|
+
}
|
|
520
|
+
//# sourceMappingURL=xeno-agents-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xeno-agents-client.js","sourceRoot":"","sources":["../../src/hosted/xeno-agents-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixtureProvider.d.ts","sourceRoot":"","sources":["../../src/providers/fixtureProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EACV,qBAAqB,EACrB,kBAAkB,EAOnB,MAAM,oBAAoB,CAAC;AAE5B,eAAO,MAAM,kBAAkB,4DAA4D,CAAC;AAE5F,4EAA4E;AAC5E,eAAO,MAAM,oBAAoB,EAAE,qBAYlC,CAAC;
|
|
1
|
+
{"version":3,"file":"fixtureProvider.d.ts","sourceRoot":"","sources":["../../src/providers/fixtureProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EACV,qBAAqB,EACrB,kBAAkB,EAOnB,MAAM,oBAAoB,CAAC;AAE5B,eAAO,MAAM,kBAAkB,4DAA4D,CAAC;AAE5F,4EAA4E;AAC5E,eAAO,MAAM,oBAAoB,EAAE,qBAYlC,CAAC;AA2IF,wBAAgB,+BAA+B,IAAI,kBAAkB,CA0BpE"}
|
|
@@ -43,6 +43,7 @@ class FixtureRuntime {
|
|
|
43
43
|
initialize() {
|
|
44
44
|
/* nothing to set up */
|
|
45
45
|
}
|
|
46
|
+
steered = [];
|
|
46
47
|
createSession() {
|
|
47
48
|
this.sessionSeq += 1;
|
|
48
49
|
return { sessionId: `fixture-session-${this.sessionSeq}`, createdAt: this.now() };
|
|
@@ -50,6 +51,22 @@ class FixtureRuntime {
|
|
|
50
51
|
cancel() {
|
|
51
52
|
/* cancellation is delivered via the prompt's AbortSignal; nothing extra to do */
|
|
52
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Mid-turn correction (ADE §5.5, `session/steer`).
|
|
56
|
+
*
|
|
57
|
+
* ⚠️ A REAL implementation, not a stub that always accepts. A fixture that returns
|
|
58
|
+
* `{accepted:true}` unconditionally proves the wiring and nothing about the contract — and the
|
|
59
|
+
* contract's point is that `accepted:false` is a first-class result a client must be able to
|
|
60
|
+
* act on. So this records what it was told, which lets a test assert the instruction ARRIVED
|
|
61
|
+
* rather than that a call returned.
|
|
62
|
+
*/
|
|
63
|
+
steer(sessionId, instruction) {
|
|
64
|
+
if (this.promptCount === 0) {
|
|
65
|
+
return { accepted: false, reason: 'The fixture has no prompt running.' };
|
|
66
|
+
}
|
|
67
|
+
this.steered.push({ sessionId, instruction });
|
|
68
|
+
return { accepted: true };
|
|
69
|
+
}
|
|
53
70
|
dispose() {
|
|
54
71
|
/* no resources */
|
|
55
72
|
}
|
|
@@ -58,6 +75,9 @@ class FixtureRuntime {
|
|
|
58
75
|
provider: this.definition.id,
|
|
59
76
|
sessionsCreated: this.sessionSeq,
|
|
60
77
|
promptsRun: this.promptCount,
|
|
78
|
+
// Visible in diagnostics so a test can prove the instruction REACHED the provider, rather
|
|
79
|
+
// than only that `session/steer` answered.
|
|
80
|
+
steered: this.steered.map((entry) => entry.instruction),
|
|
61
81
|
options: this.options,
|
|
62
82
|
};
|
|
63
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixtureProvider.js","sourceRoot":"","sources":["../../src/providers/fixtureProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAY9D,MAAM,CAAC,MAAM,kBAAkB,GAAG,yDAAyD,CAAC;AAE5F,4EAA4E;AAC5E,MAAM,CAAC,MAAM,oBAAoB,GAA0B;IACzD,WAAW,EAAE,IAAI;IACjB,SAAS,EAAE,IAAI;IACf,cAAc,EAAE,IAAI;IACpB,UAAU,EAAE,IAAI;IAChB,cAAc,EAAE,IAAI;IACpB,wBAAwB,EAAE,IAAI;IAC9B,YAAY,EAAE,KAAK;IACnB,WAAW,EAAE,KAAK;IAClB,YAAY,EAAE,KAAK;IACnB,aAAa,EAAE,KAAK;IACpB,cAAc,EAAE,KAAK;CACtB,CAAC;AAQF,MAAM,cAAc;IACT,UAAU,CAAqB;IACvB,OAAO,CAAiB;IACxB,GAAG,CAAe;IAC3B,UAAU,GAAG,CAAC,CAAC;IACf,WAAW,GAAG,CAAC,CAAC;IAExB,YAAY,UAA8B,EAAE,MAA8B;QACxE,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE,CAAmB,CAAC;QACpD,IAAI,CAAC,OAAO,GAAG;YACb,GAAG,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;YACrB,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;SAClC,CAAC;QACF,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,CAAC;IAED,UAAU;QACR,uBAAuB;IACzB,CAAC;
|
|
1
|
+
{"version":3,"file":"fixtureProvider.js","sourceRoot":"","sources":["../../src/providers/fixtureProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -125,6 +125,19 @@ export interface ProviderRuntimeContext {
|
|
|
125
125
|
/** Optional client-mediated host helpers exposed by XENO ACP extensions. */
|
|
126
126
|
host?: ProviderHostContext;
|
|
127
127
|
}
|
|
128
|
+
/**
|
|
129
|
+
* The outcome of a mid-turn correction.
|
|
130
|
+
*
|
|
131
|
+
* 🔴 `accepted: false` is a RESULT, not an error. A provider that is between tool calls, or
|
|
132
|
+
* whose upstream will not take input mid-stream, must be able to say so — and the client must be
|
|
133
|
+
* able to tell that apart from "delivered". A correction the user believes landed and did not is
|
|
134
|
+
* the worst outcome available here.
|
|
135
|
+
*/
|
|
136
|
+
export interface ProviderSteerResult {
|
|
137
|
+
accepted: boolean;
|
|
138
|
+
/** Why not. Shown to the operator, so it must name something they can act on. */
|
|
139
|
+
reason?: string;
|
|
140
|
+
}
|
|
128
141
|
/** A live provider instance. One per agent process; sessions/prompts run against it. */
|
|
129
142
|
export interface ProviderRuntime {
|
|
130
143
|
readonly definition: ProviderDefinition;
|
|
@@ -132,6 +145,18 @@ export interface ProviderRuntime {
|
|
|
132
145
|
createSession(): ProviderSession;
|
|
133
146
|
prompt(request: ProviderPromptRequest, ctx: ProviderRuntimeContext): Promise<ProviderPromptResult>;
|
|
134
147
|
cancel(sessionId: string): void;
|
|
148
|
+
/**
|
|
149
|
+
* Deliver a correction into a RUNNING prompt (ADE §5.5).
|
|
150
|
+
*
|
|
151
|
+
* ⚠️ OPTIONAL, and its presence IS the capability declaration — `acpAgentServer` derives what
|
|
152
|
+
* it advertises from `typeof runtime.steer === 'function'` rather than from a hand-written flag,
|
|
153
|
+
* so the advertisement cannot drift from the implementation.
|
|
154
|
+
*
|
|
155
|
+
* ⚠️ Deliberately NOT added to `ProviderCapabilitySet`: that is a required-field interface
|
|
156
|
+
* implemented by every provider definition, so a new field there would be a breaking change for
|
|
157
|
+
* a fact already derivable from this method.
|
|
158
|
+
*/
|
|
159
|
+
steer?(sessionId: string, instruction: string): ProviderSteerResult | Promise<ProviderSteerResult>;
|
|
135
160
|
dispose(): Promise<void> | void;
|
|
136
161
|
diagnostics(): Record<string, unknown>;
|
|
137
162
|
}
|