@lucern/sdk 0.2.0-alpha.9 → 0.3.0-alpha.1
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 +33 -15
- package/dist/adminClient.d.ts +15 -9
- package/dist/adminClient.js.map +1 -1
- package/dist/audience/index.d.ts +38 -0
- package/dist/audience/index.js +110 -0
- package/dist/audience/index.js.map +1 -0
- package/dist/beliefs/index.d.ts +463 -0
- package/dist/beliefs/index.js +6695 -0
- package/dist/beliefs/index.js.map +1 -0
- package/dist/beliefs/lifecycle.d.ts +24 -0
- package/dist/beliefs/lifecycle.js +98 -0
- package/dist/beliefs/lifecycle.js.map +1 -0
- package/dist/beliefsClient.d.ts +76 -12
- package/dist/beliefsClient.js +139 -7
- package/dist/beliefsClient.js.map +1 -1
- package/dist/client-B6aWUUwp.d.ts +2552 -0
- package/dist/client.d.ts +31 -2377
- package/dist/client.js +802 -263
- package/dist/client.js.map +1 -1
- package/dist/contracts/api-enums.contract.d.ts +1 -1
- package/dist/contracts/api-enums.contract.js +8 -2
- package/dist/contracts/api-enums.contract.js.map +1 -1
- package/dist/contracts/index.d.ts +4 -2
- package/dist/contracts/index.js +119 -4283
- package/dist/contracts/index.js.map +1 -1
- package/dist/contracts/mcpTools.d.ts +2 -1
- package/dist/contracts/mcpTools.js +22 -2981
- package/dist/contracts/mcpTools.js.map +1 -1
- package/dist/contracts/sdk-tools.contract.d.ts +1 -2
- package/dist/contracts/sdk-tools.contract.js +1 -4132
- package/dist/contracts/sdk-tools.contract.js.map +1 -1
- package/dist/contracts/sdkTools.d.ts +1 -2
- package/dist/contracts/sdkTools.js +20 -4127
- package/dist/contracts/sdkTools.js.map +1 -1
- package/dist/contracts/tool-contracts.d.ts +1 -0
- package/dist/contracts/tool-contracts.js +3 -0
- package/dist/contracts/tool-contracts.js.map +1 -0
- package/dist/contracts/workflow-runtime.contract.js +1 -1
- package/dist/contracts/workflow-runtime.contract.js.map +1 -1
- package/dist/contracts/workflowRuntime.js +1 -1
- package/dist/contracts/workflowRuntime.js.map +1 -1
- package/dist/contradictions/index.d.ts +156 -0
- package/dist/contradictions/index.js +6689 -0
- package/dist/contradictions/index.js.map +1 -0
- package/dist/customTools.d.ts +1 -1
- package/dist/decisions/index.d.ts +66 -0
- package/dist/decisions/index.js +6691 -0
- package/dist/decisions/index.js.map +1 -0
- package/dist/edges/index.d.ts +202 -0
- package/dist/edges/index.js +6690 -0
- package/dist/edges/index.js.map +1 -0
- package/dist/events.js +7 -5
- package/dist/events.js.map +1 -1
- package/dist/evidence/index.d.ts +294 -0
- package/dist/evidence/index.js +6690 -0
- package/dist/evidence/index.js.map +1 -0
- package/dist/evidenceClient.d.ts +119 -0
- package/dist/evidenceClient.js +350 -0
- package/dist/evidenceClient.js.map +1 -0
- package/dist/gatewayFacades.d.ts +25 -15
- package/dist/gatewayFacades.js +39 -5
- package/dist/gatewayFacades.js.map +1 -1
- package/dist/identityClient.d.ts +3 -3
- package/dist/identityClient.js.map +1 -1
- package/dist/index.d.ts +7 -6
- package/dist/index.js +1145 -3313
- package/dist/index.js.map +1 -1
- package/dist/lenses/index.d.ts +194 -0
- package/dist/lenses/index.js +6689 -0
- package/dist/lenses/index.js.map +1 -0
- package/dist/nodes/index.d.ts +61 -0
- package/dist/nodes/index.js +6691 -0
- package/dist/nodes/index.js.map +1 -0
- package/dist/ontologies/index.d.ts +179 -0
- package/dist/ontologies/index.js +6692 -0
- package/dist/ontologies/index.js.map +1 -0
- package/dist/opinion.d.ts +11 -0
- package/dist/opinion.js +35 -0
- package/dist/opinion.js.map +1 -0
- package/dist/questions/index.d.ts +295 -0
- package/dist/questions/index.js +6692 -0
- package/dist/questions/index.js.map +1 -0
- package/dist/sdk-tools.contract-B4c1Zr1o.d.ts +22 -0
- package/dist/sourcesClient.d.ts +24 -0
- package/dist/{mcpParityClient.js → sourcesClient.js} +15 -192
- package/dist/sourcesClient.js.map +1 -0
- package/dist/tool-contracts-BUiL9P6z.d.ts +22 -0
- package/dist/topics/index.d.ts +66 -0
- package/dist/topics/index.js +6690 -0
- package/dist/topics/index.js.map +1 -0
- package/dist/types.d.ts +27 -8
- package/dist/workflowClient.d.ts +18 -5
- package/dist/workflowClient.js +19 -7
- package/dist/workflowClient.js.map +1 -1
- package/dist/worktrees/index.d.ts +211 -0
- package/dist/worktrees/index.js +6692 -0
- package/dist/worktrees/index.js.map +1 -0
- package/package.json +56 -3
- package/dist/contracts/mcp-tools.contract.d.ts +0 -1
- package/dist/contracts/mcp-tools.contract.js +0 -2986
- package/dist/contracts/mcp-tools.contract.js.map +0 -1
- package/dist/mcpParityClient.d.ts +0 -74
- package/dist/mcpParityClient.js.map +0 -1
- package/dist/mcpParitySurface.d.ts +0 -12
- package/dist/mcpParitySurface.js +0 -65
- package/dist/mcpParitySurface.js.map +0 -1
- package/dist/mcpTools-DPZxowDX.d.ts +0 -254
- package/dist/sdkTools-CwXJDACb.d.ts +0 -150
package/README.md
CHANGED
|
@@ -27,6 +27,7 @@ IA-7 closes the remaining SDK surface gaps needed for SDK-first clients:
|
|
|
27
27
|
```typescript
|
|
28
28
|
import {
|
|
29
29
|
createLucernClient,
|
|
30
|
+
opinionFromDogmatic,
|
|
30
31
|
type PlatformBeliefRecord,
|
|
31
32
|
type SdkPrincipalContext,
|
|
32
33
|
type WorkflowWorktreeRecord,
|
|
@@ -90,9 +91,17 @@ const sqlFact = await lucern.beliefs.create({
|
|
|
90
91
|
canonicalText: "Parameterized queries prevent SQL injection in all major database drivers",
|
|
91
92
|
beliefType: "fact",
|
|
92
93
|
});
|
|
94
|
+
const sqlFactEvidence = await lucern.evidence.create({
|
|
95
|
+
topicId,
|
|
96
|
+
text: "OWASP SQL Injection Prevention guidance identifies parameterized queries as the primary defense.",
|
|
97
|
+
sourceUrl: "https://owasp.org/www-community/attacks/SQL_Injection",
|
|
98
|
+
targetId: sqlFact.data.nodeId,
|
|
99
|
+
weight: 1,
|
|
100
|
+
});
|
|
93
101
|
await lucern.beliefs.modulateConfidence(sqlFact.data.nodeId, {
|
|
94
|
-
|
|
102
|
+
opinion: opinionFromDogmatic(0.95, 0.5),
|
|
95
103
|
trigger: "evidence_added",
|
|
104
|
+
triggeringEvidenceId: sqlFactEvidence.data.nodeId,
|
|
96
105
|
rationale: "OWASP verified, industry standard for 20+ years",
|
|
97
106
|
});
|
|
98
107
|
|
|
@@ -101,9 +110,17 @@ const patternBelief = await lucern.beliefs.create({
|
|
|
101
110
|
topicId,
|
|
102
111
|
canonicalText: "Most security vulnerabilities in our codebase come from unvalidated user input at API boundaries, not from cryptographic weaknesses",
|
|
103
112
|
});
|
|
113
|
+
const patternEvidence = await lucern.evidence.create({
|
|
114
|
+
topicId,
|
|
115
|
+
text: "Last 6 months of security audits found 14 input validation issues and 1 cryptographic issue.",
|
|
116
|
+
sourceUrl: "audit://security/findings-last-6-months",
|
|
117
|
+
targetId: patternBelief.data.nodeId,
|
|
118
|
+
weight: 0.82,
|
|
119
|
+
});
|
|
104
120
|
await lucern.beliefs.modulateConfidence(patternBelief.data.nodeId, {
|
|
105
|
-
|
|
121
|
+
opinion: opinionFromDogmatic(0.82, 0.5),
|
|
106
122
|
trigger: "evidence_added",
|
|
123
|
+
triggeringEvidenceId: patternEvidence.data.nodeId,
|
|
107
124
|
rationale: "Last 6 months of security audits: 14 input validation issues, 1 crypto issue",
|
|
108
125
|
});
|
|
109
126
|
|
|
@@ -113,11 +130,8 @@ const hypothesis = await lucern.beliefs.create({
|
|
|
113
130
|
canonicalText: "Automated static analysis catches fewer than 30% of the input validation vulnerabilities that human reviewers find",
|
|
114
131
|
beliefType: "hypothesis",
|
|
115
132
|
});
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
trigger: "manual",
|
|
119
|
-
rationale: "Anecdotal — need to run a proper comparison study",
|
|
120
|
-
});
|
|
133
|
+
// This remains at the default vacuous prior until evidence or an answered
|
|
134
|
+
// question records what the comparison study found.
|
|
121
135
|
|
|
122
136
|
// An assumption — untested but used as a basis for decisions
|
|
123
137
|
const assumption = await lucern.beliefs.create({
|
|
@@ -198,7 +212,7 @@ Your agent processes the results and commits evidence to the graph.
|
|
|
198
212
|
|
|
199
213
|
```typescript
|
|
200
214
|
// Static analysis results
|
|
201
|
-
await lucern.evidence.create({
|
|
215
|
+
const staticEvidence = await lucern.evidence.create({
|
|
202
216
|
topicId,
|
|
203
217
|
text: "Semgrep + CodeQL found 23 issues across 50 PRs. 18 were true positives. Categories: 12 input validation, 4 auth bypass patterns, 2 information disclosure.",
|
|
204
218
|
sourceUrl: "ci://semgrep-run/batch-50pr-comparison",
|
|
@@ -207,7 +221,7 @@ await lucern.evidence.create({
|
|
|
207
221
|
});
|
|
208
222
|
|
|
209
223
|
// Human review results
|
|
210
|
-
await lucern.evidence.create({
|
|
224
|
+
const humanEvidence = await lucern.evidence.create({
|
|
211
225
|
topicId,
|
|
212
226
|
text: "Two senior engineers found 41 issues across the same 50 PRs (34 unique after dedup). Categories: 22 input validation, 7 business logic flaws, 3 auth, 2 race conditions.",
|
|
213
227
|
sourceUrl: "review://manual-audit/batch-50pr",
|
|
@@ -223,7 +237,7 @@ const comparisonQuestion = await lucern.questions.create({
|
|
|
223
237
|
linkedBeliefId: hypothesis.data.nodeId,
|
|
224
238
|
});
|
|
225
239
|
|
|
226
|
-
await lucern.questions.answer(comparisonQuestion.data.questionId, {
|
|
240
|
+
const comparisonAnswer = await lucern.questions.answer(comparisonQuestion.data.questionId, {
|
|
227
241
|
text: "Static analysis caught 18 of 34 unique issues (53%). However, it missed all 7 business logic flaws and both race conditions — categories where it found 0%.",
|
|
228
242
|
confidence: "strong",
|
|
229
243
|
evidenceIds: [staticEvidence.data.nodeId, humanEvidence.data.nodeId],
|
|
@@ -237,8 +251,9 @@ The original hypothesis said "less than 30%." The data shows 53% — but the sto
|
|
|
237
251
|
```typescript
|
|
238
252
|
// Drop confidence on the original (it was too pessimistic about overall catch rate)
|
|
239
253
|
await lucern.beliefs.modulateConfidence(hypothesis.data.nodeId, {
|
|
240
|
-
|
|
254
|
+
opinion: opinionFromDogmatic(0.2, 0.5),
|
|
241
255
|
trigger: "evidence_added",
|
|
256
|
+
triggeringEvidenceId: humanEvidence.data.nodeId,
|
|
242
257
|
rationale: "Static analysis catches 53% overall, not <30%. But the category breakdown reveals something more important.",
|
|
243
258
|
});
|
|
244
259
|
|
|
@@ -249,8 +264,10 @@ const evolved = await lucern.beliefs.fork(hypothesis.data.nodeId, {
|
|
|
249
264
|
});
|
|
250
265
|
|
|
251
266
|
await lucern.beliefs.modulateConfidence(evolved.data.nodeId, {
|
|
252
|
-
|
|
267
|
+
opinion: opinionFromDogmatic(0.88, 0.5),
|
|
253
268
|
trigger: "evidence_added",
|
|
269
|
+
triggeringEvidenceId: humanEvidence.data.nodeId,
|
|
270
|
+
triggeringAnswerId: comparisonAnswer.data.answerId,
|
|
254
271
|
rationale: "Direct comparison data: 0/7 business logic flaws caught, 0/2 race conditions caught, while input validation catch rate was 12/22 (55%)",
|
|
255
272
|
});
|
|
256
273
|
|
|
@@ -262,8 +279,9 @@ const actionable = await lucern.beliefs.create({
|
|
|
262
279
|
});
|
|
263
280
|
|
|
264
281
|
await lucern.beliefs.modulateConfidence(actionable.data.nodeId, {
|
|
265
|
-
|
|
282
|
+
opinion: opinionFromDogmatic(0.85, 0.5),
|
|
266
283
|
trigger: "worktree_outcome",
|
|
284
|
+
triggeringWorktreeId: investigation.data.worktreeId,
|
|
267
285
|
rationale: "Direct implication of the comparison study findings",
|
|
268
286
|
});
|
|
269
287
|
|
|
@@ -700,8 +718,8 @@ history.data.forEach(entry => {
|
|
|
700
718
|
});
|
|
701
719
|
|
|
702
720
|
// Example output:
|
|
703
|
-
// 2026-04-10T14:00:00Z null -> 0.
|
|
704
|
-
// 2026-04-11T09:30:00Z 0.
|
|
721
|
+
// 2026-04-10T14:00:00Z null -> 0.50 [initial] Vacuous neutral prior
|
|
722
|
+
// 2026-04-11T09:30:00Z 0.50 -> 0.75 [evidence_added] Semgrep data supports
|
|
705
723
|
// 2026-04-11T16:00:00Z 0.75 -> 0.20 [evidence_added] Comparison study contradicted
|
|
706
724
|
```
|
|
707
725
|
|
package/dist/adminClient.d.ts
CHANGED
|
@@ -130,7 +130,7 @@ declare function createAdminClient(config?: AdminClientConfig): {
|
|
|
130
130
|
* List tenants visible to the current principal.
|
|
131
131
|
*/
|
|
132
132
|
listTenants(query?: {
|
|
133
|
-
status?: "active" | "disabled" | "archived";
|
|
133
|
+
status?: "provisioning" | "active" | "disabled" | "suspended" | "archived";
|
|
134
134
|
limit?: number;
|
|
135
135
|
}): Promise<PlatformGatewaySuccess<ListResult<any, "tenants">>>;
|
|
136
136
|
/**
|
|
@@ -140,7 +140,12 @@ declare function createAdminClient(config?: AdminClientConfig): {
|
|
|
140
140
|
key: string;
|
|
141
141
|
slug?: string;
|
|
142
142
|
name: string;
|
|
143
|
-
|
|
143
|
+
tier?: "free" | "developer" | "team" | "enterprise";
|
|
144
|
+
status?: "provisioning" | "active" | "disabled" | "suspended" | "archived";
|
|
145
|
+
ownerClerkId?: string;
|
|
146
|
+
ownerEmail?: string;
|
|
147
|
+
lucernDeploymentUrl?: string;
|
|
148
|
+
appDeploymentUrl?: string;
|
|
144
149
|
metadata?: JsonObject;
|
|
145
150
|
}, idempotencyKey?: string): Promise<PlatformGatewaySuccess<unknown>>;
|
|
146
151
|
/**
|
|
@@ -176,7 +181,8 @@ declare function createAdminClient(config?: AdminClientConfig): {
|
|
|
176
181
|
*/
|
|
177
182
|
listMemberships(query?: GatewayScope & {
|
|
178
183
|
principalId?: string;
|
|
179
|
-
status?: "active" | "revoked" | "expired";
|
|
184
|
+
status?: "active" | "invited" | "revoked" | "expired";
|
|
185
|
+
role?: "platform_admin" | "tenant_admin" | "workspace_admin" | "editor" | "viewer" | "auditor" | "service_agent";
|
|
180
186
|
limit?: number;
|
|
181
187
|
}): Promise<PlatformGatewaySuccess<ListResult<any, "memberships">>>;
|
|
182
188
|
/**
|
|
@@ -186,8 +192,8 @@ declare function createAdminClient(config?: AdminClientConfig): {
|
|
|
186
192
|
membershipId?: string;
|
|
187
193
|
principalId: string;
|
|
188
194
|
role: "platform_admin" | "tenant_admin" | "workspace_admin" | "editor" | "viewer" | "auditor" | "service_agent";
|
|
189
|
-
status?: "active" | "revoked" | "expired";
|
|
190
|
-
source?: "bootstrap" | "manual" | "sync" | "invitation";
|
|
195
|
+
status?: "active" | "invited" | "revoked" | "expired";
|
|
196
|
+
source?: "bootstrap" | "manual" | "sync" | "sso" | "api" | "scim" | "invitation";
|
|
191
197
|
}, idempotencyKey?: string): Promise<PlatformGatewaySuccess<unknown>>;
|
|
192
198
|
/**
|
|
193
199
|
* Update a membership.
|
|
@@ -196,8 +202,8 @@ declare function createAdminClient(config?: AdminClientConfig): {
|
|
|
196
202
|
membershipId?: string;
|
|
197
203
|
principalId: string;
|
|
198
204
|
role: "platform_admin" | "tenant_admin" | "workspace_admin" | "editor" | "viewer" | "auditor" | "service_agent";
|
|
199
|
-
status?: "active" | "revoked" | "expired";
|
|
200
|
-
source?: "bootstrap" | "manual" | "sync" | "invitation";
|
|
205
|
+
status?: "active" | "invited" | "revoked" | "expired";
|
|
206
|
+
source?: "bootstrap" | "manual" | "sync" | "sso" | "api" | "scim" | "invitation";
|
|
201
207
|
}, idempotencyKey?: string): Promise<PlatformGatewaySuccess<unknown>>;
|
|
202
208
|
/**
|
|
203
209
|
* @deprecated Use createMembership or updateMembership.
|
|
@@ -206,8 +212,8 @@ declare function createAdminClient(config?: AdminClientConfig): {
|
|
|
206
212
|
membershipId?: string;
|
|
207
213
|
principalId: string;
|
|
208
214
|
role: "platform_admin" | "tenant_admin" | "workspace_admin" | "editor" | "viewer" | "auditor" | "service_agent";
|
|
209
|
-
status?: "active" | "revoked" | "expired";
|
|
210
|
-
source?: "bootstrap" | "manual" | "sync" | "invitation";
|
|
215
|
+
status?: "active" | "invited" | "revoked" | "expired";
|
|
216
|
+
source?: "bootstrap" | "manual" | "sync" | "sso" | "api" | "scim" | "invitation";
|
|
211
217
|
}, idempotencyKey?: string): Promise<PlatformGatewaySuccess<unknown>>;
|
|
212
218
|
/**
|
|
213
219
|
* List tenant API keys in the current admin scope.
|
package/dist/adminClient.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/coreClient.ts","../src/sdkSurface.ts","../src/adminClient.ts"],"names":[],"mappings":"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","file":"adminClient.js","sourcesContent":["import type { JsonObject, JsonValue } from \"./types\";\n\n/** Tenant and workspace identifiers used to scope gateway requests. */\nexport type GatewayScope = {\n tenantId?: string;\n workspaceId?: string;\n};\n\n/** Successful response envelope from the platform gateway with correlation metadata. */\nexport type PlatformGatewaySuccess<T> = {\n success: true;\n data: T;\n correlationId: string;\n policyTraceId: string | null;\n idempotentReplay: boolean;\n};\n\n/** Failed response envelope with structured error codes and optional invariant references. */\nexport type PlatformGatewayFailure = {\n success: false;\n /**\n * Error string is the canonical envelope field.\n * Object form is legacy-only compatibility for older gateway responses.\n */\n error:\n | string\n | {\n code: string;\n message: string;\n details?: JsonValue;\n };\n code?: string;\n invariant?: string | null;\n suggestion?: string | null;\n details?: JsonValue;\n legacyError?: {\n code: string;\n message: string;\n details?: JsonValue;\n };\n correlationId: string;\n policyTraceId: string | null;\n};\n\n/** Discriminated union of success and failure gateway responses. */\nexport type PlatformGatewayEnvelope<T> =\n | PlatformGatewaySuccess<T>\n | PlatformGatewayFailure;\n\n/**\n * Structured error thrown when a platform API request fails.\n *\n * Includes HTTP status, machine-readable error code, optional invariant\n * reference, and actionable suggestions for common failure modes.\n */\nexport class LucernApiError extends Error {\n public readonly code: string;\n public readonly status: number;\n public readonly invariant?: string | null;\n public readonly suggestion?: string | null;\n public readonly details?: JsonValue;\n public readonly requestId?: string;\n public readonly correlationId?: string;\n public readonly policyTraceId?: string | null;\n\n constructor(args: {\n code: string;\n message: string;\n status: number;\n invariant?: string | null;\n suggestion?: string | null;\n details?: JsonValue;\n requestId?: string;\n correlationId?: string;\n policyTraceId?: string | null;\n }) {\n super(args.message);\n this.name = \"LucernApiError\";\n this.code = args.code;\n this.status = args.status;\n this.invariant = args.invariant;\n this.suggestion = args.suggestion;\n this.details = args.details;\n this.requestId = args.requestId;\n this.correlationId = args.correlationId;\n this.policyTraceId = args.policyTraceId;\n }\n}\n\n/** Supported HTTP methods for gateway requests. */\nexport type GatewayHttpMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n\ntype FetchLike = (\n input: RequestInfo | URL,\n init?: RequestInit\n) => Promise<Response>;\n\n/** Context passed to the `onRequest` hook before each gateway request attempt. */\nexport type GatewayRequestHookContext = {\n requestId: string;\n attempt: number;\n maxRetries: number;\n method: GatewayHttpMethod;\n path: string;\n url: string;\n headers: Headers;\n body?: string;\n timeoutMs: number;\n};\n\n/** Context passed to the `onResponse` hook after each gateway request attempt (including retries and failures). */\nexport type GatewayResponseHookContext = GatewayRequestHookContext & {\n durationMs: number;\n status?: number;\n response?: Response;\n error?: unknown;\n correlationId?: string;\n policyTraceId?: string | null;\n idempotentReplay?: boolean;\n retryAfterMs?: number | null;\n willRetry: boolean;\n};\n\n/**\n * Low-level transport configuration for the platform gateway client.\n *\n * Most developers should use {@link createLucernClient} instead, which wraps\n * this config with higher-level conveniences like `apiKey` and `environment`.\n */\nexport type GatewayClientConfig = {\n baseUrl?: string;\n fetchImpl?: FetchLike;\n getAuthHeaders?:\n | (() => Promise<Record<string, string>>)\n | (() => Record<string, string>);\n /** Max retries for transient errors (5xx, network). Defaults to 2. */\n maxRetries?: number;\n /** Request timeout in ms. Defaults to 15000. */\n timeoutMs?: number;\n /** Optional timeout overrides by HTTP method. */\n timeoutMsByMethod?: Partial<Record<GatewayHttpMethod, number>>;\n /** Optional request ID factory used for correlation headers. */\n requestIdFactory?: () => string;\n /** Invoked before each request attempt, including retries. */\n onRequest?:\n | ((context: GatewayRequestHookContext) => void)\n | ((context: GatewayRequestHookContext) => Promise<void>);\n /** Invoked after each request attempt, including retries and failures. */\n onResponse?:\n | ((context: GatewayResponseHookContext) => void)\n | ((context: GatewayResponseHookContext) => Promise<void>);\n};\n\n/**\n * Serialize a gateway query object into a URL query string.\n */\nexport function toQueryString(\n scope: GatewayScope & Record<string, string | number | boolean | undefined>\n): string {\n const params = new URLSearchParams();\n if (scope.tenantId) {\n params.set(\"tenantId\", scope.tenantId);\n }\n if (scope.workspaceId) {\n params.set(\"workspaceId\", scope.workspaceId);\n }\n for (const [key, value] of Object.entries(scope)) {\n if (key === \"tenantId\" || key === \"workspaceId\") {\n continue;\n }\n if (value === undefined) {\n continue;\n }\n params.set(key, String(value));\n }\n const serialized = params.toString();\n return serialized.length > 0 ? `?${serialized}` : \"\";\n}\n\nfunction fillRandomBytes(length: number): Uint8Array {\n const bytes = new Uint8Array(length);\n if (typeof globalThis.crypto?.getRandomValues === \"function\") {\n globalThis.crypto.getRandomValues(bytes);\n return bytes;\n }\n\n for (let index = 0; index < length; index += 1) {\n bytes[index] = Math.floor(Math.random() * 256);\n }\n return bytes;\n}\n\nfunction generatePortableRequestId(): string {\n if (typeof globalThis.crypto?.randomUUID === \"function\") {\n return globalThis.crypto.randomUUID();\n }\n\n const bytes = fillRandomBytes(16);\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = Array.from(bytes, (value) => value.toString(16).padStart(2, \"0\"));\n return `${hex.slice(0, 4).join(\"\")}-${hex.slice(4, 6).join(\"\")}-${hex.slice(\n 6,\n 8\n ).join(\"\")}-${hex.slice(8, 10).join(\"\")}-${hex.slice(10).join(\"\")}`;\n}\n\n/**\n * Generate a random idempotency key for retry-safe writes.\n */\nexport function randomIdempotencyKey(): string {\n return generatePortableRequestId();\n}\n\nfunction isRetryableStatus(status: number): boolean {\n return status >= 500 || status === 408 || status === 429;\n}\n\nfunction fallbackErrorCode(status: number): string {\n if (status === 401) {\n return \"AUTHENTICATION_REQUIRED\";\n }\n if (status === 403) {\n return \"FORBIDDEN\";\n }\n if (status === 404) {\n return \"NOT_FOUND\";\n }\n if (status === 408) {\n return \"UPSTREAM_ERROR\";\n }\n if (status === 409) {\n return \"CONFLICT\";\n }\n if (status === 429) {\n return \"RATE_LIMIT_EXCEEDED\";\n }\n if (status >= 500) {\n return \"UPSTREAM_ERROR\";\n }\n return \"INTERNAL_ERROR\";\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction parseRetryAfterMs(value: string | null): number | null {\n if (!value) {\n return null;\n }\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n const numeric = Number(trimmed);\n if (Number.isFinite(numeric)) {\n return Math.max(0, Math.round(numeric * 1000));\n }\n const parsedDate = Date.parse(trimmed);\n if (Number.isFinite(parsedDate)) {\n return Math.max(0, parsedDate - Date.now());\n }\n return null;\n}\n\nfunction computeRetryDelayMs(args: {\n attempt: number;\n status?: number;\n retryAfterMs?: number | null;\n}): number {\n const baseDelay =\n args.status === 429\n ? Math.max(\n args.retryAfterMs ?? 0,\n Math.min(1000 * 2 ** args.attempt, 10_000)\n )\n : Math.min(1000 * 2 ** args.attempt, 4000);\n\n if (args.status !== 429) {\n return baseDelay;\n }\n\n const jitterWindow = Math.max(250, Math.round(baseDelay * 0.25));\n return baseDelay + Math.round(Math.random() * jitterWindow);\n}\n\nfunction timeoutError(timeoutMs: number): Error {\n const error = new Error(`Request timed out after ${timeoutMs}ms`);\n error.name = \"AbortError\";\n return error;\n}\n\nfunction readPolicySummaryFromDetails(details?: JsonValue): string | null {\n if (!details || typeof details !== \"object\" || Array.isArray(details)) {\n return null;\n }\n\n const directSummary = (details as { summary?: JsonValue }).summary;\n if (typeof directSummary === \"string\" && directSummary.trim().length > 0) {\n return directSummary.trim();\n }\n\n const policy = (details as { policy?: JsonValue }).policy;\n if (!policy || typeof policy !== \"object\" || Array.isArray(policy)) {\n return null;\n }\n\n const explanation = (policy as { explanation?: JsonValue }).explanation;\n if (!explanation || typeof explanation !== \"object\" || Array.isArray(explanation)) {\n return null;\n }\n\n const nestedSummary = (explanation as { summary?: JsonValue }).summary;\n if (typeof nestedSummary === \"string\" && nestedSummary.trim().length > 0) {\n return nestedSummary.trim();\n }\n\n return null;\n}\n\n/**\n * Create the transport client used by all SDK modules.\n */\nexport function createGatewayRequestClient(config: GatewayClientConfig = {}) {\n const fetchImpl = config.fetchImpl ?? fetch;\n const baseUrl = config.baseUrl?.replace(/\\/+$/, \"\") ?? \"\";\n const maxRetries = config.maxRetries ?? 2;\n const requestIdFactory = config.requestIdFactory ?? (() => generatePortableRequestId());\n\n async function resolveAuthHeaders(): Promise<Record<string, string>> {\n if (!config.getAuthHeaders) {\n return {};\n }\n return await config.getAuthHeaders();\n }\n\n async function fetchWithTimeout(\n url: string,\n init: RequestInit,\n timeoutMs: number\n ): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetchImpl(url, { ...init, signal: controller.signal });\n } catch (error) {\n if (controller.signal.aborted) {\n throw timeoutError(timeoutMs);\n }\n throw error;\n } finally {\n clearTimeout(timer);\n }\n }\n\n async function parsePayload<T>(\n response: Response\n ): Promise<PlatformGatewayEnvelope<T> | null> {\n const text = await response.text();\n if (!text) {\n return null;\n }\n try {\n return JSON.parse(text) as PlatformGatewayEnvelope<T>;\n } catch {\n return null;\n }\n }\n\n function resolveTimeoutMs(\n method: GatewayHttpMethod,\n requestTimeoutMs?: number\n ): number {\n if (typeof requestTimeoutMs === \"number\") {\n return requestTimeoutMs;\n }\n const methodTimeoutMs = config.timeoutMsByMethod?.[method];\n if (typeof methodTimeoutMs === \"number\") {\n return methodTimeoutMs;\n }\n return config.timeoutMs ?? 15_000;\n }\n\n function buildApiError(args: {\n requestId: string;\n response: Response;\n failure?: PlatformGatewayFailure | null;\n }): LucernApiError {\n const failure = args.failure;\n const legacyError =\n failure && typeof failure.error === \"object\" && failure.error !== null\n ? failure.error\n : failure?.legacyError;\n const correlationId =\n failure?.correlationId ??\n args.response.headers.get(\"x-lucern-correlation-id\")?.trim() ??\n args.requestId;\n const policyTraceId =\n failure?.policyTraceId ??\n args.response.headers.get(\"x-lucern-policy-trace-id\")?.trim() ??\n null;\n const details = failure?.details ?? legacyError?.details;\n const policySummary = readPolicySummaryFromDetails(details);\n\n return new LucernApiError({\n code: failure?.code ?? legacyError?.code ?? fallbackErrorCode(args.response.status),\n message:\n policySummary ??\n (typeof failure?.error === \"string\"\n ? failure.error\n : legacyError?.message ??\n (args.response.ok\n ? \"Platform API returned an invalid success payload.\"\n : \"Platform API request failed.\")),\n status: args.response.status,\n invariant: failure?.invariant,\n suggestion: failure?.suggestion,\n details,\n requestId: args.requestId,\n correlationId,\n policyTraceId,\n });\n }\n\n async function request<T>(args: {\n path: string;\n method?: GatewayHttpMethod;\n body?: JsonObject;\n idempotencyKey?: string;\n requestId?: string;\n timeoutMs?: number;\n }): Promise<PlatformGatewaySuccess<T>> {\n const authHeaders = await resolveAuthHeaders();\n const method = args.method ?? \"GET\";\n const timeoutMs = resolveTimeoutMs(method, args.timeoutMs);\n const headers = new Headers({\n \"content-type\": \"application/json\",\n ...authHeaders,\n });\n if (args.idempotencyKey) {\n headers.set(\"idempotency-key\", args.idempotencyKey);\n }\n const requestId =\n headers.get(\"x-correlation-id\")?.trim() ||\n headers.get(\"x-request-id\")?.trim() ||\n args.requestId ||\n requestIdFactory();\n if (!headers.has(\"x-correlation-id\") && !headers.has(\"x-request-id\")) {\n headers.set(\"x-correlation-id\", requestId);\n }\n\n const url = `${baseUrl}${args.path}`;\n const serializedBody = args.body ? JSON.stringify(args.body) : undefined;\n const init: RequestInit = {\n method,\n headers,\n body: serializedBody,\n };\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const hookRequestContext: GatewayRequestHookContext = {\n requestId,\n attempt,\n maxRetries,\n method,\n path: args.path,\n url,\n headers: new Headers(headers),\n body: serializedBody,\n timeoutMs,\n };\n await config.onRequest?.(hookRequestContext);\n const startedAt = Date.now();\n try {\n const response = await fetchWithTimeout(url, init, timeoutMs);\n const responseClone = response.clone();\n const payload = await parsePayload<T>(response);\n const retryAfterMs = parseRetryAfterMs(\n response.headers.get(\"Retry-After\")\n );\n\n if (!response.ok || !payload?.success) {\n const failure =\n payload && !payload.success ? (payload as PlatformGatewayFailure) : null;\n const apiError = buildApiError({\n requestId,\n response,\n failure,\n });\n const willRetry = attempt < maxRetries && isRetryableStatus(response.status);\n\n await config.onResponse?.({\n ...hookRequestContext,\n durationMs: Date.now() - startedAt,\n status: response.status,\n response: responseClone,\n error: apiError,\n correlationId: apiError.correlationId ?? requestId,\n policyTraceId: apiError.policyTraceId ?? null,\n retryAfterMs,\n willRetry,\n });\n\n if (willRetry) {\n lastError = apiError;\n await delay(\n computeRetryDelayMs({\n attempt,\n status: response.status,\n retryAfterMs,\n })\n );\n continue;\n }\n\n throw apiError;\n }\n\n const successPayload = payload as PlatformGatewaySuccess<T>;\n await config.onResponse?.({\n ...hookRequestContext,\n durationMs: Date.now() - startedAt,\n status: response.status,\n response: responseClone,\n correlationId:\n successPayload.correlationId ??\n response.headers.get(\"x-lucern-correlation-id\")?.trim() ??\n requestId,\n policyTraceId:\n successPayload.policyTraceId ??\n response.headers.get(\"x-lucern-policy-trace-id\")?.trim() ??\n null,\n idempotentReplay: successPayload.idempotentReplay,\n retryAfterMs,\n willRetry: false,\n });\n\n return successPayload;\n } catch (fetchError) {\n if (fetchError instanceof LucernApiError) {\n throw fetchError;\n }\n const willRetry = attempt < maxRetries;\n await config.onResponse?.({\n ...hookRequestContext,\n durationMs: Date.now() - startedAt,\n error: fetchError,\n correlationId: requestId,\n policyTraceId: null,\n willRetry,\n });\n lastError = fetchError;\n if (willRetry) {\n await delay(computeRetryDelayMs({ attempt }));\n }\n }\n }\n\n throw lastError instanceof Error\n ? lastError\n : new Error(\"Platform API request failed after retries.\");\n }\n\n return {\n request,\n };\n}\n","import type { PlatformGatewaySuccess } from \"./coreClient\";\nimport type { JsonObject, ListResult } from \"./types\";\n\ntype TopicScopedValue = {\n topicId?: string;\n};\n\ntype TextScopedValue = {\n text?: string;\n canonicalText?: string;\n};\n\ntype AnyRecord = Record<string, unknown>;\n\nfunction asRecord(value: unknown): AnyRecord {\n return value && typeof value === \"object\" ? (value as AnyRecord) : {};\n}\n\nfunction cleanString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? value.trim()\n : undefined;\n}\n\nfunction normalizeVerificationStatus(value: unknown): string | undefined {\n const status = cleanString(value);\n if (!status) {\n return undefined;\n }\n if (status === \"verified\") {\n return \"human_verified\";\n }\n if (status === \"rejected\") {\n return \"contradicted\";\n }\n return status;\n}\n\nfunction cloneWith<T extends AnyRecord>(value: T, patch: AnyRecord): T {\n return { ...value, ...patch } as T;\n}\n\n/**\n * Resolve the canonical topic identifier.\n */\nexport function resolveTopicId(value: TopicScopedValue): string | undefined {\n return cleanString(value.topicId);\n}\n\n/**\n * Resolve the canonical text field from text-first or legacy canonicalText-first inputs.\n */\nexport function resolveText(value: TextScopedValue): string | undefined {\n return cleanString(value.text) ?? cleanString(value.canonicalText);\n}\n\n/**\n * Attach the topicId to a record.\n */\nexport function withTopicAlias<T extends AnyRecord>(value: T): T {\n const topicId = cleanString(value.topicId) ?? undefined;\n if (!topicId) {\n return value;\n }\n return cloneWith(value, { topicId });\n}\n\n/**\n * Attach the text/canonicalText alias pair to a record.\n */\nexport function withTextAlias<T extends AnyRecord>(value: T): T {\n const text =\n cleanString(value.text) ?? cleanString(value.canonicalText) ?? undefined;\n if (!text) {\n return value;\n }\n return cloneWith(value, { text, canonicalText: text });\n}\n\n/**\n * Attach topic and text aliases to SDK node-like records.\n */\nexport function withSdkAliases<T extends AnyRecord>(value: T): T {\n return withTopicAlias(withTextAlias(value));\n}\n\n/**\n * Normalize a belief/question/evidence write payload to the canonical gateway shape.\n */\nexport function normalizeNodeWriteInput<T extends JsonObject>(value: T): T {\n const topicId = resolveTopicId(value);\n const text = resolveText(value);\n const verificationStatus = normalizeVerificationStatus(value.verificationStatus);\n const next = { ...value } as JsonObject;\n\n if (topicId) {\n next.topicId = topicId;\n }\n if (text) {\n next.text = text;\n next.canonicalText = text;\n }\n if (verificationStatus) {\n next.verificationStatus = verificationStatus;\n }\n\n return next as T;\n}\n\nexport function normalizeNodeVerificationStatus(value: unknown) {\n return normalizeVerificationStatus(value);\n}\n\n/**\n * Build a topic-aware query object.\n */\nexport function normalizeTopicQuery<T extends JsonObject>(value: T): T {\n const topicId = cleanString(value.topicId);\n if (!topicId) {\n return value;\n }\n return { ...value, topicId } as T;\n}\n\n/**\n * Extract list items from array or list-envelope payloads.\n */\nexport function asListItems<T>(data: unknown, legacyKey?: string): T[] {\n if (Array.isArray(data)) {\n return data as T[];\n }\n\n const record = asRecord(data);\n if (Array.isArray(record.items)) {\n return record.items as T[];\n }\n if (legacyKey && Array.isArray(record[legacyKey])) {\n return record[legacyKey] as T[];\n }\n\n return [];\n}\n\n/**\n * Standardize list data to { items, total } while retaining an optional legacy array key.\n */\nexport function createListResult<T, LegacyKey extends string>(\n items: T[],\n legacyKey?: LegacyKey\n): ListResult<T, LegacyKey> {\n const result = {\n items,\n total: items.length,\n } as ListResult<T, LegacyKey>;\n\n if (legacyKey) {\n (result as Record<string, unknown>)[legacyKey] = items;\n }\n\n return result;\n}\n\n/**\n * Map a gateway success envelope's data while preserving the transport metadata.\n */\nexport function mapGatewayData<T, U>(\n response: PlatformGatewaySuccess<T>,\n mapper: (data: T) => U\n): PlatformGatewaySuccess<U> {\n return {\n ...response,\n data: mapper(response.data),\n };\n}\n\n/**\n * Apply SDK aliases across all items in a list-like payload.\n */\nexport function mapAliasedList<\n TItem extends AnyRecord,\n LegacyKey extends string,\n>(\n data: unknown,\n legacyKey?: LegacyKey\n): ListResult<TItem, LegacyKey> {\n const items = asListItems<TItem>(data, legacyKey).map((item) =>\n withSdkAliases(item)\n );\n return createListResult(items, legacyKey);\n}\n","import {\n createGatewayRequestClient,\n type GatewayClientConfig,\n type GatewayScope,\n LucernApiError,\n randomIdempotencyKey,\n toQueryString,\n} from \"./coreClient\";\nimport { createListResult, mapGatewayData } from \"./sdkSurface\";\nimport type { ControlObjectOwnershipContract } from \"./controlObjectOwnership\";\nimport type { JsonObject } from \"./types\";\n\nexport { LucernApiError };\nexport type { GatewayScope, PlatformGatewaySuccess } from \"./coreClient\";\n\n/** Configuration for the admin client. */\nexport type AdminClientConfig = GatewayClientConfig;\n\nexport type TenantApiKeyRecord = {\n id?: string;\n tenantId?: string;\n workspaceId?: string;\n label?: string;\n keyPrefix?: string;\n hashedKey?: string;\n scopes?: string[];\n status?: string;\n expiresAt?: number;\n lastUsedAt?: number;\n revokedAt?: number;\n revokedBy?: string;\n createdBy?: string;\n createdAt?: number;\n updatedAt?: number;\n};\n\nexport type TenantVaultSecretRecord = {\n id?: string;\n tenantId?: string;\n workspaceId?: string;\n name?: string;\n description?: string;\n lastRotated?: number;\n createdBy?: string;\n updatedBy?: string;\n createdAt?: number;\n updatedAt?: number;\n};\n\nexport type TenantAuthPolicyMode = \"open\" | \"invite_only\" | \"sso_required\";\nexport type TenantTopicVisibility = \"private\" | \"tenant\" | \"public\";\nexport type TenantFeatureFlags = Record<string, boolean>;\nexport type TenantModelSlotOverrides = Record<string, string>;\n\nexport type TenantConfigRecord = {\n tenantId: string;\n authPolicyMode: TenantAuthPolicyMode;\n defaultSessionTTL: number;\n defaultTopicVisibility: TenantTopicVisibility;\n featureFlags: TenantFeatureFlags;\n maxWorkspaceCount: number;\n defaultModelSlotOverrides: TenantModelSlotOverrides;\n updatedAt?: number;\n updatedBy?: string;\n};\n\nexport type TenantModelRoutingSlotRecord = {\n slot: string;\n category?: string;\n description?: string;\n modelKey: string;\n promptName?: string;\n temperature?: number;\n maxTokens?: number;\n enabled?: boolean;\n};\n\nexport type TenantModelRoutingModelRecord = {\n key: string;\n name?: string;\n modelId?: string;\n provider?: string;\n enabled?: boolean;\n recommended?: boolean;\n notes?: string;\n};\n\nexport type TenantModelRoutingBindingRecord = {\n slot: string;\n providerId: string;\n secretRef: string;\n label?: string;\n keyHint?: string;\n};\n\nexport type TenantModelRouteOverrideStatus =\n | \"inherit\"\n | \"active\"\n | \"blocked_missing_model\"\n | \"blocked_missing_binding\";\n\nexport type TenantModelRouteBindingState = \"ready\" | \"missing\";\nexport type TenantModelRouteSource = \"platform_default\" | \"tenant_override\";\n\nexport type TenantModelRouteRow = {\n slot: string;\n category: string;\n description?: string;\n promptName?: string;\n slotEnabled: boolean;\n platformModelKey: string;\n platformModelName?: string;\n platformProviderId?: string;\n overrideModelKey?: string;\n overrideModelName?: string;\n overrideProviderId?: string;\n effectiveModelKey: string;\n effectiveModelName?: string;\n effectiveProviderId?: string;\n effectiveSource: TenantModelRouteSource;\n overrideStatus: TenantModelRouteOverrideStatus;\n bindingState: TenantModelRouteBindingState;\n bindingLabel?: string;\n bindingKeyHint?: string;\n bindingSecretRef?: string;\n};\n\nexport type TenantModelRoutingSummary = {\n totalSlots: number;\n promptBoundSlots: number;\n activeOverrides: number;\n blockedOverrides: number;\n readyBindings: number;\n};\n\nexport type TenantModelRoutingSnapshot = {\n tenantId: string;\n defaultModelSlotOverrides: Record<string, string>;\n slots: TenantModelRoutingSlotRecord[];\n models: TenantModelRoutingModelRecord[];\n bindings: TenantModelRoutingBindingRecord[];\n rows: TenantModelRouteRow[];\n summary: TenantModelRoutingSummary;\n notes: string[];\n};\n\nfunction asTenantApiKeyRecord(data: unknown): TenantApiKeyRecord | null {\n if (!data || typeof data !== \"object\") {\n return null;\n }\n return data as TenantApiKeyRecord;\n}\n\nfunction asTenantApiKeyArray(data: unknown): TenantApiKeyRecord[] {\n if (!Array.isArray(data)) {\n return [];\n }\n return data\n .map(asTenantApiKeyRecord)\n .filter((row): row is TenantApiKeyRecord => Boolean(row));\n}\n\nfunction asTenantVaultSecretRecord(\n data: unknown\n): TenantVaultSecretRecord | null {\n if (!data || typeof data !== \"object\") {\n return null;\n }\n return data as TenantVaultSecretRecord;\n}\n\nfunction asTenantVaultSecretArray(data: unknown): TenantVaultSecretRecord[] {\n if (!Array.isArray(data)) {\n return [];\n }\n return data\n .map(asTenantVaultSecretRecord)\n .filter((row): row is TenantVaultSecretRecord => Boolean(row));\n}\n\n/**\n * Create the admin client for tenant, workspace, and membership administration.\n * @param config - Gateway transport configuration.\n * @returns An object with methods to manage tenants, workspaces, and memberships.\n */\nexport function createAdminClient(config: AdminClientConfig = {}) {\n const gateway = createGatewayRequestClient(config);\n\n return {\n /**\n * List tenants visible to the current principal.\n */\n async listTenants(\n query: {\n status?: \"active\" | \"disabled\" | \"archived\";\n limit?: number;\n } = {}\n ) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/tenants${toQueryString(query)}`,\n }).then((response) =>\n mapGatewayData(response, (data) =>\n createListResult(\n Array.isArray(data) ? data : [],\n \"tenants\"\n )\n )\n );\n },\n\n /**\n * Create a tenant.\n */\n async createTenant(\n input: {\n key: string;\n slug?: string;\n name: string;\n status?: \"active\" | \"disabled\" | \"archived\";\n metadata?: JsonObject;\n },\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: \"/api/platform/v1/tenants\",\n method: \"POST\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * Get the control-object ownership contract.\n */\n async getControlObjectOwnership() {\n return gateway.request<ControlObjectOwnershipContract>({\n path: \"/api/platform/v1/admin/control-ownership\",\n });\n },\n\n /**\n * @deprecated Use getControlObjectOwnership.\n */\n async getControlObjectOwnershipContract() {\n return gateway.request<ControlObjectOwnershipContract>({\n path: \"/api/platform/v1/admin/control-ownership\",\n });\n },\n\n /**\n * List workspaces for the current admin scope.\n */\n async listWorkspaces(\n query: GatewayScope & {\n status?: \"active\" | \"archived\";\n limit?: number;\n } = {}\n ) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/workspaces${toQueryString(query)}`,\n }).then((response) =>\n mapGatewayData(response, (data) =>\n createListResult(\n Array.isArray(data) ? data : [],\n \"workspaces\"\n )\n )\n );\n },\n\n /**\n * Create a workspace.\n */\n async createWorkspace(\n input: GatewayScope & {\n workspaceId?: string;\n key?: string;\n slug?: string;\n name?: string;\n status?: \"active\" | \"archived\";\n defaultProjectVisibility?:\n | \"private\"\n | \"team\"\n | \"firm\"\n | \"external\"\n | \"public\";\n restore?: boolean;\n metadata?: JsonObject;\n },\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: \"/api/platform/v1/workspaces\",\n method: \"POST\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * List memberships for the current admin scope.\n */\n async listMemberships(\n query: GatewayScope & {\n principalId?: string;\n status?: \"active\" | \"revoked\" | \"expired\";\n limit?: number;\n } = {}\n ) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/memberships${toQueryString(query)}`,\n }).then((response) =>\n mapGatewayData(response, (data) =>\n createListResult(\n Array.isArray(data) ? data : [],\n \"memberships\"\n )\n )\n );\n },\n\n /**\n * Create a membership.\n */\n async createMembership(\n input: GatewayScope & {\n membershipId?: string;\n principalId: string;\n role:\n | \"platform_admin\"\n | \"tenant_admin\"\n | \"workspace_admin\"\n | \"editor\"\n | \"viewer\"\n | \"auditor\"\n | \"service_agent\";\n status?: \"active\" | \"revoked\" | \"expired\";\n source?: \"bootstrap\" | \"manual\" | \"sync\" | \"invitation\";\n },\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: \"/api/platform/v1/memberships\",\n method: \"POST\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * Update a membership.\n */\n async updateMembership(\n input: GatewayScope & {\n membershipId?: string;\n principalId: string;\n role:\n | \"platform_admin\"\n | \"tenant_admin\"\n | \"workspace_admin\"\n | \"editor\"\n | \"viewer\"\n | \"auditor\"\n | \"service_agent\";\n status?: \"active\" | \"revoked\" | \"expired\";\n source?: \"bootstrap\" | \"manual\" | \"sync\" | \"invitation\";\n },\n idempotencyKey?: string\n ) {\n return this.createMembership(input, idempotencyKey);\n },\n\n /**\n * @deprecated Use createMembership or updateMembership.\n */\n async upsertMembership(\n input: GatewayScope & {\n membershipId?: string;\n principalId: string;\n role:\n | \"platform_admin\"\n | \"tenant_admin\"\n | \"workspace_admin\"\n | \"editor\"\n | \"viewer\"\n | \"auditor\"\n | \"service_agent\";\n status?: \"active\" | \"revoked\" | \"expired\";\n source?: \"bootstrap\" | \"manual\" | \"sync\" | \"invitation\";\n },\n idempotencyKey?: string\n ) {\n return this.createMembership(input, idempotencyKey);\n },\n\n /**\n * List tenant API keys in the current admin scope.\n */\n async listTenantApiKeys(\n scope: GatewayScope & {\n status?: \"active\" | \"revoked\" | \"expired\";\n }\n ) {\n const response = await gateway.request<{ keys?: unknown[] }>({\n path: `/api/platform/v1/tenant-api-keys${toQueryString(scope)}`,\n });\n\n return {\n ...response,\n data: {\n keys: asTenantApiKeyArray(response.data?.keys),\n },\n };\n },\n\n /**\n * Create a tenant API key.\n */\n async createTenantApiKey(\n input: GatewayScope & {\n label?: string;\n scopes: string[];\n expiresAt?: number;\n },\n idempotencyKey?: string\n ) {\n const response = await gateway.request<{\n key?: unknown;\n plaintextKey?: string;\n }>({\n path: \"/api/platform/v1/tenant-api-keys\",\n method: \"POST\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n\n return {\n ...response,\n data: {\n key: asTenantApiKeyRecord(response.data?.key),\n plaintextKey:\n typeof response.data?.plaintextKey === \"string\"\n ? response.data.plaintextKey\n : undefined,\n },\n };\n },\n\n /**\n * Revoke a tenant API key.\n */\n async revokeTenantApiKey(\n keyId: string,\n input: GatewayScope & { reason?: string } = {},\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/tenant-api-keys/${encodeURIComponent(keyId)}/revoke`,\n method: \"POST\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * List tenant vault secrets.\n */\n async listTenantVaultSecrets(scope: GatewayScope) {\n const response = await gateway.request<{ secrets?: unknown[] }>({\n path: `/api/platform/v1/tenant-vault-secrets${toQueryString(scope)}`,\n });\n\n return {\n ...response,\n data: {\n secrets: asTenantVaultSecretArray(response.data?.secrets),\n },\n };\n },\n\n /**\n * Create a tenant vault secret.\n */\n async createTenantVaultSecret(\n input: GatewayScope & {\n name: string;\n description?: string;\n value: string;\n },\n idempotencyKey?: string\n ) {\n const response = await gateway.request<{ secret?: unknown }>({\n path: \"/api/platform/v1/tenant-vault-secrets\",\n method: \"POST\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n\n return {\n ...response,\n data: {\n secret: asTenantVaultSecretRecord(response.data?.secret),\n },\n };\n },\n\n /**\n * Update a tenant vault secret.\n */\n async updateTenantVaultSecret(\n secretId: string,\n input: GatewayScope & {\n name: string;\n description?: string;\n value?: string;\n },\n idempotencyKey?: string\n ) {\n const response = await gateway.request<{ secret?: unknown }>({\n path: `/api/platform/v1/tenant-vault-secrets/${encodeURIComponent(secretId)}`,\n method: \"PATCH\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n\n return {\n ...response,\n data: {\n secret: asTenantVaultSecretRecord(response.data?.secret),\n },\n };\n },\n\n /**\n * Delete a tenant vault secret.\n */\n async deleteTenantVaultSecret(\n secretId: string,\n scope: GatewayScope,\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/tenant-vault-secrets/${encodeURIComponent(\n secretId\n )}${toQueryString(scope)}`,\n method: \"DELETE\",\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * List tenant provider secrets.\n */\n async listTenantSecrets(\n scope: GatewayScope & {\n providerId?: string;\n status?: \"active\" | \"revoked\";\n }\n ) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/tenant-secrets${toQueryString(scope)}`,\n });\n },\n\n /**\n * Upsert a tenant provider secret.\n */\n async upsertTenantSecret(\n input: GatewayScope & {\n providerId: string;\n apiKey: string;\n label?: string;\n modelSlotIds?: string[];\n passThroughOnly?: boolean;\n metadata?: JsonObject;\n },\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: \"/api/platform/v1/tenant-secrets\",\n method: \"POST\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * Revoke a tenant provider secret.\n */\n async revokeTenantSecret(\n secretRef: string,\n input: GatewayScope & { reason?: string },\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/tenant-secrets/${encodeURIComponent(secretRef)}/revoke`,\n method: \"POST\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * Get tenant configuration.\n */\n async getTenantConfig(scope: GatewayScope & { tenantId: string }) {\n return gateway.request<TenantConfigRecord>({\n path: `/api/platform/v1/tenant-config${toQueryString(scope)}`,\n });\n },\n\n /**\n * Get tenant model routing.\n */\n async getTenantModelRouting(scope: GatewayScope & { tenantId: string }) {\n return gateway.request<TenantModelRoutingSnapshot>({\n path: `/api/platform/v1/tenant-config/model-routing${toQueryString(scope)}`,\n });\n },\n\n /**\n * Upsert tenant configuration.\n */\n async upsertTenantConfig(\n input: GatewayScope & Omit<TenantConfigRecord, \"updatedAt\" | \"updatedBy\">,\n idempotencyKey?: string\n ) {\n return gateway.request<TenantConfigRecord>({\n path: \"/api/platform/v1/tenant-config\",\n method: \"POST\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * List groups.\n */\n async listGroups(scope: GatewayScope & { limit?: number } = {}) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/groups${toQueryString(scope)}`,\n });\n },\n\n /**\n * Create a group.\n */\n async createGroup(\n input: GatewayScope & {\n name: string;\n groupKey?: string;\n groupType?: string;\n description?: string;\n },\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: \"/api/platform/v1/groups\",\n method: \"POST\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * Update a group.\n */\n async updateGroup(\n groupId: string,\n input: GatewayScope & {\n name?: string;\n description?: string;\n workspaceId?: string;\n clearWorkspaceId?: boolean;\n },\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/groups/${encodeURIComponent(groupId)}`,\n method: \"PATCH\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * Delete a group.\n */\n async deleteGroup(\n groupId: string,\n input: GatewayScope = {},\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/groups/${encodeURIComponent(groupId)}${toQueryString(input)}`,\n method: \"DELETE\",\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * List group members.\n */\n async listGroupMembers(query: GatewayScope & { groupId: string }) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/groups/members${toQueryString(query)}`,\n });\n },\n\n /**\n * Add a group member.\n */\n async addGroupMember(\n input: GatewayScope & {\n groupId: string;\n principalId: string;\n },\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: \"/api/platform/v1/groups/members\",\n method: \"POST\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * Remove a group member.\n */\n async removeGroupMember(\n input: GatewayScope & { groupId: string; principalId: string },\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/groups/members${toQueryString(input)}`,\n method: \"DELETE\",\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * List pack-to-group assignments.\n */\n async listPackGroupAssignments(\n query: GatewayScope & {\n groupId?: string;\n status?: string;\n } = {}\n ) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/groups/packs${toQueryString(query)}`,\n });\n },\n\n /**\n * Assign a pack to a group.\n */\n async assignPackToGroup(\n input: GatewayScope & {\n groupId: string;\n packKey: string;\n packVersion?: string;\n },\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: \"/api/platform/v1/groups/packs\",\n method: \"POST\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * Remove a pack from a group.\n */\n async removePackFromGroup(\n input: GatewayScope & { groupId: string; packKey: string },\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/groups/packs${toQueryString(input)}`,\n method: \"DELETE\",\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/coreClient.ts","../src/sdkSurface.ts","../src/adminClient.ts"],"names":[],"mappings":"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","file":"adminClient.js","sourcesContent":["import type { JsonObject, JsonValue } from \"./types\";\n\n/** Tenant and workspace identifiers used to scope gateway requests. */\nexport type GatewayScope = {\n tenantId?: string;\n workspaceId?: string;\n};\n\n/** Successful response envelope from the platform gateway with correlation metadata. */\nexport type PlatformGatewaySuccess<T> = {\n success: true;\n data: T;\n correlationId: string;\n policyTraceId: string | null;\n idempotentReplay: boolean;\n};\n\n/** Failed response envelope with structured error codes and optional invariant references. */\nexport type PlatformGatewayFailure = {\n success: false;\n /**\n * Error string is the canonical envelope field.\n * Object form is legacy-only compatibility for older gateway responses.\n */\n error:\n | string\n | {\n code: string;\n message: string;\n details?: JsonValue;\n };\n code?: string;\n invariant?: string | null;\n suggestion?: string | null;\n details?: JsonValue;\n legacyError?: {\n code: string;\n message: string;\n details?: JsonValue;\n };\n correlationId: string;\n policyTraceId: string | null;\n};\n\n/** Discriminated union of success and failure gateway responses. */\nexport type PlatformGatewayEnvelope<T> =\n | PlatformGatewaySuccess<T>\n | PlatformGatewayFailure;\n\n/**\n * Structured error thrown when a platform API request fails.\n *\n * Includes HTTP status, machine-readable error code, optional invariant\n * reference, and actionable suggestions for common failure modes.\n */\nexport class LucernApiError extends Error {\n public readonly code: string;\n public readonly status: number;\n public readonly invariant?: string | null;\n public readonly suggestion?: string | null;\n public readonly details?: JsonValue;\n public readonly requestId?: string;\n public readonly correlationId?: string;\n public readonly policyTraceId?: string | null;\n\n constructor(args: {\n code: string;\n message: string;\n status: number;\n invariant?: string | null;\n suggestion?: string | null;\n details?: JsonValue;\n requestId?: string;\n correlationId?: string;\n policyTraceId?: string | null;\n }) {\n super(args.message);\n this.name = \"LucernApiError\";\n this.code = args.code;\n this.status = args.status;\n this.invariant = args.invariant;\n this.suggestion = args.suggestion;\n this.details = args.details;\n this.requestId = args.requestId;\n this.correlationId = args.correlationId;\n this.policyTraceId = args.policyTraceId;\n }\n}\n\n/** Supported HTTP methods for gateway requests. */\nexport type GatewayHttpMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n\ntype FetchLike = (\n input: RequestInfo | URL,\n init?: RequestInit\n) => Promise<Response>;\n\n/** Context passed to the `onRequest` hook before each gateway request attempt. */\nexport type GatewayRequestHookContext = {\n requestId: string;\n attempt: number;\n maxRetries: number;\n method: GatewayHttpMethod;\n path: string;\n url: string;\n headers: Headers;\n body?: string;\n timeoutMs: number;\n};\n\n/** Context passed to the `onResponse` hook after each gateway request attempt (including retries and failures). */\nexport type GatewayResponseHookContext = GatewayRequestHookContext & {\n durationMs: number;\n status?: number;\n response?: Response;\n error?: unknown;\n correlationId?: string;\n policyTraceId?: string | null;\n idempotentReplay?: boolean;\n retryAfterMs?: number | null;\n willRetry: boolean;\n};\n\n/**\n * Low-level transport configuration for the platform gateway client.\n *\n * Most developers should use {@link createLucernClient} instead, which wraps\n * this config with higher-level conveniences like `apiKey` and `environment`.\n */\nexport type GatewayClientConfig = {\n baseUrl?: string;\n fetchImpl?: FetchLike;\n getAuthHeaders?:\n | (() => Promise<Record<string, string>>)\n | (() => Record<string, string>);\n /** Max retries for transient errors (5xx, network). Defaults to 2. */\n maxRetries?: number;\n /** Request timeout in ms. Defaults to 15000. */\n timeoutMs?: number;\n /** Optional timeout overrides by HTTP method. */\n timeoutMsByMethod?: Partial<Record<GatewayHttpMethod, number>>;\n /** Optional request ID factory used for correlation headers. */\n requestIdFactory?: () => string;\n /** Invoked before each request attempt, including retries. */\n onRequest?:\n | ((context: GatewayRequestHookContext) => void)\n | ((context: GatewayRequestHookContext) => Promise<void>);\n /** Invoked after each request attempt, including retries and failures. */\n onResponse?:\n | ((context: GatewayResponseHookContext) => void)\n | ((context: GatewayResponseHookContext) => Promise<void>);\n};\n\n/**\n * Serialize a gateway query object into a URL query string.\n */\nexport function toQueryString(\n scope: GatewayScope & Record<string, string | number | boolean | undefined>\n): string {\n const params = new URLSearchParams();\n if (scope.tenantId) {\n params.set(\"tenantId\", scope.tenantId);\n }\n if (scope.workspaceId) {\n params.set(\"workspaceId\", scope.workspaceId);\n }\n for (const [key, value] of Object.entries(scope)) {\n if (key === \"tenantId\" || key === \"workspaceId\") {\n continue;\n }\n if (value === undefined) {\n continue;\n }\n params.set(key, String(value));\n }\n const serialized = params.toString();\n return serialized.length > 0 ? `?${serialized}` : \"\";\n}\n\nfunction fillRandomBytes(length: number): Uint8Array {\n const bytes = new Uint8Array(length);\n if (typeof globalThis.crypto?.getRandomValues === \"function\") {\n globalThis.crypto.getRandomValues(bytes);\n return bytes;\n }\n\n for (let index = 0; index < length; index += 1) {\n bytes[index] = Math.floor(Math.random() * 256);\n }\n return bytes;\n}\n\nfunction generatePortableRequestId(): string {\n if (typeof globalThis.crypto?.randomUUID === \"function\") {\n return globalThis.crypto.randomUUID();\n }\n\n const bytes = fillRandomBytes(16);\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = Array.from(bytes, (value) => value.toString(16).padStart(2, \"0\"));\n return `${hex.slice(0, 4).join(\"\")}-${hex.slice(4, 6).join(\"\")}-${hex.slice(\n 6,\n 8\n ).join(\"\")}-${hex.slice(8, 10).join(\"\")}-${hex.slice(10).join(\"\")}`;\n}\n\n/**\n * Generate a random idempotency key for retry-safe writes.\n */\nexport function randomIdempotencyKey(): string {\n return generatePortableRequestId();\n}\n\nfunction isRetryableStatus(status: number): boolean {\n return status >= 500 || status === 408 || status === 429;\n}\n\nfunction fallbackErrorCode(status: number): string {\n if (status === 401) {\n return \"AUTHENTICATION_REQUIRED\";\n }\n if (status === 403) {\n return \"FORBIDDEN\";\n }\n if (status === 404) {\n return \"NOT_FOUND\";\n }\n if (status === 408) {\n return \"UPSTREAM_ERROR\";\n }\n if (status === 409) {\n return \"CONFLICT\";\n }\n if (status === 429) {\n return \"RATE_LIMIT_EXCEEDED\";\n }\n if (status >= 500) {\n return \"UPSTREAM_ERROR\";\n }\n return \"INTERNAL_ERROR\";\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction parseRetryAfterMs(value: string | null): number | null {\n if (!value) {\n return null;\n }\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n const numeric = Number(trimmed);\n if (Number.isFinite(numeric)) {\n return Math.max(0, Math.round(numeric * 1000));\n }\n const parsedDate = Date.parse(trimmed);\n if (Number.isFinite(parsedDate)) {\n return Math.max(0, parsedDate - Date.now());\n }\n return null;\n}\n\nfunction computeRetryDelayMs(args: {\n attempt: number;\n status?: number;\n retryAfterMs?: number | null;\n}): number {\n const baseDelay =\n args.status === 429\n ? Math.max(\n args.retryAfterMs ?? 0,\n Math.min(1000 * 2 ** args.attempt, 10_000)\n )\n : Math.min(1000 * 2 ** args.attempt, 4000);\n\n if (args.status !== 429) {\n return baseDelay;\n }\n\n const jitterWindow = Math.max(250, Math.round(baseDelay * 0.25));\n return baseDelay + Math.round(Math.random() * jitterWindow);\n}\n\nfunction timeoutError(timeoutMs: number): Error {\n const error = new Error(`Request timed out after ${timeoutMs}ms`);\n error.name = \"AbortError\";\n return error;\n}\n\nfunction readPolicySummaryFromDetails(details?: JsonValue): string | null {\n if (!details || typeof details !== \"object\" || Array.isArray(details)) {\n return null;\n }\n\n const directSummary = (details as { summary?: JsonValue }).summary;\n if (typeof directSummary === \"string\" && directSummary.trim().length > 0) {\n return directSummary.trim();\n }\n\n const policy = (details as { policy?: JsonValue }).policy;\n if (!policy || typeof policy !== \"object\" || Array.isArray(policy)) {\n return null;\n }\n\n const explanation = (policy as { explanation?: JsonValue }).explanation;\n if (!explanation || typeof explanation !== \"object\" || Array.isArray(explanation)) {\n return null;\n }\n\n const nestedSummary = (explanation as { summary?: JsonValue }).summary;\n if (typeof nestedSummary === \"string\" && nestedSummary.trim().length > 0) {\n return nestedSummary.trim();\n }\n\n return null;\n}\n\n/**\n * Create the transport client used by all SDK modules.\n */\nexport function createGatewayRequestClient(config: GatewayClientConfig = {}) {\n const fetchImpl = config.fetchImpl ?? fetch;\n const baseUrl = config.baseUrl?.replace(/\\/+$/, \"\") ?? \"\";\n const maxRetries = config.maxRetries ?? 2;\n const requestIdFactory = config.requestIdFactory ?? (() => generatePortableRequestId());\n\n async function resolveAuthHeaders(): Promise<Record<string, string>> {\n if (!config.getAuthHeaders) {\n return {};\n }\n return await config.getAuthHeaders();\n }\n\n async function fetchWithTimeout(\n url: string,\n init: RequestInit,\n timeoutMs: number\n ): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetchImpl(url, { ...init, signal: controller.signal });\n } catch (error) {\n if (controller.signal.aborted) {\n throw timeoutError(timeoutMs);\n }\n throw error;\n } finally {\n clearTimeout(timer);\n }\n }\n\n async function parsePayload<T>(\n response: Response\n ): Promise<PlatformGatewayEnvelope<T> | null> {\n const text = await response.text();\n if (!text) {\n return null;\n }\n try {\n return JSON.parse(text) as PlatformGatewayEnvelope<T>;\n } catch {\n return null;\n }\n }\n\n function resolveTimeoutMs(\n method: GatewayHttpMethod,\n requestTimeoutMs?: number\n ): number {\n if (typeof requestTimeoutMs === \"number\") {\n return requestTimeoutMs;\n }\n const methodTimeoutMs = config.timeoutMsByMethod?.[method];\n if (typeof methodTimeoutMs === \"number\") {\n return methodTimeoutMs;\n }\n return config.timeoutMs ?? 15_000;\n }\n\n function buildApiError(args: {\n requestId: string;\n response: Response;\n failure?: PlatformGatewayFailure | null;\n }): LucernApiError {\n const failure = args.failure;\n const legacyError =\n failure && typeof failure.error === \"object\" && failure.error !== null\n ? failure.error\n : failure?.legacyError;\n const correlationId =\n failure?.correlationId ??\n args.response.headers.get(\"x-lucern-correlation-id\")?.trim() ??\n args.requestId;\n const policyTraceId =\n failure?.policyTraceId ??\n args.response.headers.get(\"x-lucern-policy-trace-id\")?.trim() ??\n null;\n const details = failure?.details ?? legacyError?.details;\n const policySummary = readPolicySummaryFromDetails(details);\n\n return new LucernApiError({\n code: failure?.code ?? legacyError?.code ?? fallbackErrorCode(args.response.status),\n message:\n policySummary ??\n (typeof failure?.error === \"string\"\n ? failure.error\n : legacyError?.message ??\n (args.response.ok\n ? \"Platform API returned an invalid success payload.\"\n : \"Platform API request failed.\")),\n status: args.response.status,\n invariant: failure?.invariant,\n suggestion: failure?.suggestion,\n details,\n requestId: args.requestId,\n correlationId,\n policyTraceId,\n });\n }\n\n async function request<T>(args: {\n path: string;\n method?: GatewayHttpMethod;\n body?: JsonObject;\n idempotencyKey?: string;\n requestId?: string;\n timeoutMs?: number;\n }): Promise<PlatformGatewaySuccess<T>> {\n const authHeaders = await resolveAuthHeaders();\n const method = args.method ?? \"GET\";\n const timeoutMs = resolveTimeoutMs(method, args.timeoutMs);\n const headers = new Headers({\n \"content-type\": \"application/json\",\n ...authHeaders,\n });\n if (args.idempotencyKey) {\n headers.set(\"idempotency-key\", args.idempotencyKey);\n }\n const requestId =\n headers.get(\"x-correlation-id\")?.trim() ||\n headers.get(\"x-request-id\")?.trim() ||\n args.requestId ||\n requestIdFactory();\n if (!headers.has(\"x-correlation-id\") && !headers.has(\"x-request-id\")) {\n headers.set(\"x-correlation-id\", requestId);\n }\n\n const url = `${baseUrl}${args.path}`;\n const serializedBody = args.body ? JSON.stringify(args.body) : undefined;\n const init: RequestInit = {\n method,\n headers,\n body: serializedBody,\n };\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const hookRequestContext: GatewayRequestHookContext = {\n requestId,\n attempt,\n maxRetries,\n method,\n path: args.path,\n url,\n headers: new Headers(headers),\n body: serializedBody,\n timeoutMs,\n };\n await config.onRequest?.(hookRequestContext);\n const startedAt = Date.now();\n try {\n const response = await fetchWithTimeout(url, init, timeoutMs);\n const responseClone = response.clone();\n const payload = await parsePayload<T>(response);\n const retryAfterMs = parseRetryAfterMs(\n response.headers.get(\"Retry-After\")\n );\n\n if (!response.ok || !payload?.success) {\n const failure =\n payload && !payload.success ? (payload as PlatformGatewayFailure) : null;\n const apiError = buildApiError({\n requestId,\n response,\n failure,\n });\n const willRetry = attempt < maxRetries && isRetryableStatus(response.status);\n\n await config.onResponse?.({\n ...hookRequestContext,\n durationMs: Date.now() - startedAt,\n status: response.status,\n response: responseClone,\n error: apiError,\n correlationId: apiError.correlationId ?? requestId,\n policyTraceId: apiError.policyTraceId ?? null,\n retryAfterMs,\n willRetry,\n });\n\n if (willRetry) {\n lastError = apiError;\n await delay(\n computeRetryDelayMs({\n attempt,\n status: response.status,\n retryAfterMs,\n })\n );\n continue;\n }\n\n throw apiError;\n }\n\n const successPayload = payload as PlatformGatewaySuccess<T>;\n await config.onResponse?.({\n ...hookRequestContext,\n durationMs: Date.now() - startedAt,\n status: response.status,\n response: responseClone,\n correlationId:\n successPayload.correlationId ??\n response.headers.get(\"x-lucern-correlation-id\")?.trim() ??\n requestId,\n policyTraceId:\n successPayload.policyTraceId ??\n response.headers.get(\"x-lucern-policy-trace-id\")?.trim() ??\n null,\n idempotentReplay: successPayload.idempotentReplay,\n retryAfterMs,\n willRetry: false,\n });\n\n return successPayload;\n } catch (fetchError) {\n if (fetchError instanceof LucernApiError) {\n throw fetchError;\n }\n const willRetry = attempt < maxRetries;\n await config.onResponse?.({\n ...hookRequestContext,\n durationMs: Date.now() - startedAt,\n error: fetchError,\n correlationId: requestId,\n policyTraceId: null,\n willRetry,\n });\n lastError = fetchError;\n if (willRetry) {\n await delay(computeRetryDelayMs({ attempt }));\n }\n }\n }\n\n throw lastError instanceof Error\n ? lastError\n : new Error(\"Platform API request failed after retries.\");\n }\n\n return {\n request,\n };\n}\n","import type { PlatformGatewaySuccess } from \"./coreClient\";\nimport type { JsonObject, ListResult } from \"./types\";\n\ntype TopicScopedValue = {\n topicId?: string;\n};\n\ntype TextScopedValue = {\n text?: string;\n canonicalText?: string;\n};\n\ntype AnyRecord = Record<string, unknown>;\n\nfunction asRecord(value: unknown): AnyRecord {\n return value && typeof value === \"object\" ? (value as AnyRecord) : {};\n}\n\nfunction cleanString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? value.trim()\n : undefined;\n}\n\nfunction normalizeVerificationStatus(value: unknown): string | undefined {\n const status = cleanString(value);\n if (!status) {\n return undefined;\n }\n if (status === \"verified\") {\n return \"human_verified\";\n }\n if (status === \"rejected\") {\n return \"contradicted\";\n }\n return status;\n}\n\nfunction cloneWith<T extends AnyRecord>(value: T, patch: AnyRecord): T {\n return { ...value, ...patch } as T;\n}\n\n/**\n * Resolve the canonical topic identifier.\n */\nexport function resolveTopicId(value: TopicScopedValue): string | undefined {\n return cleanString(value.topicId);\n}\n\n/**\n * Resolve the canonical text field from text-first or legacy canonicalText-first inputs.\n */\nexport function resolveText(value: TextScopedValue): string | undefined {\n return cleanString(value.text) ?? cleanString(value.canonicalText);\n}\n\n/**\n * Attach the topicId to a record.\n */\nexport function withTopicAlias<T extends AnyRecord>(value: T): T {\n const topicId = cleanString(value.topicId) ?? undefined;\n if (!topicId) {\n return value;\n }\n return cloneWith(value, { topicId });\n}\n\n/**\n * Attach the text/canonicalText alias pair to a record.\n */\nexport function withTextAlias<T extends AnyRecord>(value: T): T {\n const text =\n cleanString(value.text) ?? cleanString(value.canonicalText) ?? undefined;\n if (!text) {\n return value;\n }\n return cloneWith(value, { text, canonicalText: text });\n}\n\n/**\n * Attach topic and text aliases to SDK node-like records.\n */\nexport function withSdkAliases<T extends AnyRecord>(value: T): T {\n return withTopicAlias(withTextAlias(value));\n}\n\n/**\n * Normalize a belief/question/evidence write payload to the canonical gateway shape.\n */\nexport function normalizeNodeWriteInput<T extends JsonObject>(value: T): T {\n const topicId = resolveTopicId(value);\n const text = resolveText(value);\n const verificationStatus = normalizeVerificationStatus(value.verificationStatus);\n const next = { ...value } as JsonObject;\n\n if (topicId) {\n next.topicId = topicId;\n }\n if (text) {\n next.text = text;\n next.canonicalText = text;\n }\n if (verificationStatus) {\n next.verificationStatus = verificationStatus;\n }\n\n return next as T;\n}\n\nexport function normalizeNodeVerificationStatus(value: unknown) {\n return normalizeVerificationStatus(value);\n}\n\n/**\n * Build a topic-aware query object.\n */\nexport function normalizeTopicQuery<T extends JsonObject>(value: T): T {\n const topicId = cleanString(value.topicId);\n if (!topicId) {\n return value;\n }\n return { ...value, topicId } as T;\n}\n\n/**\n * Extract list items from array or list-envelope payloads.\n */\nexport function asListItems<T>(data: unknown, legacyKey?: string): T[] {\n if (Array.isArray(data)) {\n return data as T[];\n }\n\n const record = asRecord(data);\n if (Array.isArray(record.items)) {\n return record.items as T[];\n }\n if (legacyKey && Array.isArray(record[legacyKey])) {\n return record[legacyKey] as T[];\n }\n\n return [];\n}\n\n/**\n * Standardize list data to { items, total } while retaining an optional legacy array key.\n */\nexport function createListResult<T, LegacyKey extends string>(\n items: T[],\n legacyKey?: LegacyKey\n): ListResult<T, LegacyKey> {\n const result = {\n items,\n total: items.length,\n } as ListResult<T, LegacyKey>;\n\n if (legacyKey) {\n (result as Record<string, unknown>)[legacyKey] = items;\n }\n\n return result;\n}\n\n/**\n * Map a gateway success envelope's data while preserving the transport metadata.\n */\nexport function mapGatewayData<T, U>(\n response: PlatformGatewaySuccess<T>,\n mapper: (data: T) => U\n): PlatformGatewaySuccess<U> {\n return {\n ...response,\n data: mapper(response.data),\n };\n}\n\n/**\n * Apply SDK aliases across all items in a list-like payload.\n */\nexport function mapAliasedList<\n TItem extends AnyRecord,\n LegacyKey extends string,\n>(\n data: unknown,\n legacyKey?: LegacyKey\n): ListResult<TItem, LegacyKey> {\n const items = asListItems<TItem>(data, legacyKey).map((item) =>\n withSdkAliases(item)\n );\n return createListResult(items, legacyKey);\n}\n","import {\n createGatewayRequestClient,\n type GatewayClientConfig,\n type GatewayScope,\n LucernApiError,\n randomIdempotencyKey,\n toQueryString,\n} from \"./coreClient\";\nimport { createListResult, mapGatewayData } from \"./sdkSurface\";\nimport type { ControlObjectOwnershipContract } from \"./controlObjectOwnership\";\nimport type { JsonObject } from \"./types\";\n\nexport { LucernApiError };\nexport type { GatewayScope, PlatformGatewaySuccess } from \"./coreClient\";\n\n/** Configuration for the admin client. */\nexport type AdminClientConfig = GatewayClientConfig;\n\nexport type TenantApiKeyRecord = {\n id?: string;\n tenantId?: string;\n workspaceId?: string;\n label?: string;\n keyPrefix?: string;\n hashedKey?: string;\n scopes?: string[];\n status?: string;\n expiresAt?: number;\n lastUsedAt?: number;\n revokedAt?: number;\n revokedBy?: string;\n createdBy?: string;\n createdAt?: number;\n updatedAt?: number;\n};\n\nexport type TenantVaultSecretRecord = {\n id?: string;\n tenantId?: string;\n workspaceId?: string;\n name?: string;\n description?: string;\n lastRotated?: number;\n createdBy?: string;\n updatedBy?: string;\n createdAt?: number;\n updatedAt?: number;\n};\n\nexport type TenantAuthPolicyMode = \"open\" | \"invite_only\" | \"sso_required\";\nexport type TenantTopicVisibility = \"private\" | \"tenant\" | \"public\";\nexport type TenantFeatureFlags = Record<string, boolean>;\nexport type TenantModelSlotOverrides = Record<string, string>;\n\nexport type TenantConfigRecord = {\n tenantId: string;\n authPolicyMode: TenantAuthPolicyMode;\n defaultSessionTTL: number;\n defaultTopicVisibility: TenantTopicVisibility;\n featureFlags: TenantFeatureFlags;\n maxWorkspaceCount: number;\n defaultModelSlotOverrides: TenantModelSlotOverrides;\n updatedAt?: number;\n updatedBy?: string;\n};\n\nexport type TenantModelRoutingSlotRecord = {\n slot: string;\n category?: string;\n description?: string;\n modelKey: string;\n promptName?: string;\n temperature?: number;\n maxTokens?: number;\n enabled?: boolean;\n};\n\nexport type TenantModelRoutingModelRecord = {\n key: string;\n name?: string;\n modelId?: string;\n provider?: string;\n enabled?: boolean;\n recommended?: boolean;\n notes?: string;\n};\n\nexport type TenantModelRoutingBindingRecord = {\n slot: string;\n providerId: string;\n secretRef: string;\n label?: string;\n keyHint?: string;\n};\n\nexport type TenantModelRouteOverrideStatus =\n | \"inherit\"\n | \"active\"\n | \"blocked_missing_model\"\n | \"blocked_missing_binding\";\n\nexport type TenantModelRouteBindingState = \"ready\" | \"missing\";\nexport type TenantModelRouteSource = \"platform_default\" | \"tenant_override\";\n\nexport type TenantModelRouteRow = {\n slot: string;\n category: string;\n description?: string;\n promptName?: string;\n slotEnabled: boolean;\n platformModelKey: string;\n platformModelName?: string;\n platformProviderId?: string;\n overrideModelKey?: string;\n overrideModelName?: string;\n overrideProviderId?: string;\n effectiveModelKey: string;\n effectiveModelName?: string;\n effectiveProviderId?: string;\n effectiveSource: TenantModelRouteSource;\n overrideStatus: TenantModelRouteOverrideStatus;\n bindingState: TenantModelRouteBindingState;\n bindingLabel?: string;\n bindingKeyHint?: string;\n bindingSecretRef?: string;\n};\n\nexport type TenantModelRoutingSummary = {\n totalSlots: number;\n promptBoundSlots: number;\n activeOverrides: number;\n blockedOverrides: number;\n readyBindings: number;\n};\n\nexport type TenantModelRoutingSnapshot = {\n tenantId: string;\n defaultModelSlotOverrides: Record<string, string>;\n slots: TenantModelRoutingSlotRecord[];\n models: TenantModelRoutingModelRecord[];\n bindings: TenantModelRoutingBindingRecord[];\n rows: TenantModelRouteRow[];\n summary: TenantModelRoutingSummary;\n notes: string[];\n};\n\nfunction asTenantApiKeyRecord(data: unknown): TenantApiKeyRecord | null {\n if (!data || typeof data !== \"object\") {\n return null;\n }\n return data as TenantApiKeyRecord;\n}\n\nfunction asTenantApiKeyArray(data: unknown): TenantApiKeyRecord[] {\n if (!Array.isArray(data)) {\n return [];\n }\n return data\n .map(asTenantApiKeyRecord)\n .filter((row): row is TenantApiKeyRecord => Boolean(row));\n}\n\nfunction asTenantVaultSecretRecord(\n data: unknown\n): TenantVaultSecretRecord | null {\n if (!data || typeof data !== \"object\") {\n return null;\n }\n return data as TenantVaultSecretRecord;\n}\n\nfunction asTenantVaultSecretArray(data: unknown): TenantVaultSecretRecord[] {\n if (!Array.isArray(data)) {\n return [];\n }\n return data\n .map(asTenantVaultSecretRecord)\n .filter((row): row is TenantVaultSecretRecord => Boolean(row));\n}\n\n/**\n * Create the admin client for tenant, workspace, and membership administration.\n * @param config - Gateway transport configuration.\n * @returns An object with methods to manage tenants, workspaces, and memberships.\n */\nexport function createAdminClient(config: AdminClientConfig = {}) {\n const gateway = createGatewayRequestClient(config);\n\n return {\n /**\n * List tenants visible to the current principal.\n */\n async listTenants(\n query: {\n status?:\n | \"provisioning\"\n | \"active\"\n | \"disabled\"\n | \"suspended\"\n | \"archived\";\n limit?: number;\n } = {}\n ) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/tenants${toQueryString(query)}`,\n }).then((response) =>\n mapGatewayData(response, (data) =>\n createListResult(\n Array.isArray(data) ? data : [],\n \"tenants\"\n )\n )\n );\n },\n\n /**\n * Create a tenant.\n */\n async createTenant(\n input: {\n key: string;\n slug?: string;\n name: string;\n tier?: \"free\" | \"developer\" | \"team\" | \"enterprise\";\n status?:\n | \"provisioning\"\n | \"active\"\n | \"disabled\"\n | \"suspended\"\n | \"archived\";\n ownerClerkId?: string;\n ownerEmail?: string;\n lucernDeploymentUrl?: string;\n appDeploymentUrl?: string;\n metadata?: JsonObject;\n },\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: \"/api/platform/v1/tenants\",\n method: \"POST\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * Get the control-object ownership contract.\n */\n async getControlObjectOwnership() {\n return gateway.request<ControlObjectOwnershipContract>({\n path: \"/api/platform/v1/admin/control-ownership\",\n });\n },\n\n /**\n * @deprecated Use getControlObjectOwnership.\n */\n async getControlObjectOwnershipContract() {\n return gateway.request<ControlObjectOwnershipContract>({\n path: \"/api/platform/v1/admin/control-ownership\",\n });\n },\n\n /**\n * List workspaces for the current admin scope.\n */\n async listWorkspaces(\n query: GatewayScope & {\n status?: \"active\" | \"archived\";\n limit?: number;\n } = {}\n ) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/workspaces${toQueryString(query)}`,\n }).then((response) =>\n mapGatewayData(response, (data) =>\n createListResult(\n Array.isArray(data) ? data : [],\n \"workspaces\"\n )\n )\n );\n },\n\n /**\n * Create a workspace.\n */\n async createWorkspace(\n input: GatewayScope & {\n workspaceId?: string;\n key?: string;\n slug?: string;\n name?: string;\n status?: \"active\" | \"archived\";\n defaultProjectVisibility?:\n | \"private\"\n | \"team\"\n | \"firm\"\n | \"external\"\n | \"public\";\n restore?: boolean;\n metadata?: JsonObject;\n },\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: \"/api/platform/v1/workspaces\",\n method: \"POST\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * List memberships for the current admin scope.\n */\n async listMemberships(\n query: GatewayScope & {\n principalId?: string;\n status?: \"active\" | \"invited\" | \"revoked\" | \"expired\";\n role?:\n | \"platform_admin\"\n | \"tenant_admin\"\n | \"workspace_admin\"\n | \"editor\"\n | \"viewer\"\n | \"auditor\"\n | \"service_agent\";\n limit?: number;\n } = {}\n ) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/memberships${toQueryString(query)}`,\n }).then((response) =>\n mapGatewayData(response, (data) =>\n createListResult(\n Array.isArray(data) ? data : [],\n \"memberships\"\n )\n )\n );\n },\n\n /**\n * Create a membership.\n */\n async createMembership(\n input: GatewayScope & {\n membershipId?: string;\n principalId: string;\n role:\n | \"platform_admin\"\n | \"tenant_admin\"\n | \"workspace_admin\"\n | \"editor\"\n | \"viewer\"\n | \"auditor\"\n | \"service_agent\";\n status?: \"active\" | \"invited\" | \"revoked\" | \"expired\";\n source?:\n | \"bootstrap\"\n | \"manual\"\n | \"sync\"\n | \"sso\"\n | \"api\"\n | \"scim\"\n | \"invitation\";\n },\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: \"/api/platform/v1/memberships\",\n method: \"POST\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * Update a membership.\n */\n async updateMembership(\n input: GatewayScope & {\n membershipId?: string;\n principalId: string;\n role:\n | \"platform_admin\"\n | \"tenant_admin\"\n | \"workspace_admin\"\n | \"editor\"\n | \"viewer\"\n | \"auditor\"\n | \"service_agent\";\n status?: \"active\" | \"invited\" | \"revoked\" | \"expired\";\n source?:\n | \"bootstrap\"\n | \"manual\"\n | \"sync\"\n | \"sso\"\n | \"api\"\n | \"scim\"\n | \"invitation\";\n },\n idempotencyKey?: string\n ) {\n return this.createMembership(input, idempotencyKey);\n },\n\n /**\n * @deprecated Use createMembership or updateMembership.\n */\n async upsertMembership(\n input: GatewayScope & {\n membershipId?: string;\n principalId: string;\n role:\n | \"platform_admin\"\n | \"tenant_admin\"\n | \"workspace_admin\"\n | \"editor\"\n | \"viewer\"\n | \"auditor\"\n | \"service_agent\";\n status?: \"active\" | \"invited\" | \"revoked\" | \"expired\";\n source?:\n | \"bootstrap\"\n | \"manual\"\n | \"sync\"\n | \"sso\"\n | \"api\"\n | \"scim\"\n | \"invitation\";\n },\n idempotencyKey?: string\n ) {\n return this.createMembership(input, idempotencyKey);\n },\n\n /**\n * List tenant API keys in the current admin scope.\n */\n async listTenantApiKeys(\n scope: GatewayScope & {\n status?: \"active\" | \"revoked\" | \"expired\";\n }\n ) {\n const response = await gateway.request<{ keys?: unknown[] }>({\n path: `/api/platform/v1/tenant-api-keys${toQueryString(scope)}`,\n });\n\n return {\n ...response,\n data: {\n keys: asTenantApiKeyArray(response.data?.keys),\n },\n };\n },\n\n /**\n * Create a tenant API key.\n */\n async createTenantApiKey(\n input: GatewayScope & {\n label?: string;\n scopes: string[];\n expiresAt?: number;\n },\n idempotencyKey?: string\n ) {\n const response = await gateway.request<{\n key?: unknown;\n plaintextKey?: string;\n }>({\n path: \"/api/platform/v1/tenant-api-keys\",\n method: \"POST\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n\n return {\n ...response,\n data: {\n key: asTenantApiKeyRecord(response.data?.key),\n plaintextKey:\n typeof response.data?.plaintextKey === \"string\"\n ? response.data.plaintextKey\n : undefined,\n },\n };\n },\n\n /**\n * Revoke a tenant API key.\n */\n async revokeTenantApiKey(\n keyId: string,\n input: GatewayScope & { reason?: string } = {},\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/tenant-api-keys/${encodeURIComponent(keyId)}/revoke`,\n method: \"POST\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * List tenant vault secrets.\n */\n async listTenantVaultSecrets(scope: GatewayScope) {\n const response = await gateway.request<{ secrets?: unknown[] }>({\n path: `/api/platform/v1/tenant-vault-secrets${toQueryString(scope)}`,\n });\n\n return {\n ...response,\n data: {\n secrets: asTenantVaultSecretArray(response.data?.secrets),\n },\n };\n },\n\n /**\n * Create a tenant vault secret.\n */\n async createTenantVaultSecret(\n input: GatewayScope & {\n name: string;\n description?: string;\n value: string;\n },\n idempotencyKey?: string\n ) {\n const response = await gateway.request<{ secret?: unknown }>({\n path: \"/api/platform/v1/tenant-vault-secrets\",\n method: \"POST\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n\n return {\n ...response,\n data: {\n secret: asTenantVaultSecretRecord(response.data?.secret),\n },\n };\n },\n\n /**\n * Update a tenant vault secret.\n */\n async updateTenantVaultSecret(\n secretId: string,\n input: GatewayScope & {\n name: string;\n description?: string;\n value?: string;\n },\n idempotencyKey?: string\n ) {\n const response = await gateway.request<{ secret?: unknown }>({\n path: `/api/platform/v1/tenant-vault-secrets/${encodeURIComponent(secretId)}`,\n method: \"PATCH\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n\n return {\n ...response,\n data: {\n secret: asTenantVaultSecretRecord(response.data?.secret),\n },\n };\n },\n\n /**\n * Delete a tenant vault secret.\n */\n async deleteTenantVaultSecret(\n secretId: string,\n scope: GatewayScope,\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/tenant-vault-secrets/${encodeURIComponent(\n secretId\n )}${toQueryString(scope)}`,\n method: \"DELETE\",\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * List tenant provider secrets.\n */\n async listTenantSecrets(\n scope: GatewayScope & {\n providerId?: string;\n status?: \"active\" | \"revoked\";\n }\n ) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/tenant-secrets${toQueryString(scope)}`,\n });\n },\n\n /**\n * Upsert a tenant provider secret.\n */\n async upsertTenantSecret(\n input: GatewayScope & {\n providerId: string;\n apiKey: string;\n label?: string;\n modelSlotIds?: string[];\n passThroughOnly?: boolean;\n metadata?: JsonObject;\n },\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: \"/api/platform/v1/tenant-secrets\",\n method: \"POST\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * Revoke a tenant provider secret.\n */\n async revokeTenantSecret(\n secretRef: string,\n input: GatewayScope & { reason?: string },\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/tenant-secrets/${encodeURIComponent(secretRef)}/revoke`,\n method: \"POST\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * Get tenant configuration.\n */\n async getTenantConfig(scope: GatewayScope & { tenantId: string }) {\n return gateway.request<TenantConfigRecord>({\n path: `/api/platform/v1/tenant-config${toQueryString(scope)}`,\n });\n },\n\n /**\n * Get tenant model routing.\n */\n async getTenantModelRouting(scope: GatewayScope & { tenantId: string }) {\n return gateway.request<TenantModelRoutingSnapshot>({\n path: `/api/platform/v1/tenant-config/model-routing${toQueryString(scope)}`,\n });\n },\n\n /**\n * Upsert tenant configuration.\n */\n async upsertTenantConfig(\n input: GatewayScope & Omit<TenantConfigRecord, \"updatedAt\" | \"updatedBy\">,\n idempotencyKey?: string\n ) {\n return gateway.request<TenantConfigRecord>({\n path: \"/api/platform/v1/tenant-config\",\n method: \"POST\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * List groups.\n */\n async listGroups(scope: GatewayScope & { limit?: number } = {}) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/groups${toQueryString(scope)}`,\n });\n },\n\n /**\n * Create a group.\n */\n async createGroup(\n input: GatewayScope & {\n name: string;\n groupKey?: string;\n groupType?: string;\n description?: string;\n },\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: \"/api/platform/v1/groups\",\n method: \"POST\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * Update a group.\n */\n async updateGroup(\n groupId: string,\n input: GatewayScope & {\n name?: string;\n description?: string;\n workspaceId?: string;\n clearWorkspaceId?: boolean;\n },\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/groups/${encodeURIComponent(groupId)}`,\n method: \"PATCH\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * Delete a group.\n */\n async deleteGroup(\n groupId: string,\n input: GatewayScope = {},\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/groups/${encodeURIComponent(groupId)}${toQueryString(input)}`,\n method: \"DELETE\",\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * List group members.\n */\n async listGroupMembers(query: GatewayScope & { groupId: string }) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/groups/members${toQueryString(query)}`,\n });\n },\n\n /**\n * Add a group member.\n */\n async addGroupMember(\n input: GatewayScope & {\n groupId: string;\n principalId: string;\n },\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: \"/api/platform/v1/groups/members\",\n method: \"POST\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * Remove a group member.\n */\n async removeGroupMember(\n input: GatewayScope & { groupId: string; principalId: string },\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/groups/members${toQueryString(input)}`,\n method: \"DELETE\",\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * List pack-to-group assignments.\n */\n async listPackGroupAssignments(\n query: GatewayScope & {\n groupId?: string;\n status?: string;\n } = {}\n ) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/groups/packs${toQueryString(query)}`,\n });\n },\n\n /**\n * Assign a pack to a group.\n */\n async assignPackToGroup(\n input: GatewayScope & {\n groupId: string;\n packKey: string;\n packVersion?: string;\n },\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: \"/api/platform/v1/groups/packs\",\n method: \"POST\",\n body: input,\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n\n /**\n * Remove a pack from a group.\n */\n async removePackFromGroup(\n input: GatewayScope & { groupId: string; packKey: string },\n idempotencyKey?: string\n ) {\n return gateway.request<unknown>({\n path: `/api/platform/v1/groups/packs${toQueryString(input)}`,\n method: \"DELETE\",\n idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),\n });\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
type AudienceMode = "internal" | "lp" | "public";
|
|
2
|
+
type AudienceClass = "internal" | "restricted_external" | "public";
|
|
3
|
+
type ResolvedAudience = {
|
|
4
|
+
audienceKey: string;
|
|
5
|
+
audienceClass: AudienceClass;
|
|
6
|
+
audienceMode: AudienceMode;
|
|
7
|
+
};
|
|
8
|
+
type AllowedAudienceScope = {
|
|
9
|
+
allowedAudienceClasses: AudienceClass[];
|
|
10
|
+
allowedAudienceKeys: string[];
|
|
11
|
+
allowedAudienceModes: AudienceMode[];
|
|
12
|
+
};
|
|
13
|
+
type PrincipalAudienceScope = {
|
|
14
|
+
mode: "legacy_open" | "grant_enforced" | "admin_override";
|
|
15
|
+
grantModelEnabled: boolean;
|
|
16
|
+
grantedAudienceKeys: string[];
|
|
17
|
+
grantedAudienceClasses: AudienceClass[];
|
|
18
|
+
allowedAudienceKeys: string[];
|
|
19
|
+
allowedAudienceClasses: AudienceClass[];
|
|
20
|
+
allowedAudienceModes: AudienceMode[];
|
|
21
|
+
};
|
|
22
|
+
declare const AUDIENCE_CLASS_RANK: Record<AudienceClass, number>;
|
|
23
|
+
declare function normalizeAudienceKey(key: string | undefined | null): string;
|
|
24
|
+
declare function normalizeAudienceMode(mode: string | undefined | null): AudienceMode;
|
|
25
|
+
declare function classFromAudienceMode(mode: AudienceMode): AudienceClass;
|
|
26
|
+
declare function modeFromAudienceClass(audienceClass: AudienceClass): AudienceMode;
|
|
27
|
+
declare function classFromAudienceKey(audienceKey: string | undefined | null, fallback?: AudienceClass): AudienceClass;
|
|
28
|
+
declare function resolveAudience(args?: {
|
|
29
|
+
audienceMode?: string | null;
|
|
30
|
+
audienceKey?: string | null;
|
|
31
|
+
audienceClass?: AudienceClass | null;
|
|
32
|
+
}): ResolvedAudience;
|
|
33
|
+
declare function canViewAudienceLabel(viewerAudience: string, resourceAudienceLabel: string | undefined | null): boolean;
|
|
34
|
+
declare function canAudienceClassAccess(viewerClass: AudienceClass, resourceClass: AudienceClass): boolean;
|
|
35
|
+
declare function deriveAllowedAudienceClasses(visibility: string | undefined | null): AudienceClass[];
|
|
36
|
+
declare function intersectAudienceScopes(visibilityScope: AllowedAudienceScope, principalScope: PrincipalAudienceScope): AllowedAudienceScope;
|
|
37
|
+
|
|
38
|
+
export { AUDIENCE_CLASS_RANK, type AllowedAudienceScope, type AudienceClass, type AudienceMode, type PrincipalAudienceScope, type ResolvedAudience, canAudienceClassAccess, canViewAudienceLabel, classFromAudienceKey, classFromAudienceMode, deriveAllowedAudienceClasses, intersectAudienceScopes, modeFromAudienceClass, normalizeAudienceKey, normalizeAudienceMode, resolveAudience };
|