@fourier-labs/harbour-contracts 0.71.0 → 0.73.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 +26 -24
- package/dist/gen-ts/app-integrations-declaration.d.ts +29 -20
- 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 +2 -2
- package/dist/gen-ts/deployment-app-registration.d.ts +1 -1
- package/dist/gen-ts/deployment-preview-retirement.d.ts +1 -1
- package/dist/gen-ts/index.d.ts +1 -0
- package/dist/gen-ts/index.js +1 -0
- package/dist/gen-ts/integration-execute-input-rules.d.ts +35 -0
- package/dist/gen-ts/integration-execute-input-rules.js +15 -0
- package/dist/gen-ts/integration-execute-request.d.ts +16 -2
- package/dist/gen-ts/integration-execute-result.d.ts +5 -0
- package/dist/gen-ts/integration-operations.d.ts +94 -0
- package/dist/gen-ts/integration-operations.js +126 -0
- package/dist/gen-ts/saas-connection.d.ts +2 -2
- package/gen-ts/app-integrations-declaration.ts +29 -20
- package/gen-ts/contract-release.ts +6 -6
- package/gen-ts/data-grant-v2.ts +2 -1
- package/gen-ts/deployment-app-registration.ts +1 -1
- package/gen-ts/deployment-preview-retirement.ts +1 -1
- package/gen-ts/index.ts +1 -0
- package/gen-ts/integration-execute-input-rules.ts +15 -0
- package/gen-ts/integration-execute-request.ts +17 -2
- package/gen-ts/integration-execute-result.ts +5 -0
- package/gen-ts/integration-operations.ts +127 -0
- package/gen-ts/saas-connection.ts +2 -1
- package/package.json +1 -1
- package/schema/app-integrations-declaration.schema.json +478 -67
- package/schema/deployment-app-registration.schema.json +1 -1
- package/schema/deployment-preview-retirement.schema.json +1 -1
- package/schema/integration-execute-request.schema.json +884 -120
- package/schema/integration-execute-result.schema.json +505 -82
- package/schema/saas-connection.schema.json +1 -1
|
@@ -2,18 +2,28 @@
|
|
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
3
|
"$id": "https://schemas.harbour.dev/app-integrations-declaration.schema.json",
|
|
4
4
|
"title": "AppIntegrationsDeclaration",
|
|
5
|
-
"description": "Committed `.isomorph/integrations.json`: the app's declared use of tenant-wide integration connections. Keys are logical connection aliases (the governance sourceId); resources are logical names (Slack channel alias, warehouse view name), never IDs, tokens or URLs. The operation set is closed (
|
|
5
|
+
"description": "Committed `.isomorph/integrations.json`: the app's declared use of tenant-wide integration connections. Keys are logical connection aliases (the governance sourceId); resources are logical names (Slack channel alias, warehouse view name), never IDs, tokens or URLs. The operation set is closed (thirteen operations since 0.73.0, ADR 0018). Each operation carries a fixed identity mode \u2014 slack.dm.send=app, slack.user.lookup=app, every gmail.* operation=user, warehouse.view.read=app \u2014 except the declared-mode Slack operations (slack.message.post, and since 0.71.0 slack.channel.history, slack.message.update and slack.message.delete), whose mode the app DECLARES: `app` acts as the company's Slack app (the one audited bot identity; a post goes out under the IT-approved per-app display name when the connection declares `presentation`), `user` acts as the signed-in person after their own consent (reads what they can read, edits what they wrote). The declared mode is the one the app requests access for; an app may hold approved grants for both modes after two requests, and each declared-mode call names which approved mode it runs under (`mode` on the execute request, 0.55.0) \u2014 a mode IT did not approve is refused, never swapped for the other. A `saas` connection may declare only the Slack and Gmail operations and a `database` connection only warehouse.view.read; `presentation` is a `saas` connection's optional per-app display name and icon for app-mode Slack posts, shown to IT at approval time and applied only from the approved grant. Gmail is user-mode only (reads, one send); its single resource is the fixed `inbox` alias. slack.dm.send and slack.user.lookup address people by email rather than a channel, so their single resource is the fixed `workspace` alias (the connection's installed workspace), the way Gmail's is `inbox`. This file also owns the shared IntegrationOperation / IntegrationIdentityMode / IntegrationEnvironment / IntegrationConnectionKind / IntegrationPresentation definitions referenced by the other integration schemas.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
|
-
"required": [
|
|
8
|
+
"required": [
|
|
9
|
+
"schema",
|
|
10
|
+
"connections"
|
|
11
|
+
],
|
|
9
12
|
"properties": {
|
|
10
|
-
"schema": {
|
|
13
|
+
"schema": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"const": "isomorph.app-integrations/2.0"
|
|
16
|
+
},
|
|
11
17
|
"connections": {
|
|
12
18
|
"type": "object",
|
|
13
19
|
"minProperties": 1,
|
|
14
20
|
"maxProperties": 32,
|
|
15
|
-
"propertyNames": {
|
|
16
|
-
|
|
21
|
+
"propertyNames": {
|
|
22
|
+
"$ref": "#/definitions/IntegrationAlias"
|
|
23
|
+
},
|
|
24
|
+
"additionalProperties": {
|
|
25
|
+
"$ref": "#/definitions/DeclaredConnection"
|
|
26
|
+
}
|
|
17
27
|
}
|
|
18
28
|
},
|
|
19
29
|
"definitions": {
|
|
@@ -22,27 +32,57 @@
|
|
|
22
32
|
"pattern": "^[a-z0-9][a-z0-9._-]{0,63}$",
|
|
23
33
|
"description": "Tenant-wide logical alias of a connection (governance sourceId) or of a resource under it."
|
|
24
34
|
},
|
|
25
|
-
"IntegrationConnectionKind": {
|
|
35
|
+
"IntegrationConnectionKind": {
|
|
36
|
+
"type": "string",
|
|
37
|
+
"enum": [
|
|
38
|
+
"saas",
|
|
39
|
+
"database",
|
|
40
|
+
"service"
|
|
41
|
+
]
|
|
42
|
+
},
|
|
26
43
|
"IntegrationOperation": {
|
|
27
44
|
"type": "string",
|
|
28
|
-
"enum": [
|
|
45
|
+
"enum": [
|
|
46
|
+
"slack.channel.history",
|
|
47
|
+
"slack.message.post",
|
|
48
|
+
"slack.message.update",
|
|
49
|
+
"slack.message.delete",
|
|
50
|
+
"slack.dm.send",
|
|
51
|
+
"slack.user.lookup",
|
|
52
|
+
"gmail.thread.list",
|
|
53
|
+
"gmail.thread.read",
|
|
54
|
+
"gmail.message.read",
|
|
55
|
+
"gmail.message.send",
|
|
56
|
+
"gmail.attachment.read",
|
|
57
|
+
"warehouse.view.read",
|
|
58
|
+
"service.request"
|
|
59
|
+
],
|
|
29
60
|
"description": "Closed operation set. Extending it is a contracts change. gmail.message.send (0.50.0) sends one email as the signed-in person: a send like slack.message.post (explicit Send, idempotencyKey, write receipt) under user identity; since 0.71.0 it may carry an HTML body and attachments. slack.message.post (0.53.0) runs in the mode the app declares: app (the company's Slack app, under the IT-approved per-app name) or user (the signed-in person, after their consent); since 0.55.0 each call names which of the approved modes it runs under. 0.71.0 (ADR 0018) adds slack.message.update and slack.message.delete (declared mode, like post), slack.dm.send (app mode: a direct message to 1..8 workspace members named by email), slack.user.lookup (app mode: email to Slack user id), gmail.thread.read (every message of one thread) and gmail.attachment.read (one attachment's bytes), and lets slack.channel.history run in app mode as well as user mode."
|
|
30
61
|
},
|
|
31
62
|
"IntegrationIdentityMode": {
|
|
32
63
|
"type": "string",
|
|
33
|
-
"enum": [
|
|
64
|
+
"enum": [
|
|
65
|
+
"app",
|
|
66
|
+
"user"
|
|
67
|
+
],
|
|
34
68
|
"description": "Whose authority an operation runs under. Fixed per operation, except the declared-mode Slack operations (slack.message.post; since 0.71.0 also slack.channel.history, slack.message.update, slack.message.delete): declared per app for the access request, and named per call among the app's approved modes (execute request `mode`, 0.55.0)."
|
|
35
69
|
},
|
|
36
70
|
"IntegrationEnvironment": {
|
|
37
71
|
"type": "string",
|
|
38
|
-
"enum": [
|
|
72
|
+
"enum": [
|
|
73
|
+
"development",
|
|
74
|
+
"preview",
|
|
75
|
+
"production"
|
|
76
|
+
],
|
|
39
77
|
"description": "development is the CLI/local kit; preview and production are hosted."
|
|
40
78
|
},
|
|
41
79
|
"IntegrationPresentation": {
|
|
42
80
|
"type": "object",
|
|
43
81
|
"additionalProperties": false,
|
|
44
|
-
"required": [
|
|
45
|
-
|
|
82
|
+
"required": [
|
|
83
|
+
"displayName"
|
|
84
|
+
],
|
|
85
|
+
"description": "How an app's app-mode Slack posts are presented (0.53.0): the display name and optional icon the platform bot posts under, so each app's posts are distinguishable while the bot stays the one audited identity. Declared by the app, shown to IT on the access request (\"posts as\"), copied onto the approved grant and applied only from there \u2014 a call can never name itself. Needs the Slack app scope chat:write.customize on the tenant's installation; without it the post goes out under the bot's own name and the receipt says so.",
|
|
46
86
|
"properties": {
|
|
47
87
|
"displayName": {
|
|
48
88
|
"type": "string",
|
|
@@ -51,7 +91,11 @@
|
|
|
51
91
|
"pattern": "^(?!\\s*$)(?!.*(^|[\\s(\\[<\"'])@[A-Za-z0-9_])(?!.*<@)[^\\u0000-\\u001F\\u007F]*$",
|
|
52
92
|
"description": "1..80 characters of plain text: not blank, no control characters, no @-mentions (`@name`, `<@id>`). Must not impersonate a person: IT sees it before approving."
|
|
53
93
|
},
|
|
54
|
-
"iconEmoji": {
|
|
94
|
+
"iconEmoji": {
|
|
95
|
+
"type": "string",
|
|
96
|
+
"pattern": "^:[a-z0-9_+-]{1,60}:$",
|
|
97
|
+
"description": "A Slack emoji shortcode such as `:sandwich:`; absent keeps the bot's own icon."
|
|
98
|
+
}
|
|
55
99
|
}
|
|
56
100
|
},
|
|
57
101
|
"ColumnName": {
|
|
@@ -63,102 +107,399 @@
|
|
|
63
107
|
"type": "array",
|
|
64
108
|
"minItems": 1,
|
|
65
109
|
"maxItems": 64,
|
|
66
|
-
"items": {
|
|
110
|
+
"items": {
|
|
111
|
+
"$ref": "#/definitions/IntegrationAlias"
|
|
112
|
+
}
|
|
67
113
|
},
|
|
68
114
|
"ViewResource": {
|
|
69
115
|
"type": "object",
|
|
70
116
|
"additionalProperties": false,
|
|
71
|
-
"required": [
|
|
117
|
+
"required": [
|
|
118
|
+
"columns"
|
|
119
|
+
],
|
|
72
120
|
"properties": {
|
|
73
121
|
"columns": {
|
|
74
122
|
"type": "array",
|
|
75
123
|
"minItems": 1,
|
|
76
124
|
"maxItems": 32,
|
|
77
|
-
"items": {
|
|
78
|
-
|
|
125
|
+
"items": {
|
|
126
|
+
"$ref": "#/definitions/ColumnName"
|
|
127
|
+
},
|
|
128
|
+
"not": {
|
|
129
|
+
"allOf": [
|
|
130
|
+
{
|
|
131
|
+
"contains": {
|
|
132
|
+
"const": "*"
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"minItems": 2
|
|
137
|
+
}
|
|
138
|
+
]
|
|
139
|
+
}
|
|
79
140
|
}
|
|
80
141
|
}
|
|
81
142
|
},
|
|
82
143
|
"UserModeChannelOperation": {
|
|
83
144
|
"type": "object",
|
|
84
145
|
"additionalProperties": false,
|
|
85
|
-
"required": [
|
|
146
|
+
"required": [
|
|
147
|
+
"identity",
|
|
148
|
+
"resources"
|
|
149
|
+
],
|
|
86
150
|
"properties": {
|
|
87
|
-
"identity": {
|
|
88
|
-
|
|
151
|
+
"identity": {
|
|
152
|
+
"type": "string",
|
|
153
|
+
"const": "user"
|
|
154
|
+
},
|
|
155
|
+
"resources": {
|
|
156
|
+
"$ref": "#/definitions/ResourceNames"
|
|
157
|
+
}
|
|
89
158
|
}
|
|
90
159
|
},
|
|
91
160
|
"DeclaredModeChannelOperation": {
|
|
92
161
|
"type": "object",
|
|
93
162
|
"additionalProperties": false,
|
|
94
|
-
"required": [
|
|
95
|
-
|
|
163
|
+
"required": [
|
|
164
|
+
"identity",
|
|
165
|
+
"resources"
|
|
166
|
+
],
|
|
167
|
+
"description": "slack.message.post, slack.channel.history, slack.message.update, slack.message.delete: the app declares the mode \u2014 app (acts as the company's Slack app) or user (acts as the signed-in person).",
|
|
96
168
|
"properties": {
|
|
97
|
-
"identity": {
|
|
98
|
-
|
|
169
|
+
"identity": {
|
|
170
|
+
"$ref": "#/definitions/IntegrationIdentityMode"
|
|
171
|
+
},
|
|
172
|
+
"resources": {
|
|
173
|
+
"$ref": "#/definitions/ResourceNames"
|
|
174
|
+
}
|
|
99
175
|
}
|
|
100
176
|
},
|
|
101
177
|
"AppModeChannelOperation": {
|
|
102
178
|
"type": "object",
|
|
103
179
|
"additionalProperties": false,
|
|
104
|
-
"required": [
|
|
105
|
-
|
|
180
|
+
"required": [
|
|
181
|
+
"identity",
|
|
182
|
+
"resources"
|
|
183
|
+
],
|
|
184
|
+
"description": "slack.dm.send, slack.user.lookup (0.71.0): app mode only \u2014 the company's Slack app messages people or resolves them by email; the resource is the fixed `workspace` alias.",
|
|
106
185
|
"properties": {
|
|
107
|
-
"identity": {
|
|
108
|
-
|
|
186
|
+
"identity": {
|
|
187
|
+
"type": "string",
|
|
188
|
+
"const": "app"
|
|
189
|
+
},
|
|
190
|
+
"resources": {
|
|
191
|
+
"$ref": "#/definitions/ResourceNames"
|
|
192
|
+
}
|
|
109
193
|
}
|
|
110
194
|
},
|
|
111
195
|
"AppModeViewOperation": {
|
|
112
196
|
"type": "object",
|
|
113
197
|
"additionalProperties": false,
|
|
114
|
-
"required": [
|
|
198
|
+
"required": [
|
|
199
|
+
"identity",
|
|
200
|
+
"resources"
|
|
201
|
+
],
|
|
115
202
|
"properties": {
|
|
116
|
-
"identity": {
|
|
203
|
+
"identity": {
|
|
204
|
+
"type": "string",
|
|
205
|
+
"const": "app"
|
|
206
|
+
},
|
|
117
207
|
"resources": {
|
|
118
208
|
"type": "object",
|
|
119
209
|
"minProperties": 1,
|
|
120
210
|
"maxProperties": 64,
|
|
121
|
-
"propertyNames": {
|
|
122
|
-
|
|
211
|
+
"propertyNames": {
|
|
212
|
+
"$ref": "#/definitions/IntegrationAlias"
|
|
213
|
+
},
|
|
214
|
+
"additionalProperties": {
|
|
215
|
+
"$ref": "#/definitions/ViewResource"
|
|
216
|
+
}
|
|
123
217
|
}
|
|
124
218
|
}
|
|
125
219
|
},
|
|
126
220
|
"DeclaredConnection": {
|
|
127
221
|
"type": "object",
|
|
128
222
|
"additionalProperties": false,
|
|
129
|
-
"required": [
|
|
223
|
+
"required": [
|
|
224
|
+
"kind",
|
|
225
|
+
"operations"
|
|
226
|
+
],
|
|
130
227
|
"properties": {
|
|
131
|
-
"kind": {
|
|
132
|
-
|
|
228
|
+
"kind": {
|
|
229
|
+
"$ref": "#/definitions/IntegrationConnectionKind"
|
|
230
|
+
},
|
|
231
|
+
"presentation": {
|
|
232
|
+
"$ref": "#/definitions/IntegrationPresentation",
|
|
233
|
+
"description": "saas connections only (Slack): how this app's app-mode posts are presented; meaningless for every other operation."
|
|
234
|
+
},
|
|
133
235
|
"operations": {
|
|
134
236
|
"type": "object",
|
|
135
237
|
"additionalProperties": false,
|
|
136
238
|
"minProperties": 1,
|
|
137
239
|
"properties": {
|
|
138
|
-
"slack.channel.history": {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
"slack.message.
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
"
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
"
|
|
148
|
-
|
|
149
|
-
|
|
240
|
+
"slack.channel.history": {
|
|
241
|
+
"$ref": "#/definitions/DeclaredModeChannelOperation"
|
|
242
|
+
},
|
|
243
|
+
"slack.message.post": {
|
|
244
|
+
"$ref": "#/definitions/DeclaredModeChannelOperation"
|
|
245
|
+
},
|
|
246
|
+
"slack.message.update": {
|
|
247
|
+
"$ref": "#/definitions/DeclaredModeChannelOperation"
|
|
248
|
+
},
|
|
249
|
+
"slack.message.delete": {
|
|
250
|
+
"$ref": "#/definitions/DeclaredModeChannelOperation"
|
|
251
|
+
},
|
|
252
|
+
"slack.dm.send": {
|
|
253
|
+
"$ref": "#/definitions/AppModeChannelOperation"
|
|
254
|
+
},
|
|
255
|
+
"slack.user.lookup": {
|
|
256
|
+
"$ref": "#/definitions/AppModeChannelOperation"
|
|
257
|
+
},
|
|
258
|
+
"gmail.thread.list": {
|
|
259
|
+
"$ref": "#/definitions/UserModeChannelOperation"
|
|
260
|
+
},
|
|
261
|
+
"gmail.thread.read": {
|
|
262
|
+
"$ref": "#/definitions/UserModeChannelOperation"
|
|
263
|
+
},
|
|
264
|
+
"gmail.message.read": {
|
|
265
|
+
"$ref": "#/definitions/UserModeChannelOperation"
|
|
266
|
+
},
|
|
267
|
+
"gmail.message.send": {
|
|
268
|
+
"$ref": "#/definitions/UserModeChannelOperation"
|
|
269
|
+
},
|
|
270
|
+
"gmail.attachment.read": {
|
|
271
|
+
"$ref": "#/definitions/UserModeChannelOperation"
|
|
272
|
+
},
|
|
273
|
+
"warehouse.view.read": {
|
|
274
|
+
"$ref": "#/definitions/AppModeViewOperation"
|
|
275
|
+
},
|
|
276
|
+
"service.request": {
|
|
277
|
+
"$ref": "#/definitions/ServiceOperation"
|
|
278
|
+
}
|
|
150
279
|
}
|
|
151
280
|
}
|
|
152
281
|
},
|
|
153
|
-
"
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
282
|
+
"allOf": [
|
|
283
|
+
{
|
|
284
|
+
"if": {
|
|
285
|
+
"properties": {
|
|
286
|
+
"kind": {
|
|
287
|
+
"const": "saas"
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
},
|
|
291
|
+
"then": {
|
|
292
|
+
"properties": {
|
|
293
|
+
"operations": {
|
|
294
|
+
"not": {
|
|
295
|
+
"anyOf": [
|
|
296
|
+
{
|
|
297
|
+
"required": [
|
|
298
|
+
"warehouse.view.read"
|
|
299
|
+
]
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
"required": [
|
|
303
|
+
"service.request"
|
|
304
|
+
]
|
|
305
|
+
}
|
|
306
|
+
]
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
"if": {
|
|
314
|
+
"properties": {
|
|
315
|
+
"kind": {
|
|
316
|
+
"const": "database"
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
},
|
|
320
|
+
"then": {
|
|
321
|
+
"properties": {
|
|
322
|
+
"operations": {
|
|
323
|
+
"not": {
|
|
324
|
+
"anyOf": [
|
|
325
|
+
{
|
|
326
|
+
"required": [
|
|
327
|
+
"slack.channel.history"
|
|
328
|
+
]
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
"required": [
|
|
332
|
+
"slack.message.post"
|
|
333
|
+
]
|
|
334
|
+
},
|
|
335
|
+
{
|
|
336
|
+
"required": [
|
|
337
|
+
"slack.message.update"
|
|
338
|
+
]
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
"required": [
|
|
342
|
+
"slack.message.delete"
|
|
343
|
+
]
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
"required": [
|
|
347
|
+
"slack.dm.send"
|
|
348
|
+
]
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
"required": [
|
|
352
|
+
"slack.user.lookup"
|
|
353
|
+
]
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
"required": [
|
|
357
|
+
"gmail.thread.list"
|
|
358
|
+
]
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
"required": [
|
|
362
|
+
"gmail.thread.read"
|
|
363
|
+
]
|
|
364
|
+
},
|
|
365
|
+
{
|
|
366
|
+
"required": [
|
|
367
|
+
"gmail.message.read"
|
|
368
|
+
]
|
|
369
|
+
},
|
|
370
|
+
{
|
|
371
|
+
"required": [
|
|
372
|
+
"gmail.message.send"
|
|
373
|
+
]
|
|
374
|
+
},
|
|
375
|
+
{
|
|
376
|
+
"required": [
|
|
377
|
+
"gmail.attachment.read"
|
|
378
|
+
]
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
"required": [
|
|
382
|
+
"service.request"
|
|
383
|
+
]
|
|
384
|
+
}
|
|
385
|
+
]
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
},
|
|
389
|
+
"not": {
|
|
390
|
+
"required": [
|
|
391
|
+
"presentation"
|
|
392
|
+
]
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
"if": {
|
|
398
|
+
"properties": {
|
|
399
|
+
"kind": {
|
|
400
|
+
"const": "service"
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
},
|
|
404
|
+
"then": {
|
|
405
|
+
"properties": {
|
|
406
|
+
"operations": {
|
|
407
|
+
"not": {
|
|
408
|
+
"anyOf": [
|
|
409
|
+
{
|
|
410
|
+
"required": [
|
|
411
|
+
"slack.channel.history"
|
|
412
|
+
]
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
"required": [
|
|
416
|
+
"slack.message.post"
|
|
417
|
+
]
|
|
418
|
+
},
|
|
419
|
+
{
|
|
420
|
+
"required": [
|
|
421
|
+
"slack.message.update"
|
|
422
|
+
]
|
|
423
|
+
},
|
|
424
|
+
{
|
|
425
|
+
"required": [
|
|
426
|
+
"slack.message.delete"
|
|
427
|
+
]
|
|
428
|
+
},
|
|
429
|
+
{
|
|
430
|
+
"required": [
|
|
431
|
+
"slack.dm.send"
|
|
432
|
+
]
|
|
433
|
+
},
|
|
434
|
+
{
|
|
435
|
+
"required": [
|
|
436
|
+
"slack.user.lookup"
|
|
437
|
+
]
|
|
438
|
+
},
|
|
439
|
+
{
|
|
440
|
+
"required": [
|
|
441
|
+
"gmail.thread.list"
|
|
442
|
+
]
|
|
443
|
+
},
|
|
444
|
+
{
|
|
445
|
+
"required": [
|
|
446
|
+
"gmail.thread.read"
|
|
447
|
+
]
|
|
448
|
+
},
|
|
449
|
+
{
|
|
450
|
+
"required": [
|
|
451
|
+
"gmail.message.read"
|
|
452
|
+
]
|
|
453
|
+
},
|
|
454
|
+
{
|
|
455
|
+
"required": [
|
|
456
|
+
"gmail.message.send"
|
|
457
|
+
]
|
|
458
|
+
},
|
|
459
|
+
{
|
|
460
|
+
"required": [
|
|
461
|
+
"gmail.attachment.read"
|
|
462
|
+
]
|
|
463
|
+
},
|
|
464
|
+
{
|
|
465
|
+
"required": [
|
|
466
|
+
"warehouse.view.read"
|
|
467
|
+
]
|
|
468
|
+
}
|
|
469
|
+
]
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
},
|
|
473
|
+
"not": {
|
|
474
|
+
"required": [
|
|
475
|
+
"presentation"
|
|
476
|
+
]
|
|
477
|
+
}
|
|
160
478
|
}
|
|
161
479
|
}
|
|
480
|
+
]
|
|
481
|
+
},
|
|
482
|
+
"ServiceOperation": {
|
|
483
|
+
"type": "object",
|
|
484
|
+
"additionalProperties": false,
|
|
485
|
+
"required": [
|
|
486
|
+
"identity",
|
|
487
|
+
"resources"
|
|
488
|
+
],
|
|
489
|
+
"properties": {
|
|
490
|
+
"identity": {
|
|
491
|
+
"type": "string",
|
|
492
|
+
"const": "app"
|
|
493
|
+
},
|
|
494
|
+
"resources": {
|
|
495
|
+
"type": "array",
|
|
496
|
+
"items": {
|
|
497
|
+
"type": "string",
|
|
498
|
+
"const": "api"
|
|
499
|
+
},
|
|
500
|
+
"minItems": 1,
|
|
501
|
+
"maxItems": 1
|
|
502
|
+
}
|
|
162
503
|
}
|
|
163
504
|
}
|
|
164
505
|
},
|
|
@@ -168,24 +509,82 @@
|
|
|
168
509
|
"connections": {
|
|
169
510
|
"company-slack": {
|
|
170
511
|
"kind": "saas",
|
|
171
|
-
"presentation": {
|
|
512
|
+
"presentation": {
|
|
513
|
+
"displayName": "Lunch Vote",
|
|
514
|
+
"iconEmoji": ":sandwich:"
|
|
515
|
+
},
|
|
172
516
|
"operations": {
|
|
173
|
-
"slack.channel.history": {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
517
|
+
"slack.channel.history": {
|
|
518
|
+
"identity": "user",
|
|
519
|
+
"resources": [
|
|
520
|
+
"team-updates"
|
|
521
|
+
]
|
|
522
|
+
},
|
|
523
|
+
"slack.message.post": {
|
|
524
|
+
"identity": "app",
|
|
525
|
+
"resources": [
|
|
526
|
+
"team-updates"
|
|
527
|
+
]
|
|
528
|
+
},
|
|
529
|
+
"slack.message.update": {
|
|
530
|
+
"identity": "app",
|
|
531
|
+
"resources": [
|
|
532
|
+
"team-updates"
|
|
533
|
+
]
|
|
534
|
+
},
|
|
535
|
+
"slack.message.delete": {
|
|
536
|
+
"identity": "app",
|
|
537
|
+
"resources": [
|
|
538
|
+
"team-updates"
|
|
539
|
+
]
|
|
540
|
+
},
|
|
541
|
+
"slack.dm.send": {
|
|
542
|
+
"identity": "app",
|
|
543
|
+
"resources": [
|
|
544
|
+
"workspace"
|
|
545
|
+
]
|
|
546
|
+
},
|
|
547
|
+
"slack.user.lookup": {
|
|
548
|
+
"identity": "app",
|
|
549
|
+
"resources": [
|
|
550
|
+
"workspace"
|
|
551
|
+
]
|
|
552
|
+
}
|
|
179
553
|
}
|
|
180
554
|
},
|
|
181
555
|
"gmail": {
|
|
182
556
|
"kind": "saas",
|
|
183
557
|
"operations": {
|
|
184
|
-
"gmail.thread.list": {
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
558
|
+
"gmail.thread.list": {
|
|
559
|
+
"identity": "user",
|
|
560
|
+
"resources": [
|
|
561
|
+
"inbox"
|
|
562
|
+
]
|
|
563
|
+
},
|
|
564
|
+
"gmail.thread.read": {
|
|
565
|
+
"identity": "user",
|
|
566
|
+
"resources": [
|
|
567
|
+
"inbox"
|
|
568
|
+
]
|
|
569
|
+
},
|
|
570
|
+
"gmail.message.read": {
|
|
571
|
+
"identity": "user",
|
|
572
|
+
"resources": [
|
|
573
|
+
"inbox"
|
|
574
|
+
]
|
|
575
|
+
},
|
|
576
|
+
"gmail.message.send": {
|
|
577
|
+
"identity": "user",
|
|
578
|
+
"resources": [
|
|
579
|
+
"inbox"
|
|
580
|
+
]
|
|
581
|
+
},
|
|
582
|
+
"gmail.attachment.read": {
|
|
583
|
+
"identity": "user",
|
|
584
|
+
"resources": [
|
|
585
|
+
"inbox"
|
|
586
|
+
]
|
|
587
|
+
}
|
|
189
588
|
}
|
|
190
589
|
},
|
|
191
590
|
"sales-warehouse": {
|
|
@@ -193,7 +592,14 @@
|
|
|
193
592
|
"operations": {
|
|
194
593
|
"warehouse.view.read": {
|
|
195
594
|
"identity": "app",
|
|
196
|
-
"resources": {
|
|
595
|
+
"resources": {
|
|
596
|
+
"weekly_sales": {
|
|
597
|
+
"columns": [
|
|
598
|
+
"week",
|
|
599
|
+
"total"
|
|
600
|
+
]
|
|
601
|
+
}
|
|
602
|
+
}
|
|
197
603
|
}
|
|
198
604
|
}
|
|
199
605
|
}
|
|
@@ -205,7 +611,12 @@
|
|
|
205
611
|
"company-slack": {
|
|
206
612
|
"kind": "saas",
|
|
207
613
|
"operations": {
|
|
208
|
-
"slack.message.post": {
|
|
614
|
+
"slack.message.post": {
|
|
615
|
+
"identity": "user",
|
|
616
|
+
"resources": [
|
|
617
|
+
"team-updates"
|
|
618
|
+
]
|
|
619
|
+
}
|
|
209
620
|
}
|
|
210
621
|
}
|
|
211
622
|
}
|