@pellux/goodvibes-contracts 0.33.38 → 0.34.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.
@@ -3,7 +3,7 @@
3
3
  "product": {
4
4
  "id": "goodvibes",
5
5
  "surface": "operator",
6
- "version": "0.33.38"
6
+ "version": "0.34.0"
7
7
  },
8
8
  "auth": {
9
9
  "modes": [
@@ -15237,6 +15237,364 @@
15237
15237
  },
15238
15238
  "invokable": true
15239
15239
  },
15240
+ {
15241
+ "id": "calendar.events.create",
15242
+ "title": "Create Calendar Event",
15243
+ "description": "Create an event on the configured CalDAV calendar. Requires explicit confirmation.",
15244
+ "category": "calendar",
15245
+ "source": "builtin",
15246
+ "access": "admin",
15247
+ "transport": [
15248
+ "http",
15249
+ "ws"
15250
+ ],
15251
+ "scopes": [
15252
+ "write:calendar"
15253
+ ],
15254
+ "http": {
15255
+ "method": "POST",
15256
+ "path": "/api/calendar/events"
15257
+ },
15258
+ "inputSchema": {
15259
+ "type": "object",
15260
+ "properties": {
15261
+ "title": {
15262
+ "type": "string"
15263
+ },
15264
+ "start": {
15265
+ "type": "string"
15266
+ },
15267
+ "end": {
15268
+ "type": "string"
15269
+ },
15270
+ "description": {
15271
+ "type": "string"
15272
+ },
15273
+ "attendees": {
15274
+ "type": "array",
15275
+ "items": {
15276
+ "type": "string"
15277
+ }
15278
+ },
15279
+ "location": {
15280
+ "type": "string"
15281
+ },
15282
+ "calendarId": {
15283
+ "type": "string"
15284
+ },
15285
+ "confirm": {
15286
+ "type": "boolean"
15287
+ }
15288
+ },
15289
+ "required": [
15290
+ "title",
15291
+ "start",
15292
+ "end",
15293
+ "confirm"
15294
+ ],
15295
+ "additionalProperties": true
15296
+ },
15297
+ "outputSchema": {
15298
+ "type": "object",
15299
+ "properties": {
15300
+ "eventId": {
15301
+ "type": "string"
15302
+ },
15303
+ "uid": {
15304
+ "type": "string"
15305
+ },
15306
+ "createdAt": {
15307
+ "type": "string"
15308
+ }
15309
+ },
15310
+ "required": [
15311
+ "eventId",
15312
+ "uid",
15313
+ "createdAt"
15314
+ ],
15315
+ "additionalProperties": false
15316
+ },
15317
+ "invokable": true
15318
+ },
15319
+ {
15320
+ "id": "calendar.events.get",
15321
+ "title": "Get Calendar Event",
15322
+ "description": "Return the full event object including attendees, recurrence, and raw iCalendar UID.",
15323
+ "category": "calendar",
15324
+ "source": "builtin",
15325
+ "access": "authenticated",
15326
+ "transport": [
15327
+ "http",
15328
+ "ws"
15329
+ ],
15330
+ "scopes": [
15331
+ "read:calendar"
15332
+ ],
15333
+ "http": {
15334
+ "method": "GET",
15335
+ "path": "/api/calendar/events/{eventId}"
15336
+ },
15337
+ "inputSchema": {
15338
+ "type": "object",
15339
+ "properties": {
15340
+ "eventId": {
15341
+ "type": "string"
15342
+ },
15343
+ "calendarId": {
15344
+ "type": "string"
15345
+ }
15346
+ },
15347
+ "required": [
15348
+ "eventId"
15349
+ ],
15350
+ "additionalProperties": false
15351
+ },
15352
+ "outputSchema": {
15353
+ "type": "object",
15354
+ "properties": {
15355
+ "id": {
15356
+ "type": "string"
15357
+ },
15358
+ "uid": {
15359
+ "type": "string"
15360
+ },
15361
+ "title": {
15362
+ "type": "string"
15363
+ },
15364
+ "start": {
15365
+ "type": "string"
15366
+ },
15367
+ "end": {
15368
+ "type": "string"
15369
+ },
15370
+ "location": {
15371
+ "type": "string"
15372
+ },
15373
+ "description": {
15374
+ "type": "string"
15375
+ },
15376
+ "attendees": {
15377
+ "type": "array",
15378
+ "items": {
15379
+ "type": "string"
15380
+ }
15381
+ },
15382
+ "recurrence": {
15383
+ "type": "string"
15384
+ }
15385
+ },
15386
+ "required": [
15387
+ "id",
15388
+ "title",
15389
+ "start",
15390
+ "end"
15391
+ ],
15392
+ "additionalProperties": false
15393
+ },
15394
+ "invokable": true
15395
+ },
15396
+ {
15397
+ "id": "calendar.events.list",
15398
+ "title": "List Calendar Events",
15399
+ "description": "Return calendar event summaries from the configured CalDAV calendar within an optional time window.",
15400
+ "category": "calendar",
15401
+ "source": "builtin",
15402
+ "access": "authenticated",
15403
+ "transport": [
15404
+ "http",
15405
+ "ws"
15406
+ ],
15407
+ "scopes": [
15408
+ "read:calendar"
15409
+ ],
15410
+ "http": {
15411
+ "method": "GET",
15412
+ "path": "/api/calendar/events"
15413
+ },
15414
+ "inputSchema": {
15415
+ "type": "object",
15416
+ "properties": {
15417
+ "calendarId": {
15418
+ "type": "string"
15419
+ },
15420
+ "from": {
15421
+ "type": "string"
15422
+ },
15423
+ "to": {
15424
+ "type": "string"
15425
+ },
15426
+ "limit": {
15427
+ "type": "number"
15428
+ }
15429
+ },
15430
+ "additionalProperties": false
15431
+ },
15432
+ "outputSchema": {
15433
+ "type": "object",
15434
+ "properties": {
15435
+ "events": {
15436
+ "type": "array",
15437
+ "items": {
15438
+ "type": "object",
15439
+ "properties": {
15440
+ "id": {
15441
+ "type": "string"
15442
+ },
15443
+ "title": {
15444
+ "type": "string"
15445
+ },
15446
+ "start": {
15447
+ "type": "string"
15448
+ },
15449
+ "end": {
15450
+ "type": "string"
15451
+ },
15452
+ "location": {
15453
+ "type": "string"
15454
+ },
15455
+ "description": {
15456
+ "type": "string"
15457
+ },
15458
+ "attendees": {
15459
+ "type": "array",
15460
+ "items": {
15461
+ "type": "string"
15462
+ }
15463
+ }
15464
+ },
15465
+ "required": [
15466
+ "id",
15467
+ "title",
15468
+ "start",
15469
+ "end"
15470
+ ],
15471
+ "additionalProperties": false
15472
+ }
15473
+ }
15474
+ },
15475
+ "required": [
15476
+ "events"
15477
+ ],
15478
+ "additionalProperties": false
15479
+ },
15480
+ "invokable": true
15481
+ },
15482
+ {
15483
+ "id": "calendar.ics.export",
15484
+ "title": "Export iCalendar",
15485
+ "description": "Export events from the configured CalDAV calendar as raw .ics content within an optional time window.",
15486
+ "category": "calendar",
15487
+ "source": "builtin",
15488
+ "access": "authenticated",
15489
+ "transport": [
15490
+ "http",
15491
+ "ws"
15492
+ ],
15493
+ "scopes": [
15494
+ "read:calendar"
15495
+ ],
15496
+ "http": {
15497
+ "method": "GET",
15498
+ "path": "/api/calendar/ics/export"
15499
+ },
15500
+ "inputSchema": {
15501
+ "type": "object",
15502
+ "properties": {
15503
+ "calendarId": {
15504
+ "type": "string"
15505
+ },
15506
+ "from": {
15507
+ "type": "string"
15508
+ },
15509
+ "to": {
15510
+ "type": "string"
15511
+ }
15512
+ },
15513
+ "additionalProperties": false
15514
+ },
15515
+ "outputSchema": {
15516
+ "type": "object",
15517
+ "properties": {
15518
+ "icsContent": {
15519
+ "type": "string"
15520
+ },
15521
+ "eventCount": {
15522
+ "type": "number"
15523
+ }
15524
+ },
15525
+ "required": [
15526
+ "icsContent",
15527
+ "eventCount"
15528
+ ],
15529
+ "additionalProperties": false
15530
+ },
15531
+ "invokable": true
15532
+ },
15533
+ {
15534
+ "id": "calendar.ics.import",
15535
+ "title": "Import iCalendar",
15536
+ "description": "Import raw .ics content into the configured CalDAV calendar. Requires explicit confirmation.",
15537
+ "category": "calendar",
15538
+ "source": "builtin",
15539
+ "access": "admin",
15540
+ "transport": [
15541
+ "http",
15542
+ "ws"
15543
+ ],
15544
+ "scopes": [
15545
+ "write:calendar"
15546
+ ],
15547
+ "http": {
15548
+ "method": "POST",
15549
+ "path": "/api/calendar/ics/import"
15550
+ },
15551
+ "inputSchema": {
15552
+ "type": "object",
15553
+ "properties": {
15554
+ "icsContent": {
15555
+ "type": "string"
15556
+ },
15557
+ "calendarId": {
15558
+ "type": "string"
15559
+ },
15560
+ "confirm": {
15561
+ "type": "boolean"
15562
+ }
15563
+ },
15564
+ "required": [
15565
+ "icsContent",
15566
+ "confirm"
15567
+ ],
15568
+ "additionalProperties": true
15569
+ },
15570
+ "outputSchema": {
15571
+ "type": "object",
15572
+ "properties": {
15573
+ "imported": {
15574
+ "type": "number"
15575
+ },
15576
+ "eventIds": {
15577
+ "type": "array",
15578
+ "items": {
15579
+ "type": "string"
15580
+ }
15581
+ },
15582
+ "errors": {
15583
+ "type": "array",
15584
+ "items": {
15585
+ "type": "string"
15586
+ }
15587
+ }
15588
+ },
15589
+ "required": [
15590
+ "imported",
15591
+ "eventIds",
15592
+ "errors"
15593
+ ],
15594
+ "additionalProperties": false
15595
+ },
15596
+ "invokable": true
15597
+ },
15240
15598
  {
15241
15599
  "id": "channels.accounts.action.default",
15242
15600
  "title": "Run Channel Account Action",
@@ -18331,6 +18689,508 @@
18331
18689
  },
