deepdebug-local-agent 1.7.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/.claude/context.md +2 -1
  2. package/CLAUDE.md +1 -1
  3. package/docs/la-protocol-v2.md +27 -4
  4. package/env.example +12 -0
  5. package/package.json +1 -1
  6. package/scripts/incident-parity/Gen.java +256 -0
  7. package/scripts/incident-parity/LogEntry.java +17 -0
  8. package/scripts/incident-parity/extract.py +51 -0
  9. package/scripts/incident-parity/gen.sh +32 -0
  10. package/src/incident-detector/README.md +52 -0
  11. package/src/incident-detector/aggregator.js +78 -0
  12. package/src/incident-detector/categorize.js +48 -0
  13. package/src/incident-detector/config.js +95 -0
  14. package/src/incident-detector/detector.js +93 -0
  15. package/src/incident-detector/emitter.js +164 -0
  16. package/src/incident-detector/index.js +44 -0
  17. package/src/incident-detector/java-compat.js +66 -0
  18. package/src/incident-detector/normalize.js +209 -0
  19. package/src/incident-detector/parse.js +114 -0
  20. package/src/incident-detector/sources/file-source.js +113 -0
  21. package/src/incident-detector/sources/loki-source.js +101 -0
  22. package/src/incident-detector/sources/stream-source.js +39 -0
  23. package/src/incident-detector/sources/webhook-source.js +109 -0
  24. package/src/incident-detector/store.js +119 -0
  25. package/src/la-protocol-v2/contract/CONTRACT_SOURCE.json +24 -16
  26. package/src/la-protocol-v2/contract/README.md +103 -3
  27. package/src/la-protocol-v2/contract/config.update.schema.json +85 -1
  28. package/src/la-protocol-v2/contract/hello.schema.json +26 -1
  29. package/src/la-protocol-v2/contract/incident.candidate.schema.json +11 -0
  30. package/src/la-protocol-v2/contract/index.json +9 -2
  31. package/src/la-protocol-v2/contract/ready.schema.json +8 -0
  32. package/src/la-protocol-v2/contract/register.schema.json +26 -1
  33. package/src/la-protocol-v2/contract/webhook.forward.schema.json +72 -3
  34. package/src/la-protocol-v2/contract.js +45 -7
  35. package/src/la-protocol-v2/llm-key/config.js +29 -0
  36. package/src/la-protocol-v2/llm-key/handler.js +33 -0
  37. package/src/la-protocol-v2/llm-key/install.js +21 -0
  38. package/src/la-protocol-v2/llm-key/store.js +173 -0
  39. package/src/la-protocol-v2/runtime.js +44 -1
  40. package/src/la-protocol-v2/session.js +47 -13
  41. package/src/la-protocol-v2/webhooks/assembler.js +85 -0
  42. package/src/la-protocol-v2/webhooks/config.js +51 -0
  43. package/src/la-protocol-v2/webhooks/handler.js +125 -0
  44. package/src/la-protocol-v2/webhooks/install.js +22 -0
  45. package/test/contract/la-protocol-v2/vectors/ack.vectors.json +91 -0
  46. package/test/contract/la-protocol-v2/vectors/config.update.vectors.json +1339 -0
  47. package/test/contract/la-protocol-v2/vectors/hello.vectors.json +261 -0
  48. package/test/contract/la-protocol-v2/vectors/incident.candidate.vectors.json +623 -0
  49. package/test/contract/la-protocol-v2/vectors/ready.vectors.json +599 -0
  50. package/test/contract/la-protocol-v2/vectors/register.vectors.json +275 -0
  51. package/test/contract/la-protocol-v2/vectors/traces/invalid-webhook-chunk-after-last.json +186 -0
  52. package/test/contract/la-protocol-v2/vectors/traces/invalid-webhook-chunk-body-hash-changes.json +186 -0
  53. package/test/contract/la-protocol-v2/vectors/traces/invalid-webhook-chunk-last-flag-wrong.json +186 -0
  54. package/test/contract/la-protocol-v2/vectors/traces/invalid-webhook-chunk-non-last-too-short.json +152 -0
  55. package/test/contract/la-protocol-v2/vectors/traces/invalid-webhook-chunk-out-of-order.json +152 -0
  56. package/test/contract/la-protocol-v2/vectors/traces/invalid-webhook-chunk-sha-mismatch.json +186 -0
  57. package/test/contract/la-protocol-v2/vectors/traces/invalid-webhook-chunk-total-changes.json +186 -0
  58. package/test/contract/la-protocol-v2/vectors/traces/valid-webhook-chunks-in-order.json +218 -0
  59. package/test/contract/la-protocol-v2/vectors/webhook.forward.vectors.json +1263 -0
  60. package/test/incident-detector/parity.test.js +66 -0
  61. package/test/incident-detector/parity.vectors.json +2619 -0
  62. package/test/incident-detector/size-model.test.js +127 -0
  63. package/test/incident-detector/sources.test.js +179 -0
  64. package/test/incident-detector/units.test.js +430 -0
  65. package/test/incident-detector/wiring.test.js +165 -0
  66. package/test/la-protocol-v2/contract-v21.test.js +107 -0
  67. package/test/la-protocol-v2/contract.test.js +6 -4
  68. package/test/la-protocol-v2/helpers/reference-cp.js +8 -4
  69. package/test/la-protocol-v2/llm-key.test.js +509 -0
  70. package/test/la-protocol-v2/traces.test.js +3 -3
  71. package/test/la-protocol-v2/webhook-receiver.test.js +702 -0
