zcode-acp-server 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.
Files changed (108) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +167 -0
  3. package/README.zh-CN.md +163 -0
  4. package/dist/backend/client.d.ts +103 -0
  5. package/dist/backend/client.d.ts.map +1 -0
  6. package/dist/backend/client.js +344 -0
  7. package/dist/backend/client.js.map +1 -0
  8. package/dist/backend/credentials.d.ts +31 -0
  9. package/dist/backend/credentials.d.ts.map +1 -0
  10. package/dist/backend/credentials.js +93 -0
  11. package/dist/backend/credentials.js.map +1 -0
  12. package/dist/backend/index.d.ts +7 -0
  13. package/dist/backend/index.d.ts.map +1 -0
  14. package/dist/backend/index.js +6 -0
  15. package/dist/backend/index.js.map +1 -0
  16. package/dist/backend/listener.d.ts +63 -0
  17. package/dist/backend/listener.d.ts.map +1 -0
  18. package/dist/backend/listener.js +138 -0
  19. package/dist/backend/listener.js.map +1 -0
  20. package/dist/backend/resolve.d.ts +11 -0
  21. package/dist/backend/resolve.d.ts.map +1 -0
  22. package/dist/backend/resolve.js +116 -0
  23. package/dist/backend/resolve.js.map +1 -0
  24. package/dist/backend/types.d.ts +164 -0
  25. package/dist/backend/types.d.ts.map +1 -0
  26. package/dist/backend/types.js +15 -0
  27. package/dist/backend/types.js.map +1 -0
  28. package/dist/config/model-cache.d.ts +20 -0
  29. package/dist/config/model-cache.d.ts.map +1 -0
  30. package/dist/config/model-cache.js +62 -0
  31. package/dist/config/model-cache.js.map +1 -0
  32. package/dist/config/options.d.ts +36 -0
  33. package/dist/config/options.d.ts.map +1 -0
  34. package/dist/config/options.js +171 -0
  35. package/dist/config/options.js.map +1 -0
  36. package/dist/config/runtime-model.d.ts +33 -0
  37. package/dist/config/runtime-model.d.ts.map +1 -0
  38. package/dist/config/runtime-model.js +96 -0
  39. package/dist/config/runtime-model.js.map +1 -0
  40. package/dist/handlers/dispatch.d.ts +15 -0
  41. package/dist/handlers/dispatch.d.ts.map +1 -0
  42. package/dist/handlers/dispatch.js +183 -0
  43. package/dist/handlers/dispatch.js.map +1 -0
  44. package/dist/handlers/extensions.d.ts +43 -0
  45. package/dist/handlers/extensions.d.ts.map +1 -0
  46. package/dist/handlers/extensions.js +310 -0
  47. package/dist/handlers/extensions.js.map +1 -0
  48. package/dist/handlers/io.d.ts +40 -0
  49. package/dist/handlers/io.d.ts.map +1 -0
  50. package/dist/handlers/io.js +55 -0
  51. package/dist/handlers/io.js.map +1 -0
  52. package/dist/handlers/server-requests.d.ts +34 -0
  53. package/dist/handlers/server-requests.d.ts.map +1 -0
  54. package/dist/handlers/server-requests.js +357 -0
  55. package/dist/handlers/server-requests.js.map +1 -0
  56. package/dist/handlers/session.d.ts +46 -0
  57. package/dist/handlers/session.d.ts.map +1 -0
  58. package/dist/handlers/session.js +738 -0
  59. package/dist/handlers/session.js.map +1 -0
  60. package/dist/handlers/slash.d.ts +16 -0
  61. package/dist/handlers/slash.d.ts.map +1 -0
  62. package/dist/handlers/slash.js +107 -0
  63. package/dist/handlers/slash.js.map +1 -0
  64. package/dist/index.d.ts +11 -0
  65. package/dist/index.d.ts.map +1 -0
  66. package/dist/index.js +93 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/interaction/adapter.d.ts +136 -0
  69. package/dist/interaction/adapter.d.ts.map +1 -0
  70. package/dist/interaction/adapter.js +353 -0
  71. package/dist/interaction/adapter.js.map +1 -0
  72. package/dist/server.d.ts +73 -0
  73. package/dist/server.d.ts.map +1 -0
  74. package/dist/server.js +97 -0
  75. package/dist/server.js.map +1 -0
  76. package/dist/tasks-index.d.ts +39 -0
  77. package/dist/tasks-index.d.ts.map +1 -0
  78. package/dist/tasks-index.js +152 -0
  79. package/dist/tasks-index.js.map +1 -0
  80. package/dist/translators/event-translator.d.ts +40 -0
  81. package/dist/translators/event-translator.d.ts.map +1 -0
  82. package/dist/translators/event-translator.js +214 -0
  83. package/dist/translators/event-translator.js.map +1 -0
  84. package/dist/translators/index.d.ts +6 -0
  85. package/dist/translators/index.d.ts.map +1 -0
  86. package/dist/translators/index.js +5 -0
  87. package/dist/translators/index.js.map +1 -0
  88. package/dist/translators/projection-differ.d.ts +48 -0
  89. package/dist/translators/projection-differ.d.ts.map +1 -0
  90. package/dist/translators/projection-differ.js +239 -0
  91. package/dist/translators/projection-differ.js.map +1 -0
  92. package/dist/translators/tool-helpers.d.ts +60 -0
  93. package/dist/translators/tool-helpers.d.ts.map +1 -0
  94. package/dist/translators/tool-helpers.js +308 -0
  95. package/dist/translators/tool-helpers.js.map +1 -0
  96. package/dist/translators/types.d.ts +58 -0
  97. package/dist/translators/types.d.ts.map +1 -0
  98. package/dist/translators/types.js +27 -0
  99. package/dist/translators/types.js.map +1 -0
  100. package/dist/utils.d.ts +111 -0
  101. package/dist/utils.d.ts.map +1 -0
  102. package/dist/utils.js +110 -0
  103. package/dist/utils.js.map +1 -0
  104. package/docs/ARCHITECTURE.md +299 -0
  105. package/docs/DEVELOPMENT.md +193 -0
  106. package/docs/PROTOCOL.md +649 -0
  107. package/docs/TROUBLESHOOTING.md +251 -0
  108. package/package.json +66 -0
