@fourier-labs/harbour-contracts 0.58.0 → 0.60.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 +5 -5
- package/contract-release.json +42 -42
- package/dist/gen-ts/ai-callsite-inventory.d.ts +1 -1
- package/dist/gen-ts/ai-gateway-key-lookup.d.ts +1 -1
- package/dist/gen-ts/ai-policy-snapshot.d.ts +1 -1
- package/dist/gen-ts/ai-runtime-binding.d.ts +1 -1
- package/dist/gen-ts/app-integrations-declaration.d.ts +2 -2
- package/dist/gen-ts/contract-release.d.ts +6 -6
- package/dist/gen-ts/contract-release.js +6 -6
- package/dist/gen-ts/data-dependency.d.ts +2 -2
- package/dist/gen-ts/data-source.d.ts +1 -1
- package/dist/gen-ts/deployment-environment.d.ts +1 -1
- package/dist/gen-ts/deployment-status-response.d.ts +1 -1
- package/dist/gen-ts/integration-error-details.d.ts +2 -2
- package/dist/gen-ts/kit-bundle-manifest.d.ts +3 -3
- package/dist/gen-ts/kit-lock.d.ts +5 -5
- package/dist/gen-ts/security-scan-input.d.ts +3 -3
- package/dist/gen-ts/security-verdict.d.ts +2 -2
- package/dist/gen-ts/transform-report.d.ts +11 -11
- package/dist/gen-ts/well-defined-app-manifest.d.ts +4 -4
- package/dist/naming/index.d.ts +2 -0
- package/dist/naming/index.js +14 -0
- package/dist/resolver/index.d.ts +1 -1
- package/dist/resolver/index.js +1 -1
- package/gen-ts/ai-callsite-inventory.ts +1 -1
- package/gen-ts/ai-gateway-key-lookup.ts +1 -1
- package/gen-ts/ai-policy-snapshot.ts +1 -1
- package/gen-ts/ai-runtime-binding.ts +1 -1
- package/gen-ts/app-integrations-declaration.ts +2 -2
- package/gen-ts/contract-release.ts +6 -6
- package/gen-ts/data-dependency.ts +2 -2
- package/gen-ts/data-source.ts +1 -1
- package/gen-ts/deployment-environment.ts +1 -1
- package/gen-ts/deployment-status-response.ts +1 -1
- package/gen-ts/integration-error-details.ts +2 -2
- package/gen-ts/kit-bundle-manifest.ts +3 -3
- package/gen-ts/kit-lock.ts +5 -5
- package/gen-ts/security-scan-input.ts +3 -3
- package/gen-ts/security-verdict.ts +2 -2
- package/gen-ts/transform-report.ts +11 -11
- package/gen-ts/well-defined-app-manifest.ts +4 -4
- package/package.json +7 -3
- package/schema/ai-callsite-inventory.schema.json +1 -1
- package/schema/ai-gateway-key-lookup.schema.json +1 -1
- package/schema/ai-policy-snapshot.schema.json +1 -1
- package/schema/ai-runtime-binding.schema.json +1 -1
- package/schema/app-integrations-declaration.schema.json +4 -4
- package/schema/data-dependency.schema.json +2 -2
- package/schema/data-source.schema.json +1 -1
- package/schema/deployment-environment.schema.json +1 -1
- package/schema/deployment-status-response.schema.json +1 -1
- package/schema/error-category.enum.json +9 -9
- package/schema/integration-error-details.schema.json +2 -2
- package/schema/kit-bundle-manifest.schema.json +6 -6
- package/schema/kit-lock.schema.json +6 -6
- package/schema/security-scan-input.schema.json +3 -3
- package/schema/security-verdict.schema.json +2 -2
- package/schema/transform-report.schema.json +11 -11
- package/schema/well-defined-app-manifest.schema.json +5 -5
|
@@ -17,13 +17,13 @@ export type Command = string[];
|
|
|
17
17
|
export type ResourceProfile = 'standard' | 'memory-1g' | 'memory-2g';
|
|
18
18
|
export type Capability = 'data' | 'files' | 'actions' | 'realtime' | 'telemetry';
|
|
19
19
|
/**
|
|
20
|
-
* Versioned provisioning input emitted by
|
|
20
|
+
* Versioned provisioning input emitted by Isomorph Transform. It describes runtime wiring and workload lifecycle only; PostgreSQL grants and RLS remain the database authorization authority.
|
|
21
21
|
*/
|
|
22
22
|
export interface WellDefinedAppManifest {
|
|
23
23
|
version: 1;
|
|
24
24
|
architecture: 'static-v1' | 'fullstack-v1' | 'spa-harbour-data-v1';
|
|
25
25
|
/**
|
|
26
|
-
* Required only when transformed browser code uses @
|
|
26
|
+
* Required only when transformed browser code uses @isomorph.ai/app-sdk.
|
|
27
27
|
*/
|
|
28
28
|
sdkMajor?: 1;
|
|
29
29
|
/**
|
|
@@ -39,7 +39,7 @@ export interface WellDefinedAppManifest {
|
|
|
39
39
|
*/
|
|
40
40
|
runtime?: string;
|
|
41
41
|
/**
|
|
42
|
-
* Optional declaration of the
|
|
42
|
+
* Optional declaration of the Isomorph browser capabilities the application uses. Same closed set as the app-capabilities document; this is the declaration, not a source scan.
|
|
43
43
|
*
|
|
44
44
|
* @maxItems 5
|
|
45
45
|
*/
|
|
@@ -77,7 +77,7 @@ export interface WorkloadBinding {
|
|
|
77
77
|
reference?: string;
|
|
78
78
|
}
|
|
79
79
|
/**
|
|
80
|
-
* Optional method/path authentication policy. Omitted means every route requires
|
|
80
|
+
* Optional method/path authentication policy. Omitted means every route requires Isomorph SSO, the same default the policy states explicitly.
|
|
81
81
|
*/
|
|
82
82
|
export interface RouteAuth {
|
|
83
83
|
default: 'sso_required';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
const slug = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;
|
|
3
|
+
/** Stable V2 identity label. Do not use it to recover tenant or app identity. */
|
|
4
|
+
export function deploymentLabel(org, app) {
|
|
5
|
+
if (!slug.test(org) || !slug.test(app))
|
|
6
|
+
throw new Error('org and app must be DNS labels of 1–63 characters');
|
|
7
|
+
const plain = `${org}-${app}`;
|
|
8
|
+
// Reserve double hyphens for hashed labels and -api for custom-domain API hosts.
|
|
9
|
+
if (!org.includes('-') && !plain.includes('--') && !plain.endsWith('-api') && plain.length <= 55)
|
|
10
|
+
return plain;
|
|
11
|
+
const digest = createHash('sha256').update(JSON.stringify([org, app])).digest('hex').slice(0, 32);
|
|
12
|
+
const prefix = plain.slice(0, 19).replace(/-+$/, '');
|
|
13
|
+
return `h--${prefix}-${digest}`;
|
|
14
|
+
}
|
package/dist/resolver/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Isomorph AI policy resolver — the ONE hardened five-layer merge, shipped with
|
|
3
3
|
* the contracts package so governance and the gateway resolve identically
|
|
4
4
|
* (completion-spec D-6). Extracted from
|
|
5
5
|
* `harbour-governance-control-plane/src/ai-governance.ts` (merge machinery)
|
package/dist/resolver/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Isomorph AI policy resolver — the ONE hardened five-layer merge, shipped with
|
|
3
3
|
* the contracts package so governance and the gateway resolve identically
|
|
4
4
|
* (completion-spec D-6). Extracted from
|
|
5
5
|
* `harbour-governance-control-plane/src/ai-governance.ts` (merge machinery)
|
|
@@ -5,7 +5,7 @@ export type AiInventoryIdentifier = string;
|
|
|
5
5
|
export type AiInventoryDigest = string;
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
* Immutable, sanitized AI call-site discovery for one exact
|
|
8
|
+
* Immutable, sanitized AI call-site discovery for one exact Isomorph deployment version. Inventory records detection only; planning, transformation, and verification outcomes are separate append-only records.
|
|
9
9
|
*/
|
|
10
10
|
export interface AiCallsiteInventory {
|
|
11
11
|
schema: 'harbour.ai-callsite-inventory/1.0';
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Code generated by tools/gen/gen.mjs from schema/*.json. DO NOT EDIT.
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* Value-free Gateway authentication metadata for one version-scoped
|
|
5
|
+
* Value-free Gateway authentication metadata for one version-scoped Isomorph key.
|
|
6
6
|
*/
|
|
7
7
|
export type AiGatewayKeyLookup = {
|
|
8
8
|
schema: 'harbour.ai-gateway-key-lookup/1.0';
|
|
@@ -55,7 +55,7 @@ export type AiPolicyDimensionLimit1 = {
|
|
|
55
55
|
};
|
|
56
56
|
|
|
57
57
|
/**
|
|
58
|
-
* Immutable, content-addressed AI policy snapshot consumed by the
|
|
58
|
+
* Immutable, content-addressed AI policy snapshot consumed by the Isomorph AI Gateway. Provider credentials are represented only by Secrets Manager references.
|
|
59
59
|
*/
|
|
60
60
|
export interface AiPolicySnapshot {
|
|
61
61
|
schema: 'harbour.ai-policy-snapshot/1.0';
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
export type AiRuntimeSafeReference = string;
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
|
-
* Platform-neutral, value-free binding of one workload identity to one version-scoped
|
|
10
|
+
* Platform-neutral, value-free binding of one workload identity to one version-scoped Isomorph Gateway secret. Platform adapters may add implementation details internally; they never enter this contract.
|
|
11
11
|
*/
|
|
12
12
|
export interface AiRuntimeBinding {
|
|
13
13
|
schema: 'harbour.ai-runtime-binding/1.0';
|
|
@@ -21,10 +21,10 @@ export type IntegrationIdentityMode = 'app' | 'user';
|
|
|
21
21
|
export type ColumnName = string;
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
|
-
* Committed `.
|
|
24
|
+
* Committed `.isomorph/integrations.json`: the app's declared use of tenant-wide integration connections. Keys are logical connection aliases (the governance sourceId); resources are logical names (Slack channel alias, warehouse view name), never IDs, tokens or URLs. The operation set is closed (six operations). Each operation carries a fixed identity mode — slack.channel.history=user, gmail.thread.list=user, gmail.message.read=user, gmail.message.send=user, warehouse.view.read=app — except slack.message.post, whose mode the app DECLARES: `app` posts as the company's Slack app (the one audited bot identity, under the IT-approved per-app display name when the connection declares `presentation`), `user` posts as the signed-in person after their own consent. The declared mode is the one the app requests access for; an app may hold approved grants for both modes after two requests, and each slack.message.post call names which approved mode it runs under (`mode` on the execute request, 0.55.0) — a mode IT did not approve is refused, never swapped for the other. A `saas` connection may declare only the Slack and Gmail operations and a `database` connection only warehouse.view.read; `presentation` is a `saas` connection's optional per-app display name and icon for app-mode Slack posts, shown to IT at approval time and applied only from the approved grant. Gmail is user-mode only (reads plus one send); its single resource is the fixed `inbox` alias. This file also owns the shared IntegrationOperation / IntegrationIdentityMode / IntegrationEnvironment / IntegrationConnectionKind / IntegrationPresentation definitions referenced by the other integration schemas.
|
|
25
25
|
*/
|
|
26
26
|
export interface AppIntegrationsDeclaration {
|
|
27
|
-
schema: '
|
|
27
|
+
schema: 'isomorph.app-integrations/2.0';
|
|
28
28
|
connections: {
|
|
29
29
|
[k: string]: DeclaredConnection;
|
|
30
30
|
};
|
|
@@ -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.
|
|
5
|
-
export const ContractPublishVersion = "0.
|
|
6
|
-
export const ContractPublishTag = "v0.
|
|
7
|
-
export const ContractSchemasDigest = "sha256:
|
|
4
|
+
export const ContractRepositoryVersion = "0.60.0.0" as const;
|
|
5
|
+
export const ContractPublishVersion = "0.60.0" as const;
|
|
6
|
+
export const ContractPublishTag = "v0.60.0" as const;
|
|
7
|
+
export const ContractSchemasDigest = "sha256:cae27ba35b1cc0deb819df6fcfc1ebf5c2bd5de621bd505eb9bd5b540fec0409" as const;
|
|
8
8
|
export const ContractAiFixturesDigest = "sha256:edac31c92e146ca1c40130f2fb5649db82e24b8cd1ac758153b90612052fddb6" as const;
|
|
9
|
-
export const ContractGeneratedGoDigest = "sha256:
|
|
10
|
-
export const ContractGeneratedTypeScriptDigest = "sha256:
|
|
9
|
+
export const ContractGeneratedGoDigest = "sha256:dcbd1548dfeddcd7e499f88851c9fdc58b34e00c3b4f2b162c3c6cae073f6659" as const;
|
|
10
|
+
export const ContractGeneratedTypeScriptDigest = "sha256:937e6425678739d44c4ca024db1e4fc44dc5a9be9950f261ffc320f2d458a985" as const;
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
// Code generated by tools/gen/gen.mjs from schema/*.json. DO NOT EDIT.
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* database = a SQL/warehouse connection; api = an HTTP(S) service; app_owned_external = infrastructure the app owns outside
|
|
5
|
+
* database = a SQL/warehouse connection; api = an HTTP(S) service; app_owned_external = infrastructure the app owns outside Isomorph.
|
|
6
6
|
*/
|
|
7
7
|
export type DataDependencyKind = 'database' | 'api' | 'app_owned_external';
|
|
8
8
|
/**
|
|
9
|
-
* matched = resolved to a registered source; out_of_scope = resolved but not requestable; unknown = unresolvable; inventory = registered but unused; app_owned_external = app-owned, outside
|
|
9
|
+
* matched = resolved to a registered source; out_of_scope = resolved but not requestable; unknown = unresolvable; inventory = registered but unused; app_owned_external = app-owned, outside Isomorph's remit.
|
|
10
10
|
*/
|
|
11
11
|
export type DataDependencyClassification = 'matched' | 'out_of_scope' | 'unknown' | 'inventory' | 'app_owned_external';
|
|
12
12
|
/**
|
package/gen-ts/data-source.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export type DataSourceConnector = 'postgres' | 'redshift' | 'bigquery' | 'databricks' | 'mysql';
|
|
8
8
|
/**
|
|
9
|
-
* byo = admin brought existing infrastructure; harbour_managed =
|
|
9
|
+
* byo = admin brought existing infrastructure; harbour_managed = Isomorph provisioned it.
|
|
10
10
|
*/
|
|
11
11
|
export type DataSourceProvisioningMode = 'byo' | 'harbour_managed';
|
|
12
12
|
/**
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
// Code generated by tools/gen/gen.mjs from schema/*.json. DO NOT EDIT.
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* Public environment accepted by the preview deployment-control-plane APIs. The MVP accepts only preview; production remains reachable only through
|
|
5
|
+
* Public environment accepted by the preview deployment-control-plane APIs. The MVP accepts only preview; production remains reachable only through Isomorph's human-merge promotion flow.
|
|
6
6
|
*/
|
|
7
7
|
export type DeploymentEnvironment = 'preview';
|
|
@@ -103,7 +103,7 @@ export interface StatusProgressEvent {
|
|
|
103
103
|
origin?: 'initial' | 'widen';
|
|
104
104
|
}
|
|
105
105
|
/**
|
|
106
|
-
* The customer account and region this version deploys into, stamped on the version record at admission for customer-account (BYOC) tenants. Absent means
|
|
106
|
+
* The customer account and region this version deploys into, stamped on the version record at admission for customer-account (BYOC) tenants. Absent means Isomorph-managed — the same convention the record itself uses — so every pre-destination version simply omits it. Deliberately only account and region: the record's roleArn/externalId are how the pipeline gets into the account, not where the deploy landed, and no status consumer needs them.
|
|
107
107
|
*/
|
|
108
108
|
export interface StatusDeployTarget {
|
|
109
109
|
/**
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Code generated by tools/gen/gen.mjs from schema/*.json. DO NOT EDIT.
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* App-SDK
|
|
5
|
+
* App-SDK IsomorphErrorCategory values an integration route may emit; INTERNAL is reserved for the transport.
|
|
6
6
|
*/
|
|
7
7
|
export type IntegrationErrorCategory =
|
|
8
8
|
'AUTH_REQUIRED' | 'FORBIDDEN' | 'NOT_FOUND' | 'CONFLICT' | 'VALIDATION_FAILED' | 'RATE_LIMITED' | 'UNAVAILABLE';
|
|
@@ -42,7 +42,7 @@ export type IntegrationErrorCode =
|
|
|
42
42
|
| 'MODE_REQUIRED';
|
|
43
43
|
|
|
44
44
|
/**
|
|
45
|
-
* The `error` member of an integration failure response `{error, requestId}` on the execute/connect routes; the SDK maps it onto
|
|
45
|
+
* The `error` member of an integration failure response `{error, requestId}` on the execute/connect routes; the SDK maps it onto IsomorphError(category, message, details). `category` is the app-SDK IsomorphErrorCategory (not the deployment pipeline's dot-path error-category registry), with the HTTP status fixed per category: 401 AUTH_REQUIRED, 403 FORBIDDEN (denied/revoked/expired), 404 NOT_FOUND (unknown app/connection/resource), 409 CONFLICT (pending provisioning/consent/concurrent request), 400 or 413 VALIDATION_FAILED (invalid input / size overflow), 429 RATE_LIMITED (+ Retry-After header), 503 UNAVAILABLE. `details.code` is the closed stable reason set; `message` is human-facing and never carries provider error bodies, tokens or SQL.
|
|
46
46
|
*/
|
|
47
47
|
export interface IntegrationErrorDetails {
|
|
48
48
|
category: IntegrationErrorCategory;
|
|
@@ -11,13 +11,13 @@ export type HexSha256 = string;
|
|
|
11
11
|
* Identity of one published development-kit bundle (shipped with the CLI). It pins the app SDK tarball, the local runtime images and the agent-brief fingerprint that a kit-built app was developed against, so the hosted pipeline can prove compatibility before replacing the vendored SDK (see kit-lock.schema.json).
|
|
12
12
|
*/
|
|
13
13
|
export interface KitBundleManifest {
|
|
14
|
-
schema: '
|
|
14
|
+
schema: 'isomorph.kit-bundle/1.0';
|
|
15
15
|
/**
|
|
16
16
|
* The CLI package version that published this bundle.
|
|
17
17
|
*/
|
|
18
18
|
kitVersion: string;
|
|
19
19
|
sdk: {
|
|
20
|
-
package: '@
|
|
20
|
+
package: '@isomorph.ai/app-sdk';
|
|
21
21
|
/**
|
|
22
22
|
* The SDK package version the tarball was packed from (informational; compatibility is decided by tarballSha256).
|
|
23
23
|
*/
|
|
@@ -49,7 +49,7 @@ export interface KitBundleManifest {
|
|
|
49
49
|
*/
|
|
50
50
|
fingerprint: string;
|
|
51
51
|
};
|
|
52
|
-
declarationSchema: '
|
|
52
|
+
declarationSchema: 'isomorph.app-integrations/2.0';
|
|
53
53
|
}
|
|
54
54
|
export interface NativeExecutable {
|
|
55
55
|
url: string;
|
package/gen-ts/kit-lock.ts
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
// Code generated by tools/gen/gen.mjs from schema/*.json. DO NOT EDIT.
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* Committed `.
|
|
5
|
+
* Committed `.isomorph/kit.lock.json`: which app and tenant a kit-built app belongs to and the exact bundle it was developed against. The data-plane vendorAppSDK gate reads bundle.sdk.tarballSha256 and fails with kit_bundle_incompatible (naming both digests) when it differs from the baked tarball; apps without a kit.lock keep the existing path.
|
|
6
6
|
*/
|
|
7
7
|
export interface KitLock {
|
|
8
|
-
schema: '
|
|
8
|
+
schema: 'isomorph.kit-lock/1.0';
|
|
9
9
|
appId: string;
|
|
10
10
|
tenantId: string;
|
|
11
11
|
bundle: KitBundleManifest;
|
|
@@ -16,13 +16,13 @@ export interface KitLock {
|
|
|
16
16
|
* Identity of one published development-kit bundle (shipped with the CLI). It pins the app SDK tarball, the local runtime images and the agent-brief fingerprint that a kit-built app was developed against, so the hosted pipeline can prove compatibility before replacing the vendored SDK (see kit-lock.schema.json).
|
|
17
17
|
*/
|
|
18
18
|
interface KitBundleManifest {
|
|
19
|
-
schema: '
|
|
19
|
+
schema: 'isomorph.kit-bundle/1.0';
|
|
20
20
|
/**
|
|
21
21
|
* The CLI package version that published this bundle.
|
|
22
22
|
*/
|
|
23
23
|
kitVersion: string;
|
|
24
24
|
sdk: {
|
|
25
|
-
package: '@
|
|
25
|
+
package: '@isomorph.ai/app-sdk';
|
|
26
26
|
/**
|
|
27
27
|
* The SDK package version the tarball was packed from (informational; compatibility is decided by tarballSha256).
|
|
28
28
|
*/
|
|
@@ -60,7 +60,7 @@ interface KitBundleManifest {
|
|
|
60
60
|
*/
|
|
61
61
|
fingerprint: string;
|
|
62
62
|
};
|
|
63
|
-
declarationSchema: '
|
|
63
|
+
declarationSchema: 'isomorph.app-integrations/2.0';
|
|
64
64
|
}
|
|
65
65
|
interface NativeExecutable {
|
|
66
66
|
url: string;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Code generated by tools/gen/gen.mjs from schema/*.json. DO NOT EDIT.
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* Input to the
|
|
5
|
+
* Input to the Isomorph Security Assurance machine (Security Assurance LLD §2). SOURCE (M1) scans an ingested commit; ARTIFACT (M2) scans built outputs — a container image digest, a deployable bundle, and/or synthesized infrastructure — named directly by the caller. `commit` is the identity being scanned; `org/app/env` locate the snapshot (the control-state table has no commit GSI, so a bare commit is not resolvable); `branch` is caller-supplied provenance. When phase is ARTIFACT at least one of `imageDigest`, `bundleRef`, or `infraRefs` must be present.
|
|
6
6
|
*/
|
|
7
7
|
export interface SecurityScanInput {
|
|
8
8
|
/**
|
|
@@ -10,11 +10,11 @@ export interface SecurityScanInput {
|
|
|
10
10
|
*/
|
|
11
11
|
phase: 'SOURCE' | 'ARTIFACT';
|
|
12
12
|
/**
|
|
13
|
-
*
|
|
13
|
+
* Isomorph organization id, e.g. fourier.
|
|
14
14
|
*/
|
|
15
15
|
org: string;
|
|
16
16
|
/**
|
|
17
|
-
*
|
|
17
|
+
* Isomorph app id within the org, e.g. focuslist.
|
|
18
18
|
*/
|
|
19
19
|
app: string;
|
|
20
20
|
/**
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Code generated by tools/gen/gen.mjs from schema/*.json. DO NOT EDIT.
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* Decision produced by the
|
|
5
|
+
* Decision produced by the Isomorph Security Assurance machine (Security Assurance LLD §2). `outcome: BLOCKED` surfaces to callers as the registered non-retryable `gate.security-scan` error category; `reason` is present exactly when BLOCKED. The S3 evidence object named by `evidenceRef` is the full record — in-payload findings may be truncated.
|
|
6
6
|
*/
|
|
7
7
|
export interface SecurityVerdict {
|
|
8
8
|
/**
|
|
@@ -14,7 +14,7 @@ export interface SecurityVerdict {
|
|
|
14
14
|
*/
|
|
15
15
|
profile: 'BASELINE' | 'STANDARD' | 'HIGH' | 'CRITICAL';
|
|
16
16
|
/**
|
|
17
|
-
* Human-readable cause, present when outcome is BLOCKED; becomes the
|
|
17
|
+
* Human-readable cause, present when outcome is BLOCKED; becomes the cause carried by the Security Assurance state machine's `HarbourSecurityBlocked` fail state.
|
|
18
18
|
*/
|
|
19
19
|
reason?: string;
|
|
20
20
|
/**
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Code generated by tools/gen/gen.mjs from schema/*.json. DO NOT EDIT.
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* Structured output an agent must return from one
|
|
5
|
+
* Structured output an agent must return from one Isomorph transformation attempt. Handed to the agent as its output schema, then decoded and semantically re-validated by the control plane, which remains the authority. The enum on applied_playbooks.items is the one dynamic part: the adapter injects the names of the playbooks supplied for that invocation before writing the document, so the model is structurally prevented from naming a playbook it was not given. Application-secret handling was removed platform-wide, so this document carries no redactions and no secrets fields. A deployable report must also carry preservation_plan: the agent's own grounded smoke tests (one to three happy_path user journeys plus a boundary_check per behaviour its playbooks or edits could regress) that the validation cell executes after transformation, and an uncovered list naming every boundary it could not test and why. It may also carry validation_fixtures: null when no external fixture is needed, or a bounded generic HTTP/WebSocket fixture declaration for that one run; the deployment plane reads the workspace fixture sidecar, so the report's copy is optional. An unsupported report carries only application.unsupported and no plan or fixtures.
|
|
6
6
|
*/
|
|
7
7
|
export type TransformReport = {
|
|
8
8
|
/**
|
|
@@ -18,7 +18,7 @@ export type TransformReport = {
|
|
|
18
18
|
analysis?: {
|
|
19
19
|
deployable: boolean;
|
|
20
20
|
/**
|
|
21
|
-
* Whether the attempt changed the tree. Optional:
|
|
21
|
+
* Whether the attempt changed the tree. Optional: Isomorph derives this from the transformed workspace, so a deployable report may omit it and one that still carries it stays valid.
|
|
22
22
|
*/
|
|
23
23
|
needsTransformation?: boolean;
|
|
24
24
|
/**
|
|
@@ -26,7 +26,7 @@ export type TransformReport = {
|
|
|
26
26
|
*/
|
|
27
27
|
blockers: string[];
|
|
28
28
|
/**
|
|
29
|
-
* Paths the attempt touched. Optional:
|
|
29
|
+
* Paths the attempt touched. Optional: Isomorph derives this from the transformed workspace, so a deployable report may omit it and one that still carries it stays valid.
|
|
30
30
|
*
|
|
31
31
|
* @minItems 1
|
|
32
32
|
* @maxItems 1024
|
|
@@ -46,25 +46,25 @@ export type TransformReport = {
|
|
|
46
46
|
database?: {
|
|
47
47
|
mode: 'none' | 'sql';
|
|
48
48
|
/**
|
|
49
|
-
* Classification of the changed paths. Optional:
|
|
49
|
+
* Classification of the changed paths. Optional: Isomorph derives this from the transformed workspace, so a deployable report may omit it and one that still carries it stays valid.
|
|
50
50
|
*/
|
|
51
51
|
changeType?: 'none' | 'code_only' | 'schema_only' | 'code_and_schema';
|
|
52
52
|
/**
|
|
53
|
-
* Whether any changed path sits outside the database boundary. Optional:
|
|
53
|
+
* Whether any changed path sits outside the database boundary. Optional: Isomorph derives this from the transformed workspace, so a deployable report may omit it and one that still carries it stays valid.
|
|
54
54
|
*/
|
|
55
55
|
requiresCodeChanges?: boolean;
|
|
56
56
|
/**
|
|
57
|
-
* Whether the Aurora bundle grew past its seeded prefix. Optional:
|
|
57
|
+
* Whether the Aurora bundle grew past its seeded prefix. Optional: Isomorph derives this from the transformed workspace, so a deployable report may omit it and one that still carries it stays valid.
|
|
58
58
|
*/
|
|
59
59
|
requiresSchemaMigration?: boolean;
|
|
60
60
|
/**
|
|
61
|
-
* Migration files in the Aurora bundle. Optional:
|
|
61
|
+
* Migration files in the Aurora bundle. Optional: Isomorph derives this from the transformed workspace, so a deployable report may omit it and one that still carries it stays valid.
|
|
62
62
|
*
|
|
63
63
|
* @maxItems 128
|
|
64
64
|
*/
|
|
65
65
|
migrationPaths?: string[];
|
|
66
66
|
/**
|
|
67
|
-
* Changed paths on the database boundary. Optional:
|
|
67
|
+
* Changed paths on the database boundary. Optional: Isomorph derives this from the transformed workspace, so a deployable report may omit it and one that still carries it stays valid.
|
|
68
68
|
*
|
|
69
69
|
* @maxItems 512
|
|
70
70
|
*/
|
|
@@ -102,7 +102,7 @@ export type TransformReport = {
|
|
|
102
102
|
kind: 'happy_path' | 'boundary_check';
|
|
103
103
|
name: string;
|
|
104
104
|
/**
|
|
105
|
-
* Transformation boundaries this test claims to cover. Optional:
|
|
105
|
+
* Transformation boundaries this test claims to cover. Optional: Isomorph derives them from the test's own evidence paths, so a deployable report may omit them and one that still carries them stays valid.
|
|
106
106
|
*
|
|
107
107
|
* @minItems 1
|
|
108
108
|
* @maxItems 8
|
|
@@ -187,7 +187,7 @@ export type TransformReport = {
|
|
|
187
187
|
*/
|
|
188
188
|
uncovered: {
|
|
189
189
|
/**
|
|
190
|
-
* Optional:
|
|
190
|
+
* Optional: Isomorph derives the uncovered boundaries from the changed paths and the covered set, so a deployable report may omit this and one that still carries it stays valid.
|
|
191
191
|
*/
|
|
192
192
|
boundary?:
|
|
193
193
|
| 'application'
|
|
@@ -271,7 +271,7 @@ export type TransformReport = {
|
|
|
271
271
|
backgroundJobs: 'none' | 'sqs';
|
|
272
272
|
} | null;
|
|
273
273
|
/**
|
|
274
|
-
* Build-only PostgreSQL bootstrap for authenticated browser validation. Use null when the application does not require a pre-existing database identity. The SQL file runs only in
|
|
274
|
+
* Build-only PostgreSQL bootstrap for authenticated browser validation. Use null when the application does not require a pre-existing database identity. The SQL file runs only in Isomorph's throwaway validation database after migrations and before candidate boot. Isomorph supplies the fixed probe subject and lowercased email as transaction-local settings.
|
|
275
275
|
*/
|
|
276
276
|
validationSeed?: {
|
|
277
277
|
kind: 'sql';
|
|
@@ -21,13 +21,13 @@ export type ResourceProfile = 'standard' | 'memory-1g' | 'memory-2g';
|
|
|
21
21
|
export type Capability = 'data' | 'files' | 'actions' | 'realtime' | 'telemetry';
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
|
-
* Versioned provisioning input emitted by
|
|
24
|
+
* Versioned provisioning input emitted by Isomorph Transform. It describes runtime wiring and workload lifecycle only; PostgreSQL grants and RLS remain the database authorization authority.
|
|
25
25
|
*/
|
|
26
26
|
export interface WellDefinedAppManifest {
|
|
27
27
|
version: 1;
|
|
28
28
|
architecture: 'static-v1' | 'fullstack-v1' | 'spa-harbour-data-v1';
|
|
29
29
|
/**
|
|
30
|
-
* Required only when transformed browser code uses @
|
|
30
|
+
* Required only when transformed browser code uses @isomorph.ai/app-sdk.
|
|
31
31
|
*/
|
|
32
32
|
sdkMajor?: 1;
|
|
33
33
|
/**
|
|
@@ -43,7 +43,7 @@ export interface WellDefinedAppManifest {
|
|
|
43
43
|
*/
|
|
44
44
|
runtime?: string;
|
|
45
45
|
/**
|
|
46
|
-
* Optional declaration of the
|
|
46
|
+
* Optional declaration of the Isomorph browser capabilities the application uses. Same closed set as the app-capabilities document; this is the declaration, not a source scan.
|
|
47
47
|
*
|
|
48
48
|
* @maxItems 5
|
|
49
49
|
*/
|
|
@@ -81,7 +81,7 @@ export interface WorkloadBinding {
|
|
|
81
81
|
reference?: string;
|
|
82
82
|
}
|
|
83
83
|
/**
|
|
84
|
-
* Optional method/path authentication policy. Omitted means every route requires
|
|
84
|
+
* Optional method/path authentication policy. Omitted means every route requires Isomorph SSO, the same default the policy states explicitly.
|
|
85
85
|
*/
|
|
86
86
|
export interface RouteAuth {
|
|
87
87
|
default: 'sso_required';
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fourier-labs/harbour-contracts",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Single source of truth for every data shape that crosses a boundary between
|
|
3
|
+
"version": "0.60.0",
|
|
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,
|
|
7
7
|
"repository": {
|
|
@@ -23,6 +23,10 @@
|
|
|
23
23
|
"types": "./dist/gen-ts/index.d.ts",
|
|
24
24
|
"default": "./dist/gen-ts/index.js"
|
|
25
25
|
},
|
|
26
|
+
"./naming": {
|
|
27
|
+
"types": "./dist/naming/index.d.ts",
|
|
28
|
+
"default": "./dist/naming/index.js"
|
|
29
|
+
},
|
|
26
30
|
"./resolver": {
|
|
27
31
|
"types": "./dist/resolver/index.d.ts",
|
|
28
32
|
"default": "./dist/resolver/index.js"
|
|
@@ -31,7 +35,7 @@
|
|
|
31
35
|
"scripts": {
|
|
32
36
|
"gen": "node tools/gen/gen.mjs",
|
|
33
37
|
"build": "tsc -p tsconfig.json",
|
|
34
|
-
"test": "node --experimental-strip-types --test tools/gen/*.test.mjs resolver/*.test.mjs",
|
|
38
|
+
"test": "node --experimental-strip-types --test tools/gen/*.test.mjs resolver/*.test.mjs naming/*.test.mjs",
|
|
35
39
|
"verify": "node tools/release/verify-release.mjs && node tools/gen/gen.mjs && { [ -z \"$(git status --porcelain -- gen-ts gen-go contract-release.json)\" ] || { echo 'STALE: generated code or release manifest out of date or uncommitted — run make gen and commit'; exit 1; }; }"
|
|
36
40
|
},
|
|
37
41
|
"devDependencies": {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
3
|
"$id": "https://schemas.harbour.dev/ai-callsite-inventory.schema.json",
|
|
4
4
|
"title": "AiCallsiteInventory",
|
|
5
|
-
"description": "Immutable, sanitized AI call-site discovery for one exact
|
|
5
|
+
"description": "Immutable, sanitized AI call-site discovery for one exact Isomorph deployment version. Inventory records detection only; planning, transformation, and verification outcomes are separate append-only records.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": [
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
3
|
"$id": "https://schemas.harbour.dev/ai-gateway-key-lookup.schema.json",
|
|
4
4
|
"title": "AiGatewayKeyLookup",
|
|
5
|
-
"description": "Value-free Gateway authentication metadata for one version-scoped
|
|
5
|
+
"description": "Value-free Gateway authentication metadata for one version-scoped Isomorph key.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": ["schema", "keyId", "tenantId", "appId", "environment", "versionId", "tokenPrefix", "status", "createdAt"],
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
3
|
"$id": "https://schemas.harbour.dev/ai-policy-snapshot.schema.json",
|
|
4
4
|
"title": "AiPolicySnapshot",
|
|
5
|
-
"description": "Immutable, content-addressed AI policy snapshot consumed by the
|
|
5
|
+
"description": "Immutable, content-addressed AI policy snapshot consumed by the Isomorph AI Gateway. Provider credentials are represented only by Secrets Manager references.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": [
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
3
|
"$id": "https://schemas.harbour.dev/ai-runtime-binding.schema.json",
|
|
4
4
|
"title": "AiRuntimeBinding",
|
|
5
|
-
"description": "Platform-neutral, value-free binding of one workload identity to one version-scoped
|
|
5
|
+
"description": "Platform-neutral, value-free binding of one workload identity to one version-scoped Isomorph Gateway secret. Platform adapters may add implementation details internally; they never enter this contract.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": ["schema", "platform", "workloadIdentityRef", "secretRef", "runtimeBindingDigest"],
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
3
|
"$id": "https://schemas.harbour.dev/app-integrations-declaration.schema.json",
|
|
4
4
|
"title": "AppIntegrationsDeclaration",
|
|
5
|
-
"description": "Committed `.
|
|
5
|
+
"description": "Committed `.isomorph/integrations.json`: the app's declared use of tenant-wide integration connections. Keys are logical connection aliases (the governance sourceId); resources are logical names (Slack channel alias, warehouse view name), never IDs, tokens or URLs. The operation set is closed (six operations). Each operation carries a fixed identity mode — slack.channel.history=user, gmail.thread.list=user, gmail.message.read=user, gmail.message.send=user, warehouse.view.read=app — except slack.message.post, whose mode the app DECLARES: `app` posts as the company's Slack app (the one audited bot identity, under the IT-approved per-app display name when the connection declares `presentation`), `user` posts as the signed-in person after their own consent. The declared mode is the one the app requests access for; an app may hold approved grants for both modes after two requests, and each slack.message.post call names which approved mode it runs under (`mode` on the execute request, 0.55.0) — a mode IT did not approve is refused, never swapped for the other. A `saas` connection may declare only the Slack and Gmail operations and a `database` connection only warehouse.view.read; `presentation` is a `saas` connection's optional per-app display name and icon for app-mode Slack posts, shown to IT at approval time and applied only from the approved grant. Gmail is user-mode only (reads plus one send); its single resource is the fixed `inbox` alias. This file also owns the shared IntegrationOperation / IntegrationIdentityMode / IntegrationEnvironment / IntegrationConnectionKind / IntegrationPresentation definitions referenced by the other integration schemas.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": ["schema", "connections"],
|
|
9
9
|
"properties": {
|
|
10
|
-
"schema": { "type": "string", "const": "
|
|
10
|
+
"schema": { "type": "string", "const": "isomorph.app-integrations/2.0" },
|
|
11
11
|
"connections": {
|
|
12
12
|
"type": "object",
|
|
13
13
|
"minProperties": 1,
|
|
@@ -148,7 +148,7 @@
|
|
|
148
148
|
},
|
|
149
149
|
"examples": [
|
|
150
150
|
{
|
|
151
|
-
"schema": "
|
|
151
|
+
"schema": "isomorph.app-integrations/2.0",
|
|
152
152
|
"connections": {
|
|
153
153
|
"company-slack": {
|
|
154
154
|
"kind": "saas",
|
|
@@ -178,7 +178,7 @@
|
|
|
178
178
|
}
|
|
179
179
|
},
|
|
180
180
|
{
|
|
181
|
-
"schema": "
|
|
181
|
+
"schema": "isomorph.app-integrations/2.0",
|
|
182
182
|
"connections": {
|
|
183
183
|
"company-slack": {
|
|
184
184
|
"kind": "saas",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"DataDependencyKind": {
|
|
31
31
|
"type": "string",
|
|
32
32
|
"enum": ["database", "api", "app_owned_external"],
|
|
33
|
-
"description": "database = a SQL/warehouse connection; api = an HTTP(S) service; app_owned_external = infrastructure the app owns outside
|
|
33
|
+
"description": "database = a SQL/warehouse connection; api = an HTTP(S) service; app_owned_external = infrastructure the app owns outside Isomorph."
|
|
34
34
|
},
|
|
35
35
|
"DataDependencyIdentifiers": {
|
|
36
36
|
"type": "object",
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"DataDependencyClassification": {
|
|
66
66
|
"type": "string",
|
|
67
67
|
"enum": ["matched", "out_of_scope", "unknown", "inventory", "app_owned_external"],
|
|
68
|
-
"description": "matched = resolved to a registered source; out_of_scope = resolved but not requestable; unknown = unresolvable; inventory = registered but unused; app_owned_external = app-owned, outside
|
|
68
|
+
"description": "matched = resolved to a registered source; out_of_scope = resolved but not requestable; unknown = unresolvable; inventory = registered but unused; app_owned_external = app-owned, outside Isomorph's remit."
|
|
69
69
|
},
|
|
70
70
|
"DataDependencyOrigin": {
|
|
71
71
|
"type": "string",
|
|
@@ -126,7 +126,7 @@
|
|
|
126
126
|
"DataSourceProvisioningMode": {
|
|
127
127
|
"type": "string",
|
|
128
128
|
"enum": ["byo", "harbour_managed"],
|
|
129
|
-
"description": "byo = admin brought existing infrastructure; harbour_managed =
|
|
129
|
+
"description": "byo = admin brought existing infrastructure; harbour_managed = Isomorph provisioned it."
|
|
130
130
|
},
|
|
131
131
|
"DataSourceStatus": {
|
|
132
132
|
"type": "string",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
3
|
"$id": "https://schemas.harbour.dev/deployment-environment.schema.json",
|
|
4
4
|
"title": "DeploymentEnvironment",
|
|
5
|
-
"description": "Public environment accepted by the preview deployment-control-plane APIs. The MVP accepts only preview; production remains reachable only through
|
|
5
|
+
"description": "Public environment accepted by the preview deployment-control-plane APIs. The MVP accepts only preview; production remains reachable only through Isomorph's human-merge promotion flow.",
|
|
6
6
|
"type": "string",
|
|
7
7
|
"enum": ["preview"],
|
|
8
8
|
"examples": ["preview"]
|
|
@@ -122,7 +122,7 @@
|
|
|
122
122
|
"type": "object",
|
|
123
123
|
"additionalProperties": false,
|
|
124
124
|
"required": ["account", "region"],
|
|
125
|
-
"description": "The customer account and region this version deploys into, stamped on the version record at admission for customer-account (BYOC) tenants. Absent means
|
|
125
|
+
"description": "The customer account and region this version deploys into, stamped on the version record at admission for customer-account (BYOC) tenants. Absent means Isomorph-managed — the same convention the record itself uses — so every pre-destination version simply omits it. Deliberately only account and region: the record's roleArn/externalId are how the pipeline gets into the account, not where the deploy landed, and no status consumer needs them.",
|
|
126
126
|
"properties": {
|
|
127
127
|
"account": {
|
|
128
128
|
"type": "string",
|