18332
18690
  "invokable": true
18333
18691
  },
18692
+ {
18693
+ "id": "channels.drafts.delete",
18694
+ "title": "Delete Channel Draft",
18695
+ "description": "Remove a channel draft from the daemon-side store.",
18696
+ "category": "channels",
18697
+ "source": "builtin",
18698
+ "access": "admin",
18699
+ "transport": [
18700
+ "http",
18701
+ "ws"
18702
+ ],
18703
+ "scopes": [
18704
+ "write:channels"
18705
+ ],
18706
+ "http": {
18707
+ "method": "DELETE",
18708
+ "path": "/api/channels/drafts/{draftId}"
18709
+ },
18710
+ "inputSchema": {
18711
+ "type": "object",
18712
+ "properties": {
18713
+ "draftId": {
18714
+ "type": "string"
18715
+ }
18716
+ },
18717
+ "required": [
18718
+ "draftId"
18719
+ ],
18720
+ "additionalProperties": false
18721
+ },
18722
+ "outputSchema": {
18723
+ "type": "object",
18724
+ "properties": {
18725
+ "deleted": {
18726
+ "type": "boolean"
18727
+ },
18728
+ "draftId": {
18729
+ "type": "string"
18730
+ }
18731
+ },
18732
+ "required": [
18733
+ "deleted",
18734
+ "draftId"
18735
+ ],
18736
+ "additionalProperties": false
18737
+ },
18738
+ "dangerous": true,
18739
+ "invokable": true
18740
+ },
18741
+ {
18742
+ "id": "channels.drafts.get",
18743
+ "title": "Get Channel Draft",
18744
+ "description": "Return a single daemon-mirrored channel draft by id, or a notFound marker.",
18745
+ "category": "channels",
18746
+ "source": "builtin",
18747
+ "access": "authenticated",
18748
+ "transport": [
18749
+ "http",
18750
+ "ws"
18751
+ ],
18752
+ "scopes": [
18753
+ "read:channels"
18754
+ ],
18755
+ "http": {
18756
+ "method": "GET",
18757
+ "path": "/api/channels/drafts/{draftId}"
18758
+ },
18759
+ "inputSchema": {
18760
+ "type": "object",
18761
+ "properties": {
18762
+ "draftId": {
18763
+ "type": "string"
18764
+ }
18765
+ },
18766
+ "required": [
18767
+ "draftId"
18768
+ ],
18769
+ "additionalProperties": false
18770
+ },
18771
+ "outputSchema": {
18772
+ "type": "object",
18773
+ "properties": {
18774
+ "version": {
18775
+ "type": "number"
18776
+ },
18777
+ "id": {
18778
+ "type": "string"
18779
+ },
18780
+ "createdAt": {
18781
+ "type": "string"
18782
+ },
18783
+ "updatedAt": {
18784
+ "type": "string"
18785
+ },
18786
+ "status": {
18787
+ "type": "string"
18788
+ },
18789
+ "title": {
18790
+ "type": "string"
18791
+ },
18792
+ "message": {
18793
+ "type": "string"
18794
+ },
18795
+ "channel": {
18796
+ "type": "string"
18797
+ },
18798
+ "route": {
18799
+ "type": "string"
18800
+ },
18801
+ "webhook": {
18802
+ "type": "string"
18803
+ },
18804
+ "link": {
18805
+ "type": "string"
18806
+ },
18807
+ "tags": {
18808
+ "type": "array",
18809
+ "items": {
18810
+ "type": "string"
18811
+ }
18812
+ },
18813
+ "sentResponseId": {
18814
+ "type": "string"
18815
+ },
18816
+ "sendError": {
18817
+ "type": "string"
18818
+ },
18819
+ "notFound": {
18820
+ "type": "boolean"
18821
+ }
18822
+ },
18823
+ "additionalProperties": true
18824
+ },
18825
+ "invokable": true
18826
+ },
18827
+ {
18828
+ "id": "channels.drafts.list",
18829
+ "title": "List Channel Drafts",
18830
+ "description": "Return daemon-mirrored channel drafts for cross-device sync. Webhook values are stored redacted.",
18831
+ "category": "channels",
18832
+ "source": "builtin",
18833
+ "access": "authenticated",
18834
+ "transport": [
18835
+ "http",
18836
+ "ws"
18837
+ ],
18838
+ "scopes": [
18839
+ "read:channels"
18840
+ ],
18841
+ "http": {
18842
+ "method": "GET",
18843
+ "path": "/api/channels/drafts"
18844
+ },
18845
+ "inputSchema": {
18846
+ "type": "object",
18847
+ "properties": {
18848
+ "status": {
18849
+ "type": "string"
18850
+ },
18851
+ "limit": {
18852
+ "type": "number"
18853
+ }
18854
+ },
18855
+ "additionalProperties": false
18856
+ },
18857
+ "outputSchema": {
18858
+ "type": "object",
18859
+ "properties": {
18860
+ "drafts": {
18861
+ "type": "array",
18862
+ "items": {
18863
+ "type": "object",
18864
+ "properties": {
18865
+ "version": {
18866
+ "type": "number"
18867
+ },
18868
+ "id": {
18869
+ "type": "string"
18870
+ },
18871
+ "createdAt": {
18872
+ "type": "string"
18873
+ },
18874
+ "updatedAt": {
18875
+ "type": "string"
18876
+ },
18877
+ "status": {
18878
+ "type": "string"
18879
+ },
18880
+ "title": {
18881
+ "type": "string"
18882
+ },
18883
+ "message": {
18884
+ "type": "string"
18885
+ },
18886
+ "channel": {
18887
+ "type": "string"
18888
+ },
18889
+ "route": {
18890
+ "type": "string"
18891
+ },
18892
+ "webhook": {
18893
+ "type": "string"
18894
+ },
18895
+ "link": {
18896
+ "type": "string"
18897
+ },
18898
+ "tags": {
18899
+ "type": "array",
18900
+ "items": {
18901
+ "type": "string"
18902
+ }
18903
+ },
18904
+ "sentResponseId": {
18905
+ "type": "string"
18906
+ },
18907
+ "sendError": {
18908
+ "type": "string"
18909
+ }
18910
+ },
18911
+ "required": [
18912
+ "version",
18913
+ "id",
18914
+ "createdAt",
18915
+ "updatedAt",
18916
+ "status",
18917
+ "message"
18918
+ ],
18919
+ "additionalProperties": false
18920
+ }
18921
+ },
18922
+ "total": {
18923
+ "type": "number"
18924
+ }
18925
+ },
18926
+ "required": [
18927
+ "drafts",
18928
+ "total"
18929
+ ],
18930
+ "additionalProperties": false
18931
+ },
18932
+ "invokable": true
18933
+ },
18934
+ {
18935
+ "id": "channels.drafts.save",
18936
+ "title": "Save Channel Draft",
18937
+ "description": "Mirror a channel draft to the daemon-side store. Webhook values must be redacted before transmission; raw webhook tokens are rejected. Requires explicit confirmation.",
18938
+ "category": "channels",
18939
+ "source": "builtin",
18940
+ "access": "admin",
18941
+ "transport": [
18942
+ "http",
18943
+ "ws"
18944
+ ],
18945
+ "scopes": [
18946
+ "write:channels"
18947
+ ],
18948
+ "http": {
18949
+ "method": "POST",
18950
+ "path": "/api/channels/drafts"
18951
+ },
18952
+ "inputSchema": {
18953
+ "type": "object",
18954
+ "properties": {
18955
+ "version": {
18956
+ "type": "number"
18957
+ },
18958
+ "id": {
18959
+ "type": "string"
18960
+ },
18961
+ "createdAt": {
18962
+ "type": "string"
18963
+ },
18964
+ "updatedAt": {
18965
+ "type": "string"
18966
+ },
18967
+ "status": {
18968
+ "type": "string"
18969
+ },
18970
+ "title": {
18971
+ "type": "string"
18972
+ },
18973
+ "message": {
18974
+ "type": "string"
18975
+ },
18976
+ "channel": {
18977
+ "type": "string"
18978
+ },
18979
+ "route": {
18980
+ "type": "string"
18981
+ },
18982
+ "webhook": {
18983
+ "type": "string"
18984
+ },
18985
+ "link": {
18986
+ "type": "string"
18987
+ },
18988
+ "tags": {
18989
+ "type": "array",
18990
+ "items": {
18991
+ "type": "string"
18992
+ }
18993
+ },
18994
+ "sentResponseId": {
18995
+ "type": "string"
18996
+ },
18997
+ "sendError": {
18998
+ "type": "string"
18999
+ }
19000
+ },
19001
+ "required": [
19002
+ "version",
19003
+ "id",
19004
+ "createdAt",
19005
+ "updatedAt",
19006
+ "status",
19007
+ "message"
19008
+ ],
19009
+ "additionalProperties": true
19010
+ },
19011
+ "outputSchema": {
19012
+ "type": "object",
19013
+ "properties": {
19014
+ "draft": {
19015
+ "type": "object",
19016
+ "properties": {
19017
+ "version": {
19018
+ "type": "number"
19019
+ },
19020
+ "id": {
19021
+ "type": "string"
19022
+ },
19023
+ "createdAt": {
19024
+ "type": "string"
19025
+ },
19026
+ "updatedAt": {
19027
+ "type": "string"
19028
+ },
19029
+ "status": {
19030
+ "type": "string"
19031
+ },
19032
+ "title": {
19033
+ "type": "string"
19034
+ },
19035
+ "message": {
19036
+ "type": "string"
19037
+ },
19038
+ "channel": {
19039
+ "type": "string"
19040
+ },
19041
+ "route": {
19042
+ "type": "string"
19043
+ },
19044
+ "webhook": {
19045
+ "type": "string"
19046
+ },
19047
+ "link": {
19048
+ "type": "string"
19049
+ },
19050
+ "tags": {
19051
+ "type": "array",
19052
+ "items": {
19053
+ "type": "string"
19054
+ }
19055
+ },
19056
+ "sentResponseId": {
19057
+ "type": "string"
19058
+ },
19059
+ "sendError": {
19060
+ "type": "string"
19061
+ }
19062
+ },
19063
+ "required": [
19064
+ "version",
19065
+ "id",
19066
+ "createdAt",
19067
+ "updatedAt",
19068
+ "status",
19069
+ "message"
19070
+ ],
19071
+ "additionalProperties": false
19072
+ },
19073
+ "created": {
19074
+ "type": "boolean"
19075
+ }
19076
+ },
19077
+ "required": [
19078
+ "draft",
19079
+ "created"
19080
+ ],
19081
+ "additionalProperties": false
19082
+ },
19083
+ "invokable": true
19084
+ },
19085
+ {
19086
+ "id": "channels.inbox.list",
19087
+ "title": "List Channel Inbox",
19088
+ "description": "Return per-provider inbound message feeds (Slack DMs, Discord messages, email threads) fetched live from provider APIs. Read-only; no provider write.",
19089
+ "category": "channels",
19090
+ "source": "builtin",
19091
+ "access": "authenticated",
19092
+ "transport": [
19093
+ "http",
19094
+ "ws"
19095
+ ],
19096
+ "scopes": [
19097
+ "read:channels"
19098
+ ],
19099
+ "http": {
19100
+ "method": "GET",
19101
+ "path": "/api/channels/inbox"
19102
+ },
19103
+ "inputSchema": {
19104
+ "type": "object",
19105
+ "properties": {
19106
+ "provider": {
19107
+ "type": "string"
19108
+ },
19109
+ "limit": {
19110
+ "type": "number"
19111
+ },
19112
+ "since": {
19113
+ "type": "number"
19114
+ }
19115
+ },
19116
+ "additionalProperties": false
19117
+ },
19118
+ "outputSchema": {
19119
+ "type": "object",
19120
+ "properties": {
19121
+ "items": {
19122
+ "type": "array",
19123
+ "items": {
19124
+ "type": "object",
19125
+ "properties": {
19126
+ "id": {
19127
+ "type": "string"
19128
+ },
19129
+ "provider": {
19130
+ "type": "string"
19131
+ },
19132
+ "kind": {
19133
+ "type": "string"
19134
+ },
19135
+ "from": {
19136
+ "type": "string"
19137
+ },
19138
+ "fromAddress": {
19139
+ "type": "string"
19140
+ },
19141
+ "subject": {
19142
+ "type": "string"
19143
+ },
19144
+ "bodyPreview": {
19145
+ "type": "string"
19146
+ },
19147
+ "receivedAt": {
19148
+ "type": "number"
19149
+ },
19150
+ "unread": {
19151
+ "type": "boolean"
19152
+ },
19153
+ "routeId": {
19154
+ "type": "string"
19155
+ },
19156
+ "threadId": {
19157
+ "type": "string"
19158
+ },
19159
+ "attachmentCount": {
19160
+ "type": "number"
19161
+ }
19162
+ },
19163
+ "required": [
19164
+ "id",
19165
+ "provider",
19166
+ "kind",
19167
+ "from",
19168
+ "bodyPreview",
19169
+ "receivedAt",
19170
+ "unread"
19171
+ ],
19172
+ "additionalProperties": false
19173
+ }
19174
+ },
19175
+ "total": {
19176
+ "type": "number"
19177
+ },
19178
+ "truncated": {
19179
+ "type": "boolean"
19180
+ },
19181
+ "cursor": {
19182
+ "type": "string"
19183
+ }
19184
+ },
19185
+ "required": [
19186
+ "items",
19187
+ "total",
19188
+ "truncated"
19189
+ ],
19190
+ "additionalProperties": false
19191
+ },
19192
+ "invokable": true
19193
+ },
18334
19194
  {
18335
19195
  "id": "channels.lifecycle.get",
18336
19196
  "title": "Get Channel Lifecycle State",
@@ -19273,6 +20133,222 @@
19273
20133
  },
