@tickernelz/paperclip-pro-mcp-server 2026.1002.8 → 2026.1004.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.
@@ -1235,6 +1235,48 @@
1235
1235
  }
1236
1236
  ]
1237
1237
  },
1238
+ {
1239
+ "name": "paperclipCancelChatEndpointApproval",
1240
+ "operationId": "POST /api/chat-endpoints/{endpointId}/openwa/approvals/{requestId}/cancel",
1241
+ "method": "POST",
1242
+ "path": "/chat-endpoints/{endpointId}/openwa/approvals/{requestId}/cancel",
1243
+ "description": "Cancel a pending OpenWA owner approval request. Only a board user linked as a current owner of the endpoint may cancel. Only a pending request can be cancelled: it becomes cancelled, its reminders stop and its approval card is withdrawn. No grant is written and the agent is not woken; later wakes no longer list it as pending. A request that is no longer pending returns 409 already_resolved with requestStatus. Records openwa.approval_cancelled.",
1244
+ "toolset": "extended",
1245
+ "authority": "board",
1246
+ "authoritySource": "registry",
1247
+ "tags": [
1248
+ "chat-channels"
1249
+ ],
1250
+ "annotations": {
1251
+ "readOnlyHint": false,
1252
+ "destructiveHint": true,
1253
+ "idempotentHint": false
1254
+ },
1255
+ "guards": [
1256
+ "assertEndpointAccess"
1257
+ ],
1258
+ "permissions": [],
1259
+ "boardGuard": null,
1260
+ "authorityCapability": null,
1261
+ "parameters": [
1262
+ {
1263
+ "name": "endpointId",
1264
+ "in": "path",
1265
+ "required": true,
1266
+ "schema": {
1267
+ "type": "string"
1268
+ }
1269
+ },
1270
+ {
1271
+ "name": "requestId",
1272
+ "in": "path",
1273
+ "required": true,
1274
+ "schema": {
1275
+ "type": "string"
1276
+ }
1277
+ }
1278
+ ]
1279
+ },
1238
1280
  {
1239
1281
  "name": "paperclipCancelDecision",
1240
1282
  "operationId": "POST /api/decisions/{id}/cancel",
@@ -1375,7 +1417,7 @@
1375
1417
  "getActorInfo"
1376
1418
  ],
1377
1419
  "permissions": [],
1378
- "boardGuard": "assertBoard@issues.ts:18025",
1420
+ "boardGuard": "assertBoard@issues.ts:18156",
1379
1421
  "authorityCapability": null,
1380
1422
  "parameters": [
1381
1423
  {
@@ -4069,7 +4111,8 @@
4069
4111
  "discord",
4070
4112
  "microsoft-teams",
4071
4113
  "telegram",
4072
- "imessage-photon"
4114
+ "imessage-photon",
4115
+ "openwa"
4073
4116
  ]
4074
4117
  }
4075
4118
  },
@@ -4080,6 +4123,120 @@
4080
4123
  }
4081
4124
  }
4082
4125
  },
4126
+ {
4127
+ "name": "paperclipCreateChatEndpointOpenwaOwner",
4128
+ "operationId": "POST /api/chat-endpoints/{endpointId}/openwa/owners",
4129
+ "method": "POST",
4130
+ "path": "/chat-endpoints/{endpointId}/openwa/owners",
4131
+ "description": "Add an OpenWA owner. Requires connection-management access. Registers an E.164 WhatsApp number as an owner and, unless that number is already linked, returns a short-lived identity-link confirmation URL. The owner gains authority only after a Paperclip user with active, non-viewer membership confirms the link. Returns 201 when a new owner row is created and 200 when it already existed. Records openwa.owner_added.",
4132
+ "toolset": "extended",
4133
+ "authority": "board",
4134
+ "authoritySource": "registry",
4135
+ "tags": [
4136
+ "chat-channels"
4137
+ ],
4138
+ "annotations": {
4139
+ "readOnlyHint": false,
4140
+ "destructiveHint": false,
4141
+ "idempotentHint": false
4142
+ },
4143
+ "guards": [
4144
+ "assertEndpointManagementAccess"
4145
+ ],
4146
+ "permissions": [],
4147
+ "boardGuard": null,
4148
+ "authorityCapability": null,
4149
+ "parameters": [
4150
+ {
4151
+ "name": "endpointId",
4152
+ "in": "path",
4153
+ "required": true,
4154
+ "schema": {
4155
+ "type": "string"
4156
+ }
4157
+ }
4158
+ ],
4159
+ "body": {
4160
+ "required": true,
4161
+ "documented": true,
4162
+ "mode": "merge",
4163
+ "schema": {
4164
+ "type": "object",
4165
+ "properties": {
4166
+ "e164": {
4167
+ "type": "string"
4168
+ },
4169
+ "expiresInSeconds": {
4170
+ "type": "integer"
4171
+ }
4172
+ },
4173
+ "required": [
4174
+ "e164"
4175
+ ]
4176
+ }
4177
+ }
4178
+ },
4179
+ {
4180
+ "name": "paperclipCreateChatEndpointOpenwaRule",
4181
+ "operationId": "POST /api/chat-endpoints/{endpointId}/openwa/sender-rules",
4182
+ "method": "POST",
4183
+ "path": "/chat-endpoints/{endpointId}/openwa/sender-rules",
4184
+ "description": "Add an OpenWA sender rule. Requires connection-management access. Adds an E.164 number to the allowlist or denylist; re-adding an existing entry updates its label. Owners are never blocked by the denylist. Records openwa.sender_rule_changed with a masked number.",
4185
+ "toolset": "extended",
4186
+ "authority": "board",
4187
+ "authoritySource": "registry",
4188
+ "tags": [
4189
+ "chat-channels"
4190
+ ],
4191
+ "annotations": {
4192
+ "readOnlyHint": false,
4193
+ "destructiveHint": false,
4194
+ "idempotentHint": false
4195
+ },
4196
+ "guards": [
4197
+ "assertEndpointManagementAccess"
4198
+ ],
4199
+ "permissions": [],
4200
+ "boardGuard": null,
4201
+ "authorityCapability": null,
4202
+ "parameters": [
4203
+ {
4204
+ "name": "endpointId",
4205
+ "in": "path",
4206
+ "required": true,
4207
+ "schema": {
4208
+ "type": "string"
4209
+ }
4210
+ }
4211
+ ],
4212
+ "body": {
4213
+ "required": true,
4214
+ "documented": true,
4215
+ "mode": "merge",
4216
+ "schema": {
4217
+ "type": "object",
4218
+ "properties": {
4219
+ "e164": {
4220
+ "type": "string"
4221
+ },
4222
+ "label": {
4223
+ "type": "string"
4224
+ },
4225
+ "list": {
4226
+ "type": "string",
4227
+ "enum": [
4228
+ "allow",
4229
+ "deny"
4230
+ ]
4231
+ }
4232
+ },
4233
+ "required": [
4234
+ "e164",
4235
+ "list"
4236
+ ]
4237
+ }
4238
+ }
4239
+ },
4083
4240
  {
4084
4241
  "name": "paperclipCreateChatEndpointPublication",
4085
4242
  "operationId": "POST /api/chat-endpoints/{endpointId}/conversations/{conversationId}/publications",
@@ -11899,7 +12056,7 @@
11899
12056
  "assertInstanceAdmin"
11900
12057
  ],
