@auctra/sdk 0.6.0 → 0.6.2
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 +16 -0
- package/README.md +5 -4
- package/dist/cjs/action.js +2 -0
- package/dist/cjs/artifacts.js +110 -0
- package/dist/cjs/authority.js +2 -0
- package/dist/cjs/client.js +355 -0
- package/dist/cjs/evidence.js +6 -0
- package/dist/cjs/index.js +16 -455
- package/dist/cjs/types.js +7 -0
- package/dist/esm/action.d.ts +3 -0
- package/dist/esm/action.d.ts.map +1 -0
- package/dist/esm/action.js +1 -0
- package/dist/esm/artifacts.d.ts +28 -0
- package/dist/esm/artifacts.d.ts.map +1 -0
- package/dist/esm/artifacts.js +102 -0
- package/dist/esm/authority.d.ts +3 -0
- package/dist/esm/authority.d.ts.map +1 -0
- package/dist/esm/authority.js +1 -0
- package/dist/esm/client.d.ts +195 -0
- package/dist/esm/client.d.ts.map +1 -0
- package/dist/esm/client.js +351 -0
- package/dist/esm/evidence.d.ts +4 -0
- package/dist/esm/evidence.d.ts.map +1 -0
- package/dist/esm/evidence.js +1 -0
- package/dist/esm/index.d.ts +10 -688
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +9 -450
- package/dist/esm/types.d.ts +477 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +4 -0
- package/package.json +1 -1
- package/src/action.ts +2 -0
- package/src/artifacts.ts +140 -0
- package/src/authority.ts +2 -0
- package/src/client.ts +555 -0
- package/src/evidence.ts +9 -0
- package/src/index.ts +10 -1125
- package/src/types.ts +488 -0
package/src/types.ts
ADDED
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
/** @auctra/sdk — Authority Protocol client (Stage 1.0 modular layout). */
|
|
2
|
+
|
|
3
|
+
export const AUCTRA_SDK_VERSION = "0.6.2";
|
|
4
|
+
|
|
5
|
+
/** Production API + console host (Architecture A: colocated on app.auctra.tech). */
|
|
6
|
+
export const DEFAULT_BASE_URL = "https://app.auctra.tech";
|
|
7
|
+
|
|
8
|
+
export type AgentEnvironment = "dev" | "staging" | "production";
|
|
9
|
+
export type AuthorityLevel = "low" | "medium" | "high" | "critical";
|
|
10
|
+
export type Decision = "allowed" | "blocked" | "require_approval";
|
|
11
|
+
export type PolicyType = "spending" | "data_access" | "communication" | "approval";
|
|
12
|
+
export type ActorType = "human" | "agent" | "service" | "tool";
|
|
13
|
+
export type RiskLevel = "low" | "medium" | "high" | "critical";
|
|
14
|
+
export type IntentStatus = "active" | "expired" | "completed" | "revoked" | "suspended";
|
|
15
|
+
|
|
16
|
+
export type EvaluateActionInput = {
|
|
17
|
+
agentId: string;
|
|
18
|
+
actionType: string;
|
|
19
|
+
payload?: Record<string, unknown>;
|
|
20
|
+
claimedIntentId?: string;
|
|
21
|
+
intentAnchorToken?: string;
|
|
22
|
+
parentActionId?: string;
|
|
23
|
+
actor?: {
|
|
24
|
+
id?: string;
|
|
25
|
+
type?: ActorType;
|
|
26
|
+
name?: string;
|
|
27
|
+
};
|
|
28
|
+
action?: {
|
|
29
|
+
target?: string;
|
|
30
|
+
description?: string;
|
|
31
|
+
riskLevel?: RiskLevel;
|
|
32
|
+
metadata?: Record<string, unknown>;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export type EvaluateActionResponse = {
|
|
37
|
+
decision: Decision;
|
|
38
|
+
risk_score: number;
|
|
39
|
+
reason: string;
|
|
40
|
+
delegation_id: string | null;
|
|
41
|
+
authority_id: string | null;
|
|
42
|
+
delegator: string | null;
|
|
43
|
+
sponsor: string;
|
|
44
|
+
matched_policies: string[];
|
|
45
|
+
action_request_id: string;
|
|
46
|
+
evidence: DecisionEvidence;
|
|
47
|
+
evidence_payload: DecisionEvidencePayload;
|
|
48
|
+
protocol?: {
|
|
49
|
+
version: string;
|
|
50
|
+
action?: Record<string, unknown>;
|
|
51
|
+
decision?: Record<string, unknown>;
|
|
52
|
+
};
|
|
53
|
+
intelligence?: {
|
|
54
|
+
authority_valid: boolean;
|
|
55
|
+
root_intent_valid: boolean;
|
|
56
|
+
intent_status: string;
|
|
57
|
+
trust_summary?: string;
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export type RequestOptions = {
|
|
62
|
+
idempotencyKey?: string;
|
|
63
|
+
signal?: AbortSignal;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export type AuctraClientOptions = {
|
|
67
|
+
apiKey: string;
|
|
68
|
+
/** Defaults to {@link DEFAULT_BASE_URL}. Override for staging/local. */
|
|
69
|
+
baseUrl?: string;
|
|
70
|
+
timeoutMs?: number;
|
|
71
|
+
maxRetries?: number;
|
|
72
|
+
fetch?: typeof fetch;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
export type Agent = {
|
|
76
|
+
id: string;
|
|
77
|
+
identity_id: string;
|
|
78
|
+
name: string;
|
|
79
|
+
description: string | null;
|
|
80
|
+
model_provider: "openai" | "anthropic" | "gemini" | "local";
|
|
81
|
+
model_name: string;
|
|
82
|
+
environment: AgentEnvironment;
|
|
83
|
+
authority_level: AuthorityLevel;
|
|
84
|
+
status: "active" | "suspended" | "restricted" | "compromised";
|
|
85
|
+
trust_rating: number;
|
|
86
|
+
sponsor: { id: string; full_name: string; email: string };
|
|
87
|
+
created_at: string;
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
export type CreateAgentInput = {
|
|
91
|
+
name: string;
|
|
92
|
+
modelProvider: Agent["model_provider"];
|
|
93
|
+
modelName: string;
|
|
94
|
+
description?: string;
|
|
95
|
+
environment?: AgentEnvironment;
|
|
96
|
+
authorityLevel?: AuthorityLevel;
|
|
97
|
+
sponsorUserId?: string;
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
export type Delegation = {
|
|
101
|
+
id: string;
|
|
102
|
+
agent: { id: string; name: string };
|
|
103
|
+
delegator: { id: string; full_name: string; email: string };
|
|
104
|
+
scope: { action_types: string[] };
|
|
105
|
+
limits: {
|
|
106
|
+
max_amount?: number;
|
|
107
|
+
max_count?: number;
|
|
108
|
+
currency?: string;
|
|
109
|
+
environment?: AgentEnvironment;
|
|
110
|
+
max_actions_per_window?: {
|
|
111
|
+
count: number;
|
|
112
|
+
window_seconds: number;
|
|
113
|
+
action_type?: string;
|
|
114
|
+
};
|
|
115
|
+
max_amount_per_window?: {
|
|
116
|
+
amount: number;
|
|
117
|
+
window_seconds: number;
|
|
118
|
+
};
|
|
119
|
+
};
|
|
120
|
+
valid_from: string;
|
|
121
|
+
valid_until: string;
|
|
122
|
+
status: "active" | "revoked" | "expired";
|
|
123
|
+
is_active: boolean;
|
|
124
|
+
mandate?: MandateEvidence | null;
|
|
125
|
+
mandate_payload?: MandatePayload | null;
|
|
126
|
+
evidence?: DecisionEvidence | null;
|
|
127
|
+
evidence_payload?: DecisionEvidencePayload | null;
|
|
128
|
+
created_at: string;
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
export type CreateDelegationInput = {
|
|
132
|
+
agentId: string;
|
|
133
|
+
actionTypes: string[];
|
|
134
|
+
validUntil: string;
|
|
135
|
+
maxAmount?: number;
|
|
136
|
+
maxCount?: number;
|
|
137
|
+
environment?: AgentEnvironment;
|
|
138
|
+
currency?: string;
|
|
139
|
+
delegatorUserId?: string;
|
|
140
|
+
/** Parent authority/delegation id for subset-constrained delegation chains. */
|
|
141
|
+
parentAuthorityId?: string;
|
|
142
|
+
parentDelegationId?: string;
|
|
143
|
+
maxDelegationDepth?: number;
|
|
144
|
+
maxActionsPerWindow?: {
|
|
145
|
+
count: number;
|
|
146
|
+
windowSeconds: number;
|
|
147
|
+
actionType?: string;
|
|
148
|
+
};
|
|
149
|
+
maxAmountPerWindow?: {
|
|
150
|
+
amount: number;
|
|
151
|
+
windowSeconds: number;
|
|
152
|
+
};
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
export type AuthoritySummary = {
|
|
156
|
+
id: string;
|
|
157
|
+
protocol_version: string;
|
|
158
|
+
status: string;
|
|
159
|
+
payload_hash: string;
|
|
160
|
+
signed: boolean;
|
|
161
|
+
parent_authority_id: string | null;
|
|
162
|
+
capabilities: unknown;
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
export type IssueAuthorityInput = {
|
|
166
|
+
/** Subject agent id */
|
|
167
|
+
subject: string;
|
|
168
|
+
capabilities: string[];
|
|
169
|
+
expiresAt: string;
|
|
170
|
+
constraints?: {
|
|
171
|
+
maxAmount?: number;
|
|
172
|
+
currency?: string;
|
|
173
|
+
maxCount?: number;
|
|
174
|
+
environment?: AgentEnvironment;
|
|
175
|
+
};
|
|
176
|
+
delegation?: {
|
|
177
|
+
allowed?: boolean;
|
|
178
|
+
maxDepth?: number;
|
|
179
|
+
};
|
|
180
|
+
issuer?: string;
|
|
181
|
+
delegatorUserId?: string;
|
|
182
|
+
maxActionsPerWindow?: {
|
|
183
|
+
count: number;
|
|
184
|
+
windowSeconds: number;
|
|
185
|
+
actionType?: string;
|
|
186
|
+
};
|
|
187
|
+
maxAmountPerWindow?: {
|
|
188
|
+
amount: number;
|
|
189
|
+
windowSeconds: number;
|
|
190
|
+
};
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
export type DelegateAuthorityInput = IssueAuthorityInput & {
|
|
194
|
+
/** Parent authority id — child must be a subset of parent */
|
|
195
|
+
parent: string;
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
export type ActionRequest = {
|
|
199
|
+
id: string;
|
|
200
|
+
agent_name: string;
|
|
201
|
+
action_type: string;
|
|
202
|
+
action_summary: string;
|
|
203
|
+
payload: Record<string, unknown>;
|
|
204
|
+
decision: string;
|
|
205
|
+
decision_reason: string | null;
|
|
206
|
+
risk_score: number;
|
|
207
|
+
delegation_id: string | null;
|
|
208
|
+
policy_ids: string[];
|
|
209
|
+
claimed_intent_id: string | null;
|
|
210
|
+
parent_action_id: string | null;
|
|
211
|
+
actor_id: string | null;
|
|
212
|
+
actor_type: ActorType;
|
|
213
|
+
action_target: string | null;
|
|
214
|
+
action_description: string | null;
|
|
215
|
+
action_risk_level: RiskLevel | null;
|
|
216
|
+
action_metadata: Record<string, unknown>;
|
|
217
|
+
pending_approval_id: string | null;
|
|
218
|
+
created_at: string;
|
|
219
|
+
decided_at: string | null;
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
export type Intent = {
|
|
223
|
+
id: string;
|
|
224
|
+
title: string;
|
|
225
|
+
description: string | null;
|
|
226
|
+
intent_type: string | null;
|
|
227
|
+
status: IntentStatus;
|
|
228
|
+
risk_level: RiskLevel;
|
|
229
|
+
max_risk_level: RiskLevel;
|
|
230
|
+
expires_at: string | null;
|
|
231
|
+
created_at: string;
|
|
232
|
+
owner: { id: string; full_name: string; email: string } | null;
|
|
233
|
+
linked_actions: number;
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
export type IntentDetail = Omit<Intent, "linked_actions"> & {
|
|
237
|
+
linked_actions: Array<{
|
|
238
|
+
action_request_id: string;
|
|
239
|
+
action_type: string;
|
|
240
|
+
summary: string;
|
|
241
|
+
decision: string;
|
|
242
|
+
alignment_status: string;
|
|
243
|
+
alignment_score: number | null;
|
|
244
|
+
}>;
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
export type CreateAuthorityEdgeInput = {
|
|
248
|
+
fromActorId: string;
|
|
249
|
+
fromActorType: ActorType;
|
|
250
|
+
toActorId: string;
|
|
251
|
+
toActorType: ActorType;
|
|
252
|
+
authorityScope: string;
|
|
253
|
+
conditions?: Record<string, unknown>;
|
|
254
|
+
maxRiskLevel?: RiskLevel;
|
|
255
|
+
expiresAt?: string;
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
export type CreateIntentInput = {
|
|
259
|
+
title: string;
|
|
260
|
+
description?: string;
|
|
261
|
+
intentType?: string;
|
|
262
|
+
riskLevel?: RiskLevel;
|
|
263
|
+
maxRiskLevel?: RiskLevel;
|
|
264
|
+
expiresAt?: string;
|
|
265
|
+
allowedActionTypes?: string[];
|
|
266
|
+
targetPattern?: string;
|
|
267
|
+
resourceAllowlist?: string[];
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
export type UpdateIntentInput = {
|
|
271
|
+
status?: Exclude<IntentStatus, "expired">;
|
|
272
|
+
title?: string;
|
|
273
|
+
description?: string | null;
|
|
274
|
+
intentType?: string | null;
|
|
275
|
+
riskLevel?: RiskLevel;
|
|
276
|
+
maxRiskLevel?: RiskLevel;
|
|
277
|
+
expiresAt?: string | null;
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
export type UpdateAgentStatusInput = {
|
|
281
|
+
status: Agent["status"];
|
|
282
|
+
reason?: string;
|
|
283
|
+
/** Permanently revoke instead of quarantine (default: quarantine on restrict/suspend). */
|
|
284
|
+
revokeDelegations?: boolean;
|
|
285
|
+
/** Restore quarantined delegations when reactivating (default: true). */
|
|
286
|
+
restoreDelegations?: boolean;
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
export type AuthorityGraph = {
|
|
290
|
+
nodes: Array<{ id: string; type: ActorType; label: string }>;
|
|
291
|
+
edges: Array<{
|
|
292
|
+
id: string;
|
|
293
|
+
from: string;
|
|
294
|
+
to: string;
|
|
295
|
+
fromType: ActorType;
|
|
296
|
+
toType: ActorType;
|
|
297
|
+
scope: string;
|
|
298
|
+
status: string;
|
|
299
|
+
edgeType: string;
|
|
300
|
+
}>;
|
|
301
|
+
};
|
|
302
|
+
|
|
303
|
+
export type ActionEvaluation = {
|
|
304
|
+
id: string;
|
|
305
|
+
action_request_id: string;
|
|
306
|
+
intent_id: string | null;
|
|
307
|
+
decision: "allowed" | "requires_approval" | "blocked";
|
|
308
|
+
risk_score: number;
|
|
309
|
+
authority_valid: boolean;
|
|
310
|
+
intent_valid: boolean;
|
|
311
|
+
root_intent_valid: boolean;
|
|
312
|
+
reasons: string[];
|
|
313
|
+
created_at: string;
|
|
314
|
+
};
|
|
315
|
+
|
|
316
|
+
export type RootIntentChain = {
|
|
317
|
+
valid: boolean;
|
|
318
|
+
root_human_id: string | null;
|
|
319
|
+
root_intent_id: string | null;
|
|
320
|
+
reason: string | null;
|
|
321
|
+
chain: Array<{
|
|
322
|
+
actionId?: string;
|
|
323
|
+
actorId: string;
|
|
324
|
+
actorType: ActorType;
|
|
325
|
+
intentId?: string;
|
|
326
|
+
parentActionId?: string;
|
|
327
|
+
label?: string;
|
|
328
|
+
}>;
|
|
329
|
+
};
|
|
330
|
+
|
|
331
|
+
export type Policy = {
|
|
332
|
+
id: string;
|
|
333
|
+
name: string;
|
|
334
|
+
description: string | null;
|
|
335
|
+
policy_type: PolicyType;
|
|
336
|
+
status: "active" | "draft" | "archived";
|
|
337
|
+
priority: number;
|
|
338
|
+
conditions: Record<string, unknown>;
|
|
339
|
+
actions: Record<string, unknown>;
|
|
340
|
+
created_at: string;
|
|
341
|
+
};
|
|
342
|
+
|
|
343
|
+
export type CreatePolicyInput = {
|
|
344
|
+
name: string;
|
|
345
|
+
description?: string;
|
|
346
|
+
policyType: PolicyType;
|
|
347
|
+
status?: "active" | "draft";
|
|
348
|
+
priority?: number;
|
|
349
|
+
actionType?: string;
|
|
350
|
+
amountGreaterThan?: number;
|
|
351
|
+
resourceSensitivity?: "public" | "internal" | "confidential" | "pii";
|
|
352
|
+
externalRecipient?: boolean;
|
|
353
|
+
environment?: AgentEnvironment;
|
|
354
|
+
decision: "block" | "require_approval";
|
|
355
|
+
approverRole?: "owner" | "admin" | "reviewer";
|
|
356
|
+
maxActionsPerWindow?: {
|
|
357
|
+
count: number;
|
|
358
|
+
windowSeconds: number;
|
|
359
|
+
actionType?: string;
|
|
360
|
+
};
|
|
361
|
+
maxAmountPerWindow?: {
|
|
362
|
+
amount: number;
|
|
363
|
+
windowSeconds: number;
|
|
364
|
+
};
|
|
365
|
+
};
|
|
366
|
+
|
|
367
|
+
export type CustomActionType = {
|
|
368
|
+
id: string;
|
|
369
|
+
label: string;
|
|
370
|
+
description: string | null;
|
|
371
|
+
category: string;
|
|
372
|
+
policy_type: PolicyType;
|
|
373
|
+
payload_schema: Record<string, unknown>;
|
|
374
|
+
source: "builtin" | "custom";
|
|
375
|
+
template?: boolean;
|
|
376
|
+
created_at?: string | null;
|
|
377
|
+
};
|
|
378
|
+
|
|
379
|
+
export type CreateCustomActionTypeInput = {
|
|
380
|
+
id: string;
|
|
381
|
+
label: string;
|
|
382
|
+
description?: string;
|
|
383
|
+
category?: string;
|
|
384
|
+
policyType: PolicyType;
|
|
385
|
+
payloadSchema?: Record<string, unknown>;
|
|
386
|
+
};
|
|
387
|
+
|
|
388
|
+
export type PolicySimulation = {
|
|
389
|
+
policy_id: string;
|
|
390
|
+
policy_name: string;
|
|
391
|
+
policy_status: string;
|
|
392
|
+
sample_size: number;
|
|
393
|
+
changed_count: number;
|
|
394
|
+
unchanged_count: number;
|
|
395
|
+
would_block_count: number;
|
|
396
|
+
replay_source?: "audit_events" | "action_requests" | "mixed";
|
|
397
|
+
deltas: Array<{
|
|
398
|
+
action_request_id: string;
|
|
399
|
+
action_type: string;
|
|
400
|
+
current_decision: string;
|
|
401
|
+
simulated_decision: string;
|
|
402
|
+
changed: boolean;
|
|
403
|
+
}>;
|
|
404
|
+
};
|
|
405
|
+
|
|
406
|
+
export type MandateEvidence =
|
|
407
|
+
| {
|
|
408
|
+
format: "auctra-mandate.v0.1";
|
|
409
|
+
payload_hash: string;
|
|
410
|
+
signed: false;
|
|
411
|
+
}
|
|
412
|
+
| {
|
|
413
|
+
format: "auctra-mandate.v0.1";
|
|
414
|
+
signed: true;
|
|
415
|
+
payload_hash: string;
|
|
416
|
+
payload: Record<string, unknown>;
|
|
417
|
+
signature: { alg: "Ed25519"; key_id: string; value: string };
|
|
418
|
+
};
|
|
419
|
+
|
|
420
|
+
export type MandatePayload = Record<string, unknown>;
|
|
421
|
+
|
|
422
|
+
export type DecisionEvidencePayload = Record<string, unknown>;
|
|
423
|
+
|
|
424
|
+
export type DecisionEvidence =
|
|
425
|
+
| {
|
|
426
|
+
format: "auctra-evidence.v0.1";
|
|
427
|
+
payload_hash: string;
|
|
428
|
+
signed: false;
|
|
429
|
+
}
|
|
430
|
+
| {
|
|
431
|
+
format: "auctra-evidence.v0.1";
|
|
432
|
+
signed: true;
|
|
433
|
+
payload_hash: string;
|
|
434
|
+
payload: Record<string, unknown>;
|
|
435
|
+
signature: { alg: "Ed25519"; key_id: string; value: string };
|
|
436
|
+
};
|
|
437
|
+
|
|
438
|
+
export type AuditChainVerification = {
|
|
439
|
+
valid: boolean;
|
|
440
|
+
total: number;
|
|
441
|
+
sealed_total: number;
|
|
442
|
+
legacy_unsealed_total: number;
|
|
443
|
+
events: Array<{
|
|
444
|
+
id: string;
|
|
445
|
+
hashValid: boolean;
|
|
446
|
+
linkValid: boolean;
|
|
447
|
+
sequenceValid: boolean;
|
|
448
|
+
valid: boolean;
|
|
449
|
+
legacy: boolean;
|
|
450
|
+
}>;
|
|
451
|
+
};
|
|
452
|
+
|
|
453
|
+
export type ArtifactVerification = {
|
|
454
|
+
valid: boolean;
|
|
455
|
+
hashValid: boolean;
|
|
456
|
+
signatureValid: boolean;
|
|
457
|
+
};
|
|
458
|
+
|
|
459
|
+
export type AuditEvent = {
|
|
460
|
+
id: string;
|
|
461
|
+
event_type: string;
|
|
462
|
+
event_summary: string;
|
|
463
|
+
decision: string | null;
|
|
464
|
+
decision_reason: string | null;
|
|
465
|
+
authority_valid_at_action: boolean | null;
|
|
466
|
+
actor_name: string;
|
|
467
|
+
approver_name: string | null;
|
|
468
|
+
policy_applied: string | null;
|
|
469
|
+
delegation_id: string | null;
|
|
470
|
+
hash: string | null;
|
|
471
|
+
previous_hash: string | null;
|
|
472
|
+
chain_index?: number;
|
|
473
|
+
mandate?: MandateEvidence | null;
|
|
474
|
+
evidence?: DecisionEvidence | null;
|
|
475
|
+
payload?: Record<string, unknown>;
|
|
476
|
+
created_at: string;
|
|
477
|
+
};
|
|
478
|
+
|
|
479
|
+
export type ApiKeySummary = {
|
|
480
|
+
id: string;
|
|
481
|
+
name: string;
|
|
482
|
+
key_prefix: string;
|
|
483
|
+
environment: "development" | "production";
|
|
484
|
+
permissions: string[];
|
|
485
|
+
status: "active" | "revoked";
|
|
486
|
+
last_used_at: string | null;
|
|
487
|
+
created_at: string;
|
|
488
|
+
};
|