@coralai/sps-cli 0.25.2 → 0.26.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 (113) hide show
  1. package/README-CN.md +59 -9
  2. package/README.md +99 -67
  3. package/dist/commands/acpCommand.d.ts.map +1 -1
  4. package/dist/commands/acpCommand.js +2 -19
  5. package/dist/commands/acpCommand.js.map +1 -1
  6. package/dist/commands/doctor.d.ts.map +1 -1
  7. package/dist/commands/doctor.js +3 -13
  8. package/dist/commands/doctor.js.map +1 -1
  9. package/dist/commands/logs.d.ts.map +1 -1
  10. package/dist/commands/logs.js +58 -2
  11. package/dist/commands/logs.js.map +1 -1
  12. package/dist/commands/monitorTick.d.ts.map +1 -1
  13. package/dist/commands/monitorTick.js +2 -3
  14. package/dist/commands/monitorTick.js.map +1 -1
  15. package/dist/commands/reset.d.ts.map +1 -1
  16. package/dist/commands/reset.js +4 -0
  17. package/dist/commands/reset.js.map +1 -1
  18. package/dist/commands/tick.d.ts.map +1 -1
  19. package/dist/commands/tick.js +3 -4
  20. package/dist/commands/tick.js.map +1 -1
  21. package/dist/commands/workerDashboard.d.ts.map +1 -1
  22. package/dist/commands/workerDashboard.js +55 -95
  23. package/dist/commands/workerDashboard.js.map +1 -1
  24. package/dist/core/config.d.ts +8 -7
  25. package/dist/core/config.d.ts.map +1 -1
  26. package/dist/core/config.js +15 -7
  27. package/dist/core/config.js.map +1 -1
  28. package/dist/core/config.test.js +23 -5
  29. package/dist/core/config.test.js.map +1 -1
  30. package/dist/core/sessionLiveness.d.ts +0 -1
  31. package/dist/core/sessionLiveness.d.ts.map +1 -1
  32. package/dist/core/sessionLiveness.js +7 -15
  33. package/dist/core/sessionLiveness.js.map +1 -1
  34. package/dist/core/state.d.ts +4 -5
  35. package/dist/core/state.d.ts.map +1 -1
  36. package/dist/core/state.js +0 -1
  37. package/dist/core/state.js.map +1 -1
  38. package/dist/core/state.test.js +0 -1
  39. package/dist/core/state.test.js.map +1 -1
  40. package/dist/engines/CloseoutEngine.js +1 -1
  41. package/dist/engines/CloseoutEngine.js.map +1 -1
  42. package/dist/engines/ExecutionEngine.d.ts +1 -1
  43. package/dist/engines/ExecutionEngine.js +3 -3
  44. package/dist/engines/ExecutionEngine.js.map +1 -1
  45. package/dist/engines/MonitorEngine.d.ts +4 -7
  46. package/dist/engines/MonitorEngine.d.ts.map +1 -1
  47. package/dist/engines/MonitorEngine.js +10 -68
  48. package/dist/engines/MonitorEngine.js.map +1 -1
  49. package/dist/interfaces/ACPClient.d.ts +10 -0
  50. package/dist/interfaces/ACPClient.d.ts.map +1 -1
  51. package/dist/main.js +1 -1
  52. package/dist/main.js.map +1 -1
  53. package/dist/manager/completion-judge.d.ts.map +1 -1
  54. package/dist/manager/completion-judge.js +7 -0
  55. package/dist/manager/completion-judge.js.map +1 -1
  56. package/dist/manager/integration-queue.d.ts +1 -1
  57. package/dist/manager/integration-queue.d.ts.map +1 -1
  58. package/dist/manager/runtime-coordinator.js +1 -1
  59. package/dist/manager/runtime-coordinator.js.map +1 -1
  60. package/dist/manager/worker-manager-impl.d.ts +9 -1
  61. package/dist/manager/worker-manager-impl.d.ts.map +1 -1
  62. package/dist/manager/worker-manager-impl.js +74 -8
  63. package/dist/manager/worker-manager-impl.js.map +1 -1
  64. package/dist/manager/worker-manager.d.ts +4 -4
  65. package/dist/manager/worker-manager.d.ts.map +1 -1
  66. package/dist/providers/ACPWorkerRuntime.d.ts.map +1 -1
  67. package/dist/providers/ACPWorkerRuntime.js +5 -0
  68. package/dist/providers/ACPWorkerRuntime.js.map +1 -1
  69. package/dist/providers/LocalACPClient.d.ts +1 -2
  70. package/dist/providers/LocalACPClient.d.ts.map +1 -1
  71. package/dist/providers/LocalACPClient.js +7 -22
  72. package/dist/providers/LocalACPClient.js.map +1 -1
  73. package/dist/providers/adapters/AcpSdkAdapter.d.ts +14 -0
  74. package/dist/providers/adapters/AcpSdkAdapter.d.ts.map +1 -0
  75. package/dist/providers/adapters/AcpSdkAdapter.js +270 -0
  76. package/dist/providers/adapters/AcpSdkAdapter.js.map +1 -0
  77. package/dist/providers/adapters/acp-fs-handlers.d.ts +26 -0
  78. package/dist/providers/adapters/acp-fs-handlers.d.ts.map +1 -0
  79. package/dist/providers/adapters/acp-fs-handlers.js +52 -0
  80. package/dist/providers/adapters/acp-fs-handlers.js.map +1 -0
  81. package/dist/providers/adapters/acp-fs-handlers.test.d.ts +2 -0
  82. package/dist/providers/adapters/acp-fs-handlers.test.d.ts.map +1 -0
  83. package/dist/providers/adapters/acp-fs-handlers.test.js +65 -0
  84. package/dist/providers/adapters/acp-fs-handlers.test.js.map +1 -0
  85. package/dist/providers/adapters/acp-permissions.d.ts +35 -0
  86. package/dist/providers/adapters/acp-permissions.d.ts.map +1 -0
  87. package/dist/providers/adapters/acp-permissions.js +69 -0
  88. package/dist/providers/adapters/acp-permissions.js.map +1 -0
  89. package/dist/providers/adapters/acp-permissions.test.d.ts +2 -0
  90. package/dist/providers/adapters/acp-permissions.test.d.ts.map +1 -0
  91. package/dist/providers/adapters/acp-permissions.test.js +88 -0
  92. package/dist/providers/adapters/acp-permissions.test.js.map +1 -0
  93. package/dist/providers/adapters/acp-session-accumulator.d.ts +23 -0
  94. package/dist/providers/adapters/acp-session-accumulator.d.ts.map +1 -0
  95. package/dist/providers/adapters/acp-session-accumulator.js +99 -0
  96. package/dist/providers/adapters/acp-session-accumulator.js.map +1 -0
  97. package/dist/providers/adapters/acp-session-accumulator.test.d.ts +2 -0
  98. package/dist/providers/adapters/acp-session-accumulator.test.d.ts.map +1 -0
  99. package/dist/providers/adapters/acp-session-accumulator.test.js +73 -0
  100. package/dist/providers/adapters/acp-session-accumulator.test.js.map +1 -0
  101. package/dist/providers/adapters/acp-terminal-manager.d.ts +56 -0
  102. package/dist/providers/adapters/acp-terminal-manager.d.ts.map +1 -0
  103. package/dist/providers/adapters/acp-terminal-manager.js +118 -0
  104. package/dist/providers/adapters/acp-terminal-manager.js.map +1 -0
  105. package/dist/providers/adapters/acp-terminal-manager.test.d.ts +2 -0
  106. package/dist/providers/adapters/acp-terminal-manager.test.d.ts.map +1 -0
  107. package/dist/providers/adapters/acp-terminal-manager.test.js +71 -0
  108. package/dist/providers/adapters/acp-terminal-manager.test.js.map +1 -0
  109. package/dist/providers/registry.d.ts +0 -2
  110. package/dist/providers/registry.d.ts.map +1 -1
  111. package/dist/providers/registry.js +0 -26
  112. package/dist/providers/registry.js.map +1 -1
  113. package/package.json +4 -2