19274
20134
  "invokable": true
19275
20135
  },
20136
+ {
20137
+ "id": "channels.routing.assign",
20138
+ "title": "Assign Channel Routing Rule",
20139
+ "description": "Create or update a channel-to-profile routing rule in the daemon-persisted routing table. Requires explicit confirmation.",
20140
+ "category": "channels",
20141
+ "source": "builtin",
20142
+ "access": "admin",
20143
+ "transport": [
20144
+ "http",
20145
+ "ws"
20146
+ ],
20147
+ "scopes": [
20148
+ "write:channels"
20149
+ ],
20150
+ "http": {
20151
+ "method": "POST",
20152
+ "path": "/api/channels/routing"
20153
+ },
20154
+ "inputSchema": {
20155
+ "type": "object",
20156
+ "properties": {
20157
+ "channelId": {
20158
+ "type": "string"
20159
+ },
20160
+ "surfaceKind": {
20161
+ "type": "string"
20162
+ },
20163
+ "routeId": {
20164
+ "type": "string"
20165
+ },
20166
+ "profileId": {
20167
+ "type": "string"
20168
+ },
20169
+ "label": {
20170
+ "type": "string"
20171
+ }
20172
+ },
20173
+ "required": [
20174
+ "surfaceKind",
20175
+ "profileId"
20176
+ ],
20177
+ "additionalProperties": true
20178
+ },
20179
+ "outputSchema": {
20180
+ "type": "object",
20181
+ "properties": {
20182
+ "assignmentId": {
20183
+ "type": "string"
20184
+ },
20185
+ "channelId": {
20186
+ "type": "string"
20187
+ },
20188
+ "surfaceKind": {
20189
+ "type": "string"
20190
+ },
20191
+ "routeId": {
20192
+ "type": "string"
20193
+ },
20194
+ "profileId": {
20195
+ "type": "string"
20196
+ },
20197
+ "label": {
20198
+ "type": "string"
20199
+ },
20200
+ "createdAt": {
20201
+ "type": "string"
20202
+ },
20203
+ "updatedAt": {
20204
+ "type": "string"
20205
+ }
20206
+ },
20207
+ "required": [
20208
+ "assignmentId",
20209
+ "surfaceKind",
20210
+ "profileId",
20211
+ "createdAt",
20212
+ "updatedAt"
20213
+ ],
20214
+ "additionalProperties": false
20215
+ },
20216
+ "invokable": true
20217
+ },
20218
+ {
20219
+ "id": "channels.routing.delete",
20220
+ "title": "Delete Channel Routing Rule",
20221
+ "description": "Remove a channel-to-profile routing rule from the daemon-persisted routing table.",
20222
+ "category": "channels",
20223
+ "source": "builtin",
20224
+ "access": "admin",
20225
+ "transport": [
20226
+ "http",
20227
+ "ws"
20228
+ ],
20229
+ "scopes": [
20230
+ "write:channels"
20231
+ ],
20232
+ "http": {
20233
+ "method": "DELETE",
20234
+ "path": "/api/channels/routing/{assignmentId}"
20235
+ },
20236
+ "inputSchema": {
20237
+ "type": "object",
20238
+ "properties": {
20239
+ "assignmentId": {
20240
+ "type": "string"
20241
+ }
20242
+ },
20243
+ "required": [
20244
+ "assignmentId"
20245
+ ],
20246
+ "additionalProperties": false
20247
+ },
20248
+ "outputSchema": {
20249
+ "type": "object",
20250
+ "properties": {
20251
+ "deleted": {
20252
+ "type": "boolean"
20253
+ },
20254
+ "assignmentId": {
20255
+ "type": "string"
20256
+ }
20257
+ },
20258
+ "required": [
20259
+ "deleted",
20260
+ "assignmentId"
20261
+ ],
20262
+ "additionalProperties": false
20263
+ },
20264
+ "dangerous": true,
20265
+ "invokable": true
20266
+ },
20267
+ {
20268
+ "id": "channels.routing.list",
20269
+ "title": "List Channel Routing Rules",
20270
+ "description": "Return the daemon-persisted channel-to-profile routing table.",
20271
+ "category": "channels",
20272
+ "source": "builtin",
20273
+ "access": "authenticated",
20274
+ "transport": [
20275
+ "http",
20276
+ "ws"
20277
+ ],
20278
+ "scopes": [
20279
+ "read:channels"
20280
+ ],
20281
+ "http": {
20282
+ "method": "GET",
20283
+ "path": "/api/channels/routing"
20284
+ },
20285
+ "inputSchema": {
20286
+ "type": "object",
20287
+ "properties": {
20288
+ "profileId": {
20289
+ "type": "string"
20290
+ },
20291
+ "surfaceKind": {
20292
+ "type": "string"
20293
+ },
20294
+ "limit": {
20295
+ "type": "number"
20296
+ }
20297
+ },
20298
+ "additionalProperties": false
20299
+ },
20300
+ "outputSchema": {
20301
+ "type": "object",
20302
+ "properties": {
20303
+ "routes": {
20304
+ "type": "array",
20305
+ "items": {
20306
+ "type": "object",
20307
+ "properties": {
20308
+ "id": {
20309
+ "type": "string"
20310
+ },
20311
+ "createdAt": {
20312
+ "type": "string"
20313
+ },
20314
+ "updatedAt": {
20315
+ "type": "string"
20316
+ },
20317
+ "surfaceKind": {
20318
+ "type": "string"
20319
+ },
20320
+ "routeId": {
20321
+ "type": "string"
20322
+ },
20323
+ "profileId": {
20324
+ "type": "string"
20325
+ },
20326
+ "label": {
20327
+ "type": "string"
20328
+ }
20329
+ },
20330
+ "required": [
20331
+ "id",
20332
+ "createdAt",
20333
+ "updatedAt",
20334
+ "surfaceKind",
20335
+ "profileId"
20336
+ ],
20337
+ "additionalProperties": false
20338
+ }
20339
+ },
20340
+ "total": {
20341
+ "type": "number"
20342
+ }
20343
+ },
20344
+ "required": [
20345
+ "routes",
20346
+ "total"
20347
+ ],
20348
+ "additionalProperties": false
20349
+ },
20350
+ "invokable": true
20351
+ },
19276
20352
  {
19277
20353
  "id": "channels.setup.get",
19278
20354
  "title": "Get Channel Setup Schema",
@@ -24247,6 +25323,309 @@
24247
25323
  },
