@fourier-labs/harbour-contracts 0.88.0 → 0.91.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/contract-release.json +24 -24
- package/dist/gen-ts/app-integrations-declaration.d.ts +8 -0
- 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 +16 -2
- package/dist/gen-ts/integration-execute-input-rules.d.ts +230 -0
- package/dist/gen-ts/integration-execute-input-rules.js +70 -0
- package/dist/gen-ts/integration-execute-request.d.ts +19 -2
- package/dist/gen-ts/integration-execute-result.d.ts +49 -0
- package/dist/gen-ts/integration-operations.d.ts +56 -0
- package/dist/gen-ts/integration-operations.js +72 -0
- package/dist/gen-ts/resolved-app-serving.d.ts +4 -0
- package/dist/gen-ts/saas-connection.d.ts +34 -3
- package/gen-ts/app-integrations-declaration.ts +8 -0
- package/gen-ts/contract-release.ts +6 -6
- package/gen-ts/data-grant-v2.ts +113 -1
- package/gen-ts/integration-execute-input-rules.ts +70 -0
- package/gen-ts/integration-execute-request.ts +27 -2
- package/gen-ts/integration-execute-result.ts +49 -0
- package/gen-ts/integration-operations.ts +72 -0
- package/gen-ts/resolved-app-serving.ts +4 -0
- package/gen-ts/saas-connection.ts +222 -2
- package/package.json +1 -1
- package/schema/app-integrations-declaration.schema.json +121 -9
- package/schema/data-grant-v2.schema.json +17 -1
- package/schema/integration-execute-request.schema.json +458 -7
- package/schema/integration-execute-result.schema.json +234 -2
- package/schema/resolved-app-serving.schema.json +1 -0
- package/schema/saas-connection.schema.json +732 -126
|
@@ -5,57 +5,187 @@
|
|
|
5
5
|
"description": "Tenant-wide SaaS connection record (control table sk SAASCONN#<sourceId>, same tenant partition as database sources; alias uniqueness is enforced across both). One connection per tenant and provider: a single bot installation of the platform-owned provider app and a single logical channel map shared by every app environment (grants, requests and user consent links stay per environment). A Gmail connection has neither installation nor channels: user consent is the only step and its one resource is the fixed `inbox` alias. A Basecamp connection (0.76.0, ADR 0022) has no installation either: IT pins the company's Basecamp `account` (chosen from the accounts IT's own Basecamp sign-in belongs to) and maps project aliases to project ids in `channels`; basecamp.project.list runs on the fixed `account` alias. A SharePoint connection (0.78.0, ADR 0024) is shaped the same way: IT pins the company's Microsoft 365 tenant in `account` (the Entra tenant id and the organisation's display name, from IT's own Microsoft sign-in) and maps site aliases to Microsoft Graph site ids (`hostname,siteCollectionGuid,webGuid`) in `channels`; every sharepoint.* operation runs on a site alias. The eight Google Workspace and Microsoft 365 connections (0.86.0, ADR 0032) are Gmail-shaped: user consent only, one connection per provider (calendar, drive, docs, sheets on the Google client; outlook, onedrive, excel, teams on the Microsoft client), no installation. Seven of them carry no `account` and empty `channels`, acting on the signed-in person's own data through one fixed alias; a Teams connection pins the Microsoft 365 tenant in `account` like SharePoint and maps channel aliases to `<teamId>/<channelId>` in `channels`. Contains references, never secrets: installation tokens live under their own token records. The pre-T25 per-environment shape (`clientId`, `clientSecretRef`, `environments`, `installations`) is deprecated: the control plane normalises such a stored record on read and never writes it.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
|
-
"required": [
|
|
8
|
+
"required": [
|
|
9
|
+
"schema",
|
|
10
|
+
"tenantId",
|
|
11
|
+
"sourceId",
|
|
12
|
+
"kind",
|
|
13
|
+
"provider",
|
|
14
|
+
"displayName",
|
|
15
|
+
"status",
|
|
16
|
+
"version",
|
|
17
|
+
"channels",
|
|
18
|
+
"operations",
|
|
19
|
+
"developmentPreapproval",
|
|
20
|
+
"createdAt",
|
|
21
|
+
"updatedAt"
|
|
22
|
+
],
|
|
9
23
|
"properties": {
|
|
10
|
-
"schema": {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
"
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
"
|
|
24
|
+
"schema": {
|
|
25
|
+
"type": "string",
|
|
26
|
+
"const": "harbour.saas-connection/1.0"
|
|
27
|
+
},
|
|
28
|
+
"tenantId": {
|
|
29
|
+
"type": "string",
|
|
30
|
+
"minLength": 1,
|
|
31
|
+
"maxLength": 255
|
|
32
|
+
},
|
|
33
|
+
"sourceId": {
|
|
34
|
+
"$ref": "app-integrations-declaration.schema.json#/definitions/IntegrationAlias"
|
|
35
|
+
},
|
|
36
|
+
"kind": {
|
|
37
|
+
"type": "string",
|
|
38
|
+
"const": "saas"
|
|
39
|
+
},
|
|
40
|
+
"provider": {
|
|
41
|
+
"$ref": "#/definitions/SaasProvider"
|
|
42
|
+
},
|
|
43
|
+
"displayName": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"minLength": 1,
|
|
46
|
+
"maxLength": 120
|
|
47
|
+
},
|
|
48
|
+
"status": {
|
|
49
|
+
"$ref": "#/definitions/SaasConnectionStatus"
|
|
50
|
+
},
|
|
51
|
+
"version": {
|
|
52
|
+
"type": "integer",
|
|
53
|
+
"minimum": 1,
|
|
54
|
+
"description": "Optimistic-concurrency version; every write is conditional on it."
|
|
55
|
+
},
|
|
56
|
+
"installation": {
|
|
57
|
+
"$ref": "#/definitions/SaasInstallation"
|
|
58
|
+
},
|
|
59
|
+
"account": {
|
|
60
|
+
"$ref": "#/definitions/BasecampAccount"
|
|
61
|
+
},
|
|
20
62
|
"channels": {
|
|
21
63
|
"type": "object",
|
|
22
64
|
"maxProperties": 64,
|
|
23
|
-
"propertyNames": {
|
|
24
|
-
|
|
65
|
+
"propertyNames": {
|
|
66
|
+
"$ref": "app-integrations-declaration.schema.json#/definitions/IntegrationAlias"
|
|
67
|
+
},
|
|
68
|
+
"additionalProperties": {
|
|
69
|
+
"type": "string",
|
|
70
|
+
"pattern": "^[+A-Za-z0-9][A-Za-z0-9.,_:@!/-]{0,255}$",
|
|
71
|
+
"description": "A Slack channel id (public, non-archived), a Basecamp project id (digits), a SharePoint site id (0.78.0: the Microsoft Graph composite `hostname,siteCollectionGuid,webGuid`), a phone number (0.82.0: E.164, a leading `+` and digits) or a Teams channel (0.86.0: `<teamId>/<channelId>`, the team's GUID and the channel id `19:...@thread.tacv2`, so the alphabet admits `@`, `!` and `/`)."
|
|
72
|
+
},
|
|
25
73
|
"description": "Logical alias → provider resource id: a Slack channel id, a Basecamp project id, a SharePoint site id, a phone number or a Teams channel. Always empty for Gmail and for the seven personal Google Workspace and Microsoft 365 providers (0.86.0: calendar, drive, docs, sheets, outlook, onedrive, excel), whose one fixed alias governance resolves."
|
|
26
74
|
},
|
|
27
75
|
"operations": {
|
|
28
76
|
"type": "array",
|
|
29
77
|
"minItems": 1,
|
|
30
|
-
"maxItems":
|
|
78
|
+
"maxItems": 86,
|
|
31
79
|
"uniqueItems": true,
|
|
32
|
-
"items": {
|
|
33
|
-
|
|
80
|
+
"items": {
|
|
81
|
+
"$ref": "app-integrations-declaration.schema.json#/definitions/IntegrationOperation"
|
|
82
|
+
},
|
|
83
|
+
"not": {
|
|
84
|
+
"anyOf": [
|
|
85
|
+
{
|
|
86
|
+
"contains": {
|
|
87
|
+
"const": "warehouse.view.read"
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"contains": {
|
|
92
|
+
"const": "warehouse.table.append"
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
]
|
|
96
|
+
},
|
|
34
97
|
"description": "Operations IT allows apps to request on this connection: the provider's own SaaS operations (Slack: slack.channel.history, slack.message.post, slack.message.update, slack.message.delete, slack.dm.send, slack.user.lookup; Gmail: gmail.thread.list, gmail.thread.read, gmail.message.read, gmail.message.send, gmail.attachment.read; Basecamp (0.76.0): basecamp.project.list, basecamp.todolist.list, basecamp.todo.list, basecamp.todo.create, basecamp.todo.complete, basecamp.message.list, basecamp.message.post, basecamp.comment.list, basecamp.comment.post, basecamp.campfire.post, basecamp.people.list; SharePoint (0.78.0): sharepoint.list.list, sharepoint.item.list, sharepoint.item.create, sharepoint.item.update, sharepoint.drive.list, sharepoint.file.list, sharepoint.file.search, sharepoint.file.read, sharepoint.file.upload; Google Workspace and Microsoft 365 (0.86.0): the calendar.*, drive.*, docs.*, sheets.*, outlook.*, onedrive.*, excel.* and teams.* operations of the connection's provider). Never warehouse.view.read. Phone (0.82.0): phone.sms.list; 0.83.0 adds phone.number.get. Seventy-eight SaaS operations in all since 0.86.0."
|
|
35
98
|
},
|
|
36
|
-
"
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
99
|
+
"automaticUserOperations": {
|
|
100
|
+
"type": "array",
|
|
101
|
+
"maxItems": 86,
|
|
102
|
+
"uniqueItems": true,
|
|
103
|
+
"items": {
|
|
104
|
+
"$ref": "app-integrations-declaration.schema.json#/definitions/IntegrationOperation"
|
|
105
|
+
},
|
|
106
|
+
"not": {
|
|
107
|
+
"anyOf": [
|
|
108
|
+
{
|
|
109
|
+
"contains": {
|
|
110
|
+
"const": "warehouse.view.read"
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"contains": {
|
|
115
|
+
"const": "warehouse.table.append"
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"contains": {
|
|
120
|
+
"const": "service.request"
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
]
|
|
124
|
+
},
|
|
125
|
+
"description": "Explicit user-mode operations eligible for automatic app access, subject to the connection operation ceiling and personal consent. Empty means review all; absent inherits company defaults or the existing userModeApproval migration rule. Governance validates provider and mode compatibility. Background execution still requires personal background consent, not a separate admin grant."
|
|
126
|
+
},
|
|
127
|
+
"reusableAccess": {
|
|
128
|
+
"type": "array",
|
|
129
|
+
"maxItems": 128,
|
|
130
|
+
"uniqueItems": true,
|
|
131
|
+
"items": {
|
|
132
|
+
"$ref": "#/definitions/ReusableSaasAccess"
|
|
133
|
+
},
|
|
134
|
+
"description": "Reusable permissions for admitted builders on explicit shared SaaS resources. Governance checks registered resources, provider/mode compatibility and the connection operation ceiling. Connection version and audit record changes; no per-entry approval metadata."
|
|
135
|
+
},
|
|
136
|
+
"developmentPreapproval": {
|
|
137
|
+
"$ref": "#/definitions/DevelopmentPreapproval"
|
|
138
|
+
},
|
|
139
|
+
"oauthClient": {
|
|
140
|
+
"$ref": "#/definitions/SaasOauthClient"
|
|
141
|
+
},
|
|
142
|
+
"userModeApproval": {
|
|
143
|
+
"$ref": "#/definitions/UserModeApproval"
|
|
144
|
+
},
|
|
145
|
+
"directMessages": {
|
|
146
|
+
"$ref": "#/definitions/DirectMessagePolicy"
|
|
147
|
+
},
|
|
148
|
+
"externalRecipients": {
|
|
149
|
+
"$ref": "#/definitions/ExternalRecipientPolicy"
|
|
150
|
+
},
|
|
41
151
|
"blockedDevelopmentBuilders": {
|
|
42
152
|
"type": "array",
|
|
43
153
|
"maxItems": 256,
|
|
44
154
|
"uniqueItems": true,
|
|
45
|
-
"items": {
|
|
155
|
+
"items": {
|
|
156
|
+
"type": "string",
|
|
157
|
+
"minLength": 1,
|
|
158
|
+
"maxLength": 255
|
|
159
|
+
},
|
|
46
160
|
"description": "Lower-cased builder emails excluded from development preapproval."
|
|
47
161
|
},
|
|
48
162
|
"approvers": {
|
|
49
163
|
"type": "array",
|
|
50
164
|
"maxItems": 20,
|
|
51
165
|
"uniqueItems": true,
|
|
52
|
-
"items": {
|
|
166
|
+
"items": {
|
|
167
|
+
"$ref": "integration-execute-request.schema.json#/definitions/EmailAddress"
|
|
168
|
+
},
|
|
53
169
|
"description": "Lower-cased emails who may approve an app's access requests for this connection, besides tenant admins. Empty or absent means tenant admins only."
|
|
54
170
|
},
|
|
55
|
-
"startedBy": {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
"
|
|
171
|
+
"startedBy": {
|
|
172
|
+
"$ref": "#/definitions/StartedBy"
|
|
173
|
+
},
|
|
174
|
+
"createdAt": {
|
|
175
|
+
"type": "string",
|
|
176
|
+
"format": "date-time"
|
|
177
|
+
},
|
|
178
|
+
"updatedAt": {
|
|
179
|
+
"type": "string",
|
|
180
|
+
"format": "date-time"
|
|
181
|
+
},
|
|
182
|
+
"clientId": {
|
|
183
|
+
"type": "string",
|
|
184
|
+
"minLength": 1,
|
|
185
|
+
"maxLength": 255,
|
|
186
|
+
"deprecated": true,
|
|
187
|
+
"description": "Deprecated (pre-T25 tenant-owned provider client). Dropped on read; never written."
|
|
188
|
+
},
|
|
59
189
|
"clientSecretRef": {
|
|
60
190
|
"type": "string",
|
|
61
191
|
"pattern": "^secretref://[A-Za-z0-9][A-Za-z0-9/_.:-]*$",
|
|
@@ -69,153 +199,419 @@
|
|
|
69
199
|
"deprecated": true,
|
|
70
200
|
"description": "Deprecated pre-T25 per-environment mapping. On read the development entry's channels become `channels`; never written.",
|
|
71
201
|
"properties": {
|
|
72
|
-
"development": {
|
|
73
|
-
|
|
74
|
-
|
|
202
|
+
"development": {
|
|
203
|
+
"$ref": "#/definitions/SaasEnvironmentMapping"
|
|
204
|
+
},
|
|
205
|
+
"preview": {
|
|
206
|
+
"$ref": "#/definitions/SaasEnvironmentMapping"
|
|
207
|
+
},
|
|
208
|
+
"production": {
|
|
209
|
+
"$ref": "#/definitions/SaasEnvironmentMapping"
|
|
210
|
+
}
|
|
75
211
|
}
|
|
76
212
|
},
|
|
77
213
|
"installations": {
|
|
78
214
|
"type": "object",
|
|
79
|
-
"propertyNames": {
|
|
80
|
-
|
|
215
|
+
"propertyNames": {
|
|
216
|
+
"$ref": "#/definitions/InstallationName"
|
|
217
|
+
},
|
|
218
|
+
"additionalProperties": {
|
|
219
|
+
"$ref": "#/definitions/LegacySaasInstallation"
|
|
220
|
+
},
|
|
81
221
|
"deprecated": true,
|
|
82
222
|
"description": "Deprecated pre-T25 named installations. On read the `nonprod` entry (or the development mapping's) becomes `installation`; never written."
|
|
223
|
+
},
|
|
224
|
+
"region": {
|
|
225
|
+
"type": "string",
|
|
226
|
+
"enum": [
|
|
227
|
+
"us",
|
|
228
|
+
"in",
|
|
229
|
+
"eu",
|
|
230
|
+
"au",
|
|
231
|
+
"jp",
|
|
232
|
+
"ca",
|
|
233
|
+
"sa",
|
|
234
|
+
"cn",
|
|
235
|
+
"ae"
|
|
236
|
+
],
|
|
237
|
+
"description": "Zoho data center. Chosen by the connection administrator, never by an app call."
|
|
83
238
|
}
|
|
84
239
|
},
|
|
85
240
|
"definitions": {
|
|
241
|
+
"ReusableSaasAccess": {
|
|
242
|
+
"type": "object",
|
|
243
|
+
"additionalProperties": false,
|
|
244
|
+
"required": [
|
|
245
|
+
"resource",
|
|
246
|
+
"mode",
|
|
247
|
+
"operations"
|
|
248
|
+
],
|
|
249
|
+
"properties": {
|
|
250
|
+
"resource": {
|
|
251
|
+
"$ref": "app-integrations-declaration.schema.json#/definitions/IntegrationAlias"
|
|
252
|
+
},
|
|
253
|
+
"mode": {
|
|
254
|
+
"$ref": "app-integrations-declaration.schema.json#/definitions/IntegrationIdentityMode"
|
|
255
|
+
},
|
|
256
|
+
"operations": {
|
|
257
|
+
"type": "array",
|
|
258
|
+
"minItems": 1,
|
|
259
|
+
"maxItems": 86,
|
|
260
|
+
"uniqueItems": true,
|
|
261
|
+
"items": {
|
|
262
|
+
"$ref": "app-integrations-declaration.schema.json#/definitions/IntegrationOperation"
|
|
263
|
+
},
|
|
264
|
+
"not": {
|
|
265
|
+
"anyOf": [
|
|
266
|
+
{
|
|
267
|
+
"contains": {
|
|
268
|
+
"const": "warehouse.view.read"
|
|
269
|
+
}
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
"contains": {
|
|
273
|
+
"const": "warehouse.table.append"
|
|
274
|
+
}
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
"contains": {
|
|
278
|
+
"const": "service.request"
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
]
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
},
|
|
86
286
|
"SaasProvider": {
|
|
87
287
|
"type": "string",
|
|
88
|
-
"enum": [
|
|
288
|
+
"enum": [
|
|
289
|
+
"slack",
|
|
290
|
+
"gmail",
|
|
291
|
+
"basecamp",
|
|
292
|
+
"sharepoint",
|
|
293
|
+
"phone",
|
|
294
|
+
"calendar",
|
|
295
|
+
"drive",
|
|
296
|
+
"docs",
|
|
297
|
+
"sheets",
|
|
298
|
+
"outlook",
|
|
299
|
+
"onedrive",
|
|
300
|
+
"excel",
|
|
301
|
+
"teams",
|
|
302
|
+
"zohobooks"
|
|
303
|
+
],
|
|
89
304
|
"description": "Slack carries an installation and a channel map; Gmail is user-consent only; Basecamp is user-consent only with an IT-pinned account and a project map in `channels`; SharePoint (0.78.0) is user-consent only, pinned to the company's Microsoft 365 tenant in `account`, with a site map in `channels`. Phone (0.82.0) is app mode only with no installation: the tenant's inbound SMS numbers (E.164) mapped from aliases in `channels`, and the SMS the platform received on them listed by phone.sms.list; since 0.83.0 an app reads the number an alias maps to with phone.number.get. Google Workspace (0.86.0, ADR 0032: calendar, drive, docs, sheets on the Google OAuth client) and Microsoft 365 (outlook, onedrive, excel, teams on the Microsoft client) are user-consent only like Gmail, one connection per provider with its own consent and scopes; the seven personal providers have no `account` and empty `channels` (their one fixed alias is the signed-in person's own calendar, drive, documents, spreadsheets, mailbox or workbooks); teams is pinned to the Microsoft 365 tenant in `account` like SharePoint and maps channel aliases in `channels`."
|
|
90
305
|
},
|
|
91
306
|
"StartedBy": {
|
|
92
307
|
"type": "object",
|
|
93
308
|
"additionalProperties": false,
|
|
94
|
-
"required": [
|
|
309
|
+
"required": [
|
|
310
|
+
"email",
|
|
311
|
+
"at"
|
|
312
|
+
],
|
|
95
313
|
"description": "Set when a builder's first access request created this connection instead of IT (0.88.0, ADR 0034): who, when, and the app that asked. Such a connection is an ordinary ACTIVE connection whose `userModeApproval` starts as `it`, so development is granted by the development preapproval and production waits for IT's one decision; IT may relax the switch afterwards. Absent on connections IT created.",
|
|
96
314
|
"properties": {
|
|
97
|
-
"email": {
|
|
98
|
-
|
|
99
|
-
|
|
315
|
+
"email": {
|
|
316
|
+
"$ref": "integration-execute-request.schema.json#/definitions/EmailAddress",
|
|
317
|
+
"description": "The builder's lower-cased company email."
|
|
318
|
+
},
|
|
319
|
+
"at": {
|
|
320
|
+
"type": "string",
|
|
321
|
+
"format": "date-time"
|
|
322
|
+
},
|
|
323
|
+
"appId": {
|
|
324
|
+
"type": "string",
|
|
325
|
+
"minLength": 1,
|
|
326
|
+
"maxLength": 128,
|
|
327
|
+
"description": "The app whose request created the connection, when known."
|
|
328
|
+
}
|
|
100
329
|
}
|
|
101
330
|
},
|
|
102
331
|
"BasecampAccount": {
|
|
103
332
|
"type": "object",
|
|
104
333
|
"additionalProperties": false,
|
|
105
|
-
"required": [
|
|
334
|
+
"required": [
|
|
335
|
+
"id",
|
|
336
|
+
"name"
|
|
337
|
+
],
|
|
106
338
|
"description": "The pinned provider account (0.76.0, Basecamp; 0.78.0, SharePoint; 0.86.0, Teams — the name keeps its 0.76.0 spelling so consumers need not move): the one account, among those IT's own provider sign-in belongs to, that every user token on this connection must also belong to and that every resource id in `channels` lives in. For Basecamp the account (digits); for SharePoint and Teams the Microsoft 365 tenant (the Entra tenant GUID). Absent until IT chooses it; governance refuses every basecamp.*, sharepoint.* and teams.* call until then. The seven personal Google Workspace and Microsoft 365 providers carry none.",
|
|
107
339
|
"properties": {
|
|
108
|
-
"id": {
|
|
109
|
-
|
|
340
|
+
"id": {
|
|
341
|
+
"type": "string",
|
|
342
|
+
"pattern": "^[A-Za-z0-9-]{1,64}$",
|
|
343
|
+
"description": "The Basecamp account id (digits, the first path segment of the API base URL) or the Microsoft Entra tenant id (a GUID, the `tid` claim)."
|
|
344
|
+
},
|
|
345
|
+
"name": {
|
|
346
|
+
"type": "string",
|
|
347
|
+
"minLength": 1,
|
|
348
|
+
"maxLength": 120,
|
|
349
|
+
"description": "The account's name as the provider shows it (a Basecamp account name, a Microsoft 365 organisation display name), for IT to recognise."
|
|
350
|
+
}
|
|
110
351
|
}
|
|
111
352
|
},
|
|
112
353
|
"SaasOauthClient": {
|
|
113
354
|
"type": "object",
|
|
114
355
|
"additionalProperties": false,
|
|
115
|
-
"required": [
|
|
356
|
+
"required": [
|
|
357
|
+
"clientId",
|
|
358
|
+
"secretRef",
|
|
359
|
+
"setAt",
|
|
360
|
+
"setBy"
|
|
361
|
+
],
|
|
116
362
|
"description": "The tenant's own OAuth client for this provider (0.71.0; the ADR 0068 follow-up): when present, installation and user consent run through the company's Slack app or Google Cloud project instead of the platform-owned one, so the tenant's IT sees and controls the app in their own admin console. A reference to the secret, never the secret.",
|
|
117
363
|
"properties": {
|
|
118
|
-
"clientId": {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
364
|
+
"clientId": {
|
|
365
|
+
"type": "string",
|
|
366
|
+
"minLength": 1,
|
|
367
|
+
"maxLength": 255
|
|
368
|
+
},
|
|
369
|
+
"secretRef": {
|
|
370
|
+
"type": "string",
|
|
371
|
+
"pattern": "^secretref://[A-Za-z0-9][A-Za-z0-9/_.:-]*$",
|
|
372
|
+
"description": "Where the client secret lives."
|
|
373
|
+
},
|
|
374
|
+
"setAt": {
|
|
375
|
+
"type": "string",
|
|
376
|
+
"format": "date-time"
|
|
377
|
+
},
|
|
378
|
+
"setBy": {
|
|
379
|
+
"type": "string",
|
|
380
|
+
"minLength": 1,
|
|
381
|
+
"maxLength": 255,
|
|
382
|
+
"description": "The IT admin who saved it (lower-cased email)."
|
|
383
|
+
}
|
|
122
384
|
}
|
|
123
385
|
},
|
|
124
386
|
"UserModeApproval": {
|
|
125
387
|
"type": "string",
|
|
126
|
-
"enum": [
|
|
388
|
+
"enum": [
|
|
389
|
+
"automatic",
|
|
390
|
+
"it"
|
|
391
|
+
],
|
|
127
392
|
"description": "How a user-mode access request on this connection is approved (0.71.0): automatic — the person's own consent is the approval, since the app only ever acts as them; it — an IT admin reviews it like an app-mode request. Absent means it."
|
|
128
393
|
},
|
|
129
394
|
"DirectMessagePolicy": {
|
|
130
395
|
"type": "object",
|
|
131
396
|
"additionalProperties": false,
|
|
132
|
-
"required": [
|
|
397
|
+
"required": [
|
|
398
|
+
"allowed",
|
|
399
|
+
"dailyRecipientCap"
|
|
400
|
+
],
|
|
133
401
|
"description": "Whom an app may direct-message through slack.dm.send (0.71.0), set by IT on the connection and enforced by governance on every send.",
|
|
134
402
|
"properties": {
|
|
135
|
-
"allowed": {
|
|
136
|
-
|
|
137
|
-
|
|
403
|
+
"allowed": {
|
|
404
|
+
"$ref": "#/definitions/DirectMessageAudience"
|
|
405
|
+
},
|
|
406
|
+
"channel": {
|
|
407
|
+
"$ref": "app-integrations-declaration.schema.json#/definitions/IntegrationAlias",
|
|
408
|
+
"description": "channel_members only: the alias (a key of `channels`) whose current members may be messaged."
|
|
409
|
+
},
|
|
410
|
+
"dailyRecipientCap": {
|
|
411
|
+
"type": "integer",
|
|
412
|
+
"minimum": 1,
|
|
413
|
+
"maximum": 1000,
|
|
414
|
+
"description": "Distinct recipients one app may message per UTC day on this connection; the cap refuses the send that would exceed it."
|
|
415
|
+
}
|
|
138
416
|
},
|
|
139
|
-
"if": {
|
|
140
|
-
|
|
141
|
-
|
|
417
|
+
"if": {
|
|
418
|
+
"properties": {
|
|
419
|
+
"allowed": {
|
|
420
|
+
"const": "channel_members"
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
},
|
|
424
|
+
"then": {
|
|
425
|
+
"required": [
|
|
426
|
+
"channel"
|
|
427
|
+
]
|
|
428
|
+
},
|
|
429
|
+
"else": {
|
|
430
|
+
"not": {
|
|
431
|
+
"required": [
|
|
432
|
+
"channel"
|
|
433
|
+
]
|
|
434
|
+
}
|
|
435
|
+
}
|
|
142
436
|
},
|
|
143
437
|
"DirectMessageAudience": {
|
|
144
438
|
"type": "string",
|
|
145
|
-
"enum": [
|
|
439
|
+
"enum": [
|
|
440
|
+
"signed_in_person",
|
|
441
|
+
"channel_members",
|
|
442
|
+
"anyone"
|
|
443
|
+
],
|
|
146
444
|
"description": "signed_in_person — only the person using the app; channel_members — the members of the named channel; anyone — any workspace member."
|
|
147
445
|
},
|
|
148
446
|
"ExternalRecipientPolicy": {
|
|
149
447
|
"type": "object",
|
|
150
448
|
"additionalProperties": false,
|
|
151
|
-
"required": [
|
|
449
|
+
"required": [
|
|
450
|
+
"mode"
|
|
451
|
+
],
|
|
152
452
|
"description": "Whether a gmail.message.send may address people outside the company (0.71.0). An external recipient is one whose email domain is not one of the tenant's verified domains.",
|
|
153
453
|
"properties": {
|
|
154
|
-
"mode": {
|
|
454
|
+
"mode": {
|
|
455
|
+
"$ref": "#/definitions/ExternalRecipientMode"
|
|
456
|
+
},
|
|
155
457
|
"allowedDomains": {
|
|
156
458
|
"type": "array",
|
|
157
459
|
"minItems": 1,
|
|
158
460
|
"maxItems": 50,
|
|
159
461
|
"uniqueItems": true,
|
|
160
|
-
"items": {
|
|
462
|
+
"items": {
|
|
463
|
+
"type": "string",
|
|
464
|
+
"format": "hostname",
|
|
465
|
+
"maxLength": 253
|
|
466
|
+
},
|
|
161
467
|
"description": "allowlist only: the external domains a send may address; a recipient's domain must equal one of them."
|
|
162
468
|
}
|
|
163
469
|
},
|
|
164
|
-
"if": {
|
|
165
|
-
|
|
166
|
-
|
|
470
|
+
"if": {
|
|
471
|
+
"properties": {
|
|
472
|
+
"mode": {
|
|
473
|
+
"const": "allowlist"
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
},
|
|
477
|
+
"then": {
|
|
478
|
+
"required": [
|
|
479
|
+
"allowedDomains"
|
|
480
|
+
]
|
|
481
|
+
},
|
|
482
|
+
"else": {
|
|
483
|
+
"not": {
|
|
484
|
+
"required": [
|
|
485
|
+
"allowedDomains"
|
|
486
|
+
]
|
|
487
|
+
}
|
|
488
|
+
}
|
|
167
489
|
},
|
|
168
490
|
"ExternalRecipientMode": {
|
|
169
491
|
"type": "string",
|
|
170
|
-
"enum": [
|
|
492
|
+
"enum": [
|
|
493
|
+
"block",
|
|
494
|
+
"allowlist",
|
|
495
|
+
"allow"
|
|
496
|
+
],
|
|
171
497
|
"description": "block — every recipient must be internal (what a new Gmail connection is given; a connection stored without a policy reads as allow); allowlist — internal or in `allowedDomains`; allow — any address."
|
|
172
498
|
},
|
|
173
499
|
"SaasConnectionStatus": {
|
|
174
500
|
"type": "string",
|
|
175
|
-
"enum": [
|
|
501
|
+
"enum": [
|
|
502
|
+
"ACTIVE",
|
|
503
|
+
"DISABLED"
|
|
504
|
+
],
|
|
176
505
|
"description": "DISABLED stops every app call immediately (details.code CONNECTION_DISABLED)."
|
|
177
506
|
},
|
|
178
507
|
"SaasInstallationStatus": {
|
|
179
508
|
"type": "string",
|
|
180
|
-
"enum": [
|
|
509
|
+
"enum": [
|
|
510
|
+
"installed",
|
|
511
|
+
"reconnect_required",
|
|
512
|
+
"revoked"
|
|
513
|
+
]
|
|
181
514
|
},
|
|
182
515
|
"SaasInstallation": {
|
|
183
516
|
"type": "object",
|
|
184
517
|
"additionalProperties": false,
|
|
185
|
-
"required": [
|
|
518
|
+
"required": [
|
|
519
|
+
"tokenRecordId",
|
|
520
|
+
"workspaceId",
|
|
521
|
+
"botUserId",
|
|
522
|
+
"status",
|
|
523
|
+
"installedAt"
|
|
524
|
+
],
|
|
186
525
|
"description": "The one bot installation of the platform-owned provider app in this tenant's workspace.",
|
|
187
526
|
"properties": {
|
|
188
|
-
"tokenRecordId": {
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
"
|
|
194
|
-
|
|
527
|
+
"tokenRecordId": {
|
|
528
|
+
"type": "string",
|
|
529
|
+
"minLength": 1,
|
|
530
|
+
"maxLength": 128
|
|
531
|
+
},
|
|
532
|
+
"workspaceId": {
|
|
533
|
+
"type": "string",
|
|
534
|
+
"minLength": 1,
|
|
535
|
+
"maxLength": 128
|
|
536
|
+
},
|
|
537
|
+
"botUserId": {
|
|
538
|
+
"type": "string",
|
|
539
|
+
"maxLength": 128,
|
|
540
|
+
"description": "Empty only for a legacy record normalised without one."
|
|
541
|
+
},
|
|
542
|
+
"status": {
|
|
543
|
+
"$ref": "#/definitions/SaasInstallationStatus"
|
|
544
|
+
},
|
|
545
|
+
"installedAt": {
|
|
546
|
+
"type": "string",
|
|
547
|
+
"format": "date-time"
|
|
548
|
+
},
|
|
549
|
+
"scopes": {
|
|
550
|
+
"type": "array",
|
|
551
|
+
"maxItems": 64,
|
|
552
|
+
"uniqueItems": true,
|
|
553
|
+
"items": {
|
|
554
|
+
"type": "string",
|
|
555
|
+
"minLength": 1,
|
|
556
|
+
"maxLength": 64
|
|
557
|
+
},
|
|
558
|
+
"description": "The bot scopes Slack granted at installation (0.53.0). Absent on installations recorded before it, which therefore lack chat:write.customize: per-app display names need a reinstall."
|
|
559
|
+
},
|
|
560
|
+
"botName": {
|
|
561
|
+
"type": "string",
|
|
562
|
+
"minLength": 1,
|
|
563
|
+
"maxLength": 128,
|
|
564
|
+
"description": "The installed bot user's Slack username as auth.test reported it at installation (0.54.0), e.g. `isomorph_ai` — what a person types after /invite. Absent on installations recorded before it."
|
|
565
|
+
}
|
|
195
566
|
}
|
|
196
567
|
},
|
|
197
568
|
"DevelopmentPreapproval": {
|
|
198
569
|
"type": "object",
|
|
199
570
|
"additionalProperties": false,
|
|
200
|
-
"required": [
|
|
571
|
+
"required": [
|
|
572
|
+
"enabled",
|
|
573
|
+
"hours"
|
|
574
|
+
],
|
|
201
575
|
"properties": {
|
|
202
|
-
"enabled": {
|
|
203
|
-
|
|
576
|
+
"enabled": {
|
|
577
|
+
"type": "boolean",
|
|
578
|
+
"description": "Auto-approve development requests within the allowlist."
|
|
579
|
+
},
|
|
580
|
+
"hours": {
|
|
581
|
+
"type": "integer",
|
|
582
|
+
"minimum": 1,
|
|
583
|
+
"maximum": 168,
|
|
584
|
+
"description": "Development grant duration; default 24."
|
|
585
|
+
}
|
|
204
586
|
}
|
|
205
587
|
},
|
|
206
|
-
"InstallationName": {
|
|
588
|
+
"InstallationName": {
|
|
589
|
+
"type": "string",
|
|
590
|
+
"pattern": "^[a-z][a-z0-9_-]{0,62}$",
|
|
591
|
+
"deprecated": true
|
|
592
|
+
},
|
|
207
593
|
"SaasEnvironmentMapping": {
|
|
208
594
|
"type": "object",
|
|
209
595
|
"additionalProperties": false,
|
|
210
|
-
"required": [
|
|
596
|
+
"required": [
|
|
597
|
+
"installation",
|
|
598
|
+
"channels"
|
|
599
|
+
],
|
|
211
600
|
"deprecated": true,
|
|
212
601
|
"properties": {
|
|
213
|
-
"installation": {
|
|
602
|
+
"installation": {
|
|
603
|
+
"$ref": "#/definitions/InstallationName"
|
|
604
|
+
},
|
|
214
605
|
"channels": {
|
|
215
606
|
"type": "object",
|
|
216
607
|
"maxProperties": 64,
|
|
217
|
-
"propertyNames": {
|
|
218
|
-
|
|
608
|
+
"propertyNames": {
|
|
609
|
+
"$ref": "app-integrations-declaration.schema.json#/definitions/IntegrationAlias"
|
|
610
|
+
},
|
|
611
|
+
"additionalProperties": {
|
|
612
|
+
"type": "string",
|
|
613
|
+
"pattern": "^[A-Z0-9]{1,32}$"
|
|
614
|
+
}
|
|
219
615
|
}
|
|
220
616
|
}
|
|
221
617
|
},
|
|
@@ -224,10 +620,29 @@
|
|
|
224
620
|
"additionalProperties": false,
|
|
225
621
|
"deprecated": true,
|
|
226
622
|
"properties": {
|
|
227
|
-
"tokenRecordId": {
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
623
|
+
"tokenRecordId": {
|
|
624
|
+
"type": "string",
|
|
625
|
+
"minLength": 1,
|
|
626
|
+
"maxLength": 128
|
|
627
|
+
},
|
|
628
|
+
"workspaceId": {
|
|
629
|
+
"type": "string",
|
|
630
|
+
"minLength": 1,
|
|
631
|
+
"maxLength": 128
|
|
632
|
+
},
|
|
633
|
+
"botUserId": {
|
|
634
|
+
"type": "string",
|
|
635
|
+
"minLength": 1,
|
|
636
|
+
"maxLength": 128
|
|
637
|
+
},
|
|
638
|
+
"status": {
|
|
639
|
+
"type": "string",
|
|
640
|
+
"enum": [
|
|
641
|
+
"ACTIVE",
|
|
642
|
+
"RECONNECT_REQUIRED",
|
|
643
|
+
"REVOKED"
|
|
644
|
+
]
|
|
645
|
+
}
|
|
231
646
|
}
|
|
232
647
|
}
|
|
233
648
|
},
|
|
@@ -241,14 +656,50 @@
|
|
|
241
656
|
"displayName": "Company Slack",
|
|
242
657
|
"status": "ACTIVE",
|
|
243
658
|
"version": 3,
|
|
244
|
-
"installation": {
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
659
|
+
"installation": {
|
|
660
|
+
"tokenRecordId": "tok_workspace",
|
|
661
|
+
"workspaceId": "T0WORKSPACE",
|
|
662
|
+
"botUserId": "U0BOT",
|
|
663
|
+
"status": "installed",
|
|
664
|
+
"installedAt": "2026-09-09T08:00:00Z",
|
|
665
|
+
"scopes": [
|
|
666
|
+
"channels:read",
|
|
667
|
+
"chat:write",
|
|
668
|
+
"chat:write.customize"
|
|
669
|
+
],
|
|
670
|
+
"botName": "isomorph_ai"
|
|
671
|
+
},
|
|
672
|
+
"channels": {
|
|
673
|
+
"team-updates": "C0123TEAM"
|
|
674
|
+
},
|
|
675
|
+
"operations": [
|
|
676
|
+
"slack.channel.history",
|
|
677
|
+
"slack.message.post",
|
|
678
|
+
"slack.message.update",
|
|
679
|
+
"slack.message.delete",
|
|
680
|
+
"slack.dm.send",
|
|
681
|
+
"slack.user.lookup"
|
|
682
|
+
],
|
|
683
|
+
"developmentPreapproval": {
|
|
684
|
+
"enabled": true,
|
|
685
|
+
"hours": 24
|
|
686
|
+
},
|
|
687
|
+
"oauthClient": {
|
|
688
|
+
"clientId": "1234567890.1234567890",
|
|
689
|
+
"secretRef": "secretref://tenant/fourier/saas/company-slack/oauth-client",
|
|
690
|
+
"setAt": "2026-10-01T08:00:00Z",
|
|
691
|
+
"setBy": "it-admin@example.com"
|
|
692
|
+
},
|
|
249
693
|
"userModeApproval": "automatic",
|
|
250
|
-
"directMessages": {
|
|
251
|
-
|
|
694
|
+
"directMessages": {
|
|
695
|
+
"allowed": "channel_members",
|
|
696
|
+
"channel": "team-updates",
|
|
697
|
+
"dailyRecipientCap": 50
|
|
698
|
+
},
|
|
699
|
+
"approvers": [
|
|
700
|
+
"slack-owner@example.com",
|
|
701
|
+
"it-lead@example.com"
|
|
702
|
+
],
|
|
252
703
|
"createdAt": "2026-09-09T08:00:00Z",
|
|
253
704
|
"updatedAt": "2026-09-09T08:00:00Z"
|
|
254
705
|
},
|
|
@@ -262,10 +713,26 @@
|
|
|
262
713
|
"status": "ACTIVE",
|
|
263
714
|
"version": 1,
|
|
264
715
|
"channels": {},
|
|
265
|
-
"operations": [
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
716
|
+
"operations": [
|
|
717
|
+
"gmail.thread.list",
|
|
718
|
+
"gmail.thread.read",
|
|
719
|
+
"gmail.message.read",
|
|
720
|
+
"gmail.message.send",
|
|
721
|
+
"gmail.attachment.read"
|
|
722
|
+
],
|
|
723
|
+
"developmentPreapproval": {
|
|
724
|
+
"enabled": false,
|
|
725
|
+
"hours": 24
|
|
726
|
+
},
|
|
727
|
+
"blockedDevelopmentBuilders": [
|
|
728
|
+
"contractor@example.com"
|
|
729
|
+
],
|
|
730
|
+
"externalRecipients": {
|
|
731
|
+
"mode": "allowlist",
|
|
732
|
+
"allowedDomains": [
|
|
733
|
+
"partner.example.com"
|
|
734
|
+
]
|
|
735
|
+
},
|
|
269
736
|
"createdAt": "2026-09-11T08:00:00Z",
|
|
270
737
|
"updatedAt": "2026-09-11T08:00:00Z"
|
|
271
738
|
},
|
|
@@ -278,10 +745,30 @@
|
|
|
278
745
|
"displayName": "Company Basecamp",
|
|
279
746
|
"status": "ACTIVE",
|
|
280
747
|
"version": 2,
|
|
281
|
-
"account": {
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
748
|
+
"account": {
|
|
749
|
+
"id": "195539477",
|
|
750
|
+
"name": "Fourier Labs"
|
|
751
|
+
},
|
|
752
|
+
"channels": {
|
|
753
|
+
"launch": "2085958499"
|
|
754
|
+
},
|
|
755
|
+
"operations": [
|
|
756
|
+
"basecamp.project.list",
|
|
757
|
+
"basecamp.todolist.list",
|
|
758
|
+
"basecamp.todo.list",
|
|
759
|
+
"basecamp.todo.create",
|
|
760
|
+
"basecamp.todo.complete",
|
|
761
|
+
"basecamp.message.list",
|
|
762
|
+
"basecamp.message.post",
|
|
763
|
+
"basecamp.comment.list",
|
|
764
|
+
"basecamp.comment.post",
|
|
765
|
+
"basecamp.campfire.post",
|
|
766
|
+
"basecamp.people.list"
|
|
767
|
+
],
|
|
768
|
+
"developmentPreapproval": {
|
|
769
|
+
"enabled": true,
|
|
770
|
+
"hours": 24
|
|
771
|
+
},
|
|
285
772
|
"userModeApproval": "automatic",
|
|
286
773
|
"createdAt": "2026-10-11T08:00:00Z",
|
|
287
774
|
"updatedAt": "2026-10-11T08:00:00Z"
|
|
@@ -295,10 +782,28 @@
|
|
|
295
782
|
"displayName": "Company SharePoint",
|
|
296
783
|
"status": "ACTIVE",
|
|
297
784
|
"version": 2,
|
|
298
|
-
"account": {
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
785
|
+
"account": {
|
|
786
|
+
"id": "3f2c9b1e-7d4a-4c6b-9e8f-0a1b2c3d4e5f",
|
|
787
|
+
"name": "Fourier Labs"
|
|
788
|
+
},
|
|
789
|
+
"channels": {
|
|
790
|
+
"intranet": "fourier.sharepoint.com,8a1c6f2e-3b4d-4e5f-9a0b-1c2d3e4f5a6b,0f1e2d3c-4b5a-4968-8776-655443322110"
|
|
791
|
+
},
|
|
792
|
+
"operations": [
|
|
793
|
+
"sharepoint.list.list",
|
|
794
|
+
"sharepoint.item.list",
|
|
795
|
+
"sharepoint.item.create",
|
|
796
|
+
"sharepoint.item.update",
|
|
797
|
+
"sharepoint.drive.list",
|
|
798
|
+
"sharepoint.file.list",
|
|
799
|
+
"sharepoint.file.search",
|
|
800
|
+
"sharepoint.file.read",
|
|
801
|
+
"sharepoint.file.upload"
|
|
802
|
+
],
|
|
803
|
+
"developmentPreapproval": {
|
|
804
|
+
"enabled": true,
|
|
805
|
+
"hours": 24
|
|
806
|
+
},
|
|
302
807
|
"userModeApproval": "automatic",
|
|
303
808
|
"createdAt": "2026-10-11T08:00:00Z",
|
|
304
809
|
"updatedAt": "2026-10-11T08:00:00Z"
|
|
@@ -312,9 +817,17 @@
|
|
|
312
817
|
"displayName": "Agent phone lines",
|
|
313
818
|
"status": "ACTIVE",
|
|
314
819
|
"version": 1,
|
|
315
|
-
"channels": {
|
|
316
|
-
|
|
317
|
-
|
|
820
|
+
"channels": {
|
|
821
|
+
"gstn-line": "+919876543210"
|
|
822
|
+
},
|
|
823
|
+
"operations": [
|
|
824
|
+
"phone.sms.list",
|
|
825
|
+
"phone.number.get"
|
|
826
|
+
],
|
|
827
|
+
"developmentPreapproval": {
|
|
828
|
+
"enabled": false,
|
|
829
|
+
"hours": 24
|
|
830
|
+
},
|
|
318
831
|
"createdAt": "2026-10-17T08:00:00Z",
|
|
319
832
|
"updatedAt": "2026-10-17T08:00:00Z"
|
|
320
833
|
},
|
|
@@ -328,8 +841,18 @@
|
|
|
328
841
|
"status": "ACTIVE",
|
|
329
842
|
"version": 1,
|
|
330
843
|
"channels": {},
|
|
331
|
-
"operations": [
|
|
332
|
-
|
|
844
|
+
"operations": [
|
|
845
|
+
"calendar.calendar.list",
|
|
846
|
+
"calendar.event.list",
|
|
847
|
+
"calendar.event.read",
|
|
848
|
+
"calendar.event.create",
|
|
849
|
+
"calendar.event.update",
|
|
850
|
+
"calendar.event.cancel"
|
|
851
|
+
],
|
|
852
|
+
"developmentPreapproval": {
|
|
853
|
+
"enabled": true,
|
|
854
|
+
"hours": 24
|
|
855
|
+
},
|
|
333
856
|
"userModeApproval": "automatic",
|
|
334
857
|
"createdAt": "2026-10-17T08:00:00Z",
|
|
335
858
|
"updatedAt": "2026-10-17T08:00:00Z"
|
|
@@ -344,9 +867,23 @@
|
|
|
344
867
|
"status": "ACTIVE",
|
|
345
868
|
"version": 2,
|
|
346
869
|
"channels": {},
|
|
347
|
-
"operations": [
|
|
348
|
-
|
|
349
|
-
|
|
870
|
+
"operations": [
|
|
871
|
+
"drive.file.list",
|
|
872
|
+
"drive.file.search",
|
|
873
|
+
"drive.file.read",
|
|
874
|
+
"drive.file.upload",
|
|
875
|
+
"drive.folder.create"
|
|
876
|
+
],
|
|
877
|
+
"developmentPreapproval": {
|
|
878
|
+
"enabled": true,
|
|
879
|
+
"hours": 24
|
|
880
|
+
},
|
|
881
|
+
"oauthClient": {
|
|
882
|
+
"clientId": "987334312340-abc123def456.apps.googleusercontent.com",
|
|
883
|
+
"secretRef": "secretref://tenant/fourier/saas/company-drive/oauth-client",
|
|
884
|
+
"setAt": "2026-10-17T08:00:00Z",
|
|
885
|
+
"setBy": "it-admin@example.com"
|
|
886
|
+
},
|
|
350
887
|
"userModeApproval": "it",
|
|
351
888
|
"createdAt": "2026-10-17T08:00:00Z",
|
|
352
889
|
"updatedAt": "2026-10-17T08:00:00Z"
|
|
@@ -361,8 +898,16 @@
|
|
|
361
898
|
"status": "ACTIVE",
|
|
362
899
|
"version": 1,
|
|
363
900
|
"channels": {},
|
|
364
|
-
"operations": [
|
|
365
|
-
|
|
901
|
+
"operations": [
|
|
902
|
+
"docs.document.read",
|
|
903
|
+
"docs.document.create",
|
|
904
|
+
"docs.document.append",
|
|
905
|
+
"docs.text.replace"
|
|
906
|
+
],
|
|
907
|
+
"developmentPreapproval": {
|
|
908
|
+
"enabled": true,
|
|
909
|
+
"hours": 24
|
|
910
|
+
},
|
|
366
911
|
"userModeApproval": "automatic",
|
|
367
912
|
"createdAt": "2026-10-17T08:00:00Z",
|
|
368
913
|
"updatedAt": "2026-10-17T08:00:00Z"
|
|
@@ -377,10 +922,24 @@
|
|
|
377
922
|
"status": "ACTIVE",
|
|
378
923
|
"version": 1,
|
|
379
924
|
"channels": {},
|
|
380
|
-
"operations": [
|
|
381
|
-
|
|
925
|
+
"operations": [
|
|
926
|
+
"sheets.spreadsheet.read",
|
|
927
|
+
"sheets.values.read",
|
|
928
|
+
"sheets.values.append",
|
|
929
|
+
"sheets.values.update",
|
|
930
|
+
"sheets.values.clear",
|
|
931
|
+
"sheets.spreadsheet.create"
|
|
932
|
+
],
|
|
933
|
+
"developmentPreapproval": {
|
|
934
|
+
"enabled": true,
|
|
935
|
+
"hours": 24
|
|
936
|
+
},
|
|
382
937
|
"userModeApproval": "it",
|
|
383
|
-
"startedBy": {
|
|
938
|
+
"startedBy": {
|
|
939
|
+
"email": "builder@example.com",
|
|
940
|
+
"at": "2026-10-17T08:00:00Z",
|
|
941
|
+
"appId": "app-7f3a2c91"
|
|
942
|
+
},
|
|
384
943
|
"createdAt": "2026-10-17T08:00:00Z",
|
|
385
944
|
"updatedAt": "2026-10-17T08:00:00Z"
|
|
386
945
|
},
|
|
@@ -394,10 +953,26 @@
|
|
|
394
953
|
"status": "ACTIVE",
|
|
395
954
|
"version": 1,
|
|
396
955
|
"channels": {},
|
|
397
|
-
"operations": [
|
|
398
|
-
|
|
956
|
+
"operations": [
|
|
957
|
+
"outlook.message.list",
|
|
958
|
+
"outlook.message.read",
|
|
959
|
+
"outlook.attachment.read",
|
|
960
|
+
"outlook.message.send",
|
|
961
|
+
"outlook.message.reply",
|
|
962
|
+
"outlook.event.list",
|
|
963
|
+
"outlook.event.read",
|
|
964
|
+
"outlook.event.create",
|
|
965
|
+
"outlook.event.update",
|
|
966
|
+
"outlook.event.cancel"
|
|
967
|
+
],
|
|
968
|
+
"developmentPreapproval": {
|
|
969
|
+
"enabled": false,
|
|
970
|
+
"hours": 24
|
|
971
|
+
},
|
|
399
972
|
"userModeApproval": "it",
|
|
400
|
-
"externalRecipients": {
|
|
973
|
+
"externalRecipients": {
|
|
974
|
+
"mode": "block"
|
|
975
|
+
},
|
|
401
976
|
"createdAt": "2026-10-17T08:00:00Z",
|
|
402
977
|
"updatedAt": "2026-10-17T08:00:00Z"
|
|
403
978
|
},
|
|
@@ -411,8 +986,17 @@
|
|
|
411
986
|
"status": "ACTIVE",
|
|
412
987
|
"version": 1,
|
|
413
988
|
"channels": {},
|
|
414
|
-
"operations": [
|
|
415
|
-
|
|
989
|
+
"operations": [
|
|
990
|
+
"onedrive.file.list",
|
|
991
|
+
"onedrive.file.search",
|
|
992
|
+
"onedrive.file.read",
|
|
993
|
+
"onedrive.file.upload",
|
|
994
|
+
"onedrive.folder.create"
|
|
995
|
+
],
|
|
996
|
+
"developmentPreapproval": {
|
|
997
|
+
"enabled": true,
|
|
998
|
+
"hours": 24
|
|
999
|
+
},
|
|
416
1000
|
"userModeApproval": "automatic",
|
|
417
1001
|
"createdAt": "2026-10-17T08:00:00Z",
|
|
418
1002
|
"updatedAt": "2026-10-17T08:00:00Z"
|
|
@@ -427,8 +1011,18 @@
|
|
|
427
1011
|
"status": "ACTIVE",
|
|
428
1012
|
"version": 1,
|
|
429
1013
|
"channels": {},
|
|
430
|
-
"operations": [
|
|
431
|
-
|
|
1014
|
+
"operations": [
|
|
1015
|
+
"excel.worksheet.list",
|
|
1016
|
+
"excel.range.read",
|
|
1017
|
+
"excel.range.update",
|
|
1018
|
+
"excel.table.list",
|
|
1019
|
+
"excel.row.add",
|
|
1020
|
+
"excel.worksheet.add"
|
|
1021
|
+
],
|
|
1022
|
+
"developmentPreapproval": {
|
|
1023
|
+
"enabled": true,
|
|
1024
|
+
"hours": 24
|
|
1025
|
+
},
|
|
432
1026
|
"userModeApproval": "automatic",
|
|
433
1027
|
"createdAt": "2026-10-17T08:00:00Z",
|
|
434
1028
|
"updatedAt": "2026-10-17T08:00:00Z"
|
|
@@ -442,10 +1036,22 @@
|
|
|
442
1036
|
"displayName": "Company Teams",
|
|
443
1037
|
"status": "ACTIVE",
|
|
444
1038
|
"version": 2,
|
|
445
|
-
"account": {
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
1039
|
+
"account": {
|
|
1040
|
+
"id": "3f2c9b1e-7d4a-4c6b-9e8f-0a1b2c3d4e5f",
|
|
1041
|
+
"name": "Fourier Labs"
|
|
1042
|
+
},
|
|
1043
|
+
"channels": {
|
|
1044
|
+
"engineering": "0f1e2d3c-4b5a-4968-8776-655443322110/19:a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6@thread.tacv2"
|
|
1045
|
+
},
|
|
1046
|
+
"operations": [
|
|
1047
|
+
"teams.message.list",
|
|
1048
|
+
"teams.message.post",
|
|
1049
|
+
"teams.reply.post"
|
|
1050
|
+
],
|
|
1051
|
+
"developmentPreapproval": {
|
|
1052
|
+
"enabled": true,
|
|
1053
|
+
"hours": 24
|
|
1054
|
+
},
|
|
449
1055
|
"userModeApproval": "automatic",
|
|
450
1056
|
"createdAt": "2026-10-17T08:00:00Z",
|
|
451
1057
|
"updatedAt": "2026-10-17T08:00:00Z"
|