@shardflux/cli 0.13.6 → 0.14.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.
Files changed (58) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +40 -4
  3. package/dist/acp-catalog.d.ts +152 -0
  4. package/dist/acp-catalog.js +287 -0
  5. package/dist/acp-journal.d.ts +18 -0
  6. package/dist/acp-journal.js +232 -0
  7. package/dist/acp-rpc.d.ts +41 -0
  8. package/dist/acp-rpc.js +115 -0
  9. package/dist/acp.d.ts +27 -0
  10. package/dist/acp.js +290 -0
  11. package/dist/agent-commands.d.ts +10 -2
  12. package/dist/agent-commands.js +37 -18
  13. package/dist/agent-machine.d.ts +6 -0
  14. package/dist/agent-machine.js +93 -0
  15. package/dist/agent-repository.js +1 -1
  16. package/dist/agent-state.d.ts +3 -0
  17. package/dist/agent-state.js +33 -12
  18. package/dist/agent-target-commands.d.ts +4 -1
  19. package/dist/agent-target-commands.js +64 -22
  20. package/dist/agent-targets.d.ts +6 -4
  21. package/dist/agent-targets.js +72 -31
  22. package/dist/args.d.ts +1 -1
  23. package/dist/args.js +53 -14
  24. package/dist/command-center-actions.js +26 -3
  25. package/dist/command-center.js +20 -4
  26. package/dist/conversation-commands.d.ts +3 -0
  27. package/dist/conversation-commands.js +36 -0
  28. package/dist/conversation-local-resume.d.ts +8 -0
  29. package/dist/conversation-local-resume.js +56 -0
  30. package/dist/conversation-local.d.ts +7 -0
  31. package/dist/conversation-local.js +61 -0
  32. package/dist/conversation-router.d.ts +12 -0
  33. package/dist/conversation-router.js +89 -0
  34. package/dist/conversation-stash.d.ts +11 -0
  35. package/dist/conversation-stash.js +158 -0
  36. package/dist/conversation-terminal.d.ts +3 -0
  37. package/dist/conversation-terminal.js +74 -0
  38. package/dist/conversation-worktree.d.ts +4 -0
  39. package/dist/conversation-worktree.js +22 -0
  40. package/dist/conversations.d.ts +53 -0
  41. package/dist/conversations.js +118 -0
  42. package/dist/device-bridge.d.ts +80 -0
  43. package/dist/device-bridge.js +398 -0
  44. package/dist/device-helper.d.ts +3 -0
  45. package/dist/device-helper.js +104 -0
  46. package/dist/errors.js +5 -0
  47. package/dist/format.js +3 -2
  48. package/dist/handlers.js +3 -1
  49. package/dist/main.js +15 -3
  50. package/dist/project-sync.d.ts +5 -1
  51. package/dist/project-sync.js +7 -6
  52. package/dist/t3-provider.d.ts +6 -0
  53. package/dist/t3-provider.js +99 -0
  54. package/dist/t3-runtime.d.ts +6 -0
  55. package/dist/t3-runtime.js +63 -0
  56. package/dist/target-lock.d.ts +3 -0
  57. package/dist/target-lock.js +143 -0
  58. package/package.json +3 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,33 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.14.0
