@canonmsg/backend-contracts 2.1.0 → 2.2.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.
@@ -0,0 +1,1460 @@
1
+ /**
2
+ * JSON Schemas (draft 2020-12) for the Canon agent verb contract.
3
+ *
4
+ * One bundled document, `$id` canon.verbs.v1.json, with a `<verb>_input` and
5
+ * `<verb>_result` definition per verb under `$defs` plus shared shapes. The
6
+ * document is emitted verbatim to `dist/canon-verbs.schema.json` at build
7
+ * time (see scripts/emit-verb-schemas.mjs) so non-TypeScript bindings can
8
+ * consume the byte-identical contract instead of hand-porting it (the Python
9
+ * hermes plugin adopts it in a follow-up PR; external integrators and
10
+ * generated CLIs read it from the npm package).
11
+ *
12
+ * Conventions:
13
+ * - Verb INPUT schemas are strict (`additionalProperties: false`) — a binding
14
+ * must not invent fields.
15
+ * - Verb RESULT schemas are open (`additionalProperties: true`) — servers may
16
+ * add fields; consumers must tolerate them. The STATUS vocabularies are
17
+ * deliberately closed per major contract version: a new status requires a
18
+ * canon.verbs.v2 (or an additive bundle revision), so bindings should fail
19
+ * closed on unknown statuses.
20
+ * - `maxLength` counts UTF-16 code units; where the server enforces UTF-8
21
+ * BYTES the description says so and the maxLength is the byte figure (a
22
+ * permissive approximation — multibyte text within the char count can still
23
+ * exceed the server's byte cap). Bindings MUST therefore run
24
+ * `findVerbByteLimitViolations()` after schema validation (the same checks
25
+ * ship machine-readably as dist/canon-verbs.limits.json).
26
+ * - Server enforcement sites are cited in descriptions; this document
27
+ * describes, functions/src enforces (until the planned /agent/verbs/*
28
+ * endpoints validate against these schemas directly).
29
+ */
30
+ import { type CanonVerbName } from './verbContract.js';
31
+ export declare const CANON_VERBS_JSON_SCHEMA: {
32
+ readonly $schema: "https://json-schema.org/draft/2020-12/schema";
33
+ readonly $id: "https://canonmsg.com/schemas/canon.verbs.v1.json";
34
+ readonly title: "Canon Agent Verbs v1";
35
+ readonly description: string;
36
+ readonly $defs: {
37
+ readonly messageId: {
38
+ readonly type: "string";
39
+ readonly pattern: "^[A-Za-z0-9_.:-]{1,160}$";
40
+ readonly not: {
41
+ readonly pattern: "^(\\.{1,2}|__.*__)$";
42
+ readonly description: "Reserved forms the server 400s: '.', '..', and __x__ ids.";
43
+ };
44
+ readonly description: string;
45
+ };
46
+ readonly selfContext: {
47
+ readonly type: "object";
48
+ readonly description: string;
49
+ readonly required: readonly ["type", "context"];
50
+ readonly additionalProperties: false;
51
+ readonly properties: {
52
+ readonly type: {
53
+ readonly const: "cross_session";
54
+ };
55
+ readonly context: {
56
+ readonly type: "string";
57
+ readonly minLength: 1;
58
+ readonly maxLength: 1000;
59
+ readonly description: "What future-you needs to know about this transfer.";
60
+ };
61
+ };
62
+ };
63
+ readonly sessionSelection: {
64
+ readonly description: string;
65
+ readonly oneOf: readonly [{
66
+ readonly type: "object";
67
+ readonly required: readonly ["mode"];
68
+ readonly additionalProperties: false;
69
+ readonly properties: {
70
+ readonly mode: {
71
+ readonly enum: readonly ["new", "continue_latest", "continue_or_create"];
72
+ };
73
+ };
74
+ }, {
75
+ readonly type: "object";
76
+ readonly required: readonly ["mode", "conversationId"];
77
+ readonly additionalProperties: false;
78
+ readonly properties: {
79
+ readonly mode: {
80
+ readonly const: "specific";
81
+ };
82
+ readonly conversationId: {
83
+ readonly type: "string";
84
+ readonly pattern: "^[A-Za-z0-9_.:-]{1,160}$";
85
+ };
86
+ };
87
+ }];
88
+ };
89
+ readonly mediaAttachment: {
90
+ readonly type: "object";
91
+ readonly required: readonly ["kind", "url"];
92
+ readonly additionalProperties: false;
93
+ readonly properties: {
94
+ readonly kind: {
95
+ readonly enum: readonly ["image", "audio", "video", "file"];
96
+ };
97
+ readonly url: {
98
+ readonly type: "string";
99
+ readonly minLength: 1;
100
+ readonly description: string;
101
+ };
102
+ readonly mimeType: {
103
+ readonly type: "string";
104
+ };
105
+ readonly fileName: {
106
+ readonly type: "string";
107
+ };
108
+ readonly sizeBytes: {
109
+ readonly type: "number";
110
+ readonly minimum: 0;
111
+ };
112
+ readonly width: {
113
+ readonly type: "number";
114
+ readonly minimum: 0;
115
+ };
116
+ readonly height: {
117
+ readonly type: "number";
118
+ readonly minimum: 0;
119
+ };
120
+ readonly durationMs: {
121
+ readonly type: "number";
122
+ readonly minimum: 0;
123
+ };
124
+ };
125
+ };
126
+ readonly turnMetadata: {
127
+ readonly type: "object";
128
+ readonly description: string;
129
+ readonly additionalProperties: true;
130
+ readonly properties: {
131
+ readonly turnId: {
132
+ readonly type: readonly ["string", "null"];
133
+ };
134
+ readonly turnSemantics: {
135
+ readonly enum: readonly ["progress", "turn_complete", "control"];
136
+ };
137
+ readonly deliveryIntent: {
138
+ readonly enum: readonly ["queue", "interrupt", "interleave", "stop"];
139
+ readonly description: "What the recipient runtime should do if the message lands mid-turn. Default queue.";
140
+ };
141
+ readonly replyBehavior: {
142
+ readonly enum: readonly ["allow_auto_reply", "suppress_auto_reply"];
143
+ };
144
+ };
145
+ };
146
+ readonly messageOptions: {
147
+ readonly type: "object";
148
+ readonly description: string;
149
+ readonly additionalProperties: false;
150
+ readonly properties: {
151
+ readonly messageId: {
152
+ $ref: string;
153
+ };
154
+ readonly contentType: {
155
+ readonly enum: readonly ["text", "image", "audio", "video", "file"];
156
+ readonly description: string;
157
+ };
158
+ readonly attachments: {
159
+ readonly type: "array";
160
+ readonly maxItems: 10;
161
+ readonly items: {
162
+ $ref: string;
163
+ };
164
+ };
165
+ readonly mentions: {
166
+ readonly type: "array";
167
+ readonly items: {
168
+ readonly type: "string";
169
+ };
170
+ readonly description: "Member userIds; every id must be a conversation member (400 otherwise).";
171
+ };
172
+ readonly replyTo: {
173
+ readonly type: "string";
174
+ readonly description: "Message id being replied to (not existence-validated).";
175
+ };
176
+ readonly replyToPosition: {
177
+ readonly type: "integer";
178
+ };
179
+ readonly metadata: {
180
+ $ref: string;
181
+ };
182
+ };
183
+ };
184
+ readonly inputChoice: {
185
+ readonly type: "object";
186
+ readonly required: readonly ["label"];
187
+ readonly additionalProperties: false;
188
+ readonly properties: {
189
+ readonly label: {
190
+ readonly type: "string";
191
+ readonly minLength: 1;
192
+ readonly maxLength: 120;
193
+ };
194
+ readonly value: {
195
+ readonly type: "string";
196
+ readonly maxLength: 200;
197
+ };
198
+ readonly description: {
199
+ readonly type: "string";
200
+ readonly maxLength: 300;
201
+ };
202
+ };
203
+ };
204
+ readonly inputQuestion: {
205
+ readonly type: "object";
206
+ readonly required: readonly ["id", "question"];
207
+ readonly additionalProperties: false;
208
+ readonly properties: {
209
+ readonly id: {
210
+ readonly type: "string";
211
+ readonly pattern: "^[A-Za-z0-9_.:-]{1,120}$";
212
+ };
213
+ readonly question: {
214
+ readonly type: "string";
215
+ readonly minLength: 1;
216
+ readonly maxLength: 1000;
217
+ };
218
+ readonly header: {
219
+ readonly type: "string";
220
+ readonly maxLength: 120;
221
+ };
222
+ readonly choices: {
223
+ readonly type: "array";
224
+ readonly maxItems: 12;
225
+ readonly items: {
226
+ $ref: string;
227
+ };
228
+ };
229
+ readonly allowOther: {
230
+ readonly type: "boolean";
231
+ };
232
+ readonly isSecret: {
233
+ readonly type: "boolean";
234
+ readonly description: "Forces owner-only routing for the whole request.";
235
+ };
236
+ readonly multiSelect: {
237
+ readonly type: "boolean";
238
+ };
239
+ };
240
+ };
241
+ readonly approvalDetail: {
242
+ readonly type: "object";
243
+ readonly required: readonly ["label", "value"];
244
+ readonly additionalProperties: false;
245
+ readonly properties: {
246
+ readonly label: {
247
+ readonly type: "string";
248
+ readonly minLength: 1;
249
+ readonly maxLength: 80;
250
+ };
251
+ readonly value: {
252
+ readonly type: "string";
253
+ readonly minLength: 1;
254
+ readonly maxLength: 500;
255
+ };
256
+ readonly monospace: {
257
+ readonly type: "boolean";
258
+ };
259
+ };
260
+ };
261
+ readonly unifiedDiff: {
262
+ readonly type: "object";
263
+ readonly description: string;
264
+ readonly required: readonly ["files"];
265
+ readonly additionalProperties: false;
266
+ readonly properties: {
267
+ readonly files: {
268
+ readonly type: "array";
269
+ readonly maxItems: 100;
270
+ readonly items: {
271
+ readonly type: "object";
272
+ readonly required: readonly ["path", "status"];
273
+ readonly additionalProperties: false;
274
+ readonly properties: {
275
+ readonly path: {
276
+ readonly type: "string";
277
+ readonly minLength: 1;
278
+ readonly maxLength: 1024;
279
+ };
280
+ readonly status: {
281
+ readonly enum: readonly ["modified", "created", "deleted", "renamed"];
282
+ };
283
+ readonly oldPath: {
284
+ readonly type: "string";
285
+ readonly maxLength: 1024;
286
+ };
287
+ readonly additions: {
288
+ readonly type: "integer";
289
+ readonly minimum: 0;
290
+ };
291
+ readonly deletions: {
292
+ readonly type: "integer";
293
+ readonly minimum: 0;
294
+ };
295
+ readonly diff: {
296
+ readonly type: "string";
297
+ };
298
+ readonly suppressed: {
299
+ readonly type: "boolean";
300
+ };
301
+ };
302
+ };
303
+ };
304
+ readonly truncated: {
305
+ readonly type: "boolean";
306
+ };
307
+ };
308
+ };
309
+ readonly sessionRule: {
310
+ readonly type: "object";
311
+ readonly description: string;
312
+ readonly required: readonly ["type"];
313
+ readonly additionalProperties: false;
314
+ readonly properties: {
315
+ readonly type: {
316
+ readonly enum: readonly ["approve-all", "approve-tool", "deny-tool"];
317
+ };
318
+ readonly toolPattern: {
319
+ readonly type: "string";
320
+ readonly pattern: "^[\\w.*:-]{1,128}$";
321
+ };
322
+ readonly expiresAt: {
323
+ readonly type: readonly ["string", "null"];
324
+ readonly description: "ISO timestamp or null.";
325
+ };
326
+ };
327
+ readonly if: {
328
+ readonly properties: {
329
+ readonly type: {
330
+ readonly enum: readonly ["approve-tool", "deny-tool"];
331
+ };
332
+ };
333
+ readonly required: readonly ["type"];
334
+ };
335
+ readonly then: {
336
+ readonly required: readonly ["toolPattern"];
337
+ readonly properties: {
338
+ readonly toolPattern: true;
339
+ };
340
+ };
341
+ };
342
+ readonly runtimeCard: {
343
+ readonly type: "object";
344
+ readonly description: string;
345
+ readonly required: readonly ["schema", "title", "fallbackText", "blocks"];
346
+ readonly additionalProperties: true;
347
+ readonly properties: {
348
+ readonly schema: {
349
+ readonly const: "canon.card.v1";
350
+ };
351
+ readonly cardId: {
352
+ readonly type: "string";
353
+ readonly pattern: "^[A-Za-z0-9_.:-]{1,80}$";
354
+ };
355
+ readonly title: {
356
+ readonly type: "string";
357
+ readonly minLength: 1;
358
+ readonly maxLength: 200;
359
+ };
360
+ readonly fallbackText: {
361
+ readonly type: "string";
362
+ readonly minLength: 1;
363
+ readonly maxLength: 2000;
364
+ };
365
+ readonly blocks: {
366
+ readonly type: "array";
367
+ readonly minItems: 1;
368
+ readonly maxItems: 64;
369
+ };
370
+ };
371
+ };
372
+ readonly native: {
373
+ readonly type: "object";
374
+ readonly description: string;
375
+ readonly additionalProperties: true;
376
+ };
377
+ readonly send_to_input: {
378
+ readonly type: "object";
379
+ readonly description: string;
380
+ readonly additionalProperties: false;
381
+ readonly properties: {
382
+ readonly targetConversationId: {
383
+ readonly type: "string";
384
+ readonly pattern: "^[A-Za-z0-9_.:-]{1,160}$";
385
+ };
386
+ readonly targetUserId: {
387
+ readonly type: "string";
388
+ readonly minLength: 1;
389
+ };
390
+ readonly canonContactId: {
391
+ readonly type: "string";
392
+ readonly minLength: 1;
393
+ };
394
+ readonly text: {
395
+ readonly type: "string";
396
+ readonly maxLength: 4096;
397
+ readonly description: "<= 4096 UTF-8 bytes. Required unless messageOptions.attachments carries the content.";
398
+ };
399
+ readonly sourceConversationId: {
400
+ readonly type: "string";
401
+ readonly pattern: "^[A-Za-z0-9_.:-]{1,160}$";
402
+ readonly description: "Required when selfContext is present; the agent must be a member.";
403
+ };
404
+ readonly selfContext: {
405
+ $ref: string;
406
+ };
407
+ readonly requestMessage: {
408
+ readonly type: "string";
409
+ readonly maxLength: 500;
410
+ readonly description: string;
411
+ };
412
+ readonly sessionSelection: {
413
+ $ref: string;
414
+ };
415
+ readonly sessionConfig: {
416
+ readonly type: readonly ["object", "null"];
417
+ readonly description: string;
418
+ };
419
+ readonly messageOptions: {
420
+ $ref: string;
421
+ };
422
+ };
423
+ readonly oneOf: readonly [{
424
+ readonly required: readonly ["targetConversationId"];
425
+ readonly properties: {
426
+ readonly targetConversationId: true;
427
+ };
428
+ }, {
429
+ readonly required: readonly ["targetUserId"];
430
+ readonly properties: {
431
+ readonly targetUserId: true;
432
+ };
433
+ }, {
434
+ readonly required: readonly ["canonContactId"];
435
+ readonly properties: {
436
+ readonly canonContactId: true;
437
+ };
438
+ }];
439
+ readonly dependentRequired: {
440
+ readonly selfContext: readonly ["sourceConversationId"];
441
+ };
442
+ };
443
+ readonly send_to_result: {
444
+ readonly description: string;
445
+ readonly oneOf: readonly [{
446
+ readonly type: "object";
447
+ readonly required: readonly ["status", "conversationId"];
448
+ readonly additionalProperties: true;
449
+ readonly properties: {
450
+ readonly status: {
451
+ readonly const: "messaged";
452
+ };
453
+ readonly conversationId: {
454
+ readonly type: "string";
455
+ };
456
+ readonly messageId: {
457
+ readonly type: "string";
458
+ };
459
+ readonly selfContextId: {
460
+ readonly type: "string";
461
+ };
462
+ readonly created: {
463
+ readonly type: "boolean";
464
+ };
465
+ readonly reused: {
466
+ readonly type: "boolean";
467
+ };
468
+ readonly sessionSelection: {
469
+ readonly type: "string";
470
+ };
471
+ };
472
+ }, {
473
+ readonly type: "object";
474
+ readonly required: readonly ["status", "requestId"];
475
+ readonly additionalProperties: true;
476
+ readonly properties: {
477
+ readonly status: {
478
+ readonly enum: readonly ["requested", "pending"];
479
+ };
480
+ readonly requestId: {
481
+ readonly type: readonly ["string", "null"];
482
+ };
483
+ readonly deferredIntentId: {
484
+ readonly type: readonly ["string", "null"];
485
+ readonly description: "Present when the send is deferred until the contact request resolves.";
486
+ };
487
+ };
488
+ }, {
489
+ readonly type: "object";
490
+ readonly required: readonly ["status", "reason"];
491
+ readonly additionalProperties: true;
492
+ readonly properties: {
493
+ readonly status: {
494
+ readonly enum: readonly ["setup_required", "no_session", "blocked", "unavailable"];
495
+ };
496
+ readonly reason: {
497
+ readonly type: "string";
498
+ };
499
+ };
500
+ }];
501
+ };
502
+ readonly request_input_input: {
503
+ readonly type: "object";
504
+ readonly description: string;
505
+ readonly additionalProperties: false;
506
+ readonly properties: {
507
+ readonly timeoutMs: {
508
+ readonly type: "integer";
509
+ readonly minimum: 1000;
510
+ readonly maximum: number;
511
+ readonly description: `Relative deadline in ms (server ceiling ${string}). expiresAt wins when both are given.`;
512
+ };
513
+ readonly expiresAt: {
514
+ readonly type: "integer";
515
+ readonly minimum: 0;
516
+ readonly description: string;
517
+ };
518
+ readonly conversationId: {
519
+ readonly type: "string";
520
+ readonly pattern: "^[A-Za-z0-9_.:-]{1,160}$";
521
+ readonly description: "Bindings default to the active conversation.";
522
+ };
523
+ readonly inputId: {
524
+ readonly type: "string";
525
+ readonly pattern: "^[A-Za-z0-9_.:-]{1,160}$";
526
+ readonly description: "Durable single-use id (reuse -> 409); generated when omitted.";
527
+ };
528
+ readonly kind: {
529
+ readonly enum: readonly ["clarify", "sudo", "secret"];
530
+ readonly default: "clarify";
531
+ };
532
+ readonly title: {
533
+ readonly type: "string";
534
+ readonly maxLength: 160;
535
+ };
536
+ readonly prompt: {
537
+ readonly type: "string";
538
+ readonly maxLength: 4000;
539
+ };
540
+ readonly choices: {
541
+ readonly type: "array";
542
+ readonly maxItems: 12;
543
+ readonly items: {
544
+ $ref: string;
545
+ };
546
+ };
547
+ readonly questions: {
548
+ readonly type: "array";
549
+ readonly maxItems: 12;
550
+ readonly items: {
551
+ $ref: string;
552
+ };
553
+ };
554
+ readonly secretName: {
555
+ readonly type: "string";
556
+ readonly maxLength: 160;
557
+ };
558
+ readonly sensitive: {
559
+ readonly type: "boolean";
560
+ };
561
+ readonly responseUserId: {
562
+ readonly type: "string";
563
+ readonly pattern: "^[A-Za-z0-9_.:-]{1,160}$";
564
+ readonly description: string;
565
+ };
566
+ readonly native: {
567
+ $ref: string;
568
+ };
569
+ readonly turnId: {
570
+ readonly type: "string";
571
+ readonly maxLength: 128;
572
+ };
573
+ };
574
+ };
575
+ readonly request_input_result: {
576
+ readonly oneOf: readonly [{
577
+ readonly type: "object";
578
+ readonly required: readonly ["status", "inputId", "value"];
579
+ readonly additionalProperties: true;
580
+ readonly properties: {
581
+ readonly status: {
582
+ readonly const: "submitted";
583
+ };
584
+ readonly inputId: {
585
+ readonly type: "string";
586
+ };
587
+ readonly value: {
588
+ readonly type: "string";
589
+ readonly description: "Free-text answer ('' when structured answers were used).";
590
+ };
591
+ readonly answers: {
592
+ readonly type: "object";
593
+ readonly description: "Structured answers keyed by question id.";
594
+ readonly additionalProperties: {
595
+ readonly type: "object";
596
+ readonly required: readonly ["answers"];
597
+ readonly properties: {
598
+ readonly answers: {
599
+ readonly type: "array";
600
+ readonly items: {
601
+ readonly type: "string";
602
+ };
603
+ };
604
+ };
605
+ };
606
+ };
607
+ };
608
+ }, {
609
+ readonly type: "object";
610
+ readonly required: readonly ["status", "inputId"];
611
+ readonly additionalProperties: true;
612
+ readonly properties: {
613
+ readonly status: {
614
+ readonly enum: readonly ["cancelled", "timeout"];
615
+ };
616
+ readonly inputId: {
617
+ readonly type: "string";
618
+ };
619
+ };
620
+ }];
621
+ };
622
+ readonly request_approval_input: {
623
+ readonly type: "object";
624
+ readonly description: string;
625
+ readonly required: readonly ["toolName", "toolSummary"];
626
+ readonly additionalProperties: false;
627
+ readonly properties: {
628
+ readonly timeoutMs: {
629
+ readonly type: "integer";
630
+ readonly minimum: 1000;
631
+ readonly maximum: number;
632
+ readonly description: `Relative deadline in ms (server ceiling ${string}). expiresAt wins when both are given.`;
633
+ };
634
+ readonly expiresAt: {
635
+ readonly type: "integer";
636
+ readonly minimum: 0;
637
+ readonly description: string;
638
+ };
639
+ readonly conversationId: {
640
+ readonly type: "string";
641
+ readonly pattern: "^[A-Za-z0-9_.:-]{1,160}$";
642
+ };
643
+ readonly approvalId: {
644
+ readonly type: "string";
645
+ readonly pattern: "^[A-Za-z0-9_.:-]{1,160}$";
646
+ readonly description: "Durable single-use id; server-generated when omitted.";
647
+ };
648
+ readonly toolName: {
649
+ readonly type: "string";
650
+ readonly minLength: 1;
651
+ readonly maxLength: 128;
652
+ };
653
+ readonly toolSummary: {
654
+ readonly type: "string";
655
+ readonly minLength: 1;
656
+ readonly maxLength: 1000;
657
+ readonly description: "Pre-redact secrets — this renders to humans.";
658
+ };
659
+ readonly mode: {
660
+ readonly enum: readonly ["blocking", "detached"];
661
+ readonly default: "blocking";
662
+ };
663
+ readonly riskLevel: {
664
+ readonly enum: readonly ["normal", "destructive"];
665
+ readonly description: "Server accepts only these values; others are silently dropped, not rejected.";
666
+ };
667
+ readonly risk: {
668
+ readonly enum: readonly ["low", "normal", "high", "destructive"];
669
+ readonly description: "Advisory; server stores any string <= 64 chars today.";
670
+ };
671
+ readonly category: {
672
+ readonly enum: readonly ["command", "file", "network", "browser", "mcp", "plugin", "canon", "tool"];
673
+ readonly description: "Advisory; server stores any string <= 64 chars today.";
674
+ };
675
+ readonly details: {
676
+ readonly type: "array";
677
+ readonly maxItems: 8;
678
+ readonly items: {
679
+ $ref: string;
680
+ };
681
+ };
682
+ readonly diff: {
683
+ $ref: string;
684
+ };
685
+ readonly native: {
686
+ $ref: string;
687
+ };
688
+ readonly runtimeId: {
689
+ readonly type: "string";
690
+ readonly maxLength: 128;
691
+ };
692
+ readonly turnId: {
693
+ readonly type: "string";
694
+ readonly maxLength: 128;
695
+ };
696
+ readonly responseUserId: {
697
+ readonly type: "string";
698
+ readonly pattern: "^[A-Za-z0-9_.:-]{1,160}$";
699
+ };
700
+ readonly allowSessionRule: {
701
+ readonly type: "boolean";
702
+ readonly description: "Server forces false when the responder is not the agent owner.";
703
+ };
704
+ };
705
+ };
706
+ readonly request_approval_result: {
707
+ readonly oneOf: readonly [{
708
+ readonly type: "object";
709
+ readonly required: readonly ["status", "approvalId"];
710
+ readonly additionalProperties: true;
711
+ readonly properties: {
712
+ readonly status: {
713
+ readonly const: "allow";
714
+ };
715
+ readonly approvalId: {
716
+ readonly type: "string";
717
+ };
718
+ readonly sessionRule: {
719
+ $ref: string;
720
+ };
721
+ readonly respondedBy: {
722
+ readonly type: "string";
723
+ readonly description: "Canon-authenticated responder userId.";
724
+ };
725
+ };
726
+ }, {
727
+ readonly type: "object";
728
+ readonly required: readonly ["status", "approvalId"];
729
+ readonly additionalProperties: true;
730
+ readonly properties: {
731
+ readonly status: {
732
+ readonly const: "deny";
733
+ };
734
+ readonly approvalId: {
735
+ readonly type: "string";
736
+ };
737
+ readonly sessionRule: {
738
+ $ref: string;
739
+ };
740
+ readonly respondedBy: {
741
+ readonly type: "string";
742
+ };
743
+ };
744
+ }, {
745
+ readonly type: "object";
746
+ readonly required: readonly ["status", "approvalId"];
747
+ readonly additionalProperties: true;
748
+ readonly properties: {
749
+ readonly status: {
750
+ readonly const: "timeout";
751
+ };
752
+ readonly approvalId: {
753
+ readonly type: "string";
754
+ };
755
+ };
756
+ }, {
757
+ readonly type: "object";
758
+ readonly description: "Detached acceptance — the decision arrives via check_approval.";
759
+ readonly required: readonly ["status", "approvalId", "expiresAt"];
760
+ readonly additionalProperties: true;
761
+ readonly properties: {
762
+ readonly status: {
763
+ readonly const: "pending";
764
+ };
765
+ readonly approvalId: {
766
+ readonly type: "string";
767
+ };
768
+ readonly conversationId: {
769
+ readonly type: "string";
770
+ };
771
+ readonly expiresAt: {
772
+ readonly type: "integer";
773
+ };
774
+ readonly responseUserId: {
775
+ readonly type: "string";
776
+ };
777
+ };
778
+ }];
779
+ };
780
+ readonly check_approval_input: {
781
+ readonly type: "object";
782
+ readonly description: string;
783
+ readonly required: readonly ["approvalId"];
784
+ readonly additionalProperties: false;
785
+ readonly properties: {
786
+ readonly approvalId: {
787
+ readonly type: "string";
788
+ readonly pattern: "^[A-Za-z0-9_.:-]{1,160}$";
789
+ };
790
+ readonly conversationId: {
791
+ readonly type: "string";
792
+ readonly pattern: "^[A-Za-z0-9_.:-]{1,160}$";
793
+ };
794
+ };
795
+ };
796
+ readonly check_approval_result: {
797
+ readonly description: string;
798
+ readonly oneOf: readonly [{
799
+ readonly type: "object";
800
+ readonly required: readonly ["status", "approvalId", "decision"];
801
+ readonly additionalProperties: true;
802
+ readonly properties: {
803
+ readonly status: {
804
+ readonly const: "resolved";
805
+ };
806
+ readonly approvalId: {
807
+ readonly type: "string";
808
+ };
809
+ readonly decision: {
810
+ readonly enum: readonly ["allow", "deny"];
811
+ };
812
+ readonly respondedBy: {
813
+ readonly type: "string";
814
+ };
815
+ readonly conversationId: {
816
+ readonly type: "string";
817
+ };
818
+ };
819
+ }, {
820
+ readonly type: "object";
821
+ readonly required: readonly ["status", "approvalId"];
822
+ readonly additionalProperties: true;
823
+ readonly properties: {
824
+ readonly status: {
825
+ readonly enum: readonly ["pending", "expired", "unknown"];
826
+ };
827
+ readonly approvalId: {
828
+ readonly type: "string";
829
+ };
830
+ readonly expiresAt: {
831
+ readonly type: "integer";
832
+ };
833
+ readonly conversationId: {
834
+ readonly type: "string";
835
+ };
836
+ };
837
+ }];
838
+ };
839
+ readonly send_card_input: {
840
+ readonly type: "object";
841
+ readonly description: "Display a card with no actions — fire-and-forget, no pending state, no deadline.";
842
+ readonly required: readonly ["card"];
843
+ readonly additionalProperties: false;
844
+ readonly properties: {
845
+ readonly conversationId: {
846
+ readonly type: "string";
847
+ readonly pattern: "^[A-Za-z0-9_.:-]{1,160}$";
848
+ };
849
+ readonly card: {
850
+ $ref: string;
851
+ };
852
+ readonly cardId: {
853
+ readonly type: "string";
854
+ readonly pattern: "^[A-Za-z0-9_.:-]{1,80}$";
855
+ };
856
+ readonly native: {
857
+ $ref: string;
858
+ };
859
+ readonly runtimeId: {
860
+ readonly type: "string";
861
+ readonly maxLength: 128;
862
+ };
863
+ readonly turnId: {
864
+ readonly type: "string";
865
+ readonly maxLength: 128;
866
+ };
867
+ };
868
+ };
869
+ readonly send_card_result: {
870
+ readonly type: "object";
871
+ readonly required: readonly ["status", "cardId"];
872
+ readonly additionalProperties: true;
873
+ readonly properties: {
874
+ readonly status: {
875
+ readonly const: "displayed";
876
+ };
877
+ readonly cardId: {
878
+ readonly type: "string";
879
+ };
880
+ readonly conversationId: {
881
+ readonly type: "string";
882
+ };
883
+ readonly responseUserId: {
884
+ readonly type: "string";
885
+ };
886
+ };
887
+ };
888
+ readonly request_card_input: {
889
+ readonly type: "object";
890
+ readonly description: string;
891
+ readonly required: readonly ["card"];
892
+ readonly additionalProperties: false;
893
+ readonly properties: {
894
+ readonly timeoutMs: {
895
+ readonly type: "integer";
896
+ readonly minimum: 1000;
897
+ readonly maximum: number;
898
+ readonly description: `Relative deadline in ms (server ceiling ${string}). expiresAt wins when both are given.`;
899
+ };
900
+ readonly expiresAt: {
901
+ readonly type: "integer";
902
+ readonly minimum: 0;
903
+ readonly description: string;
904
+ };
905
+ readonly conversationId: {
906
+ readonly type: "string";
907
+ readonly pattern: "^[A-Za-z0-9_.:-]{1,160}$";
908
+ };
909
+ readonly card: {
910
+ $ref: string;
911
+ };
912
+ readonly cardId: {
913
+ readonly type: "string";
914
+ readonly pattern: "^[A-Za-z0-9_.:-]{1,80}$";
915
+ };
916
+ readonly responseUserId: {
917
+ readonly type: "string";
918
+ readonly pattern: "^[A-Za-z0-9_.:-]{1,160}$";
919
+ readonly description: string;
920
+ };
921
+ readonly native: {
922
+ $ref: string;
923
+ };
924
+ readonly runtimeId: {
925
+ readonly type: "string";
926
+ readonly maxLength: 128;
927
+ };
928
+ readonly turnId: {
929
+ readonly type: "string";
930
+ readonly maxLength: 128;
931
+ };
932
+ };
933
+ };
934
+ readonly request_card_result: {
935
+ readonly oneOf: readonly [{
936
+ readonly type: "object";
937
+ readonly required: readonly ["status", "cardId"];
938
+ readonly additionalProperties: true;
939
+ readonly properties: {
940
+ readonly status: {
941
+ readonly const: "submitted";
942
+ };
943
+ readonly cardId: {
944
+ readonly type: "string";
945
+ };
946
+ readonly actionId: {
947
+ readonly type: "string";
948
+ };
949
+ readonly values: {
950
+ readonly type: "object";
951
+ readonly description: string;
952
+ };
953
+ readonly respondedBy: {
954
+ readonly type: "string";
955
+ readonly description: "Canon-authenticated responder (server-verified vs responseUserId).";
956
+ };
957
+ };
958
+ }, {
959
+ readonly type: "object";
960
+ readonly required: readonly ["status", "cardId"];
961
+ readonly additionalProperties: true;
962
+ readonly properties: {
963
+ readonly status: {
964
+ readonly const: "cancelled";
965
+ };
966
+ readonly cardId: {
967
+ readonly type: "string";
968
+ };
969
+ readonly respondedBy: {
970
+ readonly type: "string";
971
+ };
972
+ };
973
+ }, {
974
+ readonly type: "object";
975
+ readonly required: readonly ["status", "cardId"];
976
+ readonly additionalProperties: true;
977
+ readonly properties: {
978
+ readonly status: {
979
+ readonly const: "timeout";
980
+ };
981
+ readonly cardId: {
982
+ readonly type: "string";
983
+ };
984
+ };
985
+ }];
986
+ };
987
+ readonly share_contact_input: {
988
+ readonly type: "object";
989
+ readonly description: string;
990
+ readonly required: readonly ["conversationId", "contactUserId"];
991
+ readonly additionalProperties: false;
992
+ readonly properties: {
993
+ readonly conversationId: {
994
+ readonly type: "string";
995
+ readonly pattern: "^[A-Za-z0-9_.:-]{1,160}$";
996
+ };
997
+ readonly contactUserId: {
998
+ readonly type: "string";
999
+ readonly minLength: 1;
1000
+ };
1001
+ readonly text: {
1002
+ readonly type: "string";
1003
+ readonly maxLength: 4096;
1004
+ };
1005
+ readonly messageId: {
1006
+ $ref: string;
1007
+ };
1008
+ };
1009
+ };
1010
+ readonly share_contact_result: {
1011
+ readonly type: "object";
1012
+ readonly required: readonly ["status", "messageId"];
1013
+ readonly additionalProperties: true;
1014
+ readonly properties: {
1015
+ readonly status: {
1016
+ readonly const: "shared";
1017
+ };
1018
+ readonly messageId: {
1019
+ readonly type: "string";
1020
+ };
1021
+ };
1022
+ };
1023
+ readonly react_input: {
1024
+ readonly type: "object";
1025
+ readonly description: string;
1026
+ readonly required: readonly ["conversationId", "messageId", "emoji"];
1027
+ readonly additionalProperties: false;
1028
+ readonly properties: {
1029
+ readonly conversationId: {
1030
+ readonly type: "string";
1031
+ readonly pattern: "^[A-Za-z0-9_.:-]{1,160}$";
1032
+ };
1033
+ readonly messageId: {
1034
+ readonly type: "string";
1035
+ readonly minLength: 1;
1036
+ };
1037
+ readonly emoji: {
1038
+ readonly type: "string";
1039
+ readonly minLength: 1;
1040
+ readonly maxLength: 64;
1041
+ readonly description: "Reaction key. Content-adjacent (D5) — rides the wire body.";
1042
+ };
1043
+ };
1044
+ };
1045
+ readonly react_result: {
1046
+ readonly type: "object";
1047
+ readonly required: readonly ["status", "action"];
1048
+ readonly additionalProperties: true;
1049
+ readonly properties: {
1050
+ readonly status: {
1051
+ readonly const: "reacted";
1052
+ };
1053
+ readonly action: {
1054
+ readonly enum: readonly ["added", "removed"];
1055
+ };
1056
+ readonly reactions: {
1057
+ readonly type: "object";
1058
+ };
1059
+ };
1060
+ };
1061
+ readonly forward_input: {
1062
+ readonly type: "object";
1063
+ readonly description: string;
1064
+ readonly required: readonly ["sourceConversationId", "targetConversationId", "messageId"];
1065
+ readonly additionalProperties: false;
1066
+ readonly properties: {
1067
+ readonly sourceConversationId: {
1068
+ readonly type: "string";
1069
+ readonly pattern: "^[A-Za-z0-9_.:-]{1,160}$";
1070
+ };
1071
+ readonly targetConversationId: {
1072
+ readonly type: "string";
1073
+ readonly pattern: "^[A-Za-z0-9_.:-]{1,160}$";
1074
+ };
1075
+ readonly messageId: {
1076
+ readonly type: "string";
1077
+ readonly minLength: 1;
1078
+ };
1079
+ readonly text: {
1080
+ readonly type: "string";
1081
+ readonly maxLength: 4096;
1082
+ readonly description: "Optional caption; <= 4096 UTF-8 bytes.";
1083
+ };
1084
+ };
1085
+ };
1086
+ readonly forward_result: {
1087
+ readonly type: "object";
1088
+ readonly required: readonly ["status", "messageId", "targetConversationId"];
1089
+ readonly additionalProperties: true;
1090
+ readonly properties: {
1091
+ readonly status: {
1092
+ readonly const: "forwarded";
1093
+ };
1094
+ readonly messageId: {
1095
+ readonly type: "string";
1096
+ };
1097
+ readonly targetConversationId: {
1098
+ readonly type: "string";
1099
+ };
1100
+ };
1101
+ };
1102
+ readonly create_group_input: {
1103
+ readonly type: "object";
1104
+ readonly description: string;
1105
+ readonly required: readonly ["name", "memberIds"];
1106
+ readonly additionalProperties: false;
1107
+ readonly properties: {
1108
+ readonly name: {
1109
+ readonly type: "string";
1110
+ readonly minLength: 1;
1111
+ readonly maxLength: 100;
1112
+ };
1113
+ readonly memberIds: {
1114
+ readonly type: "array";
1115
+ readonly minItems: 1;
1116
+ readonly maxItems: number;
1117
+ readonly items: {
1118
+ readonly type: "string";
1119
+ readonly minLength: 1;
1120
+ };
1121
+ readonly description: "Other members; the caller is added automatically.";
1122
+ };
1123
+ };
1124
+ };
1125
+ readonly create_group_result: {
1126
+ readonly type: "object";
1127
+ readonly description: string;
1128
+ readonly required: readonly ["status", "conversationId"];
1129
+ readonly additionalProperties: true;
1130
+ readonly properties: {
1131
+ readonly status: {
1132
+ readonly const: "created";
1133
+ };
1134
+ readonly conversationId: {
1135
+ readonly type: "string";
1136
+ };
1137
+ readonly pending: {
1138
+ readonly type: "array";
1139
+ readonly items: {
1140
+ readonly type: "object";
1141
+ readonly required: readonly ["userId", "requestId"];
1142
+ readonly additionalProperties: true;
1143
+ readonly properties: {
1144
+ readonly userId: {
1145
+ readonly type: "string";
1146
+ };
1147
+ readonly requestId: {
1148
+ readonly type: "string";
1149
+ };
1150
+ };
1151
+ };
1152
+ };
1153
+ readonly skipped: {
1154
+ readonly type: "array";
1155
+ readonly items: {
1156
+ readonly type: "object";
1157
+ readonly required: readonly ["userId", "reason"];
1158
+ readonly additionalProperties: true;
1159
+ readonly properties: {
1160
+ readonly userId: {
1161
+ readonly type: "string";
1162
+ };
1163
+ readonly reason: {
1164
+ readonly type: "string";
1165
+ };
1166
+ };
1167
+ };
1168
+ };
1169
+ };
1170
+ };
1171
+ readonly add_member_input: {
1172
+ readonly type: "object";
1173
+ readonly description: string;
1174
+ readonly required: readonly ["conversationId", "userId"];
1175
+ readonly additionalProperties: false;
1176
+ readonly properties: {
1177
+ readonly conversationId: {
1178
+ readonly type: "string";
1179
+ readonly pattern: "^[A-Za-z0-9_.:-]{1,160}$";
1180
+ };
1181
+ readonly userId: {
1182
+ readonly type: "string";
1183
+ readonly minLength: 1;
1184
+ };
1185
+ };
1186
+ };
1187
+ readonly add_member_result: {
1188
+ readonly description: string;
1189
+ readonly oneOf: readonly [{
1190
+ readonly type: "object";
1191
+ readonly required: readonly ["status"];
1192
+ readonly additionalProperties: true;
1193
+ readonly properties: {
1194
+ readonly status: {
1195
+ readonly const: "added";
1196
+ };
1197
+ };
1198
+ }, {
1199
+ readonly type: "object";
1200
+ readonly required: readonly ["status", "requestId"];
1201
+ readonly additionalProperties: true;
1202
+ readonly properties: {
1203
+ readonly status: {
1204
+ readonly const: "pending";
1205
+ };
1206
+ readonly requestId: {
1207
+ readonly type: "string";
1208
+ };
1209
+ };
1210
+ }];
1211
+ };
1212
+ readonly remove_member_input: {
1213
+ readonly type: "object";
1214
+ readonly description: string;
1215
+ readonly required: readonly ["conversationId", "userId"];
1216
+ readonly additionalProperties: false;
1217
+ readonly properties: {
1218
+ readonly conversationId: {
1219
+ readonly type: "string";
1220
+ readonly pattern: "^[A-Za-z0-9_.:-]{1,160}$";
1221
+ };
1222
+ readonly userId: {
1223
+ readonly type: "string";
1224
+ readonly minLength: 1;
1225
+ };
1226
+ };
1227
+ };
1228
+ readonly remove_member_result: {
1229
+ readonly type: "object";
1230
+ readonly required: readonly ["status"];
1231
+ readonly additionalProperties: true;
1232
+ readonly properties: {
1233
+ readonly status: {
1234
+ readonly const: "removed";
1235
+ };
1236
+ };
1237
+ };
1238
+ readonly leave_conversation_input: {
1239
+ readonly type: "object";
1240
+ readonly required: readonly ["conversationId"];
1241
+ readonly additionalProperties: false;
1242
+ readonly properties: {
1243
+ readonly conversationId: {
1244
+ readonly type: "string";
1245
+ readonly pattern: "^[A-Za-z0-9_.:-]{1,160}$";
1246
+ };
1247
+ };
1248
+ };
1249
+ readonly leave_conversation_result: {
1250
+ readonly type: "object";
1251
+ readonly required: readonly ["status"];
1252
+ readonly additionalProperties: true;
1253
+ readonly properties: {
1254
+ readonly status: {
1255
+ readonly const: "left";
1256
+ };
1257
+ };
1258
+ };
1259
+ readonly list_contacts_input: {
1260
+ readonly type: "object";
1261
+ readonly additionalProperties: false;
1262
+ readonly properties: {};
1263
+ };
1264
+ readonly list_contacts_result: {
1265
+ readonly type: "object";
1266
+ readonly required: readonly ["contacts"];
1267
+ readonly additionalProperties: true;
1268
+ readonly properties: {
1269
+ readonly contacts: {
1270
+ readonly type: "array";
1271
+ readonly items: {
1272
+ readonly type: "object";
1273
+ readonly required: readonly ["id", "source", "addedAt", "displayNameOverride"];
1274
+ readonly additionalProperties: true;
1275
+ readonly properties: {
1276
+ readonly id: {
1277
+ readonly type: "string";
1278
+ readonly description: "The contact's userId.";
1279
+ };
1280
+ readonly source: {
1281
+ readonly type: "string";
1282
+ readonly description: string;
1283
+ };
1284
+ readonly addedAt: {
1285
+ readonly type: readonly ["string", "null"];
1286
+ };
1287
+ readonly displayNameOverride: {
1288
+ readonly type: readonly ["string", "null"];
1289
+ };
1290
+ };
1291
+ };
1292
+ };
1293
+ };
1294
+ };
1295
+ readonly list_contact_requests_input: {
1296
+ readonly type: "object";
1297
+ readonly additionalProperties: false;
1298
+ readonly properties: {};
1299
+ };
1300
+ readonly list_contact_requests_result: {
1301
+ readonly type: "object";
1302
+ readonly description: string;
1303
+ readonly required: readonly ["requests"];
1304
+ readonly additionalProperties: true;
1305
+ readonly properties: {
1306
+ readonly requests: {
1307
+ readonly type: "array";
1308
+ readonly items: {
1309
+ readonly type: "object";
1310
+ readonly required: readonly ["id", "requesterId", "targetId", "status", "kind"];
1311
+ readonly additionalProperties: true;
1312
+ readonly properties: {
1313
+ readonly id: {
1314
+ readonly type: "string";
1315
+ };
1316
+ readonly requesterId: {
1317
+ readonly type: "string";
1318
+ };
1319
+ readonly requesterName: {
1320
+ readonly type: "string";
1321
+ };
1322
+ readonly targetId: {
1323
+ readonly type: "string";
1324
+ };
1325
+ readonly status: {
1326
+ readonly enum: readonly ["pending", "approved", "rejected", "expired"];
1327
+ };
1328
+ readonly kind: {
1329
+ readonly enum: readonly ["dm", "group_invite"];
1330
+ };
1331
+ readonly message: {
1332
+ readonly type: readonly ["string", "null"];
1333
+ };
1334
+ readonly createdAt: {
1335
+ readonly type: readonly ["string", "null"];
1336
+ };
1337
+ readonly expiresAt: {
1338
+ readonly type: readonly ["string", "null"];
1339
+ };
1340
+ };
1341
+ };
1342
+ };
1343
+ };
1344
+ };
1345
+ readonly list_conversations_input: {
1346
+ readonly type: "object";
1347
+ readonly additionalProperties: false;
1348
+ readonly properties: {
1349
+ readonly limit: {
1350
+ readonly type: "integer";
1351
+ readonly minimum: 1;
1352
+ readonly description: string;
1353
+ };
1354
+ };
1355
+ };
1356
+ readonly list_conversations_result: {
1357
+ readonly type: "object";
1358
+ readonly required: readonly ["conversations"];
1359
+ readonly additionalProperties: true;
1360
+ readonly properties: {
1361
+ readonly conversations: {
1362
+ readonly type: "array";
1363
+ readonly items: {
1364
+ readonly type: "object";
1365
+ readonly required: readonly ["id", "type", "memberIds", "isAgentChat", "topic", "lastMessage", "createdAt"];
1366
+ readonly additionalProperties: true;
1367
+ readonly properties: {
1368
+ readonly id: {
1369
+ readonly type: "string";
1370
+ };
1371
+ readonly type: {
1372
+ readonly enum: readonly ["direct", "group"];
1373
+ };
1374
+ readonly name: {
1375
+ readonly type: readonly ["string", "null"];
1376
+ };
1377
+ readonly topic: {
1378
+ readonly type: readonly ["string", "null"];
1379
+ };
1380
+ readonly memberIds: {
1381
+ readonly type: "array";
1382
+ readonly items: {
1383
+ readonly type: "string";
1384
+ };
1385
+ };
1386
+ readonly isAgentChat: {
1387
+ readonly type: "boolean";
1388
+ };
1389
+ readonly hasUnread: {
1390
+ readonly type: "boolean";
1391
+ };
1392
+ readonly lastMessage: {
1393
+ readonly type: readonly ["object", "null"];
1394
+ readonly additionalProperties: true;
1395
+ readonly properties: {
1396
+ readonly text: {
1397
+ readonly type: readonly ["string", "null"];
1398
+ };
1399
+ readonly messageId: {
1400
+ readonly type: "string";
1401
+ };
1402
+ readonly senderId: {
1403
+ readonly type: "string";
1404
+ };
1405
+ readonly senderType: {
1406
+ readonly type: "string";
1407
+ };
1408
+ readonly contentType: {
1409
+ readonly type: "string";
1410
+ };
1411
+ readonly timestamp: {
1412
+ readonly type: readonly ["string", "null"];
1413
+ };
1414
+ };
1415
+ };
1416
+ readonly createdAt: {
1417
+ readonly type: readonly ["string", "null"];
1418
+ };
1419
+ };
1420
+ };
1421
+ };
1422
+ };
1423
+ };
1424
+ };
1425
+ };
1426
+ /** Pointer pair into the bundle for one verb. */
1427
+ export interface CanonVerbSchemaRefs {
1428
+ input: string;
1429
+ result: string;
1430
+ }
1431
+ export declare const CANON_VERB_SCHEMA_REFS: Record<CanonVerbName, CanonVerbSchemaRefs>;
1432
+ /** A verb subschema extracted from the bundle, self-contained for embedding. */
1433
+ export type CanonVerbJsonSchema = Record<string, unknown>;
1434
+ export interface GetVerbSchemaOptions {
1435
+ /**
1436
+ * The full canon.card.v1 document schema (@canonmsg/rich-cards
1437
+ * RUNTIME_CARD_JSON_SCHEMA_V1) to compose into card-carrying verbs. When
1438
+ * provided, the envelope-only `runtimeCard` definition is replaced so block
1439
+ * structures validate too. backend-contracts deliberately does not depend
1440
+ * on rich-cards (build-order/dependency direction), so the binding supplies
1441
+ * the schema.
1442
+ *
1443
+ * The card schema is REBASED, not nested: its own `$defs` are merged into
1444
+ * the verb schema's `$defs` under `card__`-prefixed names and every
1445
+ * internal `#/$defs/...` ref (including `<card $id>#/$defs/...` forms) is
1446
+ * rewritten accordingly. The result is a single self-contained schema
1447
+ * resource with plain internal refs — no embedded `$id` — so it compiles
1448
+ * on naive validators and never conflicts with a separately registered
1449
+ * canon.card.v1 resource on the same Ajv instance.
1450
+ *
1451
+ * Ajv note: the real card schema uses spec-valid union types
1452
+ * (min/max: number | date-string), so compile composed schemas with
1453
+ * `{ strict: true, allowUnionTypes: true }`.
1454
+ */
1455
+ cardSchema?: Record<string, unknown>;
1456
+ }
1457
+ /** Self-contained input schema for a verb (for embedding into tool definitions). */
1458
+ export declare function getVerbInputSchema(verb: CanonVerbName, options?: GetVerbSchemaOptions): CanonVerbJsonSchema;
1459
+ /** Self-contained result schema for a verb. */
1460
+ export declare function getVerbResultSchema(verb: CanonVerbName): CanonVerbJsonSchema;