@fourier-labs/harbour-contracts 0.79.0 → 0.82.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.
@@ -21,17 +21,17 @@
21
21
  "type": "object",
22
22
  "maxProperties": 64,
23
23
  "propertyNames": { "$ref": "app-integrations-declaration.schema.json#/definitions/IntegrationAlias" },
24
- "additionalProperties": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9.,_:-]{0,255}$", "description": "A Slack channel id (public, non-archived), a Basecamp project id (digits) or a SharePoint site id (0.78.0: the Microsoft Graph composite `hostname,siteCollectionGuid,webGuid`)." },
25
- "description": "Logical alias → provider resource id: a Slack channel id, a Basecamp project id or a SharePoint site id. Always empty for Gmail."
24
+ "additionalProperties": { "type": "string", "pattern": "^[+A-Za-z0-9][A-Za-z0-9.,_:-]{0,255}$", "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`) or a phone number (0.82.0: E.164, a leading `+` and digits)." },
25
+ "description": "Logical alias → provider resource id: a Slack channel id, a Basecamp project id, a SharePoint site id or a phone number. Always empty for Gmail."
26
26
  },
27
27
  "operations": {
28
28
  "type": "array",
29
29
  "minItems": 1,
30
- "maxItems": 31,
30
+ "maxItems": 32,
31
31
  "uniqueItems": true,
32
32
  "items": { "$ref": "app-integrations-declaration.schema.json#/definitions/IntegrationOperation" },
33
- "not": { "contains": { "const": "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; 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). Never warehouse.view.read."
33
+ "not": { "anyOf": [{ "contains": { "const": "warehouse.view.read" } }, { "contains": { "const": "warehouse.table.append" } }] },
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; 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). Never warehouse.view.read. Phone (0.82.0): phone.sms.list."
35
35
  },
36
36
  "developmentPreapproval": { "$ref": "#/definitions/DevelopmentPreapproval" },
37
37
  "oauthClient": { "$ref": "#/definitions/SaasOauthClient" },
@@ -45,6 +45,13 @@
45
45
  "items": { "type": "string", "minLength": 1, "maxLength": 255 },
46
46
  "description": "Lower-cased builder emails excluded from development preapproval."
47
47
  },
48
+ "approvers": {
49
+ "type": "array",
50
+ "maxItems": 20,
51
+ "uniqueItems": true,
52
+ "items": { "$ref": "integration-execute-request.schema.json#/definitions/EmailAddress" },
53
+ "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
+ },
48
55
  "createdAt": { "type": "string", "format": "date-time" },
49
56
  "updatedAt": { "type": "string", "format": "date-time" },
50
57
  "clientId": { "type": "string", "minLength": 1, "maxLength": 255, "deprecated": true, "description": "Deprecated (pre-T25 tenant-owned provider client). Dropped on read; never written." },
@@ -77,8 +84,8 @@
77
84
  "definitions": {
78
85
  "SaasProvider": {
79
86
  "type": "string",
80
- "enum": ["slack", "gmail", "basecamp", "sharepoint"],
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`; SharePoint (0.78.0) is user-consent only, pinned to the company's Microsoft 365 tenant in `account`, with a site map in `channels`."
87
+ "enum": ["slack", "gmail", "basecamp", "sharepoint", "phone"],
88
+ "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."
82
89
  },
83
90
  "BasecampAccount": {
84
91
  "type": "object",
@@ -229,6 +236,7 @@
229
236
  "oauthClient": { "clientId": "1234567890.1234567890", "secretRef": "secretref://tenant/fourier/saas/company-slack/oauth-client", "setAt": "2026-10-01T08:00:00Z", "setBy": "it-admin@example.com" },
230
237
  "userModeApproval": "automatic",
231
238
  "directMessages": { "allowed": "channel_members", "channel": "team-updates", "dailyRecipientCap": 50 },
239
+ "approvers": ["slack-owner@example.com", "it-lead@example.com"],
232
240
  "createdAt": "2026-09-09T08:00:00Z",
233
241
  "updatedAt": "2026-09-09T08:00:00Z"
234
242
  },
@@ -282,6 +290,21 @@
282
290
  "userModeApproval": "automatic",
283
291
  "createdAt": "2026-10-11T08:00:00Z",
284
292
  "updatedAt": "2026-10-11T08:00:00Z"
293
+ },
294
+ {
295
+ "schema": "harbour.saas-connection/1.0",
296
+ "tenantId": "fourier",
297
+ "sourceId": "company-phone",
298
+ "kind": "saas",
299
+ "provider": "phone",
300
+ "displayName": "Agent phone lines",
301
+ "status": "ACTIVE",
302
+ "version": 1,
303
+ "channels": { "gstn-line": "+919876543210" },
304
+ "operations": ["phone.sms.list"],
305
+ "developmentPreapproval": { "enabled": false, "hours": 24 },
306
+ "createdAt": "2026-10-17T08:00:00Z",
307
+ "updatedAt": "2026-10-17T08:00:00Z"
285
308
  }
286
309
  ]
287
310
  }