11901
12058
  "permissions": [],
11902
- "boardGuard": "assertInstanceAdmin@adapters.ts:523",
12059
+ "boardGuard": "assertInstanceAdmin@adapters.ts:527",
11903
12060
  "authorityCapability": null,
11904
12061
  "parameters": [
11905
12062
  {
@@ -12155,6 +12312,90 @@
12155
12312
  }
12156
12313
  ]
12157
12314
  },
12315
+ {
12316
+ "name": "paperclipDeleteChatEndpointOpenwaOwner",
12317
+ "operationId": "DELETE /api/chat-endpoints/{endpointId}/openwa/owners/{ownerId}",
12318
+ "method": "DELETE",
12319
+ "path": "/chat-endpoints/{endpointId}/openwa/owners/{ownerId}",
12320
+ "description": "Remove an OpenWA owner. Requires connection-management access. Removes the owner role; the identity link itself is kept. Records openwa.owner_removed.",
12321
+ "toolset": "extended",
12322
+ "authority": "board",
12323
+ "authoritySource": "registry",
12324
+ "tags": [
12325
+ "chat-channels"
12326
+ ],
12327
+ "annotations": {
12328
+ "readOnlyHint": false,
12329
+ "destructiveHint": true,
12330
+ "idempotentHint": true
12331
+ },
12332
+ "guards": [
12333
+ "assertEndpointManagementAccess"
12334
+ ],
12335
+ "permissions": [],
12336
+ "boardGuard": null,
12337
+ "authorityCapability": null,
12338
+ "parameters": [
12339
+ {
12340
+ "name": "endpointId",
12341
+ "in": "path",
12342
+ "required": true,
12343
+ "schema": {
12344
+ "type": "string"
12345
+ }
12346
+ },
12347
+ {
12348
+ "name": "ownerId",
12349
+ "in": "path",
12350
+ "required": true,
12351
+ "schema": {
12352
+ "type": "string"
12353
+ }
12354
+ }
12355
+ ]
12356
+ },
12357
+ {
12358
+ "name": "paperclipDeleteChatEndpointOpenwaRule",
12359
+ "operationId": "DELETE /api/chat-endpoints/{endpointId}/openwa/sender-rules/{ruleId}",
12360
+ "method": "DELETE",
12361
+ "path": "/chat-endpoints/{endpointId}/openwa/sender-rules/{ruleId}",
12362
+ "description": "Remove an OpenWA sender rule. Requires connection-management access. Records openwa.sender_rule_changed.",
12363
+ "toolset": "extended",
12364
+ "authority": "board",
12365
+ "authoritySource": "registry",
12366
+ "tags": [
12367
+ "chat-channels"
12368
+ ],
12369
+ "annotations": {
12370
+ "readOnlyHint": false,
12371
+ "destructiveHint": true,
12372
+ "idempotentHint": true
12373
+ },
12374
+ "guards": [
12375
+ "assertEndpointManagementAccess"
12376
+ ],
12377
+ "permissions": [],
12378
+ "boardGuard": null,
12379
+ "authorityCapability": null,
12380
+ "parameters": [
12381
+ {
12382
+ "name": "endpointId",
12383
+ "in": "path",
12384
+ "required": true,
12385
+ "schema": {
12386
+ "type": "string"
12387
+ }
12388
+ },
12389
+ {
12390
+ "name": "ruleId",
12391
+ "in": "path",
12392
+ "required": true,
12393
+ "schema": {
12394
+ "type": "string"
12395
+ }
12396
+ }
12397
+ ]
12398
+ },
12158
12399
  {
12159
12400
  "name": "paperclipDeleteChatEndpointPrincipalLink",
12160
12401
  "operationId": "DELETE /api/chat-endpoints/{endpointId}/principals/{principalId}/link",
@@ -12786,7 +13027,7 @@
12786
13027
  "getActorInfo"
12787
13028
  ],
12788
13029
  "permissions": [],
12789
- "boardGuard": "assertBoard@issues.ts:17010",
13030
+ "boardGuard": "assertBoard@issues.ts:17102",
12790
13031
  "authorityCapability": null,