24248
25324
  "invokable": true
24249
25325
  },
25326
+ {
25327
+ "id": "email.draft.create",
25328
+ "title": "Create Email Draft",
25329
+ "description": "Append a draft message to the configured IMAP Drafts folder. Distinct from the local channel draft store. Requires explicit confirmation.",
25330
+ "category": "email",
25331
+ "source": "builtin",
25332
+ "access": "admin",
25333
+ "transport": [
25334
+ "http",
25335
+ "ws"
25336
+ ],
25337
+ "scopes": [
25338
+ "write:email"
25339
+ ],
25340
+ "http": {
25341
+ "method": "POST",
25342
+ "path": "/api/email/drafts"
25343
+ },
25344
+ "inputSchema": {
25345
+ "type": "object",
25346
+ "properties": {
25347
+ "to": {
25348
+ "type": "string"
25349
+ },
25350
+ "subject": {
25351
+ "type": "string"
25352
+ },
25353
+ "body": {
25354
+ "type": "string"
25355
+ },
25356
+ "inReplyTo": {
25357
+ "type": "string"
25358
+ },
25359
+ "references": {
25360
+ "type": "string"
25361
+ }
25362
+ },
25363
+ "required": [
25364
+ "to",
25365
+ "subject",
25366
+ "body"
25367
+ ],
25368
+ "additionalProperties": true
25369
+ },
25370
+ "outputSchema": {
25371
+ "type": "object",
25372
+ "properties": {
25373
+ "uid": {
25374
+ "type": "number"
25375
+ },
25376
+ "draftId": {
25377
+ "type": "string"
25378
+ }
25379
+ },
25380
+ "required": [
25381
+ "uid",
25382
+ "draftId"
25383
+ ],
25384
+ "additionalProperties": false
25385
+ },
25386
+ "invokable": true
25387
+ },
25388
+ {
25389
+ "id": "email.inbox.list",
25390
+ "title": "List Email Inbox",
25391
+ "description": "Return inbox message summaries fetched live from the configured IMAP account. Read-only (EXAMINE / BODY.PEEK); never marks messages read.",
25392
+ "category": "email",
25393
+ "source": "builtin",
25394
+ "access": "authenticated",
25395
+ "transport": [
25396
+ "http",
25397
+ "ws"
25398
+ ],
25399
+ "scopes": [
25400
+ "read:email"
25401
+ ],
25402
+ "http": {
25403
+ "method": "GET",
25404
+ "path": "/api/email/inbox"
25405
+ },
25406
+ "inputSchema": {
25407
+ "type": "object",
25408
+ "properties": {
25409
+ "limit": {
25410
+ "type": "number"
25411
+ },
25412
+ "since": {
25413
+ "type": "string"
25414
+ },
25415
+ "unreadOnly": {
25416
+ "type": "boolean"
25417
+ }
25418
+ },
25419
+ "additionalProperties": false
25420
+ },
25421
+ "outputSchema": {
25422
+ "type": "object",
25423
+ "properties": {
25424
+ "messages": {
25425
+ "type": "array",
25426
+ "items": {
25427
+ "type": "object",
25428
+ "properties": {
25429
+ "uid": {
25430
+ "type": "number"
25431
+ },
25432
+ "from": {
25433
+ "type": "string"
25434
+ },
25435
+ "subject": {
25436
+ "type": "string"
25437
+ },
25438
+ "date": {
25439
+ "type": "string"
25440
+ },
25441
+ "unread": {
25442
+ "type": "boolean"
25443
+ },
25444
+ "bodyPreview": {
25445
+ "type": "string"
25446
+ },
25447
+ "messageId": {
25448
+ "type": "string"
25449
+ }
25450
+ },
25451
+ "required": [
25452
+ "uid",
25453
+ "from",
25454
+ "subject",
25455
+ "date",
25456
+ "unread",
25457
+ "bodyPreview",
25458
+ "messageId"
25459
+ ],
25460
+ "additionalProperties": false
25461
+ }
25462
+ },
25463
+ "total": {
25464
+ "type": "number"
25465
+ }
25466
+ },
25467
+ "required": [
25468
+ "messages",
25469
+ "total"
25470
+ ],
25471
+ "additionalProperties": false
25472
+ },
25473
+ "invokable": true
25474
+ },
25475
+ {
25476
+ "id": "email.inbox.read",
25477
+ "title": "Read Email Message",
25478
+ "description": "Return the full body and attachment metadata for a single inbox message by IMAP UID. Read-only (BODY.PEEK; does not mark as read).",
25479
+ "category": "email",
25480
+ "source": "builtin",
25481
+ "access": "authenticated",
25482
+ "transport": [
25483
+ "http",
25484
+ "ws"
25485
+ ],
25486
+ "scopes": [
25487
+ "read:email"
25488
+ ],
25489
+ "http": {
25490
+ "method": "GET",
25491
+ "path": "/api/email/inbox/{uid}"
25492
+ },
25493
+ "inputSchema": {
25494
+ "type": "object",
25495
+ "properties": {
25496
+ "uid": {
25497
+ "type": "number"
25498
+ }
25499
+ },
25500
+ "required": [
25501
+ "uid"
25502
+ ],
25503
+ "additionalProperties": false
25504
+ },
25505
+ "outputSchema": {
25506
+ "type": "object",
25507
+ "properties": {
25508
+ "uid": {
25509
+ "type": "number"
25510
+ },
25511
+ "from": {
25512
+ "type": "string"
25513
+ },
25514
+ "subject": {
25515
+ "type": "string"
25516
+ },
25517
+ "date": {
25518
+ "type": "string"
25519
+ },
25520
+ "messageId": {
25521
+ "type": "string"
25522
+ },
25523
+ "bodyText": {
25524
+ "type": "string"
25525
+ },
25526
+ "bodyHtml": {
25527
+ "type": "string"
25528
+ },
25529
+ "attachments": {
25530
+ "type": "array",
25531
+ "items": {
25532
+ "type": "object",
25533
+ "properties": {
25534
+ "filename": {
25535
+ "type": "string"
25536
+ },
25537
+ "contentType": {
25538
+ "type": "string"
25539
+ },
25540
+ "sizeBytes": {
25541
+ "type": "number"
25542
+ }
25543
+ },
25544
+ "required": [
25545
+ "filename",
25546
+ "contentType",
25547
+ "sizeBytes"
25548
+ ],
25549
+ "additionalProperties": false
25550
+ }
25551
+ }
25552
+ },
25553
+ "required": [
25554
+ "uid",
25555
+ "from",
25556
+ "subject",
25557
+ "date",
25558
+ "messageId",
25559
+ "bodyText"
25560
+ ],
25561
+ "additionalProperties": false
25562
+ },
25563
+ "invokable": true
25564
+ },
25565
+ {
25566
+ "id": "email.send",
25567
+ "title": "Send Email",
25568
+ "description": "Send a composed email via the configured SMTP account. Irreversible external send; requires confirm: true and explicit user review of recipients and body.",
25569
+ "category": "email",
25570
+ "source": "builtin",
25571
+ "access": "admin",
25572
+ "transport": [
25573
+ "http",
25574
+ "ws"
25575
+ ],
25576
+ "scopes": [
25577
+ "write:email"
25578
+ ],
25579
+ "http": {
25580
+ "method": "POST",
25581
+ "path": "/api/email/send"
25582
+ },
25583
+ "inputSchema": {
25584
+ "type": "object",
25585
+ "properties": {
25586
+ "to": {
25587
+ "type": "string"
25588
+ },
25589
+ "subject": {
25590
+ "type": "string"
25591
+ },
25592
+ "body": {
25593
+ "type": "string"
25594
+ },
25595
+ "inReplyTo": {
25596
+ "type": "string"
25597
+ },
25598
+ "confirm": {
25599
+ "type": "boolean"
25600
+ }
25601
+ },
25602
+ "required": [
25603
+ "to",
25604
+ "subject",
25605
+ "body",
25606
+ "confirm"
25607
+ ],
25608
+ "additionalProperties": true
25609
+ },
25610
+ "outputSchema": {
25611
+ "type": "object",
25612
+ "properties": {
25613
+ "messageId": {
25614
+ "type": "string"
25615
+ },
25616
+ "sentAt": {
25617
+ "type": "string"
25618
+ }
25619
+ },
25620
+ "required": [
25621
+ "messageId",
25622
+ "sentAt"
25623
+ ],
25624
+ "additionalProperties": false
25625
+ },
25626
+ "dangerous": true,
25627
+ "invokable": true
25628
+ },
24250
25629
  {
24251
25630
  "id": "health.snapshot",
24252
25631
  "title": "Health Snapshot",
@@ -75109,10 +76488,10 @@
75109
76488
  }
75110
76489
  ],
75111
76490
  "schemaCoverage": {
75112
- "methods": 280,
75113
- "typedInputs": 280,
76491
+ "methods": 297,
76492
+ "typedInputs": 297,
75114
76493
  "genericInputs": 0,
75115
- "typedOutputs": 280,
76494
+ "typedOutputs": 297,
75116
76495
  "genericOutputs": 0
75117
76496
  },
75118
76497
  "eventCoverage": {