4
+
5
+ - Parallel conversation launches preserve both sessions in local history.
6
+
7
+ - Help an agent can set up cloud agents from: `shard --help` has a Cloud agents section (conversations, machine, template, agents) and says how a VM is made (the coding template, then your machine, then the project template), that machine and project templates are saved from an agent's VM, that `shard templates` is for your own app's workspaces (a repository bound to one is refused with `template_not_agent_capable`), and that Claude Code and Codex in the VM have the `shardflux-computer` tools. `shard machine`, `shard template` and `shard templates init|build|draft open` help say the same.
8
+ - Register one desktop app connection per project, named Shardflux · <project>; preserve older SSH aliases and CLI 0.13.x target manifests.
9
+ - Resume saved conversations in a fresh VM under the same identity; open a read-only project-space reader for final branches and transcripts.
10
+ - Conversation follow-up: read-only reviewer joins, Try locally device requests, and project usage with workspace-scoped guest resize.
11
+
12
+ - **Breaking:** `shard ./` starts a conversation in its own VM and opens Claude Code or Codex directly. `--resume` selects a saved project conversation. Two-way sync is now opened with `shard conversations try <name>` in an isolated local worktree.
13
+ - Register one Shardflux provider in T3 Code silently, with Claude Code and Codex models. ACP sessions attach to guest supervision and replay missed updates after reconnect.
14
+ - Run device tools through the Mac helper with local approvals and project grants; mirror transcripts into the Shardflux stash and hand ended sessions to native history after fetching their branch.
15
+ - Volume lists and details show `kind`; project-space quota is labelled platform managed. Includes SDK 0.19.0.
16
+ - Add project conversations with durable VM bindings, messages, moves, landing records and device requests.
17
+
18
+ - Local connections to the target-update lock cannot keep its owner running after release.
19
+
20
+ - `ssh-proxy` closes its guest forwarder on EOF, signals and transport failure, reuses the cached helper, and waits for target updates with automatic recovery of dead PID owners.
21
+ - `ssh-proxy` finishes when the guest closes its output, including sshd's pre-authentication admission refusals, so OpenSSH receives EOF and reconnects without hanging.
22
+
23
+ - Fork externally started desktop/SDK agent workspaces as full-state copies without a managed PTY receipt; give copied T3 workspaces their own identity even when an older platform's PTY repair fails.
24
+ - The managed `~/.ssh/config` Include line is written unquoted when the path needs no quotes, so tools that list SSH hosts from it (T3 Code) find Shardflux hosts.
25
+ - Open cloud projects in T3 Code with `shard agents open t3 <key>`, prewarm its matching server in the background, name environments `Shardflux · <project>`, and give forked agents a separate T3 identity.
26
+ - `shard ssh-proxy` sends a prewake hint and uses a passive tunnel so open desktop SSH connections join the existing parking lifecycle.
27
+ - `shard ssh-proxy` connects to a workspace whose host has no passive attach as an ordinary SSH connection.
28
+ - `shard` exits quietly when the reader has closed its output (OpenSSH after a `ssh-proxy` session, `| head`), instead of printing a write error.
29
+ - An error with several causes (tunnel teardown, cleanup) names each cause, and its first cause decides the error code.
30
+
3
31
  ## 0.13.6
4
32
 
5
33
  - `shard` makes the macOS menu bar app's executable runnable when it installs or starts the app, so a menu bar copied
package/README.md CHANGED
@@ -52,7 +52,7 @@ Use `shard` for your projects, machine, templates and account.
52
52
 
53
53
  ## Quick start
54
54
 
55
- Start your coding agent on a local project (0.13.2+):
55
+ Start a conversation on a local project (0.14.0+):
56
56
 
57
57
  ```sh
58
58
  shard setup
@@ -61,10 +61,24 @@ shard ./
61
61
  ```
62
62
 
63
63
  Choose Claude Code or Codex. Claude asks for one cloud sign-in per Shardflux account; Codex uses your copied login.