12791
13032
  "parameters": [
12792
13033
  {
@@ -16217,6 +16458,110 @@
16217
16458
  }
16218
16459
  ]
16219
16460
  },
16461
+ {
16462
+ "name": "paperclipGetChatEndpointAudit",
16463
+ "operationId": "GET /api/chat-endpoints/{endpointId}/audit",
16464
+ "method": "GET",
16465
+ "path": "/chat-endpoints/{endpointId}/audit",
16466
+ "description": "List the OpenWA endpoint audit trail. Returns the endpoint's audit entries newest first with cursor paging (limit 1–100, default 25; follow nextCursor). Filters: kind (comma-separated or repeated), chatKey, actorKind, actorRef, from and to (ISO timestamps, inclusive). Endpoint owners and company owners receive content (message text, owner text, redacted tool arguments); other board users with endpoint access receive metadata only and `access` is `metadata`. Content is purged after the endpoint's retention period; purged entries keep their metadata and report contentPurged.",
16467
+ "toolset": "extended",
16468
+ "authority": "board",
16469
+ "authoritySource": "registry",
16470
+ "tags": [
16471
+ "chat-channels"
16472
+ ],
16473
+ "annotations": {
16474
+ "readOnlyHint": true,
16475
+ "destructiveHint": false,
16476
+ "idempotentHint": true
16477
+ },
16478
+ "guards": [
16479
+ "assertEndpointAccess"
16480
+ ],
16481
+ "permissions": [],
16482
+ "boardGuard": null,
16483
+ "authorityCapability": null,
16484
+ "parameters": [
16485
+ {
16486
+ "name": "actorKind",
16487
+ "in": "query",
16488
+ "required": false,
16489
+ "schema": {
16490
+ "type": "string",
16491
+ "enum": [
16492
+ "user",
16493
+ "agent",
16494
+ "chat_principal",
16495
+ "system"
16496
+ ]
16497
+ }
16498
+ },
16499
+ {
16500
+ "name": "actorRef",
16501
+ "in": "query",
16502
+ "required": false,
16503
+ "schema": {
16504
+ "type": "string"
16505
+ }
16506
+ },
16507
+ {
16508
+ "name": "chatKey",
16509
+ "in": "query",
16510
+ "required": false,
16511
+ "schema": {
16512
+ "type": "string"
16513
+ }
16514
+ },
16515
+ {
16516
+ "name": "cursor",
16517
+ "in": "query",
16518
+ "required": false,
16519
+ "schema": {
16520
+ "type": "string"
16521
+ }
16522
+ },
16523
+ {
16524
+ "name": "endpointId",
16525
+ "in": "path",
16526
+ "required": true,
16527
+ "schema": {
16528
+ "type": "string"
16529
+ }
16530
+ },
16531
+ {
16532
+ "name": "from",
16533
+ "in": "query",
16534
+ "required": false,
16535
+ "schema": {
16536
+ "type": "string"
16537
+ }
16538
+ },
16539
+ {
16540
+ "name": "kind",
16541
+ "in": "query",
16542
+ "required": false,
16543
+ "schema": {
16544
+ "type": "string"
16545
+ }
16546
+ },
16547
+ {
16548
+ "name": "limit",
16549
+ "in": "query",
16550
+ "required": false,
16551
+ "schema": {
16552
+ "type": "integer"
16553
+ }
16554
+ },
16555
+ {
16556
+ "name": "to",
16557
+ "in": "query",
16558
+ "required": false,
16559
+ "schema": {
16560
+ "type": "string"
16561
+ }
16562
+ }
16563
+ ]
16564
+ },
16220
16565
  {
16221
16566
  "name": "paperclipGetChatEndpointConfiguration",
16222
16567
  "operationId": "GET /api/chat-endpoints/{endpointId}/github/configuration",
@@ -16251,6 +16596,40 @@
16251
16596
  }
16252
16597
  ]
16253
16598
  },
16599
+ {
16600
+ "name": "paperclipGetChatEndpointOpenwaHealth",
16601
+ "operationId": "GET /api/chat-endpoints/{endpointId}/openwa/health",
16602
+ "method": "GET",
16603
+ "path": "/chat-endpoints/{endpointId}/openwa/health",
16604
+ "description": "Read OpenWA gateway and session health. Connection managers only. Reads the gateway version, engine, session status, and restriction with the stored operator key, plus pacing attestation and the latest observed pacing limit from the endpoint audit. Never returns keys or full phone numbers. Gateway failures are reported in gatewayError instead of an error status. Responses are not cached.",
16605
+ "toolset": "extended",
16606
+ "authority": "board",
16607
+ "authoritySource": "registry",
16608
+ "tags": [
16609
+ "chat-channels"
16610
+ ],
16611
+ "annotations": {
16612
+ "readOnlyHint": true,
16613
+ "destructiveHint": false,
16614
+ "idempotentHint": true
16615
+ },
16616
+ "guards": [
16617
+ "assertEndpointManagementAccess"
16618
+ ],
16619
+ "permissions": [],
16620
+ "boardGuard": null,
16621
+ "authorityCapability": null,
16622
+ "parameters": [
16623
+ {
16624
+ "name": "endpointId",
16625
+ "in": "path",
16626
+ "required": true,
16627
+ "schema": {
16628
+ "type": "string"
16629
+ }
16630
+ }
16631
+ ]
16632
+ },
16254
16633
  {
16255
16634
  "name": "paperclipGetChatIdentityLinkPreview",
16256
16635
  "operationId": "GET /api/chat-identity-links/preview",
@@ -17577,7 +17956,7 @@
17577
17956
  "assertBoard"
17578
17957
  ],
17579
17958
  "permissions": [],
