@workplane/core 0.3.1 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +8 -5
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -38,20 +38,23 @@ import { z } from "zod";
|
|
|
38
38
|
|
|
39
39
|
// src/env.ts
|
|
40
40
|
import { config as dotenvConfig } from "dotenv";
|
|
41
|
+
import { homedir } from "os";
|
|
42
|
+
import { join } from "path";
|
|
41
43
|
var envLoaded = false;
|
|
42
44
|
function loadLocalEnv() {
|
|
43
45
|
if (envLoaded) {
|
|
44
46
|
return;
|
|
45
47
|
}
|
|
48
|
+
dotenvConfig({ path: ".env.local" });
|
|
49
|
+
dotenvConfig({ path: join(homedir(), ".workplane", ".env") });
|
|
46
50
|
dotenvConfig({ path: ".env" });
|
|
47
|
-
dotenvConfig({ path: ".env.local", override: true });
|
|
48
51
|
envLoaded = true;
|
|
49
52
|
}
|
|
50
53
|
|
|
51
54
|
// src/config.ts
|
|
52
55
|
loadLocalEnv();
|
|
53
56
|
var serverEnvSchema = z.object({
|
|
54
|
-
DATABASE_URL: z.string().
|
|
57
|
+
DATABASE_URL: z.string().optional().default("sqlite://~/.workplane/workplane.db"),
|
|
55
58
|
WORKPLANE_SERVER_PORT: z.string().optional().default("8787").transform((value) => Number.parseInt(value, 10)),
|
|
56
59
|
WORKPLANE_NODE_TOKEN: z.string().optional(),
|
|
57
60
|
WORKPLANE_OPERATOR_TOKEN: z.string().optional(),
|
|
@@ -93,9 +96,9 @@ function parseCsv(value) {
|
|
|
93
96
|
}
|
|
94
97
|
|
|
95
98
|
// src/git.ts
|
|
96
|
-
import { join } from "path";
|
|
99
|
+
import { join as join2 } from "path";
|
|
97
100
|
function repoPath(workspacePath) {
|
|
98
|
-
return
|
|
101
|
+
return join2(workspacePath, "repo");
|
|
99
102
|
}
|
|
100
103
|
async function createTaskBranch(context, branchName) {
|
|
101
104
|
const cwd = repoPath(context.workspacePath);
|
|
@@ -112,7 +115,7 @@ async function captureGitDiff(context, adapterName, artifactName = "changes.diff
|
|
|
112
115
|
const cwd = repoPath(context.workspacePath);
|
|
113
116
|
const diffResult = await context.exec("git", ["diff"], { cwd });
|
|
114
117
|
const artifactsPath = await context.ensureWorkspace("artifacts");
|
|
115
|
-
const diffPath =
|
|
118
|
+
const diffPath = join2(artifactsPath, artifactName);
|
|
116
119
|
const { writeFile } = await import("fs/promises");
|
|
117
120
|
await writeFile(diffPath, diffResult.stdout, "utf8");
|
|
118
121
|
await context.emitArtifact({
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auth.ts","../src/capabilities.ts","../src/config.ts","../src/env.ts","../src/git.ts","../src/http-client.ts","../src/ids.ts"],"sourcesContent":["import type { IncomingMessage } from \"node:http\";\n\nexport function parseBearerToken(authorizationHeader: string | undefined): string | undefined {\n if (!authorizationHeader) {\n return undefined;\n }\n const match = /^Bearer\\s+(.+)$/i.exec(authorizationHeader.trim());\n return match?.[1];\n}\n\nexport function isAuthorizedBearer(provided: string | undefined, expected: string | undefined): boolean {\n if (!expected) {\n return true;\n }\n if (!provided) {\n return false;\n }\n return provided === expected;\n}\n\nexport function getRequestBearer(req: IncomingMessage): string | undefined {\n const header = req.headers.authorization;\n const value = Array.isArray(header) ? header[0] : header;\n return parseBearerToken(value);\n}\n\nexport function authHeaders(token: string | undefined): Record<string, string> {\n if (!token) {\n return {};\n }\n return { authorization: `Bearer ${token}` };\n}\n","export function hasRequiredCapabilities(\n nodeCapabilities: string[],\n requiredCapabilities: string[],\n): boolean {\n const capabilitySet = new Set(nodeCapabilities);\n return requiredCapabilities.every((capability) => capabilitySet.has(capability));\n}\n\n","import { z } from \"zod\";\nimport { loadLocalEnv } from \"./env.js\";\n\nloadLocalEnv();\n\nconst serverEnvSchema = z.object({\n DATABASE_URL: z.string().min(1),\n WORKPLANE_SERVER_PORT: z\n .string()\n .optional()\n .default(\"8787\")\n .transform((value) => Number.parseInt(value, 10)),\n WORKPLANE_NODE_TOKEN: z.string().optional(),\n WORKPLANE_OPERATOR_TOKEN: z.string().optional(),\n WORKPLANE_ENV_ALLOWLIST: z.string().optional(),\n});\n\nconst nodeEnvSchema = z.object({\n WORKPLANE_SERVER_URL: z.string().url().optional().default(\"http://localhost:8787\"),\n WORKPLANE_NODE_NAME: z.string().optional().default(\"local-node-1\"),\n WORKPLANE_NODE_ID: z.string().optional(),\n WORKPLANE_NODE_CAPABILITIES: z\n .string()\n .optional()\n .default(\"shell,git,node,typescript,aider,ollama,codex,claude-code\"),\n WORKPLANE_NODE_TOKEN: z.string().optional(),\n WORKPLANE_POLL_INTERVAL_MS: z\n .string()\n .optional()\n .default(\"3000\")\n .transform((value) => Number.parseInt(value, 10)),\n WORKPLANE_ENV_ALLOWLIST: z.string().optional(),\n});\n\nexport interface ServerConfig {\n databaseUrl: string;\n port: number;\n nodeToken?: string;\n operatorToken?: string;\n envAllowlist: string[];\n}\n\nexport interface NodeConfig {\n serverUrl: string;\n nodeName: string;\n nodeId?: string;\n nodeCapabilities: string[];\n nodeToken?: string;\n pollIntervalMs: number;\n envAllowlist: string[];\n}\n\nexport function loadServerConfig(env: NodeJS.ProcessEnv = process.env): ServerConfig {\n const parsed = serverEnvSchema.parse(env);\n\n return {\n databaseUrl: parsed.DATABASE_URL,\n port: parsed.WORKPLANE_SERVER_PORT,\n nodeToken: parsed.WORKPLANE_NODE_TOKEN,\n operatorToken: parsed.WORKPLANE_OPERATOR_TOKEN,\n envAllowlist: parseCsv(parsed.WORKPLANE_ENV_ALLOWLIST ?? \"\"),\n };\n}\n\nexport function loadNodeConfig(env: NodeJS.ProcessEnv = process.env): NodeConfig {\n const parsed = nodeEnvSchema.parse(env);\n\n return {\n serverUrl: parsed.WORKPLANE_SERVER_URL,\n nodeName: parsed.WORKPLANE_NODE_NAME,\n nodeId: parsed.WORKPLANE_NODE_ID,\n nodeCapabilities: parseCsv(parsed.WORKPLANE_NODE_CAPABILITIES),\n nodeToken: parsed.WORKPLANE_NODE_TOKEN,\n pollIntervalMs: parsed.WORKPLANE_POLL_INTERVAL_MS,\n envAllowlist: parseCsv(parsed.WORKPLANE_ENV_ALLOWLIST ?? \"\"),\n };\n}\n\nexport function parseCsv(value: string): string[] {\n return value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n","import { config as dotenvConfig } from \"dotenv\";\n\nlet envLoaded = false;\n\nexport function loadLocalEnv(): void {\n if (envLoaded) {\n return;\n }\n\n dotenvConfig({ path: \".env\" });\n dotenvConfig({ path: \".env.local\", override: true });\n\n envLoaded = true;\n}\n\n","import { join } from \"node:path\";\n\nexport interface GitExecContext {\n workspacePath: string;\n runId: string;\n log: (stream: \"stdout\" | \"stderr\" | \"system\", message: string, stepName?: string) => Promise<void>;\n exec: (\n command: string,\n args?: string[],\n options?: { cwd?: string },\n ) => Promise<{ exitCode: number; stdout: string; stderr: string }>;\n ensureWorkspace: (...segments: string[]) => Promise<string>;\n emitArtifact: (input: {\n type: string;\n name: string;\n path: string;\n metadata?: Record<string, unknown>;\n }) => Promise<void>;\n}\n\nexport function repoPath(workspacePath: string): string {\n return join(workspacePath, \"repo\");\n}\n\nexport async function createTaskBranch(context: GitExecContext, branchName: string): Promise<void> {\n const cwd = repoPath(context.workspacePath);\n await context.log(\"system\", `creating branch ${branchName}`, \"git-branch\");\n const checkout = await context.exec(\"git\", [\"checkout\", \"-b\", branchName], { cwd });\n if (checkout.exitCode !== 0) {\n throw new Error(`git checkout -b failed with exit code ${checkout.exitCode}`);\n }\n}\n\nexport function defaultTaskBranchName(runId: string): string {\n return `workplane/${runId}`;\n}\n\nexport async function captureGitDiff(\n context: GitExecContext,\n adapterName: string,\n artifactName = \"changes.diff\",\n): Promise<string> {\n const cwd = repoPath(context.workspacePath);\n const diffResult = await context.exec(\"git\", [\"diff\"], { cwd });\n const artifactsPath = await context.ensureWorkspace(\"artifacts\");\n const diffPath = join(artifactsPath, artifactName);\n const { writeFile } = await import(\"node:fs/promises\");\n await writeFile(diffPath, diffResult.stdout, \"utf8\");\n await context.emitArtifact({\n type: \"diff\",\n name: artifactName,\n path: diffPath,\n metadata: { adapter: adapterName },\n });\n return diffPath;\n}\n","import { authHeaders } from \"./auth.js\";\n\nexport interface WorkplaneHttpOptions {\n method?: string;\n body?: unknown;\n nodeToken?: string;\n operatorToken?: string;\n}\n\nexport function buildWorkplaneHeaders(options: WorkplaneHttpOptions = {}): Record<string, string> {\n const token = options.nodeToken ?? options.operatorToken;\n return {\n \"content-type\": \"application/json\",\n ...authHeaders(token),\n };\n}\n\nexport async function workplaneFetch<T>(\n serverUrl: string,\n path: string,\n options: WorkplaneHttpOptions = {},\n): Promise<T> {\n const response = await fetch(`${serverUrl}${path}`, {\n method: options.method ?? \"GET\",\n headers: buildWorkplaneHeaders(options),\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`${response.status} ${response.statusText} from ${path}: ${text}`);\n }\n\n return (await response.json()) as T;\n}\n","import { randomUUID } from \"node:crypto\";\n\nexport function makeId(prefix: string): string {\n return `${prefix}_${randomUUID().replace(/-/g, \"\").slice(0, 12)}`;\n}\n\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/auth.ts","../src/capabilities.ts","../src/config.ts","../src/env.ts","../src/git.ts","../src/http-client.ts","../src/ids.ts"],"sourcesContent":["import type { IncomingMessage } from \"node:http\";\n\nexport function parseBearerToken(authorizationHeader: string | undefined): string | undefined {\n if (!authorizationHeader) {\n return undefined;\n }\n const match = /^Bearer\\s+(.+)$/i.exec(authorizationHeader.trim());\n return match?.[1];\n}\n\nexport function isAuthorizedBearer(provided: string | undefined, expected: string | undefined): boolean {\n if (!expected) {\n return true;\n }\n if (!provided) {\n return false;\n }\n return provided === expected;\n}\n\nexport function getRequestBearer(req: IncomingMessage): string | undefined {\n const header = req.headers.authorization;\n const value = Array.isArray(header) ? header[0] : header;\n return parseBearerToken(value);\n}\n\nexport function authHeaders(token: string | undefined): Record<string, string> {\n if (!token) {\n return {};\n }\n return { authorization: `Bearer ${token}` };\n}\n","export function hasRequiredCapabilities(\n nodeCapabilities: string[],\n requiredCapabilities: string[],\n): boolean {\n const capabilitySet = new Set(nodeCapabilities);\n return requiredCapabilities.every((capability) => capabilitySet.has(capability));\n}\n\n","import { z } from \"zod\";\nimport { loadLocalEnv } from \"./env.js\";\n\nloadLocalEnv();\n\nconst serverEnvSchema = z.object({\n DATABASE_URL: z.string().optional().default(\"sqlite://~/.workplane/workplane.db\"),\n WORKPLANE_SERVER_PORT: z\n .string()\n .optional()\n .default(\"8787\")\n .transform((value) => Number.parseInt(value, 10)),\n WORKPLANE_NODE_TOKEN: z.string().optional(),\n WORKPLANE_OPERATOR_TOKEN: z.string().optional(),\n WORKPLANE_ENV_ALLOWLIST: z.string().optional(),\n});\n\nconst nodeEnvSchema = z.object({\n WORKPLANE_SERVER_URL: z.string().url().optional().default(\"http://localhost:8787\"),\n WORKPLANE_NODE_NAME: z.string().optional().default(\"local-node-1\"),\n WORKPLANE_NODE_ID: z.string().optional(),\n WORKPLANE_NODE_CAPABILITIES: z\n .string()\n .optional()\n .default(\"shell,git,node,typescript,aider,ollama,codex,claude-code\"),\n WORKPLANE_NODE_TOKEN: z.string().optional(),\n WORKPLANE_POLL_INTERVAL_MS: z\n .string()\n .optional()\n .default(\"3000\")\n .transform((value) => Number.parseInt(value, 10)),\n WORKPLANE_ENV_ALLOWLIST: z.string().optional(),\n});\n\nexport interface ServerConfig {\n databaseUrl: string;\n port: number;\n nodeToken?: string;\n operatorToken?: string;\n envAllowlist: string[];\n}\n\nexport interface NodeConfig {\n serverUrl: string;\n nodeName: string;\n nodeId?: string;\n nodeCapabilities: string[];\n nodeToken?: string;\n pollIntervalMs: number;\n envAllowlist: string[];\n}\n\nexport function loadServerConfig(env: NodeJS.ProcessEnv = process.env): ServerConfig {\n const parsed = serverEnvSchema.parse(env);\n\n return {\n databaseUrl: parsed.DATABASE_URL,\n port: parsed.WORKPLANE_SERVER_PORT,\n nodeToken: parsed.WORKPLANE_NODE_TOKEN,\n operatorToken: parsed.WORKPLANE_OPERATOR_TOKEN,\n envAllowlist: parseCsv(parsed.WORKPLANE_ENV_ALLOWLIST ?? \"\"),\n };\n}\n\nexport function loadNodeConfig(env: NodeJS.ProcessEnv = process.env): NodeConfig {\n const parsed = nodeEnvSchema.parse(env);\n\n return {\n serverUrl: parsed.WORKPLANE_SERVER_URL,\n nodeName: parsed.WORKPLANE_NODE_NAME,\n nodeId: parsed.WORKPLANE_NODE_ID,\n nodeCapabilities: parseCsv(parsed.WORKPLANE_NODE_CAPABILITIES),\n nodeToken: parsed.WORKPLANE_NODE_TOKEN,\n pollIntervalMs: parsed.WORKPLANE_POLL_INTERVAL_MS,\n envAllowlist: parseCsv(parsed.WORKPLANE_ENV_ALLOWLIST ?? \"\"),\n };\n}\n\nexport function parseCsv(value: string): string[] {\n return value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n","import { config as dotenvConfig } from \"dotenv\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nlet envLoaded = false;\n\n// Load order (highest priority first, all with override:false so shell env vars win):\n// 1. .env.local — project-local overrides (gitignored)\n// 2. ~/.workplane/.env — user global config written by workplane-setup\n// 3. .env — project defaults (committed)\nexport function loadLocalEnv(): void {\n if (envLoaded) {\n return;\n }\n\n dotenvConfig({ path: \".env.local\" });\n dotenvConfig({ path: join(homedir(), \".workplane\", \".env\") });\n dotenvConfig({ path: \".env\" });\n\n envLoaded = true;\n}\n","import { join } from \"node:path\";\n\nexport interface GitExecContext {\n workspacePath: string;\n runId: string;\n log: (stream: \"stdout\" | \"stderr\" | \"system\", message: string, stepName?: string) => Promise<void>;\n exec: (\n command: string,\n args?: string[],\n options?: { cwd?: string },\n ) => Promise<{ exitCode: number; stdout: string; stderr: string }>;\n ensureWorkspace: (...segments: string[]) => Promise<string>;\n emitArtifact: (input: {\n type: string;\n name: string;\n path: string;\n metadata?: Record<string, unknown>;\n }) => Promise<void>;\n}\n\nexport function repoPath(workspacePath: string): string {\n return join(workspacePath, \"repo\");\n}\n\nexport async function createTaskBranch(context: GitExecContext, branchName: string): Promise<void> {\n const cwd = repoPath(context.workspacePath);\n await context.log(\"system\", `creating branch ${branchName}`, \"git-branch\");\n const checkout = await context.exec(\"git\", [\"checkout\", \"-b\", branchName], { cwd });\n if (checkout.exitCode !== 0) {\n throw new Error(`git checkout -b failed with exit code ${checkout.exitCode}`);\n }\n}\n\nexport function defaultTaskBranchName(runId: string): string {\n return `workplane/${runId}`;\n}\n\nexport async function captureGitDiff(\n context: GitExecContext,\n adapterName: string,\n artifactName = \"changes.diff\",\n): Promise<string> {\n const cwd = repoPath(context.workspacePath);\n const diffResult = await context.exec(\"git\", [\"diff\"], { cwd });\n const artifactsPath = await context.ensureWorkspace(\"artifacts\");\n const diffPath = join(artifactsPath, artifactName);\n const { writeFile } = await import(\"node:fs/promises\");\n await writeFile(diffPath, diffResult.stdout, \"utf8\");\n await context.emitArtifact({\n type: \"diff\",\n name: artifactName,\n path: diffPath,\n metadata: { adapter: adapterName },\n });\n return diffPath;\n}\n","import { authHeaders } from \"./auth.js\";\n\nexport interface WorkplaneHttpOptions {\n method?: string;\n body?: unknown;\n nodeToken?: string;\n operatorToken?: string;\n}\n\nexport function buildWorkplaneHeaders(options: WorkplaneHttpOptions = {}): Record<string, string> {\n const token = options.nodeToken ?? options.operatorToken;\n return {\n \"content-type\": \"application/json\",\n ...authHeaders(token),\n };\n}\n\nexport async function workplaneFetch<T>(\n serverUrl: string,\n path: string,\n options: WorkplaneHttpOptions = {},\n): Promise<T> {\n const response = await fetch(`${serverUrl}${path}`, {\n method: options.method ?? \"GET\",\n headers: buildWorkplaneHeaders(options),\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`${response.status} ${response.statusText} from ${path}: ${text}`);\n }\n\n return (await response.json()) as T;\n}\n","import { randomUUID } from \"node:crypto\";\n\nexport function makeId(prefix: string): string {\n return `${prefix}_${randomUUID().replace(/-/g, \"\").slice(0, 12)}`;\n}\n\n"],"mappings":";AAEO,SAAS,iBAAiB,qBAA6D;AAC5F,MAAI,CAAC,qBAAqB;AACxB,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,mBAAmB,KAAK,oBAAoB,KAAK,CAAC;AAChE,SAAO,QAAQ,CAAC;AAClB;AAEO,SAAS,mBAAmB,UAA8B,UAAuC;AACtG,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,SAAO,aAAa;AACtB;AAEO,SAAS,iBAAiB,KAA0C;AACzE,QAAM,SAAS,IAAI,QAAQ;AAC3B,QAAM,QAAQ,MAAM,QAAQ,MAAM,IAAI,OAAO,CAAC,IAAI;AAClD,SAAO,iBAAiB,KAAK;AAC/B;AAEO,SAAS,YAAY,OAAmD;AAC7E,MAAI,CAAC,OAAO;AACV,WAAO,CAAC;AAAA,EACV;AACA,SAAO,EAAE,eAAe,UAAU,KAAK,GAAG;AAC5C;;;AC/BO,SAAS,wBACd,kBACA,sBACS;AACT,QAAM,gBAAgB,IAAI,IAAI,gBAAgB;AAC9C,SAAO,qBAAqB,MAAM,CAAC,eAAe,cAAc,IAAI,UAAU,CAAC;AACjF;;;ACNA,SAAS,SAAS;;;ACAlB,SAAS,UAAU,oBAAoB;AACvC,SAAS,eAAe;AACxB,SAAS,YAAY;AAErB,IAAI,YAAY;AAMT,SAAS,eAAqB;AACnC,MAAI,WAAW;AACb;AAAA,EACF;AAEA,eAAa,EAAE,MAAM,aAAa,CAAC;AACnC,eAAa,EAAE,MAAM,KAAK,QAAQ,GAAG,cAAc,MAAM,EAAE,CAAC;AAC5D,eAAa,EAAE,MAAM,OAAO,CAAC;AAE7B,cAAY;AACd;;;ADjBA,aAAa;AAEb,IAAM,kBAAkB,EAAE,OAAO;AAAA,EAC/B,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,oCAAoC;AAAA,EAChF,uBAAuB,EACpB,OAAO,EACP,SAAS,EACT,QAAQ,MAAM,EACd,UAAU,CAAC,UAAU,OAAO,SAAS,OAAO,EAAE,CAAC;AAAA,EAClD,sBAAsB,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1C,0BAA0B,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9C,yBAAyB,EAAE,OAAO,EAAE,SAAS;AAC/C,CAAC;AAED,IAAM,gBAAgB,EAAE,OAAO;AAAA,EAC7B,sBAAsB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,uBAAuB;AAAA,EACjF,qBAAqB,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,cAAc;AAAA,EACjE,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,EACvC,6BAA6B,EAC1B,OAAO,EACP,SAAS,EACT,QAAQ,0DAA0D;AAAA,EACrE,sBAAsB,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1C,4BAA4B,EACzB,OAAO,EACP,SAAS,EACT,QAAQ,MAAM,EACd,UAAU,CAAC,UAAU,OAAO,SAAS,OAAO,EAAE,CAAC;AAAA,EAClD,yBAAyB,EAAE,OAAO,EAAE,SAAS;AAC/C,CAAC;AAoBM,SAAS,iBAAiB,MAAyB,QAAQ,KAAmB;AACnF,QAAM,SAAS,gBAAgB,MAAM,GAAG;AAExC,SAAO;AAAA,IACL,aAAa,OAAO;AAAA,IACpB,MAAM,OAAO;AAAA,IACb,WAAW,OAAO;AAAA,IAClB,eAAe,OAAO;AAAA,IACtB,cAAc,SAAS,OAAO,2BAA2B,EAAE;AAAA,EAC7D;AACF;AAEO,SAAS,eAAe,MAAyB,QAAQ,KAAiB;AAC/E,QAAM,SAAS,cAAc,MAAM,GAAG;AAEtC,SAAO;AAAA,IACL,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO;AAAA,IACjB,QAAQ,OAAO;AAAA,IACf,kBAAkB,SAAS,OAAO,2BAA2B;AAAA,IAC7D,WAAW,OAAO;AAAA,IAClB,gBAAgB,OAAO;AAAA,IACvB,cAAc,SAAS,OAAO,2BAA2B,EAAE;AAAA,EAC7D;AACF;AAEO,SAAS,SAAS,OAAyB;AAChD,SAAO,MACJ,MAAM,GAAG,EACT,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,OAAO,OAAO;AACnB;;;AEnFA,SAAS,QAAAA,aAAY;AAoBd,SAAS,SAAS,eAA+B;AACtD,SAAOA,MAAK,eAAe,MAAM;AACnC;AAEA,eAAsB,iBAAiB,SAAyB,YAAmC;AACjG,QAAM,MAAM,SAAS,QAAQ,aAAa;AAC1C,QAAM,QAAQ,IAAI,UAAU,mBAAmB,UAAU,IAAI,YAAY;AACzE,QAAM,WAAW,MAAM,QAAQ,KAAK,OAAO,CAAC,YAAY,MAAM,UAAU,GAAG,EAAE,IAAI,CAAC;AAClF,MAAI,SAAS,aAAa,GAAG;AAC3B,UAAM,IAAI,MAAM,yCAAyC,SAAS,QAAQ,EAAE;AAAA,EAC9E;AACF;AAEO,SAAS,sBAAsB,OAAuB;AAC3D,SAAO,aAAa,KAAK;AAC3B;AAEA,eAAsB,eACpB,SACA,aACA,eAAe,gBACE;AACjB,QAAM,MAAM,SAAS,QAAQ,aAAa;AAC1C,QAAM,aAAa,MAAM,QAAQ,KAAK,OAAO,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC;AAC9D,QAAM,gBAAgB,MAAM,QAAQ,gBAAgB,WAAW;AAC/D,QAAM,WAAWA,MAAK,eAAe,YAAY;AACjD,QAAM,EAAE,UAAU,IAAI,MAAM,OAAO,aAAkB;AACrD,QAAM,UAAU,UAAU,WAAW,QAAQ,MAAM;AACnD,QAAM,QAAQ,aAAa;AAAA,IACzB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU,EAAE,SAAS,YAAY;AAAA,EACnC,CAAC;AACD,SAAO;AACT;;;AC9CO,SAAS,sBAAsB,UAAgC,CAAC,GAA2B;AAChG,QAAM,QAAQ,QAAQ,aAAa,QAAQ;AAC3C,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,GAAG,YAAY,KAAK;AAAA,EACtB;AACF;AAEA,eAAsB,eACpB,WACA,MACA,UAAgC,CAAC,GACrB;AACZ,QAAM,WAAW,MAAM,MAAM,GAAG,SAAS,GAAG,IAAI,IAAI;AAAA,IAClD,QAAQ,QAAQ,UAAU;AAAA,IAC1B,SAAS,sBAAsB,OAAO;AAAA,IACtC,MAAM,QAAQ,OAAO,KAAK,UAAU,QAAQ,IAAI,IAAI;AAAA,EACtD,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,UAAM,IAAI,MAAM,GAAG,SAAS,MAAM,IAAI,SAAS,UAAU,SAAS,IAAI,KAAK,IAAI,EAAE;AAAA,EACnF;AAEA,SAAQ,MAAM,SAAS,KAAK;AAC9B;;;AClCA,SAAS,kBAAkB;AAEpB,SAAS,OAAO,QAAwB;AAC7C,SAAO,GAAG,MAAM,IAAI,WAAW,EAAE,QAAQ,MAAM,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AACjE;","names":["join"]}
|