@fourier-labs/harbour-contracts 0.73.0 → 0.76.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 +4 -4
- package/contract-release.json +26 -26
- package/dist/gen-ts/app-integrations-declaration.d.ts +15 -1
- 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/data-source.d.ts +19 -2
- package/dist/gen-ts/integration-error-details.d.ts +2 -2
- package/dist/gen-ts/integration-execute-input-rules.d.ts +214 -0
- package/dist/gen-ts/integration-execute-input-rules.js +85 -0
- package/dist/gen-ts/integration-execute-request.d.ts +61 -6
- package/dist/gen-ts/integration-execute-result.d.ts +165 -1
- package/dist/gen-ts/integration-operations.d.ts +77 -0
- package/dist/gen-ts/integration-operations.js +99 -0
- package/dist/gen-ts/saas-connection.d.ts +22 -8
- package/gen-ts/app-integrations-declaration.ts +15 -1
- package/gen-ts/contract-release.ts +6 -6
- package/gen-ts/data-grant-v2.ts +15 -4
- package/gen-ts/data-source.ts +19 -2
- package/gen-ts/integration-error-details.ts +3 -2
- package/gen-ts/integration-execute-input-rules.ts +86 -1
- package/gen-ts/integration-execute-request.ts +71 -5
- package/gen-ts/integration-execute-result.ts +165 -1
- package/gen-ts/integration-operations.ts +99 -0
- package/gen-ts/saas-connection.ts +32 -7
- package/package.json +1 -1
- package/schema/app-integrations-declaration.schema.json +233 -2
- package/schema/data-grant-v2.schema.json +4 -4
- package/schema/data-source.schema.json +57 -2
- package/schema/integration-error-details.schema.json +3 -2
- package/schema/integration-execute-request.schema.json +563 -4
- package/schema/integration-execute-result.schema.json +558 -2
- package/schema/saas-connection.schema.json +35 -7
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
3
|
"$id": "https://schemas.harbour.dev/saas-connection.schema.json",
|
|
4
4
|
"title": "SaasConnection",
|
|
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. 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.",
|
|
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. 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
8
|
"required": ["schema", "tenantId", "sourceId", "kind", "provider", "displayName", "status", "version", "channels", "operations", "developmentPreapproval", "createdAt", "updatedAt"],
|
|
@@ -16,21 +16,22 @@
|
|
|
16
16
|
"status": { "$ref": "#/definitions/SaasConnectionStatus" },
|
|
17
17
|
"version": { "type": "integer", "minimum": 1, "description": "Optimistic-concurrency version; every write is conditional on it." },
|
|
18
18
|
"installation": { "$ref": "#/definitions/SaasInstallation" },
|
|
19
|
+
"account": { "$ref": "#/definitions/BasecampAccount" },
|
|
19
20
|
"channels": {
|
|
20
21
|
"type": "object",
|
|
21
22
|
"maxProperties": 64,
|
|
22
23
|
"propertyNames": { "$ref": "app-integrations-declaration.schema.json#/definitions/IntegrationAlias" },
|
|
23
|
-
"additionalProperties": { "type": "string", "pattern": "^[A-
|
|
24
|
-
"description": "Logical
|
|
24
|
+
"additionalProperties": { "type": "string", "pattern": "^[A-Za-z0-9]{1,32}$", "description": "A Slack channel id (public, non-archived) or a Basecamp project id (digits)." },
|
|
25
|
+
"description": "Logical alias → provider resource id: a Slack channel id or a Basecamp project id. Always empty for Gmail."
|
|
25
26
|
},
|
|
26
27
|
"operations": {
|
|
27
28
|
"type": "array",
|
|
28
29
|
"minItems": 1,
|
|
29
|
-
"maxItems":
|
|
30
|
+
"maxItems": 22,
|
|
30
31
|
"uniqueItems": true,
|
|
31
32
|
"items": { "$ref": "app-integrations-declaration.schema.json#/definitions/IntegrationOperation" },
|
|
32
33
|
"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, 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
|
+
"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). Never warehouse.view.read."
|
|
34
35
|
},
|
|
35
36
|
"developmentPreapproval": { "$ref": "#/definitions/DevelopmentPreapproval" },
|
|
36
37
|
"oauthClient": { "$ref": "#/definitions/SaasOauthClient" },
|
|
@@ -76,8 +77,18 @@
|
|
|
76
77
|
"definitions": {
|
|
77
78
|
"SaasProvider": {
|
|
78
79
|
"type": "string",
|
|
79
|
-
"enum": ["slack", "gmail"],
|
|
80
|
-
"description": "Slack carries an installation and a channel map; Gmail is user-consent only
|
|
80
|
+
"enum": ["slack", "gmail", "basecamp"],
|
|
81
|
+
"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`."
|
|
82
|
+
},
|
|
83
|
+
"BasecampAccount": {
|
|
84
|
+
"type": "object",
|
|
85
|
+
"additionalProperties": false,
|
|
86
|
+
"required": ["id", "name"],
|
|
87
|
+
"description": "The pinned Basecamp account (0.76.0, Basecamp only): the one account, among those IT's own Basecamp sign-in belongs to, that every user token on this connection must also belong to and that every project id in `channels` lives in. Absent until IT chooses it; governance refuses every basecamp.* call until then.",
|
|
88
|
+
"properties": {
|
|
89
|
+
"id": { "type": "string", "pattern": "^[0-9]{1,20}$", "description": "The Basecamp account id, the first path segment of the API base URL." },
|
|
90
|
+
"name": { "type": "string", "minLength": 1, "maxLength": 120, "description": "The account's name as Basecamp shows it, for IT to recognise." }
|
|
91
|
+
}
|
|
81
92
|
},
|
|
82
93
|
"SaasOauthClient": {
|
|
83
94
|
"type": "object",
|
|
@@ -237,6 +248,23 @@
|
|
|
237
248
|
"externalRecipients": { "mode": "allowlist", "allowedDomains": ["partner.example.com"] },
|
|
238
249
|
"createdAt": "2026-09-11T08:00:00Z",
|
|
239
250
|
"updatedAt": "2026-09-11T08:00:00Z"
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
"schema": "harbour.saas-connection/1.0",
|
|
254
|
+
"tenantId": "fourier",
|
|
255
|
+
"sourceId": "company-basecamp",
|
|
256
|
+
"kind": "saas",
|
|
257
|
+
"provider": "basecamp",
|
|
258
|
+
"displayName": "Company Basecamp",
|
|
259
|
+
"status": "ACTIVE",
|
|
260
|
+
"version": 2,
|
|
261
|
+
"account": { "id": "195539477", "name": "Fourier Labs" },
|
|
262
|
+
"channels": { "launch": "2085958499" },
|
|
263
|
+
"operations": ["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"],
|
|
264
|
+
"developmentPreapproval": { "enabled": true, "hours": 24 },
|
|
265
|
+
"userModeApproval": "automatic",
|
|
266
|
+
"createdAt": "2026-10-11T08:00:00Z",
|
|
267
|
+
"updatedAt": "2026-10-11T08:00:00Z"
|
|
240
268
|
}
|
|
241
269
|
]
|
|
242
270
|
}
|