17580
- "boardGuard": "assertBoard@chat-channels.ts:493",
17959
+ "boardGuard": "assertBoard@chat-channels.ts:630",
17581
17960
  "authorityCapability": null,
17582
17961
  "parameters": [
17583
17962
  {
@@ -21449,6 +21828,63 @@
21449
21828
  }
21450
21829
  }
21451
21830
  },
21831
+ {
21832
+ "name": "paperclipInspectChatEndpointOpenwa",
21833
+ "operationId": "POST /api/chat-endpoints/{endpointId}/openwa/inspect",
21834
+ "method": "POST",
21835
+ "path": "/chat-endpoints/{endpointId}/openwa/inspect",
21836
+ "description": "Inspect an OpenWA gateway and its sessions for channel setup. Requires a board user with connection-management access. The API keys are write-only input. Rejects agents whose adapter cannot authenticate runs with signed run tokens and keys restricted to selected chats. Returns the gateway version, engine, key role, visible sessions with masked numbers, and warnings; never keys or full phone numbers. Responses are not cached. Inspection alone does not activate the channel.",
21837
+ "toolset": "extended",
21838
+ "authority": "board",
21839
+ "authoritySource": "registry",
21840
+ "tags": [
21841
+ "chat-channels"
21842
+ ],
21843
+ "annotations": {
21844
+ "readOnlyHint": false,
21845
+ "destructiveHint": false,
21846
+ "idempotentHint": false
21847
+ },
21848
+ "guards": [
21849
+ "assertEndpointManagementAccess"
21850
+ ],
21851
+ "permissions": [],
21852
+ "boardGuard": null,
21853
+ "authorityCapability": null,
21854
+ "parameters": [
21855
+ {
21856
+ "name": "endpointId",
21857
+ "in": "path",
21858
+ "required": true,
21859
+ "schema": {
21860
+ "type": "string"
21861
+ }
21862
+ }
21863
+ ],
21864
+ "body": {
21865
+ "required": true,
21866
+ "documented": true,
21867
+ "mode": "merge",
21868
+ "schema": {
21869
+ "type": "object",
21870
+ "properties": {
21871
+ "adminApiKey": {
21872
+ "type": "string"
21873
+ },
21874
+ "apiKey": {
21875
+ "type": "string"
21876
+ },
21877
+ "baseUrl": {
21878
+ "type": "string"
21879
+ }
21880
+ },
21881
+ "required": [
21882
+ "apiKey",
21883
+ "baseUrl"
21884
+ ]
21885
+ }
21886
+ }
21887
+ },
21452
21888
  {
21453
21889
  "name": "paperclipInspectChatEndpointPhoton",
21454
21890
  "operationId": "POST /api/chat-endpoints/{endpointId}/photon/inspect",
@@ -21616,7 +22052,7 @@
21616
22052
  "assertInstanceAdmin"
21617
22053
  ],
21618
22054
  "permissions": [],
21619
- "boardGuard": "assertInstanceAdmin@adapters.ts:308",
22055
+ "boardGuard": "assertInstanceAdmin@adapters.ts:312",
21620
22056
  "authorityCapability": null,
21621
22057
  "parameters": [],
21622
22058
  "body": {
@@ -21976,7 +22412,7 @@
21976
22412
  "getActorInfo"
21977
22413
  ],
21978
22414
  "permissions": [],
21979
- "boardGuard": "assertBoard@issues.ts:16183",
22415
+ "boardGuard": "assertBoard@issues.ts:16212",
21980
22416
  "authorityCapability": null,
21981
22417
  "parameters": [
21982
22418
  {
@@ -23377,6 +23813,56 @@
23377
23813
  }
23378
23814
  ]
23379
23815
  },
23816
+ {
23817
+ "name": "paperclipListChatEndpointChats",
23818
+ "operationId": "GET /api/chat-endpoints/{endpointId}/openwa/gateway-chats",
23819
+ "method": "GET",
23820
+ "path": "/chat-endpoints/{endpointId}/openwa/gateway-chats",
23821
+ "description": "List chats from the OpenWA gateway for the chat picker. Requires connection-management access. Reads the session's chats from the gateway and annotates each with its configured activation. Direct-chat names are masked. Responses are not cached.",
23822
+ "toolset": "extended",
23823
+ "authority": "board",
23824
+ "authoritySource": "registry",
23825
+ "tags": [
23826
+ "chat-channels"
23827
+ ],
23828
+ "annotations": {
23829
+ "readOnlyHint": true,
23830
+ "destructiveHint": false,
23831
+ "idempotentHint": true
23832
+ },
23833
+ "guards": [
23834
+ "assertEndpointManagementAccess"
23835
+ ],
23836
+ "permissions": [],
23837
+ "boardGuard": null,
23838
+ "authorityCapability": null,
23839
+ "parameters": [
23840
+ {
23841
+ "name": "endpointId",
23842
+ "in": "path",
23843
+ "required": true,
23844
+ "schema": {
23845
+ "type": "string"
23846
+ }
23847
+ },
23848
+ {
23849
+ "name": "limit",
23850
+ "in": "query",
23851
+ "required": false,
23852
+ "schema": {
23853
+ "type": "integer"
23854
+ }
23855
+ },
23856
+ {
23857
+ "name": "offset",
23858
+ "in": "query",
23859
+ "required": false,
23860
+ "schema": {
23861
+ "type": "integer"
23862
+ }
23863
+ }
23864
+ ]
23865
+ },
23380
23866
  {
23381
23867
  "name": "paperclipListChatEndpointConnections",
23382
23868
  "operationId": "GET /api/chat-endpoints/{endpointId}/github/personal-connections",
@@ -23479,6 +23965,156 @@
23479
23965
  }
23480
23966
  ]
23481
23967
  },
