@fourier-labs/harbour-contracts 0.78.0 → 0.80.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
@@ -40,7 +40,7 @@ exist here first.
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
41
  | `app-integrations-declaration.schema.json` | Committed `.isomorph/integrations.json` (`isomorph.app-integrations/2.0`): closed thirty-three-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; warehouse view read; service request) with fixed or declared identity modes; owns the shared operation/identity/environment enums | Dev kit §4 |
42
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), 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) 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 |
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) 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 | — |
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "schema": "harbour.contract-release/1.0",
3
- "repositoryVersion": "0.78.0.0",
4
- "publishVersion": "0.78.0",
5
- "publishTag": "v0.78.0",
6
- "schemasDigest": "sha256:f1be566763706a00ed462099e750f17828f9fdc5a5cc6cdc2c5e39431e574360",
3
+ "repositoryVersion": "0.80.0.0",
4
+ "publishVersion": "0.80.0",
5
+ "publishTag": "v0.80.0",
6
+ "schemasDigest": "sha256:194d7a45ce74a147405e7cd0f4ef9c252c9a953f165b2834a5fa65d8a45e80fa",
7
7
  "aiFixturesDigest": "sha256:edac31c92e146ca1c40130f2fb5649db82e24b8cd1ac758153b90612052fddb6",
8
- "generatedGoDigest": "sha256:93ef23399ab41345982298e0a52e6d81be3496605771d7e347219ed11fa28bf1",
9
- "generatedTypeScriptDigest": "sha256:0975b1595804430ca85ce07f4d624c215a8c5f537f259cc9df8497dea97a927c",
8
+ "generatedGoDigest": "sha256:8e22b9a650b562812579b20fa5b8b28ac63b97007da74e9ac47a5d581e1a6d2d",
9
+ "generatedTypeScriptDigest": "sha256:85b684d40d0c461fad52ec530250245a25f7db1d7e69a5ce81edc00e9486ef66",
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)"
@@ -32,6 +32,7 @@
32
32
  "schema/ai-verification-evidence.schema.json": "sha256:bdbc762df256d2a8dd0bdda60d4d13915ce40034cd756af9515871d145f10ad9",
33
33
  "schema/api-error-response.schema.json": "sha256:3d43d5bdf0b59c944e20509d832e6776c3ecdba4d6c245a9118bbe52062a8304",
34
34
  "schema/app-integrations-declaration.schema.json": "sha256:af9b36a880b9f277da7691724a5fce59c7d77f2c2c10edc3b23eee48d31a4730",
35
+ "schema/app-sign-in.schema.json": "sha256:2093740131b84a69757c2e474d16e32ff5d0bf0edd6f6f8de62ede7f82988f29",
35
36
  "schema/artifact-contract.schema.json": "sha256:8047b461a1c6d07bbe867a259c57bdf5cc0fdf282cf842ec7b683a9e93713b10",
36
37
  "schema/binding-classification-subject.schema.json": "sha256:a8825ce652e7e00a18759c4249bd5bcd0cae552dd58440513f867e87f685133c",
37
38
  "schema/builder-input-proposal.schema.json": "sha256:fe85cffa6d76b1e1effe1f5d75525f8fe0e1eaa3be4a304e491aa23ad72c0e72",
@@ -41,7 +42,7 @@
41
42
  "schema/data-source.schema.json": "sha256:46ef4ace5fce612fce055813bf4f99956423b46c929993fbbc5dfec497087bad",
42
43
  "schema/deploy-request.schema.json": "sha256:c978406c273fa430db262888f0a8646b14e3057f64b0633780fcd6cfa646bc67",
43
44
  "schema/deploy-response.schema.json": "sha256:09064948abdbba7022738285d802ed44648a16ddc2a5b8c2eeb170ae19a66aeb",
44
- "schema/deployment-app-registration.schema.json": "sha256:eb705c38466ebd97cb76c1ce7a6177d75c2f10381df75976b40d47eeb8dd5712",
45
+ "schema/deployment-app-registration.schema.json": "sha256:f1deb15a467065a20f540649aac3713e6c8afe68f03b43969ef103356b7baa13",
45
46
  "schema/deployment-continuation.schema.json": "sha256:55b6945439f2c91cd851dfe4bc9484e67a64091b7763b2d8267354b4a8bfae8c",
46
47
  "schema/deployment-environment.schema.json": "sha256:35b26cae07da9ee375a842b5e87c4570c8eca06775e9fd6dd46eb9eb8aa0df6c",
47
48
  "schema/deployment-preview-retirement.schema.json": "sha256:ccf6b971b7853ca98530272f280fe62cd3aab5425b10b81ae6b717cc949e014f",
