@xenosystem/acp-core 0.1.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.
Files changed (60) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +9 -0
  3. package/README.md +26 -0
  4. package/dist/agent-process.d.ts +94 -0
  5. package/dist/agent-process.d.ts.map +1 -0
  6. package/dist/agent-process.js +391 -0
  7. package/dist/agent-process.js.map +1 -0
  8. package/dist/agent-version-policy.d.ts +25 -0
  9. package/dist/agent-version-policy.d.ts.map +1 -0
  10. package/dist/agent-version-policy.js +87 -0
  11. package/dist/agent-version-policy.js.map +1 -0
  12. package/dist/capabilities.d.ts +41 -0
  13. package/dist/capabilities.d.ts.map +1 -0
  14. package/dist/capabilities.js +202 -0
  15. package/dist/capabilities.js.map +1 -0
  16. package/dist/certification.d.ts +3 -0
  17. package/dist/certification.d.ts.map +1 -0
  18. package/dist/certification.js +3 -0
  19. package/dist/certification.js.map +1 -0
  20. package/dist/config.d.ts +23 -0
  21. package/dist/config.d.ts.map +1 -0
  22. package/dist/config.js +136 -0
  23. package/dist/config.js.map +1 -0
  24. package/dist/flatten.d.ts +31 -0
  25. package/dist/flatten.d.ts.map +1 -0
  26. package/dist/flatten.js +82 -0
  27. package/dist/flatten.js.map +1 -0
  28. package/dist/index.d.ts +33 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +33 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/logger.d.ts +17 -0
  33. package/dist/logger.d.ts.map +1 -0
  34. package/dist/logger.js +38 -0
  35. package/dist/logger.js.map +1 -0
  36. package/dist/manager.d.ts +54 -0
  37. package/dist/manager.d.ts.map +1 -0
  38. package/dist/manager.js +194 -0
  39. package/dist/manager.js.map +1 -0
  40. package/dist/process-resolver.d.ts +50 -0
  41. package/dist/process-resolver.d.ts.map +1 -0
  42. package/dist/process-resolver.js +78 -0
  43. package/dist/process-resolver.js.map +1 -0
  44. package/dist/registry.d.ts +21 -0
  45. package/dist/registry.d.ts.map +1 -0
  46. package/dist/registry.js +74 -0
  47. package/dist/registry.js.map +1 -0
  48. package/dist/session.d.ts +34 -0
  49. package/dist/session.d.ts.map +1 -0
  50. package/dist/session.js +146 -0
  51. package/dist/session.js.map +1 -0
  52. package/dist/types.d.ts +161 -0
  53. package/dist/types.d.ts.map +1 -0
  54. package/dist/types.js +9 -0
  55. package/dist/types.js.map +1 -0
  56. package/dist/workspace.d.ts +27 -0
  57. package/dist/workspace.d.ts.map +1 -0
  58. package/dist/workspace.js +47 -0
  59. package/dist/workspace.js.map +1 -0
  60. package/package.json +59 -0