23968
+ {
23969
+ "name": "paperclipListChatEndpointOpenwaApprovals",
23970
+ "operationId": "GET /api/chat-endpoints/{endpointId}/openwa/approvals",
23971
+ "method": "GET",
23972
+ "path": "/chat-endpoints/{endpointId}/openwa/approvals",
23973
+ "description": "List OpenWA owner approval requests. Lists the newest 100 owner approval requests of an OpenWA endpoint, optionally filtered by status, with their grants. Owner text and agent conditions are returned only to current endpoint owners; canResolve is true for a current owner on a pending request. Responses are not cached.",
23974
+ "toolset": "extended",
23975
+ "authority": "board",
23976
+ "authoritySource": "registry",
23977
+ "tags": [
23978
+ "chat-channels"
23979
+ ],
23980
+ "annotations": {
23981
+ "readOnlyHint": true,
23982
+ "destructiveHint": false,
23983
+ "idempotentHint": true
23984
+ },
23985
+ "guards": [
23986
+ "assertEndpointAccess"
23987
+ ],
23988
+ "permissions": [],
23989
+ "boardGuard": null,
23990
+ "authorityCapability": null,
23991
+ "parameters": [
23992
+ {
23993
+ "name": "endpointId",
23994
+ "in": "path",
23995
+ "required": true,
23996
+ "schema": {
23997
+ "type": "string"
23998
+ }
23999
+ },
24000
+ {
24001
+ "name": "status",
24002
+ "in": "query",
24003
+ "required": false,
24004
+ "schema": {
24005
+ "type": "string",
24006
+ "enum": [
24007
+ "pending",
24008
+ "approved",
24009
+ "rejected",
24010
+ "cancelled"
24011
+ ]
24012
+ }
24013
+ }
24014
+ ]
24015
+ },
24016
+ {
24017
+ "name": "paperclipListChatEndpointOpenwaChats",
24018
+ "operationId": "GET /api/chat-endpoints/{endpointId}/openwa/chats",
24019
+ "method": "GET",
24020
+ "path": "/chat-endpoints/{endpointId}/openwa/chats",
24021
+ "description": "List configured OpenWA chats. Lists WhatsApp chats known to the endpoint with their activation, trigger overrides, reply policy, and owner presence for groups.",
24022
+ "toolset": "extended",
24023
+ "authority": "board",
24024
+ "authoritySource": "registry",
24025
+ "tags": [
24026
+ "chat-channels"
24027
+ ],
24028
+ "annotations": {
24029
+ "readOnlyHint": true,
24030
+ "destructiveHint": false,
24031
+ "idempotentHint": true
24032
+ },
24033
+ "guards": [
24034
+ "assertEndpointAccess"
24035
+ ],
24036
+ "permissions": [],
24037
+ "boardGuard": null,
24038
+ "authorityCapability": null,
24039
+ "parameters": [
24040
+ {
24041
+ "name": "endpointId",
24042
+ "in": "path",
24043
+ "required": true,
24044
+ "schema": {
24045
+ "type": "string"
24046
+ }
24047
+ }
24048
+ ]
24049
+ },
24050
+ {
24051
+ "name": "paperclipListChatEndpointOpenwaOwners",
24052
+ "operationId": "GET /api/chat-endpoints/{endpointId}/openwa/owners",
24053
+ "method": "GET",
24054
+ "path": "/chat-endpoints/{endpointId}/openwa/owners",
24055
+ "description": "List OpenWA owners. Lists the WhatsApp numbers registered as owners of an OpenWA endpoint, with masked numbers and whether each owner is currently effective (identity link confirmed and active, non-viewer company membership). Responses are not cached.",
24056
+ "toolset": "extended",
24057
+ "authority": "board",
24058
+ "authoritySource": "registry",
24059
+ "tags": [
24060
+ "chat-channels"
24061
+ ],
24062
+ "annotations": {
24063
+ "readOnlyHint": true,
24064
+ "destructiveHint": false,
24065
+ "idempotentHint": true
24066
+ },
24067
+ "guards": [
24068
+ "assertEndpointAccess"
24069
+ ],
24070
+ "permissions": [],
24071
+ "boardGuard": null,
24072
+ "authorityCapability": null,
24073
+ "parameters": [
24074
+ {
24075
+ "name": "endpointId",
24076
+ "in": "path",
24077
+ "required": true,
24078
+ "schema": {
24079
+ "type": "string"
24080
+ }
24081
+ }
24082
+ ]
24083
+ },
24084
+ {
24085
+ "name": "paperclipListChatEndpointOpenwaRules",
24086
+ "operationId": "GET /api/chat-endpoints/{endpointId}/openwa/sender-rules",
24087
+ "method": "GET",
24088
+ "path": "/chat-endpoints/{endpointId}/openwa/sender-rules",
24089
+ "description": "List OpenWA sender allow and deny rules",
24090
+ "toolset": "extended",
24091
+ "authority": "board",
24092
+ "authoritySource": "registry",
24093
+ "tags": [
24094
+ "chat-channels"
24095
+ ],
24096
+ "annotations": {
24097
+ "readOnlyHint": true,
24098
+ "destructiveHint": false,
24099
+ "idempotentHint": true
24100
+ },
24101
+ "guards": [
24102
+ "assertEndpointAccess"
24103
+ ],
24104
+ "permissions": [],
24105
+ "boardGuard": null,
24106
+ "authorityCapability": null,
24107
+ "parameters": [
24108
+ {
24109
+ "name": "endpointId",
24110
+ "in": "path",
24111
+ "required": true,
24112
+ "schema": {
24113
+ "type": "string"
24114
+ }
24115
+ }
24116
+ ]
24117
+ },
23482
24118
  {
23483
24119
  "name": "paperclipListChatEndpointPrincipals",
23484
24120
  "operationId": "GET /api/chat-endpoints/{endpointId}/principals",
@@ -23569,7 +24205,7 @@
23569
24205
  "assertCompanyAccess"
23570
24206
  ],