@@ -52,6 +53,8 @@
52
53
  "schema/env-bindings.schema.json": "sha256:ae09bc4ca5508afa698ef854a59153c4c6f99b07017b48cb9b07ce05abad12f2",
53
54
  "schema/error-category.enum.json": "sha256:d6d83000c3357805b13138d717c411248c14f1c0fde1c02e82a25691de85d68d",
54
55
  "schema/error-envelope.schema.json": "sha256:75dccda7dd16fdf8435deda53fc7dbcdc109b65114617a17f11763010c656f90",
56
+ "schema/external-sign-in.schema.json": "sha256:82d2cc5130a12a19554c85d4a78368939f417a80e795b2be060156294296ac70",
57
+ "schema/identity-context.schema.json": "sha256:a0be3d3499b70f1641887ec66ab5b21ca5ab71063e9209290905738943a36e59",
55
58
  "schema/integration-connect-result.schema.json": "sha256:3f254b67ef739dc1fa395bdc8c4dc93359b16d481dba2a2d777aa5b6f34b7af8",
56
59
  "schema/integration-error-details.schema.json": "sha256:5a290584b1542b2b8cdd4966869126180ce29c1f0dd250dca7fb68c05e76b8e9",
57
60
  "schema/integration-execute-request.schema.json": "sha256:9538c59ed750530493293cc4f33538b02b4df4247769f9fc4e96c2d8393f72d0",
@@ -63,7 +66,7 @@
63
66
  "schema/promotion-request.schema.json": "sha256:00e96dfd8ddbdba88ea222941d43f3609ff6c815a79e34f6705cab458101c969",
64
67
  "schema/promotion-response.schema.json": "sha256:4129712d2e29d6ef21d93d4bd0bacfd60ada3f2ee0ade852824e64346b817634",
65
68
  "schema/resolved-app-serving.schema.json": "sha256:260e30ca16831ddd96b15f44eadc7daa2a5f87a0025588bd6318b236f349ec6b",
66
- "schema/saas-connection.schema.json": "sha256:48ffbf6f56361d4a62357e6c28c083517b26479b85de7ddc878353a19e05cc68",
69
+ "schema/saas-connection.schema.json": "sha256:88de2039c9acd726f9e79860c71ec7e74a92c323f44e1c55b8a29c5bf69b29df",
67
70
  "schema/sanitized-binding-evidence.schema.json": "sha256:1191ab88e2764df927e5f17837674cebebe068d480da2b2fdb390e589f96b51f",
68
71
  "schema/secret-reference.schema.json": "sha256:db4e3c2c6a2dbd72d7ea0f9c91cb3b2343a7e67b601996c6818b2ef08e440895",
69
72
  "schema/security-scan-input-v2.schema.json": "sha256:0d418342078c9b5046ea6f4bef3c2c57539285dfee99cc0850d4f0d03739ee13",
@@ -113,7 +116,7 @@
113
116
  "gen-go/integration_execute_input_rules_test.go": "sha256:4961b4b87012e8cb6e2c64653769f5fd4dd58e1d7d18af459f4f5b69a3e6760d",
114
117
  "gen-go/integration_operations.go": "sha256:fab89489825680fee6dfd7d5874e955839691af4cc5245d96caaf36505668db1",
115
118
  "gen-go/schema_documents.go": "sha256:c19c0d540f602ee997a84b90e20702d9bc63ed7d27aec267e76c04655fc182e0",
116
- "gen-go/types.go": "sha256:746204705f882de2da44469fdc7be3f256715d2683741671be50dd3740d77a69",
119
+ "gen-go/types.go": "sha256:0c147e97773521638fec09868c6299d2746ed8af24082720d883a448b2cb813c",
117
120
  "gen-go/version_state.go": "sha256:4ef8abb126414c0025cf2c59bc9c79a74ef4a2ff89e8f316cbf05acc872371c1"
118
121
  },
