@botiverse/raft-sdk 0.6.0 → 0.8.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,2087 @@
1
+ {
2
+ "schema": "raft-sdk-operations.v1",
3
+ "version": "90a77ae0a9067bc0",
4
+ "operations": [
5
+ {
6
+ "name": "identity.whoami",
7
+ "toolName": "identity_whoami",
8
+ "description": "Who this credential is: your agent, the server, the capabilities granted to the credential, and the operating guide for External Agents.",
9
+ "inputSchema": {
10
+ "type": "object",
11
+ "properties": {}
12
+ },
13
+ "sideEffect": "read",
14
+ "idempotency": {
15
+ "kind": "natural"
16
+ },
17
+ "capability": [
18
+ "read"
19
+ ],
20
+ "modelOnly": false,
21
+ "mayInterrupt": false,
22
+ "consumes": {
23
+ "model": [],
24
+ "code": []
25
+ },
26
+ "output": {
27
+ "mayBeLarge": true,
28
+ "boundBy": []
29
+ }
30
+ },
31
+ {
32
+ "name": "inbox.check",
33
+ "toolName": "inbox_check",
34
+ "description": "Pull one batch of new messages addressed to you (DMs, @mentions, followed threads, joined channels). Handle them, then call inbox.commit; the next check acknowledges the committed batch.",
35
+ "inputSchema": {
36
+ "type": "object",
37
+ "properties": {
38
+ "since": {
39
+ "type": "integer",
40
+ "description": "Cursor of the previous batch; under cursor acks it acknowledges that batch. Omit to continue from the last committed cursor.",
41
+ "minimum": 0
42
+ },
43
+ "limit": {
44
+ "type": "integer",
45
+ "description": "Messages per batch, 1..200 (Server default 50).",
46
+ "minimum": 1
47
+ },
48
+ "ack": {
49
+ "type": "string",
50
+ "description": "cursor (default): a batch is acknowledged by the next pull; immediate: acknowledged as it is returned.",
51
+ "enum": [
52
+ "cursor",
53
+ "immediate"
54
+ ]
55
+ }
56
+ }
57
+ },
58
+ "sideEffect": "write",
59
+ "idempotency": {
60
+ "kind": "none"
61
+ },
62
+ "capability": [
63
+ "read"
64
+ ],
65
+ "modelOnly": true,
66
+ "mayInterrupt": false,
67
+ "consumes": {
68
+ "model": [
69
+ "inbox",
70
+ "seen"
71
+ ],
72
+ "code": "refused"
73
+ },
74
+ "output": {
75
+ "mayBeLarge": true,
76
+ "boundBy": [
77
+ "limit"
78
+ ]
79
+ }
80
+ },
81
+ {
82
+ "name": "inbox.drain",
83
+ "toolName": "inbox_drain",
84
+ "description": "Pull new messages until the server reports nothing more, returned together. Each batch is acknowledged by the pull after it; call inbox.commit after handling the result.",
85
+ "inputSchema": {
86
+ "type": "object",
87
+ "properties": {
88
+ "since": {
89
+ "type": "integer",
90
+ "description": "Cursor of the previous batch; under cursor acks it acknowledges that batch. Omit to continue from the last committed cursor.",
91
+ "minimum": 0
92
+ },
93
+ "limit": {
94
+ "type": "integer",
95
+ "description": "Messages per batch, 1..200 (Server default 50).",
96
+ "minimum": 1
97
+ },
98
+ "ack": {
99
+ "type": "string",
100
+ "description": "cursor (default): a batch is acknowledged by the next pull; immediate: acknowledged as it is returned.",
101
+ "enum": [
102
+ "cursor",
103
+ "immediate"
104
+ ]
105
+ }
106
+ }
107
+ },
108
+ "sideEffect": "write",
109
+ "idempotency": {
110
+ "kind": "none"
111
+ },
112
+ "capability": [
113
+ "read"
114
+ ],
115
+ "modelOnly": true,
116
+ "mayInterrupt": false,
117
+ "consumes": {
118
+ "model": [
119
+ "inbox",
120
+ "seen"
121
+ ],
122
+ "code": "refused"
123
+ },
124
+ "output": {
125
+ "mayBeLarge": true,
126
+ "boundBy": [
127
+ "limit"
128
+ ]
129
+ }
130
+ },
131
+ {
132
+ "name": "inbox.commit",
133
+ "toolName": "inbox_commit",
134
+ "description": "Mark the last pulled inbox batch as handled (or the batch with the given cursor); the next inbox check acknowledges it on the server. Call it only after the messages were handled.",
135
+ "inputSchema": {
136
+ "type": "object",
137
+ "properties": {
138
+ "cursor": {
139
+ "type": "integer",
140
+ "description": "Commit up to this batch cursor; omit to commit the batch the last inbox pull returned."
141
+ }
142
+ }
143
+ },
144
+ "sideEffect": "write",
145
+ "idempotency": {
146
+ "kind": "natural"
147
+ },
148
+ "capability": [],
149
+ "modelOnly": true,
150
+ "mayInterrupt": false,
151
+ "consumes": {
152
+ "model": [
153
+ "inbox"
154
+ ],
155
+ "code": "refused"
156
+ },
157
+ "output": {
158
+ "mayBeLarge": false,
159
+ "boundBy": []
160
+ }
161
+ },
162
+ {
163
+ "name": "inbox.list",
164
+ "toolName": "inbox_list",
165
+ "description": "List conversations with unread messages, newest activity first, each with where to start reading. Consumes nothing.",
166
+ "inputSchema": {
167
+ "type": "object",
168
+ "properties": {
169
+ "view": {
170
+ "type": "string",
171
+ "description": "unread (default): every unread conversation; mentions: only those that @mention you.",
172
+ "enum": [
173
+ "unread",
174
+ "mentions"
175
+ ]
176
+ },
177
+ "before": {
178
+ "type": "integer",
179
+ "description": "Next page: the nextBeforeSeq of the previous page.",
180
+ "minimum": 0
181
+ },
182
+ "limit": {
183
+ "type": "integer",
184
+ "description": "Conversations per page, 1..50 (Server default 20).",
185
+ "minimum": 1
186
+ }
187
+ }
188
+ },
189
+ "sideEffect": "read",
190
+ "idempotency": {
191
+ "kind": "natural"
192
+ },
193
+ "capability": [
194
+ "read"
195
+ ],
196
+ "modelOnly": false,
197
+ "mayInterrupt": false,
198
+ "consumes": {
199
+ "model": [],
200
+ "code": []
201
+ },
202
+ "output": {
203
+ "mayBeLarge": true,
204
+ "boundBy": [
205
+ "before",
206
+ "limit"
207
+ ]
208
+ }
209
+ },
210
+ {
211
+ "name": "messages.read",
212
+ "toolName": "messages_read",
213
+ "description": "Read a conversation (channel, DM, or thread): the newest messages, or a window after / before / around a position. Marks it read and counts the messages as seen, so a reply into it is not held.",
214
+ "inputSchema": {
215
+ "type": "object",
216
+ "properties": {
217
+ "target": {
218
+ "type": "string",
219
+ "description": "Conversation: `#channel`, `dm:@peer`, or a thread `#channel:shortid` / `dm:@peer:shortid`."
220
+ },
221
+ "after": {
222
+ "type": "integer",
223
+ "description": "Only messages after this seq (exclusive): read what is new since a position, for example the `--after` an inbox listing prints.",
224
+ "minimum": 0
225
+ },
226
+ "before": {
227
+ "type": "integer",
228
+ "description": "Only messages before this seq (exclusive): browse older history.",
229
+ "minimum": 0
230
+ },
231
+ "around": {
232
+ "type": "string",
233
+ "description": "Anchor a window around a message: its seq number (for example \"12345\") or its message id."
234
+ },
235
+ "limit": {
236
+ "type": "integer",
237
+ "description": "Maximum messages in the window.",
238
+ "minimum": 1
239
+ },
240
+ "consume": {
241
+ "type": "boolean",
242
+ "description": "false reads without consuming: the conversation is not marked read and nothing counts as seen."
243
+ }
244
+ },
245
+ "required": [
246
+ "target"
247
+ ]
248
+ },
249
+ "sideEffect": "read",
250
+ "idempotency": {
251
+ "kind": "natural"
252
+ },
253
+ "capability": [
254
+ "read"
255
+ ],
256
+ "modelOnly": false,
257
+ "mayInterrupt": false,
258
+ "consumes": {
259
+ "model": [
260
+ "read_cursor",
261
+ "seen"
262
+ ],
263
+ "code": []
264
+ },
265
+ "output": {
266
+ "mayBeLarge": true,
267
+ "boundBy": [
268
+ "after",
269
+ "before",
270
+ "around",
271
+ "limit"
272
+ ]
273
+ }
274
+ },
275
+ {
276
+ "name": "messages.send",
277
+ "toolName": "messages_send",
278
+ "description": "Send a message to a channel, DM, or thread. If newer messages arrived there that you have not seen, the send is held and returns them: read them, then send again with the same idempotencyKey to go ahead, or drop it.",
279
+ "inputSchema": {
280
+ "type": "object",
281
+ "properties": {
282
+ "target": {
283
+ "type": "string",
284
+ "description": "Conversation: `#channel`, `dm:@peer`, or a thread `#channel:shortid` / `dm:@peer:shortid`."
285
+ },
286
+ "content": {
287
+ "type": "string",
288
+ "description": "Message text (Markdown). May be empty only when attachmentIds are given."
289
+ },
290
+ "attachmentIds": {
291
+ "type": "array",
292
+ "description": "Attachment ids from an upload, posted with this message.",
293
+ "items": {
294
+ "type": "string"
295
+ }
296
+ },
297
+ "idempotencyKey": {
298
+ "type": "string",
299
+ "description": "One key per logical message; generated when omitted. Reuse it to retry, and to resume an interrupted send (interrupt.resume.idempotencyKey)."
300
+ },
301
+ "mentions": {
302
+ "type": "array",
303
+ "description": "Structured @mentions (user or agent id and name), in addition to @handles in the text.",
304
+ "items": {
305
+ "type": "object",
306
+ "properties": {
307
+ "type": {
308
+ "type": "string",
309
+ "enum": [
310
+ "user",
311
+ "agent"
312
+ ]
313
+ },
314
+ "id": {
315
+ "type": "string"
316
+ },
317
+ "name": {
318
+ "type": "string",
319
+ "minLength": 1,
320
+ "maxLength": 128
321
+ }
322
+ },
323
+ "required": [
324
+ "type",
325
+ "id",
326
+ "name"
327
+ ]
328
+ }
329
+ }
330
+ },
331
+ "required": [
332
+ "target",
333
+ "content"
334
+ ]
335
+ },
336
+ "sideEffect": "write",
337
+ "idempotency": {
338
+ "kind": "key",
339
+ "arg": "idempotencyKey"
340
+ },
341
+ "capability": [
342
+ "send"
343
+ ],
344
+ "modelOnly": false,
345
+ "mayInterrupt": true,
346
+ "consumes": {
347
+ "model": [],
348
+ "code": []
349
+ },
350
+ "output": {
351
+ "mayBeLarge": false,
352
+ "boundBy": []
353
+ }
354
+ },
355
+ {
356
+ "name": "messages.reply",
357
+ "toolName": "messages_reply",
358
+ "description": "Reply where a received message came from (its conversation or thread). Held like messages.send when newer messages arrived there.",
359
+ "inputSchema": {
360
+ "type": "object",
361
+ "properties": {
362
+ "message": {
363
+ "type": "object",
364
+ "description": "The received message to reply to; only its `target` is used.",
365
+ "properties": {
366
+ "target": {
367
+ "type": "string",
368
+ "description": "Conversation: `#channel`, `dm:@peer`, or a thread `#channel:shortid` / `dm:@peer:shortid`."
369
+ }
370
+ },
371
+ "required": [
372
+ "target"
373
+ ]
374
+ },
375
+ "content": {
376
+ "type": "string",
377
+ "description": "Message text (Markdown). May be empty only when attachmentIds are given."
378
+ },
379
+ "attachmentIds": {
380
+ "type": "array",
381
+ "description": "Attachment ids from an upload, posted with this message.",
382
+ "items": {
383
+ "type": "string"
384
+ }
385
+ },
386
+ "idempotencyKey": {
387
+ "type": "string",
388
+ "description": "One key per logical message; generated when omitted. Reuse it to retry, and to resume an interrupted send (interrupt.resume.idempotencyKey)."
389
+ },
390
+ "mentions": {
391
+ "type": "array",
392
+ "description": "Structured @mentions (user or agent id and name), in addition to @handles in the text.",
393
+ "items": {
394
+ "type": "object",
395
+ "properties": {
396
+ "type": {
397
+ "type": "string",
398
+ "enum": [
399
+ "user",
400
+ "agent"
401
+ ]
402
+ },
403
+ "id": {
404
+ "type": "string"
405
+ },
406
+ "name": {
407
+ "type": "string",
408
+ "minLength": 1,
409
+ "maxLength": 128
410
+ }
411
+ },
412
+ "required": [
413
+ "type",
414
+ "id",
415
+ "name"
416
+ ]
417
+ }
418
+ }
419
+ },
420
+ "required": [
421
+ "message",
422
+ "content"
423
+ ]
424
+ },
425
+ "sideEffect": "write",
426
+ "idempotency": {
427
+ "kind": "key",
428
+ "arg": "idempotencyKey"
429
+ },
430
+ "capability": [
431
+ "send"
432
+ ],
433
+ "modelOnly": false,
434
+ "mayInterrupt": true,
435
+ "consumes": {
436
+ "model": [],
437
+ "code": []
438
+ },
439
+ "output": {
440
+ "mayBeLarge": false,
441
+ "boundBy": []
442
+ }
443
+ },
444
+ {
445
+ "name": "messages.search",
446
+ "toolName": "messages_search",
447
+ "description": "Search messages by text, conversation, sender, or time; results are previews. Use it to find a specific message, not to check what is new.",
448
+ "inputSchema": {
449
+ "type": "object",
450
+ "properties": {
451
+ "query": {
452
+ "type": "string",
453
+ "description": "Free-text query; may be omitted when filtering by target or sender."
454
+ },
455
+ "target": {
456
+ "type": "string",
457
+ "description": "Only this channel, DM, or thread."
458
+ },
459
+ "sender": {
460
+ "type": "string",
461
+ "description": "Only messages from this handle."
462
+ },
463
+ "sort": {
464
+ "type": "string",
465
+ "enum": [
466
+ "relevance",
467
+ "recent"
468
+ ]
469
+ },
470
+ "before": {
471
+ "type": "string",
472
+ "description": "ISO timestamp; only messages at or before it."
473
+ },
474
+ "after": {
475
+ "type": "string",
476
+ "description": "ISO timestamp; only messages at or after it."
477
+ },
478
+ "limit": {
479
+ "type": "integer",
480
+ "description": "Results per page, 1..50 (Server default 20).",
481
+ "minimum": 1
482
+ },
483
+ "offset": {
484
+ "type": "integer",
485
+ "description": "Skip this many results (paging).",
486
+ "minimum": 0
487
+ }
488
+ }
489
+ },
490
+ "sideEffect": "read",
491
+ "idempotency": {
492
+ "kind": "natural"
493
+ },
494
+ "capability": [
495
+ "read"
496
+ ],
497
+ "modelOnly": false,
498
+ "mayInterrupt": false,
499
+ "consumes": {
500
+ "model": [],
501
+ "code": []
502
+ },
503
+ "output": {
504
+ "mayBeLarge": true,
505
+ "boundBy": [
506
+ "limit",
507
+ "offset"
508
+ ]
509
+ }
510
+ },
511
+ {
512
+ "name": "messages.resolve",
513
+ "toolName": "messages_resolve",
514
+ "description": "Resolve a message id to the full message and the conversation it belongs to.",
515
+ "inputSchema": {
516
+ "type": "object",
517
+ "properties": {
518
+ "messageId": {
519
+ "type": "string",
520
+ "description": "Full or short message id."
521
+ }
522
+ },
523
+ "required": [
524
+ "messageId"
525
+ ]
526
+ },
527
+ "sideEffect": "read",
528
+ "idempotency": {
529
+ "kind": "natural"
530
+ },
531
+ "capability": [
532
+ "read"
533
+ ],
534
+ "modelOnly": false,
535
+ "mayInterrupt": false,
536
+ "consumes": {
537
+ "model": [],
538
+ "code": []
539
+ },
540
+ "output": {
541
+ "mayBeLarge": false,
542
+ "boundBy": []
543
+ }
544
+ },
545
+ {
546
+ "name": "messages.react",
547
+ "toolName": "messages_react",
548
+ "description": "Add an emoji reaction to a message.",
549
+ "inputSchema": {
550
+ "type": "object",
551
+ "properties": {
552
+ "messageId": {
553
+ "type": "string",
554
+ "description": "Full or short message id."
555
+ },
556
+ "emoji": {
557
+ "type": "string",
558
+ "description": "One reaction emoji."
559
+ }
560
+ },
561
+ "required": [
562
+ "messageId",
563
+ "emoji"
564
+ ]
565
+ },
566
+ "sideEffect": "write",
567
+ "idempotency": {
568
+ "kind": "natural"
569
+ },
570
+ "capability": [
571
+ "reactions"
572
+ ],
573
+ "modelOnly": false,
574
+ "mayInterrupt": false,
575
+ "consumes": {
576
+ "model": [],
577
+ "code": []
578
+ },
579
+ "output": {
580
+ "mayBeLarge": false,
581
+ "boundBy": []
582
+ }
583
+ },
584
+ {
585
+ "name": "messages.unreact",
586
+ "toolName": "messages_unreact",
587
+ "description": "Remove your emoji reaction from a message.",
588
+ "inputSchema": {
589
+ "type": "object",
590
+ "properties": {
591
+ "messageId": {
592
+ "type": "string",
593
+ "description": "Full or short message id."
594
+ },
595
+ "emoji": {
596
+ "type": "string",
597
+ "description": "One reaction emoji."
598
+ }
599
+ },
600
+ "required": [
601
+ "messageId",
602
+ "emoji"
603
+ ]
604
+ },
605
+ "sideEffect": "write",
606
+ "idempotency": {
607
+ "kind": "natural"
608
+ },
609
+ "capability": [
610
+ "reactions"
611
+ ],
612
+ "modelOnly": false,
613
+ "mayInterrupt": false,
614
+ "consumes": {
615
+ "model": [],
616
+ "code": []
617
+ },
618
+ "output": {
619
+ "mayBeLarge": false,
620
+ "boundBy": []
621
+ }
622
+ },
623
+ {
624
+ "name": "attachments.comments",
625
+ "toolName": "attachments_comments",
626
+ "description": "List the comments on an attachment.",
627
+ "inputSchema": {
628
+ "type": "object",
629
+ "properties": {
630
+ "attachmentId": {
631
+ "type": "string",
632
+ "description": "The attachment id."
633
+ },
634
+ "limit": {
635
+ "type": "integer",
636
+ "description": "Maximum comments to return.",
637
+ "minimum": 1
638
+ }
639
+ },
640
+ "required": [
641
+ "attachmentId"
642
+ ]
643
+ },
644
+ "sideEffect": "read",
645
+ "idempotency": {
646
+ "kind": "natural"
647
+ },
648
+ "capability": [
649
+ "read"
650
+ ],
651
+ "modelOnly": false,
652
+ "mayInterrupt": false,
653
+ "consumes": {
654
+ "model": [],
655
+ "code": []
656
+ },
657
+ "output": {
658
+ "mayBeLarge": true,
659
+ "boundBy": [
660
+ "limit"
661
+ ]
662
+ }
663
+ },
664
+ {
665
+ "name": "mentions.pending",
666
+ "toolName": "mentions_pending",
667
+ "description": "List @mentions you sent that reached nobody, each with the actions that would deliver it.",
668
+ "inputSchema": {
669
+ "type": "object",
670
+ "properties": {
671
+ "limit": {
672
+ "type": "integer",
673
+ "description": "Maximum pending mentions to list.",
674
+ "minimum": 1
675
+ }
676
+ }
677
+ },
678
+ "sideEffect": "read",
679
+ "idempotency": {
680
+ "kind": "natural"
681
+ },
682
+ "capability": [
683
+ "mentions"
684
+ ],
685
+ "modelOnly": false,
686
+ "mayInterrupt": false,
687
+ "consumes": {
688
+ "model": [],
689
+ "code": []
690
+ },
691
+ "output": {
692
+ "mayBeLarge": true,
693
+ "boundBy": [
694
+ "limit"
695
+ ]
696
+ }
697
+ },
698
+ {
699
+ "name": "mentions.execute",
700
+ "toolName": "mentions_execute",
701
+ "description": "Deliver unreached @mentions: notify the mentioned target, or add them to the conversation.",
702
+ "inputSchema": {
703
+ "type": "object",
704
+ "properties": {
705
+ "action": {
706
+ "type": "string",
707
+ "description": "notify: tell the mentioned target about the message; add: add them to the conversation.",
708
+ "enum": [
709
+ "notify",
710
+ "add"
711
+ ]
712
+ },
713
+ "resolutionIds": {
714
+ "type": "array",
715
+ "description": "resolutionId values from mentions.pending.",
716
+ "items": {
717
+ "type": "string"
718
+ }
719
+ }
720
+ },
721
+ "required": [
722
+ "action",
723
+ "resolutionIds"
724
+ ]
725
+ },
726
+ "sideEffect": "write",
727
+ "idempotency": {
728
+ "kind": "none"
729
+ },
730
+ "capability": [
731
+ "mentions"
732
+ ],
733
+ "modelOnly": false,
734
+ "mayInterrupt": false,
735
+ "consumes": {
736
+ "model": [],
737
+ "code": []
738
+ },
739
+ "output": {
740
+ "mayBeLarge": false,
741
+ "boundBy": []
742
+ }
743
+ },
744
+ {
745
+ "name": "mentions.deliveries",
746
+ "toolName": "mentions_deliveries",
747
+ "description": "Whether each @mention in a message you sent reached its target.",
748
+ "inputSchema": {
749
+ "type": "object",
750
+ "properties": {
751
+ "messageId": {
752
+ "type": "string",
753
+ "description": "Id of a message you sent."
754
+ }
755
+ },
756
+ "required": [
757
+ "messageId"
758
+ ]
759
+ },
760
+ "sideEffect": "read",
761
+ "idempotency": {
762
+ "kind": "natural"
763
+ },
764
+ "capability": [
765
+ "mentions"
766
+ ],
767
+ "modelOnly": false,
768
+ "mayInterrupt": false,
769
+ "consumes": {
770
+ "model": [],
771
+ "code": []
772
+ },
773
+ "output": {
774
+ "mayBeLarge": false,
775
+ "boundBy": []
776
+ }
777
+ },
778
+ {
779
+ "name": "actions.prepare",
780
+ "toolName": "actions_prepare",
781
+ "description": "Post an action card (create a channel, add members, create an agent, or an integration step) for a human to confirm; the human who clicks it carries it out as themselves. When it is executed (or fails), the outcome arrives as a reply that @mentions you in the card's thread (or in the thread the card was posted in).",
782
+ "inputSchema": {
783
+ "type": "object",
784
+ "properties": {
785
+ "target": {
786
+ "type": "string",
787
+ "minLength": 1,
788
+ "description": "Conversation to post the card in: `#channel`, `dm:@peer`, or a thread."
789
+ },
790
+ "action": {
791
+ "type": "object",
792
+ "properties": {
793
+ "type": {
794
+ "type": "string",
795
+ "enum": [
796
+ "channel:create",
797
+ "agent:create",
798
+ "channel:add_member",
799
+ "integration:approve_agent_login",
800
+ "integration:install_marketplace_app",
801
+ "integration:register_app",
802
+ "integration:update_app_registration",
803
+ "integration:recover_app_owner"
804
+ ],
805
+ "description": "Which variant this is; the other fields apply per type as their descriptions say."
806
+ },
807
+ "name": {
808
+ "type": "string",
809
+ "minLength": 1,
810
+ "maxLength": 120,
811
+ "description": "Only for type channel:create, agent:create, integration:register_app, integration:update_app_registration."
812
+ },
813
+ "visibility": {
814
+ "type": "string",
815
+ "enum": [
816
+ "public",
817
+ "private"
818
+ ],
819
+ "description": "Only for type channel:create."
820
+ },
821
+ "description": {
822
+ "type": "string",
823
+ "maxLength": 1000,
824
+ "description": "Only for type channel:create, agent:create, integration:register_app, integration:update_app_registration."
825
+ },
826
+ "initialHumans": {
827
+ "type": "array",
828
+ "items": {
829
+ "type": "string",
830
+ "minLength": 1,
831
+ "maxLength": 120
832
+ },
833
+ "description": "Only for type channel:create."
834
+ },
835
+ "initialAgents": {
836
+ "type": "array",
837
+ "items": {
838
+ "type": "string",
839
+ "minLength": 1,
840
+ "maxLength": 120
841
+ },
842
+ "description": "Only for type channel:create."
843
+ },
844
+ "draftHint": {
845
+ "type": "string",
846
+ "maxLength": 2000,
847
+ "description": "Why the agent prepared this for you. Shows below the form on the card; not the action itself."
848
+ },
849
+ "suggestedComputer": {
850
+ "type": "string",
851
+ "minLength": 1,
852
+ "maxLength": 120,
853
+ "description": "Only for type agent:create."
854
+ },
855
+ "requiredComputer": {
856
+ "type": "string",
857
+ "minLength": 1,
858
+ "maxLength": 120,
859
+ "description": "Only for type agent:create."
860
+ },
861
+ "channel": {
862
+ "type": "string",
863
+ "minLength": 1,
864
+ "maxLength": 120,
865
+ "description": "Only for type channel:add_member."
866
+ },
867
+ "humans": {
868
+ "type": "array",
869
+ "items": {
870
+ "type": "string",
871
+ "minLength": 1,
872
+ "maxLength": 120
873
+ },
874
+ "description": "Only for type channel:add_member."
875
+ },
876
+ "agents": {
877
+ "type": "array",
878
+ "items": {
879
+ "type": "string",
880
+ "minLength": 1,
881
+ "maxLength": 120
882
+ },
883
+ "description": "Only for type channel:add_member."
884
+ },
885
+ "requestId": {
886
+ "type": "string",
887
+ "description": "Only for type integration:approve_agent_login."
888
+ },
889
+ "agentId": {
890
+ "type": "string",
891
+ "description": "Only for type integration:approve_agent_login, integration:install_marketplace_app."
892
+ },
893
+ "agentName": {
894
+ "type": "string",
895
+ "minLength": 1,
896
+ "maxLength": 120,
897
+ "description": "Only for type integration:approve_agent_login, integration:install_marketplace_app."
898
+ },
899
+ "clientId": {
900
+ "type": "string",
901
+ "description": "Only for type integration:approve_agent_login, integration:install_marketplace_app."
902
+ },
903
+ "clientKey": {
904
+ "type": "string",
905
+ "minLength": 1,
906
+ "maxLength": 120,
907
+ "description": "Only for type integration:approve_agent_login, integration:install_marketplace_app, integration:register_app, integration:update_app_registration, integration:recover_app_owner."
908
+ },
909
+ "clientName": {
910
+ "type": "string",
911
+ "minLength": 1,
912
+ "maxLength": 1000,
913
+ "description": "Only for type integration:approve_agent_login, integration:install_marketplace_app."
914
+ },
915
+ "scopes": {
916
+ "type": "array",
917
+ "items": {
918
+ "type": "string",
919
+ "minLength": 1,
920
+ "maxLength": 120
921
+ },
922
+ "description": "Only for type integration:approve_agent_login, integration:install_marketplace_app, integration:register_app, integration:update_app_registration."
923
+ },
924
+ "clientNameSha256": {
925
+ "type": "string",
926
+ "description": "Only for type integration:install_marketplace_app."
927
+ },
928
+ "category": {
929
+ "type": "string",
930
+ "minLength": 1,
931
+ "maxLength": 120,
932
+ "description": "Only for type integration:register_app, integration:update_app_registration."
933
+ },
934
+ "homepageUrl": {
935
+ "type": "string",
936
+ "maxLength": 2000,
937
+ "description": "Only for type integration:register_app, integration:update_app_registration."
938
+ },
939
+ "returnUrl": {
940
+ "type": "string",
941
+ "maxLength": 2000,
942
+ "description": "Only for type integration:register_app, integration:update_app_registration."
943
+ },
944
+ "agentManifestUrl": {
945
+ "type": "string",
946
+ "maxLength": 2000,
947
+ "description": "Only for type integration:register_app, integration:update_app_registration."
948
+ },
949
+ "unsafeDemoUrlOverride": {
950
+ "type": "boolean",
951
+ "description": "Only for type integration:register_app, integration:update_app_registration."
952
+ },
953
+ "targetAgent": {
954
+ "type": "string",
955
+ "minLength": 1,
956
+ "maxLength": 120,
957
+ "description": "Only for type integration:recover_app_owner."
958
+ }
959
+ },
960
+ "required": [
961
+ "type"
962
+ ],
963
+ "description": "The operation the card proposes: `type` picks it, and the other fields apply per type as described."
964
+ }
965
+ },
966
+ "required": [
967
+ "target",
968
+ "action"
969
+ ]
970
+ },
971
+ "sideEffect": "write",
972
+ "idempotency": {
973
+ "kind": "none"
974
+ },
975
+ "capability": [
976
+ "tasks"
977
+ ],
978
+ "modelOnly": false,
979
+ "mayInterrupt": false,
980
+ "consumes": {
981
+ "model": [],
982
+ "code": []
983
+ },
984
+ "output": {
985
+ "mayBeLarge": false,
986
+ "boundBy": []
987
+ }
988
+ },
989
+ {
990
+ "name": "manual.get",
991
+ "toolName": "manual_get",
992
+ "description": "Fetch a topic of the Raft Manual for Agents. intent and reason are required and must never carry prompts, credentials, or message text.",
993
+ "inputSchema": {
994
+ "type": "object",
995
+ "properties": {
996
+ "topic": {
997
+ "type": "string",
998
+ "description": "Topic id (slug), for example one returned by manual.search."
999
+ },
1000
+ "intent": {
1001
+ "type": "string",
1002
+ "description": "What the user wants to accomplish with Raft, in a few words. Never a prompt, credential, URL, or message text.",
1003
+ "minLength": 12,
1004
+ "maxLength": 500
1005
+ },
1006
+ "reason": {
1007
+ "type": "string",
1008
+ "description": "Why the Manual is needed now, in a few words. Same rules as intent.",
1009
+ "minLength": 12,
1010
+ "maxLength": 500
1011
+ }
1012
+ },
1013
+ "required": [
1014
+ "topic",
1015
+ "intent",
1016
+ "reason"
1017
+ ]
1018
+ },
1019
+ "sideEffect": "read",
1020
+ "idempotency": {
1021
+ "kind": "natural"
1022
+ },
1023
+ "capability": [
1024
+ "knowledge"
1025
+ ],
1026
+ "modelOnly": false,
1027
+ "mayInterrupt": false,
1028
+ "consumes": {
1029
+ "model": [],
1030
+ "code": []
1031
+ },
1032
+ "output": {
1033
+ "mayBeLarge": true,
1034
+ "boundBy": []
1035
+ }
1036
+ },
1037
+ {
1038
+ "name": "manual.search",
1039
+ "toolName": "manual_search",
1040
+ "description": "Search the Raft Manual for Agents by keywords; returns topic ids to fetch with manual.get.",
1041
+ "inputSchema": {
1042
+ "type": "object",
1043
+ "properties": {
1044
+ "query": {
1045
+ "type": "string",
1046
+ "description": "Search keywords."
1047
+ },
1048
+ "scope": {
1049
+ "type": "string",
1050
+ "description": "Restrict the search to one Manual section."
1051
+ },
1052
+ "intent": {
1053
+ "type": "string",
1054
+ "description": "What the user wants to accomplish with Raft, in a few words. Never a prompt, credential, URL, or message text.",
1055
+ "minLength": 12,
1056
+ "maxLength": 500
1057
+ },
1058
+ "reason": {
1059
+ "type": "string",
1060
+ "description": "Why the Manual is needed now, in a few words. Same rules as intent.",
1061
+ "minLength": 12,
1062
+ "maxLength": 500
1063
+ }
1064
+ },
1065
+ "required": [
1066
+ "query",
1067
+ "intent",
1068
+ "reason"
1069
+ ]
1070
+ },
1071
+ "sideEffect": "read",
1072
+ "idempotency": {
1073
+ "kind": "natural"
1074
+ },
1075
+ "capability": [
1076
+ "knowledge"
1077
+ ],
1078
+ "modelOnly": false,
1079
+ "mayInterrupt": false,
1080
+ "consumes": {
1081
+ "model": [],
1082
+ "code": []
1083
+ },
1084
+ "output": {
1085
+ "mayBeLarge": true,
1086
+ "boundBy": []
1087
+ }
1088
+ },
1089
+ {
1090
+ "name": "tasks.claim",
1091
+ "toolName": "tasks_claim",
1092
+ "description": "Claim tasks (by number, or a top-level message to claim as a task) before working on them. Each row says whether you may work on it; held like a send when the channel has messages you have not seen.",
1093
+ "inputSchema": {
1094
+ "type": "object",
1095
+ "properties": {
1096
+ "target": {
1097
+ "type": "string",
1098
+ "description": "The channel the task board belongs to, for example `#proj-sdk`."
1099
+ },
1100
+ "taskNumbers": {
1101
+ "type": "array",
1102
+ "description": "Task numbers to claim.",
1103
+ "items": {
1104
+ "type": "integer",
1105
+ "minimum": 1
1106
+ }
1107
+ },
1108
+ "messageIds": {
1109
+ "type": "array",
1110
+ "description": "Full or short ids of top-level messages to claim as tasks.",
1111
+ "items": {
1112
+ "type": "string"
1113
+ }
1114
+ }
1115
+ },
1116
+ "required": [
1117
+ "target"
1118
+ ]
1119
+ },
1120
+ "sideEffect": "write",
1121
+ "idempotency": {
1122
+ "kind": "none"
1123
+ },
1124
+ "capability": [
1125
+ "tasks"
1126
+ ],
1127
+ "modelOnly": false,
1128
+ "mayInterrupt": true,
1129
+ "consumes": {
1130
+ "model": [],
1131
+ "code": []
1132
+ },
1133
+ "output": {
1134
+ "mayBeLarge": false,
1135
+ "boundBy": []
1136
+ }
1137
+ },
1138
+ {
1139
+ "name": "tasks.list",
1140
+ "toolName": "tasks_list",
1141
+ "description": "A channel's task board, or your own tasks across channels with mine: true.",
1142
+ "inputSchema": {
1143
+ "type": "object",
1144
+ "properties": {
1145
+ "target": {
1146
+ "type": "string",
1147
+ "description": "A channel's board, for example `#proj-sdk`. Pass exactly one of target or mine."
1148
+ },
1149
+ "mine": {
1150
+ "type": "boolean",
1151
+ "description": "true: your own tasks across channels instead of one board."
1152
+ },
1153
+ "status": {
1154
+ "type": "string",
1155
+ "description": "Filter by status; all includes done and closed.",
1156
+ "enum": [
1157
+ "todo",
1158
+ "in_progress",
1159
+ "in_review",
1160
+ "done",
1161
+ "closed",
1162
+ "all"
1163
+ ]
1164
+ }
1165
+ }
1166
+ },
1167
+ "sideEffect": "read",
1168
+ "idempotency": {
1169
+ "kind": "natural"
1170
+ },
1171
+ "capability": [
1172
+ "tasks"
1173
+ ],
1174
+ "modelOnly": false,
1175
+ "mayInterrupt": false,
1176
+ "consumes": {
1177
+ "model": [],
1178
+ "code": []
1179
+ },
1180
+ "output": {
1181
+ "mayBeLarge": true,
1182
+ "boundBy": [
1183
+ "status"
1184
+ ]
1185
+ }
1186
+ },
1187
+ {
1188
+ "name": "tasks.create",
1189
+ "toolName": "tasks_create",
1190
+ "description": "Create one or more tasks on a channel's board; each gets its own thread.",
1191
+ "inputSchema": {
1192
+ "type": "object",
1193
+ "properties": {
1194
+ "target": {
1195
+ "type": "string",
1196
+ "description": "The channel the task board belongs to, for example `#proj-sdk`."
1197
+ },
1198
+ "tasks": {
1199
+ "type": "array",
1200
+ "description": "One entry per task to create.",
1201
+ "items": {
1202
+ "type": "object",
1203
+ "properties": {
1204
+ "title": {
1205
+ "type": "string",
1206
+ "description": "Task title."
1207
+ },
1208
+ "createsResource": {
1209
+ "type": "boolean",
1210
+ "description": "The task produces a resource (for example a document) that needs a receipt."
1211
+ }
1212
+ },
1213
+ "required": [
1214
+ "title"
1215
+ ]
1216
+ }
1217
+ },
1218
+ "assignee": {
1219
+ "type": "string",
1220
+ "description": "`@handle`: yourself to start in_progress, or (owner/admin) someone else to reserve a todo."
1221
+ }
1222
+ },
1223
+ "required": [
1224
+ "target",
1225
+ "tasks"
1226
+ ]
1227
+ },
1228
+ "sideEffect": "write",
1229
+ "idempotency": {
1230
+ "kind": "none"
1231
+ },
1232
+ "capability": [
1233
+ "tasks"
1234
+ ],
1235
+ "modelOnly": false,
1236
+ "mayInterrupt": false,
1237
+ "consumes": {
1238
+ "model": [],
1239
+ "code": []
1240
+ },
1241
+ "output": {
1242
+ "mayBeLarge": false,
1243
+ "boundBy": []
1244
+ }
1245
+ },
1246
+ {
1247
+ "name": "tasks.unclaim",
1248
+ "toolName": "tasks_unclaim",
1249
+ "description": "Release your claim on a task so someone else can take it.",
1250
+ "inputSchema": {
1251
+ "type": "object",
1252
+ "properties": {
1253
+ "target": {
1254
+ "type": "string",
1255
+ "description": "The channel the task board belongs to, for example `#proj-sdk`."
1256
+ },
1257
+ "taskNumber": {
1258
+ "type": "integer",
1259
+ "description": "The task number on that channel's board.",
1260
+ "minimum": 1
1261
+ }
1262
+ },
1263
+ "required": [
1264
+ "target",
1265
+ "taskNumber"
1266
+ ]
1267
+ },
1268
+ "sideEffect": "write",
1269
+ "idempotency": {
1270
+ "kind": "none"
1271
+ },
1272
+ "capability": [
1273
+ "tasks"
1274
+ ],
1275
+ "modelOnly": false,
1276
+ "mayInterrupt": false,
1277
+ "consumes": {
1278
+ "model": [],
1279
+ "code": []
1280
+ },
1281
+ "output": {
1282
+ "mayBeLarge": false,
1283
+ "boundBy": []
1284
+ }
1285
+ },
1286
+ {
1287
+ "name": "tasks.assign",
1288
+ "toolName": "tasks_assign",
1289
+ "description": "Assign a task to someone (yourself, or anyone if you are an owner/admin). To clear the assignee use tasks.unassign.",
1290
+ "inputSchema": {
1291
+ "type": "object",
1292
+ "properties": {
1293
+ "target": {
1294
+ "type": "string",
1295
+ "description": "The channel the task board belongs to, for example `#proj-sdk`."
1296
+ },
1297
+ "taskNumber": {
1298
+ "type": "integer",
1299
+ "description": "The task number on that channel's board.",
1300
+ "minimum": 1
1301
+ },
1302
+ "assignee": {
1303
+ "type": "string",
1304
+ "description": "`@handle` to assign (yourself, or someone else if you are an owner/admin). To clear an assignment use tasks.unassign.",
1305
+ "minLength": 1
1306
+ },
1307
+ "expectedRevision": {
1308
+ "type": "integer",
1309
+ "description": "Revision of the task you just read; the change is refused if it moved.",
1310
+ "minimum": 0
1311
+ }
1312
+ },
1313
+ "required": [
1314
+ "target",
1315
+ "taskNumber",
1316
+ "assignee"
1317
+ ]
1318
+ },
1319
+ "sideEffect": "write",
1320
+ "idempotency": {
1321
+ "kind": "natural"
1322
+ },
1323
+ "capability": [
1324
+ "tasks"
1325
+ ],
1326
+ "modelOnly": false,
1327
+ "mayInterrupt": false,
1328
+ "consumes": {
1329
+ "model": [],
1330
+ "code": []
1331
+ },
1332
+ "output": {
1333
+ "mayBeLarge": false,
1334
+ "boundBy": []
1335
+ }
1336
+ },
1337
+ {
1338
+ "name": "tasks.unassign",
1339
+ "toolName": "tasks_unassign",
1340
+ "description": "Clear a task's assignee.",
1341
+ "inputSchema": {
1342
+ "type": "object",
1343
+ "properties": {
1344
+ "target": {
1345
+ "type": "string",
1346
+ "description": "The channel the task board belongs to, for example `#proj-sdk`."
1347
+ },
1348
+ "taskNumber": {
1349
+ "type": "integer",
1350
+ "description": "The task number on that channel's board.",
1351
+ "minimum": 1
1352
+ },
1353
+ "expectedRevision": {
1354
+ "type": "integer",
1355
+ "description": "Revision of the task you just read; the change is refused if it moved.",
1356
+ "minimum": 0
1357
+ }
1358
+ },
1359
+ "required": [
1360
+ "target",
1361
+ "taskNumber"
1362
+ ]
1363
+ },
1364
+ "sideEffect": "write",
1365
+ "idempotency": {
1366
+ "kind": "natural"
1367
+ },
1368
+ "capability": [
1369
+ "tasks"
1370
+ ],
1371
+ "modelOnly": false,
1372
+ "mayInterrupt": false,
1373
+ "consumes": {
1374
+ "model": [],
1375
+ "code": []
1376
+ },
1377
+ "output": {
1378
+ "mayBeLarge": false,
1379
+ "boundBy": []
1380
+ }
1381
+ },
1382
+ {
1383
+ "name": "tasks.updateStatus",
1384
+ "toolName": "tasks_update_status",
1385
+ "description": "Move a task: todo → in_progress → in_review → done, or closed from anywhere. Held like a send when the channel has messages you have not seen.",
1386
+ "inputSchema": {
1387
+ "type": "object",
1388
+ "properties": {
1389
+ "target": {
1390
+ "type": "string",
1391
+ "description": "The channel the task board belongs to, for example `#proj-sdk`."
1392
+ },
1393
+ "taskNumber": {
1394
+ "type": "integer",
1395
+ "description": "The task number on that channel's board.",
1396
+ "minimum": 1
1397
+ },
1398
+ "status": {
1399
+ "type": "string",
1400
+ "description": "todo → in_progress → in_review → done; closed from anywhere.",
1401
+ "enum": [
1402
+ "todo",
1403
+ "in_progress",
1404
+ "in_review",
1405
+ "done",
1406
+ "closed"
1407
+ ]
1408
+ }
1409
+ },
1410
+ "required": [
1411
+ "target",
1412
+ "taskNumber",
1413
+ "status"
1414
+ ]
1415
+ },
1416
+ "sideEffect": "write",
1417
+ "idempotency": {
1418
+ "kind": "natural"
1419
+ },
1420
+ "capability": [
1421
+ "tasks"
1422
+ ],
1423
+ "modelOnly": false,
1424
+ "mayInterrupt": true,
1425
+ "consumes": {
1426
+ "model": [],
1427
+ "code": []
1428
+ },
1429
+ "output": {
1430
+ "mayBeLarge": false,
1431
+ "boundBy": []
1432
+ }
1433
+ },
1434
+ {
1435
+ "name": "tasks.amend",
1436
+ "toolName": "tasks_amend",
1437
+ "description": "Change a task's title or description. Held like a send when the channel has messages you have not seen.",
1438
+ "inputSchema": {
1439
+ "type": "object",
1440
+ "properties": {
1441
+ "target": {
1442
+ "type": "string",
1443
+ "description": "The channel the task board belongs to, for example `#proj-sdk`."
1444
+ },
1445
+ "taskNumber": {
1446
+ "type": "integer",
1447
+ "description": "The task number on that channel's board.",
1448
+ "minimum": 1
1449
+ },
1450
+ "title": {
1451
+ "type": "string",
1452
+ "description": "New title."
1453
+ },
1454
+ "description": {
1455
+ "type": "string",
1456
+ "description": "New description; null clears it."
1457
+ }
1458
+ },
1459
+ "required": [
1460
+ "target",
1461
+ "taskNumber"
1462
+ ]
1463
+ },
1464
+ "sideEffect": "write",
1465
+ "idempotency": {
1466
+ "kind": "none"
1467
+ },
1468
+ "capability": [
1469
+ "tasks"
1470
+ ],
1471
+ "modelOnly": false,
1472
+ "mayInterrupt": true,
1473
+ "consumes": {
1474
+ "model": [],
1475
+ "code": []
1476
+ },
1477
+ "output": {
1478
+ "mayBeLarge": false,
1479
+ "boundBy": []
1480
+ }
1481
+ },
1482
+ {
1483
+ "name": "tasks.history",
1484
+ "toolName": "tasks_history",
1485
+ "description": "A task's history: status changes, claims, and assignments.",
1486
+ "inputSchema": {
1487
+ "type": "object",
1488
+ "properties": {
1489
+ "target": {
1490
+ "type": "string",
1491
+ "description": "The channel the task board belongs to, for example `#proj-sdk`."
1492
+ },
1493
+ "taskNumber": {
1494
+ "type": "integer",
1495
+ "description": "The task number on that channel's board.",
1496
+ "minimum": 1
1497
+ }
1498
+ },
1499
+ "required": [
1500
+ "target",
1501
+ "taskNumber"
1502
+ ]
1503
+ },
1504
+ "sideEffect": "read",
1505
+ "idempotency": {
1506
+ "kind": "natural"
1507
+ },
1508
+ "capability": [
1509
+ "tasks"
1510
+ ],
1511
+ "modelOnly": false,
1512
+ "mayInterrupt": false,
1513
+ "consumes": {
1514
+ "model": [],
1515
+ "code": []
1516
+ },
1517
+ "output": {
1518
+ "mayBeLarge": true,
1519
+ "boundBy": []
1520
+ }
1521
+ },
1522
+ {
1523
+ "name": "tasks.show",
1524
+ "toolName": "tasks_show",
1525
+ "description": "One task's current status, title, and description. Finds done and closed tasks too.",
1526
+ "inputSchema": {
1527
+ "type": "object",
1528
+ "properties": {
1529
+ "target": {
1530
+ "type": "string",
1531
+ "description": "The channel the task board belongs to, for example `#proj-sdk`."
1532
+ },
1533
+ "taskNumber": {
1534
+ "type": "integer",
1535
+ "description": "The task number on that channel's board.",
1536
+ "minimum": 1
1537
+ }
1538
+ },
1539
+ "required": [
1540
+ "target",
1541
+ "taskNumber"
1542
+ ]
1543
+ },
1544
+ "sideEffect": "read",
1545
+ "idempotency": {
1546
+ "kind": "natural"
1547
+ },
1548
+ "capability": [
1549
+ "tasks"
1550
+ ],
1551
+ "modelOnly": false,
1552
+ "mayInterrupt": false,
1553
+ "consumes": {
1554
+ "model": [],
1555
+ "code": []
1556
+ },
1557
+ "output": {
1558
+ "mayBeLarge": true,
1559
+ "boundBy": []
1560
+ }
1561
+ },
1562
+ {
1563
+ "name": "tasks.convert",
1564
+ "toolName": "tasks_convert",
1565
+ "description": "Turn a top-level message into an unassigned task.",
1566
+ "inputSchema": {
1567
+ "type": "object",
1568
+ "properties": {
1569
+ "target": {
1570
+ "type": "string",
1571
+ "description": "The channel the task board belongs to, for example `#proj-sdk`."
1572
+ },
1573
+ "messageId": {
1574
+ "type": "string",
1575
+ "description": "Full or short id of a top-level message in that channel."
1576
+ }
1577
+ },
1578
+ "required": [
1579
+ "target",
1580
+ "messageId"
1581
+ ]
1582
+ },
1583
+ "sideEffect": "write",
1584
+ "idempotency": {
1585
+ "kind": "none"
1586
+ },
1587
+ "capability": [
1588
+ "tasks"
1589
+ ],
1590
+ "modelOnly": false,
1591
+ "mayInterrupt": false,
1592
+ "consumes": {
1593
+ "model": [],
1594
+ "code": []
1595
+ },
1596
+ "output": {
1597
+ "mayBeLarge": false,
1598
+ "boundBy": []
1599
+ }
1600
+ },
1601
+ {
1602
+ "name": "tasks.delete",
1603
+ "toolName": "tasks_delete",
1604
+ "description": "Delete a task.",
1605
+ "inputSchema": {
1606
+ "type": "object",
1607
+ "properties": {
1608
+ "target": {
1609
+ "type": "string",
1610
+ "description": "The channel the task board belongs to, for example `#proj-sdk`."
1611
+ },
1612
+ "taskNumber": {
1613
+ "type": "integer",
1614
+ "description": "The task number on that channel's board.",
1615
+ "minimum": 1
1616
+ }
1617
+ },
1618
+ "required": [
1619
+ "target",
1620
+ "taskNumber"
1621
+ ]
1622
+ },
1623
+ "sideEffect": "write",
1624
+ "idempotency": {
1625
+ "kind": "none"
1626
+ },
1627
+ "capability": [
1628
+ "tasks"
1629
+ ],
1630
+ "modelOnly": false,
1631
+ "mayInterrupt": false,
1632
+ "consumes": {
1633
+ "model": [],
1634
+ "code": []
1635
+ },
1636
+ "output": {
1637
+ "mayBeLarge": false,
1638
+ "boundBy": []
1639
+ }
1640
+ },
1641
+ {
1642
+ "name": "channels.join",
1643
+ "toolName": "channels_join",
1644
+ "description": "Join a public channel. Joining is explicit; sending never joins.",
1645
+ "inputSchema": {
1646
+ "type": "object",
1647
+ "properties": {
1648
+ "target": {
1649
+ "type": "string",
1650
+ "description": "A regular channel, `#channel-name`. DMs and threads are not accepted."
1651
+ }
1652
+ },
1653
+ "required": [
1654
+ "target"
1655
+ ]
1656
+ },
1657
+ "sideEffect": "write",
1658
+ "idempotency": {
1659
+ "kind": "natural"
1660
+ },
1661
+ "capability": [
1662
+ "channels",
1663
+ "read"
1664
+ ],
1665
+ "modelOnly": false,
1666
+ "mayInterrupt": false,
1667
+ "consumes": {
1668
+ "model": [],
1669
+ "code": []
1670
+ },
1671
+ "output": {
1672
+ "mayBeLarge": false,
1673
+ "boundBy": []
1674
+ }
1675
+ },
1676
+ {
1677
+ "name": "channels.leave",
1678
+ "toolName": "channels_leave",
1679
+ "description": "Leave a channel; ordinary channel messages stop arriving.",
1680
+ "inputSchema": {
1681
+ "type": "object",
1682
+ "properties": {
1683
+ "target": {
1684
+ "type": "string",
1685
+ "description": "A regular channel, `#channel-name`. DMs and threads are not accepted."
1686
+ }
1687
+ },
1688
+ "required": [
1689
+ "target"
1690
+ ]
1691
+ },
1692
+ "sideEffect": "write",
1693
+ "idempotency": {
1694
+ "kind": "natural"
1695
+ },
1696
+ "capability": [
1697
+ "channels",
1698
+ "read"
1699
+ ],
1700
+ "modelOnly": false,
1701
+ "mayInterrupt": false,
1702
+ "consumes": {
1703
+ "model": [],
1704
+ "code": []
1705
+ },
1706
+ "output": {
1707
+ "mayBeLarge": false,
1708
+ "boundBy": []
1709
+ }
1710
+ },
1711
+ {
1712
+ "name": "channels.mute",
1713
+ "toolName": "channels_mute",
1714
+ "description": "Mute a channel's ordinary activity; @mentions, DMs, and followed threads still arrive.",
1715
+ "inputSchema": {
1716
+ "type": "object",
1717
+ "properties": {
1718
+ "target": {
1719
+ "type": "string",
1720
+ "description": "A regular channel, `#channel-name`. DMs and threads are not accepted."
1721
+ }
1722
+ },
1723
+ "required": [
1724
+ "target"
1725
+ ]
1726
+ },
1727
+ "sideEffect": "write",
1728
+ "idempotency": {
1729
+ "kind": "natural"
1730
+ },
1731
+ "capability": [
1732
+ "channels",
1733
+ "read"
1734
+ ],
1735
+ "modelOnly": false,
1736
+ "mayInterrupt": false,
1737
+ "consumes": {
1738
+ "model": [],
1739
+ "code": []
1740
+ },
1741
+ "output": {
1742
+ "mayBeLarge": false,
1743
+ "boundBy": []
1744
+ }
1745
+ },
1746
+ {
1747
+ "name": "channels.unmute",
1748
+ "toolName": "channels_unmute",
1749
+ "description": "Unmute a channel's ordinary activity.",
1750
+ "inputSchema": {
1751
+ "type": "object",
1752
+ "properties": {
1753
+ "target": {
1754
+ "type": "string",
1755
+ "description": "A regular channel, `#channel-name`. DMs and threads are not accepted."
1756
+ }
1757
+ },
1758
+ "required": [
1759
+ "target"
1760
+ ]
1761
+ },
1762
+ "sideEffect": "write",
1763
+ "idempotency": {
1764
+ "kind": "natural"
1765
+ },
1766
+ "capability": [
1767
+ "channels",
1768
+ "read"
1769
+ ],
1770
+ "modelOnly": false,
1771
+ "mayInterrupt": false,
1772
+ "consumes": {
1773
+ "model": [],
1774
+ "code": []
1775
+ },
1776
+ "output": {
1777
+ "mayBeLarge": false,
1778
+ "boundBy": []
1779
+ }
1780
+ },
1781
+ {
1782
+ "name": "channels.members",
1783
+ "toolName": "channels_members",
1784
+ "description": "Who is in a channel, DM, or thread.",
1785
+ "inputSchema": {
1786
+ "type": "object",
1787
+ "properties": {
1788
+ "target": {
1789
+ "type": "string",
1790
+ "description": "A channel, DM, or thread target."
1791
+ }
1792
+ },
1793
+ "required": [
1794
+ "target"
1795
+ ]
1796
+ },
1797
+ "sideEffect": "read",
1798
+ "idempotency": {
1799
+ "kind": "natural"
1800
+ },
1801
+ "capability": [
1802
+ "channels"
1803
+ ],
1804
+ "modelOnly": false,
1805
+ "mayInterrupt": false,
1806
+ "consumes": {
1807
+ "model": [],
1808
+ "code": []
1809
+ },
1810
+ "output": {
1811
+ "mayBeLarge": true,
1812
+ "boundBy": []
1813
+ }
1814
+ },
1815
+ {
1816
+ "name": "channels.info",
1817
+ "toolName": "channels_info",
1818
+ "description": "A regular channel's facts: visibility, whether you joined it, your role and mute state, description, and member counts.",
1819
+ "inputSchema": {
1820
+ "type": "object",
1821
+ "properties": {
1822
+ "target": {
1823
+ "type": "string",
1824
+ "description": "A regular channel, `#channel-name` (the `#` may be omitted). DMs and threads are not accepted."
1825
+ }
1826
+ },
1827
+ "required": [
1828
+ "target"
1829
+ ]
1830
+ },
1831
+ "sideEffect": "read",
1832
+ "idempotency": {
1833
+ "kind": "natural"
1834
+ },
1835
+ "capability": [
1836
+ "channels",
1837
+ "read"
1838
+ ],
1839
+ "modelOnly": false,
1840
+ "mayInterrupt": false,
1841
+ "consumes": {
1842
+ "model": [],
1843
+ "code": []
1844
+ },
1845
+ "output": {
1846
+ "mayBeLarge": false,
1847
+ "boundBy": []
1848
+ }
1849
+ },
1850
+ {
1851
+ "name": "threads.list",
1852
+ "toolName": "threads_list",
1853
+ "description": "The threads you follow.",
1854
+ "inputSchema": {
1855
+ "type": "object",
1856
+ "properties": {}
1857
+ },
1858
+ "sideEffect": "read",
1859
+ "idempotency": {
1860
+ "kind": "natural"
1861
+ },
1862
+ "capability": [
1863
+ "channels"
1864
+ ],
1865
+ "modelOnly": false,
1866
+ "mayInterrupt": false,
1867
+ "consumes": {
1868
+ "model": [],
1869
+ "code": []
1870
+ },
1871
+ "output": {
1872
+ "mayBeLarge": true,
1873
+ "boundBy": []
1874
+ }
1875
+ },
1876
+ {
1877
+ "name": "threads.unfollow",
1878
+ "toolName": "threads_unfollow",
1879
+ "description": "Stop following a thread; a direct @mention follows it again.",
1880
+ "inputSchema": {
1881
+ "type": "object",
1882
+ "properties": {
1883
+ "target": {
1884
+ "type": "string",
1885
+ "description": "The thread, for example `#channel:shortid` or `dm:@peer:shortid`."
1886
+ },
1887
+ "reason": {
1888
+ "type": "string",
1889
+ "description": "Short reason, kept with the unfollow."
1890
+ }
1891
+ },
1892
+ "required": [
1893
+ "target"
1894
+ ]
1895
+ },
1896
+ "sideEffect": "write",
1897
+ "idempotency": {
1898
+ "kind": "natural"
1899
+ },
1900
+ "capability": [
1901
+ "channels"
1902
+ ],
1903
+ "modelOnly": false,
1904
+ "mayInterrupt": false,
1905
+ "consumes": {
1906
+ "model": [],
1907
+ "code": []
1908
+ },
1909
+ "output": {
1910
+ "mayBeLarge": false,
1911
+ "boundBy": []
1912
+ }
1913
+ },
1914
+ {
1915
+ "name": "server.info",
1916
+ "toolName": "server_info",
1917
+ "description": "The server you are on: a summary by default, or one paged section (channels, agents, humans), or the full overview.",
1918
+ "inputSchema": {
1919
+ "type": "object",
1920
+ "properties": {
1921
+ "view": {
1922
+ "type": "string",
1923
+ "description": "summary (default): counts; full: the whole overview; channels / agents / humans: one paged section.",
1924
+ "enum": [
1925
+ "summary",
1926
+ "full",
1927
+ "channels",
1928
+ "agents",
1929
+ "humans"
1930
+ ]
1931
+ },
1932
+ "offset": {
1933
+ "type": "number",
1934
+ "description": "Section paging: rows to skip."
1935
+ },
1936
+ "limit": {
1937
+ "type": "number",
1938
+ "description": "Section paging: rows per page (default 50)."
1939
+ },
1940
+ "joined": {
1941
+ "type": "boolean",
1942
+ "description": "channels view only: only channels you have joined."
1943
+ }
1944
+ }
1945
+ },
1946
+ "sideEffect": "read",
1947
+ "idempotency": {
1948
+ "kind": "natural"
1949
+ },
1950
+ "capability": [
1951
+ "read"
1952
+ ],
1953
+ "modelOnly": false,
1954
+ "mayInterrupt": false,
1955
+ "consumes": {
1956
+ "model": [],
1957
+ "code": []
1958
+ },
1959
+ "output": {
1960
+ "mayBeLarge": true,
1961
+ "boundBy": [
1962
+ "view",
1963
+ "offset",
1964
+ "limit"
1965
+ ]
1966
+ }
1967
+ },
1968
+ {
1969
+ "name": "users.info",
1970
+ "toolName": "users_info",
1971
+ "description": "A human's or agent's visible facts (kind, status, role, description) and which visible channels they are in. Memberships are checked over one page of visible channels; page with offset and limit.",
1972
+ "inputSchema": {
1973
+ "type": "object",
1974
+ "properties": {
1975
+ "name": {
1976
+ "type": "string",
1977
+ "description": "The human or agent, `@handle` (or the bare handle)."
1978
+ },
1979
+ "offset": {
1980
+ "type": "integer",
1981
+ "description": "Membership paging: visible channels to skip before inspecting (default 0).",
1982
+ "minimum": 0
1983
+ },
1984
+ "limit": {
1985
+ "type": "integer",
1986
+ "description": "Membership paging: visible channels to inspect (default 50).",
1987
+ "minimum": 1
1988
+ }
1989
+ },
1990
+ "required": [
1991
+ "name"
1992
+ ]
1993
+ },
1994
+ "sideEffect": "read",
1995
+ "idempotency": {
1996
+ "kind": "natural"
1997
+ },
1998
+ "capability": [
1999
+ "channels",
2000
+ "read"
2001
+ ],
2002
+ "modelOnly": false,
2003
+ "mayInterrupt": false,
2004
+ "consumes": {
2005
+ "model": [],
2006
+ "code": []
2007
+ },
2008
+ "output": {
2009
+ "mayBeLarge": true,
2010
+ "boundBy": [
2011
+ "offset",
2012
+ "limit"
2013
+ ]
2014
+ }
2015
+ },
2016
+ {
2017
+ "name": "profile.show",
2018
+ "toolName": "profile_show",
2019
+ "description": "Show your profile, or someone else's by @handle.",
2020
+ "inputSchema": {
2021
+ "type": "object",
2022
+ "properties": {
2023
+ "target": {
2024
+ "type": "string",
2025
+ "description": "`@handle` of someone else; omit for your own profile."
2026
+ }
2027
+ }
2028
+ },
2029
+ "sideEffect": "read",
2030
+ "idempotency": {
2031
+ "kind": "natural"
2032
+ },
2033
+ "capability": [
2034
+ "read"
2035
+ ],
2036
+ "modelOnly": false,
2037
+ "mayInterrupt": false,
2038
+ "consumes": {
2039
+ "model": [],
2040
+ "code": []
2041
+ },
2042
+ "output": {
2043
+ "mayBeLarge": false,
2044
+ "boundBy": []
2045
+ }
2046
+ },
2047
+ {
2048
+ "name": "profile.update",
2049
+ "toolName": "profile_update",
2050
+ "description": "Update your display name, description, or avatar URL.",
2051
+ "inputSchema": {
2052
+ "type": "object",
2053
+ "properties": {
2054
+ "avatarUrl": {
2055
+ "type": "string",
2056
+ "description": "URL of the new avatar image."
2057
+ },
2058
+ "displayName": {
2059
+ "type": "string",
2060
+ "description": "New display name."
2061
+ },
2062
+ "description": {
2063
+ "type": "string",
2064
+ "description": "New profile description."
2065
+ }
2066
+ }
2067
+ },
2068
+ "sideEffect": "write",
2069
+ "idempotency": {
2070
+ "kind": "natural"
2071
+ },
2072
+ "capability": [
2073
+ "send"
2074
+ ],
2075
+ "modelOnly": false,
2076
+ "mayInterrupt": false,
2077
+ "consumes": {
2078
+ "model": [],
2079
+ "code": []
2080
+ },
2081
+ "output": {
2082
+ "mayBeLarge": false,
2083
+ "boundBy": []
2084
+ }
2085
+ }
2086
+ ]
2087
+ }