@tenderprompt/accounts 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/README.md +84 -0
- package/dist/api.d.ts +27 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +73 -0
- package/dist/api.js.map +1 -0
- package/dist/artifact.d.ts +8 -0
- package/dist/artifact.d.ts.map +1 -0
- package/dist/artifact.js +205 -0
- package/dist/artifact.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +4 -0
- package/dist/cli.js.map +1 -0
- package/dist/contracts.d.ts +96 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +5 -0
- package/dist/contracts.js.map +1 -0
- package/dist/errors.d.ts +10 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +19 -0
- package/dist/errors.js.map +1 -0
- package/dist/files.d.ts +21 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +263 -0
- package/dist/files.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +15 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +565 -0
- package/dist/main.js.map +1 -0
- package/dist/processes.d.ts +12 -0
- package/dist/processes.d.ts.map +1 -0
- package/dist/processes.js +44 -0
- package/dist/processes.js.map +1 -0
- package/dist/starter.d.ts +20 -0
- package/dist/starter.d.ts.map +1 -0
- package/dist/starter.js +159 -0
- package/dist/starter.js.map +1 -0
- package/package.json +32 -0
- package/skill/tender-accounts/SKILL.md +111 -0
- package/templates/shopify-customer-account/AGENTS.md +14 -0
- package/templates/shopify-customer-account/README.md +44 -0
- package/templates/shopify-customer-account/apps/gateway/AGENTS.md +9 -0
- package/templates/shopify-customer-account/apps/gateway/README.md +9 -0
- package/templates/shopify-customer-account/apps/gateway/database-schema.json +49 -0
- package/templates/shopify-customer-account/apps/gateway/dot.dev.vars.example +11 -0
- package/templates/shopify-customer-account/apps/gateway/migrations/0001_customer_auth.sql +76 -0
- package/templates/shopify-customer-account/apps/gateway/package.json +25 -0
- package/templates/shopify-customer-account/apps/gateway/scripts/build-worker.mjs +15 -0
- package/templates/shopify-customer-account/apps/gateway/scripts/pack-tender-artifact.mjs +84 -0
- package/templates/shopify-customer-account/apps/gateway/src/platform/customer-auth/hostname-policy.ts +66 -0
- package/templates/shopify-customer-account/apps/gateway/src/platform/customer-auth/schema.ts +90 -0
- package/templates/shopify-customer-account/apps/gateway/src/platform/customer-auth/session-store.ts +864 -0
- package/templates/shopify-customer-account/apps/gateway/src/platform/customer-auth/shopify-route-adapter.ts +1157 -0
- package/templates/shopify-customer-account/apps/gateway/src/platform/runtime-hostname.ts +46 -0
- package/templates/shopify-customer-account/apps/gateway/src/portal-service.test.ts +18 -0
- package/templates/shopify-customer-account/apps/gateway/src/portal-service.ts +51 -0
- package/templates/shopify-customer-account/apps/gateway/src/runtime-config.test.ts +30 -0
- package/templates/shopify-customer-account/apps/gateway/src/runtime-config.ts +56 -0
- package/templates/shopify-customer-account/apps/gateway/src/worker.ts +85 -0
- package/templates/shopify-customer-account/apps/gateway/tender-accounts.json +10 -0
- package/templates/shopify-customer-account/apps/gateway/tender-app.config.json +40 -0
- package/templates/shopify-customer-account/apps/gateway/tsconfig.json +13 -0
- package/templates/shopify-customer-account/apps/gateway/vitest.config.ts +8 -0
- package/templates/shopify-customer-account/apps/gateway/worker-configuration.d.ts +26 -0
- package/templates/shopify-customer-account/apps/gateway/wrangler.jsonc +42 -0
- package/templates/shopify-customer-account/apps/portal/AGENTS.md +9 -0
- package/templates/shopify-customer-account/apps/portal/README.md +5 -0
- package/templates/shopify-customer-account/apps/portal/index.html +13 -0
- package/templates/shopify-customer-account/apps/portal/package.json +33 -0
- package/templates/shopify-customer-account/apps/portal/scripts/build-worker.mjs +11 -0
- package/templates/shopify-customer-account/apps/portal/scripts/pack-tender-artifact.mjs +63 -0
- package/templates/shopify-customer-account/apps/portal/scripts/portal-worker.mjs +84 -0
- package/templates/shopify-customer-account/apps/portal/scripts/portal-worker.test.mjs +14 -0
- package/templates/shopify-customer-account/apps/portal/src/App.tsx +111 -0
- package/templates/shopify-customer-account/apps/portal/src/main.tsx +10 -0
- package/templates/shopify-customer-account/apps/portal/src/styles.css +54 -0
- package/templates/shopify-customer-account/apps/portal/tender-accounts.json +10 -0
- package/templates/shopify-customer-account/apps/portal/tender-app.config.json +19 -0
- package/templates/shopify-customer-account/apps/portal/tsconfig.json +14 -0
- package/templates/shopify-customer-account/apps/portal/vite.config.ts +7 -0
- package/templates/shopify-customer-account/apps/portal/worker-configuration.d.ts +11 -0
- package/templates/shopify-customer-account/apps/portal/wrangler.jsonc +22 -0
- package/templates/shopify-customer-account/dot.dev.vars.example +3 -0
- package/templates/shopify-customer-account/dot.gitignore +9 -0
- package/templates/shopify-customer-account/package.json +22 -0
- package/templates/shopify-customer-account/scripts/artifact-contract.mjs +109 -0
package/README.md
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# `@tenderprompt/accounts`
|
|
2
|
+
|
|
3
|
+
Project-scoped developer CLI for merchant-owned Tender Accounts applications.
|
|
4
|
+
|
|
5
|
+
The package exposes `tender-accounts`. It delegates framework work to commands committed by the merchant repository, verifies the resulting portable artifact, and submits exact preview deliveries without exposing Cloudflare authority. Developer credentials are intentionally unable to publish production.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
The package is not published to the public npm registry during the prototype stage. Install a reviewed package tarball as a development dependency:
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
npm install --save-dev ./tenderprompt-accounts-0.2.0.tgz
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
After registry publication, the equivalent command will be:
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
npm install --save-dev @tenderprompt/accounts
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Create a new application
|
|
22
|
+
|
|
23
|
+
The optional starter creates a merchant-owned two-service repository: a stable Shopify authentication gateway plus an independently deployable React portal connected through `PORTAL_UI`. It does not install dependencies, initialize Git, link projects, contact Tender, or write credentials.
|
|
24
|
+
|
|
25
|
+
Inspect the plan first, then create it in an empty directory:
|
|
26
|
+
|
|
27
|
+
```sh
|
|
28
|
+
npx tender-accounts init --name "Acme customer account" --directory ./acme-account --dry-run --json
|
|
29
|
+
npx tender-accounts init --name "Acme customer account" --directory ./acme-account --json
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
The starter includes:
|
|
33
|
+
|
|
34
|
+
- Shopify Customer Account public-client authentication with S256 PKCE;
|
|
35
|
+
- HttpOnly, exact-host shopper sessions stored in application D1;
|
|
36
|
+
- a service-bound React portal with no customer tokens or confidential bindings;
|
|
37
|
+
- local Wrangler configuration and an explicit signed-out HTTP development state;
|
|
38
|
+
- independent `tender-accounts.json` contracts for gateway and portal;
|
|
39
|
+
- immutable artifact packers, tests, `AGENTS.md`, and the bundled agent skill.
|
|
40
|
+
|
|
41
|
+
Existing applications do not need the starter. Add the repository contract below and keep the merchant's current framework and architecture.
|
|
42
|
+
|
|
43
|
+
## Repository contract
|
|
44
|
+
|
|
45
|
+
Commit `tender-accounts.json` at the root of each independently deployable app:
|
|
46
|
+
|
|
47
|
+
```json
|
|
48
|
+
{
|
|
49
|
+
"schema": "tender.accounts-cli/v1",
|
|
50
|
+
"commands": {
|
|
51
|
+
"dev": "npm run dev",
|
|
52
|
+
"check": "npm run check",
|
|
53
|
+
"package": "npm run pack:tender"
|
|
54
|
+
},
|
|
55
|
+
"artifactDirectory": ".tender/artifacts/current",
|
|
56
|
+
"returnPath": "/account"
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Keep `.tender/` and `.dev.vars` ignored. A merchant administrator creates a short-lived credential scoped to one or more permitted projects. Store it locally as:
|
|
61
|
+
|
|
62
|
+
```dotenv
|
|
63
|
+
TENDER_ACCOUNTS_TOKEN=ta_agent_...
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
In a monorepo, one ignored `.dev.vars` at the Git root can serve app commands invoked with `--cwd`; the CLI never searches beyond that repository boundary.
|
|
67
|
+
|
|
68
|
+
Link the checkout once, then use the normal loop:
|
|
69
|
+
|
|
70
|
+
```sh
|
|
71
|
+
npx tender-accounts link --json
|
|
72
|
+
npx tender-accounts doctor --json
|
|
73
|
+
npx tender-accounts preview --dry-run --json
|
|
74
|
+
npx tender-accounts preview --json
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Install the bundled agent skill into a repository:
|
|
78
|
+
|
|
79
|
+
```sh
|
|
80
|
+
npx tender-accounts skill install --agent codex --json
|
|
81
|
+
npx tender-accounts skill install --agent claude --json
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Run `npx tender-accounts --help` for the complete, layered command reference.
|
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { AgentPrincipal, ArtifactSubmissionResponse, DeveloperDeliveryResponse } from "./contracts.js";
|
|
2
|
+
export declare class AgentApiClient {
|
|
3
|
+
private readonly baseUrl;
|
|
4
|
+
private readonly token;
|
|
5
|
+
private readonly fetcher;
|
|
6
|
+
constructor(baseUrl: string, token: string, fetcher?: typeof fetch);
|
|
7
|
+
whoami(): Promise<AgentPrincipal>;
|
|
8
|
+
createSubmission(projectId: string, input: {
|
|
9
|
+
idempotencyKey: string;
|
|
10
|
+
envelope: unknown;
|
|
11
|
+
}): Promise<ArtifactSubmissionResponse>;
|
|
12
|
+
uploadFile(submissionId: string, fileIndex: number, bytes: Uint8Array): Promise<unknown>;
|
|
13
|
+
finalizeSubmission(submissionId: string): Promise<ArtifactSubmissionResponse>;
|
|
14
|
+
createDelivery(projectId: string, input: {
|
|
15
|
+
submissionId: string;
|
|
16
|
+
idempotencyKey: string;
|
|
17
|
+
}): Promise<DeveloperDeliveryResponse>;
|
|
18
|
+
delivery(deliveryId: string): Promise<DeveloperDeliveryResponse>;
|
|
19
|
+
retryDelivery(deliveryId: string): Promise<unknown>;
|
|
20
|
+
previewSession(deliveryId: string, returnPath: string): Promise<{
|
|
21
|
+
url: string;
|
|
22
|
+
grantId: string;
|
|
23
|
+
expiresAt: number;
|
|
24
|
+
}>;
|
|
25
|
+
private json;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,gBAAgB,CAAC;AAGxB,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAH1B,YACmB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,OAAO,KAAa,EAC5C;IAEJ,MAAM,IAAI,OAAO,CAAC,cAAc,CAAC,CAEhC;IAED,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAK7H;IAED,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAOvF;IAED,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAE5E;IAED,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAK7H;IAED,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAE/D;IAED,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAElD;IAED,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAKnH;YAEa,IAAI;CAsBnB"}
|
package/dist/api.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { CliApiError } from "./errors.js";
|
|
2
|
+
export class AgentApiClient {
|
|
3
|
+
baseUrl;
|
|
4
|
+
token;
|
|
5
|
+
fetcher;
|
|
6
|
+
constructor(baseUrl, token, fetcher = fetch) {
|
|
7
|
+
this.baseUrl = baseUrl;
|
|
8
|
+
this.token = token;
|
|
9
|
+
this.fetcher = fetcher;
|
|
10
|
+
}
|
|
11
|
+
whoami() {
|
|
12
|
+
return this.json("/v1/whoami");
|
|
13
|
+
}
|
|
14
|
+
createSubmission(projectId, input) {
|
|
15
|
+
return this.json(`/v1/projects/${encodeURIComponent(projectId)}/artifact-submissions`, {
|
|
16
|
+
method: "POST",
|
|
17
|
+
body: JSON.stringify(input),
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
uploadFile(submissionId, fileIndex, bytes) {
|
|
21
|
+
const body = bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
|
|
22
|
+
return this.json(`/v1/artifact-submissions/${encodeURIComponent(submissionId)}/files/${fileIndex}`, {
|
|
23
|
+
method: "PUT",
|
|
24
|
+
headers: { "content-type": "application/octet-stream" },
|
|
25
|
+
body,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
finalizeSubmission(submissionId) {
|
|
29
|
+
return this.json(`/v1/artifact-submissions/${encodeURIComponent(submissionId)}/finalize`, { method: "POST" });
|
|
30
|
+
}
|
|
31
|
+
createDelivery(projectId, input) {
|
|
32
|
+
return this.json(`/v1/projects/${encodeURIComponent(projectId)}/deliveries`, {
|
|
33
|
+
method: "POST",
|
|
34
|
+
body: JSON.stringify(input),
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
delivery(deliveryId) {
|
|
38
|
+
return this.json(`/v1/deliveries/${encodeURIComponent(deliveryId)}`);
|
|
39
|
+
}
|
|
40
|
+
retryDelivery(deliveryId) {
|
|
41
|
+
return this.json(`/v1/deliveries/${encodeURIComponent(deliveryId)}/retry`, { method: "POST" });
|
|
42
|
+
}
|
|
43
|
+
previewSession(deliveryId, returnPath) {
|
|
44
|
+
return this.json(`/v1/deliveries/${encodeURIComponent(deliveryId)}/preview-session`, {
|
|
45
|
+
method: "POST",
|
|
46
|
+
body: JSON.stringify({ returnPath }),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async json(path, init = {}) {
|
|
50
|
+
const headers = new Headers(init.headers);
|
|
51
|
+
headers.set("accept", "application/json");
|
|
52
|
+
headers.set("authorization", `Bearer ${this.token}`);
|
|
53
|
+
if (typeof init.body === "string")
|
|
54
|
+
headers.set("content-type", "application/json");
|
|
55
|
+
const response = await this.fetcher(new URL(path, this.baseUrl), { ...init, headers, redirect: "error" });
|
|
56
|
+
let value;
|
|
57
|
+
try {
|
|
58
|
+
value = await response.json();
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
throw new CliApiError("invalid_api_response", `Tender Accounts returned HTTP ${response.status} without JSON.`);
|
|
62
|
+
}
|
|
63
|
+
if (!response.ok) {
|
|
64
|
+
const error = isRecord(value) && isRecord(value.error) ? value.error : null;
|
|
65
|
+
throw new CliApiError(typeof error?.code === "string" ? error.code : "api_request_failed", typeof error?.message === "string" ? error.message : `Tender Accounts returned HTTP ${response.status}.`, typeof error?.requestId === "string" ? error.requestId : response.headers.get("x-request-id") ?? undefined);
|
|
66
|
+
}
|
|
67
|
+
return value;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function isRecord(value) {
|
|
71
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type BuildEnvelope, type VerifiedArtifact } from "./contracts.js";
|
|
2
|
+
export declare function verifyArtifact(directory: string): Promise<VerifiedArtifact>;
|
|
3
|
+
export declare function labelLocalArtifact(artifact: VerifiedArtifact, input: {
|
|
4
|
+
gitRevision: string;
|
|
5
|
+
dirty: boolean;
|
|
6
|
+
}): Promise<VerifiedArtifact>;
|
|
7
|
+
export declare function parseBuildEnvelope(value: string): BuildEnvelope;
|
|
8
|
+
//# sourceMappingURL=artifact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact.d.ts","sourceRoot":"","sources":["../src/artifact.ts"],"names":[],"mappings":"AAGA,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACtB,MAAM,gBAAgB,CAAC;AAQxB,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiCjF;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,gBAAgB,EAC1B,KAAK,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAC7C,OAAO,CAAC,gBAAgB,CAAC,CAM3B;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CA2D/D"}
|
package/dist/artifact.js
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { writeFile } from "node:fs/promises";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
import { BUILD_ENVELOPE_FILENAME, BUILD_ENVELOPE_SCHEMA, } from "./contracts.js";
|
|
5
|
+
import { CliError } from "./errors.js";
|
|
6
|
+
import { readBoundedFile, safeArtifactPath } from "./files.js";
|
|
7
|
+
const MAX_ENVELOPE_BYTES = 1024 * 1024;
|
|
8
|
+
const MAX_FILE_BYTES = 25 * 1024 * 1024;
|
|
9
|
+
const MAX_TOTAL_BYTES = 50 * 1024 * 1024;
|
|
10
|
+
export async function verifyArtifact(directory) {
|
|
11
|
+
const root = resolve(directory);
|
|
12
|
+
const envelopePath = resolve(root, BUILD_ENVELOPE_FILENAME);
|
|
13
|
+
const envelopeText = new TextDecoder("utf8", { fatal: true }).decode(await readBoundedFile(envelopePath, MAX_ENVELOPE_BYTES));
|
|
14
|
+
const envelope = parseBuildEnvelope(envelopeText);
|
|
15
|
+
const descriptors = [
|
|
16
|
+
{ path: "worker.mjs", descriptor: envelope.manifest.module },
|
|
17
|
+
...envelope.manifest.files.map((descriptor) => ({ path: `assets/${descriptor.path}`, descriptor })),
|
|
18
|
+
];
|
|
19
|
+
let totalBytes = 0;
|
|
20
|
+
for (const { path, descriptor } of descriptors) {
|
|
21
|
+
const bytes = await readBoundedFile(safeArtifactPath(root, path), Math.min(descriptor.bytes, MAX_FILE_BYTES));
|
|
22
|
+
if (bytes.byteLength !== descriptor.bytes || sha256(bytes) !== descriptor.sha256) {
|
|
23
|
+
throw new CliError("artifact_integrity_failed", `Artifact bytes do not match the retained descriptor for ${path}.`);
|
|
24
|
+
}
|
|
25
|
+
totalBytes += bytes.byteLength;
|
|
26
|
+
}
|
|
27
|
+
if (totalBytes > MAX_TOTAL_BYTES) {
|
|
28
|
+
throw new CliError("artifact_too_large", "The artifact exceeds the 50 MiB developer-delivery limit.");
|
|
29
|
+
}
|
|
30
|
+
const calculatedBundleDigest = sha256(Buffer.from(JSON.stringify(artifactContentLedger(envelope.manifest))));
|
|
31
|
+
if (calculatedBundleDigest !== envelope.bundleDigest) {
|
|
32
|
+
throw new CliError("artifact_integrity_failed", "The artifact manifest does not match its bundle digest.");
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
directory: root,
|
|
36
|
+
envelopePath,
|
|
37
|
+
envelope,
|
|
38
|
+
fileCount: descriptors.length,
|
|
39
|
+
totalBytes,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export async function labelLocalArtifact(artifact, input) {
|
|
43
|
+
if (!input.dirty)
|
|
44
|
+
return artifact;
|
|
45
|
+
const sourceRevision = `local-${input.gitRevision.slice(0, 12)}-${artifact.envelope.bundleDigest.slice(0, 12)}`;
|
|
46
|
+
const envelope = { ...artifact.envelope, sourceRevision };
|
|
47
|
+
await writeFile(artifact.envelopePath, `${JSON.stringify(envelope, null, 2)}\n`, "utf8");
|
|
48
|
+
return { ...artifact, envelope };
|
|
49
|
+
}
|
|
50
|
+
export function parseBuildEnvelope(value) {
|
|
51
|
+
let candidate;
|
|
52
|
+
try {
|
|
53
|
+
candidate = JSON.parse(value);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
throw new CliError("artifact_envelope_invalid", "The artifact build envelope is not valid JSON.");
|
|
57
|
+
}
|
|
58
|
+
if (!isRecord(candidate) || candidate.schema !== BUILD_ENVELOPE_SCHEMA || !isRecord(candidate.manifest)) {
|
|
59
|
+
throw new CliError("artifact_envelope_invalid", `The artifact must use ${BUILD_ENVELOPE_SCHEMA}.`);
|
|
60
|
+
}
|
|
61
|
+
const sourceRevision = requiredSourceRevision(candidate.sourceRevision);
|
|
62
|
+
const bundleDigest = requiredDigest(candidate.bundleDigest, "bundle digest");
|
|
63
|
+
const manifest = candidate.manifest;
|
|
64
|
+
if (manifest.schema !== "tender.account-artifact/v1" || !isRecord(manifest.app) || !isRecord(manifest.runtime)) {
|
|
65
|
+
throw new CliError("artifact_manifest_invalid", "The artifact manifest uses an unsupported shape.");
|
|
66
|
+
}
|
|
67
|
+
if (manifest.app.fixture === true) {
|
|
68
|
+
throw new CliError("artifact_manifest_invalid", "Merchant artifacts cannot identify themselves as platform fixtures.");
|
|
69
|
+
}
|
|
70
|
+
const app = {
|
|
71
|
+
...manifest.app,
|
|
72
|
+
slug: requiredString(manifest.app.slug, "app slug"),
|
|
73
|
+
label: requiredString(manifest.app.label, "app label"),
|
|
74
|
+
version: requiredString(manifest.app.version, "app version"),
|
|
75
|
+
fixture: false,
|
|
76
|
+
};
|
|
77
|
+
const runtime = {
|
|
78
|
+
...manifest.runtime,
|
|
79
|
+
kind: requiredString(manifest.runtime.kind, "runtime kind"),
|
|
80
|
+
assetPrefix: requiredString(manifest.runtime.assetPrefix, "asset prefix"),
|
|
81
|
+
};
|
|
82
|
+
if (runtime.kind !== "worker" && runtime.kind !== "worker-assets") {
|
|
83
|
+
throw new CliError("artifact_manifest_invalid", "Developer delivery requires a compiled Worker module.");
|
|
84
|
+
}
|
|
85
|
+
if (runtime.assetPrefix !== `/_tenant-artifacts/${bundleDigest}`) {
|
|
86
|
+
throw new CliError("artifact_manifest_invalid", "The artifact asset prefix does not match its bundle digest.");
|
|
87
|
+
}
|
|
88
|
+
const module = artifactModule(manifest.module);
|
|
89
|
+
const files = artifactFiles(manifest.files);
|
|
90
|
+
if (!Array.isArray(manifest.resources) || !Array.isArray(manifest.services)) {
|
|
91
|
+
throw new CliError("artifact_manifest_invalid", "The artifact resource and service declarations must be arrays.");
|
|
92
|
+
}
|
|
93
|
+
const secrets = manifest.secrets === undefined ? undefined : secretNames(manifest.secrets);
|
|
94
|
+
return {
|
|
95
|
+
schema: BUILD_ENVELOPE_SCHEMA,
|
|
96
|
+
sourceRevision,
|
|
97
|
+
bundleDigest,
|
|
98
|
+
manifest: {
|
|
99
|
+
...manifest,
|
|
100
|
+
schema: "tender.account-artifact/v1",
|
|
101
|
+
app,
|
|
102
|
+
runtime,
|
|
103
|
+
module,
|
|
104
|
+
files,
|
|
105
|
+
resources: manifest.resources,
|
|
106
|
+
services: manifest.services,
|
|
107
|
+
...(secrets === undefined ? {} : { secrets }),
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function artifactModule(value) {
|
|
112
|
+
if (!isRecord(value) || value.path !== "worker.mjs" || value.contentType !== "application/javascript+module") {
|
|
113
|
+
throw new CliError("artifact_manifest_invalid", "The artifact Worker module descriptor is missing or invalid.");
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
path: "worker.mjs",
|
|
117
|
+
sha256: requiredDigest(value.sha256, "Worker module digest"),
|
|
118
|
+
bytes: requiredBytes(value.bytes, "Worker module bytes"),
|
|
119
|
+
contentType: "application/javascript+module",
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function artifactFiles(value) {
|
|
123
|
+
if (!Array.isArray(value) || value.length > 249) {
|
|
124
|
+
throw new CliError("artifact_manifest_invalid", "The artifact public file list is invalid.");
|
|
125
|
+
}
|
|
126
|
+
const result = [];
|
|
127
|
+
let previous = "";
|
|
128
|
+
for (const candidate of value) {
|
|
129
|
+
if (!isRecord(candidate))
|
|
130
|
+
throw new CliError("artifact_manifest_invalid", "An artifact file descriptor is invalid.");
|
|
131
|
+
const path = requiredString(candidate.path, "artifact path");
|
|
132
|
+
if (!isSafePath(path) || (previous && path.localeCompare(previous) <= 0)) {
|
|
133
|
+
throw new CliError("artifact_manifest_invalid", "Artifact paths must be safe, unique, and sorted.");
|
|
134
|
+
}
|
|
135
|
+
result.push({
|
|
136
|
+
path,
|
|
137
|
+
sha256: requiredDigest(candidate.sha256, `digest for ${path}`),
|
|
138
|
+
bytes: requiredBytes(candidate.bytes, `bytes for ${path}`, true),
|
|
139
|
+
});
|
|
140
|
+
previous = path;
|
|
141
|
+
}
|
|
142
|
+
return result;
|
|
143
|
+
}
|
|
144
|
+
function secretNames(value) {
|
|
145
|
+
if (!Array.isArray(value) || value.length > 32) {
|
|
146
|
+
throw new CliError("artifact_manifest_invalid", "The artifact secret declaration list is invalid.");
|
|
147
|
+
}
|
|
148
|
+
const result = [];
|
|
149
|
+
let previous = "";
|
|
150
|
+
for (const candidate of value) {
|
|
151
|
+
if (typeof candidate !== "string" || !/^[A-Z][A-Z0-9_]{2,63}$/u.test(candidate)
|
|
152
|
+
|| candidate.startsWith("TENDER_") || candidate === "ASSETS"
|
|
153
|
+
|| (previous && candidate.localeCompare(previous) <= 0)) {
|
|
154
|
+
throw new CliError("artifact_manifest_invalid", "Artifact secret names must be safe, unique, and sorted.");
|
|
155
|
+
}
|
|
156
|
+
result.push(candidate);
|
|
157
|
+
previous = candidate;
|
|
158
|
+
}
|
|
159
|
+
return result;
|
|
160
|
+
}
|
|
161
|
+
function artifactContentLedger(manifest) {
|
|
162
|
+
if (manifest.databaseSchema !== undefined) {
|
|
163
|
+
return { module: manifest.module, files: manifest.files, databaseSchema: manifest.databaseSchema };
|
|
164
|
+
}
|
|
165
|
+
return { module: manifest.module, files: manifest.files };
|
|
166
|
+
}
|
|
167
|
+
function requiredSourceRevision(value) {
|
|
168
|
+
if (typeof value !== "string" || value.length < 7 || value.length > 128
|
|
169
|
+
|| !/^[A-Za-z0-9][A-Za-z0-9._-]*$/u.test(value)) {
|
|
170
|
+
throw new CliError("artifact_envelope_invalid", "The artifact source revision is invalid.");
|
|
171
|
+
}
|
|
172
|
+
return value;
|
|
173
|
+
}
|
|
174
|
+
function requiredString(value, label) {
|
|
175
|
+
if (typeof value !== "string" || value.length === 0 || value.length > 512) {
|
|
176
|
+
throw new CliError("artifact_manifest_invalid", `The ${label} is invalid.`);
|
|
177
|
+
}
|
|
178
|
+
return value;
|
|
179
|
+
}
|
|
180
|
+
function requiredDigest(value, label) {
|
|
181
|
+
const digest = requiredString(value, label).toLowerCase();
|
|
182
|
+
if (!/^[a-f0-9]{64}$/u.test(digest))
|
|
183
|
+
throw new CliError("artifact_manifest_invalid", `The ${label} is invalid.`);
|
|
184
|
+
return digest;
|
|
185
|
+
}
|
|
186
|
+
function requiredBytes(value, label, allowZero = false) {
|
|
187
|
+
if (typeof value !== "number" || !Number.isSafeInteger(value)
|
|
188
|
+
|| value < (allowZero ? 0 : 1) || value > MAX_FILE_BYTES) {
|
|
189
|
+
throw new CliError("artifact_manifest_invalid", `The ${label} is invalid.`);
|
|
190
|
+
}
|
|
191
|
+
return value;
|
|
192
|
+
}
|
|
193
|
+
function isSafePath(value) {
|
|
194
|
+
return value.length <= 512 && !value.startsWith("/") && !value.endsWith("/")
|
|
195
|
+
&& !value.includes("\\") && !value.includes("%")
|
|
196
|
+
&& value.split("/").every((segment) => segment.length > 0 && segment !== "." && segment !== ".."
|
|
197
|
+
&& /^[A-Za-z0-9][A-Za-z0-9._-]*$/u.test(segment));
|
|
198
|
+
}
|
|
199
|
+
function sha256(value) {
|
|
200
|
+
return createHash("sha256").update(value).digest("hex");
|
|
201
|
+
}
|
|
202
|
+
function isRecord(value) {
|
|
203
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=artifact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact.js","sourceRoot":"","sources":["../src/artifact.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,OAAO,CAAC,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
export declare const CLI_CONFIG_SCHEMA: "tender.accounts-cli/v1";
|
|
2
|
+
export declare const CLI_LINK_SCHEMA: "tender.accounts-link/v1";
|
|
3
|
+
export declare const BUILD_ENVELOPE_SCHEMA: "tender.external-app-build/v1";
|
|
4
|
+
export declare const BUILD_ENVELOPE_FILENAME: "tender-accounts-build.json";
|
|
5
|
+
export interface ProjectConfig {
|
|
6
|
+
schema: typeof CLI_CONFIG_SCHEMA;
|
|
7
|
+
commands: {
|
|
8
|
+
dev?: string;
|
|
9
|
+
check: string;
|
|
10
|
+
package: string;
|
|
11
|
+
};
|
|
12
|
+
artifactDirectory: string;
|
|
13
|
+
returnPath: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ProjectLink {
|
|
16
|
+
schema: typeof CLI_LINK_SCHEMA;
|
|
17
|
+
projectId: string;
|
|
18
|
+
apiUrl: string;
|
|
19
|
+
}
|
|
20
|
+
export interface AgentProject {
|
|
21
|
+
projectId: string;
|
|
22
|
+
role: "developer" | "viewer";
|
|
23
|
+
}
|
|
24
|
+
export interface AgentPrincipal {
|
|
25
|
+
schema: "tender.agent-principal/v1";
|
|
26
|
+
credentialId: string;
|
|
27
|
+
tenantId: string;
|
|
28
|
+
ownerEmail: string;
|
|
29
|
+
label: string;
|
|
30
|
+
projects: AgentProject[];
|
|
31
|
+
}
|
|
32
|
+
export interface ArtifactFileDescriptor {
|
|
33
|
+
path: string;
|
|
34
|
+
sha256: string;
|
|
35
|
+
bytes: number;
|
|
36
|
+
}
|
|
37
|
+
export interface ArtifactModuleDescriptor extends ArtifactFileDescriptor {
|
|
38
|
+
path: "worker.mjs";
|
|
39
|
+
contentType: "application/javascript+module";
|
|
40
|
+
}
|
|
41
|
+
export interface BuildEnvelope {
|
|
42
|
+
schema: typeof BUILD_ENVELOPE_SCHEMA;
|
|
43
|
+
sourceRevision: string;
|
|
44
|
+
bundleDigest: string;
|
|
45
|
+
manifest: Record<string, unknown> & {
|
|
46
|
+
schema: "tender.account-artifact/v1";
|
|
47
|
+
app: Record<string, unknown> & {
|
|
48
|
+
slug: string;
|
|
49
|
+
label: string;
|
|
50
|
+
version: string;
|
|
51
|
+
fixture: boolean;
|
|
52
|
+
};
|
|
53
|
+
runtime: Record<string, unknown> & {
|
|
54
|
+
kind: string;
|
|
55
|
+
assetPrefix: string;
|
|
56
|
+
};
|
|
57
|
+
module: ArtifactModuleDescriptor;
|
|
58
|
+
files: ArtifactFileDescriptor[];
|
|
59
|
+
resources: unknown[];
|
|
60
|
+
services: unknown[];
|
|
61
|
+
secrets?: string[];
|
|
62
|
+
databaseSchema?: unknown;
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export interface VerifiedArtifact {
|
|
66
|
+
directory: string;
|
|
67
|
+
envelopePath: string;
|
|
68
|
+
envelope: BuildEnvelope;
|
|
69
|
+
fileCount: number;
|
|
70
|
+
totalBytes: number;
|
|
71
|
+
}
|
|
72
|
+
export interface ArtifactSubmissionResponse {
|
|
73
|
+
id: string;
|
|
74
|
+
status: "uploading" | "ready" | "failed";
|
|
75
|
+
releaseId: string | null;
|
|
76
|
+
files: Array<{
|
|
77
|
+
index: number;
|
|
78
|
+
path: string;
|
|
79
|
+
bytes: number;
|
|
80
|
+
uploaded: boolean;
|
|
81
|
+
}>;
|
|
82
|
+
}
|
|
83
|
+
export interface DeveloperDeliveryResponse {
|
|
84
|
+
id: string;
|
|
85
|
+
projectId?: string;
|
|
86
|
+
workflow: {
|
|
87
|
+
id: string;
|
|
88
|
+
status: "requested" | "running" | "succeeded" | "failed";
|
|
89
|
+
result: Record<string, unknown> | null;
|
|
90
|
+
error: {
|
|
91
|
+
code: string;
|
|
92
|
+
message: string;
|
|
93
|
+
} | null;
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export const CLI_CONFIG_SCHEMA = "tender.accounts-cli/v1";
|
|
2
|
+
export const CLI_LINK_SCHEMA = "tender.accounts-link/v1";
|
|
3
|
+
export const BUILD_ENVELOPE_SCHEMA = "tender.external-app-build/v1";
|
|
4
|
+
export const BUILD_ENVELOPE_FILENAME = "tender-accounts-build.json";
|
|
5
|
+
//# sourceMappingURL=contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG,wBAAiC,CAAC;AACnE,MAAM,CAAC,MAAM,eAAe,GAAG,yBAAkC,CAAC;AAClE,MAAM,CAAC,MAAM,qBAAqB,GAAG,8BAAuC,CAAC;AAC7E,MAAM,CAAC,MAAM,uBAAuB,GAAG,4BAAqC,CAAC"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare class CliError extends Error {
|
|
2
|
+
readonly code: string;
|
|
3
|
+
readonly hint?: string | undefined;
|
|
4
|
+
constructor(code: string, message: string, hint?: string | undefined);
|
|
5
|
+
}
|
|
6
|
+
export declare class CliApiError extends CliError {
|
|
7
|
+
readonly requestId?: string | undefined;
|
|
8
|
+
constructor(code: string, message: string, requestId?: string | undefined);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAS,SAAQ,KAAK;IAE/B,QAAQ,CAAC,IAAI,EAAE,MAAM;IAErB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM;IAHxB,YACW,IAAI,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACN,IAAI,CAAC,EAAE,MAAM,YAAA,EAIvB;CACF;AAED,qBAAa,WAAY,SAAQ,QAAQ;IAIrC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM;IAH7B,YACE,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACN,SAAS,CAAC,EAAE,MAAM,YAAA,EAI5B;CACF"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export class CliError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
hint;
|
|
4
|
+
constructor(code, message, hint) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.code = code;
|
|
7
|
+
this.hint = hint;
|
|
8
|
+
this.name = "CliError";
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export class CliApiError extends CliError {
|
|
12
|
+
requestId;
|
|
13
|
+
constructor(code, message, requestId) {
|
|
14
|
+
super(code, message);
|
|
15
|
+
this.requestId = requestId;
|
|
16
|
+
this.name = "CliApiError";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IAEtB,IAAI;IAEJ,IAAI;IAHf,YACW,IAAY,EACrB,OAAe,EACN,IAAa;QAEtB,KAAK,CAAC,OAAO,CAAC,CAAC;oBAJN,IAAI;oBAEJ,IAAI;QAGb,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,WAAY,SAAQ,QAAQ;IAI5B,SAAS;IAHpB,YACE,IAAY,EACZ,OAAe,EACN,SAAkB;QAE3B,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;yBAFZ,SAAS;QAGlB,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF"}
|
package/dist/files.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type ProjectConfig, type ProjectLink } from "./contracts.js";
|
|
2
|
+
export interface ProjectContext {
|
|
3
|
+
root: string;
|
|
4
|
+
configPath: string;
|
|
5
|
+
config: ProjectConfig;
|
|
6
|
+
linkPath: string;
|
|
7
|
+
link: ProjectLink | null;
|
|
8
|
+
}
|
|
9
|
+
export declare function loadProjectContext(startDirectory: string): Promise<ProjectContext>;
|
|
10
|
+
export declare function parseProjectConfig(value: string): ProjectConfig;
|
|
11
|
+
export declare function parseProjectLink(value: string): ProjectLink;
|
|
12
|
+
export declare function writeProjectLink(root: string, link: ProjectLink): Promise<string>;
|
|
13
|
+
export declare function readToken(root: string, environment: NodeJS.ProcessEnv, stdin?: NodeJS.ReadableStream): Promise<string>;
|
|
14
|
+
export declare function validateToken(value: string): string;
|
|
15
|
+
export declare function normalizeApiUrl(value: unknown): string;
|
|
16
|
+
export declare function resolveArtifactDirectory(context: ProjectContext): string;
|
|
17
|
+
export declare function readBoundedFile(path: string, maximumBytes: number): Promise<Uint8Array>;
|
|
18
|
+
export declare function pathExists(path: string): Promise<boolean>;
|
|
19
|
+
export declare function safeArtifactPath(root: string, path: string): string;
|
|
20
|
+
export declare function requiredProjectId(value: unknown): string;
|
|
21
|
+
//# sourceMappingURL=files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,WAAW,EACjB,MAAM,gBAAgB,CAAC;AAMxB,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;CAC1B;AAED,wBAAsB,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAYxF;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAoB/D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAU3D;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAkBvF;AAED,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,CAAC,UAAU,EAC9B,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,GAC5B,OAAO,CAAC,MAAM,CAAC,CAyBjB;AAgBD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMnD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAgBtD;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAIxE;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAoB7F;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ/D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAOnE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAKxD"}
|