@coralai/claude-code-agent 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +111 -0
- package/dist/agent.d.ts +240 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +592 -0
- package/dist/agent.js.map +1 -0
- package/dist/errors.d.ts +27 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +33 -0
- package/dist/errors.js.map +1 -0
- package/dist/hooks/fs.d.ts +26 -0
- package/dist/hooks/fs.d.ts.map +1 -0
- package/dist/hooks/fs.js +61 -0
- package/dist/hooks/fs.js.map +1 -0
- package/dist/hooks/index.d.ts +18 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/permissions.d.ts +42 -0
- package/dist/hooks/permissions.d.ts.map +1 -0
- package/dist/hooks/permissions.js +79 -0
- package/dist/hooks/permissions.js.map +1 -0
- package/dist/hooks/terminal.d.ts +56 -0
- package/dist/hooks/terminal.d.ts.map +1 -0
- package/dist/hooks/terminal.js +127 -0
- package/dist/hooks/terminal.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/acp-client-interface.d.ts +107 -0
- package/dist/internal/acp-client-interface.d.ts.map +1 -0
- package/dist/internal/acp-client-interface.js +17 -0
- package/dist/internal/acp-client-interface.js.map +1 -0
- package/dist/internal/acp-types.d.ts +64 -0
- package/dist/internal/acp-types.d.ts.map +1 -0
- package/dist/internal/acp-types.js +17 -0
- package/dist/internal/acp-types.js.map +1 -0
- package/dist/internal/agent-runtime-interface.d.ts +40 -0
- package/dist/internal/agent-runtime-interface.d.ts.map +1 -0
- package/dist/internal/agent-runtime-interface.js +17 -0
- package/dist/internal/agent-runtime-interface.js.map +1 -0
- package/dist/internal/local-acp-client.d.ts +27 -0
- package/dist/internal/local-acp-client.d.ts.map +1 -0
- package/dist/internal/local-acp-client.js +26 -0
- package/dist/internal/local-acp-client.js.map +1 -0
- package/dist/internal/sdk-adapter.d.ts +24 -0
- package/dist/internal/sdk-adapter.d.ts.map +1 -0
- package/dist/internal/sdk-adapter.js +453 -0
- package/dist/internal/sdk-adapter.js.map +1 -0
- package/dist/internal/session-accumulator.d.ts +55 -0
- package/dist/internal/session-accumulator.d.ts.map +1 -0
- package/dist/internal/session-accumulator.js +133 -0
- package/dist/internal/session-accumulator.js.map +1 -0
- package/dist/prompt-handle.d.ts +70 -0
- package/dist/prompt-handle.d.ts.map +1 -0
- package/dist/prompt-handle.js +137 -0
- package/dist/prompt-handle.js.map +1 -0
- package/dist/recording/index.d.ts +10 -0
- package/dist/recording/index.d.ts.map +1 -0
- package/dist/recording/index.js +10 -0
- package/dist/recording/index.js.map +1 -0
- package/dist/recording/replayer.d.ts +17 -0
- package/dist/recording/replayer.d.ts.map +1 -0
- package/dist/recording/replayer.js +68 -0
- package/dist/recording/replayer.js.map +1 -0
- package/dist/recording/writer.d.ts +32 -0
- package/dist/recording/writer.d.ts.map +1 -0
- package/dist/recording/writer.js +122 -0
- package/dist/recording/writer.js.map +1 -0
- package/dist/telemetry/index.d.ts +8 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +8 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/otel-adapter.d.ts +105 -0
- package/dist/telemetry/otel-adapter.d.ts.map +1 -0
- package/dist/telemetry/otel-adapter.js +153 -0
- package/dist/telemetry/otel-adapter.js.map +1 -0
- package/package.json +45 -0
package/dist/errors.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentError + error codes — single error class for all failure modes
|
|
3
|
+
* across spawn, transport, session, prompt, recording, replay, and auth.
|
|
4
|
+
*
|
|
5
|
+
* Spec: vision doc §3 (Error Model). Total 18 codes (initial 16 + spike-added
|
|
6
|
+
* REPLAY_MISMATCH / REPLAY_EOF for v0.1 Recording feature).
|
|
7
|
+
*/
|
|
8
|
+
/** Standardized error for all agent operations. */
|
|
9
|
+
export class AgentError extends Error {
|
|
10
|
+
code;
|
|
11
|
+
/** Original error captured at the failure site, if any. */
|
|
12
|
+
cause;
|
|
13
|
+
/** Debug context: pid, sessionId, turnId, lastUpdate, etc. */
|
|
14
|
+
context;
|
|
15
|
+
/** Actionable fix guidance — auto-populated for AUTH_ERROR (calls checkRuntime). */
|
|
16
|
+
diagnostic;
|
|
17
|
+
constructor(code, message, options) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.name = 'AgentError';
|
|
20
|
+
this.code = code;
|
|
21
|
+
if (options?.cause !== undefined)
|
|
22
|
+
this.cause = options.cause;
|
|
23
|
+
if (options?.context !== undefined)
|
|
24
|
+
this.context = options.context;
|
|
25
|
+
if (options?.diagnostic !== undefined)
|
|
26
|
+
this.diagnostic = options.diagnostic;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/** Type-narrowing helper for callers handling errors. */
|
|
30
|
+
export function isAgentError(err) {
|
|
31
|
+
return err instanceof AgentError;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAsCH,mDAAmD;AACnD,MAAM,OAAO,UAAW,SAAQ,KAAK;IAC1B,IAAI,CAAiB;IAC9B,2DAA2D;IAClD,KAAK,CAAS;IACvB,8DAA8D;IACrD,OAAO,CAA2B;IAC3C,oFAAoF;IAC3E,UAAU,CAAU;IAE7B,YACE,IAAoB,EACpB,OAAe,EACf,OAIC;QAED,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,OAAO,EAAE,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC7D,IAAI,OAAO,EAAE,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QACnE,IAAI,OAAO,EAAE,UAAU,KAAK,SAAS;YAAE,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAC9E,CAAC;CACF;AAED,yDAAyD;AACzD,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,OAAO,GAAG,YAAY,UAAU,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { PermissionMode } from './permissions.js';
|
|
2
|
+
interface ReadTextFileRequest {
|
|
3
|
+
path: string;
|
|
4
|
+
line?: number;
|
|
5
|
+
limit?: number;
|
|
6
|
+
}
|
|
7
|
+
interface WriteTextFileRequest {
|
|
8
|
+
path: string;
|
|
9
|
+
content: string;
|
|
10
|
+
}
|
|
11
|
+
export declare class FileSystemHandlers {
|
|
12
|
+
private readonly rootDir;
|
|
13
|
+
private readonly permissionMode;
|
|
14
|
+
constructor(opts: {
|
|
15
|
+
cwd: string;
|
|
16
|
+
permissionMode: PermissionMode;
|
|
17
|
+
});
|
|
18
|
+
readTextFile(params: ReadTextFileRequest): Promise<{
|
|
19
|
+
content: string;
|
|
20
|
+
}>;
|
|
21
|
+
writeTextFile(params: WriteTextFileRequest): Promise<Record<string, never>>;
|
|
22
|
+
private resolvePathWithinRoot;
|
|
23
|
+
private sliceContent;
|
|
24
|
+
}
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=fs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/hooks/fs.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,UAAU,mBAAmB;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,oBAAoB;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;gBAEpC,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,cAAc,CAAA;KAAE;IAK3D,YAAY,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IASvE,aAAa,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAUjF,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,YAAY;CAOrB"}
|
package/dist/hooks/fs.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module acp-fs-handlers
|
|
3
|
+
* @description ACP 文件系统处理器,处理文件读写回调并强制沙箱隔离
|
|
4
|
+
*
|
|
5
|
+
* @author eddy
|
|
6
|
+
* @organization wykj
|
|
7
|
+
* @ownership wykj/eddy
|
|
8
|
+
*
|
|
9
|
+
* @created 2026-03-31
|
|
10
|
+
* @updated 2026-04-03
|
|
11
|
+
*
|
|
12
|
+
* @role adapter
|
|
13
|
+
* @layer provider
|
|
14
|
+
* @boundedContext acp
|
|
15
|
+
*/
|
|
16
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
17
|
+
import path from 'node:path';
|
|
18
|
+
export class FileSystemHandlers {
|
|
19
|
+
rootDir;
|
|
20
|
+
permissionMode;
|
|
21
|
+
constructor(opts) {
|
|
22
|
+
this.rootDir = path.resolve(opts.cwd);
|
|
23
|
+
this.permissionMode = opts.permissionMode;
|
|
24
|
+
}
|
|
25
|
+
async readTextFile(params) {
|
|
26
|
+
if (this.permissionMode === 'deny-all') {
|
|
27
|
+
throw new Error('Permission denied for fs/read_text_file (deny-all)');
|
|
28
|
+
}
|
|
29
|
+
const filePath = this.resolvePathWithinRoot(params.path);
|
|
30
|
+
const content = await readFile(filePath, 'utf-8');
|
|
31
|
+
return { content: this.sliceContent(content, params.line, params.limit) };
|
|
32
|
+
}
|
|
33
|
+
async writeTextFile(params) {
|
|
34
|
+
if (this.permissionMode === 'deny-all') {
|
|
35
|
+
throw new Error('Permission denied for fs/write_text_file (deny-all)');
|
|
36
|
+
}
|
|
37
|
+
const filePath = this.resolvePathWithinRoot(params.path);
|
|
38
|
+
await mkdir(path.dirname(filePath), { recursive: true });
|
|
39
|
+
await writeFile(filePath, params.content, 'utf-8');
|
|
40
|
+
return {};
|
|
41
|
+
}
|
|
42
|
+
resolvePathWithinRoot(rawPath) {
|
|
43
|
+
if (!path.isAbsolute(rawPath)) {
|
|
44
|
+
throw new Error(`Path must be absolute: ${rawPath}`);
|
|
45
|
+
}
|
|
46
|
+
const resolved = path.resolve(rawPath);
|
|
47
|
+
if (resolved !== this.rootDir && !resolved.startsWith(this.rootDir + path.sep)) {
|
|
48
|
+
throw new Error(`Path outside allowed cwd subtree: ${resolved}`);
|
|
49
|
+
}
|
|
50
|
+
return resolved;
|
|
51
|
+
}
|
|
52
|
+
sliceContent(content, line, limit) {
|
|
53
|
+
if (line == null && limit == null)
|
|
54
|
+
return content;
|
|
55
|
+
const lines = content.split('\n');
|
|
56
|
+
const startIndex = Math.max(0, (line ?? 1) - 1);
|
|
57
|
+
const endIndex = limit == null ? lines.length : Math.min(lines.length, startIndex + limit);
|
|
58
|
+
return lines.slice(startIndex, endIndex).join('\n');
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=fs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/hooks/fs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,IAAI,MAAM,WAAW,CAAC;AAc7B,MAAM,OAAO,kBAAkB;IACZ,OAAO,CAAS;IAChB,cAAc,CAAiB;IAEhD,YAAY,IAAqD;QAC/D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAA2B;QAC5C,IAAI,IAAI,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAA4B;QAC9C,IAAI,IAAI,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,MAAM,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,EAAE,CAAC;IACZ,CAAC;IAEO,qBAAqB,CAAC,OAAe;QAC3C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,QAAQ,KAAK,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/E,MAAM,IAAI,KAAK,CAAC,qCAAqC,QAAQ,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,YAAY,CAAC,OAAe,EAAE,IAAa,EAAE,KAAc;QACjE,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO,OAAO,CAAC;QAClD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,GAAG,KAAK,CAAC,CAAC;QAC3F,OAAO,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;CACF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public hooks barrel — re-exports user-facing hook types from agent.ts.
|
|
3
|
+
*
|
|
4
|
+
* Internal default implementations (fs.ts, permissions.ts, terminal.ts) are
|
|
5
|
+
* exported from those files directly and stay internal to the package.
|
|
6
|
+
*
|
|
7
|
+
* Step 1.4.5 status:
|
|
8
|
+
* - onStart / onStop / onError — wired in agent.ts (status transitions)
|
|
9
|
+
* - onSessionUpdate — wired in prompt() turn loop
|
|
10
|
+
* - onElicitation — reserved; claude-agent-acp 0.33.1 does not fire
|
|
11
|
+
* elicitation (spike 2026-05-14). Forward-compatible: hook signature
|
|
12
|
+
* uses SDK native types so when shim wires elicitation, no caller change
|
|
13
|
+
* is needed.
|
|
14
|
+
* - onPermissionRequest + fs + terminal — TODO 1.4.7 (requires routing
|
|
15
|
+
* through the AcpSdkAdapter ClientSideConnection handlers).
|
|
16
|
+
*/
|
|
17
|
+
export type { AgentHooks, PermissionRequest, PermissionDecision, } from '../agent.js';
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,YAAY,EACV,UAAU,EACV,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module acp-permissions
|
|
3
|
+
* @description ACP 权限解析器,三层决策链自动审批工具调用权限
|
|
4
|
+
*
|
|
5
|
+
* @author eddy
|
|
6
|
+
* @organization wykj
|
|
7
|
+
* @ownership wykj/eddy
|
|
8
|
+
*
|
|
9
|
+
* @created 2026-03-31
|
|
10
|
+
* @updated 2026-03-31
|
|
11
|
+
*
|
|
12
|
+
* @role adapter
|
|
13
|
+
* @layer provider
|
|
14
|
+
* @boundedContext acp
|
|
15
|
+
*/
|
|
16
|
+
export type PermissionMode = 'approve-all' | 'approve-reads' | 'deny-all';
|
|
17
|
+
interface PermissionParams {
|
|
18
|
+
toolCall: {
|
|
19
|
+
toolCallId?: string;
|
|
20
|
+
title?: string;
|
|
21
|
+
kind?: string;
|
|
22
|
+
status?: string;
|
|
23
|
+
};
|
|
24
|
+
options: ReadonlyArray<{
|
|
25
|
+
optionId: string;
|
|
26
|
+
kind: string;
|
|
27
|
+
name?: string;
|
|
28
|
+
}>;
|
|
29
|
+
}
|
|
30
|
+
interface PermissionResponse {
|
|
31
|
+
outcome: {
|
|
32
|
+
outcome: 'selected';
|
|
33
|
+
optionId: string;
|
|
34
|
+
} | {
|
|
35
|
+
outcome: 'cancelled';
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/** Infer tool kind from toolCall.kind or title keywords (aligned with acpx). */
|
|
39
|
+
export declare function inferToolKind(params: Pick<PermissionParams, 'toolCall'>): string | undefined;
|
|
40
|
+
export declare function resolvePermission(params: PermissionParams, mode: PermissionMode): PermissionResponse;
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/hooks/permissions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,eAAe,GAAG,UAAU,CAAC;AAE1E,UAAU,gBAAgB;IACxB,QAAQ,EAAE;QACR,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,OAAO,EAAE,aAAa,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;CACJ;AAED,UAAU,kBAAkB;IAC1B,OAAO,EACH;QAAE,OAAO,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GACzC;QAAE,OAAO,EAAE,WAAW,CAAA;KAAE,CAAC;CAC9B;AAaD,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,GAAG,MAAM,GAAG,SAAS,CAc5F;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,cAAc,GAAG,kBAAkB,CA8BpG"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module acp-permissions
|
|
3
|
+
* @description ACP 权限解析器,三层决策链自动审批工具调用权限
|
|
4
|
+
*
|
|
5
|
+
* @author eddy
|
|
6
|
+
* @organization wykj
|
|
7
|
+
* @ownership wykj/eddy
|
|
8
|
+
*
|
|
9
|
+
* @created 2026-03-31
|
|
10
|
+
* @updated 2026-03-31
|
|
11
|
+
*
|
|
12
|
+
* @role adapter
|
|
13
|
+
* @layer provider
|
|
14
|
+
* @boundedContext acp
|
|
15
|
+
*/
|
|
16
|
+
function pickOption(options, kinds) {
|
|
17
|
+
for (const kind of kinds) {
|
|
18
|
+
const match = options.find((o) => o.kind === kind);
|
|
19
|
+
if (match)
|
|
20
|
+
return match;
|
|
21
|
+
}
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
/** Infer tool kind from toolCall.kind or title keywords (aligned with acpx). */
|
|
25
|
+
export function inferToolKind(params) {
|
|
26
|
+
if (params.toolCall.kind)
|
|
27
|
+
return params.toolCall.kind;
|
|
28
|
+
const title = params.toolCall.title?.trim().toLowerCase() ?? '';
|
|
29
|
+
const head = title.split(':', 1)[0]?.trim() ?? '';
|
|
30
|
+
if (!head)
|
|
31
|
+
return undefined;
|
|
32
|
+
if (head.includes('read') || head.includes('cat'))
|
|
33
|
+
return 'read';
|
|
34
|
+
if (head.includes('search') || head.includes('find') || head.includes('grep'))
|
|
35
|
+
return 'search';
|
|
36
|
+
if (head.includes('write') || head.includes('edit') || head.includes('patch'))
|
|
37
|
+
return 'edit';
|
|
38
|
+
if (head.includes('delete') || head.includes('remove'))
|
|
39
|
+
return 'delete';
|
|
40
|
+
if (head.includes('move') || head.includes('rename'))
|
|
41
|
+
return 'move';
|
|
42
|
+
if (head.includes('run') || head.includes('execute') || head.includes('bash'))
|
|
43
|
+
return 'execute';
|
|
44
|
+
if (head.includes('fetch') || head.includes('http') || head.includes('url'))
|
|
45
|
+
return 'fetch';
|
|
46
|
+
if (head.includes('think'))
|
|
47
|
+
return 'think';
|
|
48
|
+
return 'other';
|
|
49
|
+
}
|
|
50
|
+
export function resolvePermission(params, mode) {
|
|
51
|
+
const { options } = params;
|
|
52
|
+
if (options.length === 0)
|
|
53
|
+
return { outcome: { outcome: 'cancelled' } };
|
|
54
|
+
const allowOption = pickOption(options, ['allow_once', 'allow_always']);
|
|
55
|
+
const rejectOption = pickOption(options, ['reject_once', 'reject_always']);
|
|
56
|
+
// Layer 1: global policy
|
|
57
|
+
if (mode === 'approve-all') {
|
|
58
|
+
const fallback = allowOption?.optionId ?? options[0]?.optionId;
|
|
59
|
+
if (!fallback)
|
|
60
|
+
return { outcome: { outcome: 'cancelled' } };
|
|
61
|
+
return { outcome: { outcome: 'selected', optionId: fallback } };
|
|
62
|
+
}
|
|
63
|
+
if (mode === 'deny-all') {
|
|
64
|
+
return rejectOption
|
|
65
|
+
? { outcome: { outcome: 'selected', optionId: rejectOption.optionId } }
|
|
66
|
+
: { outcome: { outcome: 'cancelled' } };
|
|
67
|
+
}
|
|
68
|
+
// Layer 2: approve-reads — auto-approve read/search kinds
|
|
69
|
+
const kind = inferToolKind(params);
|
|
70
|
+
if ((kind === 'read' || kind === 'search') && allowOption) {
|
|
71
|
+
return { outcome: { outcome: 'selected', optionId: allowOption.optionId } };
|
|
72
|
+
}
|
|
73
|
+
// Layer 3: SPS is unattended — auto-approve (no TTY interaction)
|
|
74
|
+
if (allowOption) {
|
|
75
|
+
return { outcome: { outcome: 'selected', optionId: allowOption.optionId } };
|
|
76
|
+
}
|
|
77
|
+
return { outcome: { outcome: 'cancelled' } };
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/hooks/permissions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { PermissionMode } from './permissions.js';
|
|
2
|
+
interface CreateTerminalRequest {
|
|
3
|
+
sessionId: string;
|
|
4
|
+
command: string;
|
|
5
|
+
args?: string[];
|
|
6
|
+
env?: Array<{
|
|
7
|
+
name: string;
|
|
8
|
+
value: string;
|
|
9
|
+
}>;
|
|
10
|
+
cwd?: string;
|
|
11
|
+
outputByteLimit?: number;
|
|
12
|
+
}
|
|
13
|
+
interface TerminalOutputRequest {
|
|
14
|
+
sessionId: string;
|
|
15
|
+
terminalId: string;
|
|
16
|
+
}
|
|
17
|
+
interface WaitForTerminalExitRequest {
|
|
18
|
+
sessionId: string;
|
|
19
|
+
terminalId: string;
|
|
20
|
+
}
|
|
21
|
+
interface KillTerminalRequest {
|
|
22
|
+
sessionId: string;
|
|
23
|
+
terminalId: string;
|
|
24
|
+
}
|
|
25
|
+
interface ReleaseTerminalRequest {
|
|
26
|
+
sessionId: string;
|
|
27
|
+
terminalId: string;
|
|
28
|
+
}
|
|
29
|
+
interface ExitStatus {
|
|
30
|
+
exitCode: number | null;
|
|
31
|
+
signal: string | null;
|
|
32
|
+
}
|
|
33
|
+
export declare class TerminalManager {
|
|
34
|
+
private readonly cwd;
|
|
35
|
+
private readonly permissionMode;
|
|
36
|
+
private readonly terminals;
|
|
37
|
+
constructor(opts: {
|
|
38
|
+
cwd: string;
|
|
39
|
+
permissionMode: PermissionMode;
|
|
40
|
+
});
|
|
41
|
+
createTerminal(params: CreateTerminalRequest): Promise<{
|
|
42
|
+
terminalId: string;
|
|
43
|
+
}>;
|
|
44
|
+
terminalOutput(params: TerminalOutputRequest): Promise<{
|
|
45
|
+
output: string;
|
|
46
|
+
truncated: boolean;
|
|
47
|
+
exitStatus?: ExitStatus;
|
|
48
|
+
}>;
|
|
49
|
+
waitForTerminalExit(params: WaitForTerminalExitRequest): Promise<ExitStatus>;
|
|
50
|
+
killTerminal(params: KillTerminalRequest): Promise<Record<string, never>>;
|
|
51
|
+
releaseTerminal(params: ReleaseTerminalRequest): Promise<Record<string, never>>;
|
|
52
|
+
private killProcess;
|
|
53
|
+
private getTerminal;
|
|
54
|
+
}
|
|
55
|
+
export {};
|
|
56
|
+
//# sourceMappingURL=terminal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/hooks/terminal.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAKvD,UAAU,qBAAqB;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,UAAU,qBAAqB;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,0BAA0B;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,mBAAmB;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,sBAAsB;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,UAAU;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAqBD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsC;gBAEpD,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,cAAc,CAAA;KAAE;IAK3D,cAAc,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IA+C9E,cAAc,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC;QAC3D,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,CAAC,EAAE,UAAU,CAAC;KACzB,CAAC;IAYI,mBAAmB,CAAC,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAAC,UAAU,CAAC;IAI5E,YAAY,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAKzE,eAAe,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAQvE,WAAW;IAYzB,OAAO,CAAC,WAAW;CAKpB"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module acp-terminal-manager
|
|
3
|
+
* @description ACP 终端管理器,处理子进程创建、输出捕获与优雅终止
|
|
4
|
+
*
|
|
5
|
+
* @author eddy
|
|
6
|
+
* @organization wykj
|
|
7
|
+
* @ownership wykj/eddy
|
|
8
|
+
*
|
|
9
|
+
* @created 2026-03-31
|
|
10
|
+
* @updated 2026-04-03
|
|
11
|
+
*
|
|
12
|
+
* @role adapter
|
|
13
|
+
* @layer provider
|
|
14
|
+
* @boundedContext acp
|
|
15
|
+
*/
|
|
16
|
+
import { spawn } from 'node:child_process';
|
|
17
|
+
import { randomUUID } from 'node:crypto';
|
|
18
|
+
const DEFAULT_OUTPUT_LIMIT_BYTES = 1024 * 1024; // 1MB
|
|
19
|
+
const KILL_GRACE_MS = 5_000;
|
|
20
|
+
function envArrayToRecord(env) {
|
|
21
|
+
if (!env)
|
|
22
|
+
return {};
|
|
23
|
+
const record = {};
|
|
24
|
+
for (const { name, value } of env) {
|
|
25
|
+
record[name] = value;
|
|
26
|
+
}
|
|
27
|
+
return record;
|
|
28
|
+
}
|
|
29
|
+
export class TerminalManager {
|
|
30
|
+
cwd;
|
|
31
|
+
permissionMode;
|
|
32
|
+
terminals = new Map();
|
|
33
|
+
constructor(opts) {
|
|
34
|
+
this.cwd = opts.cwd;
|
|
35
|
+
this.permissionMode = opts.permissionMode;
|
|
36
|
+
}
|
|
37
|
+
async createTerminal(params) {
|
|
38
|
+
if (this.permissionMode === 'deny-all') {
|
|
39
|
+
throw new Error('Permission denied for terminal/create (deny-all)');
|
|
40
|
+
}
|
|
41
|
+
const outputByteLimit = params.outputByteLimit ?? DEFAULT_OUTPUT_LIMIT_BYTES;
|
|
42
|
+
const proc = spawn(params.command, params.args ?? [], {
|
|
43
|
+
cwd: params.cwd ?? this.cwd,
|
|
44
|
+
env: { ...process.env, ...envArrayToRecord(params.env) },
|
|
45
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
46
|
+
});
|
|
47
|
+
let resolveExit;
|
|
48
|
+
const exitPromise = new Promise((r) => { resolveExit = r; });
|
|
49
|
+
const terminal = {
|
|
50
|
+
process: proc,
|
|
51
|
+
output: Buffer.alloc(0),
|
|
52
|
+
truncated: false,
|
|
53
|
+
outputByteLimit,
|
|
54
|
+
exitCode: undefined,
|
|
55
|
+
signal: undefined,
|
|
56
|
+
exitPromise,
|
|
57
|
+
};
|
|
58
|
+
const appendOutput = (chunk) => {
|
|
59
|
+
terminal.output = Buffer.concat([terminal.output, chunk]);
|
|
60
|
+
if (terminal.output.length > terminal.outputByteLimit) {
|
|
61
|
+
terminal.output = terminal.output.subarray(-terminal.outputByteLimit);
|
|
62
|
+
terminal.truncated = true;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
proc.stdout.on('data', appendOutput);
|
|
66
|
+
proc.stderr.on('data', appendOutput);
|
|
67
|
+
proc.once('exit', (code, signal) => {
|
|
68
|
+
terminal.exitCode = code;
|
|
69
|
+
terminal.signal = signal;
|
|
70
|
+
resolveExit({ exitCode: code ?? null, signal: signal ?? null });
|
|
71
|
+
});
|
|
72
|
+
const terminalId = randomUUID();
|
|
73
|
+
this.terminals.set(terminalId, terminal);
|
|
74
|
+
return { terminalId };
|
|
75
|
+
}
|
|
76
|
+
async terminalOutput(params) {
|
|
77
|
+
const terminal = this.getTerminal(params.terminalId);
|
|
78
|
+
const hasExit = terminal.exitCode !== undefined || terminal.signal !== undefined;
|
|
79
|
+
return {
|
|
80
|
+
output: terminal.output.toString('utf-8'),
|
|
81
|
+
truncated: terminal.truncated,
|
|
82
|
+
...(hasExit
|
|
83
|
+
? { exitStatus: { exitCode: terminal.exitCode ?? null, signal: terminal.signal ?? null } }
|
|
84
|
+
: {}),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
async waitForTerminalExit(params) {
|
|
88
|
+
return this.getTerminal(params.terminalId).exitPromise;
|
|
89
|
+
}
|
|
90
|
+
async killTerminal(params) {
|
|
91
|
+
await this.killProcess(this.getTerminal(params.terminalId));
|
|
92
|
+
return {};
|
|
93
|
+
}
|
|
94
|
+
async releaseTerminal(params) {
|
|
95
|
+
const terminal = this.terminals.get(params.terminalId);
|
|
96
|
+
if (!terminal)
|
|
97
|
+
return {};
|
|
98
|
+
await this.killProcess(terminal);
|
|
99
|
+
this.terminals.delete(params.terminalId);
|
|
100
|
+
return {};
|
|
101
|
+
}
|
|
102
|
+
async killProcess(terminal) {
|
|
103
|
+
if (terminal.exitCode !== undefined)
|
|
104
|
+
return;
|
|
105
|
+
try {
|
|
106
|
+
terminal.process.kill('SIGTERM');
|
|
107
|
+
}
|
|
108
|
+
catch { /* already dead */ }
|
|
109
|
+
const exited = await Promise.race([
|
|
110
|
+
terminal.exitPromise.then(() => true),
|
|
111
|
+
new Promise((r) => setTimeout(() => r(false), KILL_GRACE_MS)),
|
|
112
|
+
]);
|
|
113
|
+
if (!exited) {
|
|
114
|
+
try {
|
|
115
|
+
terminal.process.kill('SIGKILL');
|
|
116
|
+
}
|
|
117
|
+
catch { /* noop */ }
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
getTerminal(id) {
|
|
121
|
+
const terminal = this.terminals.get(id);
|
|
122
|
+
if (!terminal)
|
|
123
|
+
throw new Error(`Unknown terminal: ${id}`);
|
|
124
|
+
return terminal;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=terminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/hooks/terminal.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @coralai/claude-code-agent — Public API barrel.
|
|
3
|
+
*
|
|
4
|
+
* v0.1.0-alpha.0: ClaudeCodeAgent class + supporting types.
|
|
5
|
+
*
|
|
6
|
+
* Public API surface (stable from v0.1.0):
|
|
7
|
+
* - ClaudeCodeAgent class
|
|
8
|
+
* - PromptHandle / PromptResult / SessionUpdate
|
|
9
|
+
* - AgentError + 18 codes + isAgentError type guard
|
|
10
|
+
* - AgentOptions / AgentHooks / PermissionMode / PermissionRequest /
|
|
11
|
+
* PermissionDecision / UsageSummary / RuntimeCheck / Tracer
|
|
12
|
+
* - RecordingWriter / RecordingReplayer (for tests + dev tooling)
|
|
13
|
+
* - SpanManager (for advanced telemetry integration)
|
|
14
|
+
*
|
|
15
|
+
* Internal bridge re-exports (TEMPORARY — Step 1.5 removes once sps-cli
|
|
16
|
+
* switches to ClaudeCodeAgent class). sps-cli currently imports
|
|
17
|
+
* LocalACPClient / AcpSdkAdapter / etc. directly via this barrel.
|
|
18
|
+
*/
|
|
19
|
+
export { ClaudeCodeAgent } from './agent.js';
|
|
20
|
+
export type { AgentOptions, AgentHooks, AgentStatus, PermissionMode, PermissionRequest, PermissionDecision, UsageSummary, RuntimeCheck, PromptAttachment, PromptOptions, Tracer, } from './agent.js';
|
|
21
|
+
export type { PromptHandle, PromptResult, SessionUpdate, StopReason, } from './prompt-handle.js';
|
|
22
|
+
export { aggregateResult } from './prompt-handle.js';
|
|
23
|
+
export { AgentError, isAgentError, type AgentErrorCode } from './errors.js';
|
|
24
|
+
export { RecordingWriter, RecordingReplayer, type RecordingEvent, } from './recording/index.js';
|
|
25
|
+
export { SpanManager, SpanStatusCode, setAttributeSafe, truncateAttributeValue, type Attributes, type AttributeValue, type Span, } from './telemetry/index.js';
|
|
26
|
+
export type { ACPRunRecord, ACPRunStatus, ACPSessionRecord, ACPSessionStatus, ACPSlotStatus, ACPState, ACPTool, } from './internal/acp-types.js';
|
|
27
|
+
export type { ACPClient, EnsureSessionInput, EnsureSessionResult, StartRunInput, StartRunResult, InspectSessionInput, InspectSessionResult, InspectRunInput, InspectRunResult, StopSessionInput, McpServerConfig, AccumulatorEvent, AccumulatorListener, } from './internal/acp-client-interface.js';
|
|
28
|
+
export type { AgentRuntime } from './internal/agent-runtime-interface.js';
|
|
29
|
+
export { LocalACPClient } from './internal/local-acp-client.js';
|
|
30
|
+
export { AcpSdkAdapter, loadAgentRegistry, type AgentRegistryEntry, } from './internal/sdk-adapter.js';
|
|
31
|
+
export { SessionUpdateAccumulator } from './internal/session-accumulator.js';
|
|
32
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAG7C,YAAY,EACV,YAAY,EACZ,UAAU,EACV,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,MAAM,GACP,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,UAAU,GACX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAG5E,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,KAAK,cAAc,GACpB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,IAAI,GACV,MAAM,sBAAsB,CAAC;AAO9B,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,QAAQ,EACR,OAAO,GACR,MAAM,yBAAyB,CAAC;AAEjC,YAAY,EACV,SAAS,EACT,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,oCAAoC,CAAC;AAE5C,YAAY,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAE1E,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,KAAK,kBAAkB,GACxB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @coralai/claude-code-agent — Public API barrel.
|
|
3
|
+
*
|
|
4
|
+
* v0.1.0-alpha.0: ClaudeCodeAgent class + supporting types.
|
|
5
|
+
*
|
|
6
|
+
* Public API surface (stable from v0.1.0):
|
|
7
|
+
* - ClaudeCodeAgent class
|
|
8
|
+
* - PromptHandle / PromptResult / SessionUpdate
|
|
9
|
+
* - AgentError + 18 codes + isAgentError type guard
|
|
10
|
+
* - AgentOptions / AgentHooks / PermissionMode / PermissionRequest /
|
|
11
|
+
* PermissionDecision / UsageSummary / RuntimeCheck / Tracer
|
|
12
|
+
* - RecordingWriter / RecordingReplayer (for tests + dev tooling)
|
|
13
|
+
* - SpanManager (for advanced telemetry integration)
|
|
14
|
+
*
|
|
15
|
+
* Internal bridge re-exports (TEMPORARY — Step 1.5 removes once sps-cli
|
|
16
|
+
* switches to ClaudeCodeAgent class). sps-cli currently imports
|
|
17
|
+
* LocalACPClient / AcpSdkAdapter / etc. directly via this barrel.
|
|
18
|
+
*/
|
|
19
|
+
// ─── Public class ──────────────────────────────────────────────
|
|
20
|
+
export { ClaudeCodeAgent } from './agent.js';
|
|
21
|
+
export { aggregateResult } from './prompt-handle.js';
|
|
22
|
+
// ─── Errors ────────────────────────────────────────────────────
|
|
23
|
+
export { AgentError, isAgentError } from './errors.js';
|
|
24
|
+
// ─── Recording subsystem (test + dev tooling) ─────────────────
|
|
25
|
+
export { RecordingWriter, RecordingReplayer, } from './recording/index.js';
|
|
26
|
+
// ─── Telemetry (advanced integration) ──────────────────────────
|
|
27
|
+
export { SpanManager, SpanStatusCode, setAttributeSafe, truncateAttributeValue, } from './telemetry/index.js';
|
|
28
|
+
export { LocalACPClient } from './internal/local-acp-client.js';
|
|
29
|
+
export { AcpSdkAdapter, loadAgentRegistry, } from './internal/sdk-adapter.js';
|
|
30
|
+
export { SessionUpdateAccumulator } from './internal/session-accumulator.js';
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,kEAAkE;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAwB7C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,kEAAkE;AAClE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAuB,MAAM,aAAa,CAAC;AAE5E,iEAAiE;AACjE,OAAO,EACL,eAAe,EACf,iBAAiB,GAElB,MAAM,sBAAsB,CAAC;AAE9B,kEAAkE;AAClE,OAAO,EACL,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,sBAAsB,GAIvB,MAAM,sBAAsB,CAAC;AAmC9B,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EACL,aAAa,EACb,iBAAiB,GAElB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC"}
|