@anhlp/alp-protocol 0.0.0-beta.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.
@@ -0,0 +1,2827 @@
1
+ {
2
+ "$comment": "Golden v1 values (docs/protocol/alp-json-rpc-v1.md §11). check: message (one frame), envelope, params or result of `method`. Every valid case must pass schema/methods-v1.json and the TypeScript projection in src/; every invalid one must fail the schema; `projection: false` marks values the closed TypeScript unions deliberately leave out. Implementations in any language can load this file.",
3
+ "cases": [
4
+ {
5
+ "name": "request",
6
+ "check": "message",
7
+ "valid": true,
8
+ "value": {
9
+ "jsonrpc": "2.0",
10
+ "id": 1,
11
+ "method": "daemon.hello",
12
+ "params": {
13
+ "protocolVersion": 1,
14
+ "client": {
15
+ "name": "fixture",
16
+ "version": "0.9.5"
17
+ }
18
+ }
19
+ }
20
+ },
21
+ {
22
+ "name": "request with a string id",
23
+ "check": "message",
24
+ "valid": true,
25
+ "value": {
26
+ "jsonrpc": "2.0",
27
+ "id": "req-é",
28
+ "method": "session.list"
29
+ }
30
+ },
31
+ {
32
+ "name": "success response",
33
+ "check": "message",
34
+ "valid": true,
35
+ "value": {
36
+ "jsonrpc": "2.0",
37
+ "id": 1,
38
+ "result": {
39
+ "protocolVersion": 1,
40
+ "daemonVersion": "0.10.0",
41
+ "pid": 42,
42
+ "capabilities": [
43
+ "attach.after",
44
+ "extension.methods"
45
+ ]
46
+ }
47
+ }
48
+ },
49
+ {
50
+ "name": "error response",
51
+ "check": "message",
52
+ "valid": true,
53
+ "value": {
54
+ "jsonrpc": "2.0",
55
+ "id": 2,
56
+ "error": {
57
+ "code": 1001,
58
+ "message": "No session ses_fixture"
59
+ }
60
+ }
61
+ },
62
+ {
63
+ "name": "error response with id null",
64
+ "check": "message",
65
+ "valid": true,
66
+ "value": {
67
+ "jsonrpc": "2.0",
68
+ "id": null,
69
+ "error": {
70
+ "code": -32700,
71
+ "message": "Parse error"
72
+ }
73
+ }
74
+ },
75
+ {
76
+ "name": "event notification",
77
+ "check": "message",
78
+ "valid": true,
79
+ "value": {
80
+ "jsonrpc": "2.0",
81
+ "method": "event",
82
+ "params": {
83
+ "sessionId": "ses_fixture",
84
+ "epoch": "epoch-1",
85
+ "seq": 3,
86
+ "cursor": 12,
87
+ "ts": "2026-10-15T00:00:00.000Z",
88
+ "event": {
89
+ "type": "session.ready"
90
+ }
91
+ }
92
+ }
93
+ },
94
+ {
95
+ "name": "extension.invoke request to an owner",
96
+ "check": "message",
97
+ "valid": true,
98
+ "value": {
99
+ "jsonrpc": "2.0",
100
+ "id": 3,
101
+ "method": "extension.invoke",
102
+ "params": {
103
+ "method": "web.pairing",
104
+ "params": {}
105
+ }
106
+ }
107
+ },
108
+ {
109
+ "name": "request without jsonrpc",
110
+ "check": "message",
111
+ "valid": false,
112
+ "value": {
113
+ "id": 1,
114
+ "method": "daemon.status"
115
+ }
116
+ },
117
+ {
118
+ "name": "request with a fractional id",
119
+ "check": "message",
120
+ "valid": false,
121
+ "value": {
122
+ "jsonrpc": "2.0",
123
+ "id": 1.5,
124
+ "method": "daemon.status"
125
+ }
126
+ },
127
+ {
128
+ "name": "request with an id beyond 2^53-1",
129
+ "check": "message",
130
+ "valid": false,
131
+ "value": {
132
+ "jsonrpc": "2.0",
133
+ "id": 9007199254740992,
134
+ "method": "daemon.status"
135
+ }
136
+ },
137
+ {
138
+ "name": "request with array params",
139
+ "check": "message",
140
+ "valid": false,
141
+ "value": {
142
+ "jsonrpc": "2.0",
143
+ "id": 1,
144
+ "method": "session.get",
145
+ "params": [
146
+ "ses_fixture"
147
+ ]
148
+ }
149
+ },
150
+ {
151
+ "name": "response with result and error",
152
+ "check": "message",
153
+ "valid": false,
154
+ "value": {
155
+ "jsonrpc": "2.0",
156
+ "id": 1,
157
+ "result": {},
158
+ "error": {
159
+ "code": 1000,
160
+ "message": "x"
161
+ }
162
+ }
163
+ },
164
+ {
165
+ "name": "error without message",
166
+ "check": "message",
167
+ "valid": false,
168
+ "value": {
169
+ "jsonrpc": "2.0",
170
+ "id": 1,
171
+ "error": {
172
+ "code": 1000
173
+ }
174
+ }
175
+ },
176
+ {
177
+ "name": "batch",
178
+ "check": "message",
179
+ "valid": false,
180
+ "value": [
181
+ {
182
+ "jsonrpc": "2.0",
183
+ "id": 1,
184
+ "method": "daemon.status"
185
+ }
186
+ ]
187
+ },
188
+ {
189
+ "name": "event session.opened",
190
+ "check": "envelope",
191
+ "valid": true,
192
+ "value": {
193
+ "sessionId": "ses_fixture",
194
+ "epoch": "epoch-1",
195
+ "seq": 3,
196
+ "cursor": 12,
197
+ "ts": "2026-10-15T00:00:00.000Z",
198
+ "event": {
199
+ "type": "session.opened",
200
+ "session": {
201
+ "id": "ses_fixture",
202
+ "projectRoot": "/work/project",
203
+ "agent": "main",
204
+ "runtime": "codex",
205
+ "model": "gpt-6.1-sol",
206
+ "mode": "workspace-write",
207
+ "thinking": "low",
208
+ "workflow": {
209
+ "mode": "pho",
210
+ "maxPeers": 2,
211
+ "supervisor": false
212
+ },
213
+ "teamLabel": "Phở",
214
+ "threadId": "thread-1",
215
+ "persistent": true,
216
+ "busy": false
217
+ },
218
+ "cwd": "/work/project",
219
+ "effective": {
220
+ "model": "gpt-6.1-sol",
221
+ "thinking": "low"
222
+ }
223
+ }
224
+ }
225
+ },
226
+ {
227
+ "name": "event session.ready",
228
+ "check": "envelope",
229
+ "valid": true,
230
+ "value": {
231
+ "sessionId": "ses_fixture",
232
+ "epoch": "epoch-1",
233
+ "seq": 3,
234
+ "cursor": 12,
235
+ "ts": "2026-10-15T00:00:00.000Z",
236
+ "event": {
237
+ "type": "session.ready"
238
+ }
239
+ }
240
+ },
241
+ {
242
+ "name": "event session.updated",
243
+ "check": "envelope",
244
+ "valid": true,
245
+ "value": {
246
+ "sessionId": "ses_fixture",
247
+ "epoch": "epoch-1",
248
+ "seq": 3,
249
+ "cursor": 12,
250
+ "ts": "2026-10-15T00:00:00.000Z",
251
+ "event": {
252
+ "type": "session.updated",
253
+ "session": {
254
+ "id": "ses_fixture",
255
+ "projectRoot": "/work/project",
256
+ "agent": "main",
257
+ "runtime": "codex",
258
+ "model": "gpt-6.1-sol",
259
+ "mode": "workspace-write",
260
+ "thinking": "low",
261
+ "workflow": {
262
+ "mode": "pho",
263
+ "maxPeers": 2,
264
+ "supervisor": false
265
+ },
266
+ "teamLabel": "Phở",
267
+ "threadId": "thread-1",
268
+ "persistent": true,
269
+ "busy": true,
270
+ "activeTurnId": "turn-1"
271
+ }
272
+ }
273
+ }
274
+ },
275
+ {
276
+ "name": "event session.closed",
277
+ "check": "envelope",
278
+ "valid": true,
279
+ "value": {
280
+ "sessionId": "ses_fixture",
281
+ "epoch": "epoch-1",
282
+ "seq": 3,
283
+ "cursor": 12,
284
+ "ts": "2026-10-15T00:00:00.000Z",
285
+ "event": {
286
+ "type": "session.closed"
287
+ }
288
+ }
289
+ },
290
+ {
291
+ "name": "event session.failed",
292
+ "check": "envelope",
293
+ "valid": true,
294
+ "value": {
295
+ "sessionId": "ses_fixture",
296
+ "epoch": "epoch-1",
297
+ "seq": 3,
298
+ "cursor": 12,
299
+ "ts": "2026-10-15T00:00:00.000Z",
300
+ "event": {
301
+ "type": "session.failed",
302
+ "error": {
303
+ "message": "provider exited",
304
+ "code": "provider_exit"
305
+ }
306
+ }
307
+ }
308
+ },
309
+ {
310
+ "name": "event prompt.accepted",
311
+ "check": "envelope",
312
+ "valid": true,
313
+ "value": {
314
+ "sessionId": "ses_fixture",
315
+ "epoch": "epoch-1",
316
+ "seq": 3,
317
+ "cursor": 12,
318
+ "ts": "2026-10-15T00:00:00.000Z",
319
+ "event": {
320
+ "type": "prompt.accepted",
321
+ "clientMessageId": "m-1",
322
+ "result": "turn",
323
+ "turnId": "turn-1"
324
+ }
325
+ }
326
+ },
327
+ {
328
+ "name": "event prompt.failed",
329
+ "check": "envelope",
330
+ "valid": true,
331
+ "value": {
332
+ "sessionId": "ses_fixture",
333
+ "epoch": "epoch-1",
334
+ "seq": 3,
335
+ "cursor": 12,
336
+ "ts": "2026-10-15T00:00:00.000Z",
337
+ "event": {
338
+ "type": "prompt.failed",
339
+ "clientMessageId": "m-2",
340
+ "error": {
341
+ "message": "unknown",
342
+ "code": "outcome_unknown"
343
+ }
344
+ }
345
+ }
346
+ },
347
+ {
348
+ "name": "event turn.started",
349
+ "check": "envelope",
350
+ "valid": true,
351
+ "value": {
352
+ "sessionId": "ses_fixture",
353
+ "epoch": "epoch-1",
354
+ "seq": 3,
355
+ "cursor": 12,
356
+ "ts": "2026-10-15T00:00:00.000Z",
357
+ "event": {
358
+ "type": "turn.started",
359
+ "turnId": "turn-1",
360
+ "origin": "user"
361
+ }
362
+ }
363
+ },
364
+ {
365
+ "name": "event turn.ended canceled",
366
+ "check": "envelope",
367
+ "valid": true,
368
+ "value": {
369
+ "sessionId": "ses_fixture",
370
+ "epoch": "epoch-1",
371
+ "seq": 3,
372
+ "cursor": 12,
373
+ "ts": "2026-10-15T00:00:00.000Z",
374
+ "event": {
375
+ "type": "turn.ended",
376
+ "turnId": "turn-1",
377
+ "state": "canceled"
378
+ }
379
+ }
380
+ },
381
+ {
382
+ "name": "event turn.ended failed",
383
+ "check": "envelope",
384
+ "valid": true,
385
+ "value": {
386
+ "sessionId": "ses_fixture",
387
+ "epoch": "epoch-1",
388
+ "seq": 3,
389
+ "cursor": 12,
390
+ "ts": "2026-10-15T00:00:00.000Z",
391
+ "event": {
392
+ "type": "turn.ended",
393
+ "turnId": "turn-2",
394
+ "state": "failed",
395
+ "error": {
396
+ "message": "alpd stopped while this session was working",
397
+ "code": "daemon_restarted"
398
+ }
399
+ }
400
+ }
401
+ },
402
+ {
403
+ "name": "event mail",
404
+ "check": "envelope",
405
+ "valid": true,
406
+ "value": {
407
+ "sessionId": "ses_fixture",
408
+ "epoch": "epoch-1",
409
+ "seq": 3,
410
+ "cursor": 12,
411
+ "ts": "2026-10-15T00:00:00.000Z",
412
+ "event": {
413
+ "type": "mail",
414
+ "mail": {
415
+ "id": "mail-1",
416
+ "kind": "note",
417
+ "from": "user",
418
+ "assignment": "ses_child",
419
+ "body": "xin chào"
420
+ }
421
+ }
422
+ }
423
+ },
424
+ {
425
+ "name": "event assignment",
426
+ "check": "envelope",
427
+ "valid": true,
428
+ "value": {
429
+ "sessionId": "ses_fixture",
430
+ "epoch": "epoch-1",
431
+ "seq": 3,
432
+ "cursor": 12,
433
+ "ts": "2026-10-15T00:00:00.000Z",
434
+ "event": {
435
+ "type": "assignment",
436
+ "assignment": {
437
+ "id": "ses_child",
438
+ "agent": "peer",
439
+ "mode": "workspace-write",
440
+ "status": "running",
441
+ "startedAt": "2026-10-15T00:00:00.000Z",
442
+ "worktree": {
443
+ "branch": "alp/peer",
444
+ "path": "/work/wt"
445
+ }
446
+ }
447
+ }
448
+ }
449
+ },
450
+ {
451
+ "name": "event question",
452
+ "check": "envelope",
453
+ "valid": true,
454
+ "value": {
455
+ "sessionId": "ses_fixture",
456
+ "epoch": "epoch-1",
457
+ "seq": 3,
458
+ "cursor": 12,
459
+ "ts": "2026-10-15T00:00:00.000Z",
460
+ "event": {
461
+ "type": "question",
462
+ "question": {
463
+ "id": "q_1",
464
+ "sessionId": "ses_fixture",
465
+ "rootId": "ses_fixture",
466
+ "agent": "main",
467
+ "body": "Tiếp tục?",
468
+ "options": [
469
+ "có",
470
+ "không"
471
+ ],
472
+ "askedAt": "2026-10-15T00:00:00.000Z"
473
+ }
474
+ }
475
+ }
476
+ },
477
+ {
478
+ "name": "event question.resolved",
479
+ "check": "envelope",
480
+ "valid": true,
481
+ "value": {
482
+ "sessionId": "ses_fixture",
483
+ "epoch": "epoch-1",
484
+ "seq": 3,
485
+ "cursor": 12,
486
+ "ts": "2026-10-15T00:00:00.000Z",
487
+ "event": {
488
+ "type": "question.resolved",
489
+ "questionId": "q_1",
490
+ "outcome": "answered",
491
+ "answer": "có"
492
+ }
493
+ }
494
+ },
495
+ {
496
+ "name": "event pin",
497
+ "check": "envelope",
498
+ "valid": true,
499
+ "value": {
500
+ "sessionId": "ses_fixture",
501
+ "epoch": "epoch-1",
502
+ "seq": 3,
503
+ "cursor": 12,
504
+ "ts": "2026-10-15T00:00:00.000Z",
505
+ "event": {
506
+ "type": "pin",
507
+ "pin": {
508
+ "id": "pin_1",
509
+ "project": "/work/project",
510
+ "kind": "claim",
511
+ "body": "Đang sửa server",
512
+ "paths": [
513
+ "src/server.ts"
514
+ ],
515
+ "agent": "peer",
516
+ "sessionId": "ses_child",
517
+ "rootId": "ses_fixture",
518
+ "at": "2026-10-15T00:00:00.000Z"
519
+ }
520
+ }
521
+ }
522
+ },
523
+ {
524
+ "name": "event unpin",
525
+ "check": "envelope",
526
+ "valid": true,
527
+ "value": {
528
+ "sessionId": "ses_fixture",
529
+ "epoch": "epoch-1",
530
+ "seq": 3,
531
+ "cursor": 12,
532
+ "ts": "2026-10-15T00:00:00.000Z",
533
+ "event": {
534
+ "type": "unpin",
535
+ "pinId": "pin_1",
536
+ "reason": "session_ended"
537
+ }
538
+ }
539
+ },
540
+ {
541
+ "name": "item user_message",
542
+ "check": "envelope",
543
+ "valid": true,
544
+ "value": {
545
+ "sessionId": "ses_fixture",
546
+ "epoch": "epoch-1",
547
+ "seq": 3,
548
+ "cursor": 12,
549
+ "ts": "2026-10-15T00:00:00.000Z",
550
+ "event": {
551
+ "type": "item",
552
+ "item": {
553
+ "kind": "user_message",
554
+ "id": "user:m-1",
555
+ "text": "Chào 👋",
556
+ "clientMessageId": "m-1"
557
+ }
558
+ }
559
+ }
560
+ },
561
+ {
562
+ "name": "item assistant_message",
563
+ "check": "envelope",
564
+ "valid": true,
565
+ "value": {
566
+ "sessionId": "ses_fixture",
567
+ "epoch": "epoch-1",
568
+ "seq": 3,
569
+ "cursor": 12,
570
+ "ts": "2026-10-15T00:00:00.000Z",
571
+ "event": {
572
+ "type": "item",
573
+ "item": {
574
+ "kind": "assistant_message",
575
+ "id": "msg-1",
576
+ "text": "Đã xong."
577
+ }
578
+ }
579
+ }
580
+ },
581
+ {
582
+ "name": "item notice",
583
+ "check": "envelope",
584
+ "valid": true,
585
+ "value": {
586
+ "sessionId": "ses_fixture",
587
+ "epoch": "epoch-1",
588
+ "seq": 3,
589
+ "cursor": 12,
590
+ "ts": "2026-10-15T00:00:00.000Z",
591
+ "event": {
592
+ "type": "item",
593
+ "item": {
594
+ "kind": "notice",
595
+ "id": "n-1",
596
+ "level": "warning",
597
+ "text": "Claude is paused"
598
+ }
599
+ }
600
+ }
601
+ },
602
+ {
603
+ "name": "item compaction",
604
+ "check": "envelope",
605
+ "valid": true,
606
+ "value": {
607
+ "sessionId": "ses_fixture",
608
+ "epoch": "epoch-1",
609
+ "seq": 3,
610
+ "cursor": 12,
611
+ "ts": "2026-10-15T00:00:00.000Z",
612
+ "event": {
613
+ "type": "item",
614
+ "item": {
615
+ "kind": "compaction",
616
+ "id": "c-1",
617
+ "status": "completed",
618
+ "trigger": "auto",
619
+ "preTokens": 180000,
620
+ "postTokens": 40000
621
+ }
622
+ }
623
+ }
624
+ },
625
+ {
626
+ "name": "item todo",
627
+ "check": "envelope",
628
+ "valid": true,
629
+ "value": {
630
+ "sessionId": "ses_fixture",
631
+ "epoch": "epoch-1",
632
+ "seq": 3,
633
+ "cursor": 12,
634
+ "ts": "2026-10-15T00:00:00.000Z",
635
+ "event": {
636
+ "type": "item",
637
+ "item": {
638
+ "kind": "todo",
639
+ "id": "t-1",
640
+ "items": [
641
+ {
642
+ "id": "bd-1",
643
+ "text": "Viết test",
644
+ "status": "in_progress"
645
+ }
646
+ ]
647
+ }
648
+ }
649
+ }
650
+ },
651
+ {
652
+ "name": "item tool_call shell",
653
+ "check": "envelope",
654
+ "valid": true,
655
+ "value": {
656
+ "sessionId": "ses_fixture",
657
+ "epoch": "epoch-1",
658
+ "seq": 3,
659
+ "cursor": 12,
660
+ "ts": "2026-10-15T00:00:00.000Z",
661
+ "event": {
662
+ "type": "item",
663
+ "item": {
664
+ "kind": "tool_call",
665
+ "id": "tc-1",
666
+ "callId": "call-1",
667
+ "name": "shell",
668
+ "status": "completed",
669
+ "detail": {
670
+ "type": "shell",
671
+ "command": "npm test",
672
+ "cwd": "/work/project",
673
+ "output": "ok",
674
+ "exitCode": 0
675
+ }
676
+ }
677
+ }
678
+ }
679
+ },
680
+ {
681
+ "name": "item tool_call unknown",
682
+ "check": "envelope",
683
+ "valid": true,
684
+ "value": {
685
+ "sessionId": "ses_fixture",
686
+ "epoch": "epoch-1",
687
+ "seq": 3,
688
+ "cursor": 12,
689
+ "ts": "2026-10-15T00:00:00.000Z",
690
+ "event": {
691
+ "type": "item",
692
+ "item": {
693
+ "kind": "tool_call",
694
+ "id": "tc-2",
695
+ "callId": "call-2",
696
+ "name": "alp_ask",
697
+ "status": "failed",
698
+ "error": "denied",
699
+ "detail": {
700
+ "type": "unknown",
701
+ "input": {
702
+ "to": "user"
703
+ },
704
+ "output": null
705
+ }
706
+ }
707
+ }
708
+ }
709
+ },
710
+ {
711
+ "name": "announcement without a cursor",
712
+ "check": "envelope",
713
+ "valid": true,
714
+ "value": {
715
+ "sessionId": "ses_fixture",
716
+ "epoch": "announce-2026",
717
+ "seq": 0,
718
+ "ts": "2026-10-15T00:00:00.000Z",
719
+ "event": {
720
+ "type": "question",
721
+ "question": {
722
+ "id": "q_1",
723
+ "sessionId": "ses_fixture",
724
+ "rootId": "ses_fixture",
725
+ "agent": "main",
726
+ "body": "Tiếp tục?",
727
+ "options": [
728
+ "có",
729
+ "không"
730
+ ],
731
+ "askedAt": "2026-10-15T00:00:00.000Z"
732
+ }
733
+ }
734
+ }
735
+ },
736
+ {
737
+ "name": "a future event type (receivers ignore it)",
738
+ "check": "envelope",
739
+ "valid": true,
740
+ "value": {
741
+ "sessionId": "ses_fixture",
742
+ "epoch": "epoch-1",
743
+ "seq": 3,
744
+ "cursor": 12,
745
+ "ts": "2026-10-15T00:00:00.000Z",
746
+ "event": {
747
+ "type": "tree.renamed",
748
+ "title": "x"
749
+ }
750
+ },
751
+ "projection": false
752
+ },
753
+ {
754
+ "name": "a future item kind (receivers ignore it)",
755
+ "check": "envelope",
756
+ "valid": true,
757
+ "value": {
758
+ "sessionId": "ses_fixture",
759
+ "epoch": "epoch-1",
760
+ "seq": 3,
761
+ "cursor": 12,
762
+ "ts": "2026-10-15T00:00:00.000Z",
763
+ "event": {
764
+ "type": "item",
765
+ "item": {
766
+ "kind": "image",
767
+ "id": "img-1",
768
+ "url": "x"
769
+ }
770
+ }
771
+ },
772
+ "projection": false
773
+ },
774
+ {
775
+ "name": "unknown envelope properties",
776
+ "check": "envelope",
777
+ "valid": true,
778
+ "value": {
779
+ "sessionId": "ses_fixture",
780
+ "epoch": "epoch-1",
781
+ "seq": 3,
782
+ "cursor": 12,
783
+ "ts": "2026-10-15T00:00:00.000Z",
784
+ "event": {
785
+ "type": "session.ready"
786
+ },
787
+ "trace": {
788
+ "span": "abc"
789
+ }
790
+ },
791
+ "projection": false
792
+ },
793
+ {
794
+ "name": "negative seq",
795
+ "check": "envelope",
796
+ "valid": false,
797
+ "value": {
798
+ "sessionId": "ses_fixture",
799
+ "epoch": "epoch-1",
800
+ "seq": -1,
801
+ "cursor": 12,
802
+ "ts": "2026-10-15T00:00:00.000Z",
803
+ "event": {
804
+ "type": "session.ready"
805
+ }
806
+ }
807
+ },
808
+ {
809
+ "name": "cursor 0",
810
+ "check": "envelope",
811
+ "valid": false,
812
+ "value": {
813
+ "sessionId": "ses_fixture",
814
+ "epoch": "epoch-1",
815
+ "seq": 3,
816
+ "cursor": 0,
817
+ "ts": "2026-10-15T00:00:00.000Z",
818
+ "event": {
819
+ "type": "session.ready"
820
+ }
821
+ }
822
+ },
823
+ {
824
+ "name": "item event without its item",
825
+ "check": "envelope",
826
+ "valid": false,
827
+ "value": {
828
+ "sessionId": "ses_fixture",
829
+ "epoch": "epoch-1",
830
+ "seq": 3,
831
+ "cursor": 12,
832
+ "ts": "2026-10-15T00:00:00.000Z",
833
+ "event": {
834
+ "type": "item"
835
+ }
836
+ }
837
+ },
838
+ {
839
+ "name": "known item kind missing fields",
840
+ "check": "envelope",
841
+ "valid": false,
842
+ "value": {
843
+ "sessionId": "ses_fixture",
844
+ "epoch": "epoch-1",
845
+ "seq": 3,
846
+ "cursor": 12,
847
+ "ts": "2026-10-15T00:00:00.000Z",
848
+ "event": {
849
+ "type": "item",
850
+ "item": {
851
+ "kind": "notice",
852
+ "id": "n"
853
+ }
854
+ }
855
+ }
856
+ },
857
+ {
858
+ "name": "known event with a wrong enum",
859
+ "check": "envelope",
860
+ "valid": false,
861
+ "value": {
862
+ "sessionId": "ses_fixture",
863
+ "epoch": "epoch-1",
864
+ "seq": 3,
865
+ "cursor": 12,
866
+ "ts": "2026-10-15T00:00:00.000Z",
867
+ "event": {
868
+ "type": "turn.ended",
869
+ "turnId": "t",
870
+ "state": "stopped"
871
+ }
872
+ }
873
+ },
874
+ {
875
+ "name": "missing epoch",
876
+ "check": "envelope",
877
+ "valid": false,
878
+ "value": {
879
+ "sessionId": "ses_fixture",
880
+ "seq": 3,
881
+ "cursor": 12,
882
+ "ts": "2026-10-15T00:00:00.000Z",
883
+ "event": {
884
+ "type": "session.ready"
885
+ }
886
+ }
887
+ },
888
+ {
889
+ "name": "daemon.hello params",
890
+ "check": "params",
891
+ "method": "daemon.hello",
892
+ "valid": true,
893
+ "value": {
894
+ "protocolVersion": 1,
895
+ "client": {
896
+ "name": "paseo",
897
+ "version": "0.10.0"
898
+ }
899
+ }
900
+ },
901
+ {
902
+ "name": "daemon.hello without client",
903
+ "check": "params",
904
+ "method": "daemon.hello",
905
+ "valid": true,
906
+ "value": {
907
+ "protocolVersion": 1
908
+ }
909
+ },
910
+ {
911
+ "name": "daemon.hello with a string client",
912
+ "check": "params",
913
+ "method": "daemon.hello",
914
+ "valid": false,
915
+ "value": {
916
+ "protocolVersion": 1,
917
+ "client": "paseo"
918
+ }
919
+ },
920
+ {
921
+ "name": "daemon.hello result",
922
+ "check": "result",
923
+ "method": "daemon.hello",
924
+ "valid": true,
925
+ "value": {
926
+ "protocolVersion": 1,
927
+ "daemonVersion": "0.10.0",
928
+ "pid": 42,
929
+ "capabilities": [
930
+ "attach.after",
931
+ "prompt.receipts",
932
+ "extension.methods"
933
+ ]
934
+ }
935
+ },
936
+ {
937
+ "name": "daemon.hello from a daemon before capabilities",
938
+ "check": "result",
939
+ "method": "daemon.hello",
940
+ "valid": true,
941
+ "value": {
942
+ "protocolVersion": 1,
943
+ "daemonVersion": "0.9.5",
944
+ "pid": 42
945
+ }
946
+ },
947
+ {
948
+ "name": "daemon.status params",
949
+ "check": "params",
950
+ "method": "daemon.status",
951
+ "valid": true,
952
+ "value": {}
953
+ },
954
+ {
955
+ "name": "daemon.status result",
956
+ "check": "result",
957
+ "method": "daemon.status",
958
+ "valid": true,
959
+ "value": {
960
+ "pid": 42,
961
+ "startedAt": "2026-10-15T00:00:00.000Z",
962
+ "version": "0.10.0",
963
+ "protocolVersion": 1,
964
+ "sessions": 1,
965
+ "questions": 0,
966
+ "previousExit": {
967
+ "kind": "clean"
968
+ },
969
+ "persistence": {
970
+ "failing": 0
971
+ },
972
+ "health": {
973
+ "live": true,
974
+ "ready": true,
975
+ "checks": [
976
+ {
977
+ "id": "accepting",
978
+ "ok": true
979
+ }
980
+ ]
981
+ }
982
+ }
983
+ },
984
+ {
985
+ "name": "daemon.status result without health",
986
+ "check": "result",
987
+ "method": "daemon.status",
988
+ "valid": false,
989
+ "value": {
990
+ "pid": 42,
991
+ "startedAt": "2026-10-15T00:00:00.000Z",
992
+ "version": "0.10.0",
993
+ "protocolVersion": 1,
994
+ "sessions": 1,
995
+ "questions": 0
996
+ }
997
+ },
998
+ {
999
+ "name": "daemon.shutdown params",
1000
+ "check": "params",
1001
+ "method": "daemon.shutdown",
1002
+ "valid": true,
1003
+ "value": {}
1004
+ },
1005
+ {
1006
+ "name": "daemon.shutdown result",
1007
+ "check": "result",
1008
+ "method": "daemon.shutdown",
1009
+ "valid": true,
1010
+ "value": {}
1011
+ },
1012
+ {
1013
+ "name": "daemon.pause params",
1014
+ "check": "params",
1015
+ "method": "daemon.pause",
1016
+ "valid": true,
1017
+ "value": {
1018
+ "runtime": "claude",
1019
+ "now": true,
1020
+ "reason": "tối nay"
1021
+ }
1022
+ },
1023
+ {
1024
+ "name": "daemon.pause with an unknown runtime",
1025
+ "check": "params",
1026
+ "method": "daemon.pause",
1027
+ "valid": false,
1028
+ "value": {
1029
+ "runtime": "gemini"
1030
+ }
1031
+ },
1032
+ {
1033
+ "name": "daemon.pause result",
1034
+ "check": "result",
1035
+ "method": "daemon.pause",
1036
+ "valid": true,
1037
+ "value": {
1038
+ "runtimes": {
1039
+ "claude": {
1040
+ "since": "2026-10-15T00:00:00.000Z",
1041
+ "by": "the user",
1042
+ "reason": "limit",
1043
+ "resetsAt": "2026-10-15T00:00:00.000Z"
1044
+ }
1045
+ },
1046
+ "parked": [
1047
+ {
1048
+ "assignmentId": "a_1",
1049
+ "agent": "peer",
1050
+ "runtime": "claude",
1051
+ "rootId": "ses_fixture",
1052
+ "reason": "limit",
1053
+ "since": "2026-10-15T00:00:00.000Z"
1054
+ }
1055
+ ]
1056
+ }
1057
+ },
1058
+ {
1059
+ "name": "daemon.resume params",
1060
+ "check": "params",
1061
+ "method": "daemon.resume",
1062
+ "valid": true,
1063
+ "value": {
1064
+ "runtime": "codex"
1065
+ }
1066
+ },
1067
+ {
1068
+ "name": "daemon.resume result",
1069
+ "check": "result",
1070
+ "method": "daemon.resume",
1071
+ "valid": true,
1072
+ "value": {
1073
+ "runtimes": {},
1074
+ "parked": []
1075
+ }
1076
+ },
1077
+ {
1078
+ "name": "daemon.pauses params",
1079
+ "check": "params",
1080
+ "method": "daemon.pauses",
1081
+ "valid": true,
1082
+ "value": {}
1083
+ },
1084
+ {
1085
+ "name": "daemon.pauses result",
1086
+ "check": "result",
1087
+ "method": "daemon.pauses",
1088
+ "valid": true,
1089
+ "value": {
1090
+ "all": {
1091
+ "since": "2026-10-15T00:00:00.000Z",
1092
+ "by": "the user",
1093
+ "reason": "paused by the user"
1094
+ },
1095
+ "runtimes": {},
1096
+ "parked": []
1097
+ }
1098
+ },
1099
+ {
1100
+ "name": "daemon.usage params",
1101
+ "check": "params",
1102
+ "method": "daemon.usage",
1103
+ "valid": true,
1104
+ "value": {
1105
+ "refresh": true
1106
+ }
1107
+ },
1108
+ {
1109
+ "name": "daemon.usage result",
1110
+ "check": "result",
1111
+ "method": "daemon.usage",
1112
+ "valid": true,
1113
+ "value": {
1114
+ "providers": [
1115
+ {
1116
+ "runtime": "codex",
1117
+ "pause": null,
1118
+ "parked": 0
1119
+ }
1120
+ ]
1121
+ }
1122
+ },
1123
+ {
1124
+ "name": "catalog.get params",
1125
+ "check": "params",
1126
+ "method": "catalog.get",
1127
+ "valid": true,
1128
+ "value": {}
1129
+ },
1130
+ {
1131
+ "name": "catalog.get result",
1132
+ "check": "result",
1133
+ "method": "catalog.get",
1134
+ "valid": true,
1135
+ "value": {
1136
+ "models": [
1137
+ {
1138
+ "id": "codex:gpt-6.1-sol",
1139
+ "label": "Codex · GPT-6.1-Sol"
1140
+ }
1141
+ ],
1142
+ "modes": [
1143
+ {
1144
+ "id": "read-only",
1145
+ "label": "Read only"
1146
+ }
1147
+ ],
1148
+ "thinkingOptions": [
1149
+ {
1150
+ "id": "low",
1151
+ "label": "low"
1152
+ }
1153
+ ],
1154
+ "defaultModel": "codex:gpt-6.1-sol"
1155
+ }
1156
+ },
1157
+ {
1158
+ "name": "assignment.recall params",
1159
+ "check": "params",
1160
+ "method": "assignment.recall",
1161
+ "valid": true,
1162
+ "value": {
1163
+ "assignmentId": "a_1",
1164
+ "question": "Bạn đã sửa gì?"
1165
+ }
1166
+ },
1167
+ {
1168
+ "name": "assignment.recall without a question",
1169
+ "check": "params",
1170
+ "method": "assignment.recall",
1171
+ "valid": false,
1172
+ "value": {
1173
+ "assignmentId": "a_1"
1174
+ }
1175
+ },
1176
+ {
1177
+ "name": "assignment.recall result",
1178
+ "check": "result",
1179
+ "method": "assignment.recall",
1180
+ "valid": true,
1181
+ "value": {
1182
+ "assignmentId": "a_1",
1183
+ "agent": "peer",
1184
+ "taskId": "bd-1",
1185
+ "finishedAt": "2026-10-15T00:00:00.000Z",
1186
+ "answer": "Đã sửa server.ts"
1187
+ }
1188
+ },
1189
+ {
1190
+ "name": "board.list params",
1191
+ "check": "params",
1192
+ "method": "board.list",
1193
+ "valid": true,
1194
+ "value": {
1195
+ "projectRoot": "/work/project"
1196
+ }
1197
+ },
1198
+ {
1199
+ "name": "board.list without projectRoot",
1200
+ "check": "params",
1201
+ "method": "board.list",
1202
+ "valid": false,
1203
+ "value": {}
1204
+ },
1205
+ {
1206
+ "name": "board.list result",
1207
+ "check": "result",
1208
+ "method": "board.list",
1209
+ "valid": true,
1210
+ "value": {
1211
+ "pins": [
1212
+ {
1213
+ "id": "pin_1",
1214
+ "project": "/work/project",
1215
+ "kind": "claim",
1216
+ "body": "Đang sửa server",
1217
+ "paths": [
1218
+ "src/server.ts"
1219
+ ],
1220
+ "agent": "peer",
1221
+ "sessionId": "ses_child",
1222
+ "rootId": "ses_fixture",
1223
+ "at": "2026-10-15T00:00:00.000Z"
1224
+ }
1225
+ ]
1226
+ }
1227
+ },
1228
+ {
1229
+ "name": "question.list params",
1230
+ "check": "params",
1231
+ "method": "question.list",
1232
+ "valid": true,
1233
+ "value": {
1234
+ "projectRoot": "/work/project"
1235
+ }
1236
+ },
1237
+ {
1238
+ "name": "question.list result",
1239
+ "check": "result",
1240
+ "method": "question.list",
1241
+ "valid": true,
1242
+ "value": {
1243
+ "questions": [
1244
+ {
1245
+ "id": "q_1",
1246
+ "sessionId": "ses_fixture",
1247
+ "rootId": "ses_fixture",
1248
+ "agent": "main",
1249
+ "body": "Tiếp tục?",
1250
+ "options": [
1251
+ "có",
1252
+ "không"
1253
+ ],
1254
+ "askedAt": "2026-10-15T00:00:00.000Z"
1255
+ }
1256
+ ]
1257
+ }
1258
+ },
1259
+ {
1260
+ "name": "question.answer params",
1261
+ "check": "params",
1262
+ "method": "question.answer",
1263
+ "valid": true,
1264
+ "value": {
1265
+ "questionId": "q_1",
1266
+ "text": "có"
1267
+ }
1268
+ },
1269
+ {
1270
+ "name": "question.answer dismissal",
1271
+ "check": "params",
1272
+ "method": "question.answer",
1273
+ "valid": true,
1274
+ "value": {
1275
+ "questionId": "q_1",
1276
+ "dismiss": true,
1277
+ "reason": "không cần"
1278
+ }
1279
+ },
1280
+ {
1281
+ "name": "question.answer result",
1282
+ "check": "result",
1283
+ "method": "question.answer",
1284
+ "valid": true,
1285
+ "value": {
1286
+ "questionId": "q_1"
1287
+ }
1288
+ },
1289
+ {
1290
+ "name": "session.create params",
1291
+ "check": "params",
1292
+ "method": "session.create",
1293
+ "valid": true,
1294
+ "value": {
1295
+ "sessionId": "ses_fixture",
1296
+ "spec": {
1297
+ "cwd": "/work/project",
1298
+ "model": "codex:gpt-6.1-sol",
1299
+ "persist": true,
1300
+ "mcpServers": {
1301
+ "docs": {
1302
+ "type": "http",
1303
+ "url": "https://example.invalid/mcp"
1304
+ }
1305
+ }
1306
+ },
1307
+ "history": "replay",
1308
+ "delegation": false
1309
+ }
1310
+ },
1311
+ {
1312
+ "name": "session.create with an invalid session id",
1313
+ "check": "params",
1314
+ "method": "session.create",
1315
+ "valid": false,
1316
+ "value": {
1317
+ "sessionId": "has space",
1318
+ "spec": {
1319
+ "cwd": "/work/project"
1320
+ }
1321
+ }
1322
+ },
1323
+ {
1324
+ "name": "session.create without spec.cwd",
1325
+ "check": "params",
1326
+ "method": "session.create",
1327
+ "valid": false,
1328
+ "value": {
1329
+ "spec": {}
1330
+ }
1331
+ },
1332
+ {
1333
+ "name": "session.create result",
1334
+ "check": "result",
1335
+ "method": "session.create",
1336
+ "valid": true,
1337
+ "value": {
1338
+ "session": {
1339
+ "id": "ses_fixture",
1340
+ "projectRoot": "/work/project",
1341
+ "agent": "main",
1342
+ "runtime": "codex",
1343
+ "model": "gpt-6.1-sol",
1344
+ "mode": "workspace-write",
1345
+ "thinking": "low",
1346
+ "workflow": {
1347
+ "mode": "pho",
1348
+ "maxPeers": 2,
1349
+ "supervisor": false
1350
+ },
1351
+ "teamLabel": "Phở",
1352
+ "threadId": "thread-1",
1353
+ "persistent": true,
1354
+ "busy": false
1355
+ },
1356
+ "attached": false,
1357
+ "durable": true
1358
+ }
1359
+ },
1360
+ {
1361
+ "name": "session.create result of a resume",
1362
+ "check": "result",
1363
+ "method": "session.create",
1364
+ "valid": true,
1365
+ "value": {
1366
+ "session": {
1367
+ "id": "ses_fixture",
1368
+ "projectRoot": "/work/project",
1369
+ "agent": "main",
1370
+ "runtime": "codex",
1371
+ "model": "gpt-6.1-sol",
1372
+ "mode": "workspace-write",
1373
+ "thinking": "low",
1374
+ "workflow": {
1375
+ "mode": "pho",
1376
+ "maxPeers": 2,
1377
+ "supervisor": false
1378
+ },
1379
+ "teamLabel": "Phở",
1380
+ "threadId": "thread-1",
1381
+ "persistent": true,
1382
+ "busy": false
1383
+ },
1384
+ "attached": false,
1385
+ "resumed": true,
1386
+ "durable": true
1387
+ }
1388
+ },
1389
+ {
1390
+ "name": "session.preview params",
1391
+ "check": "params",
1392
+ "method": "session.preview",
1393
+ "valid": true,
1394
+ "value": {
1395
+ "spec": {
1396
+ "cwd": "/work/project",
1397
+ "workflow": "cafe"
1398
+ }
1399
+ }
1400
+ },
1401
+ {
1402
+ "name": "session.preview result",
1403
+ "check": "result",
1404
+ "method": "session.preview",
1405
+ "valid": true,
1406
+ "value": {
1407
+ "preview": {
1408
+ "teams": [
1409
+ {
1410
+ "id": "pho",
1411
+ "label": "Phở"
1412
+ },
1413
+ {
1414
+ "id": "cafe",
1415
+ "label": "Cafe",
1416
+ "description": "Hai agent"
1417
+ }
1418
+ ],
1419
+ "team": "cafe",
1420
+ "teamLabel": "Cafe",
1421
+ "agent": "main",
1422
+ "runtime": "claude",
1423
+ "model": "claude-opus-5-5",
1424
+ "mode": "full-access",
1425
+ "thinking": "high"
1426
+ }
1427
+ }
1428
+ },
1429
+ {
1430
+ "name": "session.attach params",
1431
+ "check": "params",
1432
+ "method": "session.attach",
1433
+ "valid": true,
1434
+ "value": {
1435
+ "sessionId": "ses_fixture",
1436
+ "after": 12
1437
+ }
1438
+ },
1439
+ {
1440
+ "name": "session.attach with a negative cursor",
1441
+ "check": "params",
1442
+ "method": "session.attach",
1443
+ "valid": false,
1444
+ "value": {
1445
+ "sessionId": "ses_fixture",
1446
+ "after": -1
1447
+ }
1448
+ },
1449
+ {
1450
+ "name": "session.attach result",
1451
+ "check": "result",
1452
+ "method": "session.attach",
1453
+ "valid": true,
1454
+ "value": {
1455
+ "session": {
1456
+ "id": "ses_fixture",
1457
+ "projectRoot": "/work/project",
1458
+ "agent": "main",
1459
+ "runtime": "codex",
1460
+ "model": "gpt-6.1-sol",
1461
+ "mode": "workspace-write",
1462
+ "thinking": "low",
1463
+ "workflow": {
1464
+ "mode": "pho",
1465
+ "maxPeers": 2,
1466
+ "supervisor": false
1467
+ },
1468
+ "teamLabel": "Phở",
1469
+ "threadId": "thread-1",
1470
+ "persistent": true,
1471
+ "busy": false,
1472
+ "status": "idle",
1473
+ "title": "Sửa lỗi 😀",
1474
+ "createdAt": "2026-10-15T00:00:00.000Z",
1475
+ "updatedAt": "2026-10-15T00:00:00.000Z"
1476
+ },
1477
+ "cursor": 40
1478
+ }
1479
+ },
1480
+ {
1481
+ "name": "session.attach result of a reset",
1482
+ "check": "result",
1483
+ "method": "session.attach",
1484
+ "valid": true,
1485
+ "value": {
1486
+ "session": {
1487
+ "id": "ses_fixture",
1488
+ "projectRoot": "/work/project",
1489
+ "agent": "main",
1490
+ "runtime": "codex",
1491
+ "model": "gpt-6.1-sol",
1492
+ "mode": "workspace-write",
1493
+ "thinking": "low",
1494
+ "workflow": {
1495
+ "mode": "pho",
1496
+ "maxPeers": 2,
1497
+ "supervisor": false
1498
+ },
1499
+ "teamLabel": "Phở",
1500
+ "threadId": "thread-1",
1501
+ "persistent": true,
1502
+ "busy": false,
1503
+ "status": "idle",
1504
+ "title": "Sửa lỗi 😀",
1505
+ "createdAt": "2026-10-15T00:00:00.000Z",
1506
+ "updatedAt": "2026-10-15T00:00:00.000Z"
1507
+ },
1508
+ "cursor": 40,
1509
+ "reset": true
1510
+ }
1511
+ },
1512
+ {
1513
+ "name": "session.attach result with reset false",
1514
+ "check": "result",
1515
+ "method": "session.attach",
1516
+ "valid": false,
1517
+ "value": {
1518
+ "session": {
1519
+ "id": "ses_fixture",
1520
+ "projectRoot": "/work/project",
1521
+ "agent": "main",
1522
+ "runtime": "codex",
1523
+ "model": "gpt-6.1-sol",
1524
+ "mode": "workspace-write",
1525
+ "thinking": "low",
1526
+ "workflow": {
1527
+ "mode": "pho",
1528
+ "maxPeers": 2,
1529
+ "supervisor": false
1530
+ },
1531
+ "teamLabel": "Phở",
1532
+ "threadId": "thread-1",
1533
+ "persistent": true,
1534
+ "busy": false,
1535
+ "status": "idle",
1536
+ "title": "Sửa lỗi 😀",
1537
+ "createdAt": "2026-10-15T00:00:00.000Z",
1538
+ "updatedAt": "2026-10-15T00:00:00.000Z"
1539
+ },
1540
+ "cursor": 40,
1541
+ "reset": false
1542
+ }
1543
+ },
1544
+ {
1545
+ "name": "session.release params",
1546
+ "check": "params",
1547
+ "method": "session.release",
1548
+ "valid": true,
1549
+ "value": {
1550
+ "sessionId": "ses_fixture"
1551
+ }
1552
+ },
1553
+ {
1554
+ "name": "session.release result",
1555
+ "check": "result",
1556
+ "method": "session.release",
1557
+ "valid": true,
1558
+ "value": {
1559
+ "closed": true
1560
+ }
1561
+ },
1562
+ {
1563
+ "name": "session.prompt params",
1564
+ "check": "params",
1565
+ "method": "session.prompt",
1566
+ "valid": true,
1567
+ "value": {
1568
+ "sessionId": "ses_fixture",
1569
+ "clientMessageId": "m-1",
1570
+ "delivery": "steer",
1571
+ "content": [
1572
+ {
1573
+ "type": "text",
1574
+ "text": "Dừng lại 🛑"
1575
+ }
1576
+ ]
1577
+ }
1578
+ },
1579
+ {
1580
+ "name": "session.prompt with string content",
1581
+ "check": "params",
1582
+ "method": "session.prompt",
1583
+ "valid": false,
1584
+ "value": {
1585
+ "sessionId": "ses_fixture",
1586
+ "clientMessageId": "m-1",
1587
+ "content": "text"
1588
+ }
1589
+ },
1590
+ {
1591
+ "name": "session.prompt with an unknown delivery",
1592
+ "check": "params",
1593
+ "method": "session.prompt",
1594
+ "valid": false,
1595
+ "value": {
1596
+ "sessionId": "ses_fixture",
1597
+ "clientMessageId": "m-1",
1598
+ "delivery": "later",
1599
+ "content": []
1600
+ }
1601
+ },
1602
+ {
1603
+ "name": "session.prompt result",
1604
+ "check": "result",
1605
+ "method": "session.prompt",
1606
+ "valid": true,
1607
+ "value": {
1608
+ "outcome": "accepted",
1609
+ "durable": true
1610
+ }
1611
+ },
1612
+ {
1613
+ "name": "session.prompt result of a repeat",
1614
+ "check": "result",
1615
+ "method": "session.prompt",
1616
+ "valid": true,
1617
+ "value": {
1618
+ "outcome": "accepted",
1619
+ "duplicate": true,
1620
+ "durable": true
1621
+ }
1622
+ },
1623
+ {
1624
+ "name": "session.prompt result of a refused prompt",
1625
+ "check": "result",
1626
+ "method": "session.prompt",
1627
+ "valid": true,
1628
+ "value": {
1629
+ "outcome": "failed",
1630
+ "error": {
1631
+ "message": "Session is busy"
1632
+ },
1633
+ "durable": true
1634
+ }
1635
+ },
1636
+ {
1637
+ "name": "session.prompt result without receipts",
1638
+ "check": "result",
1639
+ "method": "session.prompt",
1640
+ "valid": true,
1641
+ "value": {}
1642
+ },
1643
+ {
1644
+ "name": "session.interrupt params",
1645
+ "check": "params",
1646
+ "method": "session.interrupt",
1647
+ "valid": true,
1648
+ "value": {
1649
+ "sessionId": "ses_fixture"
1650
+ }
1651
+ },
1652
+ {
1653
+ "name": "session.interrupt result",
1654
+ "check": "result",
1655
+ "method": "session.interrupt",
1656
+ "valid": true,
1657
+ "value": {}
1658
+ },
1659
+ {
1660
+ "name": "session.configure params",
1661
+ "check": "params",
1662
+ "method": "session.configure",
1663
+ "valid": true,
1664
+ "value": {
1665
+ "sessionId": "ses_fixture",
1666
+ "mode": "read-only"
1667
+ }
1668
+ },
1669
+ {
1670
+ "name": "session.configure without mode",
1671
+ "check": "params",
1672
+ "method": "session.configure",
1673
+ "valid": true,
1674
+ "value": {
1675
+ "sessionId": "ses_fixture"
1676
+ }
1677
+ },
1678
+ {
1679
+ "name": "session.configure result",
1680
+ "check": "result",
1681
+ "method": "session.configure",
1682
+ "valid": true,
1683
+ "value": {
1684
+ "session": {
1685
+ "id": "ses_fixture",
1686
+ "projectRoot": "/work/project",
1687
+ "agent": "main",
1688
+ "runtime": "codex",
1689
+ "model": "gpt-6.1-sol",
1690
+ "mode": "workspace-write",
1691
+ "thinking": "low",
1692
+ "workflow": {
1693
+ "mode": "pho",
1694
+ "maxPeers": 2,
1695
+ "supervisor": false
1696
+ },
1697
+ "teamLabel": "Phở",
1698
+ "threadId": "thread-1",
1699
+ "persistent": true,
1700
+ "busy": false
1701
+ }
1702
+ }
1703
+ },
1704
+ {
1705
+ "name": "session.close params",
1706
+ "check": "params",
1707
+ "method": "session.close",
1708
+ "valid": true,
1709
+ "value": {
1710
+ "sessionId": "ses_fixture"
1711
+ }
1712
+ },
1713
+ {
1714
+ "name": "session.close result",
1715
+ "check": "result",
1716
+ "method": "session.close",
1717
+ "valid": true,
1718
+ "value": {}
1719
+ },
1720
+ {
1721
+ "name": "session.rename with 200 astral characters",
1722
+ "check": "params",
1723
+ "method": "session.rename",
1724
+ "valid": true,
1725
+ "value": {
1726
+ "sessionId": "ses_fixture",
1727
+ "title": "😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀"
1728
+ }
1729
+ },
1730
+ {
1731
+ "name": "session.rename with 201 characters",
1732
+ "check": "params",
1733
+ "method": "session.rename",
1734
+ "valid": false,
1735
+ "value": {
1736
+ "sessionId": "ses_fixture",
1737
+ "title": "😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀"
1738
+ }
1739
+ },
1740
+ {
1741
+ "name": "session.rename with a blank title",
1742
+ "check": "params",
1743
+ "method": "session.rename",
1744
+ "valid": false,
1745
+ "value": {
1746
+ "sessionId": "ses_fixture",
1747
+ "title": " "
1748
+ }
1749
+ },
1750
+ {
1751
+ "name": "session.rename result",
1752
+ "check": "result",
1753
+ "method": "session.rename",
1754
+ "valid": true,
1755
+ "value": {
1756
+ "session": {
1757
+ "id": "ses_fixture",
1758
+ "projectRoot": "/work/project",
1759
+ "agent": "main",
1760
+ "runtime": "codex",
1761
+ "model": "gpt-6.1-sol",
1762
+ "mode": "workspace-write",
1763
+ "thinking": "low",
1764
+ "workflow": {
1765
+ "mode": "pho",
1766
+ "maxPeers": 2,
1767
+ "supervisor": false
1768
+ },
1769
+ "teamLabel": "Phở",
1770
+ "threadId": "thread-1",
1771
+ "persistent": true,
1772
+ "busy": false,
1773
+ "status": "idle",
1774
+ "title": "Sửa lỗi 😀",
1775
+ "createdAt": "2026-10-15T00:00:00.000Z",
1776
+ "updatedAt": "2026-10-15T00:00:00.000Z"
1777
+ }
1778
+ }
1779
+ },
1780
+ {
1781
+ "name": "session.archive params",
1782
+ "check": "params",
1783
+ "method": "session.archive",
1784
+ "valid": true,
1785
+ "value": {
1786
+ "sessionId": "ses_fixture",
1787
+ "archived": false
1788
+ }
1789
+ },
1790
+ {
1791
+ "name": "session.archive result",
1792
+ "check": "result",
1793
+ "method": "session.archive",
1794
+ "valid": true,
1795
+ "value": {
1796
+ "session": {
1797
+ "id": "ses_fixture",
1798
+ "projectRoot": "/work/project",
1799
+ "agent": "main",
1800
+ "runtime": "codex",
1801
+ "model": "gpt-6.1-sol",
1802
+ "mode": "workspace-write",
1803
+ "thinking": "low",
1804
+ "workflow": {
1805
+ "mode": "pho",
1806
+ "maxPeers": 2,
1807
+ "supervisor": false
1808
+ },
1809
+ "teamLabel": "Phở",
1810
+ "threadId": "thread-1",
1811
+ "persistent": true,
1812
+ "busy": false,
1813
+ "status": "closed",
1814
+ "title": "Sửa lỗi 😀",
1815
+ "createdAt": "2026-10-15T00:00:00.000Z",
1816
+ "updatedAt": "2026-10-15T00:00:00.000Z",
1817
+ "archived": true
1818
+ }
1819
+ }
1820
+ },
1821
+ {
1822
+ "name": "session.get params",
1823
+ "check": "params",
1824
+ "method": "session.get",
1825
+ "valid": true,
1826
+ "value": {
1827
+ "sessionId": "ses_fixture"
1828
+ }
1829
+ },
1830
+ {
1831
+ "name": "session.get with a null session id",
1832
+ "check": "params",
1833
+ "method": "session.get",
1834
+ "valid": false,
1835
+ "value": {
1836
+ "sessionId": null
1837
+ }
1838
+ },
1839
+ {
1840
+ "name": "session.get result",
1841
+ "check": "result",
1842
+ "method": "session.get",
1843
+ "valid": true,
1844
+ "value": {
1845
+ "session": {
1846
+ "id": "ses_fixture",
1847
+ "projectRoot": "/work/project",
1848
+ "agent": "main",
1849
+ "runtime": "codex",
1850
+ "model": "gpt-6.1-sol",
1851
+ "mode": "workspace-write",
1852
+ "thinking": "low",
1853
+ "workflow": {
1854
+ "mode": "pho",
1855
+ "maxPeers": 2,
1856
+ "supervisor": false
1857
+ },
1858
+ "teamLabel": "Phở",
1859
+ "threadId": "thread-1",
1860
+ "persistent": true,
1861
+ "busy": false,
1862
+ "status": "error",
1863
+ "title": "Sửa lỗi 😀",
1864
+ "createdAt": "2026-10-15T00:00:00.000Z",
1865
+ "updatedAt": "2026-10-15T00:00:00.000Z",
1866
+ "lastError": {
1867
+ "code": "daemon_restarted",
1868
+ "message": "alpd stopped"
1869
+ }
1870
+ }
1871
+ }
1872
+ },
1873
+ {
1874
+ "name": "session.get result with an unknown status",
1875
+ "check": "result",
1876
+ "method": "session.get",
1877
+ "valid": false,
1878
+ "value": {
1879
+ "session": {
1880
+ "id": "ses_fixture",
1881
+ "projectRoot": "/work/project",
1882
+ "agent": "main",
1883
+ "runtime": "codex",
1884
+ "model": "gpt-6.1-sol",
1885
+ "mode": "workspace-write",
1886
+ "thinking": "low",
1887
+ "workflow": {
1888
+ "mode": "pho",
1889
+ "maxPeers": 2,
1890
+ "supervisor": false
1891
+ },
1892
+ "teamLabel": "Phở",
1893
+ "threadId": "thread-1",
1894
+ "persistent": true,
1895
+ "busy": false,
1896
+ "status": "paused",
1897
+ "title": "Sửa lỗi 😀",
1898
+ "createdAt": "2026-10-15T00:00:00.000Z",
1899
+ "updatedAt": "2026-10-15T00:00:00.000Z"
1900
+ }
1901
+ }
1902
+ },
1903
+ {
1904
+ "name": "session.list params",
1905
+ "check": "params",
1906
+ "method": "session.list",
1907
+ "valid": true,
1908
+ "value": {
1909
+ "projectRoot": "/work/project",
1910
+ "rootsOnly": true,
1911
+ "includeClosed": true,
1912
+ "includeArchived": false
1913
+ }
1914
+ },
1915
+ {
1916
+ "name": "session.list with a null projectRoot",
1917
+ "check": "params",
1918
+ "method": "session.list",
1919
+ "valid": false,
1920
+ "value": {
1921
+ "projectRoot": null
1922
+ }
1923
+ },
1924
+ {
1925
+ "name": "session.list result",
1926
+ "check": "result",
1927
+ "method": "session.list",
1928
+ "valid": true,
1929
+ "value": {
1930
+ "sessions": [
1931
+ {
1932
+ "id": "ses_fixture",
1933
+ "projectRoot": "/work/project",
1934
+ "agent": "main",
1935
+ "runtime": "codex",
1936
+ "model": "gpt-6.1-sol",
1937
+ "mode": "workspace-write",
1938
+ "thinking": "low",
1939
+ "workflow": {
1940
+ "mode": "pho",
1941
+ "maxPeers": 2,
1942
+ "supervisor": false
1943
+ },
1944
+ "teamLabel": "Phở",
1945
+ "threadId": "thread-1",
1946
+ "persistent": true,
1947
+ "busy": false,
1948
+ "status": "idle",
1949
+ "title": "Sửa lỗi 😀",
1950
+ "createdAt": "2026-10-15T00:00:00.000Z",
1951
+ "updatedAt": "2026-10-15T00:00:00.000Z"
1952
+ }
1953
+ ]
1954
+ }
1955
+ },
1956
+ {
1957
+ "name": "session.status params",
1958
+ "check": "params",
1959
+ "method": "session.status",
1960
+ "valid": true,
1961
+ "value": {
1962
+ "sessionId": "ses_fixture"
1963
+ }
1964
+ },
1965
+ {
1966
+ "name": "session.status result",
1967
+ "check": "result",
1968
+ "method": "session.status",
1969
+ "valid": true,
1970
+ "value": {
1971
+ "status": {
1972
+ "rootId": "ses_fixture",
1973
+ "sessions": [
1974
+ {
1975
+ "id": "ses_fixture",
1976
+ "projectRoot": "/work/project",
1977
+ "agent": "main",
1978
+ "runtime": "codex",
1979
+ "model": "gpt-6.1-sol",
1980
+ "mode": "workspace-write",
1981
+ "thinking": "low",
1982
+ "workflow": {
1983
+ "mode": "pho",
1984
+ "maxPeers": 2,
1985
+ "supervisor": false
1986
+ },
1987
+ "teamLabel": "Phở",
1988
+ "threadId": "thread-1",
1989
+ "persistent": true,
1990
+ "busy": false,
1991
+ "state": "waiting_user",
1992
+ "idleMs": 1200,
1993
+ "workdir": "/work/project",
1994
+ "unreadMail": 0
1995
+ }
1996
+ ],
1997
+ "assignments": [
1998
+ {
1999
+ "id": "ses_child",
2000
+ "agent": "peer",
2001
+ "mode": "workspace-write",
2002
+ "status": "running",
2003
+ "startedAt": "2026-10-15T00:00:00.000Z",
2004
+ "requester": "ses_fixture",
2005
+ "isolation": "shared",
2006
+ "idleMs": 5
2007
+ }
2008
+ ],
2009
+ "questions": [
2010
+ {
2011
+ "id": "q_1",
2012
+ "sessionId": "ses_fixture",
2013
+ "rootId": "ses_fixture",
2014
+ "agent": "main",
2015
+ "body": "Tiếp tục?",
2016
+ "options": [
2017
+ "có",
2018
+ "không"
2019
+ ],
2020
+ "askedAt": "2026-10-15T00:00:00.000Z"
2021
+ }
2022
+ ],
2023
+ "worktrees": [],
2024
+ "leases": [
2025
+ {
2026
+ "checkout": "/work/project",
2027
+ "assignmentId": "ses_child",
2028
+ "agent": "peer"
2029
+ }
2030
+ ],
2031
+ "claims": [
2032
+ {
2033
+ "id": "pin_1",
2034
+ "project": "/work/project",
2035
+ "kind": "claim",
2036
+ "body": "Đang sửa server",
2037
+ "paths": [
2038
+ "src/server.ts"
2039
+ ],
2040
+ "agent": "peer",
2041
+ "sessionId": "ses_child",
2042
+ "rootId": "ses_fixture",
2043
+ "at": "2026-10-15T00:00:00.000Z"
2044
+ }
2045
+ ]
2046
+ }
2047
+ }
2048
+ },
2049
+ {
2050
+ "name": "session.message params",
2051
+ "check": "params",
2052
+ "method": "session.message",
2053
+ "valid": true,
2054
+ "value": {
2055
+ "sessionId": "ses_fixture",
2056
+ "text": "Ghi chú"
2057
+ }
2058
+ },
2059
+ {
2060
+ "name": "session.message result",
2061
+ "check": "result",
2062
+ "method": "session.message",
2063
+ "valid": true,
2064
+ "value": {}
2065
+ },
2066
+ {
2067
+ "name": "session.log params",
2068
+ "check": "params",
2069
+ "method": "session.log",
2070
+ "valid": true,
2071
+ "value": {
2072
+ "sessionId": "ses_fixture"
2073
+ }
2074
+ },
2075
+ {
2076
+ "name": "session.log result",
2077
+ "check": "result",
2078
+ "method": "session.log",
2079
+ "valid": true,
2080
+ "value": {
2081
+ "rootId": "ses_fixture",
2082
+ "entries": [
2083
+ {
2084
+ "ts": "2026-10-15T00:00:00.000Z",
2085
+ "event": "assignment.finished",
2086
+ "assignmentId": "a_1"
2087
+ }
2088
+ ]
2089
+ }
2090
+ },
2091
+ {
2092
+ "name": "extension.register params",
2093
+ "check": "params",
2094
+ "method": "extension.register",
2095
+ "valid": true,
2096
+ "value": {
2097
+ "method": "web.pairing"
2098
+ }
2099
+ },
2100
+ {
2101
+ "name": "extension.register result",
2102
+ "check": "result",
2103
+ "method": "extension.register",
2104
+ "valid": true,
2105
+ "value": {
2106
+ "registered": "web.pairing"
2107
+ }
2108
+ },
2109
+ {
2110
+ "name": "extension.unregister params",
2111
+ "check": "params",
2112
+ "method": "extension.unregister",
2113
+ "valid": true,
2114
+ "value": {
2115
+ "method": "web.pairing"
2116
+ }
2117
+ },
2118
+ {
2119
+ "name": "extension.unregister result",
2120
+ "check": "result",
2121
+ "method": "extension.unregister",
2122
+ "valid": true,
2123
+ "value": {
2124
+ "unregistered": "web.pairing"
2125
+ }
2126
+ },
2127
+ {
2128
+ "name": "team.list params",
2129
+ "check": "params",
2130
+ "method": "team.list",
2131
+ "valid": true,
2132
+ "value": {
2133
+ "projectRoot": "/work/project"
2134
+ }
2135
+ },
2136
+ {
2137
+ "name": "team.list without a project",
2138
+ "check": "params",
2139
+ "method": "team.list",
2140
+ "valid": true,
2141
+ "value": {}
2142
+ },
2143
+ {
2144
+ "name": "team.list with an empty projectRoot",
2145
+ "check": "params",
2146
+ "method": "team.list",
2147
+ "valid": false,
2148
+ "value": {
2149
+ "projectRoot": ""
2150
+ }
2151
+ },
2152
+ {
2153
+ "name": "team.list result",
2154
+ "check": "result",
2155
+ "method": "team.list",
2156
+ "valid": true,
2157
+ "value": {
2158
+ "projectRoot": "/work/project",
2159
+ "teams": [
2160
+ {
2161
+ "id": "pho",
2162
+ "label": "Phở",
2163
+ "source": "builtin"
2164
+ },
2165
+ {
2166
+ "id": "mine",
2167
+ "source": "library",
2168
+ "error": "agent x is missing"
2169
+ }
2170
+ ]
2171
+ }
2172
+ },
2173
+ {
2174
+ "name": "task.list params",
2175
+ "check": "params",
2176
+ "method": "task.list",
2177
+ "valid": true,
2178
+ "value": {
2179
+ "projectRoot": "/work/project"
2180
+ }
2181
+ },
2182
+ {
2183
+ "name": "task.list without projectRoot",
2184
+ "check": "params",
2185
+ "method": "task.list",
2186
+ "valid": false,
2187
+ "value": {}
2188
+ },
2189
+ {
2190
+ "name": "task.list result",
2191
+ "check": "result",
2192
+ "method": "task.list",
2193
+ "valid": true,
2194
+ "value": {
2195
+ "projectRoot": "/work/project",
2196
+ "tasks": [
2197
+ {
2198
+ "id": "t-a3f8",
2199
+ "title": "Viết test 😀",
2200
+ "type": "task",
2201
+ "priority": 2,
2202
+ "status": "open",
2203
+ "rev": 3,
2204
+ "ready": true,
2205
+ "approvals": [
2206
+ {
2207
+ "gate": "g1",
2208
+ "note": "Duyệt?"
2209
+ }
2210
+ ],
2211
+ "labels": [
2212
+ "rpc"
2213
+ ],
2214
+ "createdAt": "2026-10-15T00:00:00.000Z",
2215
+ "updatedAt": "2026-10-15T00:00:00.000Z"
2216
+ },
2217
+ {
2218
+ "id": "t-a3f8.1",
2219
+ "title": "Viết test 😀",
2220
+ "type": "task",
2221
+ "priority": 2,
2222
+ "status": "closed",
2223
+ "rev": 0,
2224
+ "ready": false,
2225
+ "approvals": [
2226
+ {
2227
+ "gate": "g1",
2228
+ "note": "Duyệt?"
2229
+ }
2230
+ ],
2231
+ "labels": [
2232
+ "rpc"
2233
+ ],
2234
+ "createdAt": "2026-10-15T00:00:00.000Z",
2235
+ "updatedAt": "2026-10-15T00:00:00.000Z",
2236
+ "closed": {
2237
+ "reason": "done",
2238
+ "at": "2026-10-15T00:00:00.000Z"
2239
+ },
2240
+ "progress": {
2241
+ "done": 1,
2242
+ "total": 2
2243
+ }
2244
+ }
2245
+ ],
2246
+ "unreadable": [
2247
+ {
2248
+ "file": ".alp/tasks/t-bad.json",
2249
+ "error": "not JSON"
2250
+ }
2251
+ ],
2252
+ "revision": "abc"
2253
+ }
2254
+ },
2255
+ {
2256
+ "name": "task.list result with an unknown status",
2257
+ "check": "result",
2258
+ "method": "task.list",
2259
+ "valid": false,
2260
+ "value": {
2261
+ "projectRoot": "/work/project",
2262
+ "tasks": [
2263
+ {
2264
+ "id": "t-a3f8",
2265
+ "title": "Viết test 😀",
2266
+ "type": "task",
2267
+ "priority": 2,
2268
+ "status": "blocked",
2269
+ "rev": 3,
2270
+ "ready": true,
2271
+ "approvals": [
2272
+ {
2273
+ "gate": "g1",
2274
+ "note": "Duyệt?"
2275
+ }
2276
+ ],
2277
+ "labels": [
2278
+ "rpc"
2279
+ ],
2280
+ "createdAt": "2026-10-15T00:00:00.000Z",
2281
+ "updatedAt": "2026-10-15T00:00:00.000Z"
2282
+ }
2283
+ ],
2284
+ "unreadable": [],
2285
+ "revision": "x"
2286
+ }
2287
+ },
2288
+ {
2289
+ "name": "task.create params",
2290
+ "check": "params",
2291
+ "method": "task.create",
2292
+ "valid": true,
2293
+ "value": {
2294
+ "projectRoot": "/work/project",
2295
+ "title": "Sửa lỗi",
2296
+ "priority": 0,
2297
+ "requestId": "req-1"
2298
+ }
2299
+ },
2300
+ {
2301
+ "name": "task.create with a blank title",
2302
+ "check": "params",
2303
+ "method": "task.create",
2304
+ "valid": false,
2305
+ "value": {
2306
+ "projectRoot": "/work/project",
2307
+ "title": " "
2308
+ }
2309
+ },
2310
+ {
2311
+ "name": "task.create with priority 5",
2312
+ "check": "params",
2313
+ "method": "task.create",
2314
+ "valid": false,
2315
+ "value": {
2316
+ "projectRoot": "/work/project",
2317
+ "title": "x",
2318
+ "priority": 5
2319
+ }
2320
+ },
2321
+ {
2322
+ "name": "task.create result",
2323
+ "check": "result",
2324
+ "method": "task.create",
2325
+ "valid": true,
2326
+ "value": {
2327
+ "id": "t-a3f8"
2328
+ }
2329
+ },
2330
+ {
2331
+ "name": "task.create result of a repeat",
2332
+ "check": "result",
2333
+ "method": "task.create",
2334
+ "valid": true,
2335
+ "value": {
2336
+ "id": "t-a3f8",
2337
+ "duplicate": true
2338
+ }
2339
+ },
2340
+ {
2341
+ "name": "task.update params",
2342
+ "check": "params",
2343
+ "method": "task.update",
2344
+ "valid": true,
2345
+ "value": {
2346
+ "projectRoot": "/work/project",
2347
+ "id": "t-a3f8",
2348
+ "action": "close",
2349
+ "note": "Xong",
2350
+ "ifRev": 3
2351
+ }
2352
+ },
2353
+ {
2354
+ "name": "task.update with action approve (that is task.gate.resolve)",
2355
+ "check": "params",
2356
+ "method": "task.update",
2357
+ "valid": false,
2358
+ "value": {
2359
+ "projectRoot": "/work/project",
2360
+ "id": "t-a3f8",
2361
+ "action": "approve"
2362
+ }
2363
+ },
2364
+ {
2365
+ "name": "task.update with an id that is not a task id",
2366
+ "check": "params",
2367
+ "method": "task.update",
2368
+ "valid": false,
2369
+ "value": {
2370
+ "projectRoot": "/work/project",
2371
+ "id": "bd-1",
2372
+ "action": "close"
2373
+ }
2374
+ },
2375
+ {
2376
+ "name": "task.update result",
2377
+ "check": "result",
2378
+ "method": "task.update",
2379
+ "valid": true,
2380
+ "value": {
2381
+ "id": "t-a3f8",
2382
+ "status": "closed",
2383
+ "rev": 4,
2384
+ "landed": "Epic t-a3f8 landed"
2385
+ }
2386
+ },
2387
+ {
2388
+ "name": "task.gate.resolve params",
2389
+ "check": "params",
2390
+ "method": "task.gate.resolve",
2391
+ "valid": true,
2392
+ "value": {
2393
+ "projectRoot": "/work/project",
2394
+ "id": "t-a3f8",
2395
+ "gate": "g1",
2396
+ "note": "OK"
2397
+ }
2398
+ },
2399
+ {
2400
+ "name": "task.gate.resolve result",
2401
+ "check": "result",
2402
+ "method": "task.gate.resolve",
2403
+ "valid": true,
2404
+ "value": {
2405
+ "id": "t-a3f8",
2406
+ "status": "open",
2407
+ "rev": 5
2408
+ }
2409
+ },
2410
+ {
2411
+ "name": "library.list params",
2412
+ "check": "params",
2413
+ "method": "library.list",
2414
+ "valid": true,
2415
+ "value": {
2416
+ "kind": "agents",
2417
+ "projectRoot": "/work/project"
2418
+ }
2419
+ },
2420
+ {
2421
+ "name": "library.list with an unknown kind",
2422
+ "check": "params",
2423
+ "method": "library.list",
2424
+ "valid": false,
2425
+ "value": {
2426
+ "kind": "plugins"
2427
+ }
2428
+ },
2429
+ {
2430
+ "name": "library.list result",
2431
+ "check": "result",
2432
+ "method": "library.list",
2433
+ "valid": true,
2434
+ "value": {
2435
+ "projectRoot": null,
2436
+ "entries": [
2437
+ {
2438
+ "name": "main",
2439
+ "source": "builtin"
2440
+ },
2441
+ {
2442
+ "name": "reviewer",
2443
+ "source": "project",
2444
+ "overrides": "library",
2445
+ "description": "Đọc lại",
2446
+ "usedBy": [
2447
+ "team pho"
2448
+ ]
2449
+ }
2450
+ ]
2451
+ }
2452
+ },
2453
+ {
2454
+ "name": "library.get params",
2455
+ "check": "params",
2456
+ "method": "library.get",
2457
+ "valid": true,
2458
+ "value": {
2459
+ "kind": "mcp",
2460
+ "name": "docs",
2461
+ "projectRoot": "/work/project",
2462
+ "scope": "project"
2463
+ }
2464
+ },
2465
+ {
2466
+ "name": "library.get with the name ..",
2467
+ "check": "params",
2468
+ "method": "library.get",
2469
+ "valid": false,
2470
+ "value": {
2471
+ "kind": "mcp",
2472
+ "name": ".."
2473
+ }
2474
+ },
2475
+ {
2476
+ "name": "library.get with a slash in the name",
2477
+ "check": "params",
2478
+ "method": "library.get",
2479
+ "valid": false,
2480
+ "value": {
2481
+ "kind": "mcp",
2482
+ "name": "a/b"
2483
+ }
2484
+ },
2485
+ {
2486
+ "name": "library.get result",
2487
+ "check": "result",
2488
+ "method": "library.get",
2489
+ "valid": true,
2490
+ "value": {
2491
+ "kind": "mcp",
2492
+ "name": "docs",
2493
+ "source": "library",
2494
+ "content": {
2495
+ "server": {
2496
+ "url": "https://example.invalid/mcp",
2497
+ "headers": {
2498
+ "Authorization": {
2499
+ "$secret": "keep"
2500
+ }
2501
+ }
2502
+ }
2503
+ },
2504
+ "revision": "r-1",
2505
+ "usedBy": [
2506
+ "agent main"
2507
+ ],
2508
+ "secrets": [
2509
+ "/server/headers/Authorization"
2510
+ ]
2511
+ }
2512
+ },
2513
+ {
2514
+ "name": "library.get result of a built-in agent",
2515
+ "check": "result",
2516
+ "method": "library.get",
2517
+ "valid": true,
2518
+ "value": {
2519
+ "kind": "agents",
2520
+ "name": "main",
2521
+ "source": "builtin",
2522
+ "content": {
2523
+ "instructions": "…"
2524
+ },
2525
+ "revision": null,
2526
+ "usedBy": [],
2527
+ "librarySkills": [
2528
+ "tdd"
2529
+ ]
2530
+ }
2531
+ },
2532
+ {
2533
+ "name": "library.save params",
2534
+ "check": "params",
2535
+ "method": "library.save",
2536
+ "valid": true,
2537
+ "value": {
2538
+ "kind": "providers",
2539
+ "name": "gemini",
2540
+ "scope": "library",
2541
+ "content": {
2542
+ "provider": {
2543
+ "kind": "acp",
2544
+ "command": "gemini",
2545
+ "env": {
2546
+ "GEMINI_API_KEY": {
2547
+ "$secret": "keep"
2548
+ }
2549
+ }
2550
+ }
2551
+ },
2552
+ "revision": "r-1"
2553
+ }
2554
+ },
2555
+ {
2556
+ "name": "library.save creating a team with sync",
2557
+ "check": "params",
2558
+ "method": "library.save",
2559
+ "valid": true,
2560
+ "value": {
2561
+ "kind": "teams",
2562
+ "name": "mine",
2563
+ "scope": "project",
2564
+ "projectRoot": "/work/project",
2565
+ "content": {
2566
+ "team": {}
2567
+ },
2568
+ "revision": null,
2569
+ "sync": "known-projects"
2570
+ }
2571
+ },
2572
+ {
2573
+ "name": "library.save with an unknown scope",
2574
+ "check": "params",
2575
+ "method": "library.save",
2576
+ "valid": false,
2577
+ "value": {
2578
+ "kind": "skills",
2579
+ "name": "tdd",
2580
+ "scope": "everywhere",
2581
+ "content": {}
2582
+ }
2583
+ },
2584
+ {
2585
+ "name": "library.save result",
2586
+ "check": "result",
2587
+ "method": "library.save",
2588
+ "valid": true,
2589
+ "value": {
2590
+ "revision": "r-2",
2591
+ "syncedProjects": 2,
2592
+ "syncErrors": []
2593
+ }
2594
+ },
2595
+ {
2596
+ "name": "library.delete params",
2597
+ "check": "params",
2598
+ "method": "library.delete",
2599
+ "valid": true,
2600
+ "value": {
2601
+ "kind": "skills",
2602
+ "name": "tdd",
2603
+ "scope": "library",
2604
+ "revision": "r-2"
2605
+ }
2606
+ },
2607
+ {
2608
+ "name": "library.delete result",
2609
+ "check": "result",
2610
+ "method": "library.delete",
2611
+ "valid": true,
2612
+ "value": {
2613
+ "removed": true,
2614
+ "now": "builtin"
2615
+ }
2616
+ },
2617
+ {
2618
+ "name": "library.duplicate params",
2619
+ "check": "params",
2620
+ "method": "library.duplicate",
2621
+ "valid": true,
2622
+ "value": {
2623
+ "kind": "agents",
2624
+ "from": "main",
2625
+ "to": "main-2",
2626
+ "scope": "library"
2627
+ }
2628
+ },
2629
+ {
2630
+ "name": "library.duplicate result",
2631
+ "check": "result",
2632
+ "method": "library.duplicate",
2633
+ "valid": true,
2634
+ "value": {
2635
+ "revision": "r-3"
2636
+ }
2637
+ },
2638
+ {
2639
+ "name": "library.rename params",
2640
+ "check": "params",
2641
+ "method": "library.rename",
2642
+ "valid": true,
2643
+ "value": {
2644
+ "kind": "agents",
2645
+ "from": "main-2",
2646
+ "to": "helper",
2647
+ "scope": "project",
2648
+ "projectRoot": "/work/project"
2649
+ }
2650
+ },
2651
+ {
2652
+ "name": "library.rename result",
2653
+ "check": "result",
2654
+ "method": "library.rename",
2655
+ "valid": true,
2656
+ "value": {
2657
+ "revision": "r-4"
2658
+ }
2659
+ },
2660
+ {
2661
+ "name": "library.skills.set params",
2662
+ "check": "params",
2663
+ "method": "library.skills.set",
2664
+ "valid": true,
2665
+ "value": {
2666
+ "agent": "main",
2667
+ "skills": [
2668
+ "tdd"
2669
+ ]
2670
+ }
2671
+ },
2672
+ {
2673
+ "name": "library.skills.set result",
2674
+ "check": "result",
2675
+ "method": "library.skills.set",
2676
+ "valid": true,
2677
+ "value": {
2678
+ "skills": [
2679
+ "tdd"
2680
+ ]
2681
+ }
2682
+ },
2683
+ {
2684
+ "name": "library.models params",
2685
+ "check": "params",
2686
+ "method": "library.models",
2687
+ "valid": true,
2688
+ "value": {}
2689
+ },
2690
+ {
2691
+ "name": "library.models result",
2692
+ "check": "result",
2693
+ "method": "library.models",
2694
+ "valid": true,
2695
+ "value": {
2696
+ "models": [
2697
+ {
2698
+ "id": "codex:gpt-6.1-sol",
2699
+ "label": "codex · GPT-6.1-Sol",
2700
+ "efforts": [
2701
+ "low",
2702
+ "high"
2703
+ ],
2704
+ "effort": "low"
2705
+ },
2706
+ {
2707
+ "id": "acp:gemini",
2708
+ "label": "Gemini · Provider default",
2709
+ "efforts": []
2710
+ }
2711
+ ]
2712
+ }
2713
+ },
2714
+ {
2715
+ "name": "settings.language.get params",
2716
+ "check": "params",
2717
+ "method": "settings.language.get",
2718
+ "valid": true,
2719
+ "value": {}
2720
+ },
2721
+ {
2722
+ "name": "settings.language.get result",
2723
+ "check": "result",
2724
+ "method": "settings.language.get",
2725
+ "valid": true,
2726
+ "value": {
2727
+ "language": null,
2728
+ "applies": "Vietnamese",
2729
+ "default": "Vietnamese"
2730
+ }
2731
+ },
2732
+ {
2733
+ "name": "settings.language.set params",
2734
+ "check": "params",
2735
+ "method": "settings.language.set",
2736
+ "valid": true,
2737
+ "value": {
2738
+ "language": "English"
2739
+ }
2740
+ },
2741
+ {
2742
+ "name": "settings.language.set clearing the language",
2743
+ "check": "params",
2744
+ "method": "settings.language.set",
2745
+ "valid": true,
2746
+ "value": {
2747
+ "language": null
2748
+ }
2749
+ },
2750
+ {
2751
+ "name": "settings.language.set without language",
2752
+ "check": "params",
2753
+ "method": "settings.language.set",
2754
+ "valid": false,
2755
+ "value": {}
2756
+ },
2757
+ {
2758
+ "name": "settings.language.set result",
2759
+ "check": "result",
2760
+ "method": "settings.language.set",
2761
+ "valid": true,
2762
+ "value": {
2763
+ "language": "English",
2764
+ "applies": "English",
2765
+ "default": "Vietnamese"
2766
+ }
2767
+ },
2768
+ {
2769
+ "name": "daemon.hello with a string protocolVersion",
2770
+ "check": "params",
2771
+ "method": "daemon.hello",
2772
+ "valid": false,
2773
+ "value": {
2774
+ "protocolVersion": "1"
2775
+ }
2776
+ },
2777
+ {
2778
+ "name": "session.list with a string flag",
2779
+ "check": "params",
2780
+ "method": "session.list",
2781
+ "valid": false,
2782
+ "value": {
2783
+ "includeClosed": "yes"
2784
+ }
2785
+ },
2786
+ {
2787
+ "name": "extension.register without method",
2788
+ "check": "params",
2789
+ "method": "extension.register",
2790
+ "valid": false,
2791
+ "value": {}
2792
+ },
2793
+ {
2794
+ "name": "question.answer without questionId",
2795
+ "check": "params",
2796
+ "method": "question.answer",
2797
+ "valid": false,
2798
+ "value": {
2799
+ "text": "có"
2800
+ }
2801
+ },
2802
+ {
2803
+ "name": "session.prompt result with outcome unknown (that is an error, never a result)",
2804
+ "check": "result",
2805
+ "method": "session.prompt",
2806
+ "valid": false,
2807
+ "value": {
2808
+ "outcome": "unknown"
2809
+ }
2810
+ },
2811
+ {
2812
+ "name": "fractional cursor",
2813
+ "check": "envelope",
2814
+ "valid": false,
2815
+ "value": {
2816
+ "sessionId": "ses_fixture",
2817
+ "epoch": "epoch-1",
2818
+ "seq": 3,
2819
+ "cursor": 1.5,
2820
+ "ts": "2026-10-15T00:00:00.000Z",
2821
+ "event": {
2822
+ "type": "session.ready"
2823
+ }
2824
+ }
2825
+ }
2826
+ ]
2827
+ }