@fourier-labs/harbour-contracts 0.69.0 → 0.71.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/contract-release.json +20 -20
- package/dist/gen-ts/app-integrations-declaration.d.ts +24 -11
- package/dist/gen-ts/contract-release.d.ts +6 -6
- package/dist/gen-ts/contract-release.js +6 -6
- package/dist/gen-ts/data-grant-v2.d.ts +5 -5
- package/dist/gen-ts/integration-execute-input-rules.d.ts +303 -4
- package/dist/gen-ts/integration-execute-input-rules.js +162 -34
- package/dist/gen-ts/integration-execute-request.d.ts +158 -9
- package/dist/gen-ts/integration-execute-result.d.ts +77 -3
- package/dist/gen-ts/saas-connection.d.ts +62 -4
- package/gen-ts/app-integrations-declaration.ts +24 -11
- package/gen-ts/contract-release.ts +6 -6
- package/gen-ts/data-grant-v2.ts +10 -4
- package/gen-ts/integration-execute-input-rules.ts +161 -30
- package/gen-ts/integration-execute-request.ts +164 -8
- package/gen-ts/integration-execute-result.ts +77 -3
- package/gen-ts/saas-connection.ts +67 -3
- package/package.json +1 -1
- package/schema/app-integrations-declaration.schema.json +31 -9
- package/schema/data-grant-v2.schema.json +2 -2
- package/schema/integration-execute-request.schema.json +261 -14
- package/schema/integration-execute-result.schema.json +86 -10
- package/schema/saas-connection.schema.json +74 -5
|
@@ -26,13 +26,17 @@
|
|
|
26
26
|
"operations": {
|
|
27
27
|
"type": "array",
|
|
28
28
|
"minItems": 1,
|
|
29
|
-
"maxItems":
|
|
29
|
+
"maxItems": 11,
|
|
30
30
|
"uniqueItems": true,
|
|
31
31
|
"items": { "$ref": "app-integrations-declaration.schema.json#/definitions/IntegrationOperation" },
|
|
32
32
|
"not": { "contains": { "const": "warehouse.view.read" } },
|
|
33
|
-
"description": "Operations IT allows apps to request on this connection: the provider's own SaaS operations (Slack: slack.channel.history, slack.message.post; Gmail: gmail.thread.list, gmail.message.read, gmail.message.send). Never warehouse.view.read."
|
|
33
|
+
"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). Never warehouse.view.read."
|
|
34
34
|
},
|
|
35
35
|
"developmentPreapproval": { "$ref": "#/definitions/DevelopmentPreapproval" },
|
|
36
|
+
"oauthClient": { "$ref": "#/definitions/SaasOauthClient" },
|
|
37
|
+
"userModeApproval": { "$ref": "#/definitions/UserModeApproval" },
|
|
38
|
+
"directMessages": { "$ref": "#/definitions/DirectMessagePolicy" },
|
|
39
|
+
"externalRecipients": { "$ref": "#/definitions/ExternalRecipientPolicy" },
|
|
36
40
|
"blockedDevelopmentBuilders": {
|
|
37
41
|
"type": "array",
|
|
38
42
|
"maxItems": 256,
|
|
@@ -73,7 +77,68 @@
|
|
|
73
77
|
"SaasProvider": {
|
|
74
78
|
"type": "string",
|
|
75
79
|
"enum": ["slack", "gmail"],
|
|
76
|
-
"description": "Slack carries an installation and a channel map; Gmail is user-consent only
|
|
80
|
+
"description": "Slack carries an installation and a channel map; Gmail is user-consent only."
|
|
81
|
+
},
|
|
82
|
+
"SaasOauthClient": {
|
|
83
|
+
"type": "object",
|
|
84
|
+
"additionalProperties": false,
|
|
85
|
+
"required": ["clientId", "secretRef", "setAt", "setBy"],
|
|
86
|
+
"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.",
|
|
87
|
+
"properties": {
|
|
88
|
+
"clientId": { "type": "string", "minLength": 1, "maxLength": 255 },
|
|
89
|
+
"secretRef": { "type": "string", "pattern": "^secretref://[A-Za-z0-9][A-Za-z0-9/_.:-]*$", "description": "Where the client secret lives." },
|
|
90
|
+
"setAt": { "type": "string", "format": "date-time" },
|
|
91
|
+
"setBy": { "type": "string", "minLength": 1, "maxLength": 255, "description": "The IT admin who saved it (lower-cased email)." }
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
"UserModeApproval": {
|
|
95
|
+
"type": "string",
|
|
96
|
+
"enum": ["automatic", "it"],
|
|
97
|
+
"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."
|
|
98
|
+
},
|
|
99
|
+
"DirectMessagePolicy": {
|
|
100
|
+
"type": "object",
|
|
101
|
+
"additionalProperties": false,
|
|
102
|
+
"required": ["allowed", "dailyRecipientCap"],
|
|
103
|
+
"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.",
|
|
104
|
+
"properties": {
|
|
105
|
+
"allowed": { "$ref": "#/definitions/DirectMessageAudience" },
|
|
106
|
+
"channel": { "$ref": "app-integrations-declaration.schema.json#/definitions/IntegrationAlias", "description": "channel_members only: the alias (a key of `channels`) whose current members may be messaged." },
|
|
107
|
+
"dailyRecipientCap": { "type": "integer", "minimum": 1, "maximum": 1000, "description": "Distinct recipients one app may message per UTC day on this connection; the cap refuses the send that would exceed it." }
|
|
108
|
+
},
|
|
109
|
+
"if": { "properties": { "allowed": { "const": "channel_members" } } },
|
|
110
|
+
"then": { "required": ["channel"] },
|
|
111
|
+
"else": { "not": { "required": ["channel"] } }
|
|
112
|
+
},
|
|
113
|
+
"DirectMessageAudience": {
|
|
114
|
+
"type": "string",
|
|
115
|
+
"enum": ["signed_in_person", "channel_members", "anyone"],
|
|
116
|
+
"description": "signed_in_person — only the person using the app; channel_members — the members of the named channel; anyone — any workspace member."
|
|
117
|
+
},
|
|
118
|
+
"ExternalRecipientPolicy": {
|
|
119
|
+
"type": "object",
|
|
120
|
+
"additionalProperties": false,
|
|
121
|
+
"required": ["mode"],
|
|
122
|
+
"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.",
|
|
123
|
+
"properties": {
|
|
124
|
+
"mode": { "$ref": "#/definitions/ExternalRecipientMode" },
|
|
125
|
+
"allowedDomains": {
|
|
126
|
+
"type": "array",
|
|
127
|
+
"minItems": 1,
|
|
128
|
+
"maxItems": 50,
|
|
129
|
+
"uniqueItems": true,
|
|
130
|
+
"items": { "type": "string", "format": "hostname", "maxLength": 253 },
|
|
131
|
+
"description": "allowlist only: the external domains a send may address; a recipient's domain must equal one of them."
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
"if": { "properties": { "mode": { "const": "allowlist" } } },
|
|
135
|
+
"then": { "required": ["allowedDomains"] },
|
|
136
|
+
"else": { "not": { "required": ["allowedDomains"] } }
|
|
137
|
+
},
|
|
138
|
+
"ExternalRecipientMode": {
|
|
139
|
+
"type": "string",
|
|
140
|
+
"enum": ["block", "allowlist", "allow"],
|
|
141
|
+
"description": "block — every recipient must be internal (the default when absent); allowlist — internal or in `allowedDomains`; allow — any address."
|
|
77
142
|
},
|
|
78
143
|
"SaasConnectionStatus": {
|
|
79
144
|
"type": "string",
|
|
@@ -148,8 +213,11 @@
|
|
|
148
213
|
"version": 3,
|
|
149
214
|
"installation": { "tokenRecordId": "tok_workspace", "workspaceId": "T0WORKSPACE", "botUserId": "U0BOT", "status": "installed", "installedAt": "2026-09-09T08:00:00Z", "scopes": ["channels:read", "chat:write", "chat:write.customize"], "botName": "isomorph_ai" },
|
|
150
215
|
"channels": { "team-updates": "C0123TEAM" },
|
|
151
|
-
"operations": ["slack.channel.history", "slack.message.post"],
|
|
216
|
+
"operations": ["slack.channel.history", "slack.message.post", "slack.message.update", "slack.message.delete", "slack.dm.send", "slack.user.lookup"],
|
|
152
217
|
"developmentPreapproval": { "enabled": true, "hours": 24 },
|
|
218
|
+
"oauthClient": { "clientId": "1234567890.1234567890", "secretRef": "secretref://tenant/fourier/saas/company-slack/oauth-client", "setAt": "2026-10-01T08:00:00Z", "setBy": "it-admin@example.com" },
|
|
219
|
+
"userModeApproval": "automatic",
|
|
220
|
+
"directMessages": { "allowed": "channel_members", "channel": "team-updates", "dailyRecipientCap": 50 },
|
|
153
221
|
"createdAt": "2026-09-09T08:00:00Z",
|
|
154
222
|
"updatedAt": "2026-09-09T08:00:00Z"
|
|
155
223
|
},
|
|
@@ -163,9 +231,10 @@
|
|
|
163
231
|
"status": "ACTIVE",
|
|
164
232
|
"version": 1,
|
|
165
233
|
"channels": {},
|
|
166
|
-
"operations": ["gmail.thread.list", "gmail.message.read", "gmail.message.send"],
|
|
234
|
+
"operations": ["gmail.thread.list", "gmail.thread.read", "gmail.message.read", "gmail.message.send", "gmail.attachment.read"],
|
|
167
235
|
"developmentPreapproval": { "enabled": false, "hours": 24 },
|
|
168
236
|
"blockedDevelopmentBuilders": ["contractor@example.com"],
|
|
237
|
+
"externalRecipients": { "mode": "allowlist", "allowedDomains": ["partner.example.com"] },
|
|
169
238
|
"createdAt": "2026-09-11T08:00:00Z",
|
|
170
239
|
"updatedAt": "2026-09-11T08:00:00Z"
|
|
171
240
|
}
|