@@ -0,0 +1,270 @@
1
+ /**
2
+ * AcpSdkAdapter — Implements ACPClient using real ACP JSON-RPC over stdio.
3
+ *
4
+ * Replaces legacy adapters with
5
+ * structured protocol communication via @agentclientprotocol/sdk.
6
+ *
7
+ * Architecture (aligned with OpenClaw/acpx):
8
+ * AcpSdkAdapter → spawn ACP adapter child process → stdio pipe → JSON-RPC
9
+ * Claude: npx @agentclientprotocol/claude-agent-acp (Anthropic official SDK)
10
+ * Codex: npx @zed-industries/codex-acp (Rust native binary)
11
+ */
12
+ import { spawn } from 'node:child_process';
13
+ import { Readable, Writable } from 'node:stream';
14
+ import { ClientSideConnection, ndJsonStream } from '@agentclientprotocol/sdk';
15
+ import { SessionUpdateAccumulator } from './acp-session-accumulator.js';
16
+ import { resolvePermission } from './acp-permissions.js';
17
+ import { FileSystemHandlers } from './acp-fs-handlers.js';
18
+ import { TerminalManager } from './acp-terminal-manager.js';
19
+ const ACP_ADAPTER_REGISTRY = {
20
+ claude: { command: 'npx', args: ['-y', '@agentclientprotocol/claude-agent-acp'] },
21
+ codex: { command: 'npx', args: ['-y', '@zed-industries/codex-acp'] },
22
+ };
23
+ function isChildAlive(child) {
24
+ return child.exitCode == null && child.signalCode == null && !child.killed;
25
+ }
26
+ /** Cross-process PID liveness check (signal 0) */
27
+ function isPidAlive(pid) {
28
+ if (!pid)
29
+ return false;
30
+ try {
31
+ process.kill(pid, 0);
32
+ return true;
33
+ }
34
+ catch {
35
+ return false;
36
+ }
37
+ }
38
+ export class AcpSdkAdapter {
39
+ sessions = new Map();
40
+ defaultPermissionMode;
41
+ constructor(permissionMode) {
42
+ this.defaultPermissionMode =
43
+ permissionMode ?? process.env.ACP_PERMISSION_MODE ?? 'approve-all';
44
+ }
45
+ async ensureSession(input) {
46
+ const existing = this.sessions.get(input.sessionName);
47
+ if (existing && !input.resetExisting && isChildAlive(existing.child)) {
48
+ return {
49
+ sessionId: existing.sessionId,
50
+ sessionState: existing.activePromise ? 'busy' : 'ready',
51
+ paneText: existing.accumulator.getRecentText(),
52
+ lastSeenAt: new Date().toISOString(),
53
+ pid: existing.child.pid ?? null,
54
+ };
55
+ }
56
+ if (existing) {
57
+ await this.destroySession(existing);
58
+ this.sessions.delete(input.sessionName);
59
+ }
60
+ // Resolve adapter command
61
+ const registry = ACP_ADAPTER_REGISTRY[input.tool];
62
+ if (!registry)
63
+ throw new Error(`Unknown ACP tool: ${input.tool}`);
64
+ // Spawn ACP adapter child process
65
+ const child = spawn(registry.command, registry.args, {
66
+ cwd: input.cwd,
67
+ stdio: ['pipe', 'pipe', 'pipe'],
68
+ env: { ...process.env },
69
+ });
70
+ // Drain stderr (adapter debug output)
71
+ child.stderr?.on('data', () => { });
72
+ await new Promise((resolve, reject) => {
73
+ child.once('spawn', () => resolve());
74
+ child.once('error', (err) => reject(new Error(`Failed to spawn ${input.tool} ACP adapter: ${err.message}`)));
75
+ });
76
+ // Establish JSON-RPC connection over stdio
77
+ const stream = ndJsonStream(Writable.toWeb(child.stdin), Readable.toWeb(child.stdout));
78
+ const accumulator = new SessionUpdateAccumulator();
79
+ const permissionMode = this.defaultPermissionMode;
80
+ // Set up log file for sps logs compatibility
81
+ if (input.logsDir) {
82
+ const logFileName = `${input.sessionName}-acp-${Date.now()}.log`;
83
+ accumulator.setLogFile(`${input.logsDir}/${logFileName}`);
84
+ }
85
+ const fsHandlers = new FileSystemHandlers({ cwd: input.cwd, permissionMode });
86
+ const terminalMgr = new TerminalManager({ cwd: input.cwd, permissionMode });
87
+ const conn = new ClientSideConnection(() => ({
88
+ sessionUpdate: async (params) => {
89
+ accumulator.handleUpdate(params.update);
90
+ },
91
+ requestPermission: async (params) => {
92
+ accumulator.hasPendingPermission = true;
93
+ const result = resolvePermission(params, permissionMode);
94
+ accumulator.hasPendingPermission = false;
95
+ return result;
96
+ },
97
+ readTextFile: async (params) => {
98
+ return fsHandlers.readTextFile(params);
99
+ },
100
+ writeTextFile: async (params) => {
101
+ return fsHandlers.writeTextFile(params);
102
+ },
103
+ createTerminal: async (params) => {
104
+ return terminalMgr.createTerminal(params);
105
+ },
106
+ terminalOutput: async (params) => {
107
+ return terminalMgr.terminalOutput(params);
108
+ },
109
+ waitForTerminalExit: async (params) => {
110
+ return terminalMgr.waitForTerminalExit(params);
111
+ },
112
+ killTerminal: async (params) => {
113
+ return terminalMgr.killTerminal(params);
114
+ },
115
+ releaseTerminal: async (params) => {
116
+ return terminalMgr.releaseTerminal(params);
117
+ },
118
+ }), stream);
119
+ // Protocol initialization
120
+ const initResult = await conn.initialize({
121
+ protocolVersion: 1,
122
+ clientCapabilities: {
123
+ fs: { readTextFile: true, writeTextFile: true },
124
+ terminal: true,
125
+ },
126
+ });
127
+ // Create new session
128
+ const sessionResult = await conn.newSession({
129
+ cwd: input.cwd,
130
+ mcpServers: [],
131
+ });
132
+ const session = {
133
+ tool: input.tool,
134
+ sessionId: sessionResult.sessionId,
135
+ sessionName: input.sessionName,
136
+ cwd: input.cwd,
137
+ child,
138
+ conn,
139
+ accumulator,
140
+ activePromise: null,
141
+ permissionMode,
142
+ };
143
+ this.sessions.set(input.sessionName, session);
144
+ return {
145
+ sessionId: sessionResult.sessionId,
146
+ sessionState: 'ready',
147
+ paneText: '',
148
+ lastSeenAt: new Date().toISOString(),
149
+ pid: child.pid ?? null,
150
+ };
151
+ }
152
+ async startRun(input) {
153
+ const session = this.sessions.get(input.sessionName);
154
+ if (!session)
155
+ throw new Error(`ACP session not found: ${input.sessionName}`);
156
+ if (session.activePromise)
157
+ throw new Error(`Session ${input.sessionName} already has active run`);
158
+ session.accumulator.reset();
159
+ // Non-blocking prompt — store promise but don't await
160
+ session.activePromise = session.conn.prompt({
161
+ sessionId: session.sessionId,
162
+ prompt: [{ type: 'text', text: input.prompt }],
163
+ });
164
+ session.activePromise
165
+ .then((result) => {
166
+ session.accumulator.stopReason = result.stopReason ?? 'end_turn';
167
+ session.activePromise = null;
168
+ })
169
+ .catch(() => {
170
+ session.accumulator.stopReason = 'failed';
171
+ session.activePromise = null;
172
+ });
173
+ return {
174
+ runId: `acp-${Date.now()}`,
175
+ runState: 'running',
176
+ paneText: '',
177
+ lastSeenAt: new Date().toISOString(),
178
+ pid: session.child.pid ?? null,
179
+ };
180
+ }
181
+ async inspectSession(input) {
182
+ const session = this.sessions.get(input.sessionName);
183
+ // In-process session: direct check
184
+ if (session && isChildAlive(session.child)) {
185
+ return {
186
+ sessionState: session.activePromise ? 'busy' : 'ready',
187
+ paneText: session.accumulator.getRecentText(),
188
+ lastSeenAt: new Date().toISOString(),
189
+ };
190
+ }
191
+ // Cross-process fallback: check persisted PID liveness
192
+ if (input.pid && isPidAlive(input.pid)) {
193
+ return {
194
+ sessionState: 'busy', // PID alive but not our process — assume busy
195
+ paneText: '',
196
+ lastSeenAt: new Date().toISOString(),
197
+ };
198
+ }
199
+ return { sessionState: 'offline', paneText: '', lastSeenAt: new Date().toISOString() };
200
+ }
201
+ async inspectRun(input) {
202
+ if (!input.activeRun) {
203
+ return { runState: null, paneText: '', lastSeenAt: new Date().toISOString() };
204
+ }
205
+ const session = this.sessions.get(input.sessionName);
206
+ // In-process session: detailed status from accumulator
207
+ if (session && isChildAlive(session.child)) {
208
+ // (handled below)
209
+ }
210
+ else if (input.pid && isPidAlive(input.pid)) {
211
+ // Cross-process fallback: PID alive = running
212
+ return { runState: 'running', paneText: '', lastSeenAt: new Date().toISOString() };
213
+ }
214
+ else {
215
+ return { runState: 'lost', paneText: '', lastSeenAt: new Date().toISOString() };
216
+ }
217
+ const acc = session.accumulator;
218
+ let runState;
219
+ if (!session.activePromise) {
220
+ // Prompt has returned
221
+ runState = acc.stopReason === 'end_turn' ? 'completed'
222
+ : acc.stopReason === 'cancelled' ? 'cancelled'
223
+ : 'failed';
224
+ }
225
+ else if (acc.hasPendingPermission) {
226
+ runState = 'needs_confirmation';
227
+ }
228
+ else {
229
+ runState = 'running';
230
+ }
231
+ return {
232
+ runState,
233
+ paneText: acc.getRecentText(),
234
+ lastSeenAt: new Date().toISOString(),
235
+ };
236
+ }
237
+ async stopSession(input) {
238
+ const session = this.sessions.get(input.sessionName);
239
+ if (!session)
240
+ return;
241
+ if (session.activePromise) {
242
+ try {
243
+ await session.conn.cancel({ sessionId: session.sessionId });
244
+ }
245
+ catch { /* Agent may already be dead */ }
246
+ }
247
+ await this.destroySession(session);
248
+ this.sessions.delete(input.sessionName);
249
+ }
250
+ async destroySession(session) {
251
+ try {
252
+ session.child.kill('SIGTERM');
253
+ }
254
+ catch { /* noop */ }
255
+ await new Promise((resolve) => {
256
+ const timeout = setTimeout(() => {
257
+ try {
258
+ session.child.kill('SIGKILL');
259
+ }
260
+ catch { /* noop */ }
261
+ resolve();
262
+ }, 3_000);
263
+ session.child.once('exit', () => {
264
+ clearTimeout(timeout);
265
+ resolve();
266
+ });
267
+ });
268
+ }
269
+ }
270
+ //# sourceMappingURL=AcpSdkAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AcpSdkAdapter.js","sourceRoot":"","sources":["../../../src/providers/adapters/AcpSdkAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { PermissionMode } from './acp-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=acp-fs-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp-fs-handlers.d.ts","sourceRoot":"","sources":["../../../src/providers/adapters/acp-fs-handlers.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * ACP File System Handlers — aligned with OpenClaw/acpx FileSystemHandlers
3
+ *
4
+ * Handles fs/read_text_file and fs/write_text_file ACP Client callbacks.
5
+ * Enforces cwd sandbox and supports line-range slicing.
6
+ */
7
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
8
+ import path from 'node:path';
9
+ export class FileSystemHandlers {
10
+ rootDir;
11
+ permissionMode;
12
+ constructor(opts) {
13
+ this.rootDir = path.resolve(opts.cwd);
14
+ this.permissionMode = opts.permissionMode;
15
+ }
16
+ async readTextFile(params) {
17
+ if (this.permissionMode === 'deny-all') {
18
+ throw new Error('Permission denied for fs/read_text_file (deny-all)');
19
+ }
20
+ const filePath = this.resolvePathWithinRoot(params.path);
21
+ const content = await readFile(filePath, 'utf-8');
22
+ return { content: this.sliceContent(content, params.line, params.limit) };
23
+ }
24
+ async writeTextFile(params) {
25
+ if (this.permissionMode === 'deny-all') {
26
+ throw new Error('Permission denied for fs/write_text_file (deny-all)');
27
+ }
28
+ const filePath = this.resolvePathWithinRoot(params.path);
29
+ await mkdir(path.dirname(filePath), { recursive: true });
30
+ await writeFile(filePath, params.content, 'utf-8');
31
+ return {};
32
+ }
33
+ resolvePathWithinRoot(rawPath) {
34
+ if (!path.isAbsolute(rawPath)) {
35
+ throw new Error(`Path must be absolute: ${rawPath}`);
36
+ }
37
+ const resolved = path.resolve(rawPath);
38
+ if (resolved !== this.rootDir && !resolved.startsWith(this.rootDir + path.sep)) {
39
+ throw new Error(`Path outside allowed cwd subtree: ${resolved}`);
40
+ }
41
+ return resolved;
42
+ }
43
+ sliceContent(content, line, limit) {
44
+ if (line == null && limit == null)
45
+ return content;
46
+ const lines = content.split('\n');
47
+ const startIndex = Math.max(0, (line ?? 1) - 1);
48
+ const endIndex = limit == null ? lines.length : Math.min(lines.length, startIndex + limit);
49
+ return lines.slice(startIndex, endIndex).join('\n');
50
+ }
51
+ }
52
+ //# sourceMappingURL=acp-fs-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp-fs-handlers.js","sourceRoot":"","sources":["../../../src/providers/adapters/acp-fs-handlers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=acp-fs-handlers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp-fs-handlers.test.d.ts","sourceRoot":"","sources":["../../../src/providers/adapters/acp-fs-handlers.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,65 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { mkdirSync, writeFileSync, rmSync, readFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { FileSystemHandlers } from './acp-fs-handlers.js';
5
+ const TEST_DIR = '/tmp/sps-acp-fs-test';
6
+ beforeEach(() => {
7
+ mkdirSync(TEST_DIR, { recursive: true });
8
+ writeFileSync(join(TEST_DIR, 'hello.txt'), 'line1\nline2\nline3\nline4\nline5\n');
9
+ });
10
+ afterEach(() => {
11
+ rmSync(TEST_DIR, { recursive: true, force: true });
12
+ });
13
+ describe('FileSystemHandlers', () => {
14
+ describe('readTextFile', () => {
15
+ it('reads entire file', async () => {
16
+ const fs = new FileSystemHandlers({ cwd: TEST_DIR, permissionMode: 'approve-all' });
17
+ const result = await fs.readTextFile({ path: join(TEST_DIR, 'hello.txt') });
18
+ expect(result.content).toBe('line1\nline2\nline3\nline4\nline5\n');
19
+ });
20
+ it('slices by line and limit', async () => {
21
+ const fs = new FileSystemHandlers({ cwd: TEST_DIR, permissionMode: 'approve-all' });
22
+ const result = await fs.readTextFile({ path: join(TEST_DIR, 'hello.txt'), line: 2, limit: 2 });
23
+ expect(result.content).toBe('line2\nline3');
24
+ });
25
+ it('slices from line without limit', async () => {
26
+ const fs = new FileSystemHandlers({ cwd: TEST_DIR, permissionMode: 'approve-all' });
27
+ const result = await fs.readTextFile({ path: join(TEST_DIR, 'hello.txt'), line: 4 });
28
+ expect(result.content).toBe('line4\nline5\n');
29
+ });
30
+ it('rejects path outside cwd', async () => {
31
+ const fs = new FileSystemHandlers({ cwd: TEST_DIR, permissionMode: 'approve-all' });
32
+ await expect(fs.readTextFile({ path: '/etc/passwd' })).rejects.toThrow('outside');
33
+ });
34
+ it('rejects relative path', async () => {
35
+ const fs = new FileSystemHandlers({ cwd: TEST_DIR, permissionMode: 'approve-all' });
36
+ await expect(fs.readTextFile({ path: 'hello.txt' })).rejects.toThrow('absolute');
37
+ });
38
+ it('denies in deny-all mode', async () => {
39
+ const fs = new FileSystemHandlers({ cwd: TEST_DIR, permissionMode: 'deny-all' });
40
+ await expect(fs.readTextFile({ path: join(TEST_DIR, 'hello.txt') })).rejects.toThrow('denied');
41
+ });
42
+ });
43
+ describe('writeTextFile', () => {
44
+ it('writes file', async () => {
45
+ const fs = new FileSystemHandlers({ cwd: TEST_DIR, permissionMode: 'approve-all' });
46
+ await fs.writeTextFile({ path: join(TEST_DIR, 'out.txt'), content: 'hello' });
47
+ expect(readFileSync(join(TEST_DIR, 'out.txt'), 'utf-8')).toBe('hello');
48
+ });
49
+ it('creates parent directories', async () => {
50
+ const fs = new FileSystemHandlers({ cwd: TEST_DIR, permissionMode: 'approve-all' });
51
+ const nested = join(TEST_DIR, 'sub', 'dir', 'file.txt');
52
+ await fs.writeTextFile({ path: nested, content: 'nested' });
53
+ expect(readFileSync(nested, 'utf-8')).toBe('nested');
54
+ });
55
+ it('rejects path outside cwd', async () => {
56
+ const fs = new FileSystemHandlers({ cwd: TEST_DIR, permissionMode: 'approve-all' });
57
+ await expect(fs.writeTextFile({ path: '/tmp/outside.txt', content: 'x' })).rejects.toThrow('outside');
58
+ });
59
+ it('denies in deny-all mode', async () => {
60
+ const fs = new FileSystemHandlers({ cwd: TEST_DIR, permissionMode: 'deny-all' });
61
+ await expect(fs.writeTextFile({ path: join(TEST_DIR, 'x.txt'), content: 'x' })).rejects.toThrow('denied');
62
+ });
63
+ });
64
+ });
65
+ //# sourceMappingURL=acp-fs-handlers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp-fs-handlers.test.js","sourceRoot":"","sources":["../../../src/providers/adapters/acp-fs-handlers.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * ACP Permission Resolver — aligned with OpenClaw/acpx permissions.ts
3
+ *
4
+ * 3-layer decision chain:
5
+ * 1. Global policy (approve-all / deny-all)
6
+ * 2. Kind classification (approve-reads auto-approves read/search)
7
+ * 3. Unattended fallback (SPS auto-approves everything — no TTY)
8
+ */
9
+ export type PermissionMode = 'approve-all' | 'approve-reads' | 'deny-all';
10
+ interface PermissionParams {
11
+ toolCall: {
12
+ toolCallId?: string;
13
+ title?: string;
14
+ kind?: string;
15
+ status?: string;
16
+ };
17
+ options: ReadonlyArray<{
18
+ optionId: string;
19
+ kind: string;
20
+ name?: string;
21
+ }>;
22
+ }
23
+ interface PermissionResponse {
24
+ outcome: {
25
+ outcome: 'selected';
26
+ optionId: string;
27
+ } | {
28
+ outcome: 'cancelled';
29
+ };
30
+ }
31
+ /** Infer tool kind from toolCall.kind or title keywords (aligned with acpx). */
32
+ export declare function inferToolKind(params: Pick<PermissionParams, 'toolCall'>): string | undefined;
33
+ export declare function resolvePermission(params: PermissionParams, mode: PermissionMode): PermissionResponse;
34
+ export {};
35
+ //# sourceMappingURL=acp-permissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp-permissions.d.ts","sourceRoot":"","sources":["../../../src/providers/adapters/acp-permissions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;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,CA4BpG"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * ACP Permission Resolver — aligned with OpenClaw/acpx permissions.ts
3
+ *
4
+ * 3-layer decision chain:
5
+ * 1. Global policy (approve-all / deny-all)
6
+ * 2. Kind classification (approve-reads auto-approves read/search)
7
+ * 3. Unattended fallback (SPS auto-approves everything — no TTY)
8
+ */
9
+ function pickOption(options, kinds) {
10
+ for (const kind of kinds) {
11
+ const match = options.find((o) => o.kind === kind);
12
+ if (match)
13
+ return match;
14
+ }
15
+ return undefined;
16
+ }
17
+ /** Infer tool kind from toolCall.kind or title keywords (aligned with acpx). */
18
+ export function inferToolKind(params) {
19
+ if (params.toolCall.kind)
20
+ return params.toolCall.kind;
21
+ const title = params.toolCall.title?.trim().toLowerCase() ?? '';
22
+ const head = title.split(':', 1)[0]?.trim() ?? '';
23
+ if (!head)
24
+ return undefined;
25
+ if (head.includes('read') || head.includes('cat'))
26
+ return 'read';
27
+ if (head.includes('search') || head.includes('find') || head.includes('grep'))
28
+ return 'search';
29
+ if (head.includes('write') || head.includes('edit') || head.includes('patch'))
30
+ return 'edit';
31
+ if (head.includes('delete') || head.includes('remove'))
32
+ return 'delete';
33
+ if (head.includes('move') || head.includes('rename'))
34
+ return 'move';
35
+ if (head.includes('run') || head.includes('execute') || head.includes('bash'))
36
+ return 'execute';
37
+ if (head.includes('fetch') || head.includes('http') || head.includes('url'))
38
+ return 'fetch';
39
+ if (head.includes('think'))
40
+ return 'think';
41
+ return 'other';
42
+ }
43
+ export function resolvePermission(params, mode) {
44
+ const { options } = params;
45
+ if (options.length === 0)
46
+ return { outcome: { outcome: 'cancelled' } };
47
+ const allowOption = pickOption(options, ['allow_once', 'allow_always']);
48
+ const rejectOption = pickOption(options, ['reject_once', 'reject_always']);
49
+ // Layer 1: global policy
50
+ if (mode === 'approve-all') {
51
+ return { outcome: { outcome: 'selected', optionId: allowOption?.optionId ?? options[0].optionId } };
52
+ }
53
+ if (mode === 'deny-all') {
54
+ return rejectOption
55
+ ? { outcome: { outcome: 'selected', optionId: rejectOption.optionId } }
56
+ : { outcome: { outcome: 'cancelled' } };
57
+ }
58
+ // Layer 2: approve-reads — auto-approve read/search kinds
59
+ const kind = inferToolKind(params);
60
+ if ((kind === 'read' || kind === 'search') && allowOption) {
61
+ return { outcome: { outcome: 'selected', optionId: allowOption.optionId } };
62
+ }
63
+ // Layer 3: SPS is unattended — auto-approve (no TTY interaction)
64
+ if (allowOption) {
65
+ return { outcome: { outcome: 'selected', optionId: allowOption.optionId } };
66
+ }
67
+ return { outcome: { outcome: 'cancelled' } };
68
+ }
69
+ //# sourceMappingURL=acp-permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp-permissions.js","sourceRoot":"","sources":["../../../src/providers/adapters/acp-permissions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAwBH,SAAS,UAAU,CACjB,OAAoC,EACpC,KAAwB;IAExB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACnD,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,aAAa,CAAC,MAA0C;IACtE,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;IACtD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;IAChE,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAClD,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IACjE,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC/F,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,MAAM,CAAC;IAC7F,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IACxE,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,MAAM,CAAC;IACpE,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAChG,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAC5F,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAC3C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAwB,EAAE,IAAoB;IAC9E,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAC3B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC;IAEvE,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC;IACxE,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC,CAAC;IAE3E,yBAAyB;IACzB,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QAC3B,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;IACtG,CAAC;IACD,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,OAAO,YAAY;YACjB,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE,EAAE;YACvE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC;IAC5C,CAAC;IAED,0DAA0D;IAC1D,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,QAAQ,CAAC,IAAI,WAAW,EAAE,CAAC;QAC1D,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAAE,EAAE,CAAC;IAC9E,CAAC;IAED,iEAAiE;IACjE,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAAE,EAAE,CAAC;IAC9E,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=acp-permissions.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp-permissions.test.d.ts","sourceRoot":"","sources":["../../../src/providers/adapters/acp-permissions.test.ts"],"names":[],"mappings":""}