23571
24207
  "permissions": [],
23572
- "boardGuard": "assertBoard@chat-channels.ts:140",
24208
+ "boardGuard": "assertBoard@chat-channels.ts:163",
23573
24209
  "authorityCapability": null,
23574
24210
  "parameters": [
23575
24211
  {
@@ -30021,7 +30657,7 @@
30021
30657
  "assertInstanceAdmin"
30022
30658
  ],
30023
30659
  "permissions": [],
30024
- "boardGuard": "assertInstanceAdmin@adapters.ts:653",
30660
+ "boardGuard": "assertInstanceAdmin@adapters.ts:657",
30025
30661
  "authorityCapability": null,
30026
30662
  "parameters": [
30027
30663
  {
@@ -30291,7 +30927,7 @@
30291
30927
  "assertInstanceAdmin"
30292
30928
  ],
30293
30929
  "permissions": [],
30294
- "boardGuard": "assertInstanceAdmin@adapters.ts:600",
30930
+ "boardGuard": "assertInstanceAdmin@adapters.ts:604",
30295
30931
  "authorityCapability": null,
30296
30932
  "parameters": [
30297
30933
  {
@@ -30842,6 +31478,71 @@
30842
31478
  }
30843
31479
  }
30844
31480
  },
31481
+ {
31482
+ "name": "paperclipResolveChatEndpointApproval",
31483
+ "operationId": "POST /api/chat-endpoints/{endpointId}/openwa/approvals/{requestId}/resolve",
31484
+ "method": "POST",
31485
+ "path": "/chat-endpoints/{endpointId}/openwa/approvals/{requestId}/resolve",
31486
+ "description": "Approve or reject an OpenWA owner approval request. Only a board user linked as a current owner of the endpoint may resolve. Uses the same first-resolution-wins path as WhatsApp replies and the generic interaction routes: approving writes the grants and wakes the agent with approval_resolved (grant); rejecting wakes it with approval_resolved (other). A request already resolved returns 409 already_resolved. Records openwa.approval_resolved.",
31487
+ "toolset": "extended",
31488
+ "authority": "board",
31489
+ "authoritySource": "registry",
31490
+ "tags": [
31491
+ "chat-channels"
31492
+ ],
31493
+ "annotations": {
31494
+ "readOnlyHint": false,
31495
+ "destructiveHint": false,
31496
+ "idempotentHint": false
31497
+ },
31498
+ "guards": [
31499
+ "assertEndpointAccess"
31500
+ ],
31501
+ "permissions": [],
31502
+ "boardGuard": null,
31503
+ "authorityCapability": null,
31504
+ "parameters": [
31505
+ {
31506
+ "name": "endpointId",
31507
+ "in": "path",
31508
+ "required": true,
31509
+ "schema": {
31510
+ "type": "string"
31511
+ }
31512
+ },
31513
+ {
31514
+ "name": "requestId",
31515
+ "in": "path",
31516
+ "required": true,
31517
+ "schema": {
31518
+ "type": "string"
31519
+ }
31520
+ }
31521
+ ],
31522
+ "body": {
31523
+ "required": true,
31524
+ "documented": true,
31525
+ "mode": "merge",
31526
+ "schema": {
31527
+ "type": "object",
31528
+ "properties": {
31529
+ "decision": {
31530
+ "type": "string",
31531
+ "enum": [
31532
+ "approve",
31533
+ "reject"
31534
+ ]
31535
+ },
31536
+ "reason": {
31537
+ "type": "string"
31538
+ }
31539
+ },
31540
+ "required": [
31541
+ "decision"
31542
+ ]
31543
+ }
31544
+ }
31545
+ },
30845
31546
  {
30846
31547
  "name": "paperclipResolveChatEndpointPublication",
30847
31548
  "operationId": "POST /api/chat-endpoints/{endpointId}/publications/{publicationId}/resolve",
@@ -33519,6 +34220,127 @@
33519
34220
  }
33520
34221
  }
33521
34222
  },
