@fourier-labs/harbour-contracts 0.90.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 +22 -22
- 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 +4 -4
- 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/saas-connection.d.ts +11 -7
- package/gen-ts/app-integrations-declaration.ts +8 -0
- package/gen-ts/contract-release.ts +6 -6
- package/gen-ts/data-grant-v2.ts +18 -2
- 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/saas-connection.ts +33 -4
- package/package.json +1 -1
- package/schema/app-integrations-declaration.schema.json +121 -9
- package/schema/data-grant-v2.schema.json +2 -2
- package/schema/integration-execute-request.schema.json +458 -7
- package/schema/integration-execute-result.schema.json +234 -2
- package/schema/saas-connection.schema.json +720 -138
|
@@ -5,68 +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
99
|
"automaticUserOperations": {
|
|
37
|
-
"type": "array",
|
|
38
|
-
"
|
|
39
|
-
"
|
|
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
|
+
},
|
|
40
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."
|
|
41
126
|
},
|
|
42
127
|
"reusableAccess": {
|
|
43
|
-
"type": "array",
|
|
44
|
-
"
|
|
128
|
+
"type": "array",
|
|
129
|
+
"maxItems": 128,
|
|
130
|
+
"uniqueItems": true,
|
|
131
|
+
"items": {
|
|
132
|
+
"$ref": "#/definitions/ReusableSaasAccess"
|
|
133
|
+
},
|
|
45
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."
|
|
46
135
|
},
|
|
47
|
-
"developmentPreapproval": {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
"
|
|
51
|
-
|
|
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
|
+
},
|
|
52
151
|
"blockedDevelopmentBuilders": {
|
|
53
152
|
"type": "array",
|
|
54
153
|
"maxItems": 256,
|
|
55
154
|
"uniqueItems": true,
|
|
56
|
-
"items": {
|
|
155
|
+
"items": {
|
|
156
|
+
"type": "string",
|
|
157
|
+
"minLength": 1,
|
|
158
|
+
"maxLength": 255
|
|
159
|
+
},
|
|
57
160
|
"description": "Lower-cased builder emails excluded from development preapproval."
|
|
58
161
|
},
|
|
59
162
|
"approvers": {
|
|
60
163
|
"type": "array",
|
|
61
164
|
"maxItems": 20,
|
|
62
165
|
"uniqueItems": true,
|
|
63
|
-
"items": {
|
|
166
|
+
"items": {
|
|
167
|
+
"$ref": "integration-execute-request.schema.json#/definitions/EmailAddress"
|
|
168
|
+
},
|
|
64
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."
|
|
65
170
|
},
|
|
66
|
-
"startedBy": {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
"
|
|
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
|
+
},
|
|
70
189
|
"clientSecretRef": {
|
|
71
190
|
"type": "string",
|
|
72
191
|
"pattern": "^secretref://[A-Za-z0-9][A-Za-z0-9/_.:-]*$",
|
|
@@ -80,166 +199,419 @@
|
|
|
80
199
|
"deprecated": true,
|
|
81
200
|
"description": "Deprecated pre-T25 per-environment mapping. On read the development entry's channels become `channels`; never written.",
|
|
82
201
|
"properties": {
|
|
83
|
-
"development": {
|
|
84
|
-
|
|
85
|
-
|
|
202
|
+
"development": {
|
|
203
|
+
"$ref": "#/definitions/SaasEnvironmentMapping"
|
|
204
|
+
},
|
|
205
|
+
"preview": {
|
|
206
|
+
"$ref": "#/definitions/SaasEnvironmentMapping"
|
|
207
|
+
},
|
|
208
|
+
"production": {
|
|
209
|
+
"$ref": "#/definitions/SaasEnvironmentMapping"
|
|
210
|
+
}
|
|
86
211
|
}
|
|
87
212
|
},
|
|
88
213
|
"installations": {
|
|
89
214
|
"type": "object",
|
|
90
|
-
"propertyNames": {
|
|
91
|
-
|
|
215
|
+
"propertyNames": {
|
|
216
|
+
"$ref": "#/definitions/InstallationName"
|
|
217
|
+
},
|
|
218
|
+
"additionalProperties": {
|
|
219
|
+
"$ref": "#/definitions/LegacySaasInstallation"
|
|
220
|
+
},
|
|
92
221
|
"deprecated": true,
|
|
93
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."
|
|
94
238
|
}
|
|
95
239
|
},
|
|
96
240
|
"definitions": {
|
|
97
241
|
"ReusableSaasAccess": {
|
|
98
|
-
"type": "object",
|
|
99
|
-
"
|
|
242
|
+
"type": "object",
|
|
243
|
+
"additionalProperties": false,
|
|
244
|
+
"required": [
|
|
245
|
+
"resource",
|
|
246
|
+
"mode",
|
|
247
|
+
"operations"
|
|
248
|
+
],
|
|
100
249
|
"properties": {
|
|
101
|
-
"resource": {
|
|
102
|
-
|
|
250
|
+
"resource": {
|
|
251
|
+
"$ref": "app-integrations-declaration.schema.json#/definitions/IntegrationAlias"
|
|
252
|
+
},
|
|
253
|
+
"mode": {
|
|
254
|
+
"$ref": "app-integrations-declaration.schema.json#/definitions/IntegrationIdentityMode"
|
|
255
|
+
},
|
|
103
256
|
"operations": {
|
|
104
|
-
"type": "array",
|
|
105
|
-
"
|
|
106
|
-
"
|
|
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
|
+
}
|
|
107
283
|
}
|
|
108
284
|
}
|
|
109
285
|
},
|
|
110
286
|
"SaasProvider": {
|
|
111
287
|
"type": "string",
|
|
112
|
-
"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
|
+
],
|
|
113
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`."
|
|
114
305
|
},
|
|
115
306
|
"StartedBy": {
|
|
116
307
|
"type": "object",
|
|
117
308
|
"additionalProperties": false,
|
|
118
|
-
"required": [
|
|
309
|
+
"required": [
|
|
310
|
+
"email",
|
|
311
|
+
"at"
|
|
312
|
+
],
|
|
119
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.",
|
|
120
314
|
"properties": {
|
|
121
|
-
"email": {
|
|
122
|
-
|
|
123
|
-
|
|
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
|
+
}
|
|
124
329
|
}
|
|
125
330
|
},
|
|
126
331
|
"BasecampAccount": {
|
|
127
332
|
"type": "object",
|
|
128
333
|
"additionalProperties": false,
|
|
129
|
-
"required": [
|
|
334
|
+
"required": [
|
|
335
|
+
"id",
|
|
336
|
+
"name"
|
|
337
|
+
],
|
|
130
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.",
|
|
131
339
|
"properties": {
|
|
132
|
-
"id": {
|
|
133
|
-
|
|
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
|
+
}
|
|
134
351
|
}
|
|
135
352
|
},
|
|
136
353
|
"SaasOauthClient": {
|
|
137
354
|
"type": "object",
|
|
138
355
|
"additionalProperties": false,
|
|
139
|
-
"required": [
|
|
356
|
+
"required": [
|
|
357
|
+
"clientId",
|
|
358
|
+
"secretRef",
|
|
359
|
+
"setAt",
|
|
360
|
+
"setBy"
|
|
361
|
+
],
|
|
140
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.",
|
|
141
363
|
"properties": {
|
|
142
|
-
"clientId": {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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
|
+
}
|
|
146
384
|
}
|
|
147
385
|
},
|
|
148
386
|
"UserModeApproval": {
|
|
149
387
|
"type": "string",
|
|
150
|
-
"enum": [
|
|
388
|
+
"enum": [
|
|
389
|
+
"automatic",
|
|
390
|
+
"it"
|
|
391
|
+
],
|
|
151
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."
|
|
152
393
|
},
|
|
153
394
|
"DirectMessagePolicy": {
|
|
154
395
|
"type": "object",
|
|
155
396
|
"additionalProperties": false,
|
|
156
|
-
"required": [
|
|
397
|
+
"required": [
|
|
398
|
+
"allowed",
|
|
399
|
+
"dailyRecipientCap"
|
|
400
|
+
],
|
|
157
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.",
|
|
158
402
|
"properties": {
|
|
159
|
-
"allowed": {
|
|
160
|
-
|
|
161
|
-
|
|
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
|
+
}
|
|
416
|
+
},
|
|
417
|
+
"if": {
|
|
418
|
+
"properties": {
|
|
419
|
+
"allowed": {
|
|
420
|
+
"const": "channel_members"
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
},
|
|
424
|
+
"then": {
|
|
425
|
+
"required": [
|
|
426
|
+
"channel"
|
|
427
|
+
]
|
|
162
428
|
},
|
|
163
|
-
"
|
|
164
|
-
|
|
165
|
-
|
|
429
|
+
"else": {
|
|
430
|
+
"not": {
|
|
431
|
+
"required": [
|
|
432
|
+
"channel"
|
|
433
|
+
]
|
|
434
|
+
}
|
|
435
|
+
}
|
|
166
436
|
},
|
|
167
437
|
"DirectMessageAudience": {
|
|
168
438
|
"type": "string",
|
|
169
|
-
"enum": [
|
|
439
|
+
"enum": [
|
|
440
|
+
"signed_in_person",
|
|
441
|
+
"channel_members",
|
|
442
|
+
"anyone"
|
|
443
|
+
],
|
|
170
444
|
"description": "signed_in_person — only the person using the app; channel_members — the members of the named channel; anyone — any workspace member."
|
|
171
445
|
},
|
|
172
446
|
"ExternalRecipientPolicy": {
|
|
173
447
|
"type": "object",
|
|
174
448
|
"additionalProperties": false,
|
|
175
|
-
"required": [
|
|
449
|
+
"required": [
|
|
450
|
+
"mode"
|
|
451
|
+
],
|
|
176
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.",
|
|
177
453
|
"properties": {
|
|
178
|
-
"mode": {
|
|
454
|
+
"mode": {
|
|
455
|
+
"$ref": "#/definitions/ExternalRecipientMode"
|
|
456
|
+
},
|
|
179
457
|
"allowedDomains": {
|
|
180
458
|
"type": "array",
|
|
181
459
|
"minItems": 1,
|
|
182
460
|
"maxItems": 50,
|
|
183
461
|
"uniqueItems": true,
|
|
184
|
-
"items": {
|
|
462
|
+
"items": {
|
|
463
|
+
"type": "string",
|
|
464
|
+
"format": "hostname",
|
|
465
|
+
"maxLength": 253
|
|
466
|
+
},
|
|
185
467
|
"description": "allowlist only: the external domains a send may address; a recipient's domain must equal one of them."
|
|
186
468
|
}
|
|
187
469
|
},
|
|
188
|
-
"if": {
|
|
189
|
-
|
|
190
|
-
|
|
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
|
+
}
|
|
191
489
|
},
|
|
192
490
|
"ExternalRecipientMode": {
|
|
193
491
|
"type": "string",
|
|
194
|
-
"enum": [
|
|
492
|
+
"enum": [
|
|
493
|
+
"block",
|
|
494
|
+
"allowlist",
|
|
495
|
+
"allow"
|
|
496
|
+
],
|
|
195
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."
|
|
196
498
|
},
|
|
197
499
|
"SaasConnectionStatus": {
|
|
198
500
|
"type": "string",
|
|
199
|
-
"enum": [
|
|
501
|
+
"enum": [
|
|
502
|
+
"ACTIVE",
|
|
503
|
+
"DISABLED"
|
|
504
|
+
],
|
|
200
505
|
"description": "DISABLED stops every app call immediately (details.code CONNECTION_DISABLED)."
|
|
201
506
|
},
|
|
202
507
|
"SaasInstallationStatus": {
|
|
203
508
|
"type": "string",
|
|
204
|
-
"enum": [
|
|
509
|
+
"enum": [
|
|
510
|
+
"installed",
|
|
511
|
+
"reconnect_required",
|
|
512
|
+
"revoked"
|
|
513
|
+
]
|
|
205
514
|
},
|
|
206
515
|
"SaasInstallation": {
|
|
207
516
|
"type": "object",
|
|
208
517
|
"additionalProperties": false,
|
|
209
|
-
"required": [
|
|
518
|
+
"required": [
|
|
519
|
+
"tokenRecordId",
|
|
520
|
+
"workspaceId",
|
|
521
|
+
"botUserId",
|
|
522
|
+
"status",
|
|
523
|
+
"installedAt"
|
|
524
|
+
],
|
|
210
525
|
"description": "The one bot installation of the platform-owned provider app in this tenant's workspace.",
|
|
211
526
|
"properties": {
|
|
212
|
-
"tokenRecordId": {
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
"
|
|
218
|
-
|
|
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
|
+
}
|
|
219
566
|
}
|
|
220
567
|
},
|
|
221
568
|
"DevelopmentPreapproval": {
|
|
222
569
|
"type": "object",
|
|
223
570
|
"additionalProperties": false,
|
|
224
|
-
"required": [
|
|
571
|
+
"required": [
|
|
572
|
+
"enabled",
|
|
573
|
+
"hours"
|
|
574
|
+
],
|
|
225
575
|
"properties": {
|
|
226
|
-
"enabled": {
|
|
227
|
-
|
|
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
|
+
}
|
|
228
586
|
}
|
|
229
587
|
},
|
|
230
|
-
"InstallationName": {
|
|
588
|
+
"InstallationName": {
|
|
589
|
+
"type": "string",
|
|
590
|
+
"pattern": "^[a-z][a-z0-9_-]{0,62}$",
|
|
591
|
+
"deprecated": true
|
|
592
|
+
},
|
|
231
593
|
"SaasEnvironmentMapping": {
|
|
232
594
|
"type": "object",
|
|
233
595
|
"additionalProperties": false,
|
|
234
|
-
"required": [
|
|
596
|
+
"required": [
|
|
597
|
+
"installation",
|
|
598
|
+
"channels"
|
|
599
|
+
],
|
|
235
600
|
"deprecated": true,
|
|
236
601
|
"properties": {
|
|
237
|
-
"installation": {
|
|
602
|
+
"installation": {
|
|
603
|
+
"$ref": "#/definitions/InstallationName"
|
|
604
|
+
},
|
|
238
605
|
"channels": {
|
|
239
606
|
"type": "object",
|
|
240
607
|
"maxProperties": 64,
|
|
241
|
-
"propertyNames": {
|
|
242
|
-
|
|
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
|
+
}
|
|
243
615
|
}
|
|
244
616
|
}
|
|
245
617
|
},
|
|
@@ -248,10 +620,29 @@
|
|
|
248
620
|
"additionalProperties": false,
|
|
249
621
|
"deprecated": true,
|
|
250
622
|
"properties": {
|
|
251
|
-
"tokenRecordId": {
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
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
|
+
}
|
|
255
646
|
}
|
|
256
647
|
}
|
|
257
648
|
},
|
|
@@ -265,14 +656,50 @@
|
|
|
265
656
|
"displayName": "Company Slack",
|
|
266
657
|
"status": "ACTIVE",
|
|
267
658
|
"version": 3,
|
|
268
|
-
"installation": {
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
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
|
+
},
|
|
273
693
|
"userModeApproval": "automatic",
|
|
274
|
-
"directMessages": {
|
|
275
|
-
|
|
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
|
+
],
|
|
276
703
|
"createdAt": "2026-09-09T08:00:00Z",
|
|
277
704
|
"updatedAt": "2026-09-09T08:00:00Z"
|
|
278
705
|
},
|
|
@@ -286,10 +713,26 @@
|
|
|
286
713
|
"status": "ACTIVE",
|
|
287
714
|
"version": 1,
|
|
288
715
|
"channels": {},
|
|
289
|
-
"operations": [
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
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
|
+
},
|
|
293
736
|
"createdAt": "2026-09-11T08:00:00Z",
|
|
294
737
|
"updatedAt": "2026-09-11T08:00:00Z"
|
|
295
738
|
},
|
|
@@ -302,10 +745,30 @@
|
|
|
302
745
|
"displayName": "Company Basecamp",
|
|
303
746
|
"status": "ACTIVE",
|
|
304
747
|
"version": 2,
|
|
305
|
-
"account": {
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
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
|
+
},
|
|
309
772
|
"userModeApproval": "automatic",
|
|
310
773
|
"createdAt": "2026-10-11T08:00:00Z",
|
|
311
774
|
"updatedAt": "2026-10-11T08:00:00Z"
|
|
@@ -319,10 +782,28 @@
|
|
|
319
782
|
"displayName": "Company SharePoint",
|
|
320
783
|
"status": "ACTIVE",
|
|
321
784
|
"version": 2,
|
|
322
|
-
"account": {
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
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
|
+
},
|
|
326
807
|
"userModeApproval": "automatic",
|
|
327
808
|
"createdAt": "2026-10-11T08:00:00Z",
|
|
328
809
|
"updatedAt": "2026-10-11T08:00:00Z"
|
|
@@ -336,9 +817,17 @@
|
|
|
336
817
|
"displayName": "Agent phone lines",
|
|
337
818
|
"status": "ACTIVE",
|
|
338
819
|
"version": 1,
|
|
339
|
-
"channels": {
|
|
340
|
-
|
|
341
|
-
|
|
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
|
+
},
|
|
342
831
|
"createdAt": "2026-10-17T08:00:00Z",
|
|
343
832
|
"updatedAt": "2026-10-17T08:00:00Z"
|
|
344
833
|
},
|
|
@@ -352,8 +841,18 @@
|
|
|
352
841
|
"status": "ACTIVE",
|
|
353
842
|
"version": 1,
|
|
354
843
|
"channels": {},
|
|
355
|
-
"operations": [
|
|
356
|
-
|
|
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
|
+
},
|
|
357
856
|
"userModeApproval": "automatic",
|
|
358
857
|
"createdAt": "2026-10-17T08:00:00Z",
|
|
359
858
|
"updatedAt": "2026-10-17T08:00:00Z"
|
|
@@ -368,9 +867,23 @@
|
|
|
368
867
|
"status": "ACTIVE",
|
|
369
868
|
"version": 2,
|
|
370
869
|
"channels": {},
|
|
371
|
-
"operations": [
|
|
372
|
-
|
|
373
|
-
|
|
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
|
+
},
|
|
374
887
|
"userModeApproval": "it",
|
|
375
888
|
"createdAt": "2026-10-17T08:00:00Z",
|
|
376
889
|
"updatedAt": "2026-10-17T08:00:00Z"
|
|
@@ -385,8 +898,16 @@
|
|
|
385
898
|
"status": "ACTIVE",
|
|
386
899
|
"version": 1,
|
|
387
900
|
"channels": {},
|
|
388
|
-
"operations": [
|
|
389
|
-
|
|
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
|
+
},
|
|
390
911
|
"userModeApproval": "automatic",
|
|
391
912
|
"createdAt": "2026-10-17T08:00:00Z",
|
|
392
913
|
"updatedAt": "2026-10-17T08:00:00Z"
|
|
@@ -401,10 +922,24 @@
|
|
|
401
922
|
"status": "ACTIVE",
|
|
402
923
|
"version": 1,
|
|
403
924
|
"channels": {},
|
|
404
|
-
"operations": [
|
|
405
|
-
|
|
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
|
+
},
|
|
406
937
|
"userModeApproval": "it",
|
|
407
|
-
"startedBy": {
|
|
938
|
+
"startedBy": {
|
|
939
|
+
"email": "builder@example.com",
|
|
940
|
+
"at": "2026-10-17T08:00:00Z",
|
|
941
|
+
"appId": "app-7f3a2c91"
|
|
942
|
+
},
|
|
408
943
|
"createdAt": "2026-10-17T08:00:00Z",
|
|
409
944
|
"updatedAt": "2026-10-17T08:00:00Z"
|
|
410
945
|
},
|
|
@@ -418,10 +953,26 @@
|
|
|
418
953
|
"status": "ACTIVE",
|
|
419
954
|
"version": 1,
|
|
420
955
|
"channels": {},
|
|
421
|
-
"operations": [
|
|
422
|
-
|
|
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
|
+
},
|
|
423
972
|
"userModeApproval": "it",
|
|
424
|
-
"externalRecipients": {
|
|
973
|
+
"externalRecipients": {
|
|
974
|
+
"mode": "block"
|
|
975
|
+
},
|
|
425
976
|
"createdAt": "2026-10-17T08:00:00Z",
|
|
426
977
|
"updatedAt": "2026-10-17T08:00:00Z"
|
|
427
978
|
},
|
|
@@ -435,8 +986,17 @@
|
|
|
435
986
|
"status": "ACTIVE",
|
|
436
987
|
"version": 1,
|
|
437
988
|
"channels": {},
|
|
438
|
-
"operations": [
|
|
439
|
-
|
|
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
|
+
},
|
|
440
1000
|
"userModeApproval": "automatic",
|
|
441
1001
|
"createdAt": "2026-10-17T08:00:00Z",
|
|
442
1002
|
"updatedAt": "2026-10-17T08:00:00Z"
|
|
@@ -451,8 +1011,18 @@
|
|
|
451
1011
|
"status": "ACTIVE",
|
|
452
1012
|
"version": 1,
|
|
453
1013
|
"channels": {},
|
|
454
|
-
"operations": [
|
|
455
|
-
|
|
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
|
+
},
|
|
456
1026
|
"userModeApproval": "automatic",
|
|
457
1027
|
"createdAt": "2026-10-17T08:00:00Z",
|
|
458
1028
|
"updatedAt": "2026-10-17T08:00:00Z"
|
|
@@ -466,10 +1036,22 @@
|
|
|
466
1036
|
"displayName": "Company Teams",
|
|
467
1037
|
"status": "ACTIVE",
|
|
468
1038
|
"version": 2,
|
|
469
|
-
"account": {
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
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
|
+
},
|
|
473
1055
|
"userModeApproval": "automatic",
|
|
474
1056
|
"createdAt": "2026-10-17T08:00:00Z",
|
|
475
1057
|
"updatedAt": "2026-10-17T08:00:00Z"
|