@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
package/dist/session.js
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A `Session` wraps one ACP session id and an async event queue.
|
|
3
|
+
*
|
|
4
|
+
* The per-connection client handler dispatches `session/update` notifications here via
|
|
5
|
+
* `onUpdate`; the consumer (AcpManager / an embedder) drains `events()` as an async
|
|
6
|
+
* iterable. The queue closes when the prompt turn ends, so the iterator terminates
|
|
7
|
+
* naturally after the trailing `done` event.
|
|
8
|
+
*/
|
|
9
|
+
/** Minimal single-consumer async queue with explicit close. */
|
|
10
|
+
class AsyncQueue {
|
|
11
|
+
items = [];
|
|
12
|
+
resolvers = [];
|
|
13
|
+
closed = false;
|
|
14
|
+
push(item) {
|
|
15
|
+
if (this.closed)
|
|
16
|
+
return;
|
|
17
|
+
const r = this.resolvers.shift();
|
|
18
|
+
if (r)
|
|
19
|
+
r({ value: item, done: false });
|
|
20
|
+
else
|
|
21
|
+
this.items.push(item);
|
|
22
|
+
}
|
|
23
|
+
close() {
|
|
24
|
+
if (this.closed)
|
|
25
|
+
return;
|
|
26
|
+
this.closed = true;
|
|
27
|
+
let r;
|
|
28
|
+
while ((r = this.resolvers.shift()))
|
|
29
|
+
r({ value: undefined, done: true });
|
|
30
|
+
}
|
|
31
|
+
[Symbol.asyncIterator]() {
|
|
32
|
+
return {
|
|
33
|
+
next: () => {
|
|
34
|
+
const item = this.items.shift();
|
|
35
|
+
if (item !== undefined)
|
|
36
|
+
return Promise.resolve({ value: item, done: false });
|
|
37
|
+
if (this.closed)
|
|
38
|
+
return Promise.resolve({ value: undefined, done: true });
|
|
39
|
+
return new Promise((resolve) => this.resolvers.push(resolve));
|
|
40
|
+
},
|
|
41
|
+
return: () => {
|
|
42
|
+
this.close();
|
|
43
|
+
return Promise.resolve({ value: undefined, done: true });
|
|
44
|
+
},
|
|
45
|
+
[Symbol.asyncIterator]() {
|
|
46
|
+
return this;
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** Convert a raw ACP session update into zero or more structured `AcpEvent`s. */
|
|
52
|
+
export function updateToEvents(update) {
|
|
53
|
+
switch (update.sessionUpdate) {
|
|
54
|
+
case "agent_message_chunk": {
|
|
55
|
+
const c = update.content;
|
|
56
|
+
if (c.type === "text")
|
|
57
|
+
return [{ type: "text", text: c.text }];
|
|
58
|
+
return [{ type: "raw", update }];
|
|
59
|
+
}
|
|
60
|
+
case "agent_thought_chunk": {
|
|
61
|
+
const c = update.content;
|
|
62
|
+
if (c.type === "text")
|
|
63
|
+
return [{ type: "thought", text: c.text }];
|
|
64
|
+
return [{ type: "raw", update }];
|
|
65
|
+
}
|
|
66
|
+
case "tool_call":
|
|
67
|
+
return [
|
|
68
|
+
{
|
|
69
|
+
type: "tool_call",
|
|
70
|
+
id: update.toolCallId,
|
|
71
|
+
title: update.title,
|
|
72
|
+
status: update.status ?? "pending",
|
|
73
|
+
...(update.kind ? { kind: update.kind } : {}),
|
|
74
|
+
},
|
|
75
|
+
];
|
|
76
|
+
case "tool_call_update":
|
|
77
|
+
return [
|
|
78
|
+
{
|
|
79
|
+
type: "tool_update",
|
|
80
|
+
id: update.toolCallId,
|
|
81
|
+
...(update.status != null ? { status: update.status } : {}),
|
|
82
|
+
...(update.title != null ? { title: update.title } : {}),
|
|
83
|
+
},
|
|
84
|
+
];
|
|
85
|
+
case "plan":
|
|
86
|
+
return [
|
|
87
|
+
{
|
|
88
|
+
type: "plan",
|
|
89
|
+
entries: (update.entries ?? []).map((e) => ({
|
|
90
|
+
content: e.content,
|
|
91
|
+
status: e.status,
|
|
92
|
+
priority: e.priority,
|
|
93
|
+
})),
|
|
94
|
+
},
|
|
95
|
+
];
|
|
96
|
+
default:
|
|
97
|
+
return [{ type: "raw", update }];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export class Session {
|
|
101
|
+
id;
|
|
102
|
+
workspace;
|
|
103
|
+
queue = new AsyncQueue();
|
|
104
|
+
ended = false;
|
|
105
|
+
rawUpdateHandler;
|
|
106
|
+
constructor(id, workspace, rawUpdateHandler) {
|
|
107
|
+
this.id = id;
|
|
108
|
+
this.workspace = workspace;
|
|
109
|
+
this.rawUpdateHandler = rawUpdateHandler;
|
|
110
|
+
}
|
|
111
|
+
/** Feed a raw ACP update (called by the connection's client handler). */
|
|
112
|
+
onUpdate(update) {
|
|
113
|
+
this.rawUpdateHandler?.(update);
|
|
114
|
+
for (const ev of updateToEvents(update))
|
|
115
|
+
this.queue.push(ev);
|
|
116
|
+
}
|
|
117
|
+
/** Temporarily observe raw, SDK-validated ACP updates for an embedding host. */
|
|
118
|
+
setRawUpdateHandler(handler) {
|
|
119
|
+
this.rawUpdateHandler = handler;
|
|
120
|
+
}
|
|
121
|
+
/** Push a synthesized event (usage, error, etc.). */
|
|
122
|
+
push(event) {
|
|
123
|
+
this.queue.push(event);
|
|
124
|
+
}
|
|
125
|
+
/** Emit the terminal `done` event and close the stream. */
|
|
126
|
+
end(stopReason) {
|
|
127
|
+
if (this.ended)
|
|
128
|
+
return;
|
|
129
|
+
this.ended = true;
|
|
130
|
+
this.queue.push({ type: "done", stopReason });
|
|
131
|
+
this.queue.close();
|
|
132
|
+
}
|
|
133
|
+
/** Emit an error and close the stream. */
|
|
134
|
+
fail(message) {
|
|
135
|
+
if (this.ended)
|
|
136
|
+
return;
|
|
137
|
+
this.ended = true;
|
|
138
|
+
this.queue.push({ type: "error", message });
|
|
139
|
+
this.queue.close();
|
|
140
|
+
}
|
|
141
|
+
/** Async-iterate the event stream until the turn ends. */
|
|
142
|
+
events() {
|
|
143
|
+
return this.queue[Symbol.asyncIterator]();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public types for @xenosystem/acp-core.
|
|
3
|
+
*
|
|
4
|
+
* The engine is framework-free: these types describe the embeddable surface that
|
|
5
|
+
* in-process consumers (and the HTTP server) build on. Nothing here knows about
|
|
6
|
+
* HTTP or the OpenAI schema.
|
|
7
|
+
*/
|
|
8
|
+
import type { StopReason } from "@agentclientprotocol/sdk";
|
|
9
|
+
export type { StopReason };
|
|
10
|
+
/** How the gateway answers an agent's `requestPermission` call. */
|
|
11
|
+
export type PermissionPolicy = "auto" | "deny" | "prompt";
|
|
12
|
+
/** A single chat message handed to the engine; rendered into an ACP prompt. */
|
|
13
|
+
export interface ChatMessage {
|
|
14
|
+
role: "system" | "user" | "assistant" | "tool";
|
|
15
|
+
content: string;
|
|
16
|
+
/** Optional name (tool name / participant) — included in the rendered transcript. */
|
|
17
|
+
name?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The structured event stream produced by a prompt turn. Embedders consume this
|
|
21
|
+
* directly (full fidelity); the HTTP server runs it through `flatten()`.
|
|
22
|
+
*/
|
|
23
|
+
export type AcpEvent = {
|
|
24
|
+
type: "text";
|
|
25
|
+
text: string;
|
|
26
|
+
} | {
|
|
27
|
+
type: "thought";
|
|
28
|
+
text: string;
|
|
29
|
+
} | {
|
|
30
|
+
type: "tool_call";
|
|
31
|
+
id: string;
|
|
32
|
+
title: string;
|
|
33
|
+
status: string;
|
|
34
|
+
kind?: string;
|
|
35
|
+
} | {
|
|
36
|
+
type: "tool_update";
|
|
37
|
+
id: string;
|
|
38
|
+
status?: string;
|
|
39
|
+
title?: string;
|
|
40
|
+
} | {
|
|
41
|
+
type: "plan";
|
|
42
|
+
entries: Array<{
|
|
43
|
+
content: string;
|
|
44
|
+
status: string;
|
|
45
|
+
priority?: string;
|
|
46
|
+
}>;
|
|
47
|
+
} | {
|
|
48
|
+
type: "usage";
|
|
49
|
+
inputTokens?: number;
|
|
50
|
+
outputTokens?: number;
|
|
51
|
+
totalTokens?: number;
|
|
52
|
+
} | {
|
|
53
|
+
type: "raw";
|
|
54
|
+
update: unknown;
|
|
55
|
+
} | {
|
|
56
|
+
type: "done";
|
|
57
|
+
stopReason: StopReason;
|
|
58
|
+
} | {
|
|
59
|
+
type: "error";
|
|
60
|
+
message: string;
|
|
61
|
+
};
|
|
62
|
+
/** Options for a single prompt turn. */
|
|
63
|
+
export interface PromptOptions {
|
|
64
|
+
/** Conversation to drive the turn. The trailing user message is the active ask. */
|
|
65
|
+
messages: ChatMessage[];
|
|
66
|
+
/**
|
|
67
|
+
* Reserved session correlation key. In 0.1.0 this is accepted for forward compatibility,
|
|
68
|
+
* but every call still creates an ephemeral ACP session and renders the full conversation.
|
|
69
|
+
*/
|
|
70
|
+
session?: string;
|
|
71
|
+
/** Override the working directory for this turn (default: a sandboxed session dir). */
|
|
72
|
+
workspace?: string;
|
|
73
|
+
/** Submodel hint for agents that support it (recorded; surfaced via `_meta`). */
|
|
74
|
+
model?: string | null;
|
|
75
|
+
/** ACP session mode (if the agent advertises modes). */
|
|
76
|
+
mode?: string;
|
|
77
|
+
/** Narrate tool_call/plan/thought events as part of the stream (consumer's choice). */
|
|
78
|
+
verbose?: boolean;
|
|
79
|
+
/** Cancel the in-flight turn. */
|
|
80
|
+
signal?: AbortSignal;
|
|
81
|
+
}
|
|
82
|
+
/** A declarative agent definition. Adding an agent is data, not code. */
|
|
83
|
+
export interface AgentDef {
|
|
84
|
+
/** Stable id; what consumers pass as the OpenAI `model`. */
|
|
85
|
+
id: string;
|
|
86
|
+
/** Human-friendly name (shown in /v1/models). */
|
|
87
|
+
name: string;
|
|
88
|
+
/** Executable to spawn (resolved cross-platform by the supervisor). */
|
|
89
|
+
cmd: string;
|
|
90
|
+
/** Arguments that put the agent into ACP/stdio mode. */
|
|
91
|
+
args: string[];
|
|
92
|
+
/** Extra environment for the spawned process. */
|
|
93
|
+
env?: Record<string, string>;
|
|
94
|
+
/**
|
|
95
|
+
* Environment variables to strip from the spawned agent's env. Use this to avoid leaking
|
|
96
|
+
* the *parent* runner's per-session markers into a freshly spawned agent (e.g. spawning
|
|
97
|
+
* Claude Code from within another Claude Code session trips its nested-session guard via
|
|
98
|
+
* `CLAUDECODE`).
|
|
99
|
+
*/
|
|
100
|
+
unsetEnv?: string[];
|
|
101
|
+
/** Optional default submodel for this agent. */
|
|
102
|
+
defaultModel?: string | null;
|
|
103
|
+
/** Per-agent override of the concurrency cap. */
|
|
104
|
+
maxConcurrentSessions?: number;
|
|
105
|
+
/** Per-agent override of the permission policy. */
|
|
106
|
+
permission?: PermissionPolicy;
|
|
107
|
+
/** Kill terminal commands after this many ms. */
|
|
108
|
+
terminalTimeoutMs?: number;
|
|
109
|
+
/** Fail `initialize` if it doesn't complete in this many ms. */
|
|
110
|
+
initTimeoutMs?: number;
|
|
111
|
+
/** Base working directory for the spawned process (not the session workspace). */
|
|
112
|
+
cwd?: string;
|
|
113
|
+
}
|
|
114
|
+
export type AgentVersionReadinessStatus = "not_applicable" | "ok" | "outdated" | "unavailable" | "unknown";
|
|
115
|
+
export interface AgentVersionReadiness {
|
|
116
|
+
agentId: string;
|
|
117
|
+
status: AgentVersionReadinessStatus;
|
|
118
|
+
ok: boolean;
|
|
119
|
+
installedVersion?: string;
|
|
120
|
+
minimumVersion?: string;
|
|
121
|
+
recommendedVersion?: string;
|
|
122
|
+
updateHint?: string;
|
|
123
|
+
message: string;
|
|
124
|
+
}
|
|
125
|
+
export interface EngineDefaults {
|
|
126
|
+
maxConcurrentSessions: number;
|
|
127
|
+
permission: PermissionPolicy;
|
|
128
|
+
terminalTimeoutMs: number;
|
|
129
|
+
initTimeoutMs: number;
|
|
130
|
+
}
|
|
131
|
+
export interface ServerConfig {
|
|
132
|
+
host: string;
|
|
133
|
+
port: number;
|
|
134
|
+
auth: "bearer" | "open";
|
|
135
|
+
}
|
|
136
|
+
export interface KeyEntry {
|
|
137
|
+
key: string;
|
|
138
|
+
app: string;
|
|
139
|
+
/** Agent ids this key may use; `["*"]` = all enabled agents. */
|
|
140
|
+
agents: string[];
|
|
141
|
+
maxConcurrentSessions?: number;
|
|
142
|
+
}
|
|
143
|
+
/** Fully-resolved configuration (built-ins merged, env expanded, defaults applied). */
|
|
144
|
+
export interface ResolvedConfig {
|
|
145
|
+
server: ServerConfig;
|
|
146
|
+
workspaceRoot: string;
|
|
147
|
+
keepWorkspaces: boolean;
|
|
148
|
+
defaults: EngineDefaults;
|
|
149
|
+
agents: AgentDef[];
|
|
150
|
+
keys: KeyEntry[];
|
|
151
|
+
}
|
|
152
|
+
/** Status snapshot for one supervised agent (for /healthz and diagnostics). */
|
|
153
|
+
export interface AgentStatus {
|
|
154
|
+
id: string;
|
|
155
|
+
name: string;
|
|
156
|
+
state: "idle" | "starting" | "ready" | "needs-auth" | "error" | "stopped";
|
|
157
|
+
activeSessions: number;
|
|
158
|
+
pid?: number;
|
|
159
|
+
lastError?: string;
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public types for @xenosystem/acp-core.
|
|
3
|
+
*
|
|
4
|
+
* The engine is framework-free: these types describe the embeddable surface that
|
|
5
|
+
* in-process consumers (and the HTTP server) build on. Nothing here knows about
|
|
6
|
+
* HTTP or the OpenAI schema.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-session sandboxed workspaces and path containment.
|
|
3
|
+
*
|
|
4
|
+
* Every session runs against an isolated directory under `workspaceRoot`. All file and
|
|
5
|
+
* terminal capability handlers MUST route paths through `containPath` so an agent cannot
|
|
6
|
+
* read or write outside its sandbox (CLAUDE.md rule 4, SPEC §8). Auto-approved permissions
|
|
7
|
+
* + a writable workspace are powerful; this containment is what bounds the blast radius.
|
|
8
|
+
*/
|
|
9
|
+
export interface Workspace {
|
|
10
|
+
/** Absolute path to the session's sandbox directory. */
|
|
11
|
+
dir: string;
|
|
12
|
+
/** Resolve+validate a path requested by the agent; throws if it escapes the sandbox. */
|
|
13
|
+
contain(requested: string): string;
|
|
14
|
+
/** Remove the sandbox (no-op if `keep`). */
|
|
15
|
+
cleanup(): void;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Throws unless `requested` resolves to a location at or beneath `root`.
|
|
19
|
+
* Handles `..` traversal (collapsed by `resolve`) and absolute paths outside the root.
|
|
20
|
+
*/
|
|
21
|
+
export declare function containPath(root: string, requested: string): string;
|
|
22
|
+
/** Create (and return) a sandbox for `${root}/${agentId}/${sessionId}`. */
|
|
23
|
+
export declare function createWorkspace(root: string, agentId: string, sessionId: string, opts?: {
|
|
24
|
+
keep?: boolean;
|
|
25
|
+
override?: string;
|
|
26
|
+
}): Workspace;
|
|
27
|
+
//# sourceMappingURL=workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,MAAM,WAAW,SAAS;IACxB,wDAAwD;IACxD,GAAG,EAAE,MAAM,CAAC;IACZ,wFAAwF;IACxF,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IACnC,4CAA4C;IAC5C,OAAO,IAAI,IAAI,CAAC;CACjB;AAMD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CASnE;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/C,SAAS,CAkBX"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-session sandboxed workspaces and path containment.
|
|
3
|
+
*
|
|
4
|
+
* Every session runs against an isolated directory under `workspaceRoot`. All file and
|
|
5
|
+
* terminal capability handlers MUST route paths through `containPath` so an agent cannot
|
|
6
|
+
* read or write outside its sandbox (CLAUDE.md rule 4, SPEC §8). Auto-approved permissions
|
|
7
|
+
* + a writable workspace are powerful; this containment is what bounds the blast radius.
|
|
8
|
+
*/
|
|
9
|
+
import { mkdirSync, rmSync } from "node:fs";
|
|
10
|
+
import { resolve, isAbsolute, join, sep } from "node:path";
|
|
11
|
+
function sanitizeSegment(s) {
|
|
12
|
+
return s.replace(/[^a-zA-Z0-9._-]/g, "_").slice(0, 80) || "x";
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Throws unless `requested` resolves to a location at or beneath `root`.
|
|
16
|
+
* Handles `..` traversal (collapsed by `resolve`) and absolute paths outside the root.
|
|
17
|
+
*/
|
|
18
|
+
export function containPath(root, requested) {
|
|
19
|
+
const absRoot = resolve(root);
|
|
20
|
+
const candidate = isAbsolute(requested) ? resolve(requested) : resolve(absRoot, requested);
|
|
21
|
+
if (candidate !== absRoot && !candidate.startsWith(absRoot + sep)) {
|
|
22
|
+
throw new Error(`path escapes session workspace: ${requested} (resolved ${candidate} not within ${absRoot})`);
|
|
23
|
+
}
|
|
24
|
+
return candidate;
|
|
25
|
+
}
|
|
26
|
+
/** Create (and return) a sandbox for `${root}/${agentId}/${sessionId}`. */
|
|
27
|
+
export function createWorkspace(root, agentId, sessionId, opts = {}) {
|
|
28
|
+
const dir = opts.override
|
|
29
|
+
? resolve(opts.override)
|
|
30
|
+
: join(resolve(root), sanitizeSegment(agentId), sanitizeSegment(sessionId));
|
|
31
|
+
mkdirSync(dir, { recursive: true });
|
|
32
|
+
return {
|
|
33
|
+
dir,
|
|
34
|
+
contain: (requested) => containPath(dir, requested),
|
|
35
|
+
cleanup: () => {
|
|
36
|
+
if (opts.keep || opts.override)
|
|
37
|
+
return; // never auto-delete an operator-supplied dir
|
|
38
|
+
try {
|
|
39
|
+
rmSync(dir, { recursive: true, force: true });
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
/* best-effort */
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAW3D,SAAS,eAAe,CAAC,CAAS;IAChC,OAAO,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;AAChE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,SAAiB;IACzD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC3F,IAAI,SAAS,KAAK,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CACb,mCAAmC,SAAS,cAAc,SAAS,eAAe,OAAO,GAAG,CAC7F,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,OAAe,EACf,SAAiB,EACjB,OAA8C,EAAE;IAEhD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ;QACvB,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;QACxB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9E,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpC,OAAO;QACL,GAAG;QACH,OAAO,EAAE,CAAC,SAAiB,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC;QAC3D,OAAO,EAAE,GAAG,EAAE;YACZ,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ;gBAAE,OAAO,CAAC,6CAA6C;YACrF,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAChD,CAAC;YAAC,MAAM,CAAC;gBACP,iBAAiB;YACnB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@xenosystem/acp-core",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Embeddable ACP-client engine: supervise ACP agents and stream structured events. The framework-free core of xeno-acp.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./agent-version-policy": {
|
|
15
|
+
"types": "./dist/agent-version-policy.d.ts",
|
|
16
|
+
"import": "./dist/agent-version-policy.js"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist",
|
|
21
|
+
"README.md",
|
|
22
|
+
"LICENSE",
|
|
23
|
+
"NOTICE"
|
|
24
|
+
],
|
|
25
|
+
"engines": {
|
|
26
|
+
"node": ">=20"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"acp",
|
|
30
|
+
"agent-client-protocol",
|
|
31
|
+
"ai-agent",
|
|
32
|
+
"xeno"
|
|
33
|
+
],
|
|
34
|
+
"homepage": "https://xenostudio.ai/product/acp",
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "git+https://github.com/XENO-CORPORATION/xeno-acp.git",
|
|
38
|
+
"directory": "packages/core"
|
|
39
|
+
},
|
|
40
|
+
"bugs": {
|
|
41
|
+
"url": "https://github.com/XENO-CORPORATION/xeno-acp/issues"
|
|
42
|
+
},
|
|
43
|
+
"publishConfig": {
|
|
44
|
+
"access": "public"
|
|
45
|
+
},
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"@agentclientprotocol/sdk": "0.24.0",
|
|
48
|
+
"strip-json-comments": "^5.0.1"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@types/node": "^22.9.0",
|
|
52
|
+
"typescript": "^5.6.3"
|
|
53
|
+
},
|
|
54
|
+
"scripts": {
|
|
55
|
+
"build": "tsc -p tsconfig.json",
|
|
56
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
57
|
+
"clean": "rimraf dist *.tsbuildinfo"
|
|
58
|
+
}
|
|
59
|
+
}
|