@fourier-labs/harbour-contracts 0.80.0 → 0.83.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 +22 -22
- package/dist/gen-ts/app-integrations-declaration.d.ts +7 -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 +5 -5
- package/dist/gen-ts/integration-execute-input-rules.d.ts +45 -0
- package/dist/gen-ts/integration-execute-input-rules.js +41 -9
- package/dist/gen-ts/integration-execute-request.d.ts +20 -3
- package/dist/gen-ts/integration-operations.d.ts +21 -0
- package/dist/gen-ts/integration-operations.js +27 -0
- package/dist/gen-ts/resolved-app-serving.d.ts +10 -0
- package/dist/gen-ts/saas-connection.d.ts +7 -7
- package/gen-ts/app-integrations-declaration.ts +7 -0
- package/gen-ts/contract-release.ts +6 -6
- package/gen-ts/data-grant-v2.ts +7 -4
- package/gen-ts/integration-execute-input-rules.ts +38 -7
- package/gen-ts/integration-execute-request.ts +22 -2
- package/gen-ts/integration-operations.ts +27 -0
- package/gen-ts/resolved-app-serving.ts +10 -0
- package/gen-ts/saas-connection.ts +9 -6
- package/package.json +1 -1
- package/schema/app-integrations-declaration.schema.json +82 -1
- package/schema/data-grant-v2.schema.json +4 -4
- package/schema/integration-execute-request.schema.json +159 -1
- package/schema/resolved-app-serving.schema.json +11 -0
- package/schema/saas-connection.schema.json +22 -7
|
@@ -359,13 +359,53 @@
|
|
|
359
359
|
"body": {
|
|
360
360
|
"type": "object",
|
|
361
361
|
"additionalProperties": true
|
|
362
|
+
},
|
|
363
|
+
"rows": {
|
|
364
|
+
"type": "array",
|
|
365
|
+
"minItems": 1,
|
|
366
|
+
"maxItems": 500,
|
|
367
|
+
"items": {
|
|
368
|
+
"type": "object",
|
|
369
|
+
"minProperties": 1,
|
|
370
|
+
"maxProperties": 64,
|
|
371
|
+
"additionalProperties": {
|
|
372
|
+
"oneOf": [
|
|
373
|
+
{
|
|
374
|
+
"type": "string",
|
|
375
|
+
"maxLength": 4000
|
|
376
|
+
},
|
|
377
|
+
{
|
|
378
|
+
"type": "number"
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
"type": "boolean"
|
|
382
|
+
},
|
|
383
|
+
{
|
|
384
|
+
"type": "null"
|
|
385
|
+
}
|
|
386
|
+
]
|
|
387
|
+
},
|
|
388
|
+
"description": "One row keyed by column name, 1..64 columns; each value a string of at most 4000 characters, a number, a boolean or null. Which columns the alias approves, and whether a value fits its column type (the catalog's columnTypes, which only governance holds), is governance's check \u2014 the way warehouse.view.read's cross-field rules are."
|
|
389
|
+
},
|
|
390
|
+
"description": "warehouse.table.append (0.82.0): the rows to append, 1..500 of them, every one a record of the approved columns. Governance refuses an unapproved column, a value outside its column type and a request above 1 MB with ROW_VALUE_INVALID; nothing is coerced."
|
|
391
|
+
},
|
|
392
|
+
"since": {
|
|
393
|
+
"type": "string",
|
|
394
|
+
"minLength": 1,
|
|
395
|
+
"pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\\.[0-9]{1,9})?(Z|[+-][0-9]{2}:[0-9]{2})$",
|
|
396
|
+
"description": "phone.sms.list (0.82.0): the ISO 8601 date-time (with a zone) after which received messages are listed; inclusive. Messages are kept for 30 minutes, so an older `since` lists what is still held."
|
|
397
|
+
},
|
|
398
|
+
"from": {
|
|
399
|
+
"type": "string",
|
|
400
|
+
"maxLength": 32,
|
|
401
|
+
"description": "phone.sms.list (0.82.0): only messages from this sender id or number (as the provider reports it, e.g. `VK-GSTNIN` or `+919876543210`); absent lists every sender."
|
|
362
402
|
}
|
|
363
403
|
}
|
|
364
404
|
},
|
|
365
405
|
"idempotencyKey": {
|
|
366
406
|
"type": "string",
|
|
367
407
|
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
|
|
368
|
-
"description": "UUID of one explicit Send action; required for the sends (slack.message.post, slack.dm.send, gmail.message.send), the receipted Basecamp writes (basecamp.todo.create, basecamp.message.post, basecamp.comment.post, basecamp.campfire.post; 0.76.0)
|
|
408
|
+
"description": "UUID of one explicit Send action; required for the sends (slack.message.post, slack.dm.send, gmail.message.send), the receipted Basecamp writes (basecamp.todo.create, basecamp.message.post, basecamp.comment.post, basecamp.campfire.post; 0.76.0) the receipted SharePoint writes (sharepoint.item.create, sharepoint.file.upload; 0.78.0) and the receipted warehouse append (warehouse.table.append; 0.82.0, where it is also the BigQuery load job id), refused everywhere else. The same key with the same payload and subject returns the recorded outcome for seven days."
|
|
369
409
|
},
|
|
370
410
|
"mode": {
|
|
371
411
|
"$ref": "app-integrations-declaration.schema.json#/definitions/IntegrationIdentityMode",
|
|
@@ -1494,6 +1534,89 @@
|
|
|
1494
1534
|
"resource"
|
|
1495
1535
|
]
|
|
1496
1536
|
}
|
|
1537
|
+
},
|
|
1538
|
+
{
|
|
1539
|
+
"if": {
|
|
1540
|
+
"properties": {
|
|
1541
|
+
"operation": {
|
|
1542
|
+
"const": "phone.sms.list"
|
|
1543
|
+
}
|
|
1544
|
+
}
|
|
1545
|
+
},
|
|
1546
|
+
"then": {
|
|
1547
|
+
"x-read-only": true,
|
|
1548
|
+
"not": {
|
|
1549
|
+
"required": [
|
|
1550
|
+
"idempotencyKey"
|
|
1551
|
+
]
|
|
1552
|
+
},
|
|
1553
|
+
"properties": {
|
|
1554
|
+
"mode": false,
|
|
1555
|
+
"input": {
|
|
1556
|
+
"propertyNames": {
|
|
1557
|
+
"enum": [
|
|
1558
|
+
"since",
|
|
1559
|
+
"from"
|
|
1560
|
+
]
|
|
1561
|
+
},
|
|
1562
|
+
"required": [
|
|
1563
|
+
"since"
|
|
1564
|
+
]
|
|
1565
|
+
}
|
|
1566
|
+
}
|
|
1567
|
+
}
|
|
1568
|
+
},
|
|
1569
|
+
{
|
|
1570
|
+
"if": {
|
|
1571
|
+
"properties": {
|
|
1572
|
+
"operation": {
|
|
1573
|
+
"const": "phone.number.get"
|
|
1574
|
+
}
|
|
1575
|
+
}
|
|
1576
|
+
},
|
|
1577
|
+
"then": {
|
|
1578
|
+
"x-read-only": true,
|
|
1579
|
+
"not": {
|
|
1580
|
+
"required": [
|
|
1581
|
+
"idempotencyKey"
|
|
1582
|
+
]
|
|
1583
|
+
},
|
|
1584
|
+
"properties": {
|
|
1585
|
+
"mode": false,
|
|
1586
|
+
"input": {
|
|
1587
|
+
"maxProperties": 0,
|
|
1588
|
+
"description": "phone.number.get (0.83.0) takes no input: `input` is the empty object (the generated validators read an absent input as `{}`). The resource, a number alias, is the whole question; the answer is the E.164 number the phone connection's `channels` map holds for it."
|
|
1589
|
+
}
|
|
1590
|
+
}
|
|
1591
|
+
}
|
|
1592
|
+
},
|
|
1593
|
+
{
|
|
1594
|
+
"if": {
|
|
1595
|
+
"properties": {
|
|
1596
|
+
"operation": {
|
|
1597
|
+
"const": "warehouse.table.append"
|
|
1598
|
+
}
|
|
1599
|
+
}
|
|
1600
|
+
},
|
|
1601
|
+
"then": {
|
|
1602
|
+
"x-read-only": false,
|
|
1603
|
+
"required": [
|
|
1604
|
+
"idempotencyKey"
|
|
1605
|
+
],
|
|
1606
|
+
"properties": {
|
|
1607
|
+
"mode": false,
|
|
1608
|
+
"input": {
|
|
1609
|
+
"propertyNames": {
|
|
1610
|
+
"enum": [
|
|
1611
|
+
"rows"
|
|
1612
|
+
]
|
|
1613
|
+
},
|
|
1614
|
+
"required": [
|
|
1615
|
+
"rows"
|
|
1616
|
+
]
|
|
1617
|
+
}
|
|
1618
|
+
}
|
|
1619
|
+
}
|
|
1497
1620
|
}
|
|
1498
1621
|
],
|
|
1499
1622
|
"definitions": {
|
|
@@ -2193,6 +2316,41 @@
|
|
|
2193
2316
|
"conflict": "replace"
|
|
2194
2317
|
},
|
|
2195
2318
|
"idempotencyKey": "6f1c2c1e-3a1c-4c3e-9f0e-2b6f7d8a9c21"
|
|
2319
|
+
},
|
|
2320
|
+
{
|
|
2321
|
+
"connection": "company-phone",
|
|
2322
|
+
"operation": "phone.sms.list",
|
|
2323
|
+
"resource": "gstn-line",
|
|
2324
|
+
"input": {
|
|
2325
|
+
"since": "2026-10-17T09:30:00Z",
|
|
2326
|
+
"from": "VK-GSTNIN"
|
|
2327
|
+
}
|
|
2328
|
+
},
|
|
2329
|
+
{
|
|
2330
|
+
"connection": "company-phone",
|
|
2331
|
+
"operation": "phone.number.get",
|
|
2332
|
+
"resource": "gstn-line",
|
|
2333
|
+
"input": {}
|
|
2334
|
+
},
|
|
2335
|
+
{
|
|
2336
|
+
"connection": "sales-warehouse",
|
|
2337
|
+
"operation": "warehouse.table.append",
|
|
2338
|
+
"resource": "esc_filings",
|
|
2339
|
+
"input": {
|
|
2340
|
+
"rows": [
|
|
2341
|
+
{
|
|
2342
|
+
"gstin": "27AAPFU0939F1ZV",
|
|
2343
|
+
"period": "2026-09",
|
|
2344
|
+
"filed_at": "2026-10-17T09:31:12Z"
|
|
2345
|
+
},
|
|
2346
|
+
{
|
|
2347
|
+
"gstin": "29AABCT1332L1ZT",
|
|
2348
|
+
"period": "2026-09",
|
|
2349
|
+
"filed_at": null
|
|
2350
|
+
}
|
|
2351
|
+
]
|
|
2352
|
+
},
|
|
2353
|
+
"idempotencyKey": "6f1c2c1e-3a1c-4c3e-9f0e-2b6f7d8a9c22"
|
|
2196
2354
|
}
|
|
2197
2355
|
]
|
|
2198
2356
|
}
|
|
@@ -27,6 +27,17 @@
|
|
|
27
27
|
"routingStoreArn": {"type": "string", "minLength": 1, "description": "The cell's CloudFront KeyValueStore ARN; equals edge.routingStoreArn unless the cell record names its own."},
|
|
28
28
|
"pageHost": {"type": "string", "format": "hostname", "description": "Bare hostname of frontendUrl."},
|
|
29
29
|
"apiHost": {"type": "string", "format": "hostname", "description": "Bare hostname of apiUrl."},
|
|
30
|
+
"networkAccess": {
|
|
31
|
+
"type": "object", "additionalProperties": false,
|
|
32
|
+
"description": "Present only while the tenant enforces a network access policy (governance ADR 0130): the effective list of client ranges the app's gateway SecurityPolicy allows, the tenant's ranges plus the platform cell's own egress, as textual CIDRs. Absent means every network.",
|
|
33
|
+
"required": ["clientCidrs"],
|
|
34
|
+
"properties": {
|
|
35
|
+
"clientCidrs": {
|
|
36
|
+
"type": "array", "minItems": 1, "maxItems": 128, "uniqueItems": true,
|
|
37
|
+
"items": {"type": "string", "pattern": "^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}/(?:3[0-2]|[12]?[0-9])|(?=[0-9a-fA-F.]*:)[0-9a-fA-F:.]{2,45}/(?:12[0-8]|1[01][0-9]|[1-9]?[0-9]))$", "description": "IPv4 `a.b.c.d/n` or IPv6 `addr/n`, each with an explicit prefix; `/0` is never produced."}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
},
|
|
30
41
|
"companyDomain": {
|
|
31
42
|
"type": "object", "additionalProperties": false,
|
|
32
43
|
"description": "Present only when source is tenant: the ready delegated company zone the page and API hosts live under, and the shared gateway/TLS secret the cell serves it with.",
|
|
@@ -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)
|
|
25
|
-
"description": "Logical alias → provider resource id: a Slack channel id, a Basecamp project id
|
|
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":
|
|
30
|
+
"maxItems": 33,
|
|
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; 0.83.0 adds phone.number.get."
|
|
35
35
|
},
|
|
36
36
|
"developmentPreapproval": { "$ref": "#/definitions/DevelopmentPreapproval" },
|
|
37
37
|
"oauthClient": { "$ref": "#/definitions/SaasOauthClient" },
|
|
@@ -84,8 +84,8 @@
|
|
|
84
84
|
"definitions": {
|
|
85
85
|
"SaasProvider": {
|
|
86
86
|
"type": "string",
|
|
87
|
-
"enum": ["slack", "gmail", "basecamp", "sharepoint"],
|
|
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`."
|
|
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; since 0.83.0 an app reads the number an alias maps to with phone.number.get."
|
|
89
89
|
},
|
|
90
90
|
"BasecampAccount": {
|
|
91
91
|
"type": "object",
|
|
@@ -290,6 +290,21 @@
|
|
|
290
290
|
"userModeApproval": "automatic",
|
|
291
291
|
"createdAt": "2026-10-11T08:00:00Z",
|
|
292
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", "phone.number.get"],
|
|
305
|
+
"developmentPreapproval": { "enabled": false, "hours": 24 },
|
|
306
|
+
"createdAt": "2026-10-17T08:00:00Z",
|
|
307
|
+
"updatedAt": "2026-10-17T08:00:00Z"
|
|
293
308
|
}
|
|
294
309
|
]
|
|
295
310
|
}
|