34223
+ {
34224
+ "name": "paperclipSetChatEndpointOpenwaChat",
34225
+ "operationId": "PUT /api/chat-endpoints/{endpointId}/openwa/chats",
34226
+ "method": "PUT",
34227
+ "path": "/chat-endpoints/{endpointId}/openwa/chats",
34228
+ "description": "Save OpenWA per-chat settings. Requires connection-management access. Upserts activation (off, on, auto), trigger overrides, absence seconds, and reply policy for one chat. Per-chat settings win over endpoint defaults. Records openwa.chat_activation_changed and openwa.config_changed.",
34229
+ "toolset": "extended",
34230
+ "authority": "board",
34231
+ "authoritySource": "registry",
34232
+ "tags": [
34233
+ "chat-channels"
34234
+ ],
34235
+ "annotations": {
34236
+ "readOnlyHint": false,
34237
+ "destructiveHint": false,
34238
+ "idempotentHint": true
34239
+ },
34240
+ "guards": [
34241
+ "assertEndpointManagementAccess"
34242
+ ],
34243
+ "permissions": [],
34244
+ "boardGuard": null,
34245
+ "authorityCapability": null,
34246
+ "parameters": [
34247
+ {
34248
+ "name": "endpointId",
34249
+ "in": "path",
34250
+ "required": true,
34251
+ "schema": {
34252
+ "type": "string"
34253
+ }
34254
+ }
34255
+ ],
34256
+ "body": {
34257
+ "required": true,
34258
+ "documented": true,
34259
+ "mode": "merge",
34260
+ "schema": {
34261
+ "type": "object",
34262
+ "properties": {
34263
+ "chatId": {
34264
+ "type": "string"
34265
+ },
34266
+ "label": {
34267
+ "type": "string"
34268
+ },
34269
+ "settings": {
34270
+ "type": "object",
34271
+ "properties": {
34272
+ "absenceSeconds": {
34273
+ "type": "integer"
34274
+ },
34275
+ "activation": {
34276
+ "type": "string",
34277
+ "enum": [
34278
+ "auto",
34279
+ "on",
34280
+ "off"
34281
+ ]
34282
+ },
34283
+ "note": {
34284
+ "type": "string"
34285
+ },
34286
+ "replyPolicy": {
34287
+ "type": "string",
34288
+ "enum": [
34289
+ "allowed",
34290
+ "ask_owner",
34291
+ "owner_absent_only"
34292
+ ]
34293
+ },
34294
+ "triggers": {
34295
+ "type": "object",
34296
+ "properties": {
34297
+ "agentMentioned": {
34298
+ "type": "boolean"
34299
+ },
34300
+ "allMessages": {
34301
+ "type": "boolean"
34302
+ },
34303
+ "commandPrefix": {
34304
+ "type": "object",
34305
+ "properties": {
34306
+ "enabled": {
34307
+ "type": "boolean"
34308
+ },
34309
+ "prefix": {
34310
+ "type": "string"
34311
+ }
34312
+ }
34313
+ },
34314
+ "directMessage": {
34315
+ "type": "boolean"
34316
+ },
34317
+ "keywords": {
34318
+ "type": "array",
34319
+ "items": {
34320
+ "type": "string"
34321
+ }
34322
+ },
34323
+ "ownerMentionedAbsent": {
34324
+ "type": "boolean"
34325
+ },
34326
+ "replyToAgent": {
34327
+ "type": "boolean"
34328
+ },
34329
+ "selfChat": {
34330
+ "type": "boolean"
34331
+ }
34332
+ }
34333
+ }
34334
+ }
34335
+ }
34336
+ },
34337
+ "required": [
34338
+ "chatId",
34339
+ "settings"
34340
+ ]
34341
+ }
34342
+ }
34343
+ },
33522
34344
  {
33523
34345
  "name": "paperclipSetChatEndpointResource",
33524
34346
  "operationId": "PUT /api/chat-endpoints/{endpointId}/resources",
@@ -33684,7 +34506,7 @@
33684
34506
  "assertIssueWriteInfluenceAllowed"
33685
34507
  ],
33686
34508
  "permissions": [],
33687
- "boardGuard": "assertBoard@issues.ts:8901",
34509
+ "boardGuard": "assertBoard@issues.ts:8928",
33688
34510
  "authorityCapability": null,
