@lucern/sdk 0.3.0-alpha.1 → 0.3.0-alpha.10
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/CHANGELOG.md +3 -0
- package/README.md +51 -4
- package/dist/adminClient.d.ts +10 -8
- package/dist/adminClient.js +242 -39
- package/dist/adminClient.js.map +1 -1
- package/dist/answersClient.d.ts +2 -0
- package/dist/answersClient.js +221 -11
- package/dist/answersClient.js.map +1 -1
- package/dist/audience/index.d.ts +2 -1
- package/dist/audience/index.js +1 -3
- package/dist/audience/index.js.map +1 -1
- package/dist/audiencesClient.d.ts +18 -16
- package/dist/audiencesClient.js +297 -90
- package/dist/audiencesClient.js.map +1 -1
- package/dist/auditClient.d.ts +2 -0
- package/dist/auditClient.js +227 -15
- package/dist/auditClient.js.map +1 -1
- package/dist/authContext.d.ts +56 -0
- package/dist/authContext.js +170 -0
- package/dist/authContext.js.map +1 -0
- package/dist/authDeviceClient.d.ts +49 -0
- package/dist/authDeviceClient.js +121 -0
- package/dist/authDeviceClient.js.map +1 -0
- package/dist/beliefs/index.d.ts +25 -5
- package/dist/beliefs/index.js +3286 -1049
- package/dist/beliefs/index.js.map +1 -1
- package/dist/beliefsClient.d.ts +4 -2
- package/dist/beliefsClient.js +230 -26
- package/dist/beliefsClient.js.map +1 -1
- package/dist/boundaryClientSurface.d.ts +20 -0
- package/dist/boundaryClientSurface.js +73 -0
- package/dist/boundaryClientSurface.js.map +1 -0
- package/dist/client.d.ts +2969 -27
- package/dist/client.js +3286 -1049
- package/dist/client.js.map +1 -1
- package/dist/clientHelpers.d.ts +48 -0
- package/dist/clientHelpers.js +137 -0
- package/dist/clientHelpers.js.map +1 -0
- package/dist/contextClient.d.ts +6 -3
- package/dist/contextClient.js +252 -30
- package/dist/contextClient.js.map +1 -1
- package/dist/contextFacade.js +25 -16
- package/dist/contextFacade.js.map +1 -1
- package/dist/contextPackCompiler.js +19 -30
- package/dist/contextPackCompiler.js.map +1 -1
- package/dist/contextPackPolicy.js +7 -17
- package/dist/contextPackPolicy.js.map +1 -1
- package/dist/contextTypes.d.ts +2 -0
- package/dist/contracts/api-enums.contract.d.ts +1 -1
- package/dist/contracts/api-enums.contract.js.map +1 -1
- package/dist/contracts/index.d.ts +1 -0
- package/dist/contracts/index.js +108 -4
- package/dist/contracts/index.js.map +1 -1
- package/dist/contracts/lens-filter.contract.js +4 -3
- package/dist/contracts/lens-filter.contract.js.map +1 -1
- package/dist/contracts/lens-workflow.contract.js +4 -3
- package/dist/contracts/lens-workflow.contract.js.map +1 -1
- package/dist/contracts/lensFilter.js +4 -3
- package/dist/contracts/lensFilter.js.map +1 -1
- package/dist/contracts/lensWorkflow.js +4 -3
- package/dist/contracts/lensWorkflow.js.map +1 -1
- package/dist/contracts/mcpTools.d.ts +46 -1
- package/dist/contracts/mcpTools.js +102 -0
- package/dist/contracts/mcpTools.js.map +1 -1
- package/dist/contradictions/index.d.ts +24 -4
- package/dist/contradictions/index.js +3286 -1049
- package/dist/contradictions/index.js.map +1 -1
- package/dist/coreClient.d.ts +11 -1
- package/dist/coreClient.js +222 -14
- package/dist/coreClient.js.map +1 -1
- package/dist/decisions/index.d.ts +34 -14
- package/dist/decisions/index.js +3286 -1049
- package/dist/decisions/index.js.map +1 -1
- package/dist/decisionsClient.d.ts +6 -12
- package/dist/decisionsClient.js +235 -37
- package/dist/decisionsClient.js.map +1 -1
- package/dist/edges/index.d.ts +47 -87
- package/dist/edges/index.js +3286 -1049
- package/dist/edges/index.js.map +1 -1
- package/dist/embeddingsClient.d.ts +106 -0
- package/dist/embeddingsClient.js +731 -0
- package/dist/embeddingsClient.js.map +1 -0
- package/dist/eventingClient.d.ts +96 -0
- package/dist/eventingClient.js +728 -0
- package/dist/eventingClient.js.map +1 -0
- package/dist/events.js +6 -3
- package/dist/events.js.map +1 -1
- package/dist/eventsCore.d.ts +3 -1
- package/dist/eventsCore.js +222 -14
- package/dist/eventsCore.js.map +1 -1
- package/dist/evidence/index.d.ts +24 -4
- package/dist/evidence/index.js +3286 -1049
- package/dist/evidence/index.js.map +1 -1
- package/dist/evidenceClient.d.ts +2 -0
- package/dist/evidenceClient.js +222 -14
- package/dist/evidenceClient.js.map +1 -1
- package/dist/facade/context.d.ts +2 -1
- package/dist/facade/context.js +25 -16
- package/dist/facade/context.js.map +1 -1
- package/dist/functionSurface.d.ts +143 -0
- package/dist/functionSurface.js +1204 -0
- package/dist/functionSurface.js.map +1 -0
- package/dist/functionSurfaceClient.d.ts +8 -0
- package/dist/functionSurfaceClient.js +1204 -0
- package/dist/functionSurfaceClient.js.map +1 -0
- package/dist/gatewayFacades.d.ts +63 -46
- package/dist/gatewayFacades.js +461 -128
- package/dist/gatewayFacades.js.map +1 -1
- package/dist/graphAnalysisClient.d.ts +192 -0
- package/dist/graphAnalysisClient.js +799 -0
- package/dist/graphAnalysisClient.js.map +1 -0
- package/dist/graphClient.d.ts +7 -13
- package/dist/graphClient.js +244 -45
- package/dist/graphClient.js.map +1 -1
- package/dist/graphIntel.d.ts +3 -0
- package/dist/graphIntel.js +3 -0
- package/dist/graphIntel.js.map +1 -0
- package/dist/graphIntelligence.d.ts +2 -0
- package/dist/graphIntelligence.js +47 -0
- package/dist/graphIntelligence.js.map +1 -0
- package/dist/graphRecommendationsClient.d.ts +56 -0
- package/dist/graphRecommendationsClient.js +664 -0
- package/dist/graphRecommendationsClient.js.map +1 -0
- package/dist/graphStateClassifierClient.d.ts +73 -0
- package/dist/graphStateClassifierClient.js +716 -0
- package/dist/graphStateClassifierClient.js.map +1 -0
- package/dist/harnessClient.d.ts +15 -24
- package/dist/harnessClient.js +235 -42
- package/dist/harnessClient.js.map +1 -1
- package/dist/identityClient.d.ts +97 -11
- package/dist/identityClient.js +409 -33
- package/dist/identityClient.js.map +1 -1
- package/dist/index.d.ts +28 -5
- package/dist/index.js +3863 -1116
- package/dist/index.js.map +1 -1
- package/dist/infisicalRuntime.d.ts +42 -0
- package/dist/infisicalRuntime.js +314 -0
- package/dist/infisicalRuntime.js.map +1 -0
- package/dist/jobsClient.d.ts +98 -0
- package/dist/jobsClient.js +726 -0
- package/dist/jobsClient.js.map +1 -0
- package/dist/learningClient.d.ts +8 -6
- package/dist/learningClient.js +252 -44
- package/dist/learningClient.js.map +1 -1
- package/dist/lenses/index.d.ts +76 -38
- package/dist/lenses/index.js +3286 -1049
- package/dist/lenses/index.js.map +1 -1
- package/dist/mcpClient.d.ts +28 -0
- package/dist/mcpClient.js +668 -0
- package/dist/mcpClient.js.map +1 -0
- package/dist/modelRuntimeClient.d.ts +72 -0
- package/dist/modelRuntimeClient.js +704 -0
- package/dist/modelRuntimeClient.js.map +1 -0
- package/dist/nodes/index.d.ts +63 -21
- package/dist/nodes/index.js +3286 -1049
- package/dist/nodes/index.js.map +1 -1
- package/dist/ontologies/index.d.ts +53 -32
- package/dist/ontologies/index.js +3286 -1049
- package/dist/ontologies/index.js.map +1 -1
- package/dist/ontologyClient.d.ts +19 -25
- package/dist/ontologyClient.js +258 -40
- package/dist/ontologyClient.js.map +1 -1
- package/dist/ontologyLinksClient.d.ts +71 -0
- package/dist/ontologyLinksClient.js +697 -0
- package/dist/ontologyLinksClient.js.map +1 -0
- package/dist/orgGraphSearchClient.d.ts +85 -0
- package/dist/orgGraphSearchClient.js +672 -0
- package/dist/orgGraphSearchClient.js.map +1 -0
- package/dist/packsClient.d.ts +11 -23
- package/dist/packsClient.js +234 -46
- package/dist/packsClient.js.map +1 -1
- package/dist/policyClient.d.ts +13 -10
- package/dist/policyClient.js +243 -25
- package/dist/policyClient.js.map +1 -1
- package/dist/questions/index.d.ts +24 -4
- package/dist/questions/index.js +3286 -1049
- package/dist/questions/index.js.map +1 -1
- package/dist/realtime/index.d.ts +1 -1
- package/dist/reportsClient.d.ts +9 -7
- package/dist/reportsClient.js +281 -53
- package/dist/reportsClient.js.map +1 -1
- package/dist/schemaClient.d.ts +5 -3
- package/dist/schemaClient.js +235 -29
- package/dist/schemaClient.js.map +1 -1
- package/dist/sdkSurface.d.ts +8 -3
- package/dist/sdkSurface.js +10 -6
- package/dist/sdkSurface.js.map +1 -1
- package/dist/sourcesClient.d.ts +2 -0
- package/dist/sourcesClient.js +222 -14
- package/dist/sourcesClient.js.map +1 -1
- package/dist/telemetryClient.d.ts +94 -0
- package/dist/telemetryClient.js +741 -0
- package/dist/telemetryClient.js.map +1 -0
- package/dist/toolRegistryClient.d.ts +115 -0
- package/dist/toolRegistryClient.js +767 -0
- package/dist/toolRegistryClient.js.map +1 -0
- package/dist/topics/index.d.ts +35 -9
- package/dist/topics/index.js +3288 -1049
- package/dist/topics/index.js.map +1 -1
- package/dist/topicsClient.d.ts +4 -0
- package/dist/topicsClient.js +237 -24
- package/dist/topicsClient.js.map +1 -1
- package/dist/types.d.ts +5 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/workflowClient.d.ts +58 -40
- package/dist/workflowClient.js +243 -58
- package/dist/workflowClient.js.map +1 -1
- package/dist/worktrees/index.d.ts +69 -33
- package/dist/worktrees/index.js +3286 -1049
- package/dist/worktrees/index.js.map +1 -1
- package/package.json +12 -3
- package/dist/client-B6aWUUwp.d.ts +0 -2552
package/dist/identityClient.js
CHANGED
|
@@ -1,3 +1,170 @@
|
|
|
1
|
+
// src/authContext.ts
|
|
2
|
+
var LucernSdkAuthContextError = class extends Error {
|
|
3
|
+
reason;
|
|
4
|
+
constructor(reason, message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = "LucernSdkAuthContextError";
|
|
7
|
+
this.reason = reason;
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
function cleanString(value) {
|
|
11
|
+
const normalized = value?.trim();
|
|
12
|
+
return normalized ? normalized : void 0;
|
|
13
|
+
}
|
|
14
|
+
function cleanStringList(values) {
|
|
15
|
+
if (!values) {
|
|
16
|
+
return [];
|
|
17
|
+
}
|
|
18
|
+
return values.map((value) => value.trim()).filter(
|
|
19
|
+
(value, index, list) => value.length > 0 && list.indexOf(value) === index
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
function requireString(value, reason, label) {
|
|
23
|
+
const normalized = cleanString(value);
|
|
24
|
+
if (!normalized) {
|
|
25
|
+
throw new LucernSdkAuthContextError(
|
|
26
|
+
reason,
|
|
27
|
+
`Canonical Lucern SDK auth context is missing ${label}.`
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
return normalized;
|
|
31
|
+
}
|
|
32
|
+
function requirePrincipalType(principalType) {
|
|
33
|
+
if (!principalType) {
|
|
34
|
+
throw new LucernSdkAuthContextError(
|
|
35
|
+
"principal_missing",
|
|
36
|
+
"Canonical Lucern SDK auth context is missing principalType."
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
return principalType;
|
|
40
|
+
}
|
|
41
|
+
function requireAuthMode(authMode) {
|
|
42
|
+
if (!authMode) {
|
|
43
|
+
throw new LucernSdkAuthContextError(
|
|
44
|
+
"principal_missing",
|
|
45
|
+
"Canonical Lucern SDK auth context is missing authMode."
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
return authMode;
|
|
49
|
+
}
|
|
50
|
+
function ensurePermitMatch(args) {
|
|
51
|
+
const actual = cleanString(args.actual);
|
|
52
|
+
if (actual && actual !== args.expected) {
|
|
53
|
+
throw new LucernSdkAuthContextError(
|
|
54
|
+
"policy_denied",
|
|
55
|
+
`Canonical Lucern SDK auth context has conflicting Permit ${args.field}.`
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function normalizeCanonicalLucernAuthContext(input) {
|
|
60
|
+
if (!input) {
|
|
61
|
+
throw new LucernSdkAuthContextError(
|
|
62
|
+
"principal_missing",
|
|
63
|
+
"Canonical Lucern SDK auth context is required."
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
if (input.policyDecision === "deny") {
|
|
67
|
+
throw new LucernSdkAuthContextError(
|
|
68
|
+
"policy_denied",
|
|
69
|
+
"Canonical Lucern SDK auth context carries a denied policy decision."
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
const principalId = requireString(
|
|
73
|
+
input.principalId,
|
|
74
|
+
"principal_missing",
|
|
75
|
+
"principalId"
|
|
76
|
+
);
|
|
77
|
+
const tenantId = requireString(input.tenantId, "tenant_missing", "tenantId");
|
|
78
|
+
const workspaceId = requireString(
|
|
79
|
+
input.workspaceId,
|
|
80
|
+
"workspace_missing",
|
|
81
|
+
"workspaceId"
|
|
82
|
+
);
|
|
83
|
+
const roles = cleanStringList(input.roles);
|
|
84
|
+
const scopes = cleanStringList(input.scopes);
|
|
85
|
+
const principalType = requirePrincipalType(input.principalType);
|
|
86
|
+
const authMode = requireAuthMode(input.authMode);
|
|
87
|
+
const roleBasedInteractiveAuth = authMode === "interactive_user" && roles.length > 0;
|
|
88
|
+
if (roles.length === 0 || scopes.length === 0 && !roleBasedInteractiveAuth) {
|
|
89
|
+
throw new LucernSdkAuthContextError(
|
|
90
|
+
"membership_missing",
|
|
91
|
+
"Canonical Lucern SDK auth context requires non-empty roles and scopes."
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
const subject = cleanString(input.permit?.subject) ?? principalId;
|
|
95
|
+
const tenant = cleanString(input.permit?.tenant) ?? tenantId;
|
|
96
|
+
const workspace = cleanString(input.permit?.workspace) ?? workspaceId;
|
|
97
|
+
ensurePermitMatch({
|
|
98
|
+
field: "subject",
|
|
99
|
+
expected: principalId,
|
|
100
|
+
actual: subject
|
|
101
|
+
});
|
|
102
|
+
ensurePermitMatch({ field: "tenant", expected: tenantId, actual: tenant });
|
|
103
|
+
ensurePermitMatch({
|
|
104
|
+
field: "workspace",
|
|
105
|
+
expected: workspaceId,
|
|
106
|
+
actual: workspace
|
|
107
|
+
});
|
|
108
|
+
const context = input.permit?.context ? { ...input.permit.context } : void 0;
|
|
109
|
+
return {
|
|
110
|
+
clerkId: cleanString(input.clerkId),
|
|
111
|
+
principalId,
|
|
112
|
+
tenantId,
|
|
113
|
+
workspaceId,
|
|
114
|
+
principalType,
|
|
115
|
+
authMode,
|
|
116
|
+
roles,
|
|
117
|
+
scopes,
|
|
118
|
+
delegationChain: input.delegationChain ? [...input.delegationChain] : [],
|
|
119
|
+
policyTraceId: cleanString(input.policyTraceId),
|
|
120
|
+
correlationId: cleanString(input.correlationId),
|
|
121
|
+
membershipId: cleanString(input.membershipId),
|
|
122
|
+
permit: {
|
|
123
|
+
subject,
|
|
124
|
+
tenant,
|
|
125
|
+
workspace,
|
|
126
|
+
resource: cleanString(input.permit?.resource),
|
|
127
|
+
action: cleanString(input.permit?.action),
|
|
128
|
+
relation: cleanString(input.permit?.relation),
|
|
129
|
+
context
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
function createCanonicalAuthHeaders(authContext) {
|
|
134
|
+
const headers = {
|
|
135
|
+
"x-lucern-principal-id": authContext.principalId,
|
|
136
|
+
"x-lucern-principal-type": authContext.principalType,
|
|
137
|
+
"x-lucern-tenant": authContext.tenantId,
|
|
138
|
+
"x-lucern-tenant-id": authContext.tenantId,
|
|
139
|
+
"x-lucern-workspace": authContext.workspaceId,
|
|
140
|
+
"x-lucern-workspace-id": authContext.workspaceId,
|
|
141
|
+
"x-lucern-auth-mode": authContext.authMode,
|
|
142
|
+
"x-lucern-roles": authContext.roles.join(","),
|
|
143
|
+
"x-lucern-scopes": authContext.scopes.join(","),
|
|
144
|
+
"x-lucern-permit-context": JSON.stringify(authContext.permit)
|
|
145
|
+
};
|
|
146
|
+
if (authContext.clerkId) {
|
|
147
|
+
headers["x-lucern-clerk-id"] = authContext.clerkId;
|
|
148
|
+
headers["x-lucern-user-id"] = authContext.clerkId;
|
|
149
|
+
}
|
|
150
|
+
if (authContext.delegationChain.length > 0) {
|
|
151
|
+
headers["x-lucern-delegation-chain"] = JSON.stringify(
|
|
152
|
+
authContext.delegationChain
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
if (authContext.policyTraceId) {
|
|
156
|
+
headers["x-lucern-policy-trace-id"] = authContext.policyTraceId;
|
|
157
|
+
}
|
|
158
|
+
if (authContext.correlationId) {
|
|
159
|
+
headers["x-correlation-id"] = authContext.correlationId;
|
|
160
|
+
headers["x-lucern-correlation-id"] = authContext.correlationId;
|
|
161
|
+
}
|
|
162
|
+
if (authContext.membershipId) {
|
|
163
|
+
headers["x-lucern-membership-id"] = authContext.membershipId;
|
|
164
|
+
}
|
|
165
|
+
return headers;
|
|
166
|
+
}
|
|
167
|
+
|
|
1
168
|
// src/coreClient.ts
|
|
2
169
|
var LucernApiError = class extends Error {
|
|
3
170
|
code;
|
|
@@ -65,9 +232,7 @@ function generatePortableRequestId() {
|
|
|
65
232
|
8
|
|
66
233
|
).join("")}-${hex.slice(8, 10).join("")}-${hex.slice(10).join("")}`;
|
|
67
234
|
}
|
|
68
|
-
|
|
69
|
-
return generatePortableRequestId();
|
|
70
|
-
}
|
|
235
|
+
var randomIdempotencyKey = generatePortableRequestId;
|
|
71
236
|
function isRetryableStatus(status) {
|
|
72
237
|
return status >= 500 || status === 408 || status === 429;
|
|
73
238
|
}
|
|
@@ -132,8 +297,11 @@ function timeoutError(timeoutMs) {
|
|
|
132
297
|
error.name = "AbortError";
|
|
133
298
|
return error;
|
|
134
299
|
}
|
|
300
|
+
function isRecord(value) {
|
|
301
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
302
|
+
}
|
|
135
303
|
function readPolicySummaryFromDetails(details) {
|
|
136
|
-
if (!
|
|
304
|
+
if (!isRecord(details)) {
|
|
137
305
|
return null;
|
|
138
306
|
}
|
|
139
307
|
const directSummary = details.summary;
|
|
@@ -141,11 +309,11 @@ function readPolicySummaryFromDetails(details) {
|
|
|
141
309
|
return directSummary.trim();
|
|
142
310
|
}
|
|
143
311
|
const policy = details.policy;
|
|
144
|
-
if (!
|
|
312
|
+
if (!isRecord(policy)) {
|
|
145
313
|
return null;
|
|
146
314
|
}
|
|
147
315
|
const explanation = policy.explanation;
|
|
148
|
-
if (!
|
|
316
|
+
if (!isRecord(explanation)) {
|
|
149
317
|
return null;
|
|
150
318
|
}
|
|
151
319
|
const nestedSummary = explanation.summary;
|
|
@@ -154,16 +322,41 @@ function readPolicySummaryFromDetails(details) {
|
|
|
154
322
|
}
|
|
155
323
|
return null;
|
|
156
324
|
}
|
|
325
|
+
async function resolveConfiguredAuthContext(authContext) {
|
|
326
|
+
if (typeof authContext === "function") {
|
|
327
|
+
return await authContext();
|
|
328
|
+
}
|
|
329
|
+
return authContext;
|
|
330
|
+
}
|
|
331
|
+
function mergeHeaderRecord(base, addition) {
|
|
332
|
+
const headers = new Headers(base);
|
|
333
|
+
for (const [key, value] of Object.entries(addition)) {
|
|
334
|
+
const existing = headers.get(key);
|
|
335
|
+
if (existing !== null && existing !== value) {
|
|
336
|
+
throw new LucernSdkAuthContextError(
|
|
337
|
+
"policy_denied",
|
|
338
|
+
`Canonical Lucern SDK auth context conflicts with existing ${key} header.`
|
|
339
|
+
);
|
|
340
|
+
}
|
|
341
|
+
headers.set(key, value);
|
|
342
|
+
}
|
|
343
|
+
return Object.fromEntries(headers.entries());
|
|
344
|
+
}
|
|
157
345
|
function createGatewayRequestClient(config = {}) {
|
|
158
346
|
const fetchImpl = config.fetchImpl ?? fetch;
|
|
159
347
|
const baseUrl = config.baseUrl?.replace(/\/+$/, "") ?? "";
|
|
160
348
|
const maxRetries = config.maxRetries ?? 2;
|
|
161
349
|
const requestIdFactory = config.requestIdFactory ?? (() => generatePortableRequestId());
|
|
162
350
|
async function resolveAuthHeaders() {
|
|
163
|
-
|
|
164
|
-
|
|
351
|
+
const base = config.getAuthHeaders ? await config.getAuthHeaders() : {};
|
|
352
|
+
const authContextInput = await resolveConfiguredAuthContext(
|
|
353
|
+
config.authContext
|
|
354
|
+
);
|
|
355
|
+
if (!authContextInput && !config.requireCanonicalAuthContext) {
|
|
356
|
+
return base;
|
|
165
357
|
}
|
|
166
|
-
|
|
358
|
+
const authContext = normalizeCanonicalLucernAuthContext(authContextInput);
|
|
359
|
+
return mergeHeaderRecord(base, createCanonicalAuthHeaders(authContext));
|
|
167
360
|
}
|
|
168
361
|
async function fetchWithTimeout(url, init, timeoutMs) {
|
|
169
362
|
const controller = new AbortController();
|
|
@@ -184,11 +377,11 @@ function createGatewayRequestClient(config = {}) {
|
|
|
184
377
|
if (!text) {
|
|
185
378
|
return null;
|
|
186
379
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
} catch {
|
|
380
|
+
const parsed = tryParseGatewayEnvelopeJson(text);
|
|
381
|
+
if (!parsed.ok) {
|
|
190
382
|
return null;
|
|
191
383
|
}
|
|
384
|
+
return isRecord(parsed.value) ? parsed.value : null;
|
|
192
385
|
}
|
|
193
386
|
function resolveTimeoutMs(method, requestTimeoutMs) {
|
|
194
387
|
if (typeof requestTimeoutMs === "number") {
|
|
@@ -200,16 +393,31 @@ function createGatewayRequestClient(config = {}) {
|
|
|
200
393
|
}
|
|
201
394
|
return config.timeoutMs ?? 15e3;
|
|
202
395
|
}
|
|
396
|
+
function tryParseGatewayEnvelopeJson(text) {
|
|
397
|
+
const trimmed = text.trim();
|
|
398
|
+
if (!trimmed.startsWith("{") && !trimmed.startsWith("[")) {
|
|
399
|
+
return { ok: false, reason: "non-json" };
|
|
400
|
+
}
|
|
401
|
+
try {
|
|
402
|
+
return { ok: true, value: JSON.parse(trimmed) };
|
|
403
|
+
} catch (error) {
|
|
404
|
+
if (error instanceof SyntaxError) {
|
|
405
|
+
return { ok: false, reason: "invalid-json", error };
|
|
406
|
+
}
|
|
407
|
+
throw error;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
203
410
|
function buildApiError(args) {
|
|
204
411
|
const failure = args.failure;
|
|
205
|
-
const legacyError = failure &&
|
|
412
|
+
const legacyError = failure && isRecord(failure.error) ? failure.error : failure?.legacyError;
|
|
206
413
|
const correlationId = failure?.correlationId ?? args.response.headers.get("x-lucern-correlation-id")?.trim() ?? args.requestId;
|
|
207
414
|
const policyTraceId = failure?.policyTraceId ?? args.response.headers.get("x-lucern-policy-trace-id")?.trim() ?? null;
|
|
208
415
|
const details = failure?.details ?? legacyError?.details;
|
|
209
416
|
const policySummary = readPolicySummaryFromDetails(details);
|
|
417
|
+
const failureMessage = typeof failure?.error === "string" ? failure.error : legacyError?.message;
|
|
210
418
|
return new LucernApiError({
|
|
211
419
|
code: failure?.code ?? legacyError?.code ?? fallbackErrorCode(args.response.status),
|
|
212
|
-
message: policySummary ??
|
|
420
|
+
message: policySummary ?? failureMessage ?? (args.response.ok ? "Platform API returned an invalid success payload." : "Platform API request failed."),
|
|
213
421
|
status: args.response.status,
|
|
214
422
|
invariant: failure?.invariant,
|
|
215
423
|
suggestion: failure?.suggestion,
|
|
@@ -341,7 +549,10 @@ function createListResult(items, legacyKey) {
|
|
|
341
549
|
total: items.length
|
|
342
550
|
};
|
|
343
551
|
if (legacyKey) {
|
|
344
|
-
|
|
552
|
+
return {
|
|
553
|
+
...result,
|
|
554
|
+
[legacyKey]: items
|
|
555
|
+
};
|
|
345
556
|
}
|
|
346
557
|
return result;
|
|
347
558
|
}
|
|
@@ -352,6 +563,43 @@ function mapGatewayData(response, mapper) {
|
|
|
352
563
|
};
|
|
353
564
|
}
|
|
354
565
|
|
|
566
|
+
// src/boundaryClientSurface.ts
|
|
567
|
+
function cleanOptionalString(value) {
|
|
568
|
+
const normalized = value?.trim();
|
|
569
|
+
return normalized ? normalized : void 0;
|
|
570
|
+
}
|
|
571
|
+
function isRecord2(value) {
|
|
572
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
573
|
+
}
|
|
574
|
+
function cleanRequiredString(value, label) {
|
|
575
|
+
const normalized = cleanOptionalString(value);
|
|
576
|
+
if (!normalized) {
|
|
577
|
+
throw new Error(`${label} is required`);
|
|
578
|
+
}
|
|
579
|
+
return normalized;
|
|
580
|
+
}
|
|
581
|
+
function assertKnownKeys(input, allowed, operation) {
|
|
582
|
+
const allowedSet = new Set(allowed);
|
|
583
|
+
const unknownKeys = Object.keys(input).filter((key) => !allowedSet.has(key));
|
|
584
|
+
if (unknownKeys.length > 0) {
|
|
585
|
+
throw new Error(
|
|
586
|
+
`${operation} received unsupported field(s): ${unknownKeys.join(", ")}`
|
|
587
|
+
);
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
function knownPayload(input, allowed, operation) {
|
|
591
|
+
assertKnownKeys(input, allowed, operation);
|
|
592
|
+
return { ...input };
|
|
593
|
+
}
|
|
594
|
+
function listResultFromEnvelope(data, legacyKey) {
|
|
595
|
+
const record = isRecord2(data) ? data : {};
|
|
596
|
+
const legacyItems = record[legacyKey];
|
|
597
|
+
return createListResult(
|
|
598
|
+
Array.isArray(legacyItems) ? legacyItems : Array.isArray(data) ? data : [],
|
|
599
|
+
legacyKey
|
|
600
|
+
);
|
|
601
|
+
}
|
|
602
|
+
|
|
355
603
|
// src/identityClient.ts
|
|
356
604
|
function createIdentityWhoamiClient(config = {}) {
|
|
357
605
|
const gateway = createGatewayRequestClient(config);
|
|
@@ -363,6 +611,37 @@ function createIdentityWhoamiClient(config = {}) {
|
|
|
363
611
|
}
|
|
364
612
|
};
|
|
365
613
|
}
|
|
614
|
+
var TENANT_IDENTITY_FIELDS = [
|
|
615
|
+
"tenantId",
|
|
616
|
+
"workspaceId",
|
|
617
|
+
"principalId",
|
|
618
|
+
"integrationKey",
|
|
619
|
+
"secretRef",
|
|
620
|
+
"policySubject",
|
|
621
|
+
"policyAction",
|
|
622
|
+
"policyResource",
|
|
623
|
+
"decision",
|
|
624
|
+
"config",
|
|
625
|
+
"configKey",
|
|
626
|
+
"configValue",
|
|
627
|
+
"provider",
|
|
628
|
+
"status",
|
|
629
|
+
"metadata",
|
|
630
|
+
"limit",
|
|
631
|
+
"cursor"
|
|
632
|
+
];
|
|
633
|
+
function tenantIdentityQuery(input) {
|
|
634
|
+
return {
|
|
635
|
+
tenantId: cleanRequiredString(input.tenantId, "tenantId"),
|
|
636
|
+
workspaceId: input.workspaceId,
|
|
637
|
+
principalId: input.principalId,
|
|
638
|
+
limit: input.limit,
|
|
639
|
+
cursor: input.cursor
|
|
640
|
+
};
|
|
641
|
+
}
|
|
642
|
+
function tenantIdentityBody(input, operation) {
|
|
643
|
+
return knownPayload(input, TENANT_IDENTITY_FIELDS, operation);
|
|
644
|
+
}
|
|
366
645
|
function createIdentityClient(config = {}) {
|
|
367
646
|
const gateway = createGatewayRequestClient(config);
|
|
368
647
|
const whoamiClient = createIdentityWhoamiClient(config);
|
|
@@ -372,6 +651,13 @@ function createIdentityClient(config = {}) {
|
|
|
372
651
|
body: input,
|
|
373
652
|
idempotencyKey: idempotencyKey ?? randomIdempotencyKey()
|
|
374
653
|
});
|
|
654
|
+
const updatePrincipal = (input, idempotencyKey) => requestPrincipalWrite("PATCH", input, idempotencyKey);
|
|
655
|
+
const deleteKey = (keyId, input = {}, idempotencyKey) => gateway.request({
|
|
656
|
+
path: `/api/platform/v1/identity/keys/${encodeURIComponent(keyId)}/revoke`,
|
|
657
|
+
method: "POST",
|
|
658
|
+
body: input,
|
|
659
|
+
idempotencyKey: idempotencyKey ?? randomIdempotencyKey()
|
|
660
|
+
});
|
|
375
661
|
return {
|
|
376
662
|
/**
|
|
377
663
|
* Resolve the current authenticated identity summary.
|
|
@@ -420,15 +706,11 @@ function createIdentityClient(config = {}) {
|
|
|
420
706
|
/**
|
|
421
707
|
* Update a principal.
|
|
422
708
|
*/
|
|
423
|
-
|
|
424
|
-
return requestPrincipalWrite("PATCH", input, idempotencyKey);
|
|
425
|
-
},
|
|
709
|
+
updatePrincipal,
|
|
426
710
|
/**
|
|
427
711
|
* @deprecated Use createPrincipal or updatePrincipal.
|
|
428
712
|
*/
|
|
429
|
-
|
|
430
|
-
return requestPrincipalWrite("PATCH", input, idempotencyKey);
|
|
431
|
-
},
|
|
713
|
+
upsertPrincipal: updatePrincipal,
|
|
432
714
|
/**
|
|
433
715
|
* List keys in the current identity scope.
|
|
434
716
|
*/
|
|
@@ -467,20 +749,11 @@ function createIdentityClient(config = {}) {
|
|
|
467
749
|
/**
|
|
468
750
|
* Delete an API key by revoking it.
|
|
469
751
|
*/
|
|
470
|
-
|
|
471
|
-
return gateway.request({
|
|
472
|
-
path: `/api/platform/v1/identity/keys/${encodeURIComponent(keyId)}/revoke`,
|
|
473
|
-
method: "POST",
|
|
474
|
-
body: input,
|
|
475
|
-
idempotencyKey: idempotencyKey ?? randomIdempotencyKey()
|
|
476
|
-
});
|
|
477
|
-
},
|
|
752
|
+
deleteKey,
|
|
478
753
|
/**
|
|
479
754
|
* @deprecated Use deleteKey.
|
|
480
755
|
*/
|
|
481
|
-
|
|
482
|
-
return this.deleteKey(keyId, input, idempotencyKey);
|
|
483
|
-
},
|
|
756
|
+
revokeKey: deleteKey,
|
|
484
757
|
/**
|
|
485
758
|
* Search Clerk users by email or display attributes.
|
|
486
759
|
*/
|
|
@@ -488,10 +761,113 @@ function createIdentityClient(config = {}) {
|
|
|
488
761
|
return gateway.request({
|
|
489
762
|
path: `/api/platform/v1/identity/clerk-users${toQueryString({ q })}`
|
|
490
763
|
});
|
|
764
|
+
},
|
|
765
|
+
async getTenantConfig(input) {
|
|
766
|
+
return gateway.request({
|
|
767
|
+
path: `/api/platform/v1/identity/tenant-config${toQueryString(
|
|
768
|
+
tenantIdentityQuery(input)
|
|
769
|
+
)}`
|
|
770
|
+
});
|
|
771
|
+
},
|
|
772
|
+
async updateTenantConfig(input, idempotencyKey) {
|
|
773
|
+
cleanRequiredString(input.tenantId, "tenantId");
|
|
774
|
+
return gateway.request({
|
|
775
|
+
path: "/api/platform/v1/identity/tenant-config",
|
|
776
|
+
method: "PATCH",
|
|
777
|
+
body: tenantIdentityBody(
|
|
778
|
+
input,
|
|
779
|
+
"identity.updateTenantConfig"
|
|
780
|
+
),
|
|
781
|
+
idempotencyKey: idempotencyKey ?? randomIdempotencyKey()
|
|
782
|
+
});
|
|
783
|
+
},
|
|
784
|
+
async listIntegrations(input) {
|
|
785
|
+
return gateway.request({
|
|
786
|
+
path: `/api/platform/v1/identity/integrations${toQueryString(
|
|
787
|
+
tenantIdentityQuery(input)
|
|
788
|
+
)}`
|
|
789
|
+
}).then(
|
|
790
|
+
(response) => mapGatewayData(
|
|
791
|
+
response,
|
|
792
|
+
(data) => listResultFromEnvelope(
|
|
793
|
+
data,
|
|
794
|
+
"integrations"
|
|
795
|
+
)
|
|
796
|
+
)
|
|
797
|
+
);
|
|
798
|
+
},
|
|
799
|
+
async upsertIntegration(input, idempotencyKey) {
|
|
800
|
+
cleanRequiredString(input.tenantId, "tenantId");
|
|
801
|
+
cleanRequiredString(input.integrationKey, "integrationKey");
|
|
802
|
+
return gateway.request({
|
|
803
|
+
path: "/api/platform/v1/identity/integrations",
|
|
804
|
+
method: "PUT",
|
|
805
|
+
body: tenantIdentityBody(
|
|
806
|
+
input,
|
|
807
|
+
"identity.upsertIntegration"
|
|
808
|
+
),
|
|
809
|
+
idempotencyKey: idempotencyKey ?? randomIdempotencyKey()
|
|
810
|
+
});
|
|
811
|
+
},
|
|
812
|
+
async listSecrets(input) {
|
|
813
|
+
return gateway.request({
|
|
814
|
+
path: `/api/platform/v1/identity/secrets${toQueryString(
|
|
815
|
+
tenantIdentityQuery(input)
|
|
816
|
+
)}`
|
|
817
|
+
}).then(
|
|
818
|
+
(response) => mapGatewayData(
|
|
819
|
+
response,
|
|
820
|
+
(data) => listResultFromEnvelope(
|
|
821
|
+
data,
|
|
822
|
+
"secrets"
|
|
823
|
+
)
|
|
824
|
+
)
|
|
825
|
+
);
|
|
826
|
+
},
|
|
827
|
+
async putSecretReference(input, idempotencyKey) {
|
|
828
|
+
cleanRequiredString(input.tenantId, "tenantId");
|
|
829
|
+
cleanRequiredString(input.secretRef, "secretRef");
|
|
830
|
+
return gateway.request({
|
|
831
|
+
path: "/api/platform/v1/identity/secrets",
|
|
832
|
+
method: "PUT",
|
|
833
|
+
body: tenantIdentityBody(
|
|
834
|
+
input,
|
|
835
|
+
"identity.putSecretReference"
|
|
836
|
+
),
|
|
837
|
+
idempotencyKey: idempotencyKey ?? randomIdempotencyKey()
|
|
838
|
+
});
|
|
839
|
+
},
|
|
840
|
+
async evaluatePolicy(input, idempotencyKey) {
|
|
841
|
+
cleanRequiredString(input.tenantId, "tenantId");
|
|
842
|
+
cleanRequiredString(input.policySubject, "policySubject");
|
|
843
|
+
cleanRequiredString(input.policyAction, "policyAction");
|
|
844
|
+
cleanRequiredString(input.policyResource, "policyResource");
|
|
845
|
+
return gateway.request({
|
|
846
|
+
path: "/api/platform/v1/identity/policy/evaluate",
|
|
847
|
+
method: "POST",
|
|
848
|
+
body: tenantIdentityBody(
|
|
849
|
+
input,
|
|
850
|
+
"identity.evaluatePolicy"
|
|
851
|
+
),
|
|
852
|
+
idempotencyKey: idempotencyKey ?? randomIdempotencyKey()
|
|
853
|
+
});
|
|
854
|
+
},
|
|
855
|
+
async recordPolicyDecision(input, idempotencyKey) {
|
|
856
|
+
cleanRequiredString(input.tenantId, "tenantId");
|
|
857
|
+
cleanRequiredString(input.decision, "decision");
|
|
858
|
+
return gateway.request({
|
|
859
|
+
path: "/api/platform/v1/identity/policy/decisions",
|
|
860
|
+
method: "POST",
|
|
861
|
+
body: tenantIdentityBody(
|
|
862
|
+
input,
|
|
863
|
+
"identity.recordPolicyDecision"
|
|
864
|
+
),
|
|
865
|
+
idempotencyKey: idempotencyKey ?? randomIdempotencyKey()
|
|
866
|
+
});
|
|
491
867
|
}
|
|
492
868
|
};
|
|
493
869
|
}
|
|
494
870
|
|
|
495
|
-
export { LucernApiError, createIdentityClient };
|
|
871
|
+
export { LucernApiError, TENANT_IDENTITY_FIELDS, createIdentityClient };
|
|
496
872
|
//# sourceMappingURL=identityClient.js.map
|
|
497
873
|
//# sourceMappingURL=identityClient.js.map
|