@@ -0,0 +1,649 @@
1
+ # ZCode JSON-RPC Protocol
2
+
3
+ This document describes the internal JSON-RPC protocol between zcode-acp-server
4
+ and the ZCode CLI.
5
+
6
+ ## Protocol Overview
7
+
8
+ ZCode communicates over stdio using **line-delimited JSON**. The message format
9
+ resembles JSON-RPC, but **does not include the `jsonrpc` field**.
10
+
11
+ ### Message classification
12
+
13
+ Messages are classified by the presence of `id` and `method`:
14
+
15
+ | Combination | Type | Direction |
16
+ |------|------|------|
17
+ | `id` + no `method` | Response | zcode -> bridge |
18
+ | `id` + `method` | Request | bridge -> zcode or zcode -> bridge |
19
+ | `method` + no `id` | Notification | bidirectional |
20
+
21
+ ### Request format
22
+
23
+ ```json
24
+ {
25
+ "id": 1,
26
+ "method": "session/create",
27
+ "params": {
28
+ "workspace": {
29
+ "workspacePath": "/path/to/project",
30
+ "workspaceKey": "/path/to/project"
31
+ },
32
+ "mode": "yolo"
33
+ }
34
+ }
35
+ ```
36
+
37
+ ### Response format
38
+
39
+ ```json
40
+ {
41
+ "id": 1,
42
+ "result": {
43
+ "session": {
44
+ "sessionId": "sess_abc123",
45
+ "title": "your prompt text..."
46
+ }
47
+ }
48
+ }
49
+ ```
50
+
51
+ ### Error format
52
+
53
+ ```json
54
+ {
55
+ "id": 1,
56
+ "error": {
57
+ "message": "prompt is running",
58
+ "code": 1308
59
+ }
60
+ }
61
+ ```
62
+
63
+ ### Notification format
64
+
65
+ ```json
66
+ {
67
+ "method": "session/event",
68
+ "params": {
69
+ "sessionId": "sess_abc123",
70
+ "seq": 42,
71
+ "type": "turn.started",
72
+ "payload": {}
73
+ }
74
+ }
75
+ ```
76
+
77
+ ## Session Lifecycle Methods
78
+
79
+ ### `session/create`
80
+
81
+ Create a new session.
82
+
83
+ **Request:**
84
+ ```json
85
+ {
86
+ "id": 1,
87
+ "method": "session/create",
88
+ "params": {
89
+ "workspace": {
90
+ "workspacePath": "/path/to/project",
91
+ "workspaceKey": "/path/to/project"
92
+ },
93
+ "mode": "yolo"
94
+ }
95
+ }
96
+ ```
97
+
98
+ **Response:**
99
+ ```json
100
+ {
101
+ "id": 1,
102
+ "result": {
103
+ "session": {
104
+ "sessionId": "sess_abc123",
105
+ "title": "",
106
+ "traceId": "trace_xyz789"
107
+ }
108
+ }
109
+ }
110
+ ```
111
+
112
+ ### `session/list`
113
+
114
+ List all sessions.
115
+
116
+ **Request:**
117
+ ```json
118
+ {
119
+ "id": 2,
120
+ "method": "session/list",
121
+ "params": {
122
+ "workspace": {
123
+ "workspacePath": "/path/to/project",
124
+ "workspaceKey": "/path/to/project"
125
+ }
126
+ }
127
+ }
128
+ ```
129
+
130
+ ### `session/resume`
131
+
132
+ Resume an existing session.
133
+
134
+ **Request:**
135
+ ```json
136
+ {
137
+ "id": 3,
138
+ "method": "session/resume",
139
+ "params": {
140
+ "sessionId": "sess_abc123",
141
+ "workspace": {
142
+ "workspacePath": "/path/to/project",
143
+ "workspaceKey": "/path/to/project"
144
+ }
145
+ }
146
+ }
147
+ ```
148
+
149
+ ### `session/send`
150
+
151
+ Send a prompt.
152
+
153
+ **Request:**
154
+ ```json
155
+ {
156
+ "id": 4,
157
+ "method": "session/send",
158
+ "params": {
159
+ "sessionId": "sess_abc123",
160
+ "content": "your prompt text"
161
+ }
162
+ }
163
+ ```
164
+
165
+ **Response:**
166
+ ```json
167
+ {
168
+ "id": 4,
169
+ "result": {
170
+ "accepted": true
171
+ }
172
+ }
173
+ ```
174
+
175
+ ### `session/stop`
176
+
177
+ Stop the current turn (fire-and-forget).
178
+
179
+ ```json
180
+ {
181
+ "method": "session/stop",
182
+ "params": {
183
+ "sessionId": "sess_abc123"
184
+ }
185
+ }
186
+ ```
187
+
188
+ ### `session/read`
189
+
190
+ Read the session state and projection.
191
+
192
+ **Request:**
193
+ ```json
194
+ {
195
+ "id": 5,
196
+ "method": "session/read",
197
+ "params": {
198
+ "sessionId": "sess_abc123"
199
+ }
200
+ }
201
+ ```
202
+
203
+ **Response:**
204
+ ```json
205
+ {
206
+ "id": 5,
207
+ "result": {
208
+ "projection": {
209
+ "status": "idle",
210
+ "contextUsed": 1234,
211
+ "contextWindow": 32000,
212
+ "totalTokenCount": 5678
213
+ },
214
+ "settings": {
215
+ "mode": { "current": "yolo" },
216
+ "model": { "current": { "modelId": "GLM-5.2" } },
217
+ "thoughtLevel": { "current": "high" }
218
+ },
219
+ "todos": [
220
+ { "content": "Implement login", "status": "pending", "priority": "high" }
221
+ ]
222
+ }
223
+ }
224
+ ```
225
+
226
+ ### `session/messages`
227
+
228
+ Fetch the session's historical messages.
229
+
230
+ **Request:**
231
+ ```json
232
+ {
233
+ "id": 6,
234
+ "method": "session/messages",
235
+ "params": {
236
+ "sessionId": "sess_abc123"
237
+ }
238
+ }
239
+ ```
240
+
241
+ ## Event Stream Subscription
242
+
243
+ ### `session/subscribe`
244
+
245
+ Subscribe to a session's event push.
246
+
247
+ **Request:**
248
+ ```json
249
+ {
250
+ "id": 7,
251
+ "method": "session/subscribe",
252
+ "params": {
253
+ "sessionId": "sess_abc123",
254
+ "deliveryKind": "desktop-continuous",
255
+ "includeSnapshot": true,
256
+ "afterSeq": 0
257
+ }
258
+ }
259
+ ```
260
+
261
+ **Response:**
262
+ ```json
263
+ {
264
+ "id": 7,
265
+ "result": {
266
+ "eventSeq": 42,
267
+ "snapshot": {
268
+ "projection": { ... },
269
+ "messages": [ ... ]
270
+ }
271
+ }
272
+ }
273
+ ```
274
+
275
+ ## Event Types
276
+
277
+ After subscribing, zcode pushes events via `session/event` notifications:
278
+
279
+ ### `turn.started`
280
+
281
+ The turn has started.
282
+
283
+ ```json
284
+ {
285
+ "method": "session/event",
286
+ "params": {
287
+ "sessionId": "sess_abc123",
288
+ "seq": 43,
289
+ "type": "turn.started",
290
+ "payload": {}
291
+ }
292
+ }
293
+ ```
294
+
295
+ ### `model.streaming`
296
+
297
+ Model streaming output.
298
+
299
+ ```json
300
+ {
301
+ "method": "session/event",
302
+ "params": {
303
+ "sessionId": "sess_abc123",
304
+ "seq": 44,
305
+ "type": "model.streaming",
306
+ "payload": {
307
+ "kind": "text_delta",
308
+ "delta": "this code..."
309
+ }
310
+ }
311
+ }
312
+ ```
313
+
314
+ `kind` can be:
315
+ - `text_delta`: text delta
316
+ - `reasoning_delta`: reasoning text delta
317
+ - `tool_call`: tool call declaration (caches toolName and input)
318
+
319
+ ### `tool.updated`
320
+
321
+ Tool status update.
322
+
323
+ ```json
324
+ {
325
+ "method": "session/event",
326
+ "params": {
327
+ "sessionId": "sess_abc123",
328
+ "seq": 45,
329
+ "type": "tool.updated",
330
+ "payload": {
331
+ "kind": "scheduled",
332
+ "toolCallId": "call_xyz",
333
+ "toolName": "Bash",
334
+ "input": { "command": "ls -la" }
335
+ }
336
+ }
337
+ }
338
+ ```
339
+
340
+ `kind` can be:
341
+ - `scheduled`: tool scheduled
342
+ - `started`: tool started executing
343
+ - `progress`: progress update (stdoutTail / stderrTail)
344
+ - `result`: tool finished
345
+ - `error`: tool error
346
+ - `batch`: multiple tools finished in a batch
347
+
348
+ ### `turn.completed`
349
+
350
+ The turn completed.
351
+
352
+ ```json
353
+ {
354
+ "method": "session/event",
355
+ "params": {
356
+ "sessionId": "sess_abc123",
357
+ "seq": 46,
358
+ "type": "turn.completed",
359
+ "payload": {
360
+ "resultType": "success",
361
+ "usage": {
362
+ "totalTokens": 1234
363
+ }
364
+ }
365
+ }
366
+ }
367
+ ```
368
+
369
+ ### `turn.failed`
370
+
371
+ The turn failed.
372
+
373
+ ```json
374
+ {
375
+ "method": "session/event",
376
+ "params": {
377
+ "sessionId": "sess_abc123",
378
+ "seq": 47,
379
+ "type": "turn.failed",
380
+ "payload": {
381
+ "error": {
382
+ "code": 1308,
383
+ "message": "prompt is running"
384
+ }
385
+ }
386
+ }
387
+ }
388
+ ```
389
+
390
+ ### `session.updated`
391
+
392
+ Session state update (usage, etc.).
393
+
394
+ ```json
395
+ {
396
+ "method": "session/event",
397
+ "params": {
398
+ "sessionId": "sess_abc123",
399
+ "seq": 48,
400
+ "type": "session.updated",
401
+ "payload": {
402
+ "usage": {
403
+ "inputTokens": 1234
404
+ },
405
+ "contextWindow": 32000
406
+ }
407
+ }
408
+ }
409
+ ```
410
+
411
+ ## Interaction Protocol (Server -> Client)
412
+
413
+ Requests that zcode actively sends to the bridge.
414
+
415
+ ### `interaction/requestPermission`
416
+
417
+ Tool permission request.
418
+
419
+ ```json
420
+ {
421
+ "id": 100,
422
+ "method": "interaction/requestPermission",
423
+ "params": {
424
+ "requestId": "req_xyz",
425
+ "sessionId": "sess_abc123",
426
+ "toolCallId": "call_xyz",
427
+ "toolName": "Bash",
428
+ "reason": "run command",
429
+ "input": { "command": "rm -rf /" },
430
+ "options": [
431
+ { "optionId": "allow", "kind": "allow_once", "name": "Allow once" },
432
+ { "optionId": "deny", "kind": "deny_once", "name": "Deny" }
433
+ ]
434
+ }
435
+ }
436
+ ```
437
+
438
+ ### `interaction/requestUserInput`
439
+
440
+ User input request (ExitPlanMode / AskUserQuestion).
441
+
442
+ **ExitPlanMode:**
443
+ ```json
444
+ {
445
+ "id": 101,
446
+ "method": "interaction/requestUserInput",
447
+ "params": {
448
+ "requestId": "req_xyz",
449
+ "sessionId": "sess_abc123",
450
+ "toolCallId": "call_xyz",
451
+ "schema": { "interaction": "plan_approval" },
452
+ "input": { "plan": "1. Implement login\n2. Implement signup" }
453
+ }
454
+ }
455
+ ```
456
+
457
+ **AskUserQuestion:**
458
+ ```json
459
+ {
460
+ "id": 102,
461
+ "method": "interaction/requestUserInput",
462
+ "params": {
463
+ "requestId": "req_xyz",
464
+ "sessionId": "sess_abc123",
465
+ "toolCallId": "call_xyz",
466
+ "questions": [
467
+ {
468
+ "question": "Select the files to test",
469
+ "multiSelect": true,
470
+ "options": [
471
+ { "label": "auth.test.ts", "value": "auth" },
472
+ { "label": "user.test.ts", "value": "user" }
473
+ ]
474
+ }
475
+ ]
476
+ }
477
+ }
478
+ ```
479
+
480
+ ### Bridge routing (protocol negotiation)
481
+
482
+ ZCode `interaction/*` requests are routed to different ACP interaction
483
+ mechanisms based on client capabilities:
484
+
485
+ | Request type | Client supports elicitation.form | Client does not |
486
+ |---------|:------------------------:|:----------:|
487
+ | Tool auth (`interaction/requestPermission`) | `session/request_permission` | `session/request_permission` |
488
+ | ExitPlanMode (`interaction/requestUserInput` + plan_approval) | `elicitation/create` (approve/reject form) | `session/request_permission` |
489
+ | AskUserQuestion (`interaction/requestUserInput`) | `elicitation/create` (single form) | per-question `session/request_permission` |
490
+
491
+ **Capability detection**: at `initialize` time the client declares support via
492
+ `clientCapabilities.elicitation.form`. The server detects it with
493
+ `server.supportsElicitationForm()`.
494
+
495
+ **elicitation form example** (AskUserQuestion):
496
+ ```json
497
+ {
498
+ "method": "elicitation/create",
499
+ "params": {
500
+ "mode": "form",
501
+ "sessionId": "sess_abc123",
502
+ "message": "Please answer 2 questions.",
503
+ "requestedSchema": {
504
+ "type": "object",
505
+ "properties": {
506
+ "q_0": {
507
+ "type": "string",
508
+ "enum": ["auth.test.ts", "user.test.ts"],
509
+ "title": "Select the files to test"
510
+ }
511
+ },
512
+ "required": ["q_0"]
513
+ }
514
+ }
515
+ }
516
+ ```
517
+
518
+ **elicitation response** (accept/decline/cancel):
519
+ ```json
520
+ {
521
+ "action": "accept",
522
+ "content": { "q_0": "auth.test.ts" }
523
+ }
524
+ ```
525
+
526
+ ## Extension Methods (0.14.8+)
527
+
528
+ ### `session/fork`
529
+
530
+ Fork a new session from a checkpoint.
531
+
532
+ **Request:**
533
+ ```json
534
+ {
535
+ "id": 8,
536
+ "method": "session/fork",
537
+ "params": {
538
+ "sessionId": "sess_abc123",
539
+ "target": { "kind": "latestCheckpoint" }
540
+ }
541
+ }
542
+ ```
543
+
544
+ ### `session/rewind`
545
+
546
+ Rewind to a checkpoint.
547
+
548
+ **Request:**
549
+ ```json
550
+ {
551
+ "id": 9,
552
+ "method": "session/rewind",
553
+ "params": {
554
+ "sessionId": "sess_abc123",
555
+ "target": { "kind": "latestCheckpoint" },
556
+ "expectedRevision": 42
557
+ }
558
+ }
559
+ ```
560
+
561
+ ### `session/goal`
562
+
563
+ Read / set / replace / clear the goal.
564
+
565
+ **Request:**
566
+ ```json
567
+ {
568
+ "id": 10,
569
+ "method": "session/goal",
570
+ "params": {
571
+ "sessionId": "sess_abc123",
572
+ "action": "set",
573
+ "objective": "Refactor the auth module"
574
+ }
575
+ }
576
+ ```
577
+
578
+ `action` can be: `show`, `set`, `replace`, `clear`, `pause`, `resume`
579
+
580
+ ### `session/compact`
581
+
582
+ Compact the conversation history.
583
+
584
+ **Request:**
585
+ ```json
586
+ {
587
+ "id": 11,
588
+ "method": "session/compact",
589
+ "params": {
590
+ "sessionId": "sess_abc123"
591
+ }
592
+ }
593
+ ```
594
+
595
+ ### `session/steer`
596
+
597
+ Append instructions to a running turn.
598
+
599
+ **Request:**
600
+ ```json
601
+ {
602
+ "id": 12,
603
+ "method": "session/steer",
604
+ "params": {
605
+ "sessionId": "sess_abc123",
606
+ "content": "Please use TypeScript instead of JavaScript"
607
+ }
608
+ }
609
+ ```
610
+
611
+ ### `session/setMode`
612
+
613
+ Switch the session mode.
614
+
615
+ **Request:**
616
+ ```json
617
+ {
618
+ "id": 13,
619
+ "method": "session/setMode",
620
+ "params": {
621
+ "sessionId": "sess_abc123",
622
+ "mode": "build"
623
+ }
624
+ }
625
+ ```
626
+
627
+ ### `session/setThoughtLevel`
628
+
629
+ Set the thought level.
630
+
631
+ **Request:**
632
+ ```json
633
+ {
634
+ "id": 14,
635
+ "method": "session/setThoughtLevel",
636
+ "params": {
637
+ "sessionId": "sess_abc123",
638
+ "thoughtLevel": "max"
639
+ }
640
+ }
641
+ ```
642
+
643
+ ## Version Compatibility
644
+
645
+ | ZCode CLI version | session/subscribe | Extension methods | Notes |
646
+ |---------------|-------------------|----------|------|
647
+ | >= 0.15.0 | Supported | All supported | Full functionality |
648
+ | >= 0.14.8 | Supported | Partially supported | workspace/* unavailable |
649
+ | 0.14.5 ~ 0.14.7 | Not supported | Not supported | Incompatible with this project |