@fourier-labs/harbour-contracts 0.4.0 → 0.5.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.
Files changed (83) hide show
  1. package/dist/gen-ts/ai-callsite-inventory.d.ts +49 -0
  2. package/dist/gen-ts/ai-gateway-key-lookup.d.ts +20 -0
  3. package/dist/gen-ts/ai-gateway-key-token.d.ts +4 -0
  4. package/dist/gen-ts/ai-gateway-key-token.js +6 -0
  5. package/dist/gen-ts/ai-governance-decision.d.ts +74 -0
  6. package/dist/gen-ts/ai-policy-snapshot.d.ts +429 -0
  7. package/dist/gen-ts/ai-runtime-contract.d.ts +27 -0
  8. package/dist/gen-ts/ai-trace-event.d.ts +68 -0
  9. package/dist/gen-ts/ai-transform-event.d.ts +66 -0
  10. package/dist/gen-ts/ai-transform-result.d.ts +32 -0
  11. package/dist/gen-ts/ai-verification-evidence.d.ts +49 -0
  12. package/dist/gen-ts/data-dependency.d.ts +42 -0
  13. package/dist/gen-ts/data-grant.d.ts +58 -0
  14. package/dist/gen-ts/data-grant.js +12 -0
  15. package/dist/gen-ts/data-source.d.ts +74 -0
  16. package/dist/{deploy-request.d.ts → gen-ts/deploy-request.d.ts} +30 -0
  17. package/dist/gen-ts/deployment-source.js +3 -0
  18. package/dist/gen-ts/deployment-status-failure.js +3 -0
  19. package/dist/gen-ts/deployment-status-request.js +3 -0
  20. package/dist/gen-ts/deployment-status-response.js +3 -0
  21. package/dist/gen-ts/env-bindings.js +3 -0
  22. package/dist/gen-ts/error-category.js +3 -0
  23. package/dist/gen-ts/error-envelope.js +3 -0
  24. package/dist/{index.d.ts → gen-ts/index.d.ts} +14 -0
  25. package/dist/{index.js → gen-ts/index.js} +14 -0
  26. package/dist/gen-ts/kvs-routing-entry.js +3 -0
  27. package/dist/gen-ts/promotion-request.js +3 -0
  28. package/dist/gen-ts/promotion-response.js +3 -0
  29. package/dist/gen-ts/secret-reference.d.ts +36 -0
  30. package/dist/gen-ts/secret-reference.js +3 -0
  31. package/dist/gen-ts/version-state.js +3 -0
  32. package/dist/resolver/index.d.ts +256 -0
  33. package/dist/resolver/index.js +679 -0
  34. package/package.json +14 -4
  35. package/schema/ai-callsite-inventory.schema.json +138 -0
  36. package/schema/ai-gateway-key-lookup.schema.json +53 -0
  37. package/schema/ai-governance-decision.schema.json +105 -0
  38. package/schema/ai-policy-snapshot.schema.json +340 -0
  39. package/schema/ai-runtime-contract.schema.json +85 -0
  40. package/schema/ai-trace-event.schema.json +178 -0
  41. package/schema/ai-transform-event.schema.json +72 -0
  42. package/schema/ai-transform-result.schema.json +46 -0
  43. package/schema/ai-verification-evidence.schema.json +57 -0
  44. package/schema/data-dependency.schema.json +89 -0
  45. package/schema/data-grant.schema.json +107 -0
  46. package/schema/data-source.schema.json +151 -0
  47. package/schema/deploy-request.schema.json +60 -0
  48. package/schema/secret-reference.schema.json +70 -0
  49. /package/dist/{api-error-response.js → gen-ts/ai-callsite-inventory.js} +0 -0
  50. /package/dist/{artifact-contract.js → gen-ts/ai-gateway-key-lookup.js} +0 -0
  51. /package/dist/{deploy-request.js → gen-ts/ai-governance-decision.js} +0 -0
  52. /package/dist/{deploy-response.js → gen-ts/ai-policy-snapshot.js} +0 -0
  53. /package/dist/{deployment-environment.js → gen-ts/ai-runtime-contract.js} +0 -0
  54. /package/dist/{deployment-source.js → gen-ts/ai-trace-event.js} +0 -0
  55. /package/dist/{deployment-status-failure.js → gen-ts/ai-transform-event.js} +0 -0
  56. /package/dist/{deployment-status-request.js → gen-ts/ai-transform-result.js} +0 -0
  57. /package/dist/{deployment-status-response.js → gen-ts/ai-verification-evidence.js} +0 -0
  58. /package/dist/{api-error-response.d.ts → gen-ts/api-error-response.d.ts} +0 -0
  59. /package/dist/{env-bindings.js → gen-ts/api-error-response.js} +0 -0
  60. /package/dist/{artifact-contract.d.ts → gen-ts/artifact-contract.d.ts} +0 -0
  61. /package/dist/{error-category.js → gen-ts/artifact-contract.js} +0 -0
  62. /package/dist/{error-envelope.js → gen-ts/data-dependency.js} +0 -0
  63. /package/dist/{kvs-routing-entry.js → gen-ts/data-source.js} +0 -0
  64. /package/dist/{promotion-request.js → gen-ts/deploy-request.js} +0 -0
  65. /package/dist/{deploy-response.d.ts → gen-ts/deploy-response.d.ts} +0 -0
  66. /package/dist/{promotion-response.js → gen-ts/deploy-response.js} +0 -0
  67. /package/dist/{deployment-environment.d.ts → gen-ts/deployment-environment.d.ts} +0 -0
  68. /package/dist/{version-state.js → gen-ts/deployment-environment.js} +0 -0
  69. /package/dist/{deployment-source.d.ts → gen-ts/deployment-source.d.ts} +0 -0
  70. /package/dist/{deployment-status-failure.d.ts → gen-ts/deployment-status-failure.d.ts} +0 -0
  71. /package/dist/{deployment-status-request.d.ts → gen-ts/deployment-status-request.d.ts} +0 -0
  72. /package/dist/{deployment-status-response.d.ts → gen-ts/deployment-status-response.d.ts} +0 -0
  73. /package/dist/{env-bindings.d.ts → gen-ts/env-bindings.d.ts} +0 -0
  74. /package/dist/{error-category-registry.d.ts → gen-ts/error-category-registry.d.ts} +0 -0
  75. /package/dist/{error-category-registry.js → gen-ts/error-category-registry.js} +0 -0
  76. /package/dist/{error-category.d.ts → gen-ts/error-category.d.ts} +0 -0
  77. /package/dist/{error-envelope.d.ts → gen-ts/error-envelope.d.ts} +0 -0
  78. /package/dist/{kvs-routing-entry.d.ts → gen-ts/kvs-routing-entry.d.ts} +0 -0
  79. /package/dist/{promotion-request.d.ts → gen-ts/promotion-request.d.ts} +0 -0
  80. /package/dist/{promotion-response.d.ts → gen-ts/promotion-response.d.ts} +0 -0
  81. /package/dist/{version-state-machine.d.ts → gen-ts/version-state-machine.d.ts} +0 -0
  82. /package/dist/{version-state-machine.js → gen-ts/version-state-machine.js} +0 -0
  83. /package/dist/{version-state.d.ts → gen-ts/version-state.d.ts} +0 -0