119
122
  "generatedTypeScript": {
@@ -139,6 +142,7 @@
139
142
  "gen-ts/ai-verification-evidence.ts": "sha256:979439d77f8b47631d1eb3b6c3c54ea6fec41089d2a51dc815fd370b1c4917fc",
140
143
  "gen-ts/api-error-response.ts": "sha256:0fd73be282e7a5d72d6c343a4e64d09c232556b16161167f0cffd6278ed7e3d3",
141
144
  "gen-ts/app-integrations-declaration.ts": "sha256:860f51367547f05c97f9b048d019ef542788d0c4ae8cbb47e21daaccfb03c6af",
145
+ "gen-ts/app-sign-in.ts": "sha256:bf88671c00e9d9badb5ffc961a7e803cf92cee5a98c2f6c9e3172bbf5aaf0424",
142
146
  "gen-ts/artifact-contract.ts": "sha256:4a6dc6d2caaeed4bb2066cc8a333e6e09e5a0d4745e0b1038293d54ab9403aeb",
143
147
  "gen-ts/binding-classification-digest-helper.ts": "sha256:40fc7d85b4c3f3ffc5caf7d7950c62d013c83ee42058c7453b2100d95817f167",
144
148
  "gen-ts/binding-classification-subject.ts": "sha256:c409a3fd7b942b50419632c51d9a79474fb30d6374bdc79c0e25c73618e800c3",
@@ -149,7 +153,7 @@
149
153
  "gen-ts/data-source.ts": "sha256:f30d4c14c15afbb9530d30af9235844198765984ce1579fa25961d7f07bcfb1f",
150
154
  "gen-ts/deploy-request.ts": "sha256:913245577a95354849d3a8cb43fbaedbf895efe7b653c8502d25edfa22b7a864",
151
155
  "gen-ts/deploy-response.ts": "sha256:364d9f1acf32e491498237cdd3f402d5f8e102f208db7748034f4ec68c6a6137",
152
- "gen-ts/deployment-app-registration.ts": "sha256:642db3a3f796e5d7089cdb834991277ab1aac5bff37cd5cab42aa2f1c116f0be",
156
+ "gen-ts/deployment-app-registration.ts": "sha256:8c2d55983e33449ecfbaceaa41aac3e2905f1970f5514f0dbc3b611fad7beefb",
153
157
  "gen-ts/deployment-continuation.ts": "sha256:cc9f63af4d0da5086a79103789e4f043783b75b4ed11c6512f044439a551a79c",
154
158
  "gen-ts/deployment-environment.ts": "sha256:fc08cabe2e52ebb93cfe84d2019994260f71734c33d0e50e7c63e40ef5b17cef",
155
159
  "gen-ts/deployment-preview-retirement.ts": "sha256:309421d08daf0ade163b6457ed0e5410ec6573c40a59423a6cce14780d9c38db",
@@ -161,7 +165,9 @@
161
165
  "gen-ts/error-category-registry.ts": "sha256:7466a502c0723a77db825cdeaa9556a244201b55d9b7acbf2c098e9e84351df1",
162
166
  "gen-ts/error-category.ts": "sha256:9bda89180c3b740c9aa8be466216592e8ca9d0d368c274333edf6ea5c45afd8e",
163
167
  "gen-ts/error-envelope.ts": "sha256:4457309be794f9d4fc0cf62530cc2d442c007bac9ae84aff66df099cc9e40310",
164
- "gen-ts/index.ts": "sha256:57927b9fcddf506785671bbd44cced9f729373e4dd3e3480bc6c37fd05fb59e8",
168
+ "gen-ts/external-sign-in.ts": "sha256:393ef74d72e37d33e374e3226f34ab3e854fdb0c1129a367997cbb690bf253a6",
169
+ "gen-ts/identity-context.ts": "sha256:4b8151a321e224229250d214ef3e17f2ac986bb54ff0aadbb4509481724f6883",
170
+ "gen-ts/index.ts": "sha256:8f0b03bc46f0f24489e6a3f7a3ddee23c86dacc8ab2058b3b131c3d9dd75ab29",
165
171
  "gen-ts/integration-connect-result.ts": "sha256:4b10f169b6e1af364e9b418de21caa9fadbfb77b43cbff77d741cfae0b52180c",
166
172
  "gen-ts/integration-error-details.ts": "sha256:e73cb5942373ef88b2d8e03a1de56d5a69e71069ecd14e68396f7edba1f60780",
167
173
  "gen-ts/integration-execute-input-rules.ts": "sha256:ba2b4c624db36761b78cbd50ec3878b268c536ad1209174620e33833fd22197f",
@@ -175,7 +181,7 @@
175
181
  "gen-ts/promotion-request.ts": "sha256:9db88cef67f777a16bac628039ec3f582acb9e8cfff6fb592b30d0a0e55abc68",
176
182
  "gen-ts/promotion-response.ts": "sha256:f1c9cafac96faeb02a443a31786f67714e818f38d90108e7af41958396524d6f",
177
183
  "gen-ts/resolved-app-serving.ts": "sha256:6131a6cc5f784f0d101081d2ce1b96b76b2f904b2c5e7b2809f9ede5878ada1f",
178
- "gen-ts/saas-connection.ts": "sha256:de741fa539a3e6f30097c9d20413928af8d5ad07462d8b1fd9e0fe910c3d987d",
184
+ "gen-ts/saas-connection.ts": "sha256:5ab9875d20a50a99aec63d204425655816d7d27ea874497c6e483e6a363f4dcc",
179
185
  "gen-ts/sanitized-binding-digest-helper.ts": "sha256:c47d7fdc20500e2e72c23fe39ecdd610fc397c47fcba51335ebec3c380fe6872",
180
186
  "gen-ts/sanitized-binding-evidence.ts": "sha256:f3fb7b1d7d2e0929eb0ea981eaf32db3104010647185f6ae59f67167d42538a9",
181
187
  "gen-ts/secret-reference.ts": "sha256:731fbcde7315cb4128d5b01bdbe6e6f248f13c7ad8dea04a3a4e927ac4890198",
@@ -0,0 +1,9 @@
1
+ export type AppSignIn = {
2
+ signIn?: 'company' | 'external';
3
+ /**
4
+ * @minItems 1
5
+ * @maxItems 1
6
+ */
7
+ signInMethods?: ('phone' | 'email')[];
8
+ clientId?: string;
9
+ };
@@ -0,0 +1,3 @@
1
+ /* eslint-disable */
2
+ // Code generated by tools/gen/gen.mjs from schema/*.json. DO NOT EDIT.
3
+ export {};
@@ -1,7 +1,7 @@
1
- export declare const ContractRepositoryVersion: "0.78.0.0";
2
- export declare const ContractPublishVersion: "0.78.0";
3
- export declare const ContractPublishTag: "v0.78.0";
4
- export declare const ContractSchemasDigest: "sha256:f1be566763706a00ed462099e750f17828f9fdc5a5cc6cdc2c5e39431e574360";
1
+ export declare const ContractRepositoryVersion: "0.80.0.0";
2
+ export declare const ContractPublishVersion: "0.80.0";
3
+ export declare const ContractPublishTag: "v0.80.0";
4
+ export declare const ContractSchemasDigest: "sha256:194d7a45ce74a147405e7cd0f4ef9c252c9a953f165b2834a5fa65d8a45e80fa";
5
5
  export declare const ContractAiFixturesDigest: "sha256:edac31c92e146ca1c40130f2fb5649db82e24b8cd1ac758153b90612052fddb6";
6
- export declare const ContractGeneratedGoDigest: "sha256:93ef23399ab41345982298e0a52e6d81be3496605771d7e347219ed11fa28bf1";
7
- export declare const ContractGeneratedTypeScriptDigest: "sha256:0975b1595804430ca85ce07f4d624c215a8c5f537f259cc9df8497dea97a927c";
6
+ export declare const ContractGeneratedGoDigest: "sha256:8e22b9a650b562812579b20fa5b8b28ac63b97007da74e9ac47a5d581e1a6d2d";
7
+ export declare const ContractGeneratedTypeScriptDigest: "sha256:85b684d40d0c461fad52ec530250245a25f7db1d7e69a5ce81edc00e9486ef66";
@@ -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.78.0.0";
4
- export const ContractPublishVersion = "0.78.0";
5
- export const ContractPublishTag = "v0.78.0";
6
- export const ContractSchemasDigest = "sha256:f1be566763706a00ed462099e750f17828f9fdc5a5cc6cdc2c5e39431e574360";
3
+ export const ContractRepositoryVersion = "0.80.0.0";
4
+ export const ContractPublishVersion = "0.80.0";
5
+ export const ContractPublishTag = "v0.80.0";
6
+ export const ContractSchemasDigest = "sha256:194d7a45ce74a147405e7cd0f4ef9c252c9a953f165b2834a5fa65d8a45e80fa";
7
7
  export const ContractAiFixturesDigest = "sha256:edac31c92e146ca1c40130f2fb5649db82e24b8cd1ac758153b90612052fddb6";
8
- export const ContractGeneratedGoDigest = "sha256:93ef23399ab41345982298e0a52e6d81be3496605771d7e347219ed11fa28bf1";
9
- export const ContractGeneratedTypeScriptDigest = "sha256:0975b1595804430ca85ce07f4d624c215a8c5f537f259cc9df8497dea97a927c";
8
+ export const ContractGeneratedGoDigest = "sha256:8e22b9a650b562812579b20fa5b8b28ac63b97007da74e9ac47a5d581e1a6d2d";
9
+ export const ContractGeneratedTypeScriptDigest = "sha256:85b684d40d0c461fad52ec530250245a25f7db1d7e69a5ce81edc00e9486ef66";
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * IAM/SigV4 POST /v1/internal/deployment/apps/{appId}/register (Internal API) or POST /v1/deployment/apps/register body. Governance derives tenant identity-provider configuration; no identity secrets are supplied. apiHostnames explicitly identifies API hosts among backendHostnames; runtime validates that subset. Omission preserves legacy .api. inference during the coordinated V2 auth migration.
3
3
  */
4
- export interface DeploymentAppRegistration {
4
+ export type DeploymentAppRegistration = {
5
5
  tenantId: string;
6
6
  appId: string;
7
7
  origin: string;
@@ -15,4 +15,10 @@ export interface DeploymentAppRegistration {
15
15
  allowedGroups?: string[];
16
16
  enabled?: boolean;
17
17
  workloadPrincipalArn?: string;
18
- }
18
+ signIn?: 'company' | 'external';
19
+ /**
20
+ * @minItems 1
21
+ * @maxItems 1
22
+ */
23
+ signInMethods?: ('phone' | 'email')[];
24
+ };
@@ -0,0 +1,29 @@
1
+ export interface ExternalSignIn {
2
+ enabledMethods: ('phone' | 'email')[];
3
+ email?: {
4
+ senderEmail: string;
5
+ senderDomain?: string;
6
+ sesRegion: string;
7
+ configurationSet?: string;
8
+ };
9
+ sms?: {
10
+ originationIdentity?: string;
11
+ region: string;
12
+ inEntityId?: string;
13
+ inTemplateId?: string;
14
+ };
15
+ directory?: {
16
+ accountId: string;
17
+ region: string;
18
+ userPoolId: string;
19
+ };
20
+ readiness?: {
21
+ email?: {
22
+ senderVerified: boolean;
23
+ productionAccess: boolean;
24
+ };
25
+ sms?: {
26
+ sandbox: boolean;
27
+ };
28
+ };
29
+ }
@@ -0,0 +1,3 @@
1
+ /* eslint-disable */
2
+ // Code generated by tools/gen/gen.mjs from schema/*.json. DO NOT EDIT.
3
+ export {};
@@ -0,0 +1,18 @@
1
+ export type IdentityContext = {
2
+ iss: string;
3
+ aud: string;
4
+ sub: string;
5
+ tenant: string;
6
+ app: string;
7
+ iat: number;
8
+ exp: number;
9
+ session_id?: string;
10
+ email?: string;
11
+ name?: string;
12
+ phone_number?: string;
13
+ email_verified?: boolean;
14
+ phone_number_verified?: boolean;
15
+ directory?: 'company' | 'external';
16
+ groups?: string[];
17
+ role?: 'builder' | 'member';
18
+ };
@@ -0,0 +1,3 @@
1
+ /* eslint-disable */
2
+ // Code generated by tools/gen/gen.mjs from schema/*.json. DO NOT EDIT.
3
+ export {};
@@ -20,6 +20,7 @@ export * from './ai-transform-result.js';
20
20
  export * from './ai-verification-evidence.js';
21
21
  export * from './api-error-response.js';
22
22
  export * from './app-integrations-declaration.js';
23
+ export * from './app-sign-in.js';
23
24
  export * from './artifact-contract.js';
24
25
  export * from './binding-classification-digest-helper.js';
25
26
  export * from './binding-classification-subject.js';
@@ -43,6 +44,8 @@ export * from './env-bindings.js';
43
44
  export * from './error-category-registry.js';
44
45
  export * from './error-category.js';
45
46
  export * from './error-envelope.js';
47
+ export * from './external-sign-in.js';
48
+ export * from './identity-context.js';
46
49
  export * from './integration-connect-result.js';
47
50
  export * from './integration-error-details.js';
48
51
  export * from './integration-execute-input-rules.js';
@@ -22,6 +22,7 @@ export * from './ai-transform-result.js';
22
22
  export * from './ai-verification-evidence.js';
23
23
  export * from './api-error-response.js';
24
24
  export * from './app-integrations-declaration.js';
25
+ export * from './app-sign-in.js';
25
26
  export * from './artifact-contract.js';
26
27
  export * from './binding-classification-digest-helper.js';
27
28
  export * from './binding-classification-subject.js';
@@ -45,6 +46,8 @@ export * from './env-bindings.js';
45
46
  export * from './error-category-registry.js';
46
47
  export * from './error-category.js';
47
48
  export * from './error-envelope.js';
49
+ export * from './external-sign-in.js';
50
+ export * from './identity-context.js';
48
51
  export * from './integration-connect-result.js';
49
52
  export * from './integration-error-details.js';
50
53
  export * from './integration-execute-input-rules.js';
@@ -69,6 +69,12 @@ export interface SaasConnection {
69
69
  * @maxItems 256
70
70
  */
71
71
  blockedDevelopmentBuilders?: string[];
72
+ /**
73
+ * Lower-cased emails who may approve an app's access requests for this connection, besides tenant admins. Empty or absent means tenant admins only.
74
+ *
75
+ * @maxItems 20
76
+ */
77
+ approvers?: string[];
72
78
  createdAt: string;
73
79
  updatedAt: string;
74
80
  /**
@@ -0,0 +1,12 @@
1
+ /* eslint-disable */
2
+ // Code generated by tools/gen/gen.mjs from schema/*.json. DO NOT EDIT.
3
+
4
+ export type AppSignIn = {
5
+ signIn?: 'company' | 'external';
6
+ /**
7
+ * @minItems 1
8
+ * @maxItems 1
9
+ */
10
+ signInMethods?: ('phone' | 'email')[];
11
+ clientId?: string;
12
+ };
@@ -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.78.0.0" as const;
5
- export const ContractPublishVersion = "0.78.0" as const;
6
- export const ContractPublishTag = "v0.78.0" as const;
7
- export const ContractSchemasDigest = "sha256:f1be566763706a00ed462099e750f17828f9fdc5a5cc6cdc2c5e39431e574360" as const;
4
+ export const ContractRepositoryVersion = "0.80.0.0" as const;
5
+ export const ContractPublishVersion = "0.80.0" as const;
6
+ export const ContractPublishTag = "v0.80.0" as const;
7
+ export const ContractSchemasDigest = "sha256:194d7a45ce74a147405e7cd0f4ef9c252c9a953f165b2834a5fa65d8a45e80fa" as const;
8
8
  export const ContractAiFixturesDigest = "sha256:edac31c92e146ca1c40130f2fb5649db82e24b8cd1ac758153b90612052fddb6" as const;
9
- export const ContractGeneratedGoDigest = "sha256:93ef23399ab41345982298e0a52e6d81be3496605771d7e347219ed11fa28bf1" as const;
10
- export const ContractGeneratedTypeScriptDigest = "sha256:0975b1595804430ca85ce07f4d624c215a8c5f537f259cc9df8497dea97a927c" as const;
9
+ export const ContractGeneratedGoDigest = "sha256:8e22b9a650b562812579b20fa5b8b28ac63b97007da74e9ac47a5d581e1a6d2d" as const;
10
+ export const ContractGeneratedTypeScriptDigest = "sha256:85b684d40d0c461fad52ec530250245a25f7db1d7e69a5ce81edc00e9486ef66" as const;
@@ -4,7 +4,7 @@
4
4
  /**
5
5
  * IAM/SigV4 POST /v1/internal/deployment/apps/{appId}/register (Internal API) or POST /v1/deployment/apps/register body. Governance derives tenant identity-provider configuration; no identity secrets are supplied. apiHostnames explicitly identifies API hosts among backendHostnames; runtime validates that subset. Omission preserves legacy .api. inference during the coordinated V2 auth migration.
6
6
  */
7
- export interface DeploymentAppRegistration {
7
+ export type DeploymentAppRegistration = {
8
8
  tenantId: string;
9
9
  appId: string;
10
10
  origin: string;
@@ -18,4 +18,10 @@ export interface DeploymentAppRegistration {
18
18
  allowedGroups?: string[];
19
19
  enabled?: boolean;
20
20
  workloadPrincipalArn?: string;
21
- }
21
+ signIn?: 'company' | 'external';
22
+ /**
23
+ * @minItems 1
24
+ * @maxItems 1
25
+ */
26
+ signInMethods?: ('phone' | 'email')[];
27
+ };
@@ -0,0 +1,32 @@
1
+ /* eslint-disable */
2
+ // Code generated by tools/gen/gen.mjs from schema/*.json. DO NOT EDIT.
3
+
4
+ export interface ExternalSignIn {
5
+ enabledMethods: ('phone' | 'email')[];
6
+ email?: {
7
+ senderEmail: string;
8
+ senderDomain?: string;
9
+ sesRegion: string;
10
+ configurationSet?: string;
11
+ };
12
+ sms?: {
13
+ originationIdentity?: string;
14
+ region: string;
15
+ inEntityId?: string;
16
+ inTemplateId?: string;
17
+ };
18
+ directory?: {
19
+ accountId: string;
20
+ region: string;
21
+ userPoolId: string;
22
+ };
23
+ readiness?: {
24
+ email?: {
25
+ senderVerified: boolean;
26
+ productionAccess: boolean;
27
+ };
28
+ sms?: {
29
+ sandbox: boolean;
30
+ };
31
+ };
32
+ }
@@ -0,0 +1,21 @@
1
+ /* eslint-disable */
2
+ // Code generated by tools/gen/gen.mjs from schema/*.json. DO NOT EDIT.
3
+
4
+ export type IdentityContext = {
5
+ iss: string;
6
+ aud: string;
7
+ sub: string;
8
+ tenant: string;
9
+ app: string;
10
+ iat: number;
11
+ exp: number;
12
+ session_id?: string;
13
+ email?: string;
14
+ name?: string;
15
+ phone_number?: string;
16
+ email_verified?: boolean;
17
+ phone_number_verified?: boolean;
18
+ directory?: 'company' | 'external';
19
+ groups?: string[];
20
+ role?: 'builder' | 'member';
21
+ };
package/gen-ts/index.ts CHANGED
@@ -23,6 +23,7 @@ export * from './ai-transform-result.js';
23
23
  export * from './ai-verification-evidence.js';
24
24
  export * from './api-error-response.js';
25
25
  export * from './app-integrations-declaration.js';
26
+ export * from './app-sign-in.js';
26
27
  export * from './artifact-contract.js';
27
28
  export * from './binding-classification-digest-helper.js';
28
29
  export * from './binding-classification-subject.js';
@@ -46,6 +47,8 @@ export * from './env-bindings.js';
46
47
  export * from './error-category-registry.js';
47
48
  export * from './error-category.js';
48
49
  export * from './error-envelope.js';
50
+ export * from './external-sign-in.js';
51
+ export * from './identity-context.js';
49
52
  export * from './integration-connect-result.js';
50
53
  export * from './integration-error-details.js';
51
54
  export * from './integration-execute-input-rules.js';
@@ -107,6 +107,12 @@ export interface SaasConnection {
107
107
  * @maxItems 256
108
108
  */
109
109
  blockedDevelopmentBuilders?: string[];
110
+ /**
111
+ * Lower-cased emails who may approve an app's access requests for this connection, besides tenant admins. Empty or absent means tenant admins only.
112
+ *
113
+ * @maxItems 20
114
+ */
115
+ approvers?: string[];
110
116
  createdAt: string;
111
117
  updatedAt: string;
112
118
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fourier-labs/harbour-contracts",
3
- "version": "0.78.0",
3
+ "version": "0.80.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,
@@ -0,0 +1,51 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://schemas.harbour.dev/app-sign-in.schema.json",
4
+ "title": "AppSignIn",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "properties": {
8
+ "signIn": {
9
+ "type": "string",
10
+ "enum": [
11
+ "company",
12
+ "external"
13
+ ]
14
+ },
15
+ "signInMethods": {
16
+ "type": "array",
17
+ "items": {
18
+ "type": "string",
19
+ "enum": [
20
+ "phone",
21
+ "email"
22
+ ]
23
+ },
24
+ "minItems": 1,
25
+ "maxItems": 1
26
+ },
27
+ "clientId": {
28
+ "type": "string"
29
+ }
30
+ },
31
+ "required": [],
32
+ "allOf": [
33
+ {
34
+ "if": {
35
+ "properties": {
36
+ "signIn": {
37
+ "const": "external"
38
+ }
39
+ },
40
+ "required": [
41
+ "signIn"
42
+ ]
43
+ },
44
+ "then": {
45
+ "required": [
46
+ "signInMethods"
47
+ ]
48
+ }
49
+ }
50
+ ]
51
+ }
@@ -19,6 +19,9 @@
19
19
  "allowedUsers": {"type": "array", "items": {"type": "string"}},
20
20
  "allowedGroups": {"type": "array", "items": {"type": "string"}},
21
21
  "enabled": {"type": "boolean"},
22
- "workloadPrincipalArn": {"type": "string", "pattern": "^arn:aws:(iam|sts)::[0-9]+:"}
23
- }
22
+ "workloadPrincipalArn": {"type": "string", "pattern": "^arn:aws:(iam|sts)::[0-9]+:"},
23
+ "signIn": {"type": "string", "enum": ["company", "external"]},
24
+ "signInMethods": {"type": "array", "items": {"type": "string", "enum": ["phone", "email"]}, "minItems": 1, "maxItems": 1}
25
+ },
26
+ "allOf": [{"if": {"properties": {"signIn": {"const": "external"}}, "required": ["signIn"]}, "then": {"required": ["signInMethods"]}}]
24
27
  }
@@ -0,0 +1,120 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://schemas.harbour.dev/external-sign-in.schema.json",
4
+ "title": "ExternalSignIn",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "properties": {
8
+ "enabledMethods": {
9
+ "type": "array",
10
+ "items": {
11
+ "type": "string",
12
+ "enum": [
13
+ "phone",
14
+ "email"
15
+ ]
16
+ },
17
+ "uniqueItems": true
18
+ },
19
+ "email": {
20
+ "type": "object",
21
+ "additionalProperties": false,
22
+ "properties": {
23
+ "senderEmail": {
24
+ "type": "string"
25
+ },
26
+ "senderDomain": {
27
+ "type": "string"
28
+ },
29
+ "sesRegion": {
30
+ "type": "string"
31
+ },
32
+ "configurationSet": {
33
+ "type": "string"
34
+ }
35
+ },
36
+ "required": [
37
+ "senderEmail",
38
+ "sesRegion"
39
+ ]
40
+ },
41
+ "sms": {
42
+ "type": "object",
43
+ "additionalProperties": false,
44
+ "properties": {
45
+ "originationIdentity": {
46
+ "type": "string"
47
+ },
48
+ "region": {
49
+ "type": "string"
50
+ },
51
+ "inEntityId": {
52
+ "type": "string"
53
+ },
54
+ "inTemplateId": {
55
+ "type": "string"
56
+ }
57
+ },
58
+ "required": [
59
+ "region"
60
+ ]
61
+ },
62
+ "directory": {
63
+ "type": "object",
64
+ "additionalProperties": false,
65
+ "properties": {
66
+ "accountId": {
67
+ "type": "string"
68
+ },
69
+ "region": {
70
+ "type": "string"
71
+ },
72
+ "userPoolId": {
73
+ "type": "string"
74
+ }
75
+ },
76
+ "required": [
77
+ "accountId",
78
+ "region",
79
+ "userPoolId"
80
+ ]
81
+ },
82
+ "readiness": {
83
+ "type": "object",
84
+ "additionalProperties": false,
85
+ "properties": {
86
+ "email": {
87
+ "type": "object",
88
+ "properties": {
89
+ "senderVerified": {
90
+ "type": "boolean"
91
+ },
92
+ "productionAccess": {
93
+ "type": "boolean"
94
+ }
95
+ },
96
+ "required": [
97
+ "senderVerified",
98
+ "productionAccess"
99
+ ],
100
+ "additionalProperties": false
101
+ },
102
+ "sms": {
103
+ "type": "object",
104
+ "properties": {
105
+ "sandbox": {
106
+ "type": "boolean"
107
+ }
108
+ },
109
+ "required": [
110
+ "sandbox"
111
+ ],
112
+ "additionalProperties": false
113
+ }
114
+ }
115
+ }
116
+ },
117
+ "required": [
118
+ "enabledMethods"
119
+ ]
120
+ }
@@ -0,0 +1,141 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://schemas.harbour.dev/identity-context.schema.json",
4
+ "title": "IdentityContext",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "properties": {
8
+ "iss": {
9
+ "type": "string"
10
+ },
11
+ "aud": {
12
+ "type": "string"
13
+ },
14
+ "sub": {
15
+ "type": "string"
16
+ },
17
+ "tenant": {
18
+ "type": "string"
19
+ },
20
+ "app": {
21
+ "type": "string"
22
+ },
23
+ "iat": {
24
+ "type": "integer"
25
+ },
26
+ "exp": {
27
+ "type": "integer"
28
+ },
29
+ "session_id": {
30
+ "type": "string"
31
+ },
32
+ "email": {
33
+ "type": "string"
34
+ },
35
+ "name": {
36
+ "type": "string"
37
+ },
38
+ "phone_number": {
39
+ "type": "string"
40
+ },
41
+ "email_verified": {
42
+ "type": "boolean"
43
+ },
44
+ "phone_number_verified": {
45
+ "type": "boolean"
46
+ },
47
+ "directory": {
48
+ "type": "string",
49
+ "enum": [
50
+ "company",
51
+ "external"
52
+ ]
53
+ },
54
+ "groups": {
55
+ "type": "array",
56
+ "items": {
57
+ "type": "string"
58
+ }
59
+ },
60
+ "role": {
61
+ "type": "string",
62
+ "enum": [
63
+ "builder",
64
+ "member"
65
+ ]
66
+ }
67
+ },
68
+ "required": [
69
+ "iss",
70
+ "aud",
71
+ "sub",
72
+ "tenant",
73
+ "app",
74
+ "iat",
75
+ "exp"
76
+ ],
77
+ "allOf": [
78
+ {
79
+ "if": {
80
+ "properties": {
81
+ "directory": {
82
+ "const": "external"
83
+ }
84
+ },
85
+ "required": [
86
+ "directory"
87
+ ]
88
+ },
89
+ "then": {
90
+ "properties": {
91
+ "role": {
92
+ "const": "member"
93
+ }
94
+ },
95
+ "anyOf": [
96
+ {
97
+ "required": [
98
+ "email",
99
+ "email_verified"
100
+ ],
101
+ "properties": {
102
+ "email": {
103
+ "minLength": 1
104
+ },
105
+ "email_verified": {
106
+ "const": true
107
+ }
108
+ }
109
+ },
110
+ {
111
+ "required": [
112
+ "phone_number",
113
+ "phone_number_verified"
114
+ ],
115
+ "properties": {
116
+ "phone_number": {
117
+ "minLength": 1
118
+ },
119
+ "phone_number_verified": {
120
+ "const": true
121
+ }
122
+ }
123
+ }
124
+ ],
125
+ "required": [
126
+ "role"
127
+ ]
128
+ },
129
+ "else": {
130
+ "required": [
131
+ "email"
132
+ ],
133
+ "properties": {
134
+ "email": {
135
+ "minLength": 1
136
+ }
137
+ }
138
+ }
139
+ }
140
+ ]
141
+ }
@@ -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." },
@@ -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
  },