33689
34511
  "parameters": [
33690
34512
  {
@@ -33745,7 +34567,7 @@
33745
34567
  "getActorInfo"
33746
34568
  ],
33747
34569
  "permissions": [],
33748
- "boardGuard": "assertBoard@issues.ts:16153",
34570
+ "boardGuard": "assertBoard@issues.ts:16182",
33749
34571
  "authorityCapability": null,
33750
34572
  "parameters": [
33751
34573
  {
@@ -35114,7 +35936,7 @@
35114
35936
  "operationId": "POST /api/chat-endpoints/{endpointId}/setup",
35115
35937
  "method": "POST",
35116
35938
  "path": "/chat-endpoints/{endpointId}/setup",
35117
- "description": "Configure or change chat endpoint lifecycle state. Runs a setup or lifecycle action. `configure` and `reconnect` accept provider credentials (Slack: `botToken`, `signingSecret`; GitHub: `appId`, `privateKey` after Paperclip generates the webhook secret; Discord: `applicationId`, `guildId`, `botToken`; Microsoft Teams: `clientId`, `tenantId`, `clientSecret`; Telegram: `botToken`; iMessage Photon: `projectSecret`, with nonsecret `photon.projectId` and `photon.lineId` configuration). Credentials are stored as Paperclip secret references and are never returned. Other actions do not require credentials.",
35939
+ "description": "Configure or change chat endpoint lifecycle state. Runs a setup or lifecycle action. `configure` and `reconnect` accept provider credentials (Slack: `botToken`, `signingSecret`; GitHub: `appId`, `privateKey` after Paperclip generates the webhook secret; Discord: `applicationId`, `guildId`, `botToken`; Microsoft Teams: `clientId`, `tenantId`, `clientSecret`; Telegram: `botToken`; iMessage Photon: `projectSecret`, with nonsecret `photon.projectId` and `photon.lineId` configuration; OpenWA: `apiKey` and optional `adminApiKey`, with nonsecret `openwa.baseUrl`, `openwa.sessionId`, `openwa.numberMode`, and required `openwa.attestations`). Credentials are stored as Paperclip secret references and are never returned. Other actions do not require credentials.",
35118
35940
  "toolset": "extended",
35119
35941
  "authority": "board",
35120
35942
  "authoritySource": "registry",
@@ -35166,6 +35988,44 @@
35166
35988
  "type": "string"
35167
35989
  }
35168
35990
  },
35991
+ "openwa": {
35992
+ "type": "object",
35993
+ "properties": {
35994
+ "attestations": {
35995
+ "type": "object",
35996
+ "properties": {
35997
+ "pacing": {
35998
+ "type": "boolean"
35999
+ },
36000
+ "soleClient": {
36001
+ "type": "boolean"
36002
+ }
36003
+ },
36004
+ "required": [
36005
+ "pacing",
36006
+ "soleClient"
36007
+ ]
36008
+ },
36009
+ "baseUrl": {
36010
+ "type": "string"
36011
+ },
36012
+ "numberMode": {
36013
+ "type": "string",
36014
+ "enum": [
36015
+ "agent_number",
36016
+ "owner_number"
36017
+ ]
36018
+ },
36019
+ "sessionId": {
36020
+ "type": "string"
36021
+ }
36022
+ },
36023
+ "required": [
36024
+ "attestations",
36025
+ "baseUrl",
36026
+ "sessionId"
36027
+ ]
36028
+ },
35169
36029
  "photon": {
35170
36030
  "anyOf": [
35171
36031
  {
@@ -35369,7 +36229,7 @@
35369
36229
  "getActorInfo"
35370
36230
  ],
35371
36231
  "permissions": [],
35372
- "boardGuard": "assertBoard@issues.ts:17967",
36232
+ "boardGuard": "assertBoard@issues.ts:18096",
35373
36233
  "authorityCapability": null,
35374
36234
  "parameters": [
35375
36235
  {
@@ -35801,7 +36661,7 @@
35801
36661
  "getActorInfo"
35802
36662
  ],
35803
36663
  "permissions": [],
35804
- "boardGuard": "assertBoard@issues.ts:16962",
36664
+ "boardGuard": "assertBoard@issues.ts:17054",
35805
36665
  "authorityCapability": null,
35806
36666
  "parameters": [
35807
36667
  {
@@ -37250,7 +38110,7 @@
37250
38110
  "assertInstanceAdmin"
37251
38111
  ],
37252
38112
  "permissions": [],
37253
- "boardGuard": "assertInstanceAdmin@adapters.ts:456",
38113
+ "boardGuard": "assertInstanceAdmin@adapters.ts:460",
37254
38114
  "authorityCapability": null,
37255
38115
  "parameters": [
37256
38116
  {
@@ -37301,7 +38161,7 @@
37301
38161
  "assertInstanceAdmin"
37302
38162
  ],
37303
38163
  "permissions": [],
37304
- "boardGuard": "assertInstanceAdmin@adapters.ts:493",
38164
+ "boardGuard": "assertInstanceAdmin@adapters.ts:497",
37305
38165
  "authorityCapability": null,
37306
38166
  "parameters": [
37307
38167
  {
@@ -38488,6 +39348,57 @@
38488
39348
  }
38489
39349
  }
38490
39350
  },
39351
+ {
39352
+ "name": "paperclipUpdateChatEndpointOpenwaPolicy",
39353
+ "operationId": "PATCH /api/chat-endpoints/{endpointId}/openwa/policy",
39354
+ "method": "PATCH",
39355
+ "path": "/chat-endpoints/{endpointId}/openwa/policy",
39356
+ "description": "Update the OpenWA endpoint policy. Requires connection-management access. Merges the patch into the stored policy, validates the result against the full OpenWA policy schema, and bumps the policy revision when anything changed. The optional inflightMode key (steer or queue) sets how messages arriving during a run are handled and is stored outside the policy. Records openwa.config_changed with the changed keys only, plus inflightMode before/after when it changed.",
39357
+ "toolset": "extended",
39358
+ "authority": "board",
39359
+ "authoritySource": "registry",
39360
+ "tags": [
39361
+ "chat-channels"
39362
+ ],
39363
+ "annotations": {
39364
+ "readOnlyHint": false,
39365
+ "destructiveHint": false,
39366
+ "idempotentHint": false
39367
+ },
39368
+ "guards": [
39369
+ "assertEndpointManagementAccess"
39370
+ ],
39371
+ "permissions": [],
39372
+ "boardGuard": null,
39373
+ "authorityCapability": null,
39374
+ "parameters": [
39375
+ {
39376
+ "name": "endpointId",
39377
+ "in": "path",
39378
+ "required": true,
39379
+ "schema": {
39380
+ "type": "string"
39381
+ }
39382
+ }
39383
+ ],
39384
+ "body": {
39385
+ "required": true,
39386
+ "documented": true,
39387
+ "mode": "merge",
39388
+ "schema": {
39389
+ "type": "object",
39390
+ "properties": {
39391
+ "inflightMode": {
39392
+ "type": "string",
39393
+ "enum": [
39394
+ "steer",
39395
+ "queue"
39396
+ ]
39397
+ }
39398
+ }
39399
+ }
39400
+ }
39401
+ },
38491
39402
  {
38492
39403
  "name": "paperclipUpdateDecisionQueue",
38493
39404
  "operationId": "PATCH /api/companies/{companyId}/decision-queues/{key}",
@@ -39378,6 +40289,29 @@
39378
40289
  },
39379
40290
  "keyboardShortcuts": {
39380
40291
  "type": "boolean"
40292
+ },
40293
+ "speechToText": {
40294
+ "type": "object",
40295
+ "properties": {
40296
+ "apiKeyEnvVar": {
40297
+ "type": "string"
40298
+ },
40299
+ "baseUrl": {
40300
+ "type": "string"
40301
+ },
40302
+ "enabled": {
40303
+ "type": "boolean"
40304
+ },
40305
+ "maxAudioSeconds": {
40306
+ "type": "integer"
40307
+ },
40308
+ "model": {
40309
+ "type": "string"
40310
+ },
40311
+ "sttWaitSeconds": {
40312
+ "type": "integer"
40313
+ }
40314
+ }
39381
40315
  }
39382
40316
  }
39383
40317
  }
@@ -39472,7 +40406,7 @@
39472
40406
  "getActorInfo"
39473
40407
  ],
39474
40408
  "permissions": [],
39475
- "boardGuard": "assertBoard@issues.ts:16121",
40409
+ "boardGuard": "assertBoard@issues.ts:16150",
39476
40410
  "authorityCapability": null,
39477
40411
  "parameters": [
39478
40412
  {