@@ -0,0 +1,49 @@
1
+ export type AiInventoryIdentifier = string;
2
+ export type AiInventoryDigest = string;
3
+ /**
4
+ * Immutable, sanitized AI call-site discovery for one exact Harbour deployment version. Inventory records detection only; planning, transformation, and verification outcomes are separate append-only records.
5
+ */
6
+ export interface AiCallsiteInventory {
7
+ schema: 'harbour.ai-callsite-inventory/1.0';
8
+ tenantId: AiInventoryIdentifier;
9
+ appId: AiInventoryIdentifier;
10
+ environment: AiInventoryIdentifier;
11
+ versionId: string;
12
+ sourceRevision: string;
13
+ analyzerVersion: string;
14
+ coverage: 'complete_for_supported_sdks' | 'partial';
15
+ /**
16
+ * Required and never defaulted. Unavailable security evidence is not represented as a clean scan.
17
+ */
18
+ scanStatus: 'completed' | 'cybersecurity_scan_unavailable';
19
+ /**
20
+ * Canonical order is ascending by fingerprint, then path, then line. Producers MUST serialize this order before digesting or publishing the inventory.
21
+ *
22
+ * @maxItems 1000
23
+ */
24
+ callsites: AiInventoryCallsite[];
25
+ }
26
+ export interface AiInventoryCallsite {
27
+ fingerprint: AiInventoryDigest;
28
+ path: string;
29
+ sourceFileSha256: AiInventoryDigest;
30
+ line: number;
31
+ language: 'javascript' | 'typescript' | 'python' | 'go' | 'unknown';
32
+ sdk: 'openai' | 'openai-compatible' | 'anthropic' | 'google-genai' | 'mistral' | 'bedrock' | 'cohere' | 'ollama' | 'legacy-gemini' | 'direct-provider-rest' | 'unknown';
33
+ method: string;
34
+ requestedModel?: string;
35
+ strategy: 'deployment_injection' | 'deterministic_adapter' | 'unsupported';
36
+ status: 'detected';
37
+ /**
38
+ * @maxItems 64
39
+ */
40
+ securityFindingIds: string[];
41
+ evidence: AiInventoryEvidence;
42
+ }
43
+ export interface AiInventoryEvidence {
44
+ fingerprint: AiInventoryDigest;
45
+ /**
46
+ * Sanitized single-line evidence; never raw source or a prompt.
47
+ */
48
+ excerpt: string;
49
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Value-free Gateway authentication metadata for one version-scoped Harbour key.
3
+ */
4
+ export type AiGatewayKeyLookup = {
5
+ schema: 'harbour.ai-gateway-key-lookup/1.0';
6
+ keyId: string;
7
+ tenantId: AiGatewayKeyIdentifier;
8
+ appId: AiGatewayKeyIdentifier;
9
+ environment: AiGatewayKeyIdentifier;
10
+ versionId: string;
11
+ tokenPrefix: 'hbr_live_' | 'hbr_test_';
12
+ status: 'PENDING' | 'ACTIVE' | 'REVOKED';
13
+ keyMac?: string;
14
+ createdAt: string;
15
+ activatedAt?: string;
16
+ expiresAt?: string;
17
+ overlapExpiresAt?: string;
18
+ revokedAt?: string;
19
+ };
20
+ export type AiGatewayKeyIdentifier = string;
@@ -0,0 +1,4 @@
1
+ export declare const AiGatewayKeyProductionPrefix: "hbr_live_";
2
+ export declare const AiGatewayKeyNonProductionPrefix: "hbr_test_";
3
+ export declare const AiGatewayKeyTokenPatternSource: "^hbr_(live|test)_([0-9a-f]{32})\\.([A-Za-z0-9_-]{43})$";
4
+ export declare const AiGatewayKeyTokenPattern: RegExp;
@@ -0,0 +1,6 @@
1
+ /* eslint-disable */
2
+ // Code generated by tools/gen/gen.mjs from schema/*.json. DO NOT EDIT.
3
+ export const AiGatewayKeyProductionPrefix = "hbr_live_";
4
+ export const AiGatewayKeyNonProductionPrefix = "hbr_test_";
5
+ export const AiGatewayKeyTokenPatternSource = "^hbr_(live|test)_([0-9a-f]{32})\\.([A-Za-z0-9_-]{43})$";
6
+ export const AiGatewayKeyTokenPattern = new RegExp(AiGatewayKeyTokenPatternSource);
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Digest-bound PLAN or VERIFY decision returned to the deployment control plane.
3
+ */
4
+ export type AiGovernanceDecision = {
5
+ schema: 'harbour.ai-governance-decision/1.0';
6
+ phase: 'PLAN' | 'VERIFY';
7
+ tenantId: AiDecisionIdentifier;
8
+ appId: AiDecisionIdentifier;
9
+ environment: AiDecisionIdentifier;
10
+ versionId: string;
11
+ sourceRevision: string;
12
+ decision: 'PASS' | 'BLOCKED';
13
+ interceptionPath: 'NO_AI_CALLS' | 'DEPLOYMENT_INJECTION' | 'DETERMINISTIC_ADAPTER' | 'BLOCKED';
14
+ /**
15
+ * @maxItems 64
16
+ */
17
+ reasonCodes: AiDecisionIdentifier[];
18
+ /**
19
+ * @maxItems 1000
20
+ */
21
+ uncoveredCallsiteFingerprints: AiDecisionDigest[];
22
+ inventoryDigest: AiDecisionDigest;
23
+ policyDigest: AiDecisionDigest;
24
+ runtimeContractDigest?: AiDecisionDigest;
25
+ /**
26
+ * @maxItems 1000
27
+ */
28
+ interceptionPlan: AiInterceptionPlanEntry[];
29
+ interceptionPlanDigest: AiDecisionDigest;
30
+ evidenceDigest?: AiDecisionDigest;
31
+ runtimeContract?: AiDecisionRuntimeContract;
32
+ decidedAt: string;
33
+ };
34
+ export type AiDecisionIdentifier = string;
35
+ export type AiDecisionDigest = string;
36
+ export type AiInterceptionPlanEntry = {
37
+ callSiteFingerprint: AiDecisionDigest;
38
+ sourcePath: string;
39
+ expectedSourceFileSha256: AiDecisionDigest;
40
+ strategy: 'deployment_injection' | 'deterministic_adapter';
41
+ /**
42
+ * @minItems 1
43
+ * @maxItems 32
44
+ */
45
+ allowedSyntaxKinds: [AiDecisionIdentifier, ...AiDecisionIdentifier[]];
46
+ configurationMappingId?: AiDecisionIdentifier;
47
+ configurationMappingVersion?: string;
48
+ transformId?: AiDecisionIdentifier;
49
+ transformVersion?: string;
50
+ runtimeShimName?: string;
51
+ runtimeShimVersion?: string;
52
+ runtimeShimDigest?: AiDecisionDigest;
53
+ };
54
+ export interface AiDecisionRuntimeContract {
55
+ schema: 'harbour.ai-runtime-contract/1.0';
56
+ tenantId: AiDecisionIdentifier;
57
+ appId: AiDecisionIdentifier;
58
+ environment: AiDecisionIdentifier;
59
+ versionId: string;
60
+ sourceRevision: string;
61
+ mode: 'observe' | 'enforce';
62
+ gatewayBaseUrl: string;
63
+ gatewayKeySecretRef: string;
64
+ modelAliases: {
65
+ generation?: string;
66
+ embeddings?: string;
67
+ };
68
+ policyDigest: AiDecisionDigest;
69
+ /**
70
+ * @minItems 1
71
+ * @maxItems 2
72
+ */
73
+ requiredStrategies: ['deployment_injection' | 'deterministic_adapter'] | ['deployment_injection' | 'deterministic_adapter', 'deployment_injection' | 'deterministic_adapter'];
74
+ }
@@ -0,0 +1,429 @@
1
+ export type AiPolicyScope = {
2
+ level: 'tenant' | 'application_environment';
3
+ tenantId: AiPolicyIdentifier;
4
+ appId?: AiPolicyIdentifier;
5
+ environment?: AiPolicyIdentifier;
6
+ };
7
+ export type AiPolicyIdentifier = string;
8
+ export type AiPolicyDigest = string;
9
+ export type AiPolicyGuardrailRule = {
10
+ ruleId: AiPolicyIdentifier;
11
+ detectorId: AiPolicyIdentifier;
12
+ detectorVersion: string;
13
+ phase: 'input' | 'output';
14
+ action: 'ALLOW' | 'OBSERVE' | 'REDACT' | 'BLOCK';
15
+ parameters?: AiPolicyGuardrailParameters;
16
+ };
17
+ /**
18
+ * Bounded, closed JSON Schema subset carried by an output.json_schema guardrail. Every node is a closed object over an enumerated keyword set; object nodes must state additionalProperties: false, so the validated output shape is closed too. Size is bounded per node (maxProperties/maxLength/maxItems); the consuming validator additionally enforces an overall byte budget at policy load.
19
+ */
20
+ export type AiPolicyEmbeddedJsonSchema = {
21
+ type: 'object' | 'array' | 'string' | 'number' | 'integer' | 'boolean' | 'null';
22
+ description?: string;
23
+ properties?: {
24
+ [k: string]: AiPolicyEmbeddedJsonSchema;
25
+ };
26
+ /**
27
+ * @maxItems 64
28
+ */
29
+ required?: string[];
30
+ additionalProperties?: false;
31
+ items?: AiPolicyEmbeddedJsonSchema;
32
+ /**
33
+ * @minItems 1
34
+ * @maxItems 64
35
+ */
36
+ enum?: [string | number | number | boolean | null, ...(string | number | number | boolean | null)[]];
37
+ minimum?: number;
38
+ maximum?: number;
39
+ minLength?: number;
40
+ maxLength?: number;
41
+ minItems?: number;
42
+ maxItems?: number;
43
+ };
44
+ /**
45
+ * Immutable, content-addressed AI policy snapshot consumed by the Harbour AI Gateway. Provider credentials are represented only by Secrets Manager references.
46
+ */
47
+ export interface AiPolicySnapshot {
48
+ schema: 'harbour.ai-policy-snapshot/1.0';
49
+ scope: AiPolicyScope;
50
+ revision: number;
51
+ publishedAt: string;
52
+ contentDigest: AiPolicyDigest;
53
+ baselineDigest: AiPolicyDigest;
54
+ classificationMinimum?: AiPolicyClassificationMinimum;
55
+ /**
56
+ * @maxItems 64
57
+ */
58
+ providers: AiPolicyProvider[];
59
+ /**
60
+ * @maxItems 512
61
+ */
62
+ models: AiPolicyModel[];
63
+ /**
64
+ * @maxItems 256
65
+ */
66
+ routes: AiPolicyRoute[];
67
+ /**
68
+ * @maxItems 256
69
+ */
70
+ policies: AiPolicyRuleSet[];
71
+ /**
72
+ * @maxItems 128
73
+ */
74
+ limits: AiPolicyLimit[];
75
+ retention: AiPolicyRetention;
76
+ }
77
+ export interface AiPolicyClassificationMinimum {
78
+ classification: 'Green' | 'Yellow' | 'Orange' | 'Red';
79
+ mappingDigest: AiPolicyDigest;
80
+ }
81
+ export interface AiPolicyProvider {
82
+ id: AiPolicyIdentifier;
83
+ provider: 'openai' | 'anthropic' | 'gemini' | 'openrouter';
84
+ baseUrl?: string;
85
+ credentialSecretRef: string;
86
+ enabled: boolean;
87
+ }
88
+ export interface AiPolicyModel {
89
+ id: AiPolicyIdentifier;
90
+ providerId: AiPolicyIdentifier;
91
+ providerModel: string;
92
+ /**
93
+ * @minItems 1
94
+ * @maxItems 2
95
+ */
96
+ capabilities: ['generation' | 'embeddings'] | ['generation' | 'embeddings', 'generation' | 'embeddings'];
97
+ approved: boolean;
98
+ pricing: AiPolicyPricing;
99
+ }
100
+ export interface AiPolicyPricing {
101
+ revision: AiPolicyIdentifier;
102
+ inputMicroUsdPerMillion: number;
103
+ outputMicroUsdPerMillion: number;
104
+ }
105
+ export interface AiPolicyRoute {
106
+ alias: AiPolicyIdentifier;
107
+ version: number;
108
+ capability: 'generation' | 'embeddings';
109
+ /**
110
+ * @minItems 1
111
+ * @maxItems 16
112
+ */
113
+ targets: [AiPolicyRouteTarget] | [AiPolicyRouteTarget, AiPolicyRouteTarget] | [AiPolicyRouteTarget, AiPolicyRouteTarget, AiPolicyRouteTarget] | [AiPolicyRouteTarget, AiPolicyRouteTarget, AiPolicyRouteTarget, AiPolicyRouteTarget] | [AiPolicyRouteTarget, AiPolicyRouteTarget, AiPolicyRouteTarget, AiPolicyRouteTarget, AiPolicyRouteTarget] | [
114
+ AiPolicyRouteTarget,
115
+ AiPolicyRouteTarget,
116
+ AiPolicyRouteTarget,
117
+ AiPolicyRouteTarget,
118
+ AiPolicyRouteTarget,
119
+ AiPolicyRouteTarget
120
+ ] | [
121
+ AiPolicyRouteTarget,
122
+ AiPolicyRouteTarget,
123
+ AiPolicyRouteTarget,
124
+ AiPolicyRouteTarget,
125
+ AiPolicyRouteTarget,
126
+ AiPolicyRouteTarget,
127
+ AiPolicyRouteTarget
128
+ ] | [
129
+ AiPolicyRouteTarget,
130
+ AiPolicyRouteTarget,
131
+ AiPolicyRouteTarget,
132
+ AiPolicyRouteTarget,
133
+ AiPolicyRouteTarget,
134
+ AiPolicyRouteTarget,
135
+ AiPolicyRouteTarget,
136
+ AiPolicyRouteTarget
137
+ ] | [
138
+ AiPolicyRouteTarget,
139
+ AiPolicyRouteTarget,
140
+ AiPolicyRouteTarget,
141
+ AiPolicyRouteTarget,
142
+ AiPolicyRouteTarget,
143
+ AiPolicyRouteTarget,
144
+ AiPolicyRouteTarget,
145
+ AiPolicyRouteTarget,
146
+ AiPolicyRouteTarget
147
+ ] | [
148
+ AiPolicyRouteTarget,
149
+ AiPolicyRouteTarget,
150
+ AiPolicyRouteTarget,
151
+ AiPolicyRouteTarget,
152
+ AiPolicyRouteTarget,
153
+ AiPolicyRouteTarget,
154
+ AiPolicyRouteTarget,
155
+ AiPolicyRouteTarget,
156
+ AiPolicyRouteTarget,
157
+ AiPolicyRouteTarget
158
+ ] | [
159
+ AiPolicyRouteTarget,
160
+ AiPolicyRouteTarget,
161
+ AiPolicyRouteTarget,
162
+ AiPolicyRouteTarget,
163
+ AiPolicyRouteTarget,
164
+ AiPolicyRouteTarget,
165
+ AiPolicyRouteTarget,
166
+ AiPolicyRouteTarget,
167
+ AiPolicyRouteTarget,
168
+ AiPolicyRouteTarget,
169
+ AiPolicyRouteTarget
170
+ ] | [
171
+ AiPolicyRouteTarget,
172
+ AiPolicyRouteTarget,
173
+ AiPolicyRouteTarget,
174
+ AiPolicyRouteTarget,
175
+ AiPolicyRouteTarget,
176
+ AiPolicyRouteTarget,
177
+ AiPolicyRouteTarget,
178
+ AiPolicyRouteTarget,
179
+ AiPolicyRouteTarget,
180
+ AiPolicyRouteTarget,
181
+ AiPolicyRouteTarget,
182
+ AiPolicyRouteTarget
183
+ ] | [
184
+ AiPolicyRouteTarget,
185
+ AiPolicyRouteTarget,
186
+ AiPolicyRouteTarget,
187
+ AiPolicyRouteTarget,
188
+ AiPolicyRouteTarget,
189
+ AiPolicyRouteTarget,
190
+ AiPolicyRouteTarget,
191
+ AiPolicyRouteTarget,
192
+ AiPolicyRouteTarget,
193
+ AiPolicyRouteTarget,
194
+ AiPolicyRouteTarget,
195
+ AiPolicyRouteTarget,
196
+ AiPolicyRouteTarget
197
+ ] | [
198
+ AiPolicyRouteTarget,
199
+ AiPolicyRouteTarget,
200
+ AiPolicyRouteTarget,
201
+ AiPolicyRouteTarget,
202
+ AiPolicyRouteTarget,
203
+ AiPolicyRouteTarget,
204
+ AiPolicyRouteTarget,
205
+ AiPolicyRouteTarget,
206
+ AiPolicyRouteTarget,
207
+ AiPolicyRouteTarget,
208
+ AiPolicyRouteTarget,
209
+ AiPolicyRouteTarget,
210
+ AiPolicyRouteTarget,
211
+ AiPolicyRouteTarget
212
+ ] | [
213
+ AiPolicyRouteTarget,
214
+ AiPolicyRouteTarget,
215
+ AiPolicyRouteTarget,
216
+ AiPolicyRouteTarget,
217
+ AiPolicyRouteTarget,
218
+ AiPolicyRouteTarget,
219
+ AiPolicyRouteTarget,
220
+ AiPolicyRouteTarget,
221
+ AiPolicyRouteTarget,
222
+ AiPolicyRouteTarget,
223
+ AiPolicyRouteTarget,
224
+ AiPolicyRouteTarget,
225
+ AiPolicyRouteTarget,
226
+ AiPolicyRouteTarget,
227
+ AiPolicyRouteTarget
228
+ ] | [
229
+ AiPolicyRouteTarget,
230
+ AiPolicyRouteTarget,
231
+ AiPolicyRouteTarget,
232
+ AiPolicyRouteTarget,
233
+ AiPolicyRouteTarget,
234
+ AiPolicyRouteTarget,
235
+ AiPolicyRouteTarget,
236
+ AiPolicyRouteTarget,
237
+ AiPolicyRouteTarget,
238
+ AiPolicyRouteTarget,
239
+ AiPolicyRouteTarget,
240
+ AiPolicyRouteTarget,
241
+ AiPolicyRouteTarget,
242
+ AiPolicyRouteTarget,
243
+ AiPolicyRouteTarget,
244
+ AiPolicyRouteTarget
245
+ ];
246
+ retryCount: number;
247
+ timeoutMs: number;
248
+ }
249
+ export interface AiPolicyRouteTarget {
250
+ modelId: AiPolicyIdentifier;
251
+ priority: number;
252
+ weight: number;
253
+ }
254
+ export interface AiPolicyRuleSet {
255
+ name: AiPolicyIdentifier;
256
+ version: number;
257
+ maxRequestBytes: number;
258
+ maxInputTokens: number;
259
+ maxOutputTokens: number;
260
+ bufferedDelivery: boolean;
261
+ permittedRequestFields: AiPolicyPermittedRequestFields;
262
+ /**
263
+ * @maxItems 128
264
+ */
265
+ guardrails: AiPolicyGuardrailRule[];
266
+ }
267
+ export interface AiPolicyPermittedRequestFields {
268
+ temperature: boolean;
269
+ maxOutputTokens: boolean;
270
+ responseFormat: boolean;
271
+ tools: boolean;
272
+ }
273
+ export interface AiPolicyGuardrailParameters {
274
+ /**
275
+ * @minItems 1
276
+ * @maxItems 64
277
+ */
278
+ allowedTools?: [string, ...string[]];
279
+ jsonSchema?: AiPolicyEmbeddedJsonSchema;
280
+ jsonSchemaRef?: AiPolicyDigest;
281
+ }
282
+ export interface AiPolicyLimit {
283
+ name: AiPolicyIdentifier;
284
+ enabled: boolean;
285
+ scope: 'tenant' | 'application';
286
+ requestsPerMinute: number;
287
+ tokensPerMinute: number;
288
+ monthlyBudgetMicroUsd: number;
289
+ }
290
+ export interface AiPolicyRetention {
291
+ captureMode: 'OFF' | 'BEST_EFFORT' | 'REQUIRED';
292
+ retentionDays: number;
293
+ /**
294
+ * @maxItems 16
295
+ */
296
+ revealRoles: [] | [AiPolicyIdentifier] | [AiPolicyIdentifier, AiPolicyIdentifier] | [AiPolicyIdentifier, AiPolicyIdentifier, AiPolicyIdentifier] | [AiPolicyIdentifier, AiPolicyIdentifier, AiPolicyIdentifier, AiPolicyIdentifier] | [AiPolicyIdentifier, AiPolicyIdentifier, AiPolicyIdentifier, AiPolicyIdentifier, AiPolicyIdentifier] | [
297
+ AiPolicyIdentifier,
298
+ AiPolicyIdentifier,
299
+ AiPolicyIdentifier,
300
+ AiPolicyIdentifier,
301
+ AiPolicyIdentifier,
302
+ AiPolicyIdentifier
303
+ ] | [
304
+ AiPolicyIdentifier,
305
+ AiPolicyIdentifier,
306
+ AiPolicyIdentifier,
307
+ AiPolicyIdentifier,
308
+ AiPolicyIdentifier,
309
+ AiPolicyIdentifier,
310
+ AiPolicyIdentifier
311
+ ] | [
312
+ AiPolicyIdentifier,
313
+ AiPolicyIdentifier,
314
+ AiPolicyIdentifier,
315
+ AiPolicyIdentifier,
316
+ AiPolicyIdentifier,
317
+ AiPolicyIdentifier,
318
+ AiPolicyIdentifier,
319
+ AiPolicyIdentifier
320
+ ] | [
321
+ AiPolicyIdentifier,
322
+ AiPolicyIdentifier,
323
+ AiPolicyIdentifier,
324
+ AiPolicyIdentifier,
325
+ AiPolicyIdentifier,
326
+ AiPolicyIdentifier,
327
+ AiPolicyIdentifier,
328
+ AiPolicyIdentifier,
329
+ AiPolicyIdentifier
330
+ ] | [
331
+ AiPolicyIdentifier,
332
+ AiPolicyIdentifier,
333
+ AiPolicyIdentifier,
334
+ AiPolicyIdentifier,
335
+ AiPolicyIdentifier,
336
+ AiPolicyIdentifier,
337
+ AiPolicyIdentifier,
338
+ AiPolicyIdentifier,
339
+ AiPolicyIdentifier,
340
+ AiPolicyIdentifier
341
+ ] | [
342
+ AiPolicyIdentifier,
343
+ AiPolicyIdentifier,
344
+ AiPolicyIdentifier,
345
+ AiPolicyIdentifier,
346
+ AiPolicyIdentifier,
347
+ AiPolicyIdentifier,
348
+ AiPolicyIdentifier,
349
+ AiPolicyIdentifier,
350
+ AiPolicyIdentifier,
351
+ AiPolicyIdentifier,
352
+ AiPolicyIdentifier
353
+ ] | [
354
+ AiPolicyIdentifier,
355
+ AiPolicyIdentifier,
356
+ AiPolicyIdentifier,
357
+ AiPolicyIdentifier,
358
+ AiPolicyIdentifier,
359
+ AiPolicyIdentifier,
360
+ AiPolicyIdentifier,
361
+ AiPolicyIdentifier,
362
+ AiPolicyIdentifier,
363
+ AiPolicyIdentifier,
364
+ AiPolicyIdentifier,
365
+ AiPolicyIdentifier
366
+ ] | [
367
+ AiPolicyIdentifier,
368
+ AiPolicyIdentifier,
369
+ AiPolicyIdentifier,
370
+ AiPolicyIdentifier,
371
+ AiPolicyIdentifier,
372
+ AiPolicyIdentifier,
373
+ AiPolicyIdentifier,
374
+ AiPolicyIdentifier,
375
+ AiPolicyIdentifier,
376
+ AiPolicyIdentifier,
377
+ AiPolicyIdentifier,
378
+ AiPolicyIdentifier,
379
+ AiPolicyIdentifier
380
+ ] | [
381
+ AiPolicyIdentifier,
382
+ AiPolicyIdentifier,
383
+ AiPolicyIdentifier,
384
+ AiPolicyIdentifier,
385
+ AiPolicyIdentifier,
386
+ AiPolicyIdentifier,
387
+ AiPolicyIdentifier,
388
+ AiPolicyIdentifier,
389
+ AiPolicyIdentifier,
390
+ AiPolicyIdentifier,
391
+ AiPolicyIdentifier,
392
+ AiPolicyIdentifier,
393
+ AiPolicyIdentifier,
394
+ AiPolicyIdentifier
395
+ ] | [
396
+ AiPolicyIdentifier,
397
+ AiPolicyIdentifier,
398
+ AiPolicyIdentifier,
399
+ AiPolicyIdentifier,
400
+ AiPolicyIdentifier,
401
+ AiPolicyIdentifier,
402
+ AiPolicyIdentifier,
403
+ AiPolicyIdentifier,
404
+ AiPolicyIdentifier,
405
+ AiPolicyIdentifier,
406
+ AiPolicyIdentifier,
407
+ AiPolicyIdentifier,
408
+ AiPolicyIdentifier,
409
+ AiPolicyIdentifier,
410
+ AiPolicyIdentifier
411
+ ] | [
412
+ AiPolicyIdentifier,
413
+ AiPolicyIdentifier,
414
+ AiPolicyIdentifier,
415
+ AiPolicyIdentifier,
416
+ AiPolicyIdentifier,
417
+ AiPolicyIdentifier,
418
+ AiPolicyIdentifier,
419
+ AiPolicyIdentifier,
420
+ AiPolicyIdentifier,
421
+ AiPolicyIdentifier,
422
+ AiPolicyIdentifier,
423
+ AiPolicyIdentifier,
424
+ AiPolicyIdentifier,
425
+ AiPolicyIdentifier,
426
+ AiPolicyIdentifier,
427
+ AiPolicyIdentifier
428
+ ];
429
+ }
@@ -0,0 +1,27 @@
1
+ export type AiRuntimeIdentifier = string;
2
+ export type AiRuntimeModelAlias = string;
3
+ export type AiRuntimeDigest = string;
4
+ /**
5
+ * Immutable deployment runtime contract derived by an AI Governance PLAN decision. Contains only scoped configuration and a Secrets Manager reference, never key plaintext.
6
+ */
7
+ export interface AiRuntimeContract {
8
+ schema: 'harbour.ai-runtime-contract/1.0';
9
+ tenantId: AiRuntimeIdentifier;
10
+ appId: AiRuntimeIdentifier;
11
+ environment: AiRuntimeIdentifier;
12
+ versionId: string;
13
+ sourceRevision: string;
14
+ mode: 'observe' | 'enforce';
15
+ gatewayBaseUrl: string;
16
+ gatewayKeySecretRef: string;
17
+ modelAliases: {
18
+ generation?: AiRuntimeModelAlias;
19
+ embeddings?: AiRuntimeModelAlias;
20
+ };
21
+ policyDigest: AiRuntimeDigest;
22
+ /**
23
+ * @minItems 1
24
+ * @maxItems 2
25
+ */
26
+ requiredStrategies: ['deployment_injection' | 'deterministic_adapter'] | ['deployment_injection' | 'deterministic_adapter', 'deployment_injection' | 'deterministic_adapter'];
27
+ }
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Value-free asynchronous AI Gateway trace metadata. Raw prompts and responses never enter the queue; captured content is referenced only after successful encrypted storage.
3
+ */
4
+ export type AiTraceEvent = {
5
+ schema: 'harbour.ai-trace-event/1.0';
6
+ traceId: string;
7
+ requestId: string;
8
+ tenantId: AiTraceIdentifier;
9
+ appId: AiTraceIdentifier;
10
+ environment: AiTraceIdentifier;
11
+ versionId: string;
12
+ callsiteFingerprint?: AiTraceDigest;
13
+ policyDigest: AiTraceDigest;
14
+ routeRevision?: string;
15
+ requestedModel?: string;
16
+ governedModelAlias?: string;
17
+ provider?: 'openai' | 'anthropic' | 'gemini' | 'openrouter';
18
+ providerModel?: string;
19
+ outcome: 'succeeded' | 'blocked' | 'failed' | 'cancelled';
20
+ usage?: AiTraceUsage;
21
+ priceRevision?: AiTraceIdentifier;
22
+ costMicroUsd: number;
23
+ latencyMs: number;
24
+ retryCount: number;
25
+ fallbackUsed: boolean;
26
+ reservationId?: string;
27
+ /**
28
+ * @minItems 0
29
+ * @maxItems 32
30
+ */
31
+ attempts: AiTraceAttempt[];
32
+ /**
33
+ * @maxItems 128
34
+ */
35
+ guardrailResults: AiTraceGuardrailResult[];
36
+ contentCaptureStatus: 'off' | 'captured' | 'capture_failed';
37
+ contentRef?: string;
38
+ retentionExpiresAt?: string;
39
+ occurredAt: string;
40
+ };
41
+ export type AiTraceIdentifier = string;
42
+ export type AiTraceDigest = string;
43
+ export type AiTraceAttempt = {
44
+ attempt: number;
45
+ provider: 'openai' | 'anthropic' | 'gemini' | 'openrouter';
46
+ providerModel: string;
47
+ priceRevision: AiTraceIdentifier;
48
+ outcome: 'succeeded' | 'failed' | 'timed_out' | 'cancelled';
49
+ /**
50
+ * Provider-reported token usage, or null when the attempt did not succeed and the provider reported none. Null states that usage is UNKNOWN — estimates are never fabricated. A succeeded attempt always reports real usage.
51
+ */
52
+ usage: AiTraceUsage | null;
53
+ costMicroUsd: number;
54
+ latencyMs: number;
55
+ errorCode?: string;
56
+ };
57
+ export interface AiTraceUsage {
58
+ inputTokens: number;
59
+ outputTokens: number;
60
+ }
61
+ export interface AiTraceGuardrailResult {
62
+ ruleId: string;
63
+ detectorId: string;
64
+ detectorVersion: string;
65
+ phase: 'input' | 'output';
66
+ action: 'ALLOW' | 'OBSERVE' | 'REDACT' | 'BLOCK';
67
+ result: 'passed' | 'matched' | 'blocked' | 'redacted';
68
+ }