64
- The agent is usable immediately while setup prepares the project in the background. `shard` opens the command
65
- center for every project; `shard ./` returns to this project. On macOS the menu bar starts automatically the first
64
+ Each `shard ./` starts its own conversation VM and opens your agent’s native terminal. Later turns stay in that
65
+ VM; `shard ./ --resume` selects a saved project conversation. You can open conversations in separate terminals at the same time; each stays in the project's local history. `shard` opens the optional command center. On macOS the menu bar starts automatically the first
66
66
  time `shard` runs, with launch at login enabled; `shard menubar stop` turns it off. See [Cloud agents](https://docs.shardflux.dev/guides/cloud-agents).
67
67
 
68
+ T3 Code uses one **Shardflux** provider; choose a Claude Code or Codex model to start that agent in the cloud.
69
+ The provider is registered automatically when T3 Code is installed. Use a T3 build that supports ACP providers.
70
+
71
+ To try a conversation on your Mac:
72
+
73
+ ```sh
74
+ shard conversations try <conversation>
75
+ ```
76
+
77
+ Your branch opens in `.shard/worktrees/<name>`, syncs both ways, and its dev servers appear at localhost.
78
+ Ctrl-C stops local sync. Your main checkout stays available for your own work.
79
+ Device tools ask Allow once or Always for this project on your Mac. Live transcripts stay in
80
+ `~/.config/shardflux/conversations/`; ended sessions enter Claude Code’s or Codex’s native history.
81
+
68
82
  For application workspace commands, `shard signup` creates an account and saves a project key, or set
69
83
  `SHARDFLUX_API_KEY` to a key from the console and run `shard login`. `shard --help` lists every command.
70
84
 
@@ -1163,4 +1177,26 @@ Remembered credentials: stored encrypted with AWS KMS and filled straight into t
1163
1177
  [Machine and template](https://docs.shardflux.dev/guides/machine-and-template) ·
1164
1178
  [Credentials](https://docs.shardflux.dev/guides/credentials)
1165
1179
 
1166
- `shard templates` remains the platform template build and management group.
1180
+ A VM is the `coding` template, then your machine, then the project template. Machine and project templates are
1181
+ always saved from an agent's VM, so they keep Claude Code, Codex and the agent runtime. `shard templates` builds
1182
+ templates for your own app's workspaces (SDK/API), not for cloud agents: a repository bound to one of those is
1183
+ refused with `template_not_agent_capable` (0.14.0+).
1184
+
1185
+ Inside the VM, Claude Code and Codex have Shardflux computer use next to their own tools (0.14.0+, `coding` 13+): the
1186
+ `shardflux-computer` MCP server's `computer` and `computer_batch` drive the VM's desktop. The agent starts a program
1187
+ on it with `DISPLAY=:1`, for example `DISPLAY=:1 chromium http://localhost:3000 &`, then takes a screenshot.
1188
+
1189
+ Volume lists and details (0.14.0+) show `kind`. Project spaces show their measured storage and a platform-managed quota.
1190
+
1191
+ ## Conversations
1192
+
1193
+ From 0.14.0, `shard conversations list|get|send|wait|land|move` manages project conversations. `shard c` is the short form. Conversations retain their branch and transcript as their VM binding changes.
1194
+
1195
+
1196
+ Desktop project connections (0.14.0+): `shard agents open codex-app <project>/<workspace>` and
1197
+ `shard agents open claude-desktop <project>/<workspace>` register **Shardflux · <project>** in the app.
1198
+ Open that project connection to start conversations and return to their saved threads.
1199
+
1200
+ Conversation JSON includes `join_mode` and the worktree used by reviewers and workers.
1201
+
1202
+ `shard conversations resume <id>` continues a saved conversation in a fresh VM under the same identity (0.14.0+). `shard ./ --resume` uses this same path. `shard conversations reader <project-id>` opens a small read-only workspace for saved branches and transcripts; the Mac transcript mirror opens it automatically when no project VM is live. Adaptive idle reclaims the reader.
@@ -0,0 +1,152 @@
1
+ export declare const ACP_CATALOG: {
2
+ claude: {
3
+ initialize: {
4
+ protocolVersion: number;
5
+ agentCapabilities: {
6
+ _meta: {
7
+ claudeCode: {
8
+ promptQueueing: boolean;
9
+ };
10
+ authStatus: {};
11
+ };
12
+ promptCapabilities: {
13
+ image: boolean;
14
+ embeddedContext: boolean;
15
+ };
16
+ mcpCapabilities: {
17
+ http: boolean;
18
+ sse: boolean;
19
+ };
20
+ auth: {
21
+ logout: {};
22
+ };
23
+ providers: {};
24
+ loadSession: boolean;
25
+ sessionCapabilities: {
26
+ additionalDirectories: {};
27
+ close: {};
28
+ delete: {};
29
+ fork: {};
30
+ list: {};
31
+ resume: {};
32
+ subagents: {};
33
+ };
34
+ };
35
+ agentInfo: {
36
+ name: string;
37
+ title: string;
38
+ version: string;
39
+ };
40
+ authMethods: never[];
41
+ _meta: {
42
+ steering: {
43
+ supported: boolean;
44
+ };
45
+ };
46
+ };
47
+ session: {
48
+ modes: {
49
+ currentModeId: string;
50
+ availableModes: {
51
+ id: string;
52
+ name: string;
53
+ description: string;
54
+ }[];
55
+ };
56
+ configOptions: {
57
+ id: string;
58
+ name: string;
59
+ description: string;
60
+ category: string;
61
+ type: string;
62
+ currentValue: string;
63
+ options: {
64
+ value: string;
65
+ name: string;
66
+ description: string;
67
+ }[];
68
+ }[];
69
+ };
70
+ };
71
+ codex: {
72
+ initialize: {
73
+ protocolVersion: number;
74
+ agentInfo: {
75
+ name: string;
76
+ title: string;
77
+ version: string;
78
+ };
79
+ agentCapabilities: {
80
+ auth: {
81
+ logout: {};
82
+ };
83
+ providers: {};
84
+ loadSession: boolean;
85
+ promptCapabilities: {
86
+ embeddedContext: boolean;
87
+ image: boolean;
88
+ };
89
+ sessionCapabilities: {
90
+ resume: {};
91
+ list: {};
92
+ close: {};
93
+ delete: {};
94
+ fork: {};
95
+ additionalDirectories: {};
96
+ subagents: {};
97
+ };
98
+ mcpCapabilities: {
99
+ acp: boolean;
100
+ http: boolean;
101
+ sse: boolean;
102
+ };
103
+ _meta: {
104
+ authStatus: {};
105
+ };
106
+ };
107
+ authMethods: ({
108
+ id: string;
109
+ name: string;
110
+ description: string;
111
+ _meta: {
112
+ "api-key": {
113
+ provider: string;
114
+ };
115
+ };
116
+ } | {
117
+ id: string;
118
+ name: string;
119
+ description: string;
120
+ _meta?: undefined;
121
+ })[];
122
+ _meta: {
123
+ steering: {
124
+ supported: boolean;
125
+ };
126
+ };
127
+ };
128
+ session: {
129
+ modes: {
130
+ availableModes: {
131
+ id: string;
132
+ name: string;
133
+ description: string;
134
+ }[];
135
+ currentModeId: string;
136
+ };
137
+ configOptions: {
138
+ id: string;
139
+ name: string;
140
+ description: string;
141
+ category: string;
142
+ type: string;
143
+ currentValue: string;
144
+ options: {
145
+ value: string;
146
+ name: string;
147
+ description: string;
148
+ }[];
149
+ }[];
150
+ };
151
+ };
152
+ };
@@ -0,0 +1,287 @@
1
+ // Captured from the pinned adapters; refreshed when their versions change.
2
+ export const ACP_CATALOG = {
3
+ "claude": {
4
+ "initialize": {
5
+ "protocolVersion": 1,
6
+ "agentCapabilities": {
7
+ "_meta": {
8
+ "claudeCode": {
9
+ "promptQueueing": true
10
+ },
11
+ "authStatus": {}
12
+ },
13
+ "promptCapabilities": {
14
+ "image": true,
15
+ "embeddedContext": true
16
+ },
17
+ "mcpCapabilities": {
18
+ "http": true,
19
+ "sse": true
20
+ },
21
+ "auth": {
22
+ "logout": {}
23
+ },
24
+ "providers": {},
25
+ "loadSession": true,
26
+ "sessionCapabilities": {
27
+ "additionalDirectories": {},
28
+ "close": {},
29
+ "delete": {},
30
+ "fork": {},
31
+ "list": {},
32
+ "resume": {},
33
+ "subagents": {}
34
+ }
35
+ },
36
+ "agentInfo": {
37
+ "name": "@agentclientprotocol/claude-agent-acp",
38
+ "title": "Claude Agent",
39
+ "version": "0.87.0"
40
+ },
41
+ "authMethods": [],
42
+ "_meta": {
43
+ "steering": {
44
+ "supported": true
45
+ }
46
+ }
47
+ },
48
+ "session": {
49
+ "modes": {
50
+ "currentModeId": "auto",
51
+ "availableModes": [
52
+ {
53
+ "id": "default",
54
+ "name": "Manual",
55
+ "description": "Always ask before making changes"
56
+ },
57
+ {
58
+ "id": "acceptEdits",
59
+ "name": "Accept edits",
60
+ "description": "Automatically accept all file edits"
61
+ },
62
+ {
63
+ "id": "plan",
64
+ "name": "Plan",
65
+ "description": "Create a plan before making changes"
66
+ },
67
+ {
68
+ "id": "auto",
69
+ "name": "Auto",
70
+ "description": "Claude handles permission decisions"
71
+ },
72
+ {
73
+ "id": "bypassPermissions",
74
+ "name": "Bypass permissions",
75
+ "description": "Accepts all permissions"
76
+ }
77
+ ]
78
+ },
79
+ "configOptions": [
80
+ {
81
+ "id": "model",
82
+ "name": "Model",
83
+ "description": "AI model to use",
84
+ "category": "model",
85
+ "type": "select",
86
+ "currentValue": "opus",
87
+ "options": [
88
+ {
89
+ "value": "default",
90
+ "name": "Default (recommended)",
91
+ "description": "Opus 5.5"
92
+ },
93
+ {
94
+ "value": "opus",
95
+ "name": "Opus 5.5",
96
+ "description": "Best for everyday, complex tasks"
97
+ },
98
+ {
99
+ "value": "fable",
100
+ "name": "Fable 5.1",
101
+ "description": "Most capable for your hardest and longest-running tasks"
102
+ },
103
+ {
104
+ "value": "sonnet",
105
+ "name": "Sonnet 5.5",
106
+ "description": "Efficient for routine tasks"
107
+ },
108
+ {
109
+ "value": "haiku",
110
+ "name": "Haiku 4.5",
111
+ "description": "Fastest for quick answers"
112
+ },
113
+ {
114
+ "value": "claude-sonnet-5",
115
+ "name": "Sonnet 5",
116
+ "description": "Efficient for routine tasks"
117
+ },
118
+ {
119
+ "value": "claude-opus-5",
120
+ "name": "Opus 5",
121
+ "description": "Best for everyday, complex tasks"
122
+ },
123
+ {
124
+ "value": "claude-fable-5",
125
+ "name": "Fable 5",
126
+ "description": "Most capable for your hardest and longest-running tasks"
127
+ },
128
+ {
129
+ "value": "claude-opus-4-8",
130
+ "name": "Opus 4.8",
131
+ "description": "Best for everyday, complex tasks"
132
+ },
133
+ {
134
+ "value": "claude-opus-4-7",
135
+ "name": "Opus 4.7",
136
+ "description": "Best for everyday, complex tasks"
137
+ },
138
+ {
139
+ "value": "claude-opus-4-6",
140
+ "name": "Opus 4.6",
141
+ "description": "Best for everyday, complex tasks"
142
+ },
143
+ {
144
+ "value": "claude-sonnet-4-6",
145
+ "name": "Sonnet 4.6",
146
+ "description": "Efficient for routine tasks"
147
+ }
148
+ ]
149
+ }
150
+ ]
151
+ }
152
+ },
153
+ "codex": {
154
+ "initialize": {
155
+ "protocolVersion": 1,
156
+ "agentInfo": {
157
+ "name": "@agentclientprotocol/codex-acp",
158
+ "title": "Codex",
159
+ "version": "2.1.1"
160
+ },
161
+ "agentCapabilities": {
162
+ "auth": {
163
+ "logout": {}
164
+ },
165
+ "providers": {},
166
+ "loadSession": true,
167
+ "promptCapabilities": {
168
+ "embeddedContext": true,
169
+ "image": true
170
+ },
171
+ "sessionCapabilities": {
172
+ "resume": {},
173
+ "list": {},
174
+ "close": {},
175
+ "delete": {},
176
+ "fork": {},
177
+ "additionalDirectories": {},
178
+ "subagents": {}
179
+ },
180
+ "mcpCapabilities": {
181
+ "acp": false,
182
+ "http": true,
183
+ "sse": false
184
+ },
185
+ "_meta": {
186
+ "authStatus": {}
187
+ }
188
+ },
189
+ "authMethods": [
190
+ {
191
+ "id": "api-key",
192
+ "name": "API Key",
193
+ "description": "Use an API key to authenticate",
194
+ "_meta": {
195
+ "api-key": {
196
+ "provider": "openai"
197
+ }
198
+ }
199
+ },
200
+ {
201
+ "id": "chat-gpt",
202
+ "name": "ChatGPT",
203
+ "description": "Use ChatGPT to authenticate"
204
+ }
205
+ ],
206
+ "_meta": {
207
+ "steering": {
208
+ "supported": true
209
+ }
210
+ }
211
+ },
212
+ "session": {
213
+ "modes": {
214
+ "availableModes": [
215
+ {
216
+ "id": "read-only",
217
+ "name": "Read-only",
218
+ "description": "Requires approval to edit files and access the internet."
219
+ },
220
+ {
221
+ "id": "workspace-write",
222
+ "name": "Workspace access",
223
+ "description": "Edit workspace files; ask before writing outside the workspace or accessing the network."
224
+ },
225
+ {
226
+ "id": "agent",
227
+ "name": "Auto review",
228
+ "description": "Only ask for actions detected as potentially unsafe"
229
+ },
230
+ {
231
+ "id": "agent-full-access",
232
+ "name": "Full access",
233
+ "description": "Unrestricted access to the internet and any file on your computer"
234
+ }
235
+ ],
236
+ "currentModeId": "agent"
237
+ },
238
+ "configOptions": [
239
+ {
240
+ "id": "model",
241
+ "name": "Model",
242
+ "description": "Model Codex uses for the session",
243
+ "category": "model",
244
+ "type": "select",
245
+ "currentValue": "gpt-6-astra",
246
+ "options": [
247
+ {
248
+ "value": "gpt-6.1-sol",
249
+ "name": "6.1 Sol",
250
+ "description": "Latest workhorse model for coding and everyday work."
251
+ },
252
+ {
253
+ "value": "gpt-6-astra",
254
+ "name": "6 Astra",
255
+ "description": "Frontier intelligence for the most demanding work."
256
+ },
257
+ {
258
+ "value": "gpt-6-sol",
259
+ "name": "6 Sol",
260
+ "description": "Previous generation workhorse model."
261
+ },
262
+ {
263
+ "value": "gpt-6-luna",
264
+ "name": "6 Luna",
265
+ "description": "Fast and affordable model for easier tasks."
266
+ },
267
+ {
268
+ "value": "gpt-5.6-sol",
269
+ "name": "5.6 Sol",
270
+ "description": "Older generation workhorse model."
271
+ },
272
+ {
273
+ "value": "gpt-5.6-terra",
274
+ "name": "5.6 Terra",
275
+ "description": "Older balanced model for straightforward work."
276
+ },
277
+ {
278
+ "value": "gpt-5.6-luna",
279
+ "name": "5.6 Luna",
280
+ "description": "Older fast and efficient model."
281
+ }
282
+ ]
283
+ }
284
+ ]
285
+ }
286
+ }
287
+ };
@@ -0,0 +1,18 @@
1
+ import type { CellClient } from '@shardflux/sdk';
2
+ import { AcpRpc } from './acp-rpc.js';
3
+ import type { RpcId } from './acp-rpc.js';
4
+ export interface AcpCursor {
5
+ from_seq: number;
6
+ prompt_id?: RpcId;
7
+ }
8
+ export declare const ACP_INPUT_SCRIPT = "import json, os, socket, sys\npayload = sys.stdin.buffer.readline((2 << 20) + 1024)\nif not payload.endswith(b'\\n') or len(json.dumps(json.loads(payload)['message'], separators=(',', ':'), ensure_ascii=False).encode()) > 2 << 20:\n raise ValueError('ACP input exceeds 2 MiB')\nfolder = os.open(sys.argv[1], os.O_RDONLY)\ntry:\n with socket.socket(socket.AF_UNIX) as peer:\n peer.settimeout(10)\n address = os.path.join(sys.argv[1], 'control.sock')\n if len(address.encode()) >= 108: address = '/proc/self/fd/%d/control.sock' % folder\n peer.connect(address)\n peer.sendall(payload)\n response = peer.makefile('rb').readline(65536)\n result = json.loads(response)\n if result.get('accepted') is not True: raise ValueError(result.get('error', 'ACP input was not acknowledged'))\n sys.stdout.buffer.write(response)\nfinally:\n os.close(folder)\n";
9
+ /** Replay is finite; a live follower exists only while a turn/RPC needs output. Native supervision is CVB's. */
10
+ export declare class AcpJournal {
11
+ #private;
12
+ readonly rpc: AcpRpc;
13
+ constructor(cell: CellClient, conversation: string, _harness: 'claude' | 'codex', cwd: string, cursor: AcpCursor, save: () => void, signal: AbortSignal);
14
+ start(): Promise<void>;
15
+ pause(): void;
16
+ resume(): void;
17
+ close(): Promise<void>;
18
+ }