@fourier-labs/harbour-contracts 0.77.0 → 0.78.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.
- package/README.md +3 -3
- package/contract-release.json +22 -22
- package/dist/gen-ts/app-integrations-declaration.d.ts +11 -2
- package/dist/gen-ts/contract-release.d.ts +6 -6
- package/dist/gen-ts/contract-release.js +6 -6
- package/dist/gen-ts/data-grant-v2.d.ts +5 -5
- package/dist/gen-ts/integration-execute-input-rules.d.ts +202 -0
- package/dist/gen-ts/integration-execute-input-rules.js +88 -2
- package/dist/gen-ts/integration-execute-request.d.ts +52 -6
- package/dist/gen-ts/integration-execute-result.d.ts +90 -2
- package/dist/gen-ts/integration-operations.d.ts +63 -0
- package/dist/gen-ts/integration-operations.js +81 -0
- package/dist/gen-ts/saas-connection.d.ts +11 -11
- package/gen-ts/app-integrations-declaration.ts +11 -2
- package/gen-ts/contract-release.ts +6 -6
- package/gen-ts/data-grant-v2.ts +13 -4
- package/gen-ts/integration-execute-input-rules.ts +90 -4
- package/gen-ts/integration-execute-request.ts +60 -5
- package/gen-ts/integration-execute-result.ts +90 -2
- package/gen-ts/integration-operations.ts +81 -0
- package/gen-ts/saas-connection.ts +19 -10
- package/package.json +1 -1
- package/schema/app-integrations-declaration.schema.json +193 -3
- package/schema/data-grant-v2.schema.json +4 -4
- package/schema/integration-execute-request.schema.json +497 -7
- package/schema/integration-execute-result.schema.json +345 -4
- package/schema/saas-connection.schema.json +27 -10
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
3
|
"$id": "https://schemas.harbour.dev/integration-execute-request.schema.json",
|
|
4
4
|
"title": "IntegrationExecuteRequest",
|
|
5
|
-
"description": "Body of POST /_harbour/integrations/execute (app SDK), forwarded unchanged to the governance development and runtime execute routes. Exactly one declared operation against one declared resource. The identity mode is fixed by the operation for every operation but the declared-mode Slack operations (slack.channel.history, slack.message.post, slack.message.update, slack.message.delete; 0.71.0 widened history), and always enforced from an approved grant; any identity/userId/scope field is rejected by additionalProperties. A declared-mode operation runs as the app (for a post: the IT-approved per-app name from the grant, plus a \"Posted by <app> on Isomorph\" footer) or as the signed-in person (no name, no footer) \u2014 the same input either way \u2014 and since 0.55.0 the call names which of the app's approved modes it runs under (`mode`): required when IT approved both modes for the app (MODE_REQUIRED otherwise), optional when it approved one (that one is used), and a named mode without an approved grant is refused (MODE_NOT_GRANTED) rather than served under the other, so approval order never decides what a call does. Per-operation input bounds (0.71.0, ADR 0018): slack.channel.history {limit? 1..100, default 15, cursor?, oldest?, latest?}; slack.message.post {text 1..4000 chars, threadId?, format? plain|mrkdwn} and a required idempotencyKey retained across retries of one explicit Send; slack.message.update {messageId, text, format?}; slack.message.delete {messageId}; slack.dm.send {to 1..8 addresses, text, format?} (app mode only) with a required idempotencyKey; slack.user.lookup {email}; gmail.thread.list {limit? 1..50, default 15, q?, labelIds? default [INBOX], pageToken?}; gmail.thread.read {threadId}; gmail.message.read {messageId}; gmail.attachment.read {messageId, attachmentId}; gmail.message.send {to 1..50 addresses (to+cc+bcc <= 50 in total), cc?, bcc?, subject 1..256 chars, text 1..4000 chars, html? <= 64 KiB, attachments? 1..5 of <= 2 MiB each as base64, replyToMessageId?} and a required idempotencyKey like slack.message.post; warehouse.view.read {columns? 1..32, where? 1..16 filters, groupBy? 1..8 columns, aggregates? 1..16, orderBy? 1..8, limit? 1..1000, default 100} (0.70.0: a plain read names columns, an aggregate read names aggregates and optionally groupBy; the cross-field rules \u2014 exactly one of columns or aggregates, groupBy needs aggregates, a filter value that fits its op, orderBy naming a returned column, every named column approved \u2014 are enforced by governance, not expressible here; ADR 0017). Basecamp (0.76.0, ADR 0022; every id a string of 1..20 digits, every operation user mode): basecamp.project.list {pageToken?, projectStatus? active|archived} on the fixed `account` alias; on a project alias basecamp.todolist.list {pageToken?}; basecamp.todo.list {todolistId, completed?, pageToken?}; basecamp.todo.create {todolistId, content 1..1000 (the to-do title), description? <= 16384, contentFormat? plain|html, dueOn? YYYY-MM-DD, assigneeIds? 1..20, notify?} with a required idempotencyKey; basecamp.todo.complete {todoId} (idempotent at Basecamp, so no key); basecamp.message.list {pageToken?}; basecamp.message.post {subject 1..256, content 1..65536, contentFormat?} with a required idempotencyKey; basecamp.comment.list {recordingId, pageToken?}; basecamp.comment.post {recordingId, content 1..16384, contentFormat?} with a required idempotencyKey; basecamp.campfire.post {content 1..4000, contentFormat?} with a required idempotencyKey; basecamp.people.list {pageToken?}. `pageToken` is the previous page's `nextPageToken` (a Basecamp page number as digits). Each operation's then-block is the one statement of its input rules: propertyNames.enum names the fields it accepts, required the ones it needs, and per-field overrides (maximum, default) narrow the shared property. Codegen derives IntegrationExecuteInputRules and validateIntegrationExecuteInput (gen-ts/integration-execute-input-rules.ts, gen-go/integration_execute_input_rules.go) from exactly these blocks, so the governance execute route, the app SDK and the kit's local check refuse the same request with the same message. Transport limits (not expressible here): request <= 16 KiB except a gmail.message.send carrying attachments (governance sizes that route for the attachment bound) and a basecamp.message.post (its 64 KiB body; governance allows 80 KiB there), total deadline 10 s.",
|
|
5
|
+
"description": "Body of POST /_harbour/integrations/execute (app SDK), forwarded unchanged to the governance development and runtime execute routes. Exactly one declared operation against one declared resource. The identity mode is fixed by the operation for every operation but the declared-mode Slack operations (slack.channel.history, slack.message.post, slack.message.update, slack.message.delete; 0.71.0 widened history), and always enforced from an approved grant; any identity/userId/scope field is rejected by additionalProperties. A declared-mode operation runs as the app (for a post: the IT-approved per-app name from the grant, plus a \"Posted by <app> on Isomorph\" footer) or as the signed-in person (no name, no footer) \u2014 the same input either way \u2014 and since 0.55.0 the call names which of the app's approved modes it runs under (`mode`): required when IT approved both modes for the app (MODE_REQUIRED otherwise), optional when it approved one (that one is used), and a named mode without an approved grant is refused (MODE_NOT_GRANTED) rather than served under the other, so approval order never decides what a call does. Per-operation input bounds (0.71.0, ADR 0018): slack.channel.history {limit? 1..100, default 15, cursor?, oldest?, latest?}; slack.message.post {text 1..4000 chars, threadId?, format? plain|mrkdwn} and a required idempotencyKey retained across retries of one explicit Send; slack.message.update {messageId, text, format?}; slack.message.delete {messageId}; slack.dm.send {to 1..8 addresses, text, format?} (app mode only) with a required idempotencyKey; slack.user.lookup {email}; gmail.thread.list {limit? 1..50, default 15, q?, labelIds? default [INBOX], pageToken?}; gmail.thread.read {threadId}; gmail.message.read {messageId}; gmail.attachment.read {messageId, attachmentId}; gmail.message.send {to 1..50 addresses (to+cc+bcc <= 50 in total), cc?, bcc?, subject 1..256 chars, text 1..4000 chars, html? <= 64 KiB, attachments? 1..5 of <= 2 MiB each as base64, replyToMessageId?} and a required idempotencyKey like slack.message.post; warehouse.view.read {columns? 1..32, where? 1..16 filters, groupBy? 1..8 columns, aggregates? 1..16, orderBy? 1..8, limit? 1..1000, default 100} (0.70.0: a plain read names columns, an aggregate read names aggregates and optionally groupBy; the cross-field rules \u2014 exactly one of columns or aggregates, groupBy needs aggregates, a filter value that fits its op, orderBy naming a returned column, every named column approved \u2014 are enforced by governance, not expressible here; ADR 0017). Basecamp (0.76.0, ADR 0022; every id a string of 1..20 digits, every operation user mode): basecamp.project.list {pageToken?, projectStatus? active|archived} on the fixed `account` alias; on a project alias basecamp.todolist.list {pageToken?}; basecamp.todo.list {todolistId, completed?, pageToken?}; basecamp.todo.create {todolistId, content 1..1000 (the to-do title), description? <= 16384, contentFormat? plain|html, dueOn? YYYY-MM-DD, assigneeIds? 1..20, notify?} with a required idempotencyKey; basecamp.todo.complete {todoId} (idempotent at Basecamp, so no key); basecamp.message.list {pageToken?}; basecamp.message.post {subject 1..256, content 1..65536, contentFormat?} with a required idempotencyKey; basecamp.comment.list {recordingId, pageToken?}; basecamp.comment.post {recordingId, content 1..16384, contentFormat?} with a required idempotencyKey; basecamp.campfire.post {content 1..4000, contentFormat?} with a required idempotencyKey; basecamp.people.list {pageToken?}. `pageToken` is the previous page's `nextPageToken` (a Basecamp page number as digits). SharePoint (0.78.0, ADR 0024; every id a Microsoft Graph id — GraphId, 1..256 characters — every operation user mode on a site alias): sharepoint.list.list {pageToken?}; sharepoint.item.list {listId, filter? 1..512 (an OData filter on `fields/...`), pageToken?}; sharepoint.item.create {listId, fields (1..32 columns, each a string <= 4000, a number, a boolean or null)} with a required idempotencyKey; sharepoint.item.update {listId, itemId, fields} (a PATCH, idempotent at Graph, so no key); sharepoint.drive.list {pageToken?}; sharepoint.file.list {driveId?, folderId?, pageToken?} (no driveId: the site's default drive; no folderId: its root); sharepoint.file.search {q 1..256, driveId?, pageToken?}; sharepoint.file.read {fileId, driveId?}; sharepoint.file.upload {filename 1..255, contentType, dataBase64 <= 2 MiB, driveId?, folderId?, conflict? rename|replace|fail} with a required idempotencyKey. A SharePoint `pageToken` is Graph's `$skiptoken` (up to 2048 characters; the shared field is that wide, the Gmail and Basecamp operations narrow it back to 256). Each operation's then-block is the one statement of its input rules: propertyNames.enum names the fields it accepts, required the ones it needs, and per-field overrides (maximum, default) narrow the shared property. Codegen derives IntegrationExecuteInputRules and validateIntegrationExecuteInput (gen-ts/integration-execute-input-rules.ts, gen-go/integration_execute_input_rules.go) from exactly these blocks, so the governance execute route, the app SDK and the kit's local check refuse the same request with the same message. Transport limits (not expressible here): request <= 16 KiB except a gmail.message.send carrying attachments (governance sizes that route for the attachment bound) and a basecamp.message.post (its 64 KiB body; governance allows 80 KiB there) and a sharepoint.file.upload (its 2 MiB file as base64; governance sizes it like the Gmail attachment route), total deadline 10 s.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": [
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
"type": "string",
|
|
79
79
|
"minLength": 1,
|
|
80
80
|
"maxLength": 256,
|
|
81
|
-
"description": "gmail.thread.list (0.71.0): a Gmail search query (the search-box syntax, e.g. `from:jane newer_than:7d`)."
|
|
81
|
+
"description": "gmail.thread.list (0.71.0): a Gmail search query (the search-box syntax, e.g. `from:jane newer_than:7d`). sharepoint.file.search (0.78.0): the words to search a drive's file names and contents for."
|
|
82
82
|
},
|
|
83
83
|
"labelIds": {
|
|
84
84
|
"type": "array",
|
|
@@ -98,8 +98,8 @@
|
|
|
98
98
|
"pageToken": {
|
|
99
99
|
"type": "string",
|
|
100
100
|
"minLength": 1,
|
|
101
|
-
"maxLength":
|
|
102
|
-
"description": "gmail.thread.list (0.71.0)
|
|
101
|
+
"maxLength": 2048,
|
|
102
|
+
"description": "gmail.thread.list (0.71.0), every basecamp.*.list operation (0.76.0) and the paged sharepoint.* reads (0.78.0: list.list, item.list, drive.list, file.list, file.search): the `nextPageToken` of the previous page; absent reads the first page. At most 2048 characters for a Graph `$skiptoken`; the Gmail and Basecamp operations narrow it to 256."
|
|
103
103
|
},
|
|
104
104
|
"email": {
|
|
105
105
|
"$ref": "#/definitions/EmailAddress",
|
|
@@ -198,6 +198,77 @@
|
|
|
198
198
|
"$ref": "#/definitions/BasecampProjectStatus",
|
|
199
199
|
"description": "basecamp.project.list (0.76.0): which projects to list; active when absent."
|
|
200
200
|
},
|
|
201
|
+
"listId": {
|
|
202
|
+
"$ref": "app-integrations-declaration.schema.json#/definitions/GraphId",
|
|
203
|
+
"description": "sharepoint.item.list / sharepoint.item.create / sharepoint.item.update (0.78.0): the SharePoint list, as a sharepoint.list.list result named it."
|
|
204
|
+
},
|
|
205
|
+
"itemId": {
|
|
206
|
+
"$ref": "app-integrations-declaration.schema.json#/definitions/GraphId",
|
|
207
|
+
"description": "sharepoint.item.update (0.78.0): the list item, as a sharepoint.item.list or sharepoint.item.create result named it."
|
|
208
|
+
},
|
|
209
|
+
"driveId": {
|
|
210
|
+
"$ref": "app-integrations-declaration.schema.json#/definitions/GraphId",
|
|
211
|
+
"description": "sharepoint.file.list / sharepoint.file.search / sharepoint.file.read / sharepoint.file.upload (0.78.0): the document library, as a sharepoint.drive.list result named it; absent means the site's default drive (its Documents library)."
|
|
212
|
+
},
|
|
213
|
+
"folderId": {
|
|
214
|
+
"$ref": "app-integrations-declaration.schema.json#/definitions/GraphId",
|
|
215
|
+
"description": "sharepoint.file.list / sharepoint.file.upload (0.78.0): the folder to list or upload into, as a sharepoint.file.list result named it (an entry with isFolder); absent means the drive's root."
|
|
216
|
+
},
|
|
217
|
+
"fileId": {
|
|
218
|
+
"$ref": "app-integrations-declaration.schema.json#/definitions/GraphId",
|
|
219
|
+
"description": "sharepoint.file.read (0.78.0): the file, as a sharepoint.file.list, sharepoint.file.search or sharepoint.file.upload result named it."
|
|
220
|
+
},
|
|
221
|
+
"fields": {
|
|
222
|
+
"type": "object",
|
|
223
|
+
"minProperties": 1,
|
|
224
|
+
"maxProperties": 32,
|
|
225
|
+
"additionalProperties": {
|
|
226
|
+
"oneOf": [
|
|
227
|
+
{
|
|
228
|
+
"type": "string",
|
|
229
|
+
"maxLength": 4000
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
"type": "number"
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
"type": "boolean"
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
"type": "null"
|
|
239
|
+
}
|
|
240
|
+
]
|
|
241
|
+
},
|
|
242
|
+
"description": "sharepoint.item.create / sharepoint.item.update (0.78.0): the item's column values keyed by the column's internal name (`Title`, `Status`, `DueDate`...), 1..32 of them; each a string of at most 4000 characters, a number, a boolean or null (which clears the column on an update). Which columns the list has, and whether a value fits its column type, is Graph's check."
|
|
243
|
+
},
|
|
244
|
+
"filter": {
|
|
245
|
+
"type": "string",
|
|
246
|
+
"minLength": 1,
|
|
247
|
+
"maxLength": 512,
|
|
248
|
+
"description": "sharepoint.item.list (0.78.0): an OData `$filter` over the item's columns as `fields/<column> <op> <value>`, e.g. `fields/Status eq 'Open'`; absent lists every item. A filter on a column SharePoint has not indexed may be refused by Graph on a large list."
|
|
249
|
+
},
|
|
250
|
+
"conflict": {
|
|
251
|
+
"$ref": "#/definitions/SharePointConflictBehavior",
|
|
252
|
+
"description": "sharepoint.file.upload (0.78.0): what happens when a file of that name already exists in the folder; rename when absent."
|
|
253
|
+
},
|
|
254
|
+
"filename": {
|
|
255
|
+
"type": "string",
|
|
256
|
+
"minLength": 1,
|
|
257
|
+
"maxLength": 255,
|
|
258
|
+
"description": "sharepoint.file.upload (0.78.0): the name the file is stored under (the result's `filename` is the stored name, which `conflict` rename may have changed)."
|
|
259
|
+
},
|
|
260
|
+
"contentType": {
|
|
261
|
+
"type": "string",
|
|
262
|
+
"minLength": 1,
|
|
263
|
+
"maxLength": 128,
|
|
264
|
+
"description": "sharepoint.file.upload (0.78.0): the file's MIME type, e.g. application/pdf."
|
|
265
|
+
},
|
|
266
|
+
"dataBase64": {
|
|
267
|
+
"type": "string",
|
|
268
|
+
"minLength": 1,
|
|
269
|
+
"maxLength": 2796203,
|
|
270
|
+
"description": "sharepoint.file.upload (0.78.0): the file bytes, standard base64, at most 2 MiB of bytes (2,796,203 base64 characters) — the Gmail attachment bound."
|
|
271
|
+
},
|
|
201
272
|
"columns": {
|
|
202
273
|
"type": "array",
|
|
203
274
|
"minItems": 1,
|
|
@@ -294,7 +365,7 @@
|
|
|
294
365
|
"idempotencyKey": {
|
|
295
366
|
"type": "string",
|
|
296
367
|
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
|
|
297
|
-
"description": "UUID of one explicit Send action; required for the sends (slack.message.post, slack.dm.send, gmail.message.send)
|
|
368
|
+
"description": "UUID of one explicit Send action; required for the sends (slack.message.post, slack.dm.send, gmail.message.send), the receipted Basecamp writes (basecamp.todo.create, basecamp.message.post, basecamp.comment.post, basecamp.campfire.post; 0.76.0) and the receipted SharePoint writes (sharepoint.item.create, sharepoint.file.upload; 0.78.0), refused everywhere else. The same key with the same payload and subject returns the recorded outcome for seven days."
|
|
298
369
|
},
|
|
299
370
|
"mode": {
|
|
300
371
|
"$ref": "app-integrations-declaration.schema.json#/definitions/IntegrationIdentityMode",
|
|
@@ -506,6 +577,292 @@
|
|
|
506
577
|
}
|
|
507
578
|
}
|
|
508
579
|
},
|
|
580
|
+
{
|
|
581
|
+
"if": {
|
|
582
|
+
"properties": {
|
|
583
|
+
"operation": {
|
|
584
|
+
"const": "sharepoint.list.list"
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
},
|
|
588
|
+
"then": {
|
|
589
|
+
"x-read-only": true,
|
|
590
|
+
"x-primary-identity": "user",
|
|
591
|
+
"not": {
|
|
592
|
+
"required": [
|
|
593
|
+
"idempotencyKey"
|
|
594
|
+
]
|
|
595
|
+
},
|
|
596
|
+
"properties": {
|
|
597
|
+
"mode": false,
|
|
598
|
+
"input": {
|
|
599
|
+
"propertyNames": {
|
|
600
|
+
"enum": [
|
|
601
|
+
"pageToken"
|
|
602
|
+
]
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
},
|
|
608
|
+
{
|
|
609
|
+
"if": {
|
|
610
|
+
"properties": {
|
|
611
|
+
"operation": {
|
|
612
|
+
"const": "sharepoint.item.list"
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
},
|
|
616
|
+
"then": {
|
|
617
|
+
"x-read-only": true,
|
|
618
|
+
"x-primary-identity": "user",
|
|
619
|
+
"not": {
|
|
620
|
+
"required": [
|
|
621
|
+
"idempotencyKey"
|
|
622
|
+
]
|
|
623
|
+
},
|
|
624
|
+
"properties": {
|
|
625
|
+
"mode": false,
|
|
626
|
+
"input": {
|
|
627
|
+
"propertyNames": {
|
|
628
|
+
"enum": [
|
|
629
|
+
"listId",
|
|
630
|
+
"filter",
|
|
631
|
+
"pageToken"
|
|
632
|
+
]
|
|
633
|
+
},
|
|
634
|
+
"required": [
|
|
635
|
+
"listId"
|
|
636
|
+
]
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
},
|
|
641
|
+
{
|
|
642
|
+
"if": {
|
|
643
|
+
"properties": {
|
|
644
|
+
"operation": {
|
|
645
|
+
"const": "sharepoint.item.create"
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
},
|
|
649
|
+
"then": {
|
|
650
|
+
"x-read-only": false,
|
|
651
|
+
"x-primary-identity": "user",
|
|
652
|
+
"required": [
|
|
653
|
+
"idempotencyKey"
|
|
654
|
+
],
|
|
655
|
+
"properties": {
|
|
656
|
+
"mode": false,
|
|
657
|
+
"input": {
|
|
658
|
+
"propertyNames": {
|
|
659
|
+
"enum": [
|
|
660
|
+
"listId",
|
|
661
|
+
"fields"
|
|
662
|
+
]
|
|
663
|
+
},
|
|
664
|
+
"required": [
|
|
665
|
+
"listId",
|
|
666
|
+
"fields"
|
|
667
|
+
]
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
},
|
|
672
|
+
{
|
|
673
|
+
"if": {
|
|
674
|
+
"properties": {
|
|
675
|
+
"operation": {
|
|
676
|
+
"const": "sharepoint.item.update"
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
},
|
|
680
|
+
"then": {
|
|
681
|
+
"x-read-only": false,
|
|
682
|
+
"x-primary-identity": "user",
|
|
683
|
+
"not": {
|
|
684
|
+
"required": [
|
|
685
|
+
"idempotencyKey"
|
|
686
|
+
]
|
|
687
|
+
},
|
|
688
|
+
"properties": {
|
|
689
|
+
"mode": false,
|
|
690
|
+
"input": {
|
|
691
|
+
"propertyNames": {
|
|
692
|
+
"enum": [
|
|
693
|
+
"listId",
|
|
694
|
+
"itemId",
|
|
695
|
+
"fields"
|
|
696
|
+
]
|
|
697
|
+
},
|
|
698
|
+
"required": [
|
|
699
|
+
"listId",
|
|
700
|
+
"itemId",
|
|
701
|
+
"fields"
|
|
702
|
+
]
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
},
|
|
707
|
+
{
|
|
708
|
+
"if": {
|
|
709
|
+
"properties": {
|
|
710
|
+
"operation": {
|
|
711
|
+
"const": "sharepoint.drive.list"
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
},
|
|
715
|
+
"then": {
|
|
716
|
+
"x-read-only": true,
|
|
717
|
+
"x-primary-identity": "user",
|
|
718
|
+
"not": {
|
|
719
|
+
"required": [
|
|
720
|
+
"idempotencyKey"
|
|
721
|
+
]
|
|
722
|
+
},
|
|
723
|
+
"properties": {
|
|
724
|
+
"mode": false,
|
|
725
|
+
"input": {
|
|
726
|
+
"propertyNames": {
|
|
727
|
+
"enum": [
|
|
728
|
+
"pageToken"
|
|
729
|
+
]
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
},
|
|
735
|
+
{
|
|
736
|
+
"if": {
|
|
737
|
+
"properties": {
|
|
738
|
+
"operation": {
|
|
739
|
+
"const": "sharepoint.file.list"
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
},
|
|
743
|
+
"then": {
|
|
744
|
+
"x-read-only": true,
|
|
745
|
+
"x-primary-identity": "user",
|
|
746
|
+
"not": {
|
|
747
|
+
"required": [
|
|
748
|
+
"idempotencyKey"
|
|
749
|
+
]
|
|
750
|
+
},
|
|
751
|
+
"properties": {
|
|
752
|
+
"mode": false,
|
|
753
|
+
"input": {
|
|
754
|
+
"propertyNames": {
|
|
755
|
+
"enum": [
|
|
756
|
+
"driveId",
|
|
757
|
+
"folderId",
|
|
758
|
+
"pageToken"
|
|
759
|
+
]
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
},
|
|
765
|
+
{
|
|
766
|
+
"if": {
|
|
767
|
+
"properties": {
|
|
768
|
+
"operation": {
|
|
769
|
+
"const": "sharepoint.file.search"
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
},
|
|
773
|
+
"then": {
|
|
774
|
+
"x-read-only": true,
|
|
775
|
+
"x-primary-identity": "user",
|
|
776
|
+
"not": {
|
|
777
|
+
"required": [
|
|
778
|
+
"idempotencyKey"
|
|
779
|
+
]
|
|
780
|
+
},
|
|
781
|
+
"properties": {
|
|
782
|
+
"mode": false,
|
|
783
|
+
"input": {
|
|
784
|
+
"propertyNames": {
|
|
785
|
+
"enum": [
|
|
786
|
+
"q",
|
|
787
|
+
"driveId",
|
|
788
|
+
"pageToken"
|
|
789
|
+
]
|
|
790
|
+
},
|
|
791
|
+
"required": [
|
|
792
|
+
"q"
|
|
793
|
+
]
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
},
|
|
798
|
+
{
|
|
799
|
+
"if": {
|
|
800
|
+
"properties": {
|
|
801
|
+
"operation": {
|
|
802
|
+
"const": "sharepoint.file.read"
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
},
|
|
806
|
+
"then": {
|
|
807
|
+
"x-read-only": true,
|
|
808
|
+
"x-primary-identity": "user",
|
|
809
|
+
"not": {
|
|
810
|
+
"required": [
|
|
811
|
+
"idempotencyKey"
|
|
812
|
+
]
|
|
813
|
+
},
|
|
814
|
+
"properties": {
|
|
815
|
+
"mode": false,
|
|
816
|
+
"input": {
|
|
817
|
+
"propertyNames": {
|
|
818
|
+
"enum": [
|
|
819
|
+
"fileId",
|
|
820
|
+
"driveId"
|
|
821
|
+
]
|
|
822
|
+
},
|
|
823
|
+
"required": [
|
|
824
|
+
"fileId"
|
|
825
|
+
]
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
},
|
|
830
|
+
{
|
|
831
|
+
"if": {
|
|
832
|
+
"properties": {
|
|
833
|
+
"operation": {
|
|
834
|
+
"const": "sharepoint.file.upload"
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
},
|
|
838
|
+
"then": {
|
|
839
|
+
"x-read-only": false,
|
|
840
|
+
"x-primary-identity": "user",
|
|
841
|
+
"required": [
|
|
842
|
+
"idempotencyKey"
|
|
843
|
+
],
|
|
844
|
+
"properties": {
|
|
845
|
+
"mode": false,
|
|
846
|
+
"input": {
|
|
847
|
+
"propertyNames": {
|
|
848
|
+
"enum": [
|
|
849
|
+
"filename",
|
|
850
|
+
"contentType",
|
|
851
|
+
"dataBase64",
|
|
852
|
+
"driveId",
|
|
853
|
+
"folderId",
|
|
854
|
+
"conflict"
|
|
855
|
+
]
|
|
856
|
+
},
|
|
857
|
+
"required": [
|
|
858
|
+
"filename",
|
|
859
|
+
"contentType",
|
|
860
|
+
"dataBase64"
|
|
861
|
+
]
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
},
|
|
509
866
|
{
|
|
510
867
|
"if": {
|
|
511
868
|
"properties": {
|
|
@@ -574,6 +931,9 @@
|
|
|
574
931
|
"limit": {
|
|
575
932
|
"maximum": 50,
|
|
576
933
|
"default": 15
|
|
934
|
+
},
|
|
935
|
+
"pageToken": {
|
|
936
|
+
"maxLength": 256
|
|
577
937
|
}
|
|
578
938
|
}
|
|
579
939
|
}
|
|
@@ -733,6 +1093,11 @@
|
|
|
733
1093
|
"pageToken",
|
|
734
1094
|
"projectStatus"
|
|
735
1095
|
]
|
|
1096
|
+
},
|
|
1097
|
+
"properties": {
|
|
1098
|
+
"pageToken": {
|
|
1099
|
+
"maxLength": 256
|
|
1100
|
+
}
|
|
736
1101
|
}
|
|
737
1102
|
}
|
|
738
1103
|
}
|
|
@@ -761,6 +1126,11 @@
|
|
|
761
1126
|
"enum": [
|
|
762
1127
|
"pageToken"
|
|
763
1128
|
]
|
|
1129
|
+
},
|
|
1130
|
+
"properties": {
|
|
1131
|
+
"pageToken": {
|
|
1132
|
+
"maxLength": 256
|
|
1133
|
+
}
|
|
764
1134
|
}
|
|
765
1135
|
}
|
|
766
1136
|
}
|
|
@@ -794,7 +1164,12 @@
|
|
|
794
1164
|
},
|
|
795
1165
|
"required": [
|
|
796
1166
|
"todolistId"
|
|
797
|
-
]
|
|
1167
|
+
],
|
|
1168
|
+
"properties": {
|
|
1169
|
+
"pageToken": {
|
|
1170
|
+
"maxLength": 256
|
|
1171
|
+
}
|
|
1172
|
+
}
|
|
798
1173
|
}
|
|
799
1174
|
}
|
|
800
1175
|
}
|
|
@@ -894,6 +1269,11 @@
|
|
|
894
1269
|
"enum": [
|
|
895
1270
|
"pageToken"
|
|
896
1271
|
]
|
|
1272
|
+
},
|
|
1273
|
+
"properties": {
|
|
1274
|
+
"pageToken": {
|
|
1275
|
+
"maxLength": 256
|
|
1276
|
+
}
|
|
897
1277
|
}
|
|
898
1278
|
}
|
|
899
1279
|
}
|
|
@@ -958,7 +1338,12 @@
|
|
|
958
1338
|
},
|
|
959
1339
|
"required": [
|
|
960
1340
|
"recordingId"
|
|
961
|
-
]
|
|
1341
|
+
],
|
|
1342
|
+
"properties": {
|
|
1343
|
+
"pageToken": {
|
|
1344
|
+
"maxLength": 256
|
|
1345
|
+
}
|
|
1346
|
+
}
|
|
962
1347
|
}
|
|
963
1348
|
}
|
|
964
1349
|
}
|
|
@@ -1058,6 +1443,11 @@
|
|
|
1058
1443
|
"enum": [
|
|
1059
1444
|
"pageToken"
|
|
1060
1445
|
]
|
|
1446
|
+
},
|
|
1447
|
+
"properties": {
|
|
1448
|
+
"pageToken": {
|
|
1449
|
+
"maxLength": 256
|
|
1450
|
+
}
|
|
1061
1451
|
}
|
|
1062
1452
|
}
|
|
1063
1453
|
}
|
|
@@ -1149,6 +1539,16 @@
|
|
|
1149
1539
|
],
|
|
1150
1540
|
"description": "Which projects basecamp.project.list returns (0.76.0): the active ones (the default) or the archived ones."
|
|
1151
1541
|
},
|
|
1542
|
+
"SharePointConflictBehavior": {
|
|
1543
|
+
"type": "string",
|
|
1544
|
+
"enum": [
|
|
1545
|
+
"rename",
|
|
1546
|
+
"replace",
|
|
1547
|
+
"fail"
|
|
1548
|
+
],
|
|
1549
|
+
"default": "rename",
|
|
1550
|
+
"description": "What sharepoint.file.upload does when the folder already holds a file of that name (0.78.0; Graph's conflictBehavior): rename stores the new file under a numbered name (the default), replace overwrites the existing file, fail refuses the upload."
|
|
1551
|
+
},
|
|
1152
1552
|
"EmailAttachment": {
|
|
1153
1553
|
"type": "object",
|
|
1154
1554
|
"additionalProperties": false,
|
|
@@ -1703,6 +2103,96 @@
|
|
|
1703
2103
|
"operation": "basecamp.people.list",
|
|
1704
2104
|
"resource": "launch",
|
|
1705
2105
|
"input": {}
|
|
2106
|
+
},
|
|
2107
|
+
{
|
|
2108
|
+
"connection": "company-sharepoint",
|
|
2109
|
+
"operation": "sharepoint.list.list",
|
|
2110
|
+
"resource": "intranet",
|
|
2111
|
+
"input": {}
|
|
2112
|
+
},
|
|
2113
|
+
{
|
|
2114
|
+
"connection": "company-sharepoint",
|
|
2115
|
+
"operation": "sharepoint.item.list",
|
|
2116
|
+
"resource": "intranet",
|
|
2117
|
+
"input": {
|
|
2118
|
+
"listId": "c8f7a4d1-2b3e-4f5a-9c6d-7e8f9a0b1c2d",
|
|
2119
|
+
"filter": "fields/Status eq 'Open'"
|
|
2120
|
+
}
|
|
2121
|
+
},
|
|
2122
|
+
{
|
|
2123
|
+
"connection": "company-sharepoint",
|
|
2124
|
+
"operation": "sharepoint.item.create",
|
|
2125
|
+
"resource": "intranet",
|
|
2126
|
+
"input": {
|
|
2127
|
+
"listId": "c8f7a4d1-2b3e-4f5a-9c6d-7e8f9a0b1c2d",
|
|
2128
|
+
"fields": {
|
|
2129
|
+
"Title": "Renew the office lease",
|
|
2130
|
+
"Status": "Open",
|
|
2131
|
+
"DueDate": "2026-10-31",
|
|
2132
|
+
"Priority": 2,
|
|
2133
|
+
"Urgent": false
|
|
2134
|
+
}
|
|
2135
|
+
},
|
|
2136
|
+
"idempotencyKey": "6f1c2c1e-3a1c-4c3e-9f0e-2b6f7d8a9c20"
|
|
2137
|
+
},
|
|
2138
|
+
{
|
|
2139
|
+
"connection": "company-sharepoint",
|
|
2140
|
+
"operation": "sharepoint.item.update",
|
|
2141
|
+
"resource": "intranet",
|
|
2142
|
+
"input": {
|
|
2143
|
+
"listId": "c8f7a4d1-2b3e-4f5a-9c6d-7e8f9a0b1c2d",
|
|
2144
|
+
"itemId": "42",
|
|
2145
|
+
"fields": {
|
|
2146
|
+
"Status": "Done",
|
|
2147
|
+
"DueDate": null
|
|
2148
|
+
}
|
|
2149
|
+
}
|
|
2150
|
+
},
|
|
2151
|
+
{
|
|
2152
|
+
"connection": "company-sharepoint",
|
|
2153
|
+
"operation": "sharepoint.drive.list",
|
|
2154
|
+
"resource": "intranet",
|
|
2155
|
+
"input": {}
|
|
2156
|
+
},
|
|
2157
|
+
{
|
|
2158
|
+
"connection": "company-sharepoint",
|
|
2159
|
+
"operation": "sharepoint.file.list",
|
|
2160
|
+
"resource": "intranet",
|
|
2161
|
+
"input": {
|
|
2162
|
+
"driveId": "b!X1Y2Z3a4B5c6D7e8F9g0H1i2J3k4L5m6N7o8P9q0R1s2T3u4V5w6X7y8Z9a0B1c2",
|
|
2163
|
+
"folderId": "01BYE5RZ6QN3ZWBTUFOFD3GSPGOHDJD36K"
|
|
2164
|
+
}
|
|
2165
|
+
},
|
|
2166
|
+
{
|
|
2167
|
+
"connection": "company-sharepoint",
|
|
2168
|
+
"operation": "sharepoint.file.search",
|
|
2169
|
+
"resource": "intranet",
|
|
2170
|
+
"input": {
|
|
2171
|
+
"q": "weekly report",
|
|
2172
|
+
"pageToken": "UGFnZWQ9VFJVRSZwX1NvcnRCZWhhdmlvcj0xJnBfRmlsZUxlYWZSZWY9d2Vla2x5LXJlcG9ydC5wZGYmcF9JRD00Mg"
|
|
2173
|
+
}
|
|
2174
|
+
},
|
|
2175
|
+
{
|
|
2176
|
+
"connection": "company-sharepoint",
|
|
2177
|
+
"operation": "sharepoint.file.read",
|
|
2178
|
+
"resource": "intranet",
|
|
2179
|
+
"input": {
|
|
2180
|
+
"fileId": "01BYE5RZ5MYLM2SMX75ZBIPQZIHT6OAYPB",
|
|
2181
|
+
"driveId": "b!X1Y2Z3a4B5c6D7e8F9g0H1i2J3k4L5m6N7o8P9q0R1s2T3u4V5w6X7y8Z9a0B1c2"
|
|
2182
|
+
}
|
|
2183
|
+
},
|
|
2184
|
+
{
|
|
2185
|
+
"connection": "company-sharepoint",
|
|
2186
|
+
"operation": "sharepoint.file.upload",
|
|
2187
|
+
"resource": "intranet",
|
|
2188
|
+
"input": {
|
|
2189
|
+
"filename": "weekly-report.pdf",
|
|
2190
|
+
"contentType": "application/pdf",
|
|
2191
|
+
"dataBase64": "JVBERi0xLjQKJcOkw7zDtsOfCg==",
|
|
2192
|
+
"driveId": "b!X1Y2Z3a4B5c6D7e8F9g0H1i2J3k4L5m6N7o8P9q0R1s2T3u4V5w6X7y8Z9a0B1c2",
|
|
2193
|
+
"conflict": "replace"
|
|
2194
|
+
},
|
|
2195
|
+
"idempotencyKey": "6f1c2c1e-3a1c-4c3e-9f0e-2b6f7d8a9c21"
|
|
1706
2196
|
}
|
|
1707
2197
|
]
|
|
1708
2198
|
}
|