@threnn/acap-sdk 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,365 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ ACAPClient: () => ACAPClient,
24
+ ACAPError: () => ACAPError,
25
+ Attester: () => Attester
26
+ });
27
+ module.exports = __toCommonJS(index_exports);
28
+
29
+ // src/errors.ts
30
+ var ACAPError = class extends Error {
31
+ constructor(message, status, code) {
32
+ super(message);
33
+ this.status = status;
34
+ this.code = code;
35
+ this.name = "ACAPError";
36
+ }
37
+ };
38
+
39
+ // src/client/acap-client.ts
40
+ var ACAPClient = class {
41
+ baseUrl;
42
+ apiKey;
43
+ fetchFn;
44
+ constructor(config) {
45
+ this.baseUrl = config.baseUrl.replace(/\/$/, "");
46
+ this.apiKey = config.apiKey;
47
+ this.fetchFn = config.fetch ?? globalThis.fetch;
48
+ }
49
+ // ============================================================
50
+ // Private HTTP helpers
51
+ // ============================================================
52
+ headers() {
53
+ return {
54
+ Authorization: `Bearer ${this.apiKey}`,
55
+ Accept: "application/json"
56
+ };
57
+ }
58
+ async get(path) {
59
+ const res = await this.fetchFn(`${this.baseUrl}${path}`, {
60
+ method: "GET",
61
+ headers: this.headers()
62
+ });
63
+ return this.handleResponse(res);
64
+ }
65
+ async post(path, body) {
66
+ const res = await this.fetchFn(`${this.baseUrl}${path}`, {
67
+ method: "POST",
68
+ headers: { ...this.headers(), "Content-Type": "application/json" },
69
+ body: JSON.stringify(body)
70
+ });
71
+ return this.handleResponse(res);
72
+ }
73
+ async put(path, body) {
74
+ const res = await this.fetchFn(`${this.baseUrl}${path}`, {
75
+ method: "PUT",
76
+ headers: { ...this.headers(), "Content-Type": "application/json" },
77
+ body: JSON.stringify(body)
78
+ });
79
+ return this.handleResponse(res);
80
+ }
81
+ async del(path) {
82
+ const res = await this.fetchFn(`${this.baseUrl}${path}`, {
83
+ method: "DELETE",
84
+ headers: this.headers()
85
+ });
86
+ return this.handleResponse(res);
87
+ }
88
+ async patch(path, body) {
89
+ const res = await this.fetchFn(`${this.baseUrl}${path}`, {
90
+ method: "PATCH",
91
+ headers: { ...this.headers(), "Content-Type": "application/json" },
92
+ body: JSON.stringify(body)
93
+ });
94
+ return this.handleResponse(res);
95
+ }
96
+ async handleResponse(res) {
97
+ if (!res.ok) {
98
+ const body = await res.text().catch(() => "");
99
+ let message = `HTTP ${res.status}`;
100
+ let code;
101
+ try {
102
+ const json = JSON.parse(body);
103
+ message = json.error ?? json.message ?? message;
104
+ code = json.code;
105
+ } catch {
106
+ if (body) message = body;
107
+ }
108
+ throw new ACAPError(message, res.status, code);
109
+ }
110
+ return res.json();
111
+ }
112
+ // ============================================================
113
+ // Attestation
114
+ // ============================================================
115
+ /**
116
+ * Start an attestation run — executes the benchmark and returns the result with certificate.
117
+ *
118
+ * @example
119
+ * ```typescript
120
+ * const result = await client.startAttestation({
121
+ * agentId: 'my-agent',
122
+ * suiteId: 'suite-uuid',
123
+ * agentEndpoint: 'https://my-agent.example.com/api/chat',
124
+ * agentAdapter: 'http',
125
+ * });
126
+ * console.log(result.certificate); // Signed CapabilityCertificate
127
+ * ```
128
+ */
129
+ async startAttestation(opts) {
130
+ return this.post("/api/v1/acap/attest", opts);
131
+ }
132
+ /** Get the status of an attestation run */
133
+ async getAttestationStatus(runId) {
134
+ return this.get(`/api/v1/acap/attest/${encodeURIComponent(runId)}`);
135
+ }
136
+ /** Cancel a running attestation */
137
+ async cancelAttestation(runId) {
138
+ await this.del(`/api/v1/acap/attest/${encodeURIComponent(runId)}`);
139
+ }
140
+ /** List attestation runs with optional filters */
141
+ async listRuns(opts) {
142
+ const params = new URLSearchParams();
143
+ if (opts?.agentId) params.set("agentId", opts.agentId);
144
+ if (opts?.suiteId) params.set("suiteId", opts.suiteId);
145
+ if (opts?.status) params.set("status", opts.status);
146
+ if (opts?.page) params.set("page", String(opts.page));
147
+ if (opts?.pageSize) params.set("pageSize", String(opts.pageSize));
148
+ const qs = params.toString();
149
+ return this.get(`/api/v1/acap/runs${qs ? `?${qs}` : ""}`);
150
+ }
151
+ // ============================================================
152
+ // Certificates
153
+ // ============================================================
154
+ /** Get a certificate by ID */
155
+ async getCertificate(id) {
156
+ return this.get(`/api/v1/acap/certificates/${encodeURIComponent(id)}`);
157
+ }
158
+ /** List certificates with optional filters */
159
+ async listCertificates(opts) {
160
+ const params = new URLSearchParams();
161
+ if (opts?.agentId) params.set("agentId", opts.agentId);
162
+ if (opts?.domain) params.set("domain", opts.domain);
163
+ if (opts?.status) params.set("status", opts.status);
164
+ if (opts?.page) params.set("page", String(opts.page));
165
+ if (opts?.pageSize) params.set("pageSize", String(opts.pageSize));
166
+ const qs = params.toString();
167
+ return this.get(`/api/v1/acap/certificates${qs ? `?${qs}` : ""}`);
168
+ }
169
+ /** Get certificates for a specific agent */
170
+ async getCertificatesForAgent(agentId, opts) {
171
+ const params = new URLSearchParams();
172
+ if (opts?.domain) params.set("domain", opts.domain);
173
+ if (opts?.status) params.set("status", opts.status);
174
+ if (opts?.page) params.set("page", String(opts.page));
175
+ if (opts?.pageSize) params.set("pageSize", String(opts.pageSize));
176
+ const qs = params.toString();
177
+ return this.get(`/api/v1/acap/agents/${encodeURIComponent(agentId)}/certificates${qs ? `?${qs}` : ""}`);
178
+ }
179
+ /** Verify a certificate's integrity and validity */
180
+ async verifyCertificate(id) {
181
+ return this.get(`/api/v1/acap/certificates/${encodeURIComponent(id)}/verify`);
182
+ }
183
+ /** Revoke a certificate */
184
+ async revokeCertificate(id, reason) {
185
+ await this.post(`/api/v1/acap/certificates/${encodeURIComponent(id)}/revoke`, { reason });
186
+ }
187
+ /** Get a nutrition label for a certificate */
188
+ async getNutritionLabel(id) {
189
+ return this.get(`/api/v1/acap/certificates/${encodeURIComponent(id)}/label`);
190
+ }
191
+ // ============================================================
192
+ // Registry
193
+ // ============================================================
194
+ /** Publish a certificate to the public registry */
195
+ async publishToRegistry(certificateId, agentName, agentDescription) {
196
+ return this.post("/api/v1/acap/registry/publish", {
197
+ certificateId,
198
+ agentName,
199
+ agentDescription
200
+ });
201
+ }
202
+ /** Search the public registry */
203
+ async searchRegistry(opts) {
204
+ const params = new URLSearchParams();
205
+ if (opts?.domain) params.set("domain", opts.domain);
206
+ if (opts?.minScore !== void 0) params.set("minScore", String(opts.minScore));
207
+ if (opts?.maxScore !== void 0) params.set("maxScore", String(opts.maxScore));
208
+ if (opts?.tier) params.set("tier", opts.tier);
209
+ if (opts?.query) params.set("query", opts.query);
210
+ if (opts?.sortBy) params.set("sortBy", opts.sortBy);
211
+ if (opts?.page) params.set("page", String(opts.page));
212
+ if (opts?.pageSize) params.set("pageSize", String(opts.pageSize));
213
+ const qs = params.toString();
214
+ return this.get(`/api/v1/acap/registry/search${qs ? `?${qs}` : ""}`);
215
+ }
216
+ /** Get leaderboard for a domain */
217
+ async getLeaderboard(domain, limit) {
218
+ const params = new URLSearchParams();
219
+ if (limit) params.set("limit", String(limit));
220
+ const qs = params.toString();
221
+ return this.get(`/api/v1/acap/registry/leaderboard/${encodeURIComponent(domain)}${qs ? `?${qs}` : ""}`);
222
+ }
223
+ // ============================================================
224
+ // Benchmark Suites
225
+ // ============================================================
226
+ /** Get a benchmark suite by ID */
227
+ async getSuite(id) {
228
+ return this.get(`/api/v1/acap/suites/${encodeURIComponent(id)}`);
229
+ }
230
+ /** List benchmark suites (public + own) */
231
+ async listSuites(opts) {
232
+ const params = new URLSearchParams();
233
+ if (opts?.domain) params.set("domain", opts.domain);
234
+ if (opts?.isPublic !== void 0) params.set("isPublic", String(opts.isPublic));
235
+ const qs = params.toString();
236
+ return this.get(`/api/v1/acap/suites${qs ? `?${qs}` : ""}`);
237
+ }
238
+ /** Create a custom benchmark suite */
239
+ async createSuite(input) {
240
+ return this.post("/api/v1/acap/suites", input);
241
+ }
242
+ /** Update a benchmark suite */
243
+ async updateSuite(id, input) {
244
+ return this.put(`/api/v1/acap/suites/${encodeURIComponent(id)}`, input);
245
+ }
246
+ /** Delete a benchmark suite */
247
+ async deleteSuite(id) {
248
+ return this.del(`/api/v1/acap/suites/${encodeURIComponent(id)}`);
249
+ }
250
+ // ============================================================
251
+ // Drift
252
+ // ============================================================
253
+ /** List capability drift events with optional filters */
254
+ async listDrift(opts) {
255
+ const params = new URLSearchParams();
256
+ if (opts?.agentId) params.set("agentId", opts.agentId);
257
+ if (opts?.severity) params.set("severity", opts.severity);
258
+ if (opts?.acknowledged !== void 0) params.set("acknowledged", String(opts.acknowledged));
259
+ if (opts?.page) params.set("page", String(opts.page));
260
+ if (opts?.pageSize) params.set("pageSize", String(opts.pageSize));
261
+ const qs = params.toString();
262
+ return this.get(`/api/v1/acap/drift${qs ? `?${qs}` : ""}`);
263
+ }
264
+ /** Acknowledge drift events by IDs */
265
+ async acknowledgeDrift(eventIds, note) {
266
+ return this.patch("/api/v1/acap/drift", { eventIds, note });
267
+ }
268
+ // ============================================================
269
+ // Comparison
270
+ // ============================================================
271
+ /** Compare multiple certificates side-by-side */
272
+ async compareAgents(certIds) {
273
+ return this.get(`/api/v1/acap/compare?ids=${certIds.map(encodeURIComponent).join(",")}`);
274
+ }
275
+ // ============================================================
276
+ // Export Formats
277
+ // ============================================================
278
+ /** Get NIST-aligned JSON-LD export for a certificate */
279
+ async getNistExport(id) {
280
+ return this.get(`/api/v1/acap/certificates/${encodeURIComponent(id)}/nist`);
281
+ }
282
+ /** Get OpenBadges v3 (W3C Verifiable Credential) export for a certificate */
283
+ async getOpenBadge(id) {
284
+ return this.get(`/api/v1/acap/certificates/${encodeURIComponent(id)}/openbadge`);
285
+ }
286
+ /** Get Markdown nutrition label for a certificate */
287
+ async getMarkdownLabel(id) {
288
+ const res = await this.fetchFn(
289
+ `${this.baseUrl}/api/v1/acap/certificates/${encodeURIComponent(id)}/markdown`,
290
+ { method: "GET", headers: this.headers() }
291
+ );
292
+ if (!res.ok) {
293
+ const body = await res.text().catch(() => "");
294
+ let message = `HTTP ${res.status}`;
295
+ let code;
296
+ try {
297
+ const json = JSON.parse(body);
298
+ message = json.error ?? json.message ?? message;
299
+ code = json.code;
300
+ } catch {
301
+ if (body) message = body;
302
+ }
303
+ throw new ACAPError(message, res.status, code);
304
+ }
305
+ return res.text();
306
+ }
307
+ // ============================================================
308
+ // Webhooks
309
+ // ============================================================
310
+ /** Get current webhook configuration */
311
+ async getWebhookConfig() {
312
+ return this.get("/api/v1/acap/webhooks");
313
+ }
314
+ /** Set webhook URL (auto-generates secret, returned once) */
315
+ async setWebhookConfig(url) {
316
+ return this.post("/api/v1/acap/webhooks", { url });
317
+ }
318
+ /** Remove webhook configuration */
319
+ async deleteWebhookConfig() {
320
+ return this.del("/api/v1/acap/webhooks");
321
+ }
322
+ };
323
+
324
+ // src/attester/attester.ts
325
+ var Attester = class {
326
+ config;
327
+ constructor(config) {
328
+ this.config = config;
329
+ }
330
+ /**
331
+ * Run the benchmark suite against the configured agent.
332
+ * @beta Not yet implemented. Use `ACAPClient.startAttestation()` instead.
333
+ */
334
+ async run() {
335
+ throw new Error(
336
+ "Local attestation is not yet implemented. Use ACAPClient.startAttestation() for server-side attestation."
337
+ );
338
+ }
339
+ /**
340
+ * Cancel a running attestation.
341
+ * @beta Not yet implemented. Use `ACAPClient.cancelAttestation()` instead.
342
+ */
343
+ async cancel() {
344
+ throw new Error(
345
+ "Local attestation is not yet implemented. Use ACAPClient.cancelAttestation() for server-side cancellation."
346
+ );
347
+ }
348
+ getProgress() {
349
+ return {
350
+ totalTasks: this.config.suite.tasks.length,
351
+ completedTasks: 0,
352
+ passedTasks: 0,
353
+ failedTasks: 0,
354
+ estimatedRemainingMs: 0,
355
+ elapsedMs: 0
356
+ };
357
+ }
358
+ };
359
+ // Annotate the CommonJS export names for ESM import in node:
360
+ 0 && (module.exports = {
361
+ ACAPClient,
362
+ ACAPError,
363
+ Attester
364
+ });
365
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/client/acap-client.ts","../src/attester/attester.ts"],"sourcesContent":["export { ACAPClient, type ACAPClientConfig } from './client/acap-client';\nexport { Attester, type AttesterConfig } from './attester/attester';\nexport { ACAPError } from './errors';\n\n// SDK-specific types\nexport type {\n PaginatedResult,\n ListCertificatesOptions,\n ListRunsOptions,\n ListDriftOptions,\n AcknowledgeDriftResult,\n SearchRegistryOptions,\n ListSuitesOptions,\n LeaderboardEntry,\n StartAttestationOptions,\n AttestationResult,\n} from './types';\n\n// Re-export core types for convenience\nexport type {\n CapabilityCertificate,\n BenchmarkSuite,\n TaskResult,\n DimensionScore,\n AttestationRun,\n RunProgress,\n NutritionLabel,\n VerificationResult,\n AgentAdapter,\n AgentResponse,\n AgentMetadata,\n RegistryListing,\n RegistrySearchParams,\n RegistrySearchResult,\n ComparisonResult,\n DriftSummary,\n CapabilityDriftEvent,\n NistExport,\n InteroperabilityLevel,\n OpenBadgeCredential,\n} from '@threnn/acap-core';\n","/**\n * Error class for ACAP SDK operations.\n */\nexport class ACAPError extends Error {\n constructor(\n message: string,\n public status: number,\n public code?: string,\n ) {\n super(message);\n this.name = 'ACAPError';\n }\n}\n","/**\n * ACAP SDK Client — submit attestations, query certificates, search the registry.\n */\n\nimport type {\n CapabilityCertificate,\n CapabilityDriftEvent,\n AttestationRun,\n BenchmarkSuite,\n NutritionLabel,\n VerificationResult,\n RegistryListing,\n NistExport,\n OpenBadgeCredential,\n} from '@threnn/acap-core';\n\nimport { ACAPError } from '../errors';\nimport type {\n PaginatedResult,\n ListCertificatesOptions,\n ListRunsOptions,\n ListDriftOptions,\n AcknowledgeDriftResult,\n SearchRegistryOptions,\n ListSuitesOptions,\n LeaderboardEntry,\n StartAttestationOptions,\n AttestationResult,\n} from '../types';\n\nexport interface ACAPClientConfig {\n /** Base URL of the ACAP API (e.g., 'https://app.threnn.ai') */\n baseUrl: string;\n /** API key for authentication */\n apiKey: string;\n /** Custom fetch implementation (defaults to global fetch) */\n fetch?: typeof globalThis.fetch;\n}\n\nexport class ACAPClient {\n private baseUrl: string;\n private apiKey: string;\n private fetchFn: typeof globalThis.fetch;\n\n constructor(config: ACAPClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.apiKey = config.apiKey;\n this.fetchFn = config.fetch ?? globalThis.fetch;\n }\n\n // ============================================================\n // Private HTTP helpers\n // ============================================================\n\n private headers(): Record<string, string> {\n return {\n Authorization: `Bearer ${this.apiKey}`,\n Accept: 'application/json',\n };\n }\n\n private async get<T>(path: string): Promise<T> {\n const res = await this.fetchFn(`${this.baseUrl}${path}`, {\n method: 'GET',\n headers: this.headers(),\n });\n return this.handleResponse<T>(res);\n }\n\n private async post<T>(path: string, body: unknown): Promise<T> {\n const res = await this.fetchFn(`${this.baseUrl}${path}`, {\n method: 'POST',\n headers: { ...this.headers(), 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n return this.handleResponse<T>(res);\n }\n\n private async put<T>(path: string, body: unknown): Promise<T> {\n const res = await this.fetchFn(`${this.baseUrl}${path}`, {\n method: 'PUT',\n headers: { ...this.headers(), 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n return this.handleResponse<T>(res);\n }\n\n private async del<T>(path: string): Promise<T> {\n const res = await this.fetchFn(`${this.baseUrl}${path}`, {\n method: 'DELETE',\n headers: this.headers(),\n });\n return this.handleResponse<T>(res);\n }\n\n private async patch<T>(path: string, body: unknown): Promise<T> {\n const res = await this.fetchFn(`${this.baseUrl}${path}`, {\n method: 'PATCH',\n headers: { ...this.headers(), 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n return this.handleResponse<T>(res);\n }\n\n private async handleResponse<T>(res: Response): Promise<T> {\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n let message = `HTTP ${res.status}`;\n let code: string | undefined;\n try {\n const json = JSON.parse(body);\n message = json.error ?? json.message ?? message;\n code = json.code;\n } catch {\n if (body) message = body;\n }\n throw new ACAPError(message, res.status, code);\n }\n return res.json() as Promise<T>;\n }\n\n // ============================================================\n // Attestation\n // ============================================================\n\n /**\n * Start an attestation run — executes the benchmark and returns the result with certificate.\n *\n * @example\n * ```typescript\n * const result = await client.startAttestation({\n * agentId: 'my-agent',\n * suiteId: 'suite-uuid',\n * agentEndpoint: 'https://my-agent.example.com/api/chat',\n * agentAdapter: 'http',\n * });\n * console.log(result.certificate); // Signed CapabilityCertificate\n * ```\n */\n async startAttestation(opts: StartAttestationOptions): Promise<AttestationResult> {\n return this.post('/api/v1/acap/attest', opts);\n }\n\n /** Get the status of an attestation run */\n async getAttestationStatus(runId: string): Promise<AttestationRun> {\n return this.get(`/api/v1/acap/attest/${encodeURIComponent(runId)}`);\n }\n\n /** Cancel a running attestation */\n async cancelAttestation(runId: string): Promise<void> {\n await this.del(`/api/v1/acap/attest/${encodeURIComponent(runId)}`);\n }\n\n /** List attestation runs with optional filters */\n async listRuns(opts?: ListRunsOptions): Promise<PaginatedResult<AttestationRun>> {\n const params = new URLSearchParams();\n if (opts?.agentId) params.set('agentId', opts.agentId);\n if (opts?.suiteId) params.set('suiteId', opts.suiteId);\n if (opts?.status) params.set('status', opts.status);\n if (opts?.page) params.set('page', String(opts.page));\n if (opts?.pageSize) params.set('pageSize', String(opts.pageSize));\n const qs = params.toString();\n return this.get(`/api/v1/acap/runs${qs ? `?${qs}` : ''}`);\n }\n\n // ============================================================\n // Certificates\n // ============================================================\n\n /** Get a certificate by ID */\n async getCertificate(id: string): Promise<CapabilityCertificate> {\n return this.get(`/api/v1/acap/certificates/${encodeURIComponent(id)}`);\n }\n\n /** List certificates with optional filters */\n async listCertificates(opts?: ListCertificatesOptions): Promise<PaginatedResult<CapabilityCertificate>> {\n const params = new URLSearchParams();\n if (opts?.agentId) params.set('agentId', opts.agentId);\n if (opts?.domain) params.set('domain', opts.domain);\n if (opts?.status) params.set('status', opts.status);\n if (opts?.page) params.set('page', String(opts.page));\n if (opts?.pageSize) params.set('pageSize', String(opts.pageSize));\n const qs = params.toString();\n return this.get(`/api/v1/acap/certificates${qs ? `?${qs}` : ''}`);\n }\n\n /** Get certificates for a specific agent */\n async getCertificatesForAgent(\n agentId: string,\n opts?: { domain?: string; status?: string; page?: number; pageSize?: number },\n ): Promise<PaginatedResult<CapabilityCertificate>> {\n const params = new URLSearchParams();\n if (opts?.domain) params.set('domain', opts.domain);\n if (opts?.status) params.set('status', opts.status);\n if (opts?.page) params.set('page', String(opts.page));\n if (opts?.pageSize) params.set('pageSize', String(opts.pageSize));\n const qs = params.toString();\n return this.get(`/api/v1/acap/agents/${encodeURIComponent(agentId)}/certificates${qs ? `?${qs}` : ''}`);\n }\n\n /** Verify a certificate's integrity and validity */\n async verifyCertificate(id: string): Promise<VerificationResult> {\n return this.get(`/api/v1/acap/certificates/${encodeURIComponent(id)}/verify`);\n }\n\n /** Revoke a certificate */\n async revokeCertificate(id: string, reason?: string): Promise<void> {\n await this.post(`/api/v1/acap/certificates/${encodeURIComponent(id)}/revoke`, { reason });\n }\n\n /** Get a nutrition label for a certificate */\n async getNutritionLabel(id: string): Promise<NutritionLabel> {\n return this.get(`/api/v1/acap/certificates/${encodeURIComponent(id)}/label`);\n }\n\n // ============================================================\n // Registry\n // ============================================================\n\n /** Publish a certificate to the public registry */\n async publishToRegistry(\n certificateId: string,\n agentName: string,\n agentDescription: string,\n ): Promise<RegistryListing> {\n return this.post('/api/v1/acap/registry/publish', {\n certificateId,\n agentName,\n agentDescription,\n });\n }\n\n /** Search the public registry */\n async searchRegistry(opts?: SearchRegistryOptions): Promise<PaginatedResult<RegistryListing>> {\n const params = new URLSearchParams();\n if (opts?.domain) params.set('domain', opts.domain);\n if (opts?.minScore !== undefined) params.set('minScore', String(opts.minScore));\n if (opts?.maxScore !== undefined) params.set('maxScore', String(opts.maxScore));\n if (opts?.tier) params.set('tier', opts.tier);\n if (opts?.query) params.set('query', opts.query);\n if (opts?.sortBy) params.set('sortBy', opts.sortBy);\n if (opts?.page) params.set('page', String(opts.page));\n if (opts?.pageSize) params.set('pageSize', String(opts.pageSize));\n const qs = params.toString();\n return this.get(`/api/v1/acap/registry/search${qs ? `?${qs}` : ''}`);\n }\n\n /** Get leaderboard for a domain */\n async getLeaderboard(domain: string, limit?: number): Promise<{ domain: string; entries: LeaderboardEntry[] }> {\n const params = new URLSearchParams();\n if (limit) params.set('limit', String(limit));\n const qs = params.toString();\n return this.get(`/api/v1/acap/registry/leaderboard/${encodeURIComponent(domain)}${qs ? `?${qs}` : ''}`);\n }\n\n // ============================================================\n // Benchmark Suites\n // ============================================================\n\n /** Get a benchmark suite by ID */\n async getSuite(id: string): Promise<BenchmarkSuite> {\n return this.get(`/api/v1/acap/suites/${encodeURIComponent(id)}`);\n }\n\n /** List benchmark suites (public + own) */\n async listSuites(opts?: ListSuitesOptions): Promise<BenchmarkSuite[]> {\n const params = new URLSearchParams();\n if (opts?.domain) params.set('domain', opts.domain);\n if (opts?.isPublic !== undefined) params.set('isPublic', String(opts.isPublic));\n const qs = params.toString();\n return this.get(`/api/v1/acap/suites${qs ? `?${qs}` : ''}`);\n }\n\n /** Create a custom benchmark suite */\n async createSuite(input: Partial<BenchmarkSuite>): Promise<BenchmarkSuite> {\n return this.post('/api/v1/acap/suites', input);\n }\n\n /** Update a benchmark suite */\n async updateSuite(id: string, input: Partial<BenchmarkSuite>): Promise<BenchmarkSuite> {\n return this.put(`/api/v1/acap/suites/${encodeURIComponent(id)}`, input);\n }\n\n /** Delete a benchmark suite */\n async deleteSuite(id: string): Promise<{ success: boolean }> {\n return this.del(`/api/v1/acap/suites/${encodeURIComponent(id)}`);\n }\n\n // ============================================================\n // Drift\n // ============================================================\n\n /** List capability drift events with optional filters */\n async listDrift(opts?: ListDriftOptions): Promise<PaginatedResult<CapabilityDriftEvent>> {\n const params = new URLSearchParams();\n if (opts?.agentId) params.set('agentId', opts.agentId);\n if (opts?.severity) params.set('severity', opts.severity);\n if (opts?.acknowledged !== undefined) params.set('acknowledged', String(opts.acknowledged));\n if (opts?.page) params.set('page', String(opts.page));\n if (opts?.pageSize) params.set('pageSize', String(opts.pageSize));\n const qs = params.toString();\n return this.get(`/api/v1/acap/drift${qs ? `?${qs}` : ''}`);\n }\n\n /** Acknowledge drift events by IDs */\n async acknowledgeDrift(\n eventIds: string[],\n note?: string,\n ): Promise<AcknowledgeDriftResult> {\n return this.patch('/api/v1/acap/drift', { eventIds, note });\n }\n\n // ============================================================\n // Comparison\n // ============================================================\n\n /** Compare multiple certificates side-by-side */\n async compareAgents(certIds: string[]): Promise<{\n certificates: Array<{ id: string; agentId: string; domain: string; overallScore: number; tier: string; issuedAt: string }>;\n dimensionComparisons: Array<{ dimension: string; scores: Array<{ certificateId: string; agentId: string; score: number }>; maxDelta: number }>;\n overallRanking: Array<{ certificateId: string; agentId: string; overallScore: number; tier: string }>;\n }> {\n return this.get(`/api/v1/acap/compare?ids=${certIds.map(encodeURIComponent).join(',')}`);\n }\n\n // ============================================================\n // Export Formats\n // ============================================================\n\n /** Get NIST-aligned JSON-LD export for a certificate */\n async getNistExport(id: string): Promise<NistExport> {\n return this.get(`/api/v1/acap/certificates/${encodeURIComponent(id)}/nist`);\n }\n\n /** Get OpenBadges v3 (W3C Verifiable Credential) export for a certificate */\n async getOpenBadge(id: string): Promise<OpenBadgeCredential> {\n return this.get(`/api/v1/acap/certificates/${encodeURIComponent(id)}/openbadge`);\n }\n\n /** Get Markdown nutrition label for a certificate */\n async getMarkdownLabel(id: string): Promise<string> {\n const res = await this.fetchFn(\n `${this.baseUrl}/api/v1/acap/certificates/${encodeURIComponent(id)}/markdown`,\n { method: 'GET', headers: this.headers() },\n );\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n let message = `HTTP ${res.status}`;\n let code: string | undefined;\n try {\n const json = JSON.parse(body);\n message = json.error ?? json.message ?? message;\n code = json.code;\n } catch {\n if (body) message = body;\n }\n throw new ACAPError(message, res.status, code);\n }\n return res.text();\n }\n\n // ============================================================\n // Webhooks\n // ============================================================\n\n /** Get current webhook configuration */\n async getWebhookConfig(): Promise<{ url: string | null }> {\n return this.get('/api/v1/acap/webhooks');\n }\n\n /** Set webhook URL (auto-generates secret, returned once) */\n async setWebhookConfig(url: string): Promise<{ url: string; secret: string }> {\n return this.post('/api/v1/acap/webhooks', { url });\n }\n\n /** Remove webhook configuration */\n async deleteWebhookConfig(): Promise<{ success: boolean }> {\n return this.del('/api/v1/acap/webhooks');\n }\n}\n","import type {\n BenchmarkSuite,\n AgentAdapter,\n CapabilityCertificate,\n RunProgress,\n AttestationRun,\n} from '@threnn/acap-core';\n\nexport interface AttesterConfig {\n agentAdapter: AgentAdapter;\n suite: BenchmarkSuite;\n concurrency?: number;\n timeout_ms?: number;\n signerCredential: string;\n onProgress?: (progress: RunProgress) => void;\n}\n\n/**\n * ACAP Attester — runs benchmark suites against agents locally and produces certificates.\n *\n * @beta Local attestation is not yet implemented. Use `ACAPClient.startAttestation()`\n * for server-side attestation, which is fully functional.\n *\n * @example\n * ```typescript\n * // Server-side attestation (recommended):\n * const client = new ACAPClient({ baseUrl: '...', apiKey: '...' });\n * const run = await client.startAttestation({ agentId: '...', suiteId: '...' });\n * ```\n */\nexport class Attester {\n private config: AttesterConfig;\n\n constructor(config: AttesterConfig) {\n this.config = config;\n }\n\n /**\n * Run the benchmark suite against the configured agent.\n * @beta Not yet implemented. Use `ACAPClient.startAttestation()` instead.\n */\n async run(): Promise<AttestationRun & { certificate: CapabilityCertificate }> {\n throw new Error(\n 'Local attestation is not yet implemented. Use ACAPClient.startAttestation() for server-side attestation.',\n );\n }\n\n /**\n * Cancel a running attestation.\n * @beta Not yet implemented. Use `ACAPClient.cancelAttestation()` instead.\n */\n async cancel(): Promise<void> {\n throw new Error(\n 'Local attestation is not yet implemented. Use ACAPClient.cancelAttestation() for server-side cancellation.',\n );\n }\n\n getProgress(): RunProgress {\n return {\n totalTasks: this.config.suite.tasks.length,\n completedTasks: 0,\n passedTasks: 0,\n failedTasks: 0,\n estimatedRemainingMs: 0,\n elapsedMs: 0,\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGO,IAAM,YAAN,cAAwB,MAAM;AAAA,EACnC,YACE,SACO,QACA,MACP;AACA,UAAM,OAAO;AAHN;AACA;AAGP,SAAK,OAAO;AAAA,EACd;AACF;;;AC2BO,IAAM,aAAN,MAAiB;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAA0B;AACpC,SAAK,UAAU,OAAO,QAAQ,QAAQ,OAAO,EAAE;AAC/C,SAAK,SAAS,OAAO;AACrB,SAAK,UAAU,OAAO,SAAS,WAAW;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAMQ,UAAkC;AACxC,WAAO;AAAA,MACL,eAAe,UAAU,KAAK,MAAM;AAAA,MACpC,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAc,IAAO,MAA0B;AAC7C,UAAM,MAAM,MAAM,KAAK,QAAQ,GAAG,KAAK,OAAO,GAAG,IAAI,IAAI;AAAA,MACvD,QAAQ;AAAA,MACR,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AACD,WAAO,KAAK,eAAkB,GAAG;AAAA,EACnC;AAAA,EAEA,MAAc,KAAQ,MAAc,MAA2B;AAC7D,UAAM,MAAM,MAAM,KAAK,QAAQ,GAAG,KAAK,OAAO,GAAG,IAAI,IAAI;AAAA,MACvD,QAAQ;AAAA,MACR,SAAS,EAAE,GAAG,KAAK,QAAQ,GAAG,gBAAgB,mBAAmB;AAAA,MACjE,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AACD,WAAO,KAAK,eAAkB,GAAG;AAAA,EACnC;AAAA,EAEA,MAAc,IAAO,MAAc,MAA2B;AAC5D,UAAM,MAAM,MAAM,KAAK,QAAQ,GAAG,KAAK,OAAO,GAAG,IAAI,IAAI;AAAA,MACvD,QAAQ;AAAA,MACR,SAAS,EAAE,GAAG,KAAK,QAAQ,GAAG,gBAAgB,mBAAmB;AAAA,MACjE,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AACD,WAAO,KAAK,eAAkB,GAAG;AAAA,EACnC;AAAA,EAEA,MAAc,IAAO,MAA0B;AAC7C,UAAM,MAAM,MAAM,KAAK,QAAQ,GAAG,KAAK,OAAO,GAAG,IAAI,IAAI;AAAA,MACvD,QAAQ;AAAA,MACR,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AACD,WAAO,KAAK,eAAkB,GAAG;AAAA,EACnC;AAAA,EAEA,MAAc,MAAS,MAAc,MAA2B;AAC9D,UAAM,MAAM,MAAM,KAAK,QAAQ,GAAG,KAAK,OAAO,GAAG,IAAI,IAAI;AAAA,MACvD,QAAQ;AAAA,MACR,SAAS,EAAE,GAAG,KAAK,QAAQ,GAAG,gBAAgB,mBAAmB;AAAA,MACjE,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AACD,WAAO,KAAK,eAAkB,GAAG;AAAA,EACnC;AAAA,EAEA,MAAc,eAAkB,KAA2B;AACzD,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,UAAI,UAAU,QAAQ,IAAI,MAAM;AAChC,UAAI;AACJ,UAAI;AACF,cAAM,OAAO,KAAK,MAAM,IAAI;AAC5B,kBAAU,KAAK,SAAS,KAAK,WAAW;AACxC,eAAO,KAAK;AAAA,MACd,QAAQ;AACN,YAAI,KAAM,WAAU;AAAA,MACtB;AACA,YAAM,IAAI,UAAU,SAAS,IAAI,QAAQ,IAAI;AAAA,IAC/C;AACA,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,MAAM,iBAAiB,MAA2D;AAChF,WAAO,KAAK,KAAK,uBAAuB,IAAI;AAAA,EAC9C;AAAA;AAAA,EAGA,MAAM,qBAAqB,OAAwC;AACjE,WAAO,KAAK,IAAI,uBAAuB,mBAAmB,KAAK,CAAC,EAAE;AAAA,EACpE;AAAA;AAAA,EAGA,MAAM,kBAAkB,OAA8B;AACpD,UAAM,KAAK,IAAI,uBAAuB,mBAAmB,KAAK,CAAC,EAAE;AAAA,EACnE;AAAA;AAAA,EAGA,MAAM,SAAS,MAAkE;AAC/E,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,MAAM,QAAS,QAAO,IAAI,WAAW,KAAK,OAAO;AACrD,QAAI,MAAM,QAAS,QAAO,IAAI,WAAW,KAAK,OAAO;AACrD,QAAI,MAAM,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AAClD,QAAI,MAAM,KAAM,QAAO,IAAI,QAAQ,OAAO,KAAK,IAAI,CAAC;AACpD,QAAI,MAAM,SAAU,QAAO,IAAI,YAAY,OAAO,KAAK,QAAQ,CAAC;AAChE,UAAM,KAAK,OAAO,SAAS;AAC3B,WAAO,KAAK,IAAI,oBAAoB,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eAAe,IAA4C;AAC/D,WAAO,KAAK,IAAI,6BAA6B,mBAAmB,EAAE,CAAC,EAAE;AAAA,EACvE;AAAA;AAAA,EAGA,MAAM,iBAAiB,MAAiF;AACtG,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,MAAM,QAAS,QAAO,IAAI,WAAW,KAAK,OAAO;AACrD,QAAI,MAAM,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AAClD,QAAI,MAAM,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AAClD,QAAI,MAAM,KAAM,QAAO,IAAI,QAAQ,OAAO,KAAK,IAAI,CAAC;AACpD,QAAI,MAAM,SAAU,QAAO,IAAI,YAAY,OAAO,KAAK,QAAQ,CAAC;AAChE,UAAM,KAAK,OAAO,SAAS;AAC3B,WAAO,KAAK,IAAI,4BAA4B,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE;AAAA,EAClE;AAAA;AAAA,EAGA,MAAM,wBACJ,SACA,MACiD;AACjD,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,MAAM,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AAClD,QAAI,MAAM,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AAClD,QAAI,MAAM,KAAM,QAAO,IAAI,QAAQ,OAAO,KAAK,IAAI,CAAC;AACpD,QAAI,MAAM,SAAU,QAAO,IAAI,YAAY,OAAO,KAAK,QAAQ,CAAC;AAChE,UAAM,KAAK,OAAO,SAAS;AAC3B,WAAO,KAAK,IAAI,uBAAuB,mBAAmB,OAAO,CAAC,gBAAgB,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE;AAAA,EACxG;AAAA;AAAA,EAGA,MAAM,kBAAkB,IAAyC;AAC/D,WAAO,KAAK,IAAI,6BAA6B,mBAAmB,EAAE,CAAC,SAAS;AAAA,EAC9E;AAAA;AAAA,EAGA,MAAM,kBAAkB,IAAY,QAAgC;AAClE,UAAM,KAAK,KAAK,6BAA6B,mBAAmB,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC;AAAA,EAC1F;AAAA;AAAA,EAGA,MAAM,kBAAkB,IAAqC;AAC3D,WAAO,KAAK,IAAI,6BAA6B,mBAAmB,EAAE,CAAC,QAAQ;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,kBACJ,eACA,WACA,kBAC0B;AAC1B,WAAO,KAAK,KAAK,iCAAiC;AAAA,MAChD;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,eAAe,MAAyE;AAC5F,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,MAAM,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AAClD,QAAI,MAAM,aAAa,OAAW,QAAO,IAAI,YAAY,OAAO,KAAK,QAAQ,CAAC;AAC9E,QAAI,MAAM,aAAa,OAAW,QAAO,IAAI,YAAY,OAAO,KAAK,QAAQ,CAAC;AAC9E,QAAI,MAAM,KAAM,QAAO,IAAI,QAAQ,KAAK,IAAI;AAC5C,QAAI,MAAM,MAAO,QAAO,IAAI,SAAS,KAAK,KAAK;AAC/C,QAAI,MAAM,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AAClD,QAAI,MAAM,KAAM,QAAO,IAAI,QAAQ,OAAO,KAAK,IAAI,CAAC;AACpD,QAAI,MAAM,SAAU,QAAO,IAAI,YAAY,OAAO,KAAK,QAAQ,CAAC;AAChE,UAAM,KAAK,OAAO,SAAS;AAC3B,WAAO,KAAK,IAAI,+BAA+B,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE;AAAA,EACrE;AAAA;AAAA,EAGA,MAAM,eAAe,QAAgB,OAA0E;AAC7G,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,MAAO,QAAO,IAAI,SAAS,OAAO,KAAK,CAAC;AAC5C,UAAM,KAAK,OAAO,SAAS;AAC3B,WAAO,KAAK,IAAI,qCAAqC,mBAAmB,MAAM,CAAC,GAAG,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE;AAAA,EACxG;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,SAAS,IAAqC;AAClD,WAAO,KAAK,IAAI,uBAAuB,mBAAmB,EAAE,CAAC,EAAE;AAAA,EACjE;AAAA;AAAA,EAGA,MAAM,WAAW,MAAqD;AACpE,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,MAAM,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AAClD,QAAI,MAAM,aAAa,OAAW,QAAO,IAAI,YAAY,OAAO,KAAK,QAAQ,CAAC;AAC9E,UAAM,KAAK,OAAO,SAAS;AAC3B,WAAO,KAAK,IAAI,sBAAsB,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE;AAAA,EAC5D;AAAA;AAAA,EAGA,MAAM,YAAY,OAAyD;AACzE,WAAO,KAAK,KAAK,uBAAuB,KAAK;AAAA,EAC/C;AAAA;AAAA,EAGA,MAAM,YAAY,IAAY,OAAyD;AACrF,WAAO,KAAK,IAAI,uBAAuB,mBAAmB,EAAE,CAAC,IAAI,KAAK;AAAA,EACxE;AAAA;AAAA,EAGA,MAAM,YAAY,IAA2C;AAC3D,WAAO,KAAK,IAAI,uBAAuB,mBAAmB,EAAE,CAAC,EAAE;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAAU,MAAyE;AACvF,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,MAAM,QAAS,QAAO,IAAI,WAAW,KAAK,OAAO;AACrD,QAAI,MAAM,SAAU,QAAO,IAAI,YAAY,KAAK,QAAQ;AACxD,QAAI,MAAM,iBAAiB,OAAW,QAAO,IAAI,gBAAgB,OAAO,KAAK,YAAY,CAAC;AAC1F,QAAI,MAAM,KAAM,QAAO,IAAI,QAAQ,OAAO,KAAK,IAAI,CAAC;AACpD,QAAI,MAAM,SAAU,QAAO,IAAI,YAAY,OAAO,KAAK,QAAQ,CAAC;AAChE,UAAM,KAAK,OAAO,SAAS;AAC3B,WAAO,KAAK,IAAI,qBAAqB,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE;AAAA,EAC3D;AAAA;AAAA,EAGA,MAAM,iBACJ,UACA,MACiC;AACjC,WAAO,KAAK,MAAM,sBAAsB,EAAE,UAAU,KAAK,CAAC;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAc,SAIjB;AACD,WAAO,KAAK,IAAI,4BAA4B,QAAQ,IAAI,kBAAkB,EAAE,KAAK,GAAG,CAAC,EAAE;AAAA,EACzF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAc,IAAiC;AACnD,WAAO,KAAK,IAAI,6BAA6B,mBAAmB,EAAE,CAAC,OAAO;AAAA,EAC5E;AAAA;AAAA,EAGA,MAAM,aAAa,IAA0C;AAC3D,WAAO,KAAK,IAAI,6BAA6B,mBAAmB,EAAE,CAAC,YAAY;AAAA,EACjF;AAAA;AAAA,EAGA,MAAM,iBAAiB,IAA6B;AAClD,UAAM,MAAM,MAAM,KAAK;AAAA,MACrB,GAAG,KAAK,OAAO,6BAA6B,mBAAmB,EAAE,CAAC;AAAA,MAClE,EAAE,QAAQ,OAAO,SAAS,KAAK,QAAQ,EAAE;AAAA,IAC3C;AACA,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,UAAI,UAAU,QAAQ,IAAI,MAAM;AAChC,UAAI;AACJ,UAAI;AACF,cAAM,OAAO,KAAK,MAAM,IAAI;AAC5B,kBAAU,KAAK,SAAS,KAAK,WAAW;AACxC,eAAO,KAAK;AAAA,MACd,QAAQ;AACN,YAAI,KAAM,WAAU;AAAA,MACtB;AACA,YAAM,IAAI,UAAU,SAAS,IAAI,QAAQ,IAAI;AAAA,IAC/C;AACA,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,mBAAoD;AACxD,WAAO,KAAK,IAAI,uBAAuB;AAAA,EACzC;AAAA;AAAA,EAGA,MAAM,iBAAiB,KAAuD;AAC5E,WAAO,KAAK,KAAK,yBAAyB,EAAE,IAAI,CAAC;AAAA,EACnD;AAAA;AAAA,EAGA,MAAM,sBAAqD;AACzD,WAAO,KAAK,IAAI,uBAAuB;AAAA,EACzC;AACF;;;AC7VO,IAAM,WAAN,MAAe;AAAA,EACZ;AAAA,EAER,YAAY,QAAwB;AAClC,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAwE;AAC5E,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAwB;AAC5B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAA2B;AACzB,WAAO;AAAA,MACL,YAAY,KAAK,OAAO,MAAM,MAAM;AAAA,MACpC,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,aAAa;AAAA,MACb,sBAAsB;AAAA,MACtB,WAAW;AAAA,IACb;AAAA,EACF;AACF;","names":[]}