@@ -0,0 +1,391 @@
1
+ /**
2
+ * `AgentProcess` supervises one long-lived ACP agent subprocess.
3
+ *
4
+ * This is the low-level embedding boundary used by `AcpManager` and desktop hosts such as
5
+ * XENO Hub. The official ACP SDK owns JSON-RPC framing and validation; embedders provide
6
+ * permission and extension handlers without reimplementing the protocol.
7
+ */
8
+ import { spawn } from "node:child_process";
9
+ import { Readable, Writable } from "node:stream";
10
+ import * as acp from "@agentclientprotocol/sdk";
11
+ import { Session } from "./session.js";
12
+ import { createClientHandler } from "./capabilities.js";
13
+ import { createWorkspace } from "./workspace.js";
14
+ import { resolveCommand } from "./process-resolver.js";
15
+ import { checkAgentVersionReadiness } from "./agent-version-policy.js";
16
+ export class AgentProcess {
17
+ def;
18
+ workspaceRoot;
19
+ keepWorkspaces;
20
+ logger;
21
+ options;
22
+ child;
23
+ conn;
24
+ sessions = new Map();
25
+ state = "idle";
26
+ lastError;
27
+ startPromise;
28
+ initialization;
29
+ stderrTail = [];
30
+ malformedMessageCount = 0;
31
+ unsupportedMethodCount = 0;
32
+ stdoutBuffer = "";
33
+ exitCode;
34
+ exitSignal;
35
+ constructor(opts) {
36
+ this.options = opts;
37
+ this.def = opts.def;
38
+ this.workspaceRoot = opts.workspaceRoot;
39
+ this.keepWorkspaces = opts.keepWorkspaces;
40
+ this.logger = opts.logger.child(opts.def.id);
41
+ }
42
+ status() {
43
+ return {
44
+ id: this.def.id,
45
+ name: this.def.name,
46
+ state: this.state,
47
+ activeSessions: this.sessions.size,
48
+ ...(this.child?.pid != null ? { pid: this.child.pid } : {}),
49
+ ...(this.lastError ? { lastError: this.lastError } : {}),
50
+ };
51
+ }
52
+ diagnostics() {
53
+ return {
54
+ ...(this.initialization ? { initialization: this.initialization } : {}),
55
+ stderrTail: [...this.stderrTail],
56
+ malformedMessageCount: this.malformedMessageCount,
57
+ unsupportedMethodCount: this.unsupportedMethodCount,
58
+ ...(this.exitCode !== undefined ? { exitCode: this.exitCode } : {}),
59
+ ...(this.exitSignal !== undefined ? { signal: this.exitSignal } : {}),
60
+ };
61
+ }
62
+ /** Spawn + initialize on first use; idempotent and safe to call concurrently. */
63
+ async ensureReady() {
64
+ if (this.state === "ready")
65
+ return;
66
+ if (this.startPromise)
67
+ return this.startPromise;
68
+ this.startPromise = this.start().finally(() => {
69
+ this.startPromise = undefined;
70
+ });
71
+ return this.startPromise;
72
+ }
73
+ async start() {
74
+ this.state = "starting";
75
+ this.lastError = undefined;
76
+ if (!this.options.skipVersionCheck) {
77
+ const version = checkAgentVersionReadiness(this.def);
78
+ if (!version.ok) {
79
+ this.state = "error";
80
+ this.lastError = version.message;
81
+ throw new Error(`${version.message}${version.updateHint ? ` (${version.updateHint})` : ""}`);
82
+ }
83
+ }
84
+ const resolved = resolveCommand(this.def.cmd, this.def.args);
85
+ this.logger.info(`spawning: ${resolved.file} ${resolved.args.join(" ")}` +
86
+ (resolved.viaCmd ? " (via cmd.exe /c, shell:false)" : ""));
87
+ const inheritedEnv = this.options.inheritEnv === false
88
+ ? {}
89
+ : this.options.inheritedEnvKeys
90
+ ? Object.fromEntries(this.options.inheritedEnvKeys.map((key) => [key, process.env[key]]))
91
+ : process.env;
92
+ const env = {
93
+ ...inheritedEnv,
94
+ ...(this.def.env ?? {}),
95
+ };
96
+ for (const key of this.def.unsetEnv ?? [])
97
+ delete env[key];
98
+ const child = spawn(resolved.file, resolved.args, {
99
+ stdio: ["pipe", "pipe", "pipe"],
100
+ shell: false,
101
+ env,
102
+ ...(this.def.cwd ? { cwd: this.def.cwd } : {}),
103
+ });
104
+ this.child = child;
105
+ this.exitCode = undefined;
106
+ this.exitSignal = undefined;
107
+ child.on("exit", (code, signal) => {
108
+ this.exitCode = code;
109
+ this.exitSignal = signal;
110
+ this.logger.warn(`process exited (code=${code} signal=${signal})`);
111
+ this.handleExit(`agent process exited (code=${code}, signal=${signal})`);
112
+ });
113
+ child.on("error", (err) => {
114
+ this.logger.error(`process error: ${err.message}`);
115
+ this.lastError = err.message;
116
+ this.handleExit(`agent process error: ${err.message}`);
117
+ });
118
+ if (!child.stdin || !child.stdout || !child.stderr) {
119
+ throw new Error("failed to open agent stdio pipes");
120
+ }
121
+ child.stderr.setEncoding("utf8");
122
+ child.stderr.on("data", (chunk) => {
123
+ const text = String(chunk);
124
+ this.options.onStderr?.(text);
125
+ for (const line of text.split(/\r?\n/)) {
126
+ if (!line)
127
+ continue;
128
+ this.stderrTail.push(line.slice(0, 1000));
129
+ if (this.stderrTail.length > 50)
130
+ this.stderrTail.shift();
131
+ }
132
+ });
133
+ // Observe framing only for counters. The official SDK remains the sole JSON-RPC parser.
134
+ child.stdout.on("data", (chunk) => this.observeStdout(String(chunk)));
135
+ const writable = Writable.toWeb(child.stdin);
136
+ const readable = Readable.toWeb(child.stdout);
137
+ const stream = acp.ndJsonStream(writable, readable);
138
+ const advertisedCapabilities = this.options.clientCapabilities;
139
+ const handler = createClientHandler({
140
+ dispatch: (n) => this.sessions.get(n.sessionId)?.onUpdate(n.update),
141
+ workspaceFor: (sid) => this.sessions.get(sid)?.workspace,
142
+ permission: this.def.permission ?? "auto",
143
+ terminalTimeoutMs: this.def.terminalTimeoutMs ?? 120_000,
144
+ logger: this.logger,
145
+ requestPermission: this.options.requestPermission,
146
+ extMethod: this.options.extMethod,
147
+ extNotification: this.options.extNotification,
148
+ onUnsupportedMethod: () => {
149
+ this.unsupportedMethodCount += 1;
150
+ },
151
+ allowReadFileSystem: advertisedCapabilities
152
+ ? advertisedCapabilities.fs?.readTextFile === true
153
+ : true,
154
+ allowWriteFileSystem: advertisedCapabilities
155
+ ? advertisedCapabilities.fs?.writeTextFile === true
156
+ : true,
157
+ allowTerminal: advertisedCapabilities ? advertisedCapabilities.terminal === true : true,
158
+ });
159
+ this.conn = new acp.ClientSideConnection(() => handler, stream);
160
+ const initTimeout = this.def.initTimeoutMs ?? 60_000;
161
+ try {
162
+ this.initialization = await withTimeout(this.conn.initialize({
163
+ protocolVersion: acp.PROTOCOL_VERSION,
164
+ clientCapabilities: this.options.clientCapabilities ?? {
165
+ fs: { readTextFile: true, writeTextFile: true },
166
+ terminal: true,
167
+ },
168
+ ...(this.options.clientInfo ? { clientInfo: this.options.clientInfo } : {}),
169
+ }), initTimeout, `initialize timed out after ${initTimeout}ms`);
170
+ if (this.initialization.protocolVersion !== acp.PROTOCOL_VERSION) {
171
+ throw new Error(`unsupported ACP protocol version: ${this.initialization.protocolVersion}`);
172
+ }
173
+ this.state = "ready";
174
+ this.logger.info("ready");
175
+ }
176
+ catch (err) {
177
+ this.lastError = err.message;
178
+ this.state = "error";
179
+ this.logger.error(`initialize failed: ${this.lastError}`);
180
+ try {
181
+ child.kill();
182
+ }
183
+ catch {
184
+ /* ignore */
185
+ }
186
+ throw err;
187
+ }
188
+ }
189
+ handleExit(reason) {
190
+ this.lastError = reason;
191
+ this.state = "stopped";
192
+ for (const session of this.sessions.values())
193
+ session.fail(reason);
194
+ this.sessions.clear();
195
+ this.conn = undefined;
196
+ this.child = undefined;
197
+ }
198
+ /** Create a fresh ACP session. Operator-supplied workspaces are never deleted by core. */
199
+ async createSession(overrideOrOptions) {
200
+ await this.ensureReady();
201
+ if (!this.conn)
202
+ throw new Error(`agent ${this.def.id} is not ready`);
203
+ const options = typeof overrideOrOptions === "string"
204
+ ? { workspace: overrideOrOptions }
205
+ : (overrideOrOptions ?? {});
206
+ const workspace = createWorkspace(this.workspaceRoot, this.def.id, `s-${Date.now().toString(36)}-${Math.floor(performance.now())}`, {
207
+ keep: this.keepWorkspaces,
208
+ ...(options.workspace ? { override: options.workspace } : {}),
209
+ });
210
+ let response;
211
+ try {
212
+ response = await this.conn.newSession({
213
+ cwd: workspace.dir,
214
+ mcpServers: options.mcpServers ?? [],
215
+ ...(options.additionalDirectories?.length && this.supportsAdditionalDirectories()
216
+ ? { additionalDirectories: [...new Set(options.additionalDirectories)] }
217
+ : {}),
218
+ ...(options._meta ? { _meta: options._meta } : {}),
219
+ });
220
+ }
221
+ catch (err) {
222
+ workspace.cleanup();
223
+ const message = err.message ?? String(err);
224
+ if (/auth/i.test(message)) {
225
+ this.state = "needs-auth";
226
+ this.lastError = message;
227
+ throw err;
228
+ }
229
+ throw err;
230
+ }
231
+ const session = new Session(response.sessionId, workspace);
232
+ this.sessions.set(response.sessionId, session);
233
+ return session;
234
+ }
235
+ /** Drive a prompt without closing the ACP session, for stateful embedding hosts. */
236
+ async promptSession(session, prompt, options = {}) {
237
+ if (!this.conn)
238
+ throw new Error(`agent ${this.def.id} is not ready`);
239
+ if (options.signal?.aborted)
240
+ return { stopReason: "cancelled" };
241
+ const conn = this.conn;
242
+ session.setRawUpdateHandler(options.onUpdate
243
+ ? (update) => options.onUpdate?.({ sessionId: session.id, update })
244
+ : undefined);
245
+ const cancel = () => {
246
+ void conn.cancel({ sessionId: session.id }).catch(() => undefined);
247
+ };
248
+ if (options.signal)
249
+ options.signal.addEventListener("abort", cancel, { once: true });
250
+ const systemPrompt = options.systemPrompt?.trim();
251
+ const params = {
252
+ sessionId: session.id,
253
+ prompt,
254
+ ...(options.model ? { model: options.model } : {}),
255
+ ...(systemPrompt ? { _meta: { "xeno.dev/context": { systemPrompt } } } : {}),
256
+ };
257
+ try {
258
+ const request = conn.prompt(params);
259
+ return options.timeoutMs
260
+ ? await withTimeout(request, options.timeoutMs, `prompt timed out after ${options.timeoutMs}ms`, cancel)
261
+ : await request;
262
+ }
263
+ finally {
264
+ if (options.signal)
265
+ options.signal.removeEventListener("abort", cancel);
266
+ session.setRawUpdateHandler(undefined);
267
+ }
268
+ }
269
+ async cancelSession(sessionId) {
270
+ if (!this.conn)
271
+ throw new Error(`agent ${this.def.id} is not ready`);
272
+ await this.conn.cancel({ sessionId });
273
+ }
274
+ /** Drive an ephemeral prompt and close its event queue/workspace. */
275
+ async runPrompt(session, prompt, signal) {
276
+ try {
277
+ const response = await this.promptSession(session, prompt, { signal });
278
+ if (response.usage) {
279
+ session.push({
280
+ type: "usage",
281
+ ...(response.usage.inputTokens != null ? { inputTokens: response.usage.inputTokens } : {}),
282
+ ...(response.usage.outputTokens != null ? { outputTokens: response.usage.outputTokens } : {}),
283
+ ...(response.usage.totalTokens != null ? { totalTokens: response.usage.totalTokens } : {}),
284
+ });
285
+ }
286
+ session.end(response.stopReason);
287
+ }
288
+ catch (err) {
289
+ session.fail(err.message ?? String(err));
290
+ }
291
+ finally {
292
+ this.sessions.delete(session.id);
293
+ session.workspace.cleanup();
294
+ }
295
+ }
296
+ async dispose() {
297
+ for (const session of this.sessions.values()) {
298
+ session.fail("shutting down");
299
+ session.workspace.cleanup();
300
+ }
301
+ this.sessions.clear();
302
+ const child = this.child;
303
+ if (child) {
304
+ await new Promise((resolve) => {
305
+ let settled = false;
306
+ let forceTimer;
307
+ let releaseTimer;
308
+ const hasExited = () => child.exitCode !== null || child.signalCode !== null;
309
+ const finish = () => {
310
+ if (settled)
311
+ return;
312
+ settled = true;
313
+ if (forceTimer)
314
+ clearTimeout(forceTimer);
315
+ if (releaseTimer)
316
+ clearTimeout(releaseTimer);
317
+ child.removeListener("close", finish);
318
+ resolve();
319
+ };
320
+ const forceStop = () => {
321
+ try {
322
+ if (!hasExited())
323
+ child.kill("SIGKILL");
324
+ }
325
+ catch {
326
+ /* ignore */
327
+ }
328
+ if (hasExited())
329
+ finish();
330
+ else
331
+ releaseTimer = setTimeout(finish, 1_000);
332
+ };
333
+ if (hasExited()) {
334
+ finish();
335
+ return;
336
+ }
337
+ child.once("close", finish);
338
+ forceTimer = setTimeout(forceStop, 1_000);
339
+ try {
340
+ child.kill("SIGTERM");
341
+ }
342
+ catch {
343
+ forceStop();
344
+ }
345
+ });
346
+ }
347
+ this.conn = undefined;
348
+ this.child = undefined;
349
+ this.state = "stopped";
350
+ }
351
+ supportsAdditionalDirectories() {
352
+ const capabilities = this.initialization?.agentCapabilities;
353
+ const sessionCapabilities = capabilities?.sessionCapabilities;
354
+ if (!sessionCapabilities || typeof sessionCapabilities !== "object" || Array.isArray(sessionCapabilities))
355
+ return false;
356
+ const value = sessionCapabilities.additionalDirectories;
357
+ return !!value && typeof value === "object" && !Array.isArray(value);
358
+ }
359
+ observeStdout(chunk) {
360
+ this.stdoutBuffer += chunk;
361
+ while (this.stdoutBuffer.includes("\n")) {
362
+ const index = this.stdoutBuffer.indexOf("\n");
363
+ const line = this.stdoutBuffer.slice(0, index).replace(/\r$/, "");
364
+ this.stdoutBuffer = this.stdoutBuffer.slice(index + 1);
365
+ if (!line.trim())
366
+ continue;
367
+ try {
368
+ JSON.parse(line);
369
+ }
370
+ catch {
371
+ this.malformedMessageCount += 1;
372
+ }
373
+ }
374
+ }
375
+ }
376
+ function withTimeout(promise, milliseconds, message, onTimeout) {
377
+ return new Promise((resolve, reject) => {
378
+ const timer = setTimeout(() => {
379
+ onTimeout?.();
380
+ reject(new Error(message));
381
+ }, milliseconds);
382
+ promise.then((value) => {
383
+ clearTimeout(timer);
384
+ resolve(value);
385
+ }, (error) => {
386
+ clearTimeout(timer);
387
+ reject(error);
388
+ });
389
+ });
390
+ }
391
+ //# sourceMappingURL=agent-process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-process.js","sourceRoot":"","sources":["../src/agent-process.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,GAAG,MAAM,0BAA0B,CAAC;AAchD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAsDvE,MAAM,OAAO,YAAY;IACd,GAAG,CAAW;IACN,aAAa,CAAS;IACtB,cAAc,CAAU;IACxB,MAAM,CAAS;IACf,OAAO,CAAsB;IAEtC,KAAK,CAAgB;IACrB,IAAI,CAA4B;IACvB,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC/C,KAAK,GAAU,MAAM,CAAC;IACtB,SAAS,CAAU;IACnB,YAAY,CAAiB;IAC7B,cAAc,CAAsB;IACpC,UAAU,GAAa,EAAE,CAAC;IAC1B,qBAAqB,GAAG,CAAC,CAAC;IAC1B,sBAAsB,GAAG,CAAC,CAAC;IAC3B,YAAY,GAAG,EAAE,CAAC;IAClB,QAAQ,CAAiB;IACzB,UAAU,CAAyB;IAE3C,YAAY,IAAyB;QACnC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACpB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACxC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QAC1C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM;QACJ,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE;YACf,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;YAClC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD,CAAC;IACJ,CAAC;IAED,WAAW;QACT,OAAO;YACL,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC;YAChC,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;YACjD,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;YACnD,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtE,CAAC;IACJ,CAAC;IAED,iFAAiF;IACjF,KAAK,CAAC,WAAW;QACf,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO;YAAE,OAAO;QACnC,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC,YAAY,CAAC;QAChD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;YAC5C,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;QAChC,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,KAAK;QACjB,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAE3B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,0BAA0B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrD,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;gBAChB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;gBACrB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;gBACjC,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/F,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,aAAa,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YACrD,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,EAAE,CAAC,CAC7D,CAAC;QAEF,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,KAAK,KAAK;YACpD,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB;gBAC7B,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACzF,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;QAClB,MAAM,GAAG,GAAuC;YAC9C,GAAG,YAAY;YACf,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;SACxB,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE;YAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;QAE3D,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE;YAChD,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,KAAK,EAAE,KAAK;YACZ,GAAG;YACH,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/C,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAE5B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAChC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,IAAI,WAAW,MAAM,GAAG,CAAC,CAAC;YACnE,IAAI,CAAC,UAAU,CAAC,8BAA8B,IAAI,YAAY,MAAM,GAAG,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACnD,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC;YAC7B,IAAI,CAAC,UAAU,CAAC,wBAAwB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACjC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAChC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3B,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC;YAC9B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvC,IAAI,CAAC,IAAI;oBAAE,SAAS;gBACpB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC1C,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE;oBAAE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YAC3D,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,wFAAwF;QACxF,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEtE,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAA+B,CAAC;QAC3E,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAA0C,CAAC;QACvF,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAEpD,MAAM,sBAAsB,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;QAC/D,MAAM,OAAO,GAAG,mBAAmB,CAAC;YAClC,QAAQ,EAAE,CAAC,CAAsB,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;YACxF,YAAY,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,SAAS;YAChE,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,MAAM;YACzC,iBAAiB,EAAE,IAAI,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO;YACxD,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,iBAAiB,EAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB;YACjD,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;YACjC,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe;YAC7C,mBAAmB,EAAE,GAAG,EAAE;gBACxB,IAAI,CAAC,sBAAsB,IAAI,CAAC,CAAC;YACnC,CAAC;YACD,mBAAmB,EAAE,sBAAsB;gBACzC,CAAC,CAAC,sBAAsB,CAAC,EAAE,EAAE,YAAY,KAAK,IAAI;gBAClD,CAAC,CAAC,IAAI;YACR,oBAAoB,EAAE,sBAAsB;gBAC1C,CAAC,CAAC,sBAAsB,CAAC,EAAE,EAAE,aAAa,KAAK,IAAI;gBACnD,CAAC,CAAC,IAAI;YACR,aAAa,EAAE,sBAAsB,CAAC,CAAC,CAAC,sBAAsB,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI;SACxF,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,oBAAoB,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAEhE,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,IAAI,MAAM,CAAC;QACrD,IAAI,CAAC;YACH,IAAI,CAAC,cAAc,GAAG,MAAM,WAAW,CACrC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;gBACnB,eAAe,EAAE,GAAG,CAAC,gBAAgB;gBACrC,kBAAkB,EAAE,IAAI,CAAC,OAAO,CAAC,kBAAkB,IAAI;oBACrD,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;oBAC/C,QAAQ,EAAE,IAAI;iBACf;gBACD,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC5E,CAAC,EACF,WAAW,EACX,8BAA8B,WAAW,IAAI,CAC9C,CAAC;YACF,IAAI,IAAI,CAAC,cAAc,CAAC,eAAe,KAAK,GAAG,CAAC,gBAAgB,EAAE,CAAC;gBACjE,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC,CAAC;YAC9F,CAAC;YACD,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;YACrB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,SAAS,GAAI,GAAa,CAAC,OAAO,CAAC;YACxC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;YACrB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YAC1D,IAAI,CAAC;gBACH,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,MAAc;QAC/B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;YAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QACtB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;IACzB,CAAC;IAED,0FAA0F;IAC1F,KAAK,CAAC,aAAa,CAAC,iBAAgD;QAClE,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC,CAAC;QACrE,MAAM,OAAO,GAAwB,OAAO,iBAAiB,KAAK,QAAQ;YACxE,CAAC,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE;YAClC,CAAC,CAAC,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;QAE9B,MAAM,SAAS,GAAG,eAAe,CAC/B,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,GAAG,CAAC,EAAE,EACX,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,EAC/D;YACE,IAAI,EAAE,IAAI,CAAC,cAAc;YACzB,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9D,CACF,CAAC;QAEF,IAAI,QAAgC,CAAC;QACrC,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;gBACpC,GAAG,EAAE,SAAS,CAAC,GAAG;gBAClB,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE;gBACpC,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,IAAI,IAAI,CAAC,6BAA6B,EAAE;oBAC/E,CAAC,CAAC,EAAE,qBAAqB,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,EAAE;oBACxE,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACnD,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,OAAO,GAAI,GAAa,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;YACtD,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC;gBAC1B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;gBACzB,MAAM,GAAG,CAAC;YACZ,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC3D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,oFAAoF;IACpF,KAAK,CAAC,aAAa,CACjB,OAAgB,EAChB,MAAsB,EACtB,UAA8B,EAAE;QAEhC,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC,CAAC;QACrE,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;YAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;QAChE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,QAAQ;YAC1C,CAAC,CAAC,CAAC,MAAqB,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC;YAClF,CAAC,CAAC,SAAS,CAAC,CAAC;QACf,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACrE,CAAC,CAAC;QACF,IAAI,OAAO,CAAC,MAAM;YAAE,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACrF,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG;YACb,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,MAAM;YACN,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,kBAAkB,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7E,CAAC;QACF,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACpC,OAAO,OAAO,CAAC,SAAS;gBACtB,CAAC,CAAC,MAAM,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,EAAE,0BAA0B,OAAO,CAAC,SAAS,IAAI,EAAE,MAAM,CAAC;gBACxG,CAAC,CAAC,MAAM,OAAO,CAAC;QACpB,CAAC;gBAAS,CAAC;YACT,IAAI,OAAO,CAAC,MAAM;gBAAE,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACxE,OAAO,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,SAAiB;QACnC,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC,CAAC;QACrE,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,qEAAqE;IACrE,KAAK,CAAC,SAAS,CAAC,OAAgB,EAAE,MAAsB,EAAE,MAAoB;QAC5E,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACvE,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,OAAO;oBACb,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC1F,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC7F,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC3F,CAAC,CAAC;YACL,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAE,GAAa,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACtD,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACjC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC9B,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAClC,IAAI,OAAO,GAAG,KAAK,CAAC;gBACpB,IAAI,UAAsC,CAAC;gBAC3C,IAAI,YAAwC,CAAC;gBAC7C,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;gBAC7E,MAAM,MAAM,GAAG,GAAG,EAAE;oBAClB,IAAI,OAAO;wBAAE,OAAO;oBACpB,OAAO,GAAG,IAAI,CAAC;oBACf,IAAI,UAAU;wBAAE,YAAY,CAAC,UAAU,CAAC,CAAC;oBACzC,IAAI,YAAY;wBAAE,YAAY,CAAC,YAAY,CAAC,CAAC;oBAC7C,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;oBACtC,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC;gBACF,MAAM,SAAS,GAAG,GAAG,EAAE;oBACrB,IAAI,CAAC;wBACH,IAAI,CAAC,SAAS,EAAE;4BAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBAC1C,CAAC;oBAAC,MAAM,CAAC;wBACP,YAAY;oBACd,CAAC;oBACD,IAAI,SAAS,EAAE;wBAAE,MAAM,EAAE,CAAC;;wBACrB,YAAY,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBAChD,CAAC,CAAC;gBAEF,IAAI,SAAS,EAAE,EAAE,CAAC;oBAChB,MAAM,EAAE,CAAC;oBACT,OAAO;gBACT,CAAC;gBAED,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC5B,UAAU,GAAG,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBAC1C,IAAI,CAAC;oBACH,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACxB,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS,EAAE,CAAC;gBACd,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QACtB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;IACzB,CAAC;IAEO,6BAA6B;QACnC,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,EAAE,iBAAwD,CAAC;QACnG,MAAM,mBAAmB,GAAG,YAAY,EAAE,mBAAmB,CAAC;QAC9D,IAAI,CAAC,mBAAmB,IAAI,OAAO,mBAAmB,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC;YAAE,OAAO,KAAK,CAAC;QACxH,MAAM,KAAK,GAAI,mBAA+C,CAAC,qBAAqB,CAAC;QACrF,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACvE,CAAC;IAEO,aAAa,CAAC,KAAa;QACjC,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC;QAC3B,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAClE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YACvD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,SAAS;YAC3B,IAAI,CAAC;gBACH,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC,qBAAqB,IAAI,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,SAAS,WAAW,CAClB,OAAmB,EACnB,YAAoB,EACpB,OAAe,EACf,SAAsB;IAEtB,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACxC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,SAAS,EAAE,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7B,CAAC,EAAE,YAAY,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,CACV,CAAC,KAAK,EAAE,EAAE;YACR,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;YACR,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Local ACP provider CLI version readiness.
3
+ *
4
+ * Third-party CLIs are owned by the operator/provider, not XENO. We detect known-bad versions and
5
+ * fail certification with an update hint; we do not silently mutate the machine.
6
+ */
7
+ import type { SpawnSyncReturns } from "node:child_process";
8
+ import type { AgentDef, AgentVersionReadiness } from "./types.js";
9
+ export type { AgentVersionReadiness, AgentVersionReadinessStatus } from "./types.js";
10
+ interface AgentVersionPolicy {
11
+ args: string[];
12
+ minimumVersion: string;
13
+ recommendedVersion?: string;
14
+ updateHint: string;
15
+ }
16
+ export declare const AGENT_VERSION_POLICIES: Record<string, AgentVersionPolicy>;
17
+ export type VersionCommandRunner = (file: string, args: string[], options: {
18
+ encoding: "utf8";
19
+ timeout: number;
20
+ shell: false;
21
+ }) => Pick<SpawnSyncReturns<string>, "stdout" | "stderr" | "status" | "error">;
22
+ export declare function parseCliVersion(text: string): string | undefined;
23
+ export declare function compareCliVersions(a: string, b: string): number;
24
+ export declare function checkAgentVersionReadiness(def: AgentDef, runner?: VersionCommandRunner): AgentVersionReadiness;
25
+ //# sourceMappingURL=agent-version-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-version-policy.d.ts","sourceRoot":"","sources":["../src/agent-version-policy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGlE,YAAY,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAErF,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAOrE,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,CACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,KACzD,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAC;AAE9E,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEhE;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ/D;AAED,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,QAAQ,EACb,MAAM,GAAE,oBAA8E,GACrF,qBAAqB,CA6DvB"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Local ACP provider CLI version readiness.
3
+ *
4
+ * Third-party CLIs are owned by the operator/provider, not XENO. We detect known-bad versions and
5
+ * fail certification with an update hint; we do not silently mutate the machine.
6
+ */
7
+ import { spawnSync } from "node:child_process";
8
+ import { resolveCommand } from "./process-resolver.js";
9
+ export const AGENT_VERSION_POLICIES = {
10
+ kimi: {
11
+ args: ["--version"],
12
+ minimumVersion: "0.19.2",
13
+ recommendedVersion: "0.19.2",
14
+ updateHint: "Run `kimi upgrade`, then rerun provider certification.",
15
+ },
16
+ };
17
+ export function parseCliVersion(text) {
18
+ return text.match(/\bv?(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)\b/)?.[1];
19
+ }
20
+ export function compareCliVersions(a, b) {
21
+ const aa = a.split(/[.+-]/).slice(0, 3).map((x) => Number(x));
22
+ const bb = b.split(/[.+-]/).slice(0, 3).map((x) => Number(x));
23
+ for (let i = 0; i < 3; i++) {
24
+ const d = (aa[i] ?? 0) - (bb[i] ?? 0);
25
+ if (d !== 0)
26
+ return d;
27
+ }
28
+ return 0;
29
+ }
30
+ export function checkAgentVersionReadiness(def, runner = (file, args, options) => spawnSync(file, args, options)) {
31
+ const policy = AGENT_VERSION_POLICIES[def.id];
32
+ if (!policy) {
33
+ return {
34
+ agentId: def.id,
35
+ status: "not_applicable",
36
+ ok: true,
37
+ message: `agent '${def.id}' has no pinned CLI version policy`,
38
+ };
39
+ }
40
+ const fail = (status, message) => ({
41
+ agentId: def.id,
42
+ status,
43
+ ok: false,
44
+ minimumVersion: policy.minimumVersion,
45
+ ...(policy.recommendedVersion ? { recommendedVersion: policy.recommendedVersion } : {}),
46
+ updateHint: policy.updateHint,
47
+ message,
48
+ });
49
+ let result;
50
+ try {
51
+ const resolved = resolveCommand(def.cmd, policy.args);
52
+ result = runner(resolved.file, resolved.args, { encoding: "utf8", timeout: 10_000, shell: false });
53
+ }
54
+ catch (err) {
55
+ return fail("unavailable", `agent '${def.id}' version check failed: ${err.message}`);
56
+ }
57
+ if (result.error || result.status !== 0) {
58
+ return fail("unavailable", `agent '${def.id}' version command failed`);
59
+ }
60
+ const installedVersion = parseCliVersion(`${result.stdout ?? ""}\n${result.stderr ?? ""}`);
61
+ if (!installedVersion) {
62
+ return fail("unknown", `agent '${def.id}' version output did not contain a semantic version`);
63
+ }
64
+ if (compareCliVersions(installedVersion, policy.minimumVersion) < 0) {
65
+ return {
66
+ agentId: def.id,
67
+ status: "outdated",
68
+ ok: false,
69
+ installedVersion,
70
+ minimumVersion: policy.minimumVersion,
71
+ ...(policy.recommendedVersion ? { recommendedVersion: policy.recommendedVersion } : {}),
72
+ updateHint: policy.updateHint,
73
+ message: `agent '${def.id}' CLI ${installedVersion} is below required ${policy.minimumVersion}`,
74
+ };
75
+ }
76
+ return {
77
+ agentId: def.id,
78
+ status: "ok",
79
+ ok: true,
80
+ installedVersion,
81
+ minimumVersion: policy.minimumVersion,
82
+ ...(policy.recommendedVersion ? { recommendedVersion: policy.recommendedVersion } : {}),
83
+ updateHint: policy.updateHint,
84
+ message: `agent '${def.id}' CLI ${installedVersion} satisfies required ${policy.minimumVersion}`,
85
+ };
86
+ }
87
+ //# sourceMappingURL=agent-version-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-version-policy.js","sourceRoot":"","sources":["../src/agent-version-policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * The ACP `Client` implementation handed to `ClientSideConnection`.
3
+ *
4
+ * This is what the agent calls *back* into: permission decisions, file reads/writes, and
5
+ * terminal execution. Everything is scoped to the requesting session's sandboxed workspace
6
+ * (SPEC §8). The handler is per-connection (per AgentProcess); it routes `sessionUpdate`
7
+ * notifications to the right Session by `sessionId`.
8
+ */
9
+ import type { Client, RequestPermissionRequest, RequestPermissionResponse, SessionNotification } from "@agentclientprotocol/sdk";
10
+ import type { PermissionPolicy } from "./types.js";
11
+ import type { Workspace } from "./workspace.js";
12
+ import type { Logger } from "./logger.js";
13
+ export interface ClientContext {
14
+ /** Route a session notification to its Session (by `sessionId`). */
15
+ dispatch(notification: SessionNotification): void;
16
+ /** Look up the sandbox for a session id (undefined if unknown). */
17
+ workspaceFor(sessionId: string): Workspace | undefined;
18
+ /** Permission policy for this agent. */
19
+ permission: PermissionPolicy;
20
+ /** Kill terminal commands after this many ms. */
21
+ terminalTimeoutMs: number;
22
+ logger: Logger;
23
+ /** Optional interactive/embedder permission handler. */
24
+ requestPermission?: (request: RequestPermissionRequest) => Promise<RequestPermissionResponse>;
25
+ /** Optional ACP extension request handler owned by the embedding host. */
26
+ extMethod?: (method: string, params: Record<string, unknown>) => Promise<Record<string, unknown>>;
27
+ /** Optional ACP extension notification handler owned by the embedding host. */
28
+ extNotification?: (method: string, params: Record<string, unknown>) => Promise<void>;
29
+ /** Diagnostics hook for unsupported extension requests. */
30
+ onUnsupportedMethod?: (method: string) => void;
31
+ /** Fail closed when an embedder does not advertise filesystem authority. */
32
+ allowFileSystem?: boolean;
33
+ /** Fail closed when an embedder does not advertise filesystem read authority. */
34
+ allowReadFileSystem?: boolean;
35
+ /** Fail closed when an embedder does not advertise filesystem write authority. */
36
+ allowWriteFileSystem?: boolean;
37
+ /** Fail closed when an embedder does not advertise terminal authority. */
38
+ allowTerminal?: boolean;
39
+ }
40
+ export declare function createClientHandler(ctx: ClientContext): Client;
41
+ //# sourceMappingURL=capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EACV,MAAM,EAON,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,EAQpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,aAAa;IAC5B,oEAAoE;IACpE,QAAQ,CAAC,YAAY,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAClD,mEAAmE;IACnE,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IACvD,wCAAwC;IACxC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,iDAAiD;IACjD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,wBAAwB,KAAK,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAC9F,0EAA0E;IAC1E,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAClG,+EAA+E;IAC/E,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrF,2DAA2D;IAC3D,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,4EAA4E;IAC5E,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iFAAiF;IACjF,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,kFAAkF;IAClF,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,0EAA0E;IAC1E,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAeD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAsM9D"}