@fourier-labs/harbour-contracts 0.82.0 → 0.84.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 CHANGED
@@ -38,9 +38,9 @@ exist here first.
38
38
  | `binding-classification-subject.schema.json` | Complete value-free binding-name classification before version allocation | AI governance §5.7 / SEC-UP-01 |
39
39
  | `sanitized-binding-evidence.schema.json` | Exact-version sanitized runtime-binding allocation receipt | AI governance §5.7 / SEC-UP-02 |
40
40
  | `ai-pricing-revision`, `ai-metering-policy`, `ai-budget-ledger-event`, `ai-trace-event-v2` | Additive metering v2 records, including media dimensions and P5 trace attribution; v1 records remain readable | AI governance §9 |
41
- | `app-integrations-declaration.schema.json` | Committed `.isomorph/integrations.json` (`isomorph.app-integrations/2.0`): closed thirty-five-operation set (Slack read/post/update/delete/DM/lookup, Gmail list/thread/read/send/attachment — ADR 0018; Basecamp project/to-do list/to-do/message/comment/people lists, to-do create and complete, message, comment and Campfire posts — ADR 0022; SharePoint list/item/drive/file lists, file search and read, item create and update, file upload — ADR 0024; phone SMS list — ADR 0028; warehouse view read and table append, the view mapping saying `access: read|append` — ADR 0028; service request) with fixed or declared identity modes; owns the shared operation/identity/environment enums | Dev kit §4 |
42
- | `integration-execute-request`, `integration-execute-result`, `integration-connect-result`, `integration-error-details` | App SDK integrations wire contract on `/_harbour/integrations/*`: per-operation input bounds (a warehouse read filters, groups, aggregates and sorts in the warehouse and says when it was `truncated` — ADR 0017; Slack and Gmail reads page, posts thread, mail carries HTML and attachments — ADR 0018; a development warehouse read may carry the app's `sampleRows` and the result says `sample` — ADR 0021; Basecamp lists page by `pageToken`, ids are digit strings, writes answer `{id, appUrl}` — ADR 0022; SharePoint lists page by a Graph `$skiptoken`, ids are Graph ids, `fields` is a bounded record, writes answer `{id, webUrl}` — ADR 0024; a warehouse append takes `rows`, a bounded list of records, and a phone SMS list takes `since`/`from` — ADR 0028), the per-operation result shapes, consent states and the closed `details.code` reason set | Dev kit §4, §8 |
43
- | `saas-connection.schema.json`, `data-grant-v2.schema.json` | Tenant SaaS connection record (one installation and channel map per tenant and provider; IT's optional `oauthClient`, `userModeApproval`, `directMessages`, `externalRecipients` — ADR 0018; a Basecamp connection's pinned `account` and project ids in `channels` — ADR 0022; a SharePoint connection's pinned Microsoft 365 tenant in `account` and site ids in `channels` — ADR 0024; up to 20 `approvers` who may approve access requests beside the tenant admins — ADR 0026; a phone connection's E.164 numbers in `channels` — ADR 0028) and the additive `harbour.data-grant/2.0` grant record with structured resources and provisioning lease/cleanup (status machine generated; legacy `data-grant` untouched) | Dev kit §5 |
41
+ | `app-integrations-declaration.schema.json` | Committed `.isomorph/integrations.json` (`isomorph.app-integrations/2.0`): closed thirty-six-operation set (Slack read/post/update/delete/DM/lookup, Gmail list/thread/read/send/attachment — ADR 0018; Basecamp project/to-do list/to-do/message/comment/people lists, to-do create and complete, message, comment and Campfire posts — ADR 0022; SharePoint list/item/drive/file lists, file search and read, item create and update, file upload — ADR 0024; phone SMS list — ADR 0028; phone number read — ADR 0029; warehouse view read and table append, the view mapping saying `access: read|append` — ADR 0028; service request) with fixed or declared identity modes; owns the shared operation/identity/environment enums | Dev kit §4 |
42
+ | `integration-execute-request`, `integration-execute-result`, `integration-connect-result`, `integration-error-details` | App SDK integrations wire contract on `/_harbour/integrations/*`: per-operation input bounds (a warehouse read filters, groups, aggregates and sorts in the warehouse and says when it was `truncated` — ADR 0017; Slack and Gmail reads page, posts thread, mail carries HTML and attachments — ADR 0018; a development warehouse read may carry the app's `sampleRows` and the result says `sample` — ADR 0021; Basecamp lists page by `pageToken`, ids are digit strings, writes answer `{id, appUrl}` — ADR 0022; SharePoint lists page by a Graph `$skiptoken`, ids are Graph ids, `fields` is a bounded record, writes answer `{id, webUrl}` — ADR 0024; a warehouse append takes `rows`, a bounded list of records, and a phone SMS list takes `since`/`from` — ADR 0028; a phone number read takes no input — ADR 0029), the per-operation result shapes, consent states and the closed `details.code` reason set | Dev kit §4, §8 |
43
+ | `saas-connection.schema.json`, `data-grant-v2.schema.json` | Tenant SaaS connection record (one installation and channel map per tenant and provider; IT's optional `oauthClient`, `userModeApproval`, `directMessages`, `externalRecipients` — ADR 0018; a Basecamp connection's pinned `account` and project ids in `channels` — ADR 0022; a SharePoint connection's pinned Microsoft 365 tenant in `account` and site ids in `channels` — ADR 0024; up to 20 `approvers` who may approve access requests beside the tenant admins — ADR 0026; a phone connection's E.164 numbers in `channels` — ADR 0028, which an app reads back by alias — ADR 0029) and the additive `harbour.data-grant/2.0` grant record with structured resources and provisioning lease/cleanup (status machine generated; legacy `data-grant` untouched) | Dev kit §5 |
44
44
  | `kit-bundle-manifest.schema.json`, `kit-lock.schema.json` | Published kit bundle identity (SDK tarball digest plus optional `sdk.version` and https `sdk.url` download location) and the committed `.isomorph/kit.lock.json` the CodeBuild SDK-vendoring gate compares against | Dev kit §3 |
45
45
  | `deploy-response.schema.json` | 202 Accepted body for `POST /v1/tenants/{tenant}/apps/{app}/deployments`, returned only after the authoritative QUEUED version exists and its SQS message is accepted | — |
46
46
  | `deployment-source.schema.json` | Credential-free source in the `DeployRequest` body: `provider` is `github` or `gitlab`, `repositoryUrl` is shape-only and the deployment control plane checks the host against the tenant's source connection (ADR 0023); credentials are resolved internally by MaterializeSource | — |
@@ -57,7 +57,7 @@ exist here first.
57
57
  | `deployment-continuation.schema.json` | Immutable reference admitting one child deployment from a parked input request; never credential values | — |
58
58
  | `security-scan-input-v2.schema.json` | Input to the Security Assurance machine (`harbour.security-scan-input/2.0`, replaces v1): one package validated at source intake, scanned in the tenant's execution account | ADR 0014 |
59
59
  | `security-verdict.schema.json` | Security Assurance decision; `BLOCKED` surfaces as the non-retryable `gate.security-scan` category | ADR 0014 |
60
- | `data-source.schema.json` | Admin-registered external data source; `credentialRef` is a secretref URI and the credential never crosses this boundary; optional `development`/`preview` copies under `environments`, production is the top-level endpoint; connectors include `trino` (ADR 0021) | Data-Access MVP |
60
+ | `data-source.schema.json` | Admin-registered external data source; `credentialRef` is a secretref URI and the credential never crosses this boundary; optional `development`/`preview` copies under `environments`, production is the top-level endpoint; connectors include `trino` (ADR 0021) and `clickhouse` (ADR 0030) | Data-Access MVP |
61
61
  | `data-dependency.schema.json` | One external data dependency of an app, declared or detected, classified against the tenant's data-source inventory | Data-Access MVP |
62
62
  | `secret-reference.schema.json` | Named secret slot an app depends on; only the reference and its lifecycle cross, never the value | Secret-Manager MVP |
63
63
  | `ai-callsite-inventory.schema.json` | Immutable, sanitized AI call-site discovery for one exact deployment version (detection only) | AI governance |
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "schema": "harbour.contract-release/1.0",
3
- "repositoryVersion": "0.82.0.0",
4
- "publishVersion": "0.82.0",
5
- "publishTag": "v0.82.0",
6
- "schemasDigest": "sha256:5e343582707c909a64aff417f7df3a060180acd1feaea494f1aeba226dc9d8a6",
3
+ "repositoryVersion": "0.84.0.0",
4
+ "publishVersion": "0.84.0",
5
+ "publishTag": "v0.84.0",
6
+ "schemasDigest": "sha256:95b67750a79742737af7a6f27076b90f8310e7c798059a1e724ef687e5733626",
7
7
  "aiFixturesDigest": "sha256:edac31c92e146ca1c40130f2fb5649db82e24b8cd1ac758153b90612052fddb6",
8
- "generatedGoDigest": "sha256:e73e21a8cb0d2bd51c9f97bccb1cbde3500abed034ff39c0c57dbfd115c74eb0",
9
- "generatedTypeScriptDigest": "sha256:2463ea4f5e1111d75056fc41155247945385b1d2716f7771eecfdba76910af02",
8
+ "generatedGoDigest": "sha256:cc30d209cd0d8e13c0fc9d1533fce8b016b1fb18535e522ad88bce8a7782d9fe",
9
+ "generatedTypeScriptDigest": "sha256:b1f5d28fc95d7ca0e12d019dc8407f9d1bfb8fb937733e7a5b9992dce26addf1",
10
10
  "generatedExclusions": {
11
11
  "gen-go/contract_release.go": "contains the generated aggregate digests (self-reference)",
12
12
  "gen-ts/contract-release.ts": "contains the generated aggregate digests (self-reference)"
@@ -31,15 +31,15 @@
31
31
  "schema/ai-transform-result.schema.json": "sha256:244e380a36957ab2dcb526ea22aaecb56b53664ce1fda6934d0021c084c99133",
32
32
  "schema/ai-verification-evidence.schema.json": "sha256:bdbc762df256d2a8dd0bdda60d4d13915ce40034cd756af9515871d145f10ad9",
33
33
  "schema/api-error-response.schema.json": "sha256:3d43d5bdf0b59c944e20509d832e6776c3ecdba4d6c245a9118bbe52062a8304",
34
- "schema/app-integrations-declaration.schema.json": "sha256:04b79becdd80019bcfc285dbe081cb4ad0b643b3789471efaeb335f380f4ce4b",
34
+ "schema/app-integrations-declaration.schema.json": "sha256:e927502a5be1e37ccb2aaee880d592f2b322184ed47d5a1a0742f5a81d9c2ea1",
35
35
  "schema/app-sign-in.schema.json": "sha256:2093740131b84a69757c2e474d16e32ff5d0bf0edd6f6f8de62ede7f82988f29",
36
36
  "schema/artifact-contract.schema.json": "sha256:8047b461a1c6d07bbe867a259c57bdf5cc0fdf282cf842ec7b683a9e93713b10",
37
37
  "schema/binding-classification-subject.schema.json": "sha256:a8825ce652e7e00a18759c4249bd5bcd0cae552dd58440513f867e87f685133c",
38
38
  "schema/builder-input-proposal.schema.json": "sha256:fe85cffa6d76b1e1effe1f5d75525f8fe0e1eaa3be4a304e491aa23ad72c0e72",
39
39
  "schema/data-dependency.schema.json": "sha256:b4cc2b2484e982cfed64c0f56b8f1e9d1363c71854cd71f845b24fbe7d85c971",
40
- "schema/data-grant-v2.schema.json": "sha256:6c948c4a25555a0eee42a9dffb7d4a0f7f20ccb7b1cbe783d5306e6ff01967cf",
40
+ "schema/data-grant-v2.schema.json": "sha256:14453426d0649e77f2b2ecf9633012d5473c0caf0ed4ff4e9ccb22ba2cce8335",
41
41
  "schema/data-grant.schema.json": "sha256:e640553831ecc1c01cc9a37fe388b84d0ffeaa0d0050e63712b48f65fa437c8a",
42
- "schema/data-source.schema.json": "sha256:46ef4ace5fce612fce055813bf4f99956423b46c929993fbbc5dfec497087bad",
42
+ "schema/data-source.schema.json": "sha256:f32b2b4312bc06e023f4e1da60eed52ddfade59b74c1a1cc8e4b740a6f9c930b",
43
43
  "schema/deploy-request.schema.json": "sha256:c978406c273fa430db262888f0a8646b14e3057f64b0633780fcd6cfa646bc67",
44
44
  "schema/deploy-response.schema.json": "sha256:09064948abdbba7022738285d802ed44648a16ddc2a5b8c2eeb170ae19a66aeb",
45
45
  "schema/deployment-app-registration.schema.json": "sha256:f1deb15a467065a20f540649aac3713e6c8afe68f03b43969ef103356b7baa13",
@@ -57,7 +57,7 @@
57
57
  "schema/identity-context.schema.json": "sha256:a0be3d3499b70f1641887ec66ab5b21ca5ab71063e9209290905738943a36e59",
58
58
  "schema/integration-connect-result.schema.json": "sha256:3f254b67ef739dc1fa395bdc8c4dc93359b16d481dba2a2d777aa5b6f34b7af8",
59
59
  "schema/integration-error-details.schema.json": "sha256:5a290584b1542b2b8cdd4966869126180ce29c1f0dd250dca7fb68c05e76b8e9",
60
- "schema/integration-execute-request.schema.json": "sha256:d66041c6a113c399e8ddf9855841f7983a7aa1916a7c42a50d0bf6d6f1de87ed",
60
+ "schema/integration-execute-request.schema.json": "sha256:7906ca8deb270d2fc8ad6b7d000533960be96bdba0b8a51072d98834d0d7a79a",
61
61
  "schema/integration-execute-result.schema.json": "sha256:ad70ace26317b5517386e0e412947c68636f53692f0895fb7108dad25e887b8a",
62
62
  "schema/internal-configuration-request.schema.json": "sha256:229d44a3458f68dceddfba802e5c1adcd95523a45af29b93b972706b88461a7d",
63
63
  "schema/kit-bundle-manifest.schema.json": "sha256:4a9fcdd52ba0d55718ef4dbdab112b145ef90471d9356d4d3fb41e50fe9e400d",
@@ -66,7 +66,7 @@
66
66
  "schema/promotion-request.schema.json": "sha256:00e96dfd8ddbdba88ea222941d43f3609ff6c815a79e34f6705cab458101c969",
67
67
  "schema/promotion-response.schema.json": "sha256:4129712d2e29d6ef21d93d4bd0bacfd60ada3f2ee0ade852824e64346b817634",
68
68
  "schema/resolved-app-serving.schema.json": "sha256:1912f3224db1a1699618e6322358e07f76425d3097aec2fbe5d38a10e5c967e3",
69
- "schema/saas-connection.schema.json": "sha256:0bf4bc43e0b685b2ae3bd1f0bcab518076ff184db9af71742c266175ef0eec52",
69
+ "schema/saas-connection.schema.json": "sha256:0da79a6957486f7037c46ae3b0f43a22061ad4c7c87ffabb4714f59537e1de52",
70
70
  "schema/sanitized-binding-evidence.schema.json": "sha256:1191ab88e2764df927e5f17837674cebebe068d480da2b2fdb390e589f96b51f",
71
71
  "schema/secret-reference.schema.json": "sha256:db4e3c2c6a2dbd72d7ea0f9c91cb3b2343a7e67b601996c6818b2ef08e440895",
72
72
  "schema/security-scan-input-v2.schema.json": "sha256:0d418342078c9b5046ea6f4bef3c2c57539285dfee99cc0850d4f0d03739ee13",
@@ -112,11 +112,11 @@
112
112
  "gen-go/contracts_test.go": "sha256:56376287cb1548be1b35ab4c65d6f0b558c5d34885f7a47cb3d9e8d786607bf5",
113
113
  "gen-go/doc.go": "sha256:316d610ce568597a2ce6f38e9782e34fa5920f6f51ab0866e6d061b8a41cd822",
114
114
  "gen-go/error_category.go": "sha256:b2ddea22dcfa030f1a45e721e635485b0bd816cf1f38e7654628a653f5ed4583",
115
- "gen-go/integration_execute_input_rules.go": "sha256:e1272150d93bf86175070e58d45e91012b8c34479d0d1b2c0c7cf1900749a638",
116
- "gen-go/integration_execute_input_rules_test.go": "sha256:1151639b08c1a228af47b41368762c61958c47356729ce23b3ed28871096b421",
117
- "gen-go/integration_operations.go": "sha256:3939ad2e4729f0c37dec269eac009945ca9a2b54ac17cd727be66103966ae5d1",
115
+ "gen-go/integration_execute_input_rules.go": "sha256:b76e8ff9a5745a2fd70429e2d8dfa3a8efc1f74a1d5c24ef563954c8082a9848",
116
+ "gen-go/integration_execute_input_rules_test.go": "sha256:276dc9522cb7554a69982131800562c5435d460cd05dc81e007e1c7ff392980d",
117
+ "gen-go/integration_operations.go": "sha256:7efe1e6c238e1a656b8b2e2510f9432b30d251051fbbfca2d439656d0853c12b",
118
118
  "gen-go/schema_documents.go": "sha256:c19c0d540f602ee997a84b90e20702d9bc63ed7d27aec267e76c04655fc182e0",
119
- "gen-go/types.go": "sha256:7f3d880de0cbb54549dc9e825e3ff1361398a294ae9075467c8260bc6b8d2fbb",
119
+ "gen-go/types.go": "sha256:eaa7b6d48f59af816d81e113abfdc5faaa181e57cfeca4725010f88fe4c09d4e",
120
120
  "gen-go/version_state.go": "sha256:4ef8abb126414c0025cf2c59bc9c79a74ef4a2ff89e8f316cbf05acc872371c1"
121
121
  },
122
122
  "generatedTypeScript": {
@@ -141,16 +141,16 @@
141
141
  "gen-ts/ai-transform-result.ts": "sha256:208c66b2aeb425c0cbcc18b7191f6e8989443f2b2c1690648e0e06cc1448ce25",
142
142
  "gen-ts/ai-verification-evidence.ts": "sha256:979439d77f8b47631d1eb3b6c3c54ea6fec41089d2a51dc815fd370b1c4917fc",
143
143
  "gen-ts/api-error-response.ts": "sha256:0fd73be282e7a5d72d6c343a4e64d09c232556b16161167f0cffd6278ed7e3d3",
144
- "gen-ts/app-integrations-declaration.ts": "sha256:a629532c69e3fdb3beac01729ee1c78441691a393e7a3bf017515bdd26823004",
144
+ "gen-ts/app-integrations-declaration.ts": "sha256:fb5d91d34a0197d32600c2391b130aa9cb7d330138bc9fc5cc98a7ffeef65155",
145
145
  "gen-ts/app-sign-in.ts": "sha256:bf88671c00e9d9badb5ffc961a7e803cf92cee5a98c2f6c9e3172bbf5aaf0424",
146
146
  "gen-ts/artifact-contract.ts": "sha256:4a6dc6d2caaeed4bb2066cc8a333e6e09e5a0d4745e0b1038293d54ab9403aeb",
147
147
  "gen-ts/binding-classification-digest-helper.ts": "sha256:40fc7d85b4c3f3ffc5caf7d7950c62d013c83ee42058c7453b2100d95817f167",
148
148
  "gen-ts/binding-classification-subject.ts": "sha256:c409a3fd7b942b50419632c51d9a79474fb30d6374bdc79c0e25c73618e800c3",
149
149
  "gen-ts/builder-input-proposal.ts": "sha256:b0108c3787873d3cf1a39f00967379418a6766275d3474cfa55f5a9d93ead174",
150
150
  "gen-ts/data-dependency.ts": "sha256:259f19e2759395d72ead90b8ed74a6dcef0c2641124f4f182823138cfd19bedf",
151
- "gen-ts/data-grant-v2.ts": "sha256:e4517a579fb09c8e585aee4a6b93d615bd56408cdb428e4b0478e925339d0b5c",
151
+ "gen-ts/data-grant-v2.ts": "sha256:da384806e5206d0da37cae7c71755c6ecda9a660151b713d36c7752132ce040e",
152
152
  "gen-ts/data-grant.ts": "sha256:2358579d8aa1e57b01a6f2b0eacce5531e7f21ef226404c9809925365e0d6155",
153
- "gen-ts/data-source.ts": "sha256:f30d4c14c15afbb9530d30af9235844198765984ce1579fa25961d7f07bcfb1f",
153
+ "gen-ts/data-source.ts": "sha256:2566f0d5c72e44278869f55211cf3d433aeb3552e57ae0ace0ff0b85e769dde6",
154
154
  "gen-ts/deploy-request.ts": "sha256:913245577a95354849d3a8cb43fbaedbf895efe7b653c8502d25edfa22b7a864",
155
155
  "gen-ts/deploy-response.ts": "sha256:364d9f1acf32e491498237cdd3f402d5f8e102f208db7748034f4ec68c6a6137",
156
156
  "gen-ts/deployment-app-registration.ts": "sha256:8c2d55983e33449ecfbaceaa41aac3e2905f1970f5514f0dbc3b611fad7beefb",
@@ -170,10 +170,10 @@
170
170
  "gen-ts/index.ts": "sha256:8f0b03bc46f0f24489e6a3f7a3ddee23c86dacc8ab2058b3b131c3d9dd75ab29",
171
171
  "gen-ts/integration-connect-result.ts": "sha256:4b10f169b6e1af364e9b418de21caa9fadbfb77b43cbff77d741cfae0b52180c",
172
172
  "gen-ts/integration-error-details.ts": "sha256:e73cb5942373ef88b2d8e03a1de56d5a69e71069ecd14e68396f7edba1f60780",
173
- "gen-ts/integration-execute-input-rules.ts": "sha256:097437c79c9a8a61300af1182688f8c6d70b1a46639e8551e458ad85a8b5379c",
174
- "gen-ts/integration-execute-request.ts": "sha256:d69778e4c3d4a6f3c0e9b2c90e0f1084d29ca288e6e78944a472109e5d92a2c4",
173
+ "gen-ts/integration-execute-input-rules.ts": "sha256:ae92771b636169641e9bac10f0219dbc81a19c229470d963c86abe43de314687",
174
+ "gen-ts/integration-execute-request.ts": "sha256:b1edc2bcfe8a42916e2f45032810eff988594dabbdc12ea6e9310560760f491f",
175
175
  "gen-ts/integration-execute-result.ts": "sha256:3ec3dfddb5c93b9802607c5fb8dfab499e5a578501fd4ce20d05d511b37e43d8",
176
- "gen-ts/integration-operations.ts": "sha256:bfcf44fd4cf65554f740cf2256e8b3f45c66dbe3e6d00d5587ff21374047a0e9",
176
+ "gen-ts/integration-operations.ts": "sha256:846d4ddc4d4c8d8e9ce42b7990b0929783dab82141f89d5c003088a37b6875ea",
177
177
  "gen-ts/internal-configuration-request.ts": "sha256:7032437797473fa1c581d134adef2f3d4b4f4132f482cd17743e9d47097886bc",
178
178
  "gen-ts/kit-bundle-manifest.ts": "sha256:2777a268aef8787b81e71d154a7d05f6f5ded09d66f378211ff5493ddb885171",
179
179
  "gen-ts/kit-lock.ts": "sha256:00ceeb97e9b7d0187bec00728f5099fd34e775e9cc44c85c4714f7a3a4118ef6",
@@ -181,7 +181,7 @@
181
181
  "gen-ts/promotion-request.ts": "sha256:9db88cef67f777a16bac628039ec3f582acb9e8cfff6fb592b30d0a0e55abc68",
182
182
  "gen-ts/promotion-response.ts": "sha256:f1c9cafac96faeb02a443a31786f67714e818f38d90108e7af41958396524d6f",
183
183
  "gen-ts/resolved-app-serving.ts": "sha256:584792e8e0dcaf4322129b6f78579cd8cd21652c8db8a1606f802408c892534c",
184
- "gen-ts/saas-connection.ts": "sha256:2b87289f3b7fd07de73402cf03c26e02d02139779ef0229adb6916fe9941b63c",
184
+ "gen-ts/saas-connection.ts": "sha256:e98a056f896ef8c8e238bcf60a608d05e9595f59a22f39cafd4fa3ce7ce93383",
185
185
  "gen-ts/sanitized-binding-digest-helper.ts": "sha256:c47d7fdc20500e2e72c23fe39ecdd610fc397c47fcba51335ebec3c380fe6872",
186
186
  "gen-ts/sanitized-binding-evidence.ts": "sha256:f3fb7b1d7d2e0929eb0ea981eaf32db3104010647185f6ae59f67167d42538a9",
187
187
  "gen-ts/secret-reference.ts": "sha256:731fbcde7315cb4128d5b01bdbe6e6f248f13c7ad8dea04a3a4e927ac4890198",
@@ -34,6 +34,7 @@ export type DeclaredConnection = {
34
34
  'sharepoint.file.read'?: UserModeChannelOperation;
35
35
  'sharepoint.file.upload'?: UserModeChannelOperation;
36
36
  'phone.sms.list'?: AppModeChannelOperation;
37
+ 'phone.number.get'?: AppModeChannelOperation;
37
38
  'warehouse.view.read'?: AppModeViewOperation;
38
39
  'warehouse.table.append'?: AppModeViewOperation;
39
40
  'service.request'?: ServiceOperation;
@@ -1,7 +1,7 @@
1
- export declare const ContractRepositoryVersion: "0.82.0.0";
2
- export declare const ContractPublishVersion: "0.82.0";
3
- export declare const ContractPublishTag: "v0.82.0";
4
- export declare const ContractSchemasDigest: "sha256:5e343582707c909a64aff417f7df3a060180acd1feaea494f1aeba226dc9d8a6";
1
+ export declare const ContractRepositoryVersion: "0.84.0.0";
2
+ export declare const ContractPublishVersion: "0.84.0";
3
+ export declare const ContractPublishTag: "v0.84.0";
4
+ export declare const ContractSchemasDigest: "sha256:95b67750a79742737af7a6f27076b90f8310e7c798059a1e724ef687e5733626";
5
5
  export declare const ContractAiFixturesDigest: "sha256:edac31c92e146ca1c40130f2fb5649db82e24b8cd1ac758153b90612052fddb6";
6
- export declare const ContractGeneratedGoDigest: "sha256:e73e21a8cb0d2bd51c9f97bccb1cbde3500abed034ff39c0c57dbfd115c74eb0";
7
- export declare const ContractGeneratedTypeScriptDigest: "sha256:2463ea4f5e1111d75056fc41155247945385b1d2716f7771eecfdba76910af02";
6
+ export declare const ContractGeneratedGoDigest: "sha256:cc30d209cd0d8e13c0fc9d1533fce8b016b1fb18535e522ad88bce8a7782d9fe";
7
+ export declare const ContractGeneratedTypeScriptDigest: "sha256:b1f5d28fc95d7ca0e12d019dc8407f9d1bfb8fb937733e7a5b9992dce26addf1";
@@ -1,9 +1,9 @@
1
1
  /* eslint-disable */
2
2
  // Code generated by tools/gen/gen.mjs from schema/*.json. DO NOT EDIT.
3
- export const ContractRepositoryVersion = "0.82.0.0";
4
- export const ContractPublishVersion = "0.82.0";
5
- export const ContractPublishTag = "v0.82.0";
6
- export const ContractSchemasDigest = "sha256:5e343582707c909a64aff417f7df3a060180acd1feaea494f1aeba226dc9d8a6";
3
+ export const ContractRepositoryVersion = "0.84.0.0";
4
+ export const ContractPublishVersion = "0.84.0";
5
+ export const ContractPublishTag = "v0.84.0";
6
+ export const ContractSchemasDigest = "sha256:95b67750a79742737af7a6f27076b90f8310e7c798059a1e724ef687e5733626";
7
7
  export const ContractAiFixturesDigest = "sha256:edac31c92e146ca1c40130f2fb5649db82e24b8cd1ac758153b90612052fddb6";
8
- export const ContractGeneratedGoDigest = "sha256:e73e21a8cb0d2bd51c9f97bccb1cbde3500abed034ff39c0c57dbfd115c74eb0";
9
- export const ContractGeneratedTypeScriptDigest = "sha256:2463ea4f5e1111d75056fc41155247945385b1d2716f7771eecfdba76910af02";
8
+ export const ContractGeneratedGoDigest = "sha256:cc30d209cd0d8e13c0fc9d1533fce8b016b1fb18535e522ad88bce8a7782d9fe";
9
+ export const ContractGeneratedTypeScriptDigest = "sha256:b1f5d28fc95d7ca0e12d019dc8407f9d1bfb8fb937733e7a5b9992dce26addf1";
@@ -29,11 +29,11 @@ export interface DataGrantV2 {
29
29
  kind: 'saas' | 'database' | 'service';
30
30
  status: DataGrantV2Status;
31
31
  /**
32
- * Approved operations; each must match this grant's mode. Empty until the first approval. At most the thirty-two SaaS operations (0.82.0: eleven Slack and Gmail, eleven Basecamp, nine SharePoint, one phone); a database grant holds up to two (warehouse.view.read, warehouse.table.append).
32
+ * Approved operations; each must match this grant's mode. Empty until the first approval. At most the thirty-three SaaS operations (0.83.0: eleven Slack and Gmail, eleven Basecamp, nine SharePoint, two phone); a database grant holds up to two (warehouse.view.read, warehouse.table.append).
33
33
  *
34
- * @maxItems 32
34
+ * @maxItems 33
35
35
  */
36
- operations: ('slack.channel.history' | 'slack.message.post' | 'slack.message.update' | 'slack.message.delete' | 'slack.dm.send' | 'slack.user.lookup' | 'gmail.thread.list' | 'gmail.thread.read' | 'gmail.message.read' | 'gmail.message.send' | 'gmail.attachment.read' | '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.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' | 'phone.sms.list' | 'warehouse.view.read' | 'warehouse.table.append' | 'service.request')[];
36
+ operations: ('slack.channel.history' | 'slack.message.post' | 'slack.message.update' | 'slack.message.delete' | 'slack.dm.send' | 'slack.user.lookup' | 'gmail.thread.list' | 'gmail.thread.read' | 'gmail.message.read' | 'gmail.message.send' | 'gmail.attachment.read' | '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.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' | 'phone.sms.list' | 'phone.number.get' | 'warehouse.view.read' | 'warehouse.table.append' | 'service.request')[];
37
37
  /**
38
38
  * Approved logical resources. Never inherited by wildcard. Empty until the first approval.
39
39
  *
@@ -1,7 +1,7 @@
1
1
  /**
2
- * Closed connector set for the Data-Access MVP. trino (0.74.0): Trino/Presto-compatible engines (Trino, Presto, Starburst, Galaxy) over the Trino HTTP statement protocol; the endpoint reuses host, port and database (as the Trino catalog) with no connector-specific fields.
2
+ * Closed connector set for the Data-Access MVP. trino (0.74.0): Trino/Presto-compatible engines (Trino, Presto, Starburst, Galaxy) over the Trino HTTP statement protocol; the endpoint reuses host, port and database (as the Trino catalog) with no connector-specific fields. clickhouse (0.84.0): ClickHouse over its HTTP interface; the endpoint reuses host, port (the HTTP port, not the native 9000) and database (the default database); the credential is {user, password} and may name protocol http or https (default https), like MySQL carries sslMode.
3
3
  */
4
- export type DataSourceConnector = 'postgres' | 'redshift' | 'bigquery' | 'databricks' | 'mysql' | 'trino';
4
+ export type DataSourceConnector = 'postgres' | 'redshift' | 'bigquery' | 'databricks' | 'mysql' | 'trino' | 'clickhouse';
5
5
  /**
6
6
  * byo = admin brought existing infrastructure; harbour_managed = Isomorph provisioned it.
7
7
  */
@@ -797,6 +797,10 @@ export declare const IntegrationExecuteInputRules: {
797
797
  };
798
798
  };
799
799
  };
800
+ readonly "phone.number.get": {
801
+ readonly idempotencyKey: false;
802
+ readonly fields: {};
803
+ };
800
804
  readonly "warehouse.view.read": {
801
805
  readonly idempotencyKey: false;
802
806
  readonly fields: {
@@ -248,6 +248,10 @@ export const IntegrationExecuteInputRules = {
248
248
  from: { kind: "string", required: false, minLength: 0, maxLength: 32 },
249
249
  },
250
250
  },
251
+ "phone.number.get": {
252
+ idempotencyKey: false,
253
+ fields: {},
254
+ },
251
255
  "warehouse.view.read": {
252
256
  idempotencyKey: false,
253
257
  fields: {
@@ -7,9 +7,9 @@ export type IntegrationExecuteRequest = {
7
7
  */
8
8
  connection: string;
9
9
  /**
10
- * Closed operation set. Extending it is a contracts change. 0.78.0 (ADR 0024) adds the nine SharePoint operations, every one user mode only on a site alias (a key of the connection's `channels` map, holding a Microsoft Graph site id): sharepoint.list.list, sharepoint.item.list, sharepoint.item.create (a receipted write: explicit action, idempotencyKey), sharepoint.item.update (a PATCH, idempotent at Graph, no key), sharepoint.drive.list, sharepoint.file.list, sharepoint.file.search, sharepoint.file.read and sharepoint.file.upload (a receipted write). 0.76.0 (ADR 0022) adds the eleven Basecamp operations, every one user mode only like gmail.*: basecamp.project.list (the projects of the company's pinned Basecamp account; its resource is the fixed `account` alias), and on one mapped project (the resource is a project alias, a key of the connection's `channels` map) basecamp.todolist.list, basecamp.todo.list, basecamp.todo.create (a receipted write: explicit action, idempotencyKey), basecamp.todo.complete (idempotent at Basecamp, no key), basecamp.message.list, basecamp.message.post, basecamp.comment.list, basecamp.comment.post, basecamp.campfire.post (the three posts are receipted writes) and basecamp.people.list. 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. 0.82.0 (ADR 0028) adds phone.sms.list (app mode only, a number alias from a phone connection's `channels` map: the SMS received on that number since a time) and warehouse.table.append (app mode only on a database connection, a receipted write with idempotencyKey: rows appended to a view alias whose mapping says `access: append`).
10
+ * Closed operation set. Extending it is a contracts change. 0.78.0 (ADR 0024) adds the nine SharePoint operations, every one user mode only on a site alias (a key of the connection's `channels` map, holding a Microsoft Graph site id): sharepoint.list.list, sharepoint.item.list, sharepoint.item.create (a receipted write: explicit action, idempotencyKey), sharepoint.item.update (a PATCH, idempotent at Graph, no key), sharepoint.drive.list, sharepoint.file.list, sharepoint.file.search, sharepoint.file.read and sharepoint.file.upload (a receipted write). 0.76.0 (ADR 0022) adds the eleven Basecamp operations, every one user mode only like gmail.*: basecamp.project.list (the projects of the company's pinned Basecamp account; its resource is the fixed `account` alias), and on one mapped project (the resource is a project alias, a key of the connection's `channels` map) basecamp.todolist.list, basecamp.todo.list, basecamp.todo.create (a receipted write: explicit action, idempotencyKey), basecamp.todo.complete (idempotent at Basecamp, no key), basecamp.message.list, basecamp.message.post, basecamp.comment.list, basecamp.comment.post, basecamp.campfire.post (the three posts are receipted writes) and basecamp.people.list. 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. 0.82.0 (ADR 0028) adds phone.sms.list (app mode only, a number alias from a phone connection's `channels` map: the SMS received on that number since a time) and warehouse.table.append (app mode only on a database connection, a receipted write with idempotencyKey: rows appended to a view alias whose mapping says `access: append`). 0.83.0 (ADR 0029) adds phone.number.get (app mode only, read-only, no input, on a number alias from a phone connection's `channels` map: the E.164 number that alias maps to, so the app — or a computer-use agent it drives — can type it into a portal that signs in by mobile number).
11
11
  */
12
- operation: 'slack.channel.history' | 'slack.message.post' | 'slack.message.update' | 'slack.message.delete' | 'slack.dm.send' | 'slack.user.lookup' | 'gmail.thread.list' | 'gmail.thread.read' | 'gmail.message.read' | 'gmail.message.send' | 'gmail.attachment.read' | '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.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' | 'phone.sms.list' | 'warehouse.view.read' | 'warehouse.table.append' | 'service.request';
12
+ operation: 'slack.channel.history' | 'slack.message.post' | 'slack.message.update' | 'slack.message.delete' | 'slack.dm.send' | 'slack.user.lookup' | 'gmail.thread.list' | 'gmail.thread.read' | 'gmail.message.read' | 'gmail.message.send' | 'gmail.attachment.read' | '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.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' | 'phone.sms.list' | 'phone.number.get' | 'warehouse.view.read' | 'warehouse.table.append' | 'service.request';
13
13
  /**
14
14
  * Tenant-wide logical alias of a connection (governance sourceId) or of a resource under it.
15
15
  */
@@ -224,6 +224,13 @@ export declare const IntegrationOperations: {
224
224
  readonly declaredMode: false;
225
225
  readonly idempotencyKey: false;
226
226
  };
227
+ readonly "phone.number.get": {
228
+ readonly kind: "saas";
229
+ readonly identities: readonly ["app"];
230
+ readonly readOnly: true;
231
+ readonly declaredMode: false;
232
+ readonly idempotencyKey: false;
233
+ };
227
234
  readonly "warehouse.view.read": {
228
235
  readonly kind: "database";
229
236
  readonly identities: readonly ["app"];
@@ -294,6 +294,15 @@ export const IntegrationOperations = {
294
294
  "declaredMode": false,
295
295
  "idempotencyKey": false
296
296
  },
297
+ "phone.number.get": {
298
+ "kind": "saas",
299
+ "identities": [
300
+ "app"
301
+ ],
302
+ "readOnly": true,
303
+ "declaredMode": false,
304
+ "idempotencyKey": false
305
+ },
297
306
  "warehouse.view.read": {
298
307
  "kind": "database",
299
308
  "identities": [
@@ -1,5 +1,5 @@
1
1
  /**
2
- * 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.
2
+ * 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.
3
3
  */
4
4
  export type SaasProvider = 'slack' | 'gmail' | 'basecamp' | 'sharepoint' | 'phone';
5
5
  /**
@@ -52,12 +52,12 @@ export interface SaasConnection {
52
52
  [k: string]: string;
53
53
  };
54
54
  /**
55
- * 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.
55
+ * 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.
56
56
  *
57
57
  * @minItems 1
58
- * @maxItems 32
58
+ * @maxItems 33
59
59
  */
60
- operations: ('slack.channel.history' | 'slack.message.post' | 'slack.message.update' | 'slack.message.delete' | 'slack.dm.send' | 'slack.user.lookup' | 'gmail.thread.list' | 'gmail.thread.read' | 'gmail.message.read' | 'gmail.message.send' | 'gmail.attachment.read' | '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.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' | 'phone.sms.list' | 'warehouse.view.read' | 'warehouse.table.append' | 'service.request')[];
60
+ operations: ('slack.channel.history' | 'slack.message.post' | 'slack.message.update' | 'slack.message.delete' | 'slack.dm.send' | 'slack.user.lookup' | 'gmail.thread.list' | 'gmail.thread.read' | 'gmail.message.read' | 'gmail.message.send' | 'gmail.attachment.read' | '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.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' | 'phone.sms.list' | 'phone.number.get' | 'warehouse.view.read' | 'warehouse.table.append' | 'service.request')[];
61
61
  developmentPreapproval: DevelopmentPreapproval;
62
62
  oauthClient?: SaasOauthClient;
63
63
  userModeApproval?: UserModeApproval;
@@ -37,6 +37,7 @@ export type DeclaredConnection = {
37
37
  'sharepoint.file.read'?: UserModeChannelOperation;
38
38
  'sharepoint.file.upload'?: UserModeChannelOperation;
39
39
  'phone.sms.list'?: AppModeChannelOperation;
40
+ 'phone.number.get'?: AppModeChannelOperation;
40
41
  'warehouse.view.read'?: AppModeViewOperation;
41
42
  'warehouse.table.append'?: AppModeViewOperation;
42
43
  'service.request'?: ServiceOperation;
@@ -1,10 +1,10 @@
1
1
  /* eslint-disable */
2
2
  // Code generated by tools/gen/gen.mjs from schema/*.json. DO NOT EDIT.
3
3
 
4
- export const ContractRepositoryVersion = "0.82.0.0" as const;
5
- export const ContractPublishVersion = "0.82.0" as const;
6
- export const ContractPublishTag = "v0.82.0" as const;
7
- export const ContractSchemasDigest = "sha256:5e343582707c909a64aff417f7df3a060180acd1feaea494f1aeba226dc9d8a6" as const;
4
+ export const ContractRepositoryVersion = "0.84.0.0" as const;
5
+ export const ContractPublishVersion = "0.84.0" as const;
6
+ export const ContractPublishTag = "v0.84.0" as const;
7
+ export const ContractSchemasDigest = "sha256:95b67750a79742737af7a6f27076b90f8310e7c798059a1e724ef687e5733626" as const;
8
8
  export const ContractAiFixturesDigest = "sha256:edac31c92e146ca1c40130f2fb5649db82e24b8cd1ac758153b90612052fddb6" as const;
9
- export const ContractGeneratedGoDigest = "sha256:e73e21a8cb0d2bd51c9f97bccb1cbde3500abed034ff39c0c57dbfd115c74eb0" as const;
10
- export const ContractGeneratedTypeScriptDigest = "sha256:2463ea4f5e1111d75056fc41155247945385b1d2716f7771eecfdba76910af02" as const;
9
+ export const ContractGeneratedGoDigest = "sha256:cc30d209cd0d8e13c0fc9d1533fce8b016b1fb18535e522ad88bce8a7782d9fe" as const;
10
+ export const ContractGeneratedTypeScriptDigest = "sha256:b1f5d28fc95d7ca0e12d019dc8407f9d1bfb8fb937733e7a5b9992dce26addf1" as const;
@@ -33,9 +33,9 @@ export interface DataGrantV2 {
33
33
  kind: 'saas' | 'database' | 'service';
34
34
  status: DataGrantV2Status;
35
35
  /**
36
- * Approved operations; each must match this grant's mode. Empty until the first approval. At most the thirty-two SaaS operations (0.82.0: eleven Slack and Gmail, eleven Basecamp, nine SharePoint, one phone); a database grant holds up to two (warehouse.view.read, warehouse.table.append).
36
+ * Approved operations; each must match this grant's mode. Empty until the first approval. At most the thirty-three SaaS operations (0.83.0: eleven Slack and Gmail, eleven Basecamp, nine SharePoint, two phone); a database grant holds up to two (warehouse.view.read, warehouse.table.append).
37
37
  *
38
- * @maxItems 32
38
+ * @maxItems 33
39
39
  */
40
40
  operations: (
41
41
  | 'slack.channel.history'
@@ -70,6 +70,7 @@ export interface DataGrantV2 {
70
70
  | 'sharepoint.file.read'
71
71
  | 'sharepoint.file.upload'
72
72
  | 'phone.sms.list'
73
+ | 'phone.number.get'
73
74
  | 'warehouse.view.read'
74
75
  | 'warehouse.table.append'
75
76
  | 'service.request'
@@ -2,9 +2,10 @@
2
2
  // Code generated by tools/gen/gen.mjs from schema/*.json. DO NOT EDIT.
3
3
 
4
4
  /**
5
- * Closed connector set for the Data-Access MVP. trino (0.74.0): Trino/Presto-compatible engines (Trino, Presto, Starburst, Galaxy) over the Trino HTTP statement protocol; the endpoint reuses host, port and database (as the Trino catalog) with no connector-specific fields.
5
+ * Closed connector set for the Data-Access MVP. trino (0.74.0): Trino/Presto-compatible engines (Trino, Presto, Starburst, Galaxy) over the Trino HTTP statement protocol; the endpoint reuses host, port and database (as the Trino catalog) with no connector-specific fields. clickhouse (0.84.0): ClickHouse over its HTTP interface; the endpoint reuses host, port (the HTTP port, not the native 9000) and database (the default database); the credential is {user, password} and may name protocol http or https (default https), like MySQL carries sslMode.
6
6
  */
7
- export type DataSourceConnector = 'postgres' | 'redshift' | 'bigquery' | 'databricks' | 'mysql' | 'trino';
7
+ export type DataSourceConnector =
8
+ 'postgres' | 'redshift' | 'bigquery' | 'databricks' | 'mysql' | 'trino' | 'clickhouse';
8
9
  /**
9
10
  * byo = admin brought existing infrastructure; harbour_managed = Isomorph provisioned it.
10
11
  */
@@ -276,6 +276,10 @@ export const IntegrationExecuteInputRules = {
276
276
  from: { kind: "string", required: false, minLength: 0, maxLength: 32 },
277
277
  },
278
278
  },
279
+ "phone.number.get": {
280
+ idempotencyKey: false,
281
+ fields: {},
282
+ },
279
283
  "warehouse.view.read": {
280
284
  idempotencyKey: false,
281
285
  fields: {
@@ -10,7 +10,7 @@ export type IntegrationExecuteRequest = {
10
10
  */
11
11
  connection: string;
12
12
  /**
13
- * Closed operation set. Extending it is a contracts change. 0.78.0 (ADR 0024) adds the nine SharePoint operations, every one user mode only on a site alias (a key of the connection's `channels` map, holding a Microsoft Graph site id): sharepoint.list.list, sharepoint.item.list, sharepoint.item.create (a receipted write: explicit action, idempotencyKey), sharepoint.item.update (a PATCH, idempotent at Graph, no key), sharepoint.drive.list, sharepoint.file.list, sharepoint.file.search, sharepoint.file.read and sharepoint.file.upload (a receipted write). 0.76.0 (ADR 0022) adds the eleven Basecamp operations, every one user mode only like gmail.*: basecamp.project.list (the projects of the company's pinned Basecamp account; its resource is the fixed `account` alias), and on one mapped project (the resource is a project alias, a key of the connection's `channels` map) basecamp.todolist.list, basecamp.todo.list, basecamp.todo.create (a receipted write: explicit action, idempotencyKey), basecamp.todo.complete (idempotent at Basecamp, no key), basecamp.message.list, basecamp.message.post, basecamp.comment.list, basecamp.comment.post, basecamp.campfire.post (the three posts are receipted writes) and basecamp.people.list. 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. 0.82.0 (ADR 0028) adds phone.sms.list (app mode only, a number alias from a phone connection's `channels` map: the SMS received on that number since a time) and warehouse.table.append (app mode only on a database connection, a receipted write with idempotencyKey: rows appended to a view alias whose mapping says `access: append`).
13
+ * Closed operation set. Extending it is a contracts change. 0.78.0 (ADR 0024) adds the nine SharePoint operations, every one user mode only on a site alias (a key of the connection's `channels` map, holding a Microsoft Graph site id): sharepoint.list.list, sharepoint.item.list, sharepoint.item.create (a receipted write: explicit action, idempotencyKey), sharepoint.item.update (a PATCH, idempotent at Graph, no key), sharepoint.drive.list, sharepoint.file.list, sharepoint.file.search, sharepoint.file.read and sharepoint.file.upload (a receipted write). 0.76.0 (ADR 0022) adds the eleven Basecamp operations, every one user mode only like gmail.*: basecamp.project.list (the projects of the company's pinned Basecamp account; its resource is the fixed `account` alias), and on one mapped project (the resource is a project alias, a key of the connection's `channels` map) basecamp.todolist.list, basecamp.todo.list, basecamp.todo.create (a receipted write: explicit action, idempotencyKey), basecamp.todo.complete (idempotent at Basecamp, no key), basecamp.message.list, basecamp.message.post, basecamp.comment.list, basecamp.comment.post, basecamp.campfire.post (the three posts are receipted writes) and basecamp.people.list. 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. 0.82.0 (ADR 0028) adds phone.sms.list (app mode only, a number alias from a phone connection's `channels` map: the SMS received on that number since a time) and warehouse.table.append (app mode only on a database connection, a receipted write with idempotencyKey: rows appended to a view alias whose mapping says `access: append`). 0.83.0 (ADR 0029) adds phone.number.get (app mode only, read-only, no input, on a number alias from a phone connection's `channels` map: the E.164 number that alias maps to, so the app — or a computer-use agent it drives — can type it into a portal that signs in by mobile number).
14
14
  */
15
15
  operation:
16
16
  | 'slack.channel.history'
@@ -45,6 +45,7 @@ export type IntegrationExecuteRequest = {
45
45
  | 'sharepoint.file.read'
46
46
  | 'sharepoint.file.upload'
47
47
  | 'phone.sms.list'
48
+ | 'phone.number.get'
48
49
  | 'warehouse.view.read'
49
50
  | 'warehouse.table.append'
50
51
  | 'service.request';
@@ -295,6 +295,15 @@ export const IntegrationOperations = {
295
295
  "declaredMode": false,
296
296
  "idempotencyKey": false
297
297
  },
298
+ "phone.number.get": {
299
+ "kind": "saas",
300
+ "identities": [
301
+ "app"
302
+ ],
303
+ "readOnly": true,
304
+ "declaredMode": false,
305
+ "idempotencyKey": false
306
+ },
298
307
  "warehouse.view.read": {
299
308
  "kind": "database",
300
309
  "identities": [
@@ -2,7 +2,7 @@
2
2
  // Code generated by tools/gen/gen.mjs from schema/*.json. DO NOT EDIT.
3
3
 
4
4
  /**
5
- * 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.
5
+ * 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.
6
6
  */
7
7
  export type SaasProvider = 'slack' | 'gmail' | 'basecamp' | 'sharepoint' | 'phone';
8
8
  /**
@@ -56,10 +56,10 @@ export interface SaasConnection {
56
56
  [k: string]: string;
57
57
  };
58
58
  /**
59
- * 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.
59
+ * 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.
60
60
  *
61
61
  * @minItems 1
62
- * @maxItems 32
62
+ * @maxItems 33
63
63
  */
64
64
  operations: (
65
65
  | 'slack.channel.history'
@@ -94,6 +94,7 @@ export interface SaasConnection {
94
94
  | 'sharepoint.file.read'
95
95
  | 'sharepoint.file.upload'
96
96
  | 'phone.sms.list'
97
+ | 'phone.number.get'
97
98
  | 'warehouse.view.read'
98
99
  | 'warehouse.table.append'
99
100
  | 'service.request'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fourier-labs/harbour-contracts",
3
- "version": "0.82.0",
3
+ "version": "0.84.0",
4
4
  "description": "Single source of truth for every data shape that crosses a boundary between Isomorph components.",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,
@@ -85,11 +85,12 @@
85
85
  "sharepoint.file.read",
86
86
  "sharepoint.file.upload",
87
87
  "phone.sms.list",
88
+ "phone.number.get",
88
89
  "warehouse.view.read",
89
90
  "warehouse.table.append",
90
91
  "service.request"
91
92
  ],
92
- "description": "Closed operation set. Extending it is a contracts change. 0.78.0 (ADR 0024) adds the nine SharePoint operations, every one user mode only on a site alias (a key of the connection's `channels` map, holding a Microsoft Graph site id): sharepoint.list.list, sharepoint.item.list, sharepoint.item.create (a receipted write: explicit action, idempotencyKey), sharepoint.item.update (a PATCH, idempotent at Graph, no key), sharepoint.drive.list, sharepoint.file.list, sharepoint.file.search, sharepoint.file.read and sharepoint.file.upload (a receipted write). 0.76.0 (ADR 0022) adds the eleven Basecamp operations, every one user mode only like gmail.*: basecamp.project.list (the projects of the company's pinned Basecamp account; its resource is the fixed `account` alias), and on one mapped project (the resource is a project alias, a key of the connection's `channels` map) basecamp.todolist.list, basecamp.todo.list, basecamp.todo.create (a receipted write: explicit action, idempotencyKey), basecamp.todo.complete (idempotent at Basecamp, no key), basecamp.message.list, basecamp.message.post, basecamp.comment.list, basecamp.comment.post, basecamp.campfire.post (the three posts are receipted writes) and basecamp.people.list. 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. 0.82.0 (ADR 0028) adds phone.sms.list (app mode only, a number alias from a phone connection's `channels` map: the SMS received on that number since a time) and warehouse.table.append (app mode only on a database connection, a receipted write with idempotencyKey: rows appended to a view alias whose mapping says `access: append`)."
93
+ "description": "Closed operation set. Extending it is a contracts change. 0.78.0 (ADR 0024) adds the nine SharePoint operations, every one user mode only on a site alias (a key of the connection's `channels` map, holding a Microsoft Graph site id): sharepoint.list.list, sharepoint.item.list, sharepoint.item.create (a receipted write: explicit action, idempotencyKey), sharepoint.item.update (a PATCH, idempotent at Graph, no key), sharepoint.drive.list, sharepoint.file.list, sharepoint.file.search, sharepoint.file.read and sharepoint.file.upload (a receipted write). 0.76.0 (ADR 0022) adds the eleven Basecamp operations, every one user mode only like gmail.*: basecamp.project.list (the projects of the company's pinned Basecamp account; its resource is the fixed `account` alias), and on one mapped project (the resource is a project alias, a key of the connection's `channels` map) basecamp.todolist.list, basecamp.todo.list, basecamp.todo.create (a receipted write: explicit action, idempotencyKey), basecamp.todo.complete (idempotent at Basecamp, no key), basecamp.message.list, basecamp.message.post, basecamp.comment.list, basecamp.comment.post, basecamp.campfire.post (the three posts are receipted writes) and basecamp.people.list. 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. 0.82.0 (ADR 0028) adds phone.sms.list (app mode only, a number alias from a phone connection's `channels` map: the SMS received on that number since a time) and warehouse.table.append (app mode only on a database connection, a receipted write with idempotencyKey: rows appended to a view alias whose mapping says `access: append`). 0.83.0 (ADR 0029) adds phone.number.get (app mode only, read-only, no input, on a number alias from a phone connection's `channels` map: the E.164 number that alias maps to, so the app — or a computer-use agent it drives — can type it into a portal that signs in by mobile number)."
93
94
  },
94
95
  "IntegrationIdentityMode": {
95
96
  "type": "string",
@@ -375,6 +376,9 @@
375
376
  "phone.sms.list": {
376
377
  "$ref": "#/definitions/AppModeChannelOperation"
377
378
  },
379
+ "phone.number.get": {
380
+ "$ref": "#/definitions/AppModeChannelOperation"
381
+ },
378
382
  "warehouse.view.read": {
379
383
  "$ref": "#/definitions/AppModeViewOperation"
380
384
  },
@@ -595,6 +599,11 @@
595
599
  "phone.sms.list"
596
600
  ]
597
601
  },
602
+ {
603
+ "required": [
604
+ "phone.number.get"
605
+ ]
606
+ },
598
607
  {
599
608
  "required": [
600
609
  "service.request"
@@ -784,6 +793,11 @@
784
793
  "phone.sms.list"
785
794
  ]
786
795
  },
796
+ {
797
+ "required": [
798
+ "phone.number.get"
799
+ ]
800
+ },
787
801
  {
788
802
  "required": [
789
803
  "warehouse.view.read"
@@ -1053,6 +1067,12 @@
1053
1067
  "resources": [
1054
1068
  "gstn-line"
1055
1069
  ]
1070
+ },
1071
+ "phone.number.get": {
1072
+ "identity": "app",
1073
+ "resources": [
1074
+ "gstn-line"
1075
+ ]
1056
1076
  }
1057
1077
  }
1058
1078
  },
@@ -17,10 +17,10 @@
17
17
  "status": { "$ref": "#/definitions/DataGrantV2Status" },
18
18
  "operations": {
19
19
  "type": "array",
20
- "maxItems": 32,
20
+ "maxItems": 33,
21
21
  "uniqueItems": true,
22
22
  "items": { "$ref": "app-integrations-declaration.schema.json#/definitions/IntegrationOperation" },
23
- "description": "Approved operations; each must match this grant's mode. Empty until the first approval. At most the thirty-two SaaS operations (0.82.0: eleven Slack and Gmail, eleven Basecamp, nine SharePoint, one phone); a database grant holds up to two (warehouse.view.read, warehouse.table.append)."
23
+ "description": "Approved operations; each must match this grant's mode. Empty until the first approval. At most the thirty-three SaaS operations (0.83.0: eleven Slack and Gmail, eleven Basecamp, nine SharePoint, two phone); a database grant holds up to two (warehouse.view.read, warehouse.table.append)."
24
24
  },
25
25
  "resources": {
26
26
  "type": "array",
@@ -95,8 +95,8 @@
95
95
  "definitions": {
96
96
  "DataSourceConnector": {
97
97
  "type": "string",
98
- "enum": ["postgres", "redshift", "bigquery", "databricks", "mysql", "trino"],
99
- "description": "Closed connector set for the Data-Access MVP. trino (0.74.0): Trino/Presto-compatible engines (Trino, Presto, Starburst, Galaxy) over the Trino HTTP statement protocol; the endpoint reuses host, port and database (as the Trino catalog) with no connector-specific fields."
98
+ "enum": ["postgres", "redshift", "bigquery", "databricks", "mysql", "trino", "clickhouse"],
99
+ "description": "Closed connector set for the Data-Access MVP. trino (0.74.0): Trino/Presto-compatible engines (Trino, Presto, Starburst, Galaxy) over the Trino HTTP statement protocol; the endpoint reuses host, port and database (as the Trino catalog) with no connector-specific fields. clickhouse (0.84.0): ClickHouse over its HTTP interface; the endpoint reuses host, port (the HTTP port, not the native 9000) and database (the default database); the credential is {user, password} and may name protocol http or https (default https), like MySQL carries sslMode."
100
100
  },
101
101
  "DataSourceEnvironmentCopy": {
102
102
  "type": "object",
@@ -207,6 +207,22 @@
207
207
  "allowedScope": ["analytics.episode_plays"],
208
208
  "requestableByBuilders": true,
209
209
  "status": "ACTIVE"
210
+ },
211
+ {
212
+ "tenantId": "damensch",
213
+ "sourceId": "datagate",
214
+ "connector": "clickhouse",
215
+ "displayName": "DataGate (ClickHouse)",
216
+ "endpoint": {
217
+ "host": "db.example.com",
218
+ "port": 12420,
219
+ "database": "damensch"
220
+ },
221
+ "credentialRef": "secretref://tenants/damensch/sources/datagate/reader",
222
+ "provisioningMode": "byo",
223
+ "allowedScope": ["damensch.orders"],
224
+ "requestableByBuilders": true,
225
+ "status": "ACTIVE"
210
226
  }
211
227
  ]
212
228
  }
@@ -1566,6 +1566,30 @@
1566
1566
  }
1567
1567
  }
1568
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
+ },
1569
1593
  {
1570
1594
  "if": {
1571
1595
  "properties": {
@@ -2302,6 +2326,12 @@
2302
2326
  "from": "VK-GSTNIN"
2303
2327
  }
2304
2328
  },
2329
+ {
2330
+ "connection": "company-phone",
2331
+ "operation": "phone.number.get",
2332
+ "resource": "gstn-line",
2333
+ "input": {}
2334
+ },
2305
2335
  {
2306
2336
  "connection": "sales-warehouse",
2307
2337
  "operation": "warehouse.table.append",
@@ -27,11 +27,11 @@
27
27
  "operations": {
28
28
  "type": "array",
29
29
  "minItems": 1,
30
- "maxItems": 32,
30
+ "maxItems": 33,
31
31
  "uniqueItems": true,
32
32
  "items": { "$ref": "app-integrations-declaration.schema.json#/definitions/IntegrationOperation" },
33
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."
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" },
@@ -85,7 +85,7 @@
85
85
  "SaasProvider": {
86
86
  "type": "string",
87
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."
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",
@@ -301,7 +301,7 @@
301
301
  "status": "ACTIVE",
302
302
  "version": 1,
303
303
  "channels": { "gstn-line": "+919876543210" },
304
- "operations": ["phone.sms.list"],
304
+ "operations": ["phone.sms.list", "phone.number.get"],
305
305
  "developmentPreapproval": { "enabled": false, "hours": 24 },
306
306
  "createdAt": "2026-10-17T08:00:00Z",
307
307
  "updatedAt": "2026-10-17T08:00:00Z"