@@ -394,6 +394,281 @@
394
394
  "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
395
395
  }
396
396
  }
397
+ },
398
+ {
399
+ "name": "capabilities-llm-key-and-webhook-chunked",
400
+ "why": "v2.1 LA announces contract.v2.1, llm.key and webhook.chunked",
401
+ "expect": {
402
+ "valid": true
403
+ },
404
+ "message": {
405
+ "schemaVersion": 2,
406
+ "type": "register",
407
+ "msgId": "00000000-0000-4000-8000-000000000001",
408
+ "seq": 0,
409
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
410
+ "workspaceId": "ws-1",
411
+ "ts": "2026-10-29T10:00:00Z",
412
+ "agentId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
413
+ "payload": {
414
+ "protocol": 2,
415
+ "laVersion": "2.4.0",
416
+ "capabilities": [
417
+ "content.request",
418
+ "webhook.forward",
419
+ "webhook.chunked",
420
+ "llm.key",
421
+ "contract.v2.1"
422
+ ],
423
+ "signatureMode": "enforce",
424
+ "workspaces": [
425
+ {
426
+ "workspaceId": "ws-1",
427
+ "pathSha256": "abababababababababababababababababababababababababababababababab"
428
+ }
429
+ ]
430
+ }
431
+ }
432
+ },
433
+ {
434
+ "name": "capability-llm-key-held",
435
+ "why": "v2.1 LA with a live, unexpired LLM key in use announces llm.key.held next to llm.key",
436
+ "expect": {
437
+ "valid": true
438
+ },
439
+ "message": {
440
+ "schemaVersion": 2,
441
+ "type": "register",
442
+ "msgId": "00000000-0000-4000-8000-000000000001",
443
+ "seq": 0,
444
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
445
+ "workspaceId": "ws-1",
446
+ "ts": "2026-10-29T10:00:00Z",
447
+ "agentId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
448
+ "payload": {
449
+ "protocol": 2,
450
+ "laVersion": "2.4.0",
451
+ "capabilities": [
452
+ "content.request",
453
+ "webhook.forward",
454
+ "webhook.chunked",
455
+ "llm.key",
456
+ "llm.key.held",
457
+ "contract.v2.1"
458
+ ],
459
+ "signatureMode": "enforce",
460
+ "workspaces": [
461
+ {
462
+ "workspaceId": "ws-1",
463
+ "pathSha256": "abababababababababababababababababababababababababababababababab"
464
+ }
465
+ ]
466
+ }
467
+ }
468
+ },
469
+ {
470
+ "name": "capability-llm-key-without-held-after-restart",
471
+ "why": "the same LA after a restart (memory-only key lost): llm.key but NOT llm.key.held, so the CP delivers a key again (2.0 behaviour for the key)",
472
+ "expect": {
473
+ "valid": true
474
+ },
475
+ "message": {
476
+ "schemaVersion": 2,
477
+ "type": "register",
478
+ "msgId": "00000000-0000-4000-8000-000000000001",
479
+ "seq": 0,
480
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
481
+ "workspaceId": "ws-1",
482
+ "ts": "2026-10-29T10:00:00Z",
483
+ "agentId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
484
+ "payload": {
485
+ "protocol": 2,
486
+ "laVersion": "2.4.0",
487
+ "capabilities": [
488
+ "content.request",
489
+ "webhook.forward",
490
+ "webhook.chunked",
491
+ "llm.key",
492
+ "contract.v2.1"
493
+ ],
494
+ "signatureMode": "enforce",
495
+ "workspaces": [
496
+ {
497
+ "workspaceId": "ws-1",
498
+ "pathSha256": "abababababababababababababababababababababababababababababababab"
499
+ }
500
+ ]
501
+ }
502
+ }
503
+ },
504
+ {
505
+ "name": "capability-llm-key-held-without-llm-key",
506
+ "why": "llm.key.held is only meaningful for an LA that handles llm.key: it must announce both",
507
+ "expect": {
508
+ "valid": false,
509
+ "code": "schema_violation"
510
+ },
511
+ "message": {
512
+ "schemaVersion": 2,
513
+ "type": "register",
514
+ "msgId": "00000000-0000-4000-8000-000000000001",
515
+ "seq": 0,
516
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
517
+ "workspaceId": "ws-1",
518
+ "ts": "2026-10-29T10:00:00Z",
519
+ "agentId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
520
+ "payload": {
521
+ "protocol": 2,
522
+ "laVersion": "2.4.0",
523
+ "capabilities": [
524
+ "content.request",
525
+ "llm.key.held",
526
+ "contract.v2.1"
527
+ ],
528
+ "signatureMode": "enforce",
529
+ "workspaces": [
530
+ {
531
+ "workspaceId": "ws-1",
532
+ "pathSha256": "abababababababababababababababababababababababababababababababab"
533
+ }
534
+ ]
535
+ }
536
+ }
537
+ },
538
+ {
539
+ "name": "capability-llm-key-held-alone",
540
+ "why": "llm.key.held with no llm.key and no other capability",
541
+ "expect": {
542
+ "valid": false,
543
+ "code": "schema_violation"
544
+ },
545
+ "message": {
546
+ "schemaVersion": 2,
547
+ "type": "register",
548
+ "msgId": "00000000-0000-4000-8000-000000000001",
549
+ "seq": 0,
550
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
551
+ "workspaceId": "ws-1",
552
+ "ts": "2026-10-29T10:00:00Z",
553
+ "agentId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
554
+ "payload": {
555
+ "protocol": 2,
556
+ "laVersion": "2.4.0",
557
+ "capabilities": [
558
+ "llm.key.held"
559
+ ],
560
+ "signatureMode": "enforce",
561
+ "workspaces": [
562
+ {
563
+ "workspaceId": "ws-1",
564
+ "pathSha256": "abababababababababababababababababababababababababababababababab"
565
+ }
566
+ ]
567
+ }
568
+ }
569
+ },
570
+ {
571
+ "name": "capability-llm-key-held-uppercase",
572
+ "why": "capability names are lower-case: LLM.key.held does not match the name pattern",
573
+ "expect": {
574
+ "valid": false,
575
+ "code": "schema_violation",
576
+ "keyword": "pattern"
577
+ },
578
+ "message": {
579
+ "schemaVersion": 2,
580
+ "type": "register",
581
+ "msgId": "00000000-0000-4000-8000-000000000001",
582
+ "seq": 0,
583
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
584
+ "workspaceId": "ws-1",
585
+ "ts": "2026-10-29T10:00:00Z",
586
+ "agentId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
587
+ "payload": {
588
+ "protocol": 2,
589
+ "laVersion": "2.4.0",
590
+ "capabilities": [
591
+ "llm.key",
592
+ "LLM.key.held"
593
+ ],
594
+ "signatureMode": "enforce",
595
+ "workspaces": [
596
+ {
597
+ "workspaceId": "ws-1",
598
+ "pathSha256": "abababababababababababababababababababababababababababababababab"
599
+ }
600
+ ]
601
+ }
602
+ }
603
+ },
604
+ {
605
+ "name": "capability-llm-key-held-trailing-dot",
606
+ "why": "a trailing separator is not a valid capability name",
607
+ "expect": {
608
+ "valid": false,
609
+ "code": "schema_violation",
610
+ "keyword": "pattern"
611
+ },
612
+ "message": {
613
+ "schemaVersion": 2,
614
+ "type": "register",
615
+ "msgId": "00000000-0000-4000-8000-000000000001",
616
+ "seq": 0,
617
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
618
+ "workspaceId": "ws-1",
619
+ "ts": "2026-10-29T10:00:00Z",
620
+ "agentId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
621
+ "payload": {
622
+ "protocol": 2,
623
+ "laVersion": "2.4.0",
624
+ "capabilities": [
625
+ "llm.key",
626
+ "llm.key.held."
627
+ ],
628
+ "signatureMode": "enforce",
629
+ "workspaces": [
630
+ {
631
+ "workspaceId": "ws-1",
632
+ "pathSha256": "abababababababababababababababababababababababababababababababab"
633
+ }
634
+ ]
635
+ }
636
+ }
637
+ },
638
+ {
639
+ "name": "capability-llm-key-held-duplicated",
640
+ "why": "a capability is announced once",
641
+ "expect": {
642
+ "valid": false,
643
+ "code": "schema_violation",
644
+ "keyword": "uniqueItems"
645
+ },
646
+ "message": {
647
+ "schemaVersion": 2,
648
+ "type": "register",
649
+ "msgId": "00000000-0000-4000-8000-000000000001",
650
+ "seq": 0,
651
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
652
+ "workspaceId": "ws-1",
653
+ "ts": "2026-10-29T10:00:00Z",
654
+ "agentId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
655
+ "payload": {
656
+ "protocol": 2,
657
+ "laVersion": "2.4.0",
658
+ "capabilities": [
659
+ "llm.key",
660
+ "llm.key.held",
661
+ "llm.key.held"
662
+ ],
663
+ "signatureMode": "enforce",
664
+ "workspaces": [
665
+ {
666
+ "workspaceId": "ws-1",
667
+ "pathSha256": "abababababababababababababababababababababababababababababababab"
668
+ }
669
+ ]
670
+ }
671
+ }
397
672
  }
