@anhlp/alp-protocol 0.0.0-stage → 0.0.1-beta.3

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,3919 @@
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": "event usage",
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": "usage",
552
+ "usage": {
553
+ "contextWindowUsedTokens": 42000,
554
+ "contextWindowMaxTokens": 200000,
555
+ "inputTokens": 40000,
556
+ "cachedInputTokens": 36000,
557
+ "outputTokens": 2000,
558
+ "totalCostUsd": 0.1234
559
+ }
560
+ }
561
+ }
562
+ },
563
+ {
564
+ "name": "item user_message",
565
+ "check": "envelope",
566
+ "valid": true,
567
+ "value": {
568
+ "sessionId": "ses_fixture",
569
+ "epoch": "epoch-1",
570
+ "seq": 3,
571
+ "cursor": 12,
572
+ "ts": "2026-10-15T00:00:00.000Z",
573
+ "event": {
574
+ "type": "item",
575
+ "item": {
576
+ "kind": "user_message",
577
+ "id": "user:m-1",
578
+ "text": "Chào 👋",
579
+ "clientMessageId": "m-1"
580
+ }
581
+ }
582
+ }
583
+ },
584
+ {
585
+ "name": "item assistant_message",
586
+ "check": "envelope",
587
+ "valid": true,
588
+ "value": {
589
+ "sessionId": "ses_fixture",
590
+ "epoch": "epoch-1",
591
+ "seq": 3,
592
+ "cursor": 12,
593
+ "ts": "2026-10-15T00:00:00.000Z",
594
+ "event": {
595
+ "type": "item",
596
+ "item": {
597
+ "kind": "assistant_message",
598
+ "id": "msg-1",
599
+ "text": "Đã xong."
600
+ }
601
+ }
602
+ }
603
+ },
604
+ {
605
+ "name": "item notice",
606
+ "check": "envelope",
607
+ "valid": true,
608
+ "value": {
609
+ "sessionId": "ses_fixture",
610
+ "epoch": "epoch-1",
611
+ "seq": 3,
612
+ "cursor": 12,
613
+ "ts": "2026-10-15T00:00:00.000Z",
614
+ "event": {
615
+ "type": "item",
616
+ "item": {
617
+ "kind": "notice",
618
+ "id": "n-1",
619
+ "level": "warning",
620
+ "text": "Claude is paused"
621
+ }
622
+ }
623
+ }
624
+ },
625
+ {
626
+ "name": "item compaction",
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": "compaction",
639
+ "id": "c-1",
640
+ "status": "completed",
641
+ "trigger": "auto",
642
+ "preTokens": 180000,
643
+ "postTokens": 40000
644
+ }
645
+ }
646
+ }
647
+ },
648
+ {
649
+ "name": "item todo",
650
+ "check": "envelope",
651
+ "valid": true,
652
+ "value": {
653
+ "sessionId": "ses_fixture",
654
+ "epoch": "epoch-1",
655
+ "seq": 3,
656
+ "cursor": 12,
657
+ "ts": "2026-10-15T00:00:00.000Z",
658
+ "event": {
659
+ "type": "item",
660
+ "item": {
661
+ "kind": "todo",
662
+ "id": "t-1",
663
+ "items": [
664
+ {
665
+ "id": "bd-1",
666
+ "text": "Viết test",
667
+ "status": "in_progress"
668
+ }
669
+ ]
670
+ }
671
+ }
672
+ }
673
+ },
674
+ {
675
+ "name": "item tool_call shell",
676
+ "check": "envelope",
677
+ "valid": true,
678
+ "value": {
679
+ "sessionId": "ses_fixture",
680
+ "epoch": "epoch-1",
681
+ "seq": 3,
682
+ "cursor": 12,
683
+ "ts": "2026-10-15T00:00:00.000Z",
684
+ "event": {
685
+ "type": "item",
686
+ "item": {
687
+ "kind": "tool_call",
688
+ "id": "tc-1",
689
+ "callId": "call-1",
690
+ "name": "shell",
691
+ "status": "completed",
692
+ "detail": {
693
+ "type": "shell",
694
+ "command": "npm test",
695
+ "cwd": "/work/project",
696
+ "output": "ok",
697
+ "exitCode": 0
698
+ }
699
+ }
700
+ }
701
+ }
702
+ },
703
+ {
704
+ "name": "item tool_call unknown",
705
+ "check": "envelope",
706
+ "valid": true,
707
+ "value": {
708
+ "sessionId": "ses_fixture",
709
+ "epoch": "epoch-1",
710
+ "seq": 3,
711
+ "cursor": 12,
712
+ "ts": "2026-10-15T00:00:00.000Z",
713
+ "event": {
714
+ "type": "item",
715
+ "item": {
716
+ "kind": "tool_call",
717
+ "id": "tc-2",
718
+ "callId": "call-2",
719
+ "name": "alp_ask",
720
+ "status": "failed",
721
+ "error": "denied",
722
+ "detail": {
723
+ "type": "unknown",
724
+ "input": {
725
+ "to": "user"
726
+ },
727
+ "output": null
728
+ }
729
+ }
730
+ }
731
+ }
732
+ },
733
+ {
734
+ "name": "item tool_call read",
735
+ "check": "envelope",
736
+ "valid": true,
737
+ "value": {
738
+ "sessionId": "ses_fixture",
739
+ "epoch": "epoch-1",
740
+ "seq": 3,
741
+ "cursor": 12,
742
+ "ts": "2026-10-15T00:00:00.000Z",
743
+ "event": {
744
+ "type": "item",
745
+ "item": {
746
+ "kind": "tool_call",
747
+ "id": "tc-3",
748
+ "callId": "tc-3",
749
+ "name": "Read",
750
+ "status": "completed",
751
+ "detail": {
752
+ "type": "read",
753
+ "filePath": "/work/project/src/a.ts",
754
+ "content": "export const a = 1;\n",
755
+ "offset": 1,
756
+ "limit": 200
757
+ }
758
+ }
759
+ }
760
+ }
761
+ },
762
+ {
763
+ "name": "item tool_call edit",
764
+ "check": "envelope",
765
+ "valid": true,
766
+ "value": {
767
+ "sessionId": "ses_fixture",
768
+ "epoch": "epoch-1",
769
+ "seq": 3,
770
+ "cursor": 12,
771
+ "ts": "2026-10-15T00:00:00.000Z",
772
+ "event": {
773
+ "type": "item",
774
+ "item": {
775
+ "kind": "tool_call",
776
+ "id": "tc-4",
777
+ "callId": "tc-4",
778
+ "name": "Edit",
779
+ "status": "completed",
780
+ "detail": {
781
+ "type": "edit",
782
+ "filePath": "/work/project/src/a.ts",
783
+ "oldString": "a = 1",
784
+ "newString": "a = 2",
785
+ "unifiedDiff": "@@ -1 +1 @@\n-export const a = 1;\n+export const a = 2;\n"
786
+ }
787
+ }
788
+ }
789
+ }
790
+ },
791
+ {
792
+ "name": "item tool_call write",
793
+ "check": "envelope",
794
+ "valid": true,
795
+ "value": {
796
+ "sessionId": "ses_fixture",
797
+ "epoch": "epoch-1",
798
+ "seq": 3,
799
+ "cursor": 12,
800
+ "ts": "2026-10-15T00:00:00.000Z",
801
+ "event": {
802
+ "type": "item",
803
+ "item": {
804
+ "kind": "tool_call",
805
+ "id": "tc-5",
806
+ "callId": "tc-5",
807
+ "name": "Write",
808
+ "status": "running",
809
+ "detail": {
810
+ "type": "write",
811
+ "filePath": "docs/ghi-chú.md",
812
+ "content": "# Ghi chú\n"
813
+ }
814
+ }
815
+ }
816
+ }
817
+ },
818
+ {
819
+ "name": "item tool_call search grep",
820
+ "check": "envelope",
821
+ "valid": true,
822
+ "value": {
823
+ "sessionId": "ses_fixture",
824
+ "epoch": "epoch-1",
825
+ "seq": 3,
826
+ "cursor": 12,
827
+ "ts": "2026-10-15T00:00:00.000Z",
828
+ "event": {
829
+ "type": "item",
830
+ "item": {
831
+ "kind": "tool_call",
832
+ "id": "tc-6",
833
+ "callId": "tc-6",
834
+ "name": "Grep",
835
+ "status": "completed",
836
+ "detail": {
837
+ "type": "search",
838
+ "query": "TODO",
839
+ "toolName": "grep",
840
+ "content": "src/a.ts:3: // TODO",
841
+ "filePaths": [
842
+ "src/a.ts"
843
+ ],
844
+ "numFiles": 1,
845
+ "numMatches": 1,
846
+ "truncated": false
847
+ }
848
+ }
849
+ }
850
+ }
851
+ },
852
+ {
853
+ "name": "item tool_call search web_search",
854
+ "check": "envelope",
855
+ "valid": true,
856
+ "value": {
857
+ "sessionId": "ses_fixture",
858
+ "epoch": "epoch-1",
859
+ "seq": 3,
860
+ "cursor": 12,
861
+ "ts": "2026-10-15T00:00:00.000Z",
862
+ "event": {
863
+ "type": "item",
864
+ "item": {
865
+ "kind": "tool_call",
866
+ "id": "tc-7",
867
+ "callId": "tc-7",
868
+ "name": "web_search",
869
+ "status": "completed",
870
+ "detail": {
871
+ "type": "search",
872
+ "query": "json-rpc 2.0",
873
+ "toolName": "web_search",
874
+ "webResults": [
875
+ {
876
+ "title": "JSON-RPC 2.0 Specification",
877
+ "url": "https://www.jsonrpc.org/specification"
878
+ }
879
+ ]
880
+ }
881
+ }
882
+ }
883
+ }
884
+ },
885
+ {
886
+ "name": "item tool_call fetch",
887
+ "check": "envelope",
888
+ "valid": true,
889
+ "value": {
890
+ "sessionId": "ses_fixture",
891
+ "epoch": "epoch-1",
892
+ "seq": 3,
893
+ "cursor": 12,
894
+ "ts": "2026-10-15T00:00:00.000Z",
895
+ "event": {
896
+ "type": "item",
897
+ "item": {
898
+ "kind": "tool_call",
899
+ "id": "tc-8",
900
+ "callId": "tc-8",
901
+ "name": "WebFetch",
902
+ "status": "failed",
903
+ "error": "Request failed with status code 404",
904
+ "detail": {
905
+ "type": "fetch",
906
+ "url": "https://example.com/missing",
907
+ "prompt": "Summarize",
908
+ "code": 404
909
+ }
910
+ }
911
+ }
912
+ }
913
+ },
914
+ {
915
+ "name": "item tool_call sub_agent",
916
+ "check": "envelope",
917
+ "valid": true,
918
+ "value": {
919
+ "sessionId": "ses_fixture",
920
+ "epoch": "epoch-1",
921
+ "seq": 3,
922
+ "cursor": 12,
923
+ "ts": "2026-10-15T00:00:00.000Z",
924
+ "event": {
925
+ "type": "item",
926
+ "item": {
927
+ "kind": "tool_call",
928
+ "id": "tc-9",
929
+ "callId": "tc-9",
930
+ "name": "Task",
931
+ "status": "running",
932
+ "detail": {
933
+ "type": "sub_agent",
934
+ "subAgentType": "Explore",
935
+ "description": "Find the parser",
936
+ "log": ""
937
+ }
938
+ }
939
+ }
940
+ }
941
+ },
942
+ {
943
+ "name": "item tool_call plan",
944
+ "check": "envelope",
945
+ "valid": true,
946
+ "value": {
947
+ "sessionId": "ses_fixture",
948
+ "epoch": "epoch-1",
949
+ "seq": 3,
950
+ "cursor": 12,
951
+ "ts": "2026-10-15T00:00:00.000Z",
952
+ "event": {
953
+ "type": "item",
954
+ "item": {
955
+ "kind": "tool_call",
956
+ "id": "tc-10",
957
+ "callId": "tc-10",
958
+ "name": "ExitPlanMode",
959
+ "status": "completed",
960
+ "detail": {
961
+ "type": "plan",
962
+ "text": "1. Đọc\n2. Sửa"
963
+ }
964
+ }
965
+ }
966
+ }
967
+ },
968
+ {
969
+ "name": "item tool_call plain_text",
970
+ "check": "envelope",
971
+ "valid": true,
972
+ "value": {
973
+ "sessionId": "ses_fixture",
974
+ "epoch": "epoch-1",
975
+ "seq": 3,
976
+ "cursor": 12,
977
+ "ts": "2026-10-15T00:00:00.000Z",
978
+ "event": {
979
+ "type": "item",
980
+ "item": {
981
+ "kind": "tool_call",
982
+ "id": "tc-11",
983
+ "callId": "tc-11",
984
+ "name": "Skill",
985
+ "status": "completed",
986
+ "detail": {
987
+ "type": "plain_text",
988
+ "label": "smart-commits",
989
+ "text": "Launching skill: smart-commits"
990
+ }
991
+ }
992
+ }
993
+ }
994
+ },
995
+ {
996
+ "name": "item user_message with images",
997
+ "check": "envelope",
998
+ "valid": true,
999
+ "value": {
1000
+ "sessionId": "ses_fixture",
1001
+ "epoch": "epoch-1",
1002
+ "seq": 3,
1003
+ "cursor": 12,
1004
+ "ts": "2026-10-15T00:00:00.000Z",
1005
+ "event": {
1006
+ "type": "item",
1007
+ "item": {
1008
+ "kind": "user_message",
1009
+ "id": "user:m-2",
1010
+ "text": "Xem ảnh",
1011
+ "clientMessageId": "m-2",
1012
+ "images": 2
1013
+ }
1014
+ }
1015
+ }
1016
+ },
1017
+ {
1018
+ "name": "announcement without a cursor",
1019
+ "check": "envelope",
1020
+ "valid": true,
1021
+ "value": {
1022
+ "sessionId": "ses_fixture",
1023
+ "epoch": "announce-2026",
1024
+ "seq": 0,
1025
+ "ts": "2026-10-15T00:00:00.000Z",
1026
+ "event": {
1027
+ "type": "question",
1028
+ "question": {
1029
+ "id": "q_1",
1030
+ "sessionId": "ses_fixture",
1031
+ "rootId": "ses_fixture",
1032
+ "agent": "main",
1033
+ "body": "Tiếp tục?",
1034
+ "options": [
1035
+ "có",
1036
+ "không"
1037
+ ],
1038
+ "askedAt": "2026-10-15T00:00:00.000Z"
1039
+ }
1040
+ }
1041
+ }
1042
+ },
1043
+ {
1044
+ "name": "a future event type (receivers ignore it)",
1045
+ "check": "envelope",
1046
+ "valid": true,
1047
+ "value": {
1048
+ "sessionId": "ses_fixture",
1049
+ "epoch": "epoch-1",
1050
+ "seq": 3,
1051
+ "cursor": 12,
1052
+ "ts": "2026-10-15T00:00:00.000Z",
1053
+ "event": {
1054
+ "type": "tree.renamed",
1055
+ "title": "x"
1056
+ }
1057
+ },
1058
+ "projection": false
1059
+ },
1060
+ {
1061
+ "name": "a future item kind (receivers ignore it)",
1062
+ "check": "envelope",
1063
+ "valid": true,
1064
+ "value": {
1065
+ "sessionId": "ses_fixture",
1066
+ "epoch": "epoch-1",
1067
+ "seq": 3,
1068
+ "cursor": 12,
1069
+ "ts": "2026-10-15T00:00:00.000Z",
1070
+ "event": {
1071
+ "type": "item",
1072
+ "item": {
1073
+ "kind": "image",
1074
+ "id": "img-1",
1075
+ "url": "x"
1076
+ }
1077
+ }
1078
+ },
1079
+ "projection": false
1080
+ },
1081
+ {
1082
+ "name": "a future tool-call detail type (receivers show it as unknown)",
1083
+ "check": "envelope",
1084
+ "valid": true,
1085
+ "value": {
1086
+ "sessionId": "ses_fixture",
1087
+ "epoch": "epoch-1",
1088
+ "seq": 3,
1089
+ "cursor": 12,
1090
+ "ts": "2026-10-15T00:00:00.000Z",
1091
+ "event": {
1092
+ "type": "item",
1093
+ "item": {
1094
+ "kind": "tool_call",
1095
+ "id": "tc-12",
1096
+ "callId": "tc-12",
1097
+ "name": "Screenshot",
1098
+ "status": "completed",
1099
+ "detail": {
1100
+ "type": "image",
1101
+ "path": "/tmp/s.png"
1102
+ }
1103
+ }
1104
+ }
1105
+ },
1106
+ "projection": false
1107
+ },
1108
+ {
1109
+ "name": "unknown envelope properties",
1110
+ "check": "envelope",
1111
+ "valid": true,
1112
+ "value": {
1113
+ "sessionId": "ses_fixture",
1114
+ "epoch": "epoch-1",
1115
+ "seq": 3,
1116
+ "cursor": 12,
1117
+ "ts": "2026-10-15T00:00:00.000Z",
1118
+ "event": {
1119
+ "type": "session.ready"
1120
+ },
1121
+ "trace": {
1122
+ "span": "abc"
1123
+ }
1124
+ },
1125
+ "projection": false
1126
+ },
1127
+ {
1128
+ "name": "negative seq",
1129
+ "check": "envelope",
1130
+ "valid": false,
1131
+ "value": {
1132
+ "sessionId": "ses_fixture",
1133
+ "epoch": "epoch-1",
1134
+ "seq": -1,
1135
+ "cursor": 12,
1136
+ "ts": "2026-10-15T00:00:00.000Z",
1137
+ "event": {
1138
+ "type": "session.ready"
1139
+ }
1140
+ }
1141
+ },
1142
+ {
1143
+ "name": "cursor 0",
1144
+ "check": "envelope",
1145
+ "valid": false,
1146
+ "value": {
1147
+ "sessionId": "ses_fixture",
1148
+ "epoch": "epoch-1",
1149
+ "seq": 3,
1150
+ "cursor": 0,
1151
+ "ts": "2026-10-15T00:00:00.000Z",
1152
+ "event": {
1153
+ "type": "session.ready"
1154
+ }
1155
+ }
1156
+ },
1157
+ {
1158
+ "name": "item event without its item",
1159
+ "check": "envelope",
1160
+ "valid": false,
1161
+ "value": {
1162
+ "sessionId": "ses_fixture",
1163
+ "epoch": "epoch-1",
1164
+ "seq": 3,
1165
+ "cursor": 12,
1166
+ "ts": "2026-10-15T00:00:00.000Z",
1167
+ "event": {
1168
+ "type": "item"
1169
+ }
1170
+ }
1171
+ },
1172
+ {
1173
+ "name": "known item kind missing fields",
1174
+ "check": "envelope",
1175
+ "valid": false,
1176
+ "value": {
1177
+ "sessionId": "ses_fixture",
1178
+ "epoch": "epoch-1",
1179
+ "seq": 3,
1180
+ "cursor": 12,
1181
+ "ts": "2026-10-15T00:00:00.000Z",
1182
+ "event": {
1183
+ "type": "item",
1184
+ "item": {
1185
+ "kind": "notice",
1186
+ "id": "n"
1187
+ }
1188
+ }
1189
+ }
1190
+ },
1191
+ {
1192
+ "name": "edit detail without its filePath",
1193
+ "check": "envelope",
1194
+ "valid": false,
1195
+ "value": {
1196
+ "sessionId": "ses_fixture",
1197
+ "epoch": "epoch-1",
1198
+ "seq": 3,
1199
+ "cursor": 12,
1200
+ "ts": "2026-10-15T00:00:00.000Z",
1201
+ "event": {
1202
+ "type": "item",
1203
+ "item": {
1204
+ "kind": "tool_call",
1205
+ "id": "tc-x",
1206
+ "callId": "tc-x",
1207
+ "name": "Edit",
1208
+ "status": "completed",
1209
+ "detail": {
1210
+ "type": "edit",
1211
+ "newString": "x"
1212
+ }
1213
+ }
1214
+ }
1215
+ }
1216
+ },
1217
+ {
1218
+ "name": "search detail with a non-string file path",
1219
+ "check": "envelope",
1220
+ "valid": false,
1221
+ "value": {
1222
+ "sessionId": "ses_fixture",
1223
+ "epoch": "epoch-1",
1224
+ "seq": 3,
1225
+ "cursor": 12,
1226
+ "ts": "2026-10-15T00:00:00.000Z",
1227
+ "event": {
1228
+ "type": "item",
1229
+ "item": {
1230
+ "kind": "tool_call",
1231
+ "id": "tc-x",
1232
+ "callId": "tc-x",
1233
+ "name": "Glob",
1234
+ "status": "completed",
1235
+ "detail": {
1236
+ "type": "search",
1237
+ "query": "*.ts",
1238
+ "filePaths": [
1239
+ 1
1240
+ ]
1241
+ }
1242
+ }
1243
+ }
1244
+ }
1245
+ },
1246
+ {
1247
+ "name": "tool-call detail without a type",
1248
+ "check": "envelope",
1249
+ "valid": false,
1250
+ "value": {
1251
+ "sessionId": "ses_fixture",
1252
+ "epoch": "epoch-1",
1253
+ "seq": 3,
1254
+ "cursor": 12,
1255
+ "ts": "2026-10-15T00:00:00.000Z",
1256
+ "event": {
1257
+ "type": "item",
1258
+ "item": {
1259
+ "kind": "tool_call",
1260
+ "id": "tc-x",
1261
+ "callId": "tc-x",
1262
+ "name": "Read",
1263
+ "status": "completed",
1264
+ "detail": {
1265
+ "filePath": "a"
1266
+ }
1267
+ }
1268
+ }
1269
+ }
1270
+ },
1271
+ {
1272
+ "name": "known event with a wrong enum",
1273
+ "check": "envelope",
1274
+ "valid": false,
1275
+ "value": {
1276
+ "sessionId": "ses_fixture",
1277
+ "epoch": "epoch-1",
1278
+ "seq": 3,
1279
+ "cursor": 12,
1280
+ "ts": "2026-10-15T00:00:00.000Z",
1281
+ "event": {
1282
+ "type": "turn.ended",
1283
+ "turnId": "t",
1284
+ "state": "stopped"
1285
+ }
1286
+ }
1287
+ },
1288
+ {
1289
+ "name": "usage before the runtime said its window",
1290
+ "check": "envelope",
1291
+ "valid": true,
1292
+ "value": {
1293
+ "sessionId": "ses_fixture",
1294
+ "epoch": "epoch-1",
1295
+ "seq": 3,
1296
+ "cursor": 12,
1297
+ "ts": "2026-10-15T00:00:00.000Z",
1298
+ "event": {
1299
+ "type": "usage",
1300
+ "usage": {
1301
+ "contextWindowUsedTokens": 1200
1302
+ }
1303
+ }
1304
+ }
1305
+ },
1306
+ {
1307
+ "name": "session.updated with usage",
1308
+ "check": "envelope",
1309
+ "valid": true,
1310
+ "value": {
1311
+ "sessionId": "ses_fixture",
1312
+ "epoch": "epoch-1",
1313
+ "seq": 3,
1314
+ "cursor": 12,
1315
+ "ts": "2026-10-15T00:00:00.000Z",
1316
+ "event": {
1317
+ "type": "session.updated",
1318
+ "session": {
1319
+ "id": "ses_fixture",
1320
+ "projectRoot": "/work/project",
1321
+ "agent": "main",
1322
+ "runtime": "codex",
1323
+ "model": "gpt-6.1-sol",
1324
+ "mode": "workspace-write",
1325
+ "thinking": "low",
1326
+ "workflow": {
1327
+ "mode": "pho",
1328
+ "maxPeers": 2,
1329
+ "supervisor": false
1330
+ },
1331
+ "teamLabel": "Phở",
1332
+ "threadId": "thread-1",
1333
+ "persistent": true,
1334
+ "busy": false,
1335
+ "usage": {
1336
+ "contextWindowUsedTokens": 42000,
1337
+ "contextWindowMaxTokens": 200000
1338
+ }
1339
+ }
1340
+ }
1341
+ }
1342
+ },
1343
+ {
1344
+ "name": "usage event without its usage",
1345
+ "check": "envelope",
1346
+ "valid": false,
1347
+ "value": {
1348
+ "sessionId": "ses_fixture",
1349
+ "epoch": "epoch-1",
1350
+ "seq": 3,
1351
+ "cursor": 12,
1352
+ "ts": "2026-10-15T00:00:00.000Z",
1353
+ "event": {
1354
+ "type": "usage"
1355
+ }
1356
+ }
1357
+ },
1358
+ {
1359
+ "name": "usage with negative tokens",
1360
+ "check": "envelope",
1361
+ "valid": false,
1362
+ "value": {
1363
+ "sessionId": "ses_fixture",
1364
+ "epoch": "epoch-1",
1365
+ "seq": 3,
1366
+ "cursor": 12,
1367
+ "ts": "2026-10-15T00:00:00.000Z",
1368
+ "event": {
1369
+ "type": "usage",
1370
+ "usage": {
1371
+ "contextWindowUsedTokens": -1
1372
+ }
1373
+ }
1374
+ }
1375
+ },
1376
+ {
1377
+ "name": "usage with a zero window",
1378
+ "check": "envelope",
1379
+ "valid": false,
1380
+ "value": {
1381
+ "sessionId": "ses_fixture",
1382
+ "epoch": "epoch-1",
1383
+ "seq": 3,
1384
+ "cursor": 12,
1385
+ "ts": "2026-10-15T00:00:00.000Z",
1386
+ "event": {
1387
+ "type": "usage",
1388
+ "usage": {
1389
+ "contextWindowMaxTokens": 0
1390
+ }
1391
+ }
1392
+ }
1393
+ },
1394
+ {
1395
+ "name": "usage with fractional tokens",
1396
+ "check": "envelope",
1397
+ "valid": false,
1398
+ "value": {
1399
+ "sessionId": "ses_fixture",
1400
+ "epoch": "epoch-1",
1401
+ "seq": 3,
1402
+ "cursor": 12,
1403
+ "ts": "2026-10-15T00:00:00.000Z",
1404
+ "event": {
1405
+ "type": "usage",
1406
+ "usage": {
1407
+ "outputTokens": 1.5
1408
+ }
1409
+ }
1410
+ }
1411
+ },
1412
+ {
1413
+ "name": "missing epoch",
1414
+ "check": "envelope",
1415
+ "valid": false,
1416
+ "value": {
1417
+ "sessionId": "ses_fixture",
1418
+ "seq": 3,
1419
+ "cursor": 12,
1420
+ "ts": "2026-10-15T00:00:00.000Z",
1421
+ "event": {
1422
+ "type": "session.ready"
1423
+ }
1424
+ }
1425
+ },
1426
+ {
1427
+ "name": "daemon.hello params",
1428
+ "check": "params",
1429
+ "method": "daemon.hello",
1430
+ "valid": true,
1431
+ "value": {
1432
+ "protocolVersion": 1,
1433
+ "client": {
1434
+ "name": "paseo",
1435
+ "version": "0.10.0"
1436
+ }
1437
+ }
1438
+ },
1439
+ {
1440
+ "name": "daemon.hello without client",
1441
+ "check": "params",
1442
+ "method": "daemon.hello",
1443
+ "valid": true,
1444
+ "value": {
1445
+ "protocolVersion": 1
1446
+ }
1447
+ },
1448
+ {
1449
+ "name": "daemon.hello with a string client",
1450
+ "check": "params",
1451
+ "method": "daemon.hello",
1452
+ "valid": false,
1453
+ "value": {
1454
+ "protocolVersion": 1,
1455
+ "client": "paseo"
1456
+ }
1457
+ },
1458
+ {
1459
+ "name": "daemon.hello result",
1460
+ "check": "result",
1461
+ "method": "daemon.hello",
1462
+ "valid": true,
1463
+ "value": {
1464
+ "protocolVersion": 1,
1465
+ "daemonVersion": "0.10.0",
1466
+ "pid": 42,
1467
+ "capabilities": [
1468
+ "attach.after",
1469
+ "prompt.receipts",
1470
+ "extension.methods"
1471
+ ]
1472
+ }
1473
+ },
1474
+ {
1475
+ "name": "daemon.hello from a daemon before capabilities",
1476
+ "check": "result",
1477
+ "method": "daemon.hello",
1478
+ "valid": true,
1479
+ "value": {
1480
+ "protocolVersion": 1,
1481
+ "daemonVersion": "0.9.5",
1482
+ "pid": 42
1483
+ }
1484
+ },
1485
+ {
1486
+ "name": "daemon.hello with the host name",
1487
+ "check": "result",
1488
+ "method": "daemon.hello",
1489
+ "valid": true,
1490
+ "value": {
1491
+ "protocolVersion": 1,
1492
+ "daemonVersion": "0.10.0",
1493
+ "pid": 42,
1494
+ "hostname": "build-host",
1495
+ "capabilities": []
1496
+ }
1497
+ },
1498
+ {
1499
+ "name": "daemon.hello with a numeric hostname",
1500
+ "check": "result",
1501
+ "method": "daemon.hello",
1502
+ "valid": false,
1503
+ "value": {
1504
+ "protocolVersion": 1,
1505
+ "hostname": 42
1506
+ }
1507
+ },
1508
+ {
1509
+ "name": "daemon.status params",
1510
+ "check": "params",
1511
+ "method": "daemon.status",
1512
+ "valid": true,
1513
+ "value": {}
1514
+ },
1515
+ {
1516
+ "name": "daemon.status result",
1517
+ "check": "result",
1518
+ "method": "daemon.status",
1519
+ "valid": true,
1520
+ "value": {
1521
+ "pid": 42,
1522
+ "startedAt": "2026-10-15T00:00:00.000Z",
1523
+ "version": "0.10.0",
1524
+ "protocolVersion": 1,
1525
+ "sessions": 1,
1526
+ "questions": 0,
1527
+ "previousExit": {
1528
+ "kind": "clean"
1529
+ },
1530
+ "persistence": {
1531
+ "failing": 0
1532
+ },
1533
+ "health": {
1534
+ "live": true,
1535
+ "ready": true,
1536
+ "checks": [
1537
+ {
1538
+ "id": "accepting",
1539
+ "ok": true
1540
+ }
1541
+ ]
1542
+ }
1543
+ }
1544
+ },
1545
+ {
1546
+ "name": "daemon.status result without health",
1547
+ "check": "result",
1548
+ "method": "daemon.status",
1549
+ "valid": false,
1550
+ "value": {
1551
+ "pid": 42,
1552
+ "startedAt": "2026-10-15T00:00:00.000Z",
1553
+ "version": "0.10.0",
1554
+ "protocolVersion": 1,
1555
+ "sessions": 1,
1556
+ "questions": 0
1557
+ }
1558
+ },
1559
+ {
1560
+ "name": "daemon.shutdown params",
1561
+ "check": "params",
1562
+ "method": "daemon.shutdown",
1563
+ "valid": true,
1564
+ "value": {}
1565
+ },
1566
+ {
1567
+ "name": "daemon.shutdown result",
1568
+ "check": "result",
1569
+ "method": "daemon.shutdown",
1570
+ "valid": true,
1571
+ "value": {}
1572
+ },
1573
+ {
1574
+ "name": "daemon.pause params",
1575
+ "check": "params",
1576
+ "method": "daemon.pause",
1577
+ "valid": true,
1578
+ "value": {
1579
+ "runtime": "claude",
1580
+ "now": true,
1581
+ "reason": "tối nay"
1582
+ }
1583
+ },
1584
+ {
1585
+ "name": "daemon.pause with an unknown runtime",
1586
+ "check": "params",
1587
+ "method": "daemon.pause",
1588
+ "valid": false,
1589
+ "value": {
1590
+ "runtime": "gemini"
1591
+ }
1592
+ },
1593
+ {
1594
+ "name": "daemon.pause result",
1595
+ "check": "result",
1596
+ "method": "daemon.pause",
1597
+ "valid": true,
1598
+ "value": {
1599
+ "runtimes": {
1600
+ "claude": {
1601
+ "since": "2026-10-15T00:00:00.000Z",
1602
+ "by": "the user",
1603
+ "reason": "limit",
1604
+ "resetsAt": "2026-10-15T00:00:00.000Z"
1605
+ }
1606
+ },
1607
+ "parked": [
1608
+ {
1609
+ "assignmentId": "a_1",
1610
+ "agent": "peer",
1611
+ "runtime": "claude",
1612
+ "rootId": "ses_fixture",
1613
+ "reason": "limit",
1614
+ "since": "2026-10-15T00:00:00.000Z"
1615
+ }
1616
+ ]
1617
+ }
1618
+ },
1619
+ {
1620
+ "name": "daemon.resume params",
1621
+ "check": "params",
1622
+ "method": "daemon.resume",
1623
+ "valid": true,
1624
+ "value": {
1625
+ "runtime": "codex"
1626
+ }
1627
+ },
1628
+ {
1629
+ "name": "daemon.resume result",
1630
+ "check": "result",
1631
+ "method": "daemon.resume",
1632
+ "valid": true,
1633
+ "value": {
1634
+ "runtimes": {},
1635
+ "parked": []
1636
+ }
1637
+ },
1638
+ {
1639
+ "name": "daemon.pauses params",
1640
+ "check": "params",
1641
+ "method": "daemon.pauses",
1642
+ "valid": true,
1643
+ "value": {}
1644
+ },
1645
+ {
1646
+ "name": "daemon.pauses result",
1647
+ "check": "result",
1648
+ "method": "daemon.pauses",
1649
+ "valid": true,
1650
+ "value": {
1651
+ "all": {
1652
+ "since": "2026-10-15T00:00:00.000Z",
1653
+ "by": "the user",
1654
+ "reason": "paused by the user"
1655
+ },
1656
+ "runtimes": {},
1657
+ "parked": []
1658
+ }
1659
+ },
1660
+ {
1661
+ "name": "daemon.usage params",
1662
+ "check": "params",
1663
+ "method": "daemon.usage",
1664
+ "valid": true,
1665
+ "value": {
1666
+ "refresh": true
1667
+ }
1668
+ },
1669
+ {
1670
+ "name": "daemon.usage result",
1671
+ "check": "result",
1672
+ "method": "daemon.usage",
1673
+ "valid": true,
1674
+ "value": {
1675
+ "providers": [
1676
+ {
1677
+ "runtime": "codex",
1678
+ "pause": null,
1679
+ "parked": 0
1680
+ }
1681
+ ]
1682
+ }
1683
+ },
1684
+ {
1685
+ "name": "catalog.get params",
1686
+ "check": "params",
1687
+ "method": "catalog.get",
1688
+ "valid": true,
1689
+ "value": {}
1690
+ },
1691
+ {
1692
+ "name": "catalog.get result",
1693
+ "check": "result",
1694
+ "method": "catalog.get",
1695
+ "valid": true,
1696
+ "value": {
1697
+ "models": [
1698
+ {
1699
+ "id": "codex:gpt-6.1-sol",
1700
+ "label": "Codex · GPT-6.1-Sol"
1701
+ }
1702
+ ],
1703
+ "modes": [
1704
+ {
1705
+ "id": "read-only",
1706
+ "label": "Read only"
1707
+ }
1708
+ ],
1709
+ "thinkingOptions": [
1710
+ {
1711
+ "id": "low",
1712
+ "label": "low"
1713
+ }
1714
+ ],
1715
+ "defaultModel": "codex:gpt-6.1-sol"
1716
+ }
1717
+ },
1718
+ {
1719
+ "name": "assignment.recall params",
1720
+ "check": "params",
1721
+ "method": "assignment.recall",
1722
+ "valid": true,
1723
+ "value": {
1724
+ "assignmentId": "a_1",
1725
+ "question": "Bạn đã sửa gì?"
1726
+ }
1727
+ },
1728
+ {
1729
+ "name": "assignment.recall without a question",
1730
+ "check": "params",
1731
+ "method": "assignment.recall",
1732
+ "valid": false,
1733
+ "value": {
1734
+ "assignmentId": "a_1"
1735
+ }
1736
+ },
1737
+ {
1738
+ "name": "assignment.recall result",
1739
+ "check": "result",
1740
+ "method": "assignment.recall",
1741
+ "valid": true,
1742
+ "value": {
1743
+ "assignmentId": "a_1",
1744
+ "agent": "peer",
1745
+ "taskId": "bd-1",
1746
+ "finishedAt": "2026-10-15T00:00:00.000Z",
1747
+ "answer": "Đã sửa server.ts"
1748
+ }
1749
+ },
1750
+ {
1751
+ "name": "board.list params",
1752
+ "check": "params",
1753
+ "method": "board.list",
1754
+ "valid": true,
1755
+ "value": {
1756
+ "projectRoot": "/work/project"
1757
+ }
1758
+ },
1759
+ {
1760
+ "name": "board.list without projectRoot",
1761
+ "check": "params",
1762
+ "method": "board.list",
1763
+ "valid": false,
1764
+ "value": {}
1765
+ },
1766
+ {
1767
+ "name": "board.list result",
1768
+ "check": "result",
1769
+ "method": "board.list",
1770
+ "valid": true,
1771
+ "value": {
1772
+ "pins": [
1773
+ {
1774
+ "id": "pin_1",
1775
+ "project": "/work/project",
1776
+ "kind": "claim",
1777
+ "body": "Đang sửa server",
1778
+ "paths": [
1779
+ "src/server.ts"
1780
+ ],
1781
+ "agent": "peer",
1782
+ "sessionId": "ses_child",
1783
+ "rootId": "ses_fixture",
1784
+ "at": "2026-10-15T00:00:00.000Z"
1785
+ }
1786
+ ]
1787
+ }
1788
+ },
1789
+ {
1790
+ "name": "question.list params",
1791
+ "check": "params",
1792
+ "method": "question.list",
1793
+ "valid": true,
1794
+ "value": {
1795
+ "projectRoot": "/work/project"
1796
+ }
1797
+ },
1798
+ {
1799
+ "name": "question.list result",
1800
+ "check": "result",
1801
+ "method": "question.list",
1802
+ "valid": true,
1803
+ "value": {
1804
+ "questions": [
1805
+ {
1806
+ "id": "q_1",
1807
+ "sessionId": "ses_fixture",
1808
+ "rootId": "ses_fixture",
1809
+ "agent": "main",
1810
+ "body": "Tiếp tục?",
1811
+ "options": [
1812
+ "có",
1813
+ "không"
1814
+ ],
1815
+ "askedAt": "2026-10-15T00:00:00.000Z"
1816
+ }
1817
+ ]
1818
+ }
1819
+ },
1820
+ {
1821
+ "name": "question.watch params",
1822
+ "check": "params",
1823
+ "method": "question.watch",
1824
+ "valid": true,
1825
+ "value": {
1826
+ "projectRoot": "/work/project"
1827
+ }
1828
+ },
1829
+ {
1830
+ "name": "question.watch every tree",
1831
+ "check": "params",
1832
+ "method": "question.watch",
1833
+ "valid": true,
1834
+ "value": {}
1835
+ },
1836
+ {
1837
+ "name": "question.watch result",
1838
+ "check": "result",
1839
+ "method": "question.watch",
1840
+ "valid": true,
1841
+ "value": {
1842
+ "questions": [
1843
+ {
1844
+ "id": "q_1",
1845
+ "sessionId": "ses_fixture",
1846
+ "rootId": "ses_fixture",
1847
+ "agent": "main",
1848
+ "body": "Tiếp tục?",
1849
+ "options": [
1850
+ "có",
1851
+ "không"
1852
+ ],
1853
+ "askedAt": "2026-10-15T00:00:00.000Z"
1854
+ }
1855
+ ]
1856
+ }
1857
+ },
1858
+ {
1859
+ "name": "question.watch with a numeric projectRoot",
1860
+ "check": "params",
1861
+ "method": "question.watch",
1862
+ "valid": false,
1863
+ "value": {
1864
+ "projectRoot": 7
1865
+ }
1866
+ },
1867
+ {
1868
+ "name": "question.watch with turns",
1869
+ "check": "params",
1870
+ "method": "question.watch",
1871
+ "valid": true,
1872
+ "value": {
1873
+ "projectRoot": "/work/project",
1874
+ "turns": true
1875
+ }
1876
+ },
1877
+ {
1878
+ "name": "question.watch with a string turns",
1879
+ "check": "params",
1880
+ "method": "question.watch",
1881
+ "valid": false,
1882
+ "value": {
1883
+ "turns": "yes"
1884
+ }
1885
+ },
1886
+ {
1887
+ "name": "workspace.files.search params",
1888
+ "check": "params",
1889
+ "method": "workspace.files.search",
1890
+ "valid": true,
1891
+ "value": {
1892
+ "projectRoot": "/work/project",
1893
+ "query": "server ts",
1894
+ "limit": 30
1895
+ }
1896
+ },
1897
+ {
1898
+ "name": "workspace.files.search without a query",
1899
+ "check": "params",
1900
+ "method": "workspace.files.search",
1901
+ "valid": true,
1902
+ "value": {
1903
+ "projectRoot": "/work/project"
1904
+ }
1905
+ },
1906
+ {
1907
+ "name": "workspace.files.search without projectRoot",
1908
+ "check": "params",
1909
+ "method": "workspace.files.search",
1910
+ "valid": false,
1911
+ "value": {
1912
+ "query": "server"
1913
+ }
1914
+ },
1915
+ {
1916
+ "name": "workspace.files.search with a limit over 100",
1917
+ "check": "params",
1918
+ "method": "workspace.files.search",
1919
+ "valid": false,
1920
+ "value": {
1921
+ "projectRoot": "/work/project",
1922
+ "limit": 101
1923
+ }
1924
+ },
1925
+ {
1926
+ "name": "workspace.files.search with a query over 200 characters",
1927
+ "check": "params",
1928
+ "method": "workspace.files.search",
1929
+ "valid": false,
1930
+ "value": {
1931
+ "projectRoot": "/work/project",
1932
+ "query": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
1933
+ }
1934
+ },
1935
+ {
1936
+ "name": "workspace.files.search result",
1937
+ "check": "result",
1938
+ "method": "workspace.files.search",
1939
+ "valid": true,
1940
+ "value": {
1941
+ "files": [
1942
+ {
1943
+ "path": "src/server.ts"
1944
+ },
1945
+ {
1946
+ "path": "docs/sửa lỗi.md"
1947
+ }
1948
+ ],
1949
+ "truncated": true
1950
+ }
1951
+ },
1952
+ {
1953
+ "name": "workspace.files.search result with an empty path",
1954
+ "check": "result",
1955
+ "method": "workspace.files.search",
1956
+ "valid": false,
1957
+ "value": {
1958
+ "files": [
1959
+ {
1960
+ "path": ""
1961
+ }
1962
+ ]
1963
+ }
1964
+ },
1965
+ {
1966
+ "name": "workspace.files.list the root",
1967
+ "check": "params",
1968
+ "method": "workspace.files.list",
1969
+ "valid": true,
1970
+ "value": {
1971
+ "projectRoot": "/work/project"
1972
+ }
1973
+ },
1974
+ {
1975
+ "name": "workspace.files.list params",
1976
+ "check": "params",
1977
+ "method": "workspace.files.list",
1978
+ "valid": true,
1979
+ "value": {
1980
+ "projectRoot": "/work/project",
1981
+ "path": "src",
1982
+ "includeIgnored": true
1983
+ }
1984
+ },
1985
+ {
1986
+ "name": "workspace.files.list without projectRoot",
1987
+ "check": "params",
1988
+ "method": "workspace.files.list",
1989
+ "valid": false,
1990
+ "value": {
1991
+ "path": "src"
1992
+ }
1993
+ },
1994
+ {
1995
+ "name": "workspace.files.list with an empty path",
1996
+ "check": "params",
1997
+ "method": "workspace.files.list",
1998
+ "valid": false,
1999
+ "value": {
2000
+ "projectRoot": "/work/project",
2001
+ "path": ""
2002
+ }
2003
+ },
2004
+ {
2005
+ "name": "workspace.files.list with a string includeIgnored",
2006
+ "check": "params",
2007
+ "method": "workspace.files.list",
2008
+ "valid": false,
2009
+ "value": {
2010
+ "projectRoot": "/work/project",
2011
+ "includeIgnored": "yes"
2012
+ }
2013
+ },
2014
+ {
2015
+ "name": "workspace.files.list result",
2016
+ "check": "result",
2017
+ "method": "workspace.files.list",
2018
+ "valid": true,
2019
+ "value": {
2020
+ "entries": [
2021
+ {
2022
+ "name": "src",
2023
+ "path": "src",
2024
+ "kind": "directory",
2025
+ "modifiedAt": "2026-10-15T00:00:00.000Z"
2026
+ },
2027
+ {
2028
+ "name": "sửa lỗi.md",
2029
+ "path": "sửa lỗi.md",
2030
+ "kind": "file",
2031
+ "size": 12,
2032
+ "modifiedAt": "2026-10-15T00:00:00.000Z"
2033
+ }
2034
+ ],
2035
+ "truncated": true
2036
+ }
2037
+ },
2038
+ {
2039
+ "name": "workspace.files.list result with a link entry",
2040
+ "check": "result",
2041
+ "method": "workspace.files.list",
2042
+ "valid": false,
2043
+ "value": {
2044
+ "entries": [
2045
+ {
2046
+ "name": "x",
2047
+ "path": "x",
2048
+ "kind": "link"
2049
+ }
2050
+ ]
2051
+ }
2052
+ },
2053
+ {
2054
+ "name": "workspace.files.read params",
2055
+ "check": "params",
2056
+ "method": "workspace.files.read",
2057
+ "valid": true,
2058
+ "value": {
2059
+ "projectRoot": "/work/project",
2060
+ "path": "src/server.ts"
2061
+ }
2062
+ },
2063
+ {
2064
+ "name": "workspace.files.read an ignored file",
2065
+ "check": "params",
2066
+ "method": "workspace.files.read",
2067
+ "valid": true,
2068
+ "value": {
2069
+ "projectRoot": "/work/project",
2070
+ "path": "dist/out.js",
2071
+ "includeIgnored": true
2072
+ }
2073
+ },
2074
+ {
2075
+ "name": "workspace.files.read without path",
2076
+ "check": "params",
2077
+ "method": "workspace.files.read",
2078
+ "valid": false,
2079
+ "value": {
2080
+ "projectRoot": "/work/project"
2081
+ }
2082
+ },
2083
+ {
2084
+ "name": "workspace.files.read with a path over 4096 characters",
2085
+ "check": "params",
2086
+ "method": "workspace.files.read",
2087
+ "valid": false,
2088
+ "value": {
2089
+ "projectRoot": "/work/project",
2090
+ "path": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
2091
+ }
2092
+ },
2093
+ {
2094
+ "name": "workspace.files.read result",
2095
+ "check": "result",
2096
+ "method": "workspace.files.read",
2097
+ "valid": true,
2098
+ "value": {
2099
+ "path": "src/server.ts",
2100
+ "content": "export {};\n",
2101
+ "size": 11,
2102
+ "modifiedAt": "2026-10-15T00:00:00.000Z"
2103
+ }
2104
+ },
2105
+ {
2106
+ "name": "workspace.files.read result over 1 MiB",
2107
+ "check": "result",
2108
+ "method": "workspace.files.read",
2109
+ "valid": false,
2110
+ "value": {
2111
+ "path": "big.txt",
2112
+ "content": "",
2113
+ "size": 1048577
2114
+ }
2115
+ },
2116
+ {
2117
+ "name": "question.answer params",
2118
+ "check": "params",
2119
+ "method": "question.answer",
2120
+ "valid": true,
2121
+ "value": {
2122
+ "questionId": "q_1",
2123
+ "text": "có"
2124
+ }
2125
+ },
2126
+ {
2127
+ "name": "question.answer dismissal",
2128
+ "check": "params",
2129
+ "method": "question.answer",
2130
+ "valid": true,
2131
+ "value": {
2132
+ "questionId": "q_1",
2133
+ "dismiss": true,
2134
+ "reason": "không cần"
2135
+ }
2136
+ },
2137
+ {
2138
+ "name": "question.answer result",
2139
+ "check": "result",
2140
+ "method": "question.answer",
2141
+ "valid": true,
2142
+ "value": {
2143
+ "questionId": "q_1"
2144
+ }
2145
+ },
2146
+ {
2147
+ "name": "session.create params",
2148
+ "check": "params",
2149
+ "method": "session.create",
2150
+ "valid": true,
2151
+ "value": {
2152
+ "sessionId": "ses_fixture",
2153
+ "spec": {
2154
+ "cwd": "/work/project",
2155
+ "model": "codex:gpt-6.1-sol",
2156
+ "persist": true,
2157
+ "mcpServers": {
2158
+ "docs": {
2159
+ "type": "http",
2160
+ "url": "https://example.invalid/mcp"
2161
+ }
2162
+ }
2163
+ },
2164
+ "history": "replay",
2165
+ "delegation": false
2166
+ }
2167
+ },
2168
+ {
2169
+ "name": "session.create with an invalid session id",
2170
+ "check": "params",
2171
+ "method": "session.create",
2172
+ "valid": false,
2173
+ "value": {
2174
+ "sessionId": "has space",
2175
+ "spec": {
2176
+ "cwd": "/work/project"
2177
+ }
2178
+ }
2179
+ },
2180
+ {
2181
+ "name": "session.create without spec.cwd",
2182
+ "check": "params",
2183
+ "method": "session.create",
2184
+ "valid": false,
2185
+ "value": {
2186
+ "spec": {}
2187
+ }
2188
+ },
2189
+ {
2190
+ "name": "session.create result",
2191
+ "check": "result",
2192
+ "method": "session.create",
2193
+ "valid": true,
2194
+ "value": {
2195
+ "session": {
2196
+ "id": "ses_fixture",
2197
+ "projectRoot": "/work/project",
2198
+ "agent": "main",
2199
+ "runtime": "codex",
2200
+ "model": "gpt-6.1-sol",
2201
+ "mode": "workspace-write",
2202
+ "thinking": "low",
2203
+ "workflow": {
2204
+ "mode": "pho",
2205
+ "maxPeers": 2,
2206
+ "supervisor": false
2207
+ },
2208
+ "teamLabel": "Phở",
2209
+ "threadId": "thread-1",
2210
+ "persistent": true,
2211
+ "busy": false
2212
+ },
2213
+ "attached": false,
2214
+ "durable": true
2215
+ }
2216
+ },
2217
+ {
2218
+ "name": "session.create result of a resume",
2219
+ "check": "result",
2220
+ "method": "session.create",
2221
+ "valid": true,
2222
+ "value": {
2223
+ "session": {
2224
+ "id": "ses_fixture",
2225
+ "projectRoot": "/work/project",
2226
+ "agent": "main",
2227
+ "runtime": "codex",
2228
+ "model": "gpt-6.1-sol",
2229
+ "mode": "workspace-write",
2230
+ "thinking": "low",
2231
+ "workflow": {
2232
+ "mode": "pho",
2233
+ "maxPeers": 2,
2234
+ "supervisor": false
2235
+ },
2236
+ "teamLabel": "Phở",
2237
+ "threadId": "thread-1",
2238
+ "persistent": true,
2239
+ "busy": false
2240
+ },
2241
+ "attached": false,
2242
+ "resumed": true,
2243
+ "durable": true
2244
+ }
2245
+ },
2246
+ {
2247
+ "name": "session.preview params",
2248
+ "check": "params",
2249
+ "method": "session.preview",
2250
+ "valid": true,
2251
+ "value": {
2252
+ "spec": {
2253
+ "cwd": "/work/project",
2254
+ "workflow": "cafe"
2255
+ }
2256
+ }
2257
+ },
2258
+ {
2259
+ "name": "session.preview result",
2260
+ "check": "result",
2261
+ "method": "session.preview",
2262
+ "valid": true,
2263
+ "value": {
2264
+ "preview": {
2265
+ "teams": [
2266
+ {
2267
+ "id": "pho",
2268
+ "label": "Phở"
2269
+ },
2270
+ {
2271
+ "id": "cafe",
2272
+ "label": "Cafe",
2273
+ "description": "Hai agent"
2274
+ }
2275
+ ],
2276
+ "team": "cafe",
2277
+ "teamLabel": "Cafe",
2278
+ "agent": "main",
2279
+ "runtime": "claude",
2280
+ "model": "claude-opus-5-5",
2281
+ "mode": "full-access",
2282
+ "thinking": "high"
2283
+ }
2284
+ }
2285
+ },
2286
+ {
2287
+ "name": "session.attach params",
2288
+ "check": "params",
2289
+ "method": "session.attach",
2290
+ "valid": true,
2291
+ "value": {
2292
+ "sessionId": "ses_fixture",
2293
+ "after": 12
2294
+ }
2295
+ },
2296
+ {
2297
+ "name": "session.attach with a negative cursor",
2298
+ "check": "params",
2299
+ "method": "session.attach",
2300
+ "valid": false,
2301
+ "value": {
2302
+ "sessionId": "ses_fixture",
2303
+ "after": -1
2304
+ }
2305
+ },
2306
+ {
2307
+ "name": "session.attach result",
2308
+ "check": "result",
2309
+ "method": "session.attach",
2310
+ "valid": true,
2311
+ "value": {
2312
+ "session": {
2313
+ "id": "ses_fixture",
2314
+ "projectRoot": "/work/project",
2315
+ "agent": "main",
2316
+ "runtime": "codex",
2317
+ "model": "gpt-6.1-sol",
2318
+ "mode": "workspace-write",
2319
+ "thinking": "low",
2320
+ "workflow": {
2321
+ "mode": "pho",
2322
+ "maxPeers": 2,
2323
+ "supervisor": false
2324
+ },
2325
+ "teamLabel": "Phở",
2326
+ "threadId": "thread-1",
2327
+ "persistent": true,
2328
+ "busy": false,
2329
+ "status": "idle",
2330
+ "title": "Sửa lỗi 😀",
2331
+ "createdAt": "2026-10-15T00:00:00.000Z",
2332
+ "updatedAt": "2026-10-15T00:00:00.000Z"
2333
+ },
2334
+ "cursor": 40
2335
+ }
2336
+ },
2337
+ {
2338
+ "name": "session.attach result of a reset",
2339
+ "check": "result",
2340
+ "method": "session.attach",
2341
+ "valid": true,
2342
+ "value": {
2343
+ "session": {
2344
+ "id": "ses_fixture",
2345
+ "projectRoot": "/work/project",
2346
+ "agent": "main",
2347
+ "runtime": "codex",
2348
+ "model": "gpt-6.1-sol",
2349
+ "mode": "workspace-write",
2350
+ "thinking": "low",
2351
+ "workflow": {
2352
+ "mode": "pho",
2353
+ "maxPeers": 2,
2354
+ "supervisor": false
2355
+ },
2356
+ "teamLabel": "Phở",
2357
+ "threadId": "thread-1",
2358
+ "persistent": true,
2359
+ "busy": false,
2360
+ "status": "idle",
2361
+ "title": "Sửa lỗi 😀",
2362
+ "createdAt": "2026-10-15T00:00:00.000Z",
2363
+ "updatedAt": "2026-10-15T00:00:00.000Z"
2364
+ },
2365
+ "cursor": 40,
2366
+ "reset": true
2367
+ }
2368
+ },
2369
+ {
2370
+ "name": "session.attach result with reset false",
2371
+ "check": "result",
2372
+ "method": "session.attach",
2373
+ "valid": false,
2374
+ "value": {
2375
+ "session": {
2376
+ "id": "ses_fixture",
2377
+ "projectRoot": "/work/project",
2378
+ "agent": "main",
2379
+ "runtime": "codex",
2380
+ "model": "gpt-6.1-sol",
2381
+ "mode": "workspace-write",
2382
+ "thinking": "low",
2383
+ "workflow": {
2384
+ "mode": "pho",
2385
+ "maxPeers": 2,
2386
+ "supervisor": false
2387
+ },
2388
+ "teamLabel": "Phở",
2389
+ "threadId": "thread-1",
2390
+ "persistent": true,
2391
+ "busy": false,
2392
+ "status": "idle",
2393
+ "title": "Sửa lỗi 😀",
2394
+ "createdAt": "2026-10-15T00:00:00.000Z",
2395
+ "updatedAt": "2026-10-15T00:00:00.000Z"
2396
+ },
2397
+ "cursor": 40,
2398
+ "reset": false
2399
+ }
2400
+ },
2401
+ {
2402
+ "name": "session.release params",
2403
+ "check": "params",
2404
+ "method": "session.release",
2405
+ "valid": true,
2406
+ "value": {
2407
+ "sessionId": "ses_fixture"
2408
+ }
2409
+ },
2410
+ {
2411
+ "name": "session.release result",
2412
+ "check": "result",
2413
+ "method": "session.release",
2414
+ "valid": true,
2415
+ "value": {
2416
+ "closed": true
2417
+ }
2418
+ },
2419
+ {
2420
+ "name": "session.prompt params",
2421
+ "check": "params",
2422
+ "method": "session.prompt",
2423
+ "valid": true,
2424
+ "value": {
2425
+ "sessionId": "ses_fixture",
2426
+ "clientMessageId": "m-1",
2427
+ "delivery": "steer",
2428
+ "content": [
2429
+ {
2430
+ "type": "text",
2431
+ "text": "Dừng lại 🛑"
2432
+ }
2433
+ ]
2434
+ }
2435
+ },
2436
+ {
2437
+ "name": "session.prompt with string content",
2438
+ "check": "params",
2439
+ "method": "session.prompt",
2440
+ "valid": false,
2441
+ "value": {
2442
+ "sessionId": "ses_fixture",
2443
+ "clientMessageId": "m-1",
2444
+ "content": "text"
2445
+ }
2446
+ },
2447
+ {
2448
+ "name": "session.prompt with an inline image",
2449
+ "check": "params",
2450
+ "method": "session.prompt",
2451
+ "valid": true,
2452
+ "value": {
2453
+ "sessionId": "ses_fixture",
2454
+ "clientMessageId": "m-2",
2455
+ "content": [
2456
+ {
2457
+ "type": "text",
2458
+ "text": "Xem ảnh"
2459
+ },
2460
+ {
2461
+ "type": "image",
2462
+ "mimeType": "image/png",
2463
+ "data": "iVBORw0KGgo=",
2464
+ "name": "ảnh.png"
2465
+ }
2466
+ ]
2467
+ }
2468
+ },
2469
+ {
2470
+ "name": "session.prompt with an image path",
2471
+ "check": "params",
2472
+ "method": "session.prompt",
2473
+ "valid": false,
2474
+ "value": {
2475
+ "sessionId": "ses_fixture",
2476
+ "clientMessageId": "m-2",
2477
+ "content": [
2478
+ {
2479
+ "type": "image",
2480
+ "mimeType": "image/png",
2481
+ "data": "iVBORw0KGgo=",
2482
+ "path": "/etc/passwd"
2483
+ }
2484
+ ]
2485
+ }
2486
+ },
2487
+ {
2488
+ "name": "session.prompt with an image url",
2489
+ "check": "params",
2490
+ "method": "session.prompt",
2491
+ "valid": false,
2492
+ "value": {
2493
+ "sessionId": "ses_fixture",
2494
+ "clientMessageId": "m-2",
2495
+ "content": [
2496
+ {
2497
+ "type": "image",
2498
+ "mimeType": "image/png",
2499
+ "data": "iVBORw0KGgo=",
2500
+ "url": "file:///etc/passwd"
2501
+ }
2502
+ ]
2503
+ }
2504
+ },
2505
+ {
2506
+ "name": "session.prompt with an svg image",
2507
+ "check": "params",
2508
+ "method": "session.prompt",
2509
+ "valid": false,
2510
+ "value": {
2511
+ "sessionId": "ses_fixture",
2512
+ "clientMessageId": "m-2",
2513
+ "content": [
2514
+ {
2515
+ "type": "image",
2516
+ "mimeType": "image/svg+xml",
2517
+ "data": "PHN2Zz4="
2518
+ }
2519
+ ]
2520
+ }
2521
+ },
2522
+ {
2523
+ "name": "session.prompt with image data that is not base64",
2524
+ "check": "params",
2525
+ "method": "session.prompt",
2526
+ "valid": false,
2527
+ "value": {
2528
+ "sessionId": "ses_fixture",
2529
+ "clientMessageId": "m-2",
2530
+ "content": [
2531
+ {
2532
+ "type": "image",
2533
+ "mimeType": "image/png",
2534
+ "data": "not base64!"
2535
+ }
2536
+ ]
2537
+ }
2538
+ },
2539
+ {
2540
+ "name": "session.prompt with an image without data",
2541
+ "check": "params",
2542
+ "method": "session.prompt",
2543
+ "valid": false,
2544
+ "value": {
2545
+ "sessionId": "ses_fixture",
2546
+ "clientMessageId": "m-2",
2547
+ "content": [
2548
+ {
2549
+ "type": "image",
2550
+ "mimeType": "image/png"
2551
+ }
2552
+ ]
2553
+ }
2554
+ },
2555
+ {
2556
+ "name": "session.prompt with an unknown delivery",
2557
+ "check": "params",
2558
+ "method": "session.prompt",
2559
+ "valid": false,
2560
+ "value": {
2561
+ "sessionId": "ses_fixture",
2562
+ "clientMessageId": "m-1",
2563
+ "delivery": "later",
2564
+ "content": []
2565
+ }
2566
+ },
2567
+ {
2568
+ "name": "session.prompt result",
2569
+ "check": "result",
2570
+ "method": "session.prompt",
2571
+ "valid": true,
2572
+ "value": {
2573
+ "outcome": "accepted",
2574
+ "durable": true
2575
+ }
2576
+ },
2577
+ {
2578
+ "name": "session.prompt result of a repeat",
2579
+ "check": "result",
2580
+ "method": "session.prompt",
2581
+ "valid": true,
2582
+ "value": {
2583
+ "outcome": "accepted",
2584
+ "duplicate": true,
2585
+ "durable": true
2586
+ }
2587
+ },
2588
+ {
2589
+ "name": "session.prompt result of a refused prompt",
2590
+ "check": "result",
2591
+ "method": "session.prompt",
2592
+ "valid": true,
2593
+ "value": {
2594
+ "outcome": "failed",
2595
+ "error": {
2596
+ "message": "Session is busy"
2597
+ },
2598
+ "durable": true
2599
+ }
2600
+ },
2601
+ {
2602
+ "name": "session.prompt result without receipts",
2603
+ "check": "result",
2604
+ "method": "session.prompt",
2605
+ "valid": true,
2606
+ "value": {}
2607
+ },
2608
+ {
2609
+ "name": "session.interrupt params",
2610
+ "check": "params",
2611
+ "method": "session.interrupt",
2612
+ "valid": true,
2613
+ "value": {
2614
+ "sessionId": "ses_fixture"
2615
+ }
2616
+ },
2617
+ {
2618
+ "name": "session.interrupt result",
2619
+ "check": "result",
2620
+ "method": "session.interrupt",
2621
+ "valid": true,
2622
+ "value": {}
2623
+ },
2624
+ {
2625
+ "name": "session.configure params",
2626
+ "check": "params",
2627
+ "method": "session.configure",
2628
+ "valid": true,
2629
+ "value": {
2630
+ "sessionId": "ses_fixture",
2631
+ "mode": "read-only"
2632
+ }
2633
+ },
2634
+ {
2635
+ "name": "session.configure without mode",
2636
+ "check": "params",
2637
+ "method": "session.configure",
2638
+ "valid": true,
2639
+ "value": {
2640
+ "sessionId": "ses_fixture"
2641
+ }
2642
+ },
2643
+ {
2644
+ "name": "session.configure result",
2645
+ "check": "result",
2646
+ "method": "session.configure",
2647
+ "valid": true,
2648
+ "value": {
2649
+ "session": {
2650
+ "id": "ses_fixture",
2651
+ "projectRoot": "/work/project",
2652
+ "agent": "main",
2653
+ "runtime": "codex",
2654
+ "model": "gpt-6.1-sol",
2655
+ "mode": "workspace-write",
2656
+ "thinking": "low",
2657
+ "workflow": {
2658
+ "mode": "pho",
2659
+ "maxPeers": 2,
2660
+ "supervisor": false
2661
+ },
2662
+ "teamLabel": "Phở",
2663
+ "threadId": "thread-1",
2664
+ "persistent": true,
2665
+ "busy": false
2666
+ }
2667
+ }
2668
+ },
2669
+ {
2670
+ "name": "session.close params",
2671
+ "check": "params",
2672
+ "method": "session.close",
2673
+ "valid": true,
2674
+ "value": {
2675
+ "sessionId": "ses_fixture"
2676
+ }
2677
+ },
2678
+ {
2679
+ "name": "session.close result",
2680
+ "check": "result",
2681
+ "method": "session.close",
2682
+ "valid": true,
2683
+ "value": {}
2684
+ },
2685
+ {
2686
+ "name": "session.rename with 200 astral characters",
2687
+ "check": "params",
2688
+ "method": "session.rename",
2689
+ "valid": true,
2690
+ "value": {
2691
+ "sessionId": "ses_fixture",
2692
+ "title": "😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀"
2693
+ }
2694
+ },
2695
+ {
2696
+ "name": "session.rename with 201 characters",
2697
+ "check": "params",
2698
+ "method": "session.rename",
2699
+ "valid": false,
2700
+ "value": {
2701
+ "sessionId": "ses_fixture",
2702
+ "title": "😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀"
2703
+ }
2704
+ },
2705
+ {
2706
+ "name": "session.rename with a blank title",
2707
+ "check": "params",
2708
+ "method": "session.rename",
2709
+ "valid": false,
2710
+ "value": {
2711
+ "sessionId": "ses_fixture",
2712
+ "title": " "
2713
+ }
2714
+ },
2715
+ {
2716
+ "name": "session.rename result",
2717
+ "check": "result",
2718
+ "method": "session.rename",
2719
+ "valid": true,
2720
+ "value": {
2721
+ "session": {
2722
+ "id": "ses_fixture",
2723
+ "projectRoot": "/work/project",
2724
+ "agent": "main",
2725
+ "runtime": "codex",
2726
+ "model": "gpt-6.1-sol",
2727
+ "mode": "workspace-write",
2728
+ "thinking": "low",
2729
+ "workflow": {
2730
+ "mode": "pho",
2731
+ "maxPeers": 2,
2732
+ "supervisor": false
2733
+ },
2734
+ "teamLabel": "Phở",
2735
+ "threadId": "thread-1",
2736
+ "persistent": true,
2737
+ "busy": false,
2738
+ "status": "idle",
2739
+ "title": "Sửa lỗi 😀",
2740
+ "createdAt": "2026-10-15T00:00:00.000Z",
2741
+ "updatedAt": "2026-10-15T00:00:00.000Z"
2742
+ }
2743
+ }
2744
+ },
2745
+ {
2746
+ "name": "session.archive params",
2747
+ "check": "params",
2748
+ "method": "session.archive",
2749
+ "valid": true,
2750
+ "value": {
2751
+ "sessionId": "ses_fixture",
2752
+ "archived": false
2753
+ }
2754
+ },
2755
+ {
2756
+ "name": "session.archive result",
2757
+ "check": "result",
2758
+ "method": "session.archive",
2759
+ "valid": true,
2760
+ "value": {
2761
+ "session": {
2762
+ "id": "ses_fixture",
2763
+ "projectRoot": "/work/project",
2764
+ "agent": "main",
2765
+ "runtime": "codex",
2766
+ "model": "gpt-6.1-sol",
2767
+ "mode": "workspace-write",
2768
+ "thinking": "low",
2769
+ "workflow": {
2770
+ "mode": "pho",
2771
+ "maxPeers": 2,
2772
+ "supervisor": false
2773
+ },
2774
+ "teamLabel": "Phở",
2775
+ "threadId": "thread-1",
2776
+ "persistent": true,
2777
+ "busy": false,
2778
+ "status": "closed",
2779
+ "title": "Sửa lỗi 😀",
2780
+ "createdAt": "2026-10-15T00:00:00.000Z",
2781
+ "updatedAt": "2026-10-15T00:00:00.000Z",
2782
+ "archived": true
2783
+ }
2784
+ }
2785
+ },
2786
+ {
2787
+ "name": "session.get params",
2788
+ "check": "params",
2789
+ "method": "session.get",
2790
+ "valid": true,
2791
+ "value": {
2792
+ "sessionId": "ses_fixture"
2793
+ }
2794
+ },
2795
+ {
2796
+ "name": "session.get with a null session id",
2797
+ "check": "params",
2798
+ "method": "session.get",
2799
+ "valid": false,
2800
+ "value": {
2801
+ "sessionId": null
2802
+ }
2803
+ },
2804
+ {
2805
+ "name": "session.get result",
2806
+ "check": "result",
2807
+ "method": "session.get",
2808
+ "valid": true,
2809
+ "value": {
2810
+ "session": {
2811
+ "id": "ses_fixture",
2812
+ "projectRoot": "/work/project",
2813
+ "agent": "main",
2814
+ "runtime": "codex",
2815
+ "model": "gpt-6.1-sol",
2816
+ "mode": "workspace-write",
2817
+ "thinking": "low",
2818
+ "workflow": {
2819
+ "mode": "pho",
2820
+ "maxPeers": 2,
2821
+ "supervisor": false
2822
+ },
2823
+ "teamLabel": "Phở",
2824
+ "threadId": "thread-1",
2825
+ "persistent": true,
2826
+ "busy": false,
2827
+ "status": "error",
2828
+ "title": "Sửa lỗi 😀",
2829
+ "createdAt": "2026-10-15T00:00:00.000Z",
2830
+ "updatedAt": "2026-10-15T00:00:00.000Z",
2831
+ "lastError": {
2832
+ "code": "daemon_restarted",
2833
+ "message": "alpd stopped"
2834
+ }
2835
+ }
2836
+ }
2837
+ },
2838
+ {
2839
+ "name": "session.get result with an unknown status",
2840
+ "check": "result",
2841
+ "method": "session.get",
2842
+ "valid": false,
2843
+ "value": {
2844
+ "session": {
2845
+ "id": "ses_fixture",
2846
+ "projectRoot": "/work/project",
2847
+ "agent": "main",
2848
+ "runtime": "codex",
2849
+ "model": "gpt-6.1-sol",
2850
+ "mode": "workspace-write",
2851
+ "thinking": "low",
2852
+ "workflow": {
2853
+ "mode": "pho",
2854
+ "maxPeers": 2,
2855
+ "supervisor": false
2856
+ },
2857
+ "teamLabel": "Phở",
2858
+ "threadId": "thread-1",
2859
+ "persistent": true,
2860
+ "busy": false,
2861
+ "status": "paused",
2862
+ "title": "Sửa lỗi 😀",
2863
+ "createdAt": "2026-10-15T00:00:00.000Z",
2864
+ "updatedAt": "2026-10-15T00:00:00.000Z"
2865
+ }
2866
+ }
2867
+ },
2868
+ {
2869
+ "name": "session.get result of a session that takes images",
2870
+ "check": "result",
2871
+ "method": "session.get",
2872
+ "valid": true,
2873
+ "value": {
2874
+ "session": {
2875
+ "id": "ses_fixture",
2876
+ "projectRoot": "/work/project",
2877
+ "agent": "main",
2878
+ "runtime": "codex",
2879
+ "model": "gpt-6.1-sol",
2880
+ "mode": "workspace-write",
2881
+ "thinking": "low",
2882
+ "workflow": {
2883
+ "mode": "pho",
2884
+ "maxPeers": 2,
2885
+ "supervisor": false
2886
+ },
2887
+ "teamLabel": "Phở",
2888
+ "threadId": "thread-1",
2889
+ "persistent": true,
2890
+ "busy": false,
2891
+ "status": "idle",
2892
+ "title": "Sửa lỗi 😀",
2893
+ "createdAt": "2026-10-15T00:00:00.000Z",
2894
+ "updatedAt": "2026-10-15T00:00:00.000Z",
2895
+ "promptImages": true
2896
+ }
2897
+ }
2898
+ },
2899
+ {
2900
+ "name": "session.list params",
2901
+ "check": "params",
2902
+ "method": "session.list",
2903
+ "valid": true,
2904
+ "value": {
2905
+ "projectRoot": "/work/project",
2906
+ "rootsOnly": true,
2907
+ "includeClosed": true,
2908
+ "includeArchived": false
2909
+ }
2910
+ },
2911
+ {
2912
+ "name": "session.list with a null projectRoot",
2913
+ "check": "params",
2914
+ "method": "session.list",
2915
+ "valid": false,
2916
+ "value": {
2917
+ "projectRoot": null
2918
+ }
2919
+ },
2920
+ {
2921
+ "name": "session.list result",
2922
+ "check": "result",
2923
+ "method": "session.list",
2924
+ "valid": true,
2925
+ "value": {
2926
+ "sessions": [
2927
+ {
2928
+ "id": "ses_fixture",
2929
+ "projectRoot": "/work/project",
2930
+ "agent": "main",
2931
+ "runtime": "codex",
2932
+ "model": "gpt-6.1-sol",
2933
+ "mode": "workspace-write",
2934
+ "thinking": "low",
2935
+ "workflow": {
2936
+ "mode": "pho",
2937
+ "maxPeers": 2,
2938
+ "supervisor": false
2939
+ },
2940
+ "teamLabel": "Phở",
2941
+ "threadId": "thread-1",
2942
+ "persistent": true,
2943
+ "busy": false,
2944
+ "status": "idle",
2945
+ "title": "Sửa lỗi 😀",
2946
+ "createdAt": "2026-10-15T00:00:00.000Z",
2947
+ "updatedAt": "2026-10-15T00:00:00.000Z"
2948
+ }
2949
+ ]
2950
+ }
2951
+ },
2952
+ {
2953
+ "name": "session.list a page with a query",
2954
+ "check": "params",
2955
+ "method": "session.list",
2956
+ "valid": true,
2957
+ "value": {
2958
+ "projectRoot": "/work/project",
2959
+ "rootsOnly": true,
2960
+ "includeArchived": true,
2961
+ "limit": 200,
2962
+ "cursor": "eyJrIjpbMF19",
2963
+ "query": "sửa lỗi"
2964
+ }
2965
+ },
2966
+ {
2967
+ "name": "session.list with a zero limit",
2968
+ "check": "params",
2969
+ "method": "session.list",
2970
+ "valid": false,
2971
+ "value": {
2972
+ "limit": 0
2973
+ }
2974
+ },
2975
+ {
2976
+ "name": "session.list of several projects",
2977
+ "check": "params",
2978
+ "method": "session.list",
2979
+ "valid": true,
2980
+ "value": {
2981
+ "projectRoots": [
2982
+ "/work/project",
2983
+ "/private/work/project"
2984
+ ],
2985
+ "limit": 50
2986
+ }
2987
+ },
2988
+ {
2989
+ "name": "session.list with no projects",
2990
+ "check": "params",
2991
+ "method": "session.list",
2992
+ "valid": false,
2993
+ "value": {
2994
+ "projectRoots": []
2995
+ }
2996
+ },
2997
+ {
2998
+ "name": "session.list with a fractional limit",
2999
+ "check": "params",
3000
+ "method": "session.list",
3001
+ "valid": false,
3002
+ "value": {
3003
+ "limit": 2.5
3004
+ }
3005
+ },
3006
+ {
3007
+ "name": "session.list with an empty cursor",
3008
+ "check": "params",
3009
+ "method": "session.list",
3010
+ "valid": false,
3011
+ "value": {
3012
+ "cursor": ""
3013
+ }
3014
+ },
3015
+ {
3016
+ "name": "session.list a page with more after it",
3017
+ "check": "result",
3018
+ "method": "session.list",
3019
+ "valid": true,
3020
+ "value": {
3021
+ "sessions": [
3022
+ {
3023
+ "id": "ses_fixture",
3024
+ "projectRoot": "/work/project",
3025
+ "agent": "main",
3026
+ "runtime": "codex",
3027
+ "model": "gpt-6.1-sol",
3028
+ "mode": "workspace-write",
3029
+ "thinking": "low",
3030
+ "workflow": {
3031
+ "mode": "pho",
3032
+ "maxPeers": 2,
3033
+ "supervisor": false
3034
+ },
3035
+ "teamLabel": "Phở",
3036
+ "threadId": "thread-1",
3037
+ "persistent": true,
3038
+ "busy": false,
3039
+ "status": "idle",
3040
+ "title": "Sửa lỗi 😀",
3041
+ "createdAt": "2026-10-15T00:00:00.000Z",
3042
+ "updatedAt": "2026-10-15T00:00:00.000Z"
3043
+ }
3044
+ ],
3045
+ "nextCursor": "eyJrIjpbMF19"
3046
+ }
3047
+ },
3048
+ {
3049
+ "name": "session.status params",
3050
+ "check": "params",
3051
+ "method": "session.status",
3052
+ "valid": true,
3053
+ "value": {
3054
+ "sessionId": "ses_fixture"
3055
+ }
3056
+ },
3057
+ {
3058
+ "name": "session.status result",
3059
+ "check": "result",
3060
+ "method": "session.status",
3061
+ "valid": true,
3062
+ "value": {
3063
+ "status": {
3064
+ "rootId": "ses_fixture",
3065
+ "sessions": [
3066
+ {
3067
+ "id": "ses_fixture",
3068
+ "projectRoot": "/work/project",
3069
+ "agent": "main",
3070
+ "runtime": "codex",
3071
+ "model": "gpt-6.1-sol",
3072
+ "mode": "workspace-write",
3073
+ "thinking": "low",
3074
+ "workflow": {
3075
+ "mode": "pho",
3076
+ "maxPeers": 2,
3077
+ "supervisor": false
3078
+ },
3079
+ "teamLabel": "Phở",
3080
+ "threadId": "thread-1",
3081
+ "persistent": true,
3082
+ "busy": false,
3083
+ "state": "waiting_user",
3084
+ "idleMs": 1200,
3085
+ "workdir": "/work/project",
3086
+ "unreadMail": 0
3087
+ }
3088
+ ],
3089
+ "assignments": [
3090
+ {
3091
+ "id": "ses_child",
3092
+ "agent": "peer",
3093
+ "mode": "workspace-write",
3094
+ "status": "running",
3095
+ "startedAt": "2026-10-15T00:00:00.000Z",
3096
+ "requester": "ses_fixture",
3097
+ "isolation": "shared",
3098
+ "idleMs": 5
3099
+ }
3100
+ ],
3101
+ "questions": [
3102
+ {
3103
+ "id": "q_1",
3104
+ "sessionId": "ses_fixture",
3105
+ "rootId": "ses_fixture",
3106
+ "agent": "main",
3107
+ "body": "Tiếp tục?",
3108
+ "options": [
3109
+ "có",
3110
+ "không"
3111
+ ],
3112
+ "askedAt": "2026-10-15T00:00:00.000Z"
3113
+ }
3114
+ ],
3115
+ "worktrees": [],
3116
+ "leases": [
3117
+ {
3118
+ "checkout": "/work/project",
3119
+ "assignmentId": "ses_child",
3120
+ "agent": "peer"
3121
+ }
3122
+ ],
3123
+ "claims": [
3124
+ {
3125
+ "id": "pin_1",
3126
+ "project": "/work/project",
3127
+ "kind": "claim",
3128
+ "body": "Đang sửa server",
3129
+ "paths": [
3130
+ "src/server.ts"
3131
+ ],
3132
+ "agent": "peer",
3133
+ "sessionId": "ses_child",
3134
+ "rootId": "ses_fixture",
3135
+ "at": "2026-10-15T00:00:00.000Z"
3136
+ }
3137
+ ]
3138
+ }
3139
+ }
3140
+ },
3141
+ {
3142
+ "name": "session.message params",
3143
+ "check": "params",
3144
+ "method": "session.message",
3145
+ "valid": true,
3146
+ "value": {
3147
+ "sessionId": "ses_fixture",
3148
+ "text": "Ghi chú"
3149
+ }
3150
+ },
3151
+ {
3152
+ "name": "session.message result",
3153
+ "check": "result",
3154
+ "method": "session.message",
3155
+ "valid": true,
3156
+ "value": {}
3157
+ },
3158
+ {
3159
+ "name": "session.log params",
3160
+ "check": "params",
3161
+ "method": "session.log",
3162
+ "valid": true,
3163
+ "value": {
3164
+ "sessionId": "ses_fixture"
3165
+ }
3166
+ },
3167
+ {
3168
+ "name": "session.log result",
3169
+ "check": "result",
3170
+ "method": "session.log",
3171
+ "valid": true,
3172
+ "value": {
3173
+ "rootId": "ses_fixture",
3174
+ "entries": [
3175
+ {
3176
+ "ts": "2026-10-15T00:00:00.000Z",
3177
+ "event": "assignment.finished",
3178
+ "assignmentId": "a_1"
3179
+ }
3180
+ ]
3181
+ }
3182
+ },
3183
+ {
3184
+ "name": "extension.register params",
3185
+ "check": "params",
3186
+ "method": "extension.register",
3187
+ "valid": true,
3188
+ "value": {
3189
+ "method": "web.pairing"
3190
+ }
3191
+ },
3192
+ {
3193
+ "name": "extension.register result",
3194
+ "check": "result",
3195
+ "method": "extension.register",
3196
+ "valid": true,
3197
+ "value": {
3198
+ "registered": "web.pairing"
3199
+ }
3200
+ },
3201
+ {
3202
+ "name": "extension.unregister params",
3203
+ "check": "params",
3204
+ "method": "extension.unregister",
3205
+ "valid": true,
3206
+ "value": {
3207
+ "method": "web.pairing"
3208
+ }
3209
+ },
3210
+ {
3211
+ "name": "extension.unregister result",
3212
+ "check": "result",
3213
+ "method": "extension.unregister",
3214
+ "valid": true,
3215
+ "value": {
3216
+ "unregistered": "web.pairing"
3217
+ }
3218
+ },
3219
+ {
3220
+ "name": "team.list params",
3221
+ "check": "params",
3222
+ "method": "team.list",
3223
+ "valid": true,
3224
+ "value": {
3225
+ "projectRoot": "/work/project"
3226
+ }
3227
+ },
3228
+ {
3229
+ "name": "team.list without a project",
3230
+ "check": "params",
3231
+ "method": "team.list",
3232
+ "valid": true,
3233
+ "value": {}
3234
+ },
3235
+ {
3236
+ "name": "team.list with an empty projectRoot",
3237
+ "check": "params",
3238
+ "method": "team.list",
3239
+ "valid": false,
3240
+ "value": {
3241
+ "projectRoot": ""
3242
+ }
3243
+ },
3244
+ {
3245
+ "name": "team.list result",
3246
+ "check": "result",
3247
+ "method": "team.list",
3248
+ "valid": true,
3249
+ "value": {
3250
+ "projectRoot": "/work/project",
3251
+ "teams": [
3252
+ {
3253
+ "id": "pho",
3254
+ "label": "Phở",
3255
+ "source": "builtin"
3256
+ },
3257
+ {
3258
+ "id": "mine",
3259
+ "source": "library",
3260
+ "error": "agent x is missing"
3261
+ }
3262
+ ]
3263
+ }
3264
+ },
3265
+ {
3266
+ "name": "task.list params",
3267
+ "check": "params",
3268
+ "method": "task.list",
3269
+ "valid": true,
3270
+ "value": {
3271
+ "projectRoot": "/work/project"
3272
+ }
3273
+ },
3274
+ {
3275
+ "name": "task.list without projectRoot",
3276
+ "check": "params",
3277
+ "method": "task.list",
3278
+ "valid": false,
3279
+ "value": {}
3280
+ },
3281
+ {
3282
+ "name": "task.list result",
3283
+ "check": "result",
3284
+ "method": "task.list",
3285
+ "valid": true,
3286
+ "value": {
3287
+ "projectRoot": "/work/project",
3288
+ "tasks": [
3289
+ {
3290
+ "id": "t-a3f8",
3291
+ "title": "Viết test 😀",
3292
+ "type": "task",
3293
+ "priority": 2,
3294
+ "status": "open",
3295
+ "rev": 3,
3296
+ "ready": true,
3297
+ "approvals": [
3298
+ {
3299
+ "gate": "g1",
3300
+ "note": "Duyệt?"
3301
+ }
3302
+ ],
3303
+ "labels": [
3304
+ "rpc"
3305
+ ],
3306
+ "createdAt": "2026-10-15T00:00:00.000Z",
3307
+ "updatedAt": "2026-10-15T00:00:00.000Z"
3308
+ },
3309
+ {
3310
+ "id": "t-a3f8.1",
3311
+ "title": "Viết test 😀",
3312
+ "type": "task",
3313
+ "priority": 2,
3314
+ "status": "closed",
3315
+ "rev": 0,
3316
+ "ready": false,
3317
+ "approvals": [
3318
+ {
3319
+ "gate": "g1",
3320
+ "note": "Duyệt?"
3321
+ }
3322
+ ],
3323
+ "labels": [
3324
+ "rpc"
3325
+ ],
3326
+ "createdAt": "2026-10-15T00:00:00.000Z",
3327
+ "updatedAt": "2026-10-15T00:00:00.000Z",
3328
+ "closed": {
3329
+ "reason": "done",
3330
+ "at": "2026-10-15T00:00:00.000Z"
3331
+ },
3332
+ "progress": {
3333
+ "done": 1,
3334
+ "total": 2
3335
+ }
3336
+ }
3337
+ ],
3338
+ "unreadable": [
3339
+ {
3340
+ "file": ".alp/tasks/t-bad.json",
3341
+ "error": "not JSON"
3342
+ }
3343
+ ],
3344
+ "revision": "abc"
3345
+ }
3346
+ },
3347
+ {
3348
+ "name": "task.list result with an unknown status",
3349
+ "check": "result",
3350
+ "method": "task.list",
3351
+ "valid": false,
3352
+ "value": {
3353
+ "projectRoot": "/work/project",
3354
+ "tasks": [
3355
+ {
3356
+ "id": "t-a3f8",
3357
+ "title": "Viết test 😀",
3358
+ "type": "task",
3359
+ "priority": 2,
3360
+ "status": "blocked",
3361
+ "rev": 3,
3362
+ "ready": true,
3363
+ "approvals": [
3364
+ {
3365
+ "gate": "g1",
3366
+ "note": "Duyệt?"
3367
+ }
3368
+ ],
3369
+ "labels": [
3370
+ "rpc"
3371
+ ],
3372
+ "createdAt": "2026-10-15T00:00:00.000Z",
3373
+ "updatedAt": "2026-10-15T00:00:00.000Z"
3374
+ }
3375
+ ],
3376
+ "unreadable": [],
3377
+ "revision": "x"
3378
+ }
3379
+ },
3380
+ {
3381
+ "name": "task.create params",
3382
+ "check": "params",
3383
+ "method": "task.create",
3384
+ "valid": true,
3385
+ "value": {
3386
+ "projectRoot": "/work/project",
3387
+ "title": "Sửa lỗi",
3388
+ "priority": 0,
3389
+ "requestId": "req-1"
3390
+ }
3391
+ },
3392
+ {
3393
+ "name": "task.create with a blank title",
3394
+ "check": "params",
3395
+ "method": "task.create",
3396
+ "valid": false,
3397
+ "value": {
3398
+ "projectRoot": "/work/project",
3399
+ "title": " "
3400
+ }
3401
+ },
3402
+ {
3403
+ "name": "task.create with priority 5",
3404
+ "check": "params",
3405
+ "method": "task.create",
3406
+ "valid": false,
3407
+ "value": {
3408
+ "projectRoot": "/work/project",
3409
+ "title": "x",
3410
+ "priority": 5
3411
+ }
3412
+ },
3413
+ {
3414
+ "name": "task.create result",
3415
+ "check": "result",
3416
+ "method": "task.create",
3417
+ "valid": true,
3418
+ "value": {
3419
+ "id": "t-a3f8"
3420
+ }
3421
+ },
3422
+ {
3423
+ "name": "task.create result of a repeat",
3424
+ "check": "result",
3425
+ "method": "task.create",
3426
+ "valid": true,
3427
+ "value": {
3428
+ "id": "t-a3f8",
3429
+ "duplicate": true
3430
+ }
3431
+ },
3432
+ {
3433
+ "name": "task.update params",
3434
+ "check": "params",
3435
+ "method": "task.update",
3436
+ "valid": true,
3437
+ "value": {
3438
+ "projectRoot": "/work/project",
3439
+ "id": "t-a3f8",
3440
+ "action": "close",
3441
+ "note": "Xong",
3442
+ "ifRev": 3
3443
+ }
3444
+ },
3445
+ {
3446
+ "name": "task.update with action approve (that is task.gate.resolve)",
3447
+ "check": "params",
3448
+ "method": "task.update",
3449
+ "valid": false,
3450
+ "value": {
3451
+ "projectRoot": "/work/project",
3452
+ "id": "t-a3f8",
3453
+ "action": "approve"
3454
+ }
3455
+ },
3456
+ {
3457
+ "name": "task.update with an id that is not a task id",
3458
+ "check": "params",
3459
+ "method": "task.update",
3460
+ "valid": false,
3461
+ "value": {
3462
+ "projectRoot": "/work/project",
3463
+ "id": "bd-1",
3464
+ "action": "close"
3465
+ }
3466
+ },
3467
+ {
3468
+ "name": "task.update result",
3469
+ "check": "result",
3470
+ "method": "task.update",
3471
+ "valid": true,
3472
+ "value": {
3473
+ "id": "t-a3f8",
3474
+ "status": "closed",
3475
+ "rev": 4,
3476
+ "landed": "Epic t-a3f8 landed"
3477
+ }
3478
+ },
3479
+ {
3480
+ "name": "task.gate.resolve params",
3481
+ "check": "params",
3482
+ "method": "task.gate.resolve",
3483
+ "valid": true,
3484
+ "value": {
3485
+ "projectRoot": "/work/project",
3486
+ "id": "t-a3f8",
3487
+ "gate": "g1",
3488
+ "note": "OK"
3489
+ }
3490
+ },
3491
+ {
3492
+ "name": "task.gate.resolve result",
3493
+ "check": "result",
3494
+ "method": "task.gate.resolve",
3495
+ "valid": true,
3496
+ "value": {
3497
+ "id": "t-a3f8",
3498
+ "status": "open",
3499
+ "rev": 5
3500
+ }
3501
+ },
3502
+ {
3503
+ "name": "library.list params",
3504
+ "check": "params",
3505
+ "method": "library.list",
3506
+ "valid": true,
3507
+ "value": {
3508
+ "kind": "agents",
3509
+ "projectRoot": "/work/project"
3510
+ }
3511
+ },
3512
+ {
3513
+ "name": "library.list with an unknown kind",
3514
+ "check": "params",
3515
+ "method": "library.list",
3516
+ "valid": false,
3517
+ "value": {
3518
+ "kind": "plugins"
3519
+ }
3520
+ },
3521
+ {
3522
+ "name": "library.list result",
3523
+ "check": "result",
3524
+ "method": "library.list",
3525
+ "valid": true,
3526
+ "value": {
3527
+ "projectRoot": null,
3528
+ "entries": [
3529
+ {
3530
+ "name": "main",
3531
+ "source": "builtin"
3532
+ },
3533
+ {
3534
+ "name": "reviewer",
3535
+ "source": "project",
3536
+ "overrides": "library",
3537
+ "description": "Đọc lại",
3538
+ "usedBy": [
3539
+ "team pho"
3540
+ ]
3541
+ }
3542
+ ]
3543
+ }
3544
+ },
3545
+ {
3546
+ "name": "library.get params",
3547
+ "check": "params",
3548
+ "method": "library.get",
3549
+ "valid": true,
3550
+ "value": {
3551
+ "kind": "mcp",
3552
+ "name": "docs",
3553
+ "projectRoot": "/work/project",
3554
+ "scope": "project"
3555
+ }
3556
+ },
3557
+ {
3558
+ "name": "library.get with the name ..",
3559
+ "check": "params",
3560
+ "method": "library.get",
3561
+ "valid": false,
3562
+ "value": {
3563
+ "kind": "mcp",
3564
+ "name": ".."
3565
+ }
3566
+ },
3567
+ {
3568
+ "name": "library.get with a slash in the name",
3569
+ "check": "params",
3570
+ "method": "library.get",
3571
+ "valid": false,
3572
+ "value": {
3573
+ "kind": "mcp",
3574
+ "name": "a/b"
3575
+ }
3576
+ },
3577
+ {
3578
+ "name": "library.get result",
3579
+ "check": "result",
3580
+ "method": "library.get",
3581
+ "valid": true,
3582
+ "value": {
3583
+ "kind": "mcp",
3584
+ "name": "docs",
3585
+ "source": "library",
3586
+ "content": {
3587
+ "server": {
3588
+ "url": "https://example.invalid/mcp",
3589
+ "headers": {
3590
+ "Authorization": {
3591
+ "$secret": "keep"
3592
+ }
3593
+ }
3594
+ }
3595
+ },
3596
+ "revision": "r-1",
3597
+ "usedBy": [
3598
+ "agent main"
3599
+ ],
3600
+ "secrets": [
3601
+ "/server/headers/Authorization"
3602
+ ]
3603
+ }
3604
+ },
3605
+ {
3606
+ "name": "library.get result of a built-in agent",
3607
+ "check": "result",
3608
+ "method": "library.get",
3609
+ "valid": true,
3610
+ "value": {
3611
+ "kind": "agents",
3612
+ "name": "main",
3613
+ "source": "builtin",
3614
+ "content": {
3615
+ "instructions": "…"
3616
+ },
3617
+ "revision": null,
3618
+ "usedBy": [],
3619
+ "librarySkills": [
3620
+ "tdd"
3621
+ ]
3622
+ }
3623
+ },
3624
+ {
3625
+ "name": "library.save params",
3626
+ "check": "params",
3627
+ "method": "library.save",
3628
+ "valid": true,
3629
+ "value": {
3630
+ "kind": "providers",
3631
+ "name": "gemini",
3632
+ "scope": "library",
3633
+ "content": {
3634
+ "provider": {
3635
+ "kind": "acp",
3636
+ "command": "gemini",
3637
+ "env": {
3638
+ "GEMINI_API_KEY": {
3639
+ "$secret": "keep"
3640
+ }
3641
+ }
3642
+ }
3643
+ },
3644
+ "revision": "r-1"
3645
+ }
3646
+ },
3647
+ {
3648
+ "name": "library.save creating a team with sync",
3649
+ "check": "params",
3650
+ "method": "library.save",
3651
+ "valid": true,
3652
+ "value": {
3653
+ "kind": "teams",
3654
+ "name": "mine",
3655
+ "scope": "project",
3656
+ "projectRoot": "/work/project",
3657
+ "content": {
3658
+ "team": {}
3659
+ },
3660
+ "revision": null,
3661
+ "sync": "known-projects"
3662
+ }
3663
+ },
3664
+ {
3665
+ "name": "library.save with an unknown scope",
3666
+ "check": "params",
3667
+ "method": "library.save",
3668
+ "valid": false,
3669
+ "value": {
3670
+ "kind": "skills",
3671
+ "name": "tdd",
3672
+ "scope": "everywhere",
3673
+ "content": {}
3674
+ }
3675
+ },
3676
+ {
3677
+ "name": "library.save result",
3678
+ "check": "result",
3679
+ "method": "library.save",
3680
+ "valid": true,
3681
+ "value": {
3682
+ "revision": "r-2",
3683
+ "syncedProjects": 2,
3684
+ "syncErrors": []
3685
+ }
3686
+ },
3687
+ {
3688
+ "name": "library.delete params",
3689
+ "check": "params",
3690
+ "method": "library.delete",
3691
+ "valid": true,
3692
+ "value": {
3693
+ "kind": "skills",
3694
+ "name": "tdd",
3695
+ "scope": "library",
3696
+ "revision": "r-2"
3697
+ }
3698
+ },
3699
+ {
3700
+ "name": "library.delete result",
3701
+ "check": "result",
3702
+ "method": "library.delete",
3703
+ "valid": true,
3704
+ "value": {
3705
+ "removed": true,
3706
+ "now": "builtin"
3707
+ }
3708
+ },
3709
+ {
3710
+ "name": "library.duplicate params",
3711
+ "check": "params",
3712
+ "method": "library.duplicate",
3713
+ "valid": true,
3714
+ "value": {
3715
+ "kind": "agents",
3716
+ "from": "main",
3717
+ "to": "main-2",
3718
+ "scope": "library"
3719
+ }
3720
+ },
3721
+ {
3722
+ "name": "library.duplicate result",
3723
+ "check": "result",
3724
+ "method": "library.duplicate",
3725
+ "valid": true,
3726
+ "value": {
3727
+ "revision": "r-3"
3728
+ }
3729
+ },
3730
+ {
3731
+ "name": "library.rename params",
3732
+ "check": "params",
3733
+ "method": "library.rename",
3734
+ "valid": true,
3735
+ "value": {
3736
+ "kind": "agents",
3737
+ "from": "main-2",
3738
+ "to": "helper",
3739
+ "scope": "project",
3740
+ "projectRoot": "/work/project"
3741
+ }
3742
+ },
3743
+ {
3744
+ "name": "library.rename result",
3745
+ "check": "result",
3746
+ "method": "library.rename",
3747
+ "valid": true,
3748
+ "value": {
3749
+ "revision": "r-4"
3750
+ }
3751
+ },
3752
+ {
3753
+ "name": "library.skills.set params",
3754
+ "check": "params",
3755
+ "method": "library.skills.set",
3756
+ "valid": true,
3757
+ "value": {
3758
+ "agent": "main",
3759
+ "skills": [
3760
+ "tdd"
3761
+ ]
3762
+ }
3763
+ },
3764
+ {
3765
+ "name": "library.skills.set result",
3766
+ "check": "result",
3767
+ "method": "library.skills.set",
3768
+ "valid": true,
3769
+ "value": {
3770
+ "skills": [
3771
+ "tdd"
3772
+ ]
3773
+ }
3774
+ },
3775
+ {
3776
+ "name": "library.models params",
3777
+ "check": "params",
3778
+ "method": "library.models",
3779
+ "valid": true,
3780
+ "value": {}
3781
+ },
3782
+ {
3783
+ "name": "library.models result",
3784
+ "check": "result",
3785
+ "method": "library.models",
3786
+ "valid": true,
3787
+ "value": {
3788
+ "models": [
3789
+ {
3790
+ "id": "codex:gpt-6.1-sol",
3791
+ "label": "codex · GPT-6.1-Sol",
3792
+ "efforts": [
3793
+ "low",
3794
+ "high"
3795
+ ],
3796
+ "effort": "low"
3797
+ },
3798
+ {
3799
+ "id": "acp:gemini",
3800
+ "label": "Gemini · Provider default",
3801
+ "efforts": []
3802
+ }
3803
+ ]
3804
+ }
3805
+ },
3806
+ {
3807
+ "name": "settings.language.get params",
3808
+ "check": "params",
3809
+ "method": "settings.language.get",
3810
+ "valid": true,
3811
+ "value": {}
3812
+ },
3813
+ {
3814
+ "name": "settings.language.get result",
3815
+ "check": "result",
3816
+ "method": "settings.language.get",
3817
+ "valid": true,
3818
+ "value": {
3819
+ "language": null,
3820
+ "applies": "Vietnamese",
3821
+ "default": "Vietnamese"
3822
+ }
3823
+ },
3824
+ {
3825
+ "name": "settings.language.set params",
3826
+ "check": "params",
3827
+ "method": "settings.language.set",
3828
+ "valid": true,
3829
+ "value": {
3830
+ "language": "English"
3831
+ }
3832
+ },
3833
+ {
3834
+ "name": "settings.language.set clearing the language",
3835
+ "check": "params",
3836
+ "method": "settings.language.set",
3837
+ "valid": true,
3838
+ "value": {
3839
+ "language": null
3840
+ }
3841
+ },
3842
+ {
3843
+ "name": "settings.language.set without language",
3844
+ "check": "params",
3845
+ "method": "settings.language.set",
3846
+ "valid": false,
3847
+ "value": {}
3848
+ },
3849
+ {
3850
+ "name": "settings.language.set result",
3851
+ "check": "result",
3852
+ "method": "settings.language.set",
3853
+ "valid": true,
3854
+ "value": {
3855
+ "language": "English",
3856
+ "applies": "English",
3857
+ "default": "Vietnamese"
3858
+ }
3859
+ },
3860
+ {
3861
+ "name": "daemon.hello with a string protocolVersion",
3862
+ "check": "params",
3863
+ "method": "daemon.hello",
3864
+ "valid": false,
3865
+ "value": {
3866
+ "protocolVersion": "1"
3867
+ }
3868
+ },
3869
+ {
3870
+ "name": "session.list with a string flag",
3871
+ "check": "params",
3872
+ "method": "session.list",
3873
+ "valid": false,
3874
+ "value": {
3875
+ "includeClosed": "yes"
3876
+ }
3877
+ },
3878
+ {
3879
+ "name": "extension.register without method",
3880
+ "check": "params",
3881
+ "method": "extension.register",
3882
+ "valid": false,
3883
+ "value": {}
3884
+ },
3885
+ {
3886
+ "name": "question.answer without questionId",
3887
+ "check": "params",
3888
+ "method": "question.answer",
3889
+ "valid": false,
3890
+ "value": {
3891
+ "text": "có"
3892
+ }
3893
+ },
3894
+ {
3895
+ "name": "session.prompt result with outcome unknown (that is an error, never a result)",
3896
+ "check": "result",
3897
+ "method": "session.prompt",
3898
+ "valid": false,
3899
+ "value": {
3900
+ "outcome": "unknown"
3901
+ }
3902
+ },
3903
+ {
3904
+ "name": "fractional cursor",
3905
+ "check": "envelope",
3906
+ "valid": false,
3907
+ "value": {
3908
+ "sessionId": "ses_fixture",
3909
+ "epoch": "epoch-1",
3910
+ "seq": 3,
3911
+ "cursor": 1.5,
3912
+ "ts": "2026-10-15T00:00:00.000Z",
3913
+ "event": {
3914
+ "type": "session.ready"
3915
+ }
3916
+ }
3917
+ }
3918
+ ]
3919
+ }