@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.
- package/LICENSE +202 -0
- package/NOTICE +9 -0
- package/README.md +26 -0
- package/dist/agent-process.d.ts +94 -0
- package/dist/agent-process.d.ts.map +1 -0
- package/dist/agent-process.js +391 -0
- package/dist/agent-process.js.map +1 -0
- package/dist/agent-version-policy.d.ts +25 -0
- package/dist/agent-version-policy.d.ts.map +1 -0
- package/dist/agent-version-policy.js +87 -0
- package/dist/agent-version-policy.js.map +1 -0
- package/dist/capabilities.d.ts +41 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +202 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/certification.d.ts +3 -0
- package/dist/certification.d.ts.map +1 -0
- package/dist/certification.js +3 -0
- package/dist/certification.js.map +1 -0
- package/dist/config.d.ts +23 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +136 -0
- package/dist/config.js.map +1 -0
- package/dist/flatten.d.ts +31 -0
- package/dist/flatten.d.ts.map +1 -0
- package/dist/flatten.js +82 -0
- package/dist/flatten.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +17 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +38 -0
- package/dist/logger.js.map +1 -0
- package/dist/manager.d.ts +54 -0
- package/dist/manager.d.ts.map +1 -0
- package/dist/manager.js +194 -0
- package/dist/manager.js.map +1 -0
- package/dist/process-resolver.d.ts +50 -0
- package/dist/process-resolver.d.ts.map +1 -0
- package/dist/process-resolver.js +78 -0
- package/dist/process-resolver.js.map +1 -0
- package/dist/registry.d.ts +21 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +74 -0
- package/dist/registry.js.map +1 -0
- package/dist/session.d.ts +34 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +146 -0
- package/dist/session.js.map +1 -0
- package/dist/types.d.ts +161 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/workspace.d.ts +27 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +47 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,202 @@
|
|
|
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 { spawn } from "node:child_process";
|
|
10
|
+
import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
11
|
+
import { dirname } from "node:path";
|
|
12
|
+
import { resolveCommand } from "./process-resolver.js";
|
|
13
|
+
let terminalSeq = 0;
|
|
14
|
+
export function createClientHandler(ctx) {
|
|
15
|
+
const terminals = new Map();
|
|
16
|
+
function pickPermission(req) {
|
|
17
|
+
const opts = req.options ?? [];
|
|
18
|
+
const byKind = (k) => opts.find((o) => o.kind === k);
|
|
19
|
+
if (ctx.permission === "deny") {
|
|
20
|
+
const reject = byKind("reject_once") ?? byKind("reject_always");
|
|
21
|
+
if (reject)
|
|
22
|
+
return { outcome: { outcome: "selected", optionId: reject.optionId } };
|
|
23
|
+
return { outcome: { outcome: "cancelled" } };
|
|
24
|
+
}
|
|
25
|
+
// "auto" (and "prompt" on the headless server) → take the broadest allow available.
|
|
26
|
+
const allow = byKind("allow_always") ?? byKind("allow_once") ?? opts[0];
|
|
27
|
+
if (allow)
|
|
28
|
+
return { outcome: { outcome: "selected", optionId: allow.optionId } };
|
|
29
|
+
return { outcome: { outcome: "cancelled" } };
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
async requestPermission(params) {
|
|
33
|
+
if (ctx.requestPermission)
|
|
34
|
+
return ctx.requestPermission(params);
|
|
35
|
+
const decision = pickPermission(params);
|
|
36
|
+
ctx.logger.debug(`permission "${params.toolCall?.title ?? "?"}" → ${JSON.stringify(decision.outcome)}`);
|
|
37
|
+
return decision;
|
|
38
|
+
},
|
|
39
|
+
async sessionUpdate(params) {
|
|
40
|
+
ctx.dispatch(params);
|
|
41
|
+
},
|
|
42
|
+
async readTextFile(params) {
|
|
43
|
+
if (ctx.allowFileSystem === false || ctx.allowReadFileSystem === false) {
|
|
44
|
+
ctx.onUnsupportedMethod?.("fs/read_text_file");
|
|
45
|
+
throw new Error("ACP filesystem capability is disabled by the embedding host");
|
|
46
|
+
}
|
|
47
|
+
const ws = ctx.workspaceFor(params.sessionId);
|
|
48
|
+
if (!ws)
|
|
49
|
+
throw new Error(`unknown session: ${params.sessionId}`);
|
|
50
|
+
const path = ws.contain(params.path);
|
|
51
|
+
let content = readFileSync(path, "utf8");
|
|
52
|
+
if (params.line != null || params.limit != null) {
|
|
53
|
+
const lines = content.split("\n");
|
|
54
|
+
const start = Math.max(0, (params.line ?? 1) - 1);
|
|
55
|
+
const end = params.limit != null ? start + params.limit : lines.length;
|
|
56
|
+
content = lines.slice(start, end).join("\n");
|
|
57
|
+
}
|
|
58
|
+
return { content };
|
|
59
|
+
},
|
|
60
|
+
async writeTextFile(params) {
|
|
61
|
+
if (ctx.allowFileSystem === false || ctx.allowWriteFileSystem === false) {
|
|
62
|
+
ctx.onUnsupportedMethod?.("fs/write_text_file");
|
|
63
|
+
throw new Error("ACP filesystem capability is disabled by the embedding host");
|
|
64
|
+
}
|
|
65
|
+
const ws = ctx.workspaceFor(params.sessionId);
|
|
66
|
+
if (!ws)
|
|
67
|
+
throw new Error(`unknown session: ${params.sessionId}`);
|
|
68
|
+
const path = ws.contain(params.path);
|
|
69
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
70
|
+
writeFileSync(path, params.content, "utf8");
|
|
71
|
+
return {};
|
|
72
|
+
},
|
|
73
|
+
async createTerminal(params) {
|
|
74
|
+
if (ctx.allowTerminal === false) {
|
|
75
|
+
ctx.onUnsupportedMethod?.("terminal/create");
|
|
76
|
+
throw new Error("ACP terminal capability is disabled by the embedding host");
|
|
77
|
+
}
|
|
78
|
+
const ws = ctx.workspaceFor(params.sessionId);
|
|
79
|
+
if (!ws)
|
|
80
|
+
throw new Error(`unknown session: ${params.sessionId}`);
|
|
81
|
+
const cwd = params.cwd ? ws.contain(params.cwd) : ws.dir;
|
|
82
|
+
const env = { ...process.env };
|
|
83
|
+
for (const e of params.env ?? [])
|
|
84
|
+
env[e.name] = e.value;
|
|
85
|
+
const id = `term-${++terminalSeq}`;
|
|
86
|
+
const byteLimit = params.outputByteLimit ?? 2_000_000;
|
|
87
|
+
// Resolve the agent's command WITHOUT a shell (process-resolver.ts). The command is a
|
|
88
|
+
// single executable token (shell metacharacters in it are rejected); args are passed
|
|
89
|
+
// literally. An agent that wants shell semantics sends e.g. `bash -lc "<script>"`.
|
|
90
|
+
const resolved = resolveCommand(params.command, params.args ?? []);
|
|
91
|
+
const child = spawn(resolved.file, resolved.args, {
|
|
92
|
+
cwd,
|
|
93
|
+
env,
|
|
94
|
+
shell: false,
|
|
95
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
96
|
+
});
|
|
97
|
+
const rec = {
|
|
98
|
+
id,
|
|
99
|
+
child,
|
|
100
|
+
output: "",
|
|
101
|
+
truncated: false,
|
|
102
|
+
byteLimit,
|
|
103
|
+
exited: undefined,
|
|
104
|
+
};
|
|
105
|
+
const append = (chunk) => {
|
|
106
|
+
if (rec.truncated)
|
|
107
|
+
return;
|
|
108
|
+
rec.output += chunk.toString("utf8");
|
|
109
|
+
if (Buffer.byteLength(rec.output, "utf8") > rec.byteLimit) {
|
|
110
|
+
rec.output = rec.output.slice(0, rec.byteLimit);
|
|
111
|
+
rec.truncated = true;
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
child.stdout?.on("data", append);
|
|
115
|
+
child.stderr?.on("data", append);
|
|
116
|
+
rec.exited = new Promise((res) => {
|
|
117
|
+
child.on("exit", (code, signal) => {
|
|
118
|
+
rec.exit = { exitCode: code, signal: signal ?? null };
|
|
119
|
+
if (rec.timeout)
|
|
120
|
+
clearTimeout(rec.timeout);
|
|
121
|
+
res();
|
|
122
|
+
});
|
|
123
|
+
child.on("error", (err) => {
|
|
124
|
+
append(Buffer.from(`\n[xeno-acp] terminal error: ${err.message}\n`));
|
|
125
|
+
rec.exit = { exitCode: null, signal: null };
|
|
126
|
+
if (rec.timeout)
|
|
127
|
+
clearTimeout(rec.timeout);
|
|
128
|
+
res();
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
if (ctx.terminalTimeoutMs > 0) {
|
|
132
|
+
rec.timeout = setTimeout(() => {
|
|
133
|
+
if (!rec.exit) {
|
|
134
|
+
append(Buffer.from(`\n[xeno-acp] terminal killed after ${ctx.terminalTimeoutMs}ms\n`));
|
|
135
|
+
child.kill("SIGKILL");
|
|
136
|
+
}
|
|
137
|
+
}, ctx.terminalTimeoutMs);
|
|
138
|
+
}
|
|
139
|
+
terminals.set(id, rec);
|
|
140
|
+
return { terminalId: id };
|
|
141
|
+
},
|
|
142
|
+
async terminalOutput(params) {
|
|
143
|
+
if (ctx.allowTerminal === false) {
|
|
144
|
+
ctx.onUnsupportedMethod?.("terminal/output");
|
|
145
|
+
throw new Error("ACP terminal capability is disabled by the embedding host");
|
|
146
|
+
}
|
|
147
|
+
const rec = terminals.get(params.terminalId);
|
|
148
|
+
if (!rec)
|
|
149
|
+
throw new Error(`unknown terminal: ${params.terminalId}`);
|
|
150
|
+
const exitStatus = rec.exit
|
|
151
|
+
? { exitCode: rec.exit.exitCode, signal: rec.exit.signal }
|
|
152
|
+
: null;
|
|
153
|
+
return { output: rec.output, truncated: rec.truncated, exitStatus };
|
|
154
|
+
},
|
|
155
|
+
async waitForTerminalExit(params) {
|
|
156
|
+
if (ctx.allowTerminal === false) {
|
|
157
|
+
ctx.onUnsupportedMethod?.("terminal/wait_for_exit");
|
|
158
|
+
throw new Error("ACP terminal capability is disabled by the embedding host");
|
|
159
|
+
}
|
|
160
|
+
const rec = terminals.get(params.terminalId);
|
|
161
|
+
if (!rec)
|
|
162
|
+
throw new Error(`unknown terminal: ${params.terminalId}`);
|
|
163
|
+
await rec.exited;
|
|
164
|
+
return { exitCode: rec.exit?.exitCode ?? null, signal: rec.exit?.signal ?? null };
|
|
165
|
+
},
|
|
166
|
+
async killTerminal(params) {
|
|
167
|
+
if (ctx.allowTerminal === false) {
|
|
168
|
+
ctx.onUnsupportedMethod?.("terminal/kill");
|
|
169
|
+
throw new Error("ACP terminal capability is disabled by the embedding host");
|
|
170
|
+
}
|
|
171
|
+
const rec = terminals.get(params.terminalId);
|
|
172
|
+
if (rec && !rec.exit)
|
|
173
|
+
rec.child.kill("SIGKILL");
|
|
174
|
+
},
|
|
175
|
+
async releaseTerminal(params) {
|
|
176
|
+
if (ctx.allowTerminal === false) {
|
|
177
|
+
ctx.onUnsupportedMethod?.("terminal/release");
|
|
178
|
+
throw new Error("ACP terminal capability is disabled by the embedding host");
|
|
179
|
+
}
|
|
180
|
+
const rec = terminals.get(params.terminalId);
|
|
181
|
+
if (rec) {
|
|
182
|
+
if (!rec.exit)
|
|
183
|
+
rec.child.kill("SIGKILL");
|
|
184
|
+
if (rec.timeout)
|
|
185
|
+
clearTimeout(rec.timeout);
|
|
186
|
+
terminals.delete(params.terminalId);
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
async extMethod(method, params) {
|
|
190
|
+
if (ctx.extMethod)
|
|
191
|
+
return ctx.extMethod(method, params);
|
|
192
|
+
ctx.onUnsupportedMethod?.(method);
|
|
193
|
+
throw new Error(`unsupported ACP extension method: ${method}`);
|
|
194
|
+
},
|
|
195
|
+
async extNotification(method, params) {
|
|
196
|
+
if (ctx.extNotification)
|
|
197
|
+
return ctx.extNotification(method, params);
|
|
198
|
+
ctx.onUnsupportedMethod?.(method);
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=capabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** Harmless bounded prompt used to prove an ACP endpoint can complete one turn. */
|
|
2
|
+
export declare const ACP_ENDPOINT_CERTIFICATION_PROMPT = "Certification check. Do not inspect files, call tools, or perform work. Reply with exactly: XENO_ACP_OK";
|
|
3
|
+
//# sourceMappingURL=certification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"certification.d.ts","sourceRoot":"","sources":["../src/certification.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,eAAO,MAAM,iCAAiC,4GAA4G,CAAA"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** Harmless bounded prompt used to prove an ACP endpoint can complete one turn. */
|
|
2
|
+
export const ACP_ENDPOINT_CERTIFICATION_PROMPT = 'Certification check. Do not inspect files, call tools, or perform work. Reply with exactly: XENO_ACP_OK';
|
|
3
|
+
//# sourceMappingURL=certification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"certification.js","sourceRoot":"","sources":["../src/certification.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,MAAM,CAAC,MAAM,iCAAiC,GAAG,yGAAyG,CAAA"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loading, validation, env-expansion and merging with built-in agents.
|
|
3
|
+
*
|
|
4
|
+
* Resolution order (first found wins):
|
|
5
|
+
* 1. explicit `opts.path`
|
|
6
|
+
* 2. $XENO_ACP_CONFIG
|
|
7
|
+
* 3. ./xeno-acp.config.jsonc (then .json)
|
|
8
|
+
* 4. ~/.xeno/acp/config.jsonc (then .json)
|
|
9
|
+
* If nothing is found, a sensible default is returned (all built-in agents enabled,
|
|
10
|
+
* bearer auth with no keys) — useful for embedders that configure in code.
|
|
11
|
+
*/
|
|
12
|
+
import type { ResolvedConfig } from "./types.js";
|
|
13
|
+
export interface LoadConfigOptions {
|
|
14
|
+
/** Explicit config path. */
|
|
15
|
+
path?: string;
|
|
16
|
+
/** Base dir for resolving relative paths (default: process.cwd()). */
|
|
17
|
+
cwd?: string;
|
|
18
|
+
}
|
|
19
|
+
/** Synchronously load and resolve configuration. */
|
|
20
|
+
export declare function loadConfig(opts?: LoadConfigOptions): ResolvedConfig;
|
|
21
|
+
/** Normalize an already-parsed config object (also the path embedders use directly). */
|
|
22
|
+
export declare function normalizeConfig(raw: Record<string, unknown>, cwd?: string): ResolvedConfig;
|
|
23
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,KAAK,EAKV,cAAc,EAEf,MAAM,YAAY,CAAC;AAiBpB,MAAM,WAAW,iBAAiB;IAChC,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AA0CD,oDAAoD;AACpD,wBAAgB,UAAU,CAAC,IAAI,GAAE,iBAAsB,GAAG,cAAc,CAiBvE;AAED,wFAAwF;AACxF,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,SAAgB,GAAG,cAAc,CAsDjG"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loading, validation, env-expansion and merging with built-in agents.
|
|
3
|
+
*
|
|
4
|
+
* Resolution order (first found wins):
|
|
5
|
+
* 1. explicit `opts.path`
|
|
6
|
+
* 2. $XENO_ACP_CONFIG
|
|
7
|
+
* 3. ./xeno-acp.config.jsonc (then .json)
|
|
8
|
+
* 4. ~/.xeno/acp/config.jsonc (then .json)
|
|
9
|
+
* If nothing is found, a sensible default is returned (all built-in agents enabled,
|
|
10
|
+
* bearer auth with no keys) — useful for embedders that configure in code.
|
|
11
|
+
*/
|
|
12
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
13
|
+
import { resolve, isAbsolute, join } from "node:path";
|
|
14
|
+
import { homedir } from "node:os";
|
|
15
|
+
import stripJsonComments from "strip-json-comments";
|
|
16
|
+
import { BUILTIN_AGENTS, mergeAgentDef } from "./registry.js";
|
|
17
|
+
import { log } from "./logger.js";
|
|
18
|
+
const ENGINE_DEFAULTS = {
|
|
19
|
+
maxConcurrentSessions: 4,
|
|
20
|
+
permission: "auto",
|
|
21
|
+
terminalTimeoutMs: 120_000,
|
|
22
|
+
initTimeoutMs: 60_000,
|
|
23
|
+
};
|
|
24
|
+
const SERVER_DEFAULTS = {
|
|
25
|
+
host: "127.0.0.1",
|
|
26
|
+
port: 8787,
|
|
27
|
+
auth: "bearer",
|
|
28
|
+
};
|
|
29
|
+
function candidatePaths(cwd) {
|
|
30
|
+
const out = [];
|
|
31
|
+
if (process.env.XENO_ACP_CONFIG)
|
|
32
|
+
out.push(process.env.XENO_ACP_CONFIG);
|
|
33
|
+
out.push(join(cwd, "xeno-acp.config.jsonc"));
|
|
34
|
+
out.push(join(cwd, "xeno-acp.config.json"));
|
|
35
|
+
out.push(join(homedir(), ".xeno", "acp", "config.jsonc"));
|
|
36
|
+
out.push(join(homedir(), ".xeno", "acp", "config.json"));
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
/** Recursively expand `${VAR}` references inside string values. */
|
|
40
|
+
function expandEnv(value) {
|
|
41
|
+
if (typeof value === "string") {
|
|
42
|
+
return value.replace(/\$\{([A-Z0-9_]+)\}/gi, (_m, name) => process.env[name] ?? "");
|
|
43
|
+
}
|
|
44
|
+
if (Array.isArray(value))
|
|
45
|
+
return value.map((v) => expandEnv(v));
|
|
46
|
+
if (value && typeof value === "object") {
|
|
47
|
+
const out = {};
|
|
48
|
+
for (const [k, v] of Object.entries(value))
|
|
49
|
+
out[k] = expandEnv(v);
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
52
|
+
return value;
|
|
53
|
+
}
|
|
54
|
+
function parseJsonc(text, source) {
|
|
55
|
+
try {
|
|
56
|
+
const parsed = JSON.parse(stripJsonComments(text, { trailingCommas: true }));
|
|
57
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
58
|
+
throw new Error("config root must be a JSON object");
|
|
59
|
+
}
|
|
60
|
+
return parsed;
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
throw new Error(`Failed to parse config at ${source}: ${err.message}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function asPolicy(v, fallback) {
|
|
67
|
+
return v === "auto" || v === "deny" || v === "prompt" ? v : fallback;
|
|
68
|
+
}
|
|
69
|
+
/** Synchronously load and resolve configuration. */
|
|
70
|
+
export function loadConfig(opts = {}) {
|
|
71
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
72
|
+
let raw = {};
|
|
73
|
+
let foundPath;
|
|
74
|
+
const search = opts.path ? [opts.path] : candidatePaths(cwd);
|
|
75
|
+
for (const p of search) {
|
|
76
|
+
if (existsSync(p)) {
|
|
77
|
+
foundPath = p;
|
|
78
|
+
raw = expandEnv(parseJsonc(readFileSync(p, "utf8"), p));
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (foundPath)
|
|
83
|
+
log.info(`loaded config from ${foundPath}`);
|
|
84
|
+
else
|
|
85
|
+
log.info("no config file found — using built-in defaults (all agents enabled)");
|
|
86
|
+
return normalizeConfig(raw, cwd);
|
|
87
|
+
}
|
|
88
|
+
/** Normalize an already-parsed config object (also the path embedders use directly). */
|
|
89
|
+
export function normalizeConfig(raw, cwd = process.cwd()) {
|
|
90
|
+
const server = {
|
|
91
|
+
...SERVER_DEFAULTS,
|
|
92
|
+
...raw.server,
|
|
93
|
+
};
|
|
94
|
+
const defaults = {
|
|
95
|
+
...ENGINE_DEFAULTS,
|
|
96
|
+
...raw.defaults,
|
|
97
|
+
};
|
|
98
|
+
defaults.permission = asPolicy(raw.defaults?.permission, ENGINE_DEFAULTS.permission);
|
|
99
|
+
const wsRaw = raw.workspaceRoot ?? "./.xeno-acp/workspaces";
|
|
100
|
+
const workspaceRoot = isAbsolute(wsRaw) ? wsRaw : resolve(cwd, wsRaw);
|
|
101
|
+
// Agents: if `agents` is provided, use exactly those (merged onto built-ins).
|
|
102
|
+
// Otherwise enable all built-ins.
|
|
103
|
+
let agents;
|
|
104
|
+
const agentsRaw = raw.agents;
|
|
105
|
+
if (Array.isArray(agentsRaw)) {
|
|
106
|
+
agents = agentsRaw.map((entry) => mergeAgentDef(entry));
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
agents = Object.values(BUILTIN_AGENTS).map((a) => ({ ...a }));
|
|
110
|
+
}
|
|
111
|
+
// Fold defaults into each agent so the supervisor reads one resolved object.
|
|
112
|
+
for (const a of agents) {
|
|
113
|
+
a.maxConcurrentSessions ??= defaults.maxConcurrentSessions;
|
|
114
|
+
a.permission ??= defaults.permission;
|
|
115
|
+
a.terminalTimeoutMs ??= defaults.terminalTimeoutMs;
|
|
116
|
+
a.initTimeoutMs ??= defaults.initTimeoutMs;
|
|
117
|
+
}
|
|
118
|
+
const keysRaw = raw.keys ?? [];
|
|
119
|
+
const keys = keysRaw.map((k) => ({
|
|
120
|
+
key: k.key,
|
|
121
|
+
app: k.app ?? "unknown",
|
|
122
|
+
agents: Array.isArray(k.agents) && k.agents.length ? k.agents : ["*"],
|
|
123
|
+
...(k.maxConcurrentSessions !== undefined
|
|
124
|
+
? { maxConcurrentSessions: k.maxConcurrentSessions }
|
|
125
|
+
: {}),
|
|
126
|
+
}));
|
|
127
|
+
return {
|
|
128
|
+
server,
|
|
129
|
+
workspaceRoot,
|
|
130
|
+
keepWorkspaces: Boolean(raw.keepWorkspaces),
|
|
131
|
+
defaults,
|
|
132
|
+
agents,
|
|
133
|
+
keys,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flatten the structured `AcpEvent` stream into linear text deltas + a final summary
|
|
3
|
+
* (SPEC §7). This is the projection the HTTP server uses to look like OpenAI; embedders
|
|
4
|
+
* that want full fidelity consume `AcpEvent`s directly instead.
|
|
5
|
+
*
|
|
6
|
+
* Flattening never disables tools — the agent still runs everything. `verbose` only
|
|
7
|
+
* controls how much of the tool/plan/thought activity is narrated back into the text.
|
|
8
|
+
*/
|
|
9
|
+
import type { AcpEvent, StopReason } from "./types.js";
|
|
10
|
+
export interface FlattenOptions {
|
|
11
|
+
/** Narrate tool_call / tool_update / plan / thought into the text stream. */
|
|
12
|
+
verbose?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface FlatUsage {
|
|
15
|
+
prompt?: number;
|
|
16
|
+
completion?: number;
|
|
17
|
+
total?: number;
|
|
18
|
+
}
|
|
19
|
+
export type FlatChunk = {
|
|
20
|
+
type: "delta";
|
|
21
|
+
text: string;
|
|
22
|
+
} | {
|
|
23
|
+
type: "final";
|
|
24
|
+
finishReason: string;
|
|
25
|
+
usage?: FlatUsage;
|
|
26
|
+
error?: string;
|
|
27
|
+
};
|
|
28
|
+
/** Map an ACP stop reason to an OpenAI `finish_reason`. */
|
|
29
|
+
export declare function stopReasonToFinish(reason: StopReason | string): string;
|
|
30
|
+
export declare function flatten(events: AsyncIterable<AcpEvent>, opts?: FlattenOptions): AsyncGenerator<FlatChunk>;
|
|
31
|
+
//# sourceMappingURL=flatten.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flatten.d.ts","sourceRoot":"","sources":["../src/flatten.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/E,2DAA2D;AAC3D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,MAAM,CAYtE;AAED,wBAAuB,OAAO,CAC5B,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,EAC/B,IAAI,GAAE,cAAmB,GACxB,cAAc,CAAC,SAAS,CAAC,CAyD3B"}
|
package/dist/flatten.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flatten the structured `AcpEvent` stream into linear text deltas + a final summary
|
|
3
|
+
* (SPEC §7). This is the projection the HTTP server uses to look like OpenAI; embedders
|
|
4
|
+
* that want full fidelity consume `AcpEvent`s directly instead.
|
|
5
|
+
*
|
|
6
|
+
* Flattening never disables tools — the agent still runs everything. `verbose` only
|
|
7
|
+
* controls how much of the tool/plan/thought activity is narrated back into the text.
|
|
8
|
+
*/
|
|
9
|
+
/** Map an ACP stop reason to an OpenAI `finish_reason`. */
|
|
10
|
+
export function stopReasonToFinish(reason) {
|
|
11
|
+
switch (reason) {
|
|
12
|
+
case "max_tokens":
|
|
13
|
+
return "length";
|
|
14
|
+
case "refusal":
|
|
15
|
+
return "content_filter";
|
|
16
|
+
case "end_turn":
|
|
17
|
+
case "max_turn_requests":
|
|
18
|
+
case "cancelled":
|
|
19
|
+
default:
|
|
20
|
+
return "stop";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export async function* flatten(events, opts = {}) {
|
|
24
|
+
const verbose = Boolean(opts.verbose);
|
|
25
|
+
let usage;
|
|
26
|
+
let finishReason = "stop";
|
|
27
|
+
let error;
|
|
28
|
+
for await (const ev of events) {
|
|
29
|
+
switch (ev.type) {
|
|
30
|
+
case "text":
|
|
31
|
+
if (ev.text)
|
|
32
|
+
yield { type: "delta", text: ev.text };
|
|
33
|
+
break;
|
|
34
|
+
case "thought":
|
|
35
|
+
if (verbose && ev.text)
|
|
36
|
+
yield { type: "delta", text: `\n> 💭 ${ev.text}\n` };
|
|
37
|
+
break;
|
|
38
|
+
case "tool_call":
|
|
39
|
+
if (verbose)
|
|
40
|
+
yield { type: "delta", text: `\n🔧 ${ev.title} (${ev.status})\n` };
|
|
41
|
+
break;
|
|
42
|
+
case "tool_update":
|
|
43
|
+
if (verbose && ev.status)
|
|
44
|
+
yield { type: "delta", text: `\n ↳ ${ev.title ?? ev.id}: ${ev.status}\n` };
|
|
45
|
+
break;
|
|
46
|
+
case "plan":
|
|
47
|
+
if (verbose && ev.entries.length) {
|
|
48
|
+
const list = ev.entries
|
|
49
|
+
.map((e) => ` - [${e.status === "completed" ? "x" : " "}] ${e.content}`)
|
|
50
|
+
.join("\n");
|
|
51
|
+
yield { type: "delta", text: `\n📋 Plan:\n${list}\n` };
|
|
52
|
+
}
|
|
53
|
+
break;
|
|
54
|
+
case "usage":
|
|
55
|
+
usage = {
|
|
56
|
+
...(ev.inputTokens != null ? { prompt: ev.inputTokens } : {}),
|
|
57
|
+
...(ev.outputTokens != null ? { completion: ev.outputTokens } : {}),
|
|
58
|
+
...(ev.totalTokens != null ? { total: ev.totalTokens } : {}),
|
|
59
|
+
};
|
|
60
|
+
break;
|
|
61
|
+
case "done":
|
|
62
|
+
finishReason = stopReasonToFinish(ev.stopReason);
|
|
63
|
+
break;
|
|
64
|
+
case "error":
|
|
65
|
+
error = ev.message;
|
|
66
|
+
finishReason = "stop";
|
|
67
|
+
// Surface the error to the consumer as visible text too.
|
|
68
|
+
yield { type: "delta", text: `\n[xeno-acp error] ${ev.message}\n` };
|
|
69
|
+
break;
|
|
70
|
+
case "raw":
|
|
71
|
+
default:
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
yield {
|
|
76
|
+
type: "final",
|
|
77
|
+
finishReason,
|
|
78
|
+
...(usage ? { usage } : {}),
|
|
79
|
+
...(error ? { error } : {}),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=flatten.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flatten.js","sourceRoot":"","sources":["../src/flatten.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @xenosystem/acp-core — embeddable ACP-client engine.
|
|
3
|
+
*
|
|
4
|
+
* Drive a configured ACP agent in-process and consume a structured event stream.
|
|
5
|
+
* Framework-free: no HTTP, no OpenAI types. The HTTP gateway
|
|
6
|
+
* (@xenosystem/acp) and any other front-end build on this.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { AcpManager, loadConfig } from "@xenosystem/acp-core";
|
|
11
|
+
* const acp = new AcpManager(loadConfig());
|
|
12
|
+
* for await (const ev of acp.prompt("claude-code", {
|
|
13
|
+
* messages: [{ role: "user", content: "Summarize the workspace." }],
|
|
14
|
+
* })) {
|
|
15
|
+
* if (ev.type === "text") process.stdout.write(ev.text);
|
|
16
|
+
* }
|
|
17
|
+
* await acp.dispose();
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export * from "./types.js";
|
|
21
|
+
export { AcpManager, resolveModel, renderMessages, type ResolvedModel } from "./manager.js";
|
|
22
|
+
export { loadConfig, normalizeConfig, type LoadConfigOptions } from "./config.js";
|
|
23
|
+
export { BUILTIN_AGENTS, mergeAgentDef } from "./registry.js";
|
|
24
|
+
export { AGENT_VERSION_POLICIES, checkAgentVersionReadiness, compareCliVersions, parseCliVersion, type VersionCommandRunner, } from "./agent-version-policy.js";
|
|
25
|
+
export { flatten, stopReasonToFinish, type FlatChunk, type FlattenOptions, type FlatUsage } from "./flatten.js";
|
|
26
|
+
export { Session, updateToEvents } from "./session.js";
|
|
27
|
+
export { AgentProcess, type AgentProcessOptions, type AgentSessionOptions, type AgentPromptOptions, type AgentProcessDiagnostics, } from "./agent-process.js";
|
|
28
|
+
export { createWorkspace, containPath, type Workspace } from "./workspace.js";
|
|
29
|
+
export { createClientHandler, type ClientContext } from "./capabilities.js";
|
|
30
|
+
export { resolveCommand, assertExecutableToken, windowsLookup, type ResolveOptions, type ResolvedSpawn, } from "./process-resolver.js";
|
|
31
|
+
export { createLogger, log, type Logger, type LogLevel } from "./logger.js";
|
|
32
|
+
export { ACP_ENDPOINT_CERTIFICATION_PROMPT } from "./certification.js";
|
|
33
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EACL,sBAAsB,EACtB,0BAA0B,EAC1B,kBAAkB,EAClB,eAAe,EACf,KAAK,oBAAoB,GAC1B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,KAAK,SAAS,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAChH,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EACL,YAAY,EACZ,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,GAC7B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,aAAa,EACb,KAAK,cAAc,EACnB,KAAK,aAAa,GACnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,iCAAiC,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @xenosystem/acp-core — embeddable ACP-client engine.
|
|
3
|
+
*
|
|
4
|
+
* Drive a configured ACP agent in-process and consume a structured event stream.
|
|
5
|
+
* Framework-free: no HTTP, no OpenAI types. The HTTP gateway
|
|
6
|
+
* (@xenosystem/acp) and any other front-end build on this.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { AcpManager, loadConfig } from "@xenosystem/acp-core";
|
|
11
|
+
* const acp = new AcpManager(loadConfig());
|
|
12
|
+
* for await (const ev of acp.prompt("claude-code", {
|
|
13
|
+
* messages: [{ role: "user", content: "Summarize the workspace." }],
|
|
14
|
+
* })) {
|
|
15
|
+
* if (ev.type === "text") process.stdout.write(ev.text);
|
|
16
|
+
* }
|
|
17
|
+
* await acp.dispose();
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export * from "./types.js";
|
|
21
|
+
export { AcpManager, resolveModel, renderMessages } from "./manager.js";
|
|
22
|
+
export { loadConfig, normalizeConfig } from "./config.js";
|
|
23
|
+
export { BUILTIN_AGENTS, mergeAgentDef } from "./registry.js";
|
|
24
|
+
export { AGENT_VERSION_POLICIES, checkAgentVersionReadiness, compareCliVersions, parseCliVersion, } from "./agent-version-policy.js";
|
|
25
|
+
export { flatten, stopReasonToFinish } from "./flatten.js";
|
|
26
|
+
export { Session, updateToEvents } from "./session.js";
|
|
27
|
+
export { AgentProcess, } from "./agent-process.js";
|
|
28
|
+
export { createWorkspace, containPath } from "./workspace.js";
|
|
29
|
+
export { createClientHandler } from "./capabilities.js";
|
|
30
|
+
export { resolveCommand, assertExecutableToken, windowsLookup, } from "./process-resolver.js";
|
|
31
|
+
export { createLogger, log } from "./logger.js";
|
|
32
|
+
export { ACP_ENDPOINT_CERTIFICATION_PROMPT } from "./certification.js";
|
|
33
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAsB,MAAM,cAAc,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAE,eAAe,EAA0B,MAAM,aAAa,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EACL,sBAAsB,EACtB,0BAA0B,EAC1B,kBAAkB,EAClB,eAAe,GAEhB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAuD,MAAM,cAAc,CAAC;AAChH,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EACL,YAAY,GAKb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,WAAW,EAAkB,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAsB,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,aAAa,GAGd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,GAAG,EAA8B,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,iCAAiC,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tiny leveled logger. Writes to **stderr only** — stdout is reserved for the NDJSON
|
|
3
|
+
* channel shared with agent subprocesses, so writing logs there would corrupt the
|
|
4
|
+
* protocol stream. (See CLAUDE.md rule 2.)
|
|
5
|
+
*/
|
|
6
|
+
export type LogLevel = "debug" | "info" | "warn" | "error" | "silent";
|
|
7
|
+
export interface Logger {
|
|
8
|
+
level: LogLevel;
|
|
9
|
+
debug(...args: unknown[]): void;
|
|
10
|
+
info(...args: unknown[]): void;
|
|
11
|
+
warn(...args: unknown[]): void;
|
|
12
|
+
error(...args: unknown[]): void;
|
|
13
|
+
child(scope: string): Logger;
|
|
14
|
+
}
|
|
15
|
+
export declare function createLogger(scope?: string, level?: LogLevel): Logger;
|
|
16
|
+
export declare const log: Logger;
|
|
17
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAiBtE,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,QAAQ,CAAC;IAChB,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CAC9B;AASD,wBAAgB,YAAY,CAAC,KAAK,SAAK,EAAE,KAAK,GAAE,QAAqB,GAAG,MAAM,CAU7E;AAED,eAAO,MAAM,GAAG,QAAiB,CAAC"}
|