398
673
  ]
399
674
  }
@@ -0,0 +1,186 @@
1
+ {
2
+ "name": "invalid-webhook-chunk-after-last",
3
+ "why": "a chunk after the one flagged last",
4
+ "session": {
5
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
6
+ "agentId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
7
+ "requireEnforce": true,
8
+ "now": "2026-10-29T10:00:00Z"
9
+ },
10
+ "frames": [
11
+ {
12
+ "dir": "la->cp",
13
+ "frame": {
14
+ "schemaVersion": 2,
15
+ "type": "register",
16
+ "msgId": "00000000-0000-4000-8000-000000009000",
17
+ "seq": 0,
18
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
19
+ "workspaceId": "ws-1",
20
+ "ts": "2026-10-29T10:00:00Z",
21
+ "agentId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
22
+ "payload": {
23
+ "protocol": 2,
24
+ "laVersion": "2.4.0",
25
+ "capabilities": [
26
+ "content.request",
27
+ "job.assign",
28
+ "incident.detect",
29
+ "webhook.forward",
30
+ "webhook.chunked"
31
+ ],
32
+ "signatureMode": "enforce",
33
+ "workspaces": [
34
+ {
35
+ "workspaceId": "ws-1",
36
+ "pathSha256": "abababababababababababababababababababababababababababababababab"
37
+ }
38
+ ]
39
+ }
40
+ }
41
+ },
42
+ {
43
+ "dir": "la->cp",
44
+ "frame": {
45
+ "schemaVersion": 2,
46
+ "type": "hello",
47
+ "msgId": "00000000-0000-4000-8000-000000009000",
48
+ "seq": 0,
49
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
50
+ "workspaceId": "ws-1",
51
+ "ts": "2026-10-29T10:00:00Z",
52
+ "agentId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
53
+ "payload": {
54
+ "laVersion": "2.4.0",
55
+ "capabilities": [
56
+ "content.request",
57
+ "job.assign",
58
+ "webhook.forward",
59
+ "webhook.chunked"
60
+ ],
61
+ "signatureMode": "enforce",
62
+ "graphify": {
63
+ "state": "ready",
64
+ "nodes": 12840,
65
+ "edges": 40211,
66
+ "commit": "9fceb02d",
67
+ "ageSeconds": 300
68
+ },
69
+ "diskFreeBytes": 52428800000,
70
+ "queueDepth": 0,
71
+ "clockEpochMs": 1793268000000
72
+ }
73
+ }
74
+ },
75
+ {
76
+ "dir": "cp->la",
77
+ "frame": {
78
+ "schemaVersion": 2,
79
+ "type": "ready",
80
+ "msgId": "00000000-0000-4000-8000-000000009000",
81
+ "seq": 0,
82
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
83
+ "workspaceId": "ws-1",
84
+ "ts": "2026-10-29T10:00:00Z",
85
+ "paramsRaw": "{\"protocol\":2,\"sessionId\":\"e5f6a7b8-c9d0-4e1f-8a2b-4c5d6e7f8091\",\"resumed\":false,\"peerLastSeq\":0,\"limits\":{\"maxFrameBytes\":49152,\"chunkRawBytes\":32768,\"maxChunks\":64,\"ackTimeoutMs\":5000,\"maxRetries\":3,\"heartbeatSeconds\":30,\"contentFirstByteMs\":10000,\"contentTotalMs\":30000}}",
86
+ "sig": {
87
+ "keyId": "vh-cp-2026-10",
88
+ "timestamp": "1793268000",
89
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
90
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
91
+ "workspaceId": "ws-1",
92
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
93
+ },
94
+ "payload": {
95
+ "protocol": 2,
96
+ "sessionId": "e5f6a7b8-c9d0-4e1f-8a2b-4c5d6e7f8091",
97
+ "resumed": false,
98
+ "peerLastSeq": 0,
99
+ "limits": {
100
+ "maxFrameBytes": 49152,
101
+ "chunkRawBytes": 32768,
102
+ "maxChunks": 64,
103
+ "ackTimeoutMs": 5000,
104
+ "maxRetries": 3,
105
+ "heartbeatSeconds": 30,
106
+ "contentFirstByteMs": 10000,
107
+ "contentTotalMs": 30000
108
+ }
109
+ }
110
+ }
111
+ },
112
+ {
113
+ "dir": "cp->la",
114
+ "frame": {
115
+ "schemaVersion": 2,
116
+ "type": "webhook.forward",
117
+ "msgId": "00000000-0000-4000-8000-000000000157",
118
+ "seq": 1,
119
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
120
+ "workspaceId": "ws-1",
121
+ "ts": "2026-10-29T10:00:00Z",
122
+ "paramsRaw": "{\"webhookId\":\"d4e5f6a7-b8c9-4d0e-9f1a-3b4c5d6e7f80\",\"source\":\"sentry\",\"contentType\":\"application/json\",\"bodyB64\":\"eyJldmVudCI6InZlY3RvciIsInBhZCI6Inh4eHh4eHh4eHh4eHgifQ==\",\"bodyBytes\":40,\"bodySha256\":\"fc7cafdf5cf1a52bcada0df8bfe58144500c6c5ea5ac42442d95621b115e0237\"}",
123
+ "sig": {
124
+ "keyId": "vh-cp-2026-10",
125
+ "timestamp": "1793268000",
126
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
127
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
128
+ "workspaceId": "ws-1",
129
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
130
+ },
131
+ "payload": {
132
+ "webhookId": "d4e5f6a7-b8c9-4d0e-9f1a-3b4c5d6e7f80",
133
+ "source": "sentry",
134
+ "contentType": "application/json",
135
+ "bodyB64": "eyJldmVudCI6InZlY3RvciIsInBhZCI6Inh4eHh4eHh4eHh4eHgifQ==",
136
+ "bodyBytes": 40,
137
+ "bodySha256": "fc7cafdf5cf1a52bcada0df8bfe58144500c6c5ea5ac42442d95621b115e0237"
138
+ },
139
+ "chunk": {
140
+ "index": 0,
141
+ "total": 1,
142
+ "last": true
143
+ }
144
+ }
145
+ },
146
+ {
147
+ "dir": "cp->la",
148
+ "frame": {
149
+ "schemaVersion": 2,
150
+ "type": "webhook.forward",
151
+ "msgId": "00000000-0000-4000-8000-000000000158",
152
+ "seq": 2,
153
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
154
+ "workspaceId": "ws-1",
155
+ "ts": "2026-10-29T10:00:00Z",
156
+ "paramsRaw": "{\"webhookId\":\"d4e5f6a7-b8c9-4d0e-9f1a-3b4c5d6e7f80\",\"source\":\"sentry\",\"contentType\":\"application/json\",\"bodyB64\":\"eyJldmVudCI6InZlY3RvciIsInBhZCI6Inh4eHh4eHh4eHh4eHgifQ==\",\"bodyBytes\":40,\"bodySha256\":\"fc7cafdf5cf1a52bcada0df8bfe58144500c6c5ea5ac42442d95621b115e0237\"}",
157
+ "sig": {
158
+ "keyId": "vh-cp-2026-10",
159
+ "timestamp": "1793268000",
160
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
161
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
162
+ "workspaceId": "ws-1",
163
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
164
+ },
165
+ "payload": {
166
+ "webhookId": "d4e5f6a7-b8c9-4d0e-9f1a-3b4c5d6e7f80",
167
+ "source": "sentry",
168
+ "contentType": "application/json",
169
+ "bodyB64": "eyJldmVudCI6InZlY3RvciIsInBhZCI6Inh4eHh4eHh4eHh4eHgifQ==",
170
+ "bodyBytes": 40,
171
+ "bodySha256": "fc7cafdf5cf1a52bcada0df8bfe58144500c6c5ea5ac42442d95621b115e0237"
172
+ },
173
+ "chunk": {
174
+ "index": 1,
175
+ "total": 1,
176
+ "last": true
177
+ }
178
+ }
179
+ }
180
+ ],
181
+ "expect": {
182
+ "ok": false,
183
+ "error": "chunk_out_of_order",
184
+ "atFrame": 4
185
+ }
186
+ }