@devosurf/tesser 0.1.0-alpha.1 → 0.1.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +3 -2
- package/dist/index.js.map +2 -2
- package/package.json +3 -3
- package/src/commands/project-docs.ts +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts", "../../sdk/src/internal/codec.ts", "../../sdk/src/internal/duration.ts", "../../sdk/src/errors.ts", "../../sdk/src/internal/standard-schema.ts", "../../sdk/src/internal/webhook-verify.ts", "../../sdk/src/internal/retry.ts", "../../sdk/src/connector/index.ts", "../../sdk/src/internal/client.ts", "../../sdk/src/internal/manifest.ts", "../../sdk/src/internal/operators.ts", "../../sdk/src/internal/harnesses.ts", "../src/exit-codes.ts", "../src/output.ts", "../src/client.ts", "../src/config.ts", "../src/project.ts", "../src/commands/auth.ts", "../src/commands/deploy.ts", "../src/commands/dev.ts", "../src/commands/init.ts", "../src/commands/project-docs.ts", "../src/commands/replay.ts", "../src/commands/test.ts", "../../testing/src/engine.ts", "../../testing/src/spy.ts", "../../testing/src/sample.ts", "../../testing/src/smoke.ts", "../../testing/src/cassette.ts"],
|
|
4
|
-
"sourcesContent": ["// tesser \u2014 the machine-first CLI (ADR-0007). Every command: --json (stdout = one JSON\n// document, stderr = logs), deterministic exit codes (src/exit-codes.ts), thin shell\n// over the control-plane API.\n\nimport { execFile } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport { promisify } from \"node:util\";\nimport { Command } from \"commander\";\nimport { extractAutomationManifest } from \"@devosurf/tesser-sdk/internal\";\nimport { ApiClient } from \"./client.js\";\nimport { readConfig, readLinkManifest, resolveTarget, writeConfig } from \"./config.js\";\nimport { EXIT } from \"./exit-codes.js\";\nimport { CliError, Output, toExit } from \"./output.js\";\nimport { discoverLocalAutomations, loadAutomationDef } from \"./project.js\";\nimport { authClaudeCode, authPi } from \"./commands/auth.js\";\nimport { deploy } from \"./commands/deploy.js\";\nimport { dev } from \"./commands/dev.js\";\nimport { init } from \"./commands/init.js\";\nimport { upgradeProject } from \"./commands/project-docs.js\";\nimport { replay } from \"./commands/replay.js\";\nimport { runTests } from \"./commands/test.js\";\n\nconst exec = promisify(execFile);\nconst program = new Command();\nconst VERSION = JSON.parse(readFileSync(new URL(\"../package.json\", import.meta.url), \"utf8\")).version as string;\n\ninterface GlobalOpts {\n json?: boolean;\n url?: string;\n token?: string;\n profile?: string;\n}\n\nfunction setup(): { out: Output; opts: GlobalOpts } {\n const opts = program.opts<GlobalOpts>();\n return { out: new Output(opts.json ?? false), opts };\n}\n\nfunction target(opts: GlobalOpts): ReturnType<typeof resolveTarget> {\n return resolveTarget({\n ...(opts.url !== undefined ? { url: opts.url } : {}),\n ...(opts.token !== undefined ? { token: opts.token } : {}),\n ...(opts.profile !== undefined ? { profile: opts.profile } : {}),\n });\n}\n\nfunction api(opts: GlobalOpts): ApiClient {\n const t = target(opts);\n return new ApiClient(t.url, t.token);\n}\n\nfunction requireProject(opts: GlobalOpts): { name: string; root: string } {\n const t = target(opts);\n if (!t.projectRoot || !t.project) {\n throw new CliError(EXIT.USAGE, \"not inside a Tesser project (no tesser.json) \u2014 run `tesser init <name>` or `tesser link`\");\n }\n return { name: t.project, root: t.projectRoot };\n}\n\nprogram\n .name(\"tesser\")\n .version(VERSION)\n .description(\"Code-first, agent-native automation. stdout = data, stderr = logs; --json everywhere.\")\n .option(\"--json\", \"machine output: one JSON document on stdout\")\n .option(\"--url <url>\", \"instance URL (overrides tesser.json / profile)\")\n .option(\"--token <token>\", \"API token (overrides TESSER_TOKEN / profile)\")\n .option(\"--profile <name>\", \"config profile\");\n\nprogram\n .command(\"init\")\n .argument(\"<name>\", \"project name (kebab-case)\")\n .option(\"--dir <dir>\", \"parent directory\")\n .option(\"--instance <url>\", \"instance URL to write into tesser.json\")\n .description(\"scaffold a new Project (one repo of automations)\")\n .action((name: string, cmdOpts: { dir?: string; instance?: string }) => {\n const { out } = setup();\n try {\n init(out, name, cmdOpts, VERSION);\n } catch (err) {\n toExit(err, out);\n }\n });\n\nprogram\n .command(\"upgrade\")\n .description(\"pin Tesser packages to this CLI version and refresh generated Project docs\")\n .action(() => {\n const { out, opts } = setup();\n try {\n upgradeProject(out, requireProject(opts), VERSION);\n } catch (err) {\n toExit(err, out);\n }\n });\n\nprogram\n .command(\"login\")\n .option(\"--token <token>\", \"API token from the instance (printed at first boot)\")\n .option(\"--instance <url>\", \"instance URL\", \"http://localhost:8377\")\n .option(\"--save-profile <name>\", \"profile name\", \"default\")\n .description(\"store instance credentials in ~/.config/tesser (or use env TESSER_TOKEN)\")\n .action(async (cmdOpts: { token?: string; instance: string; saveProfile: string }) => {\n const { out, opts } = setup();\n try {\n const token = cmdOpts.token ?? opts.token;\n if (!token) throw new CliError(EXIT.USAGE, \"missing required option '--token <token>'\");\n const client = new ApiClient(cmdOpts.instance, token);\n await client.get(\"/health\"); // verify before storing\n const config = readConfig();\n config.profiles = { ...config.profiles, [cmdOpts.saveProfile]: { url: cmdOpts.instance, token } };\n config.current = cmdOpts.saveProfile;\n writeConfig(config);\n out.data({ profile: cmdOpts.saveProfile, url: cmdOpts.instance }, () => `logged in to ${cmdOpts.instance} (profile \"${cmdOpts.saveProfile}\")`);\n } catch (err) {\n toExit(err, out);\n }\n });\n\nprogram\n .command(\"link\")\n .option(\"--repo <url>\", \"git remote the instance should pull (defaults to origin)\")\n .description(\"register this Project on the instance and wire git-sync\")\n .action(async (cmdOpts: { repo?: string }) => {\n const { out, opts } = setup();\n try {\n const { name } = requireProject(opts);\n let repoUrl = cmdOpts.repo;\n if (repoUrl === undefined) {\n repoUrl = await exec(\"git\", [\"remote\", \"get-url\", \"origin\"]).then(\n (r) => r.stdout.trim(),\n () => undefined,\n );\n }\n const result = await api(opts).post<{\n id: string;\n name: string;\n deployKeyPublic: string;\n webhookSetupUrl: string;\n }>(\"/projects\", {\n name,\n ...(repoUrl !== undefined ? { repoUrl } : {}),\n });\n out.data(\n { ...result, repoUrl: repoUrl ?? null },\n () =>\n `linked project \"${name}\"${repoUrl ? ` \u2190 ${repoUrl}` : \" (no git remote yet \u2014 deploy with --local or set --repo)\"}\\n` +\n `deploy key: ${result.deployKeyPublic}\\n` +\n `webhook setup: ${result.webhookSetupUrl}`,\n );\n } catch (err) {\n toExit(err, out);\n }\n });\n\nprogram\n .command(\"test\")\n .option(\"--smoke-only\", \"run only the auto-generated smoke tests\")\n .option(\"--automation <id>\", \"limit to one automation\")\n .description(\"fast in-process validation: colocated tests + auto smoke (ADR-0008)\")\n .action(async (cmdOpts: { smokeOnly?: boolean; automation?: string }) => {\n const { out, opts } = setup();\n try {\n const t = target(opts);\n const root = t.projectRoot ?? process.cwd();\n await runTests(out, root, { ...(cmdOpts.smokeOnly !== undefined ? { smokeOnly: cmdOpts.smokeOnly } : {}), filter: cmdOpts.automation });\n } catch (err) {\n toExit(err, out);\n }\n });\n\nprogram\n .command(\"build\")\n .description(\"build + statically extract every automation's manifest locally (CI check)\")\n .action(async () => {\n const { out, opts } = setup();\n try {\n const t = target(opts);\n const root = t.projectRoot ?? process.cwd();\n const autos = discoverLocalAutomations(root);\n if (autos.length === 0) throw new CliError(EXIT.USAGE, \"no automations found\");\n const manifests: Array<ReturnType<typeof extractAutomationManifest>> = [];\n for (const a of autos) {\n const def = await loadAutomationDef(a.entry);\n manifests.push(extractAutomationManifest(def));\n }\n out.data({ automations: manifests }, () =>\n manifests.map((m) => `${m.id}: trigger=${m.trigger.kind} connections=${Object.keys(m.connections).join(\",\") || \"-\"} secrets=${Object.keys(m.secrets).join(\",\") || \"-\"}`).join(\"\\n\"),\n );\n } catch (err) {\n toExit(err, out);\n }\n });\n\nprogram\n .command(\"deploy\")\n .option(\"--ref <ref>\", \"git ref to deploy (default: the project's production branch)\")\n .option(\"--local\", \"deploy the local working tree (dev/dogfood lane, skips git)\")\n .option(\"--no-wait\", \"queue the sync and return immediately\")\n .description(\"git \u2192 instance: build changed, gate on tests, promote on green (ADR-0006)\")\n .action(async (cmdOpts: { ref?: string; local?: boolean; wait?: boolean }) => {\n const { out, opts } = setup();\n try {\n const { name, root } = requireProject(opts);\n await deploy(out, api(opts), name, {\n ref: cmdOpts.ref,\n local: cmdOpts.local ? root : undefined,\n ...(cmdOpts.wait === false ? { wait: false } : {}),\n });\n } catch (err) {\n toExit(err, out);\n }\n });\n\nprogram\n .command(\"dev\")\n .option(\"--port <port>\", \"port for the local instance\", \"8377\")\n .option(\"--no-watch\", \"deploy once and keep serving without watching\")\n .description(\"zero-setup local instance (embedded postgres) + deploy-on-change\")\n .action(async (cmdOpts: { port: string; watch?: boolean }) => {\n const { out, opts } = setup();\n try {\n const { name, root } = requireProject(opts);\n await dev(out, root, name, { port: Number(cmdOpts.port), ...(cmdOpts.watch === false ? { watch: false } : {}) });\n } catch (err) {\n toExit(err, out);\n }\n });\n\nconst auth = program.command(\"auth\").description(\"agent-assisted Harness credential setup; values post directly to connect links\");\nauth\n .command(\"claude-code\")\n .requiredOption(\"--connect <urlOrToken>\", \"Tesser /connect/<token> URL or token\")\n .option(\"--mode <mode>\", \"subscription or apiKey\", \"subscription\")\n .option(\"--token-stdin\", \"read token from stdin instead of running claude setup-token\")\n .option(\"--from-env <name>\", \"read token from an environment variable\")\n .option(\"--scope <scope>\", \"workspace or per_user\", \"workspace\")\n .option(\"--end-user-id <id>\", \"end-user id for per_user connections\")\n .option(\"--bin <path>\", \"claude binary\", \"claude\")\n .description(\"connect Claude Code as a brokered Harness; subscription mode runs claude setup-token\")\n .action(async (cmdOpts: { connect: string; mode?: string; tokenStdin?: boolean; fromEnv?: string; scope?: string; endUserId?: string; bin?: string }) => {\n const { out, opts } = setup();\n try {\n await authClaudeCode(out, target(opts).url, cmdOpts);\n } catch (err) {\n toExit(err, out);\n }\n });\nauth\n .command(\"pi\")\n .requiredOption(\"--connect <urlOrToken>\", \"Tesser /connect/<token> URL or token\")\n .option(\"--mode <mode>\", \"anthropicOAuth or anthropicApiKey\", \"anthropicOAuth\")\n .option(\"--token-stdin\", \"read token from stdin\")\n .option(\"--from-env <name>\", \"read token from an environment variable\")\n .option(\"--scope <scope>\", \"workspace or per_user\", \"workspace\")\n .option(\"--end-user-id <id>\", \"end-user id for per_user connections\")\n .description(\"connect Pi as a brokered Harness\")\n .action(async (cmdOpts: { connect: string; mode?: string; tokenStdin?: boolean; fromEnv?: string; scope?: string; endUserId?: string }) => {\n const { out, opts } = setup();\n try {\n await authPi(out, target(opts).url, cmdOpts);\n } catch (err) {\n toExit(err, out);\n }\n });\n\nprogram\n .command(\"connect\")\n .option(\"--wait\", \"poll until the human completes the link\")\n .option(\"--status <token>\", \"check an existing connect link\")\n .description(\"mint a connect link for missing credentials; the human completes it in a browser (ADR-0005)\")\n .action(async (cmdOpts: { wait?: boolean; status?: string }) => {\n const { out, opts } = setup();\n try {\n const client = api(opts);\n if (cmdOpts.status) {\n out.data(await client.get(`/connect-links/${cmdOpts.status}/status`));\n return;\n }\n const { name } = requireProject(opts);\n const minted = await client.post<{ url: string | null; token?: string; requirements: unknown[] }>(\n \"/connect-links\",\n { project: name },\n );\n if (!minted.url) {\n out.data({ url: null, requirements: [] }, () => \"nothing missing \u2014 all requirements are satisfied\");\n return;\n }\n out.data(minted, () => `open in a browser to connect:\\n ${minted.url}`);\n if (cmdOpts.wait) {\n for (;;) {\n await new Promise((r) => setTimeout(r, 2000));\n const status = await client.get<{ status: string }>(`/connect-links/${minted.token}/status`);\n if (status.status === \"completed\") {\n out.log(\"connect link completed \u2713\");\n return;\n }\n if (status.status === \"expired\") throw new CliError(EXIT.HALTED_CREDENTIALS, \"connect link expired\");\n }\n }\n process.exit(EXIT.HALTED_CREDENTIALS);\n } catch (err) {\n toExit(err, out);\n }\n });\n\nconst secrets = program.command(\"secrets\").description(\"workspace secrets \u2014 names only; values never echo\");\nsecrets\n .command(\"list\")\n .action(async () => {\n const { out, opts } = setup();\n try {\n out.data(await api(opts).get(\"/secrets\"));\n } catch (err) {\n toExit(err, out);\n }\n });\nsecrets\n .command(\"set\")\n .argument(\"<name>\")\n .option(\"--value-stdin\", \"read the value from stdin (pipe it; value never appears in argv)\")\n .description(\"set a secret value (human/CI lane: pipe via --value-stdin; agents mint connect links instead)\")\n .action(async (name: string, cmdOpts: { valueStdin?: boolean }) => {\n const { out, opts } = setup();\n try {\n if (!cmdOpts.valueStdin) {\n throw new CliError(\n EXIT.USAGE,\n \"refusing a value on argv \u2014 pipe it: `printenv MY_SECRET | tesser secrets set \" + name + \" --value-stdin` (or use a connect link)\",\n );\n }\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(chunk as Buffer);\n const value = Buffer.concat(chunks).toString(\"utf8\").replace(/\\n$/, \"\");\n if (value.length === 0) throw new CliError(EXIT.USAGE, \"empty value on stdin\");\n await api(opts).put(`/secrets/${encodeURIComponent(name)}`, { value });\n out.data({ set: name }, () => `secret \"${name}\" set \u2713`);\n } catch (err) {\n toExit(err, out);\n }\n });\nsecrets\n .command(\"rm\")\n .argument(\"<name>\")\n .action(async (name: string) => {\n const { out, opts } = setup();\n try {\n out.data(await api(opts).delete(`/secrets/${encodeURIComponent(name)}`));\n } catch (err) {\n toExit(err, out);\n }\n });\n\nconst runs = program.command(\"runs\").description(\"inspect and drive runs\");\nruns\n .command(\"list\")\n .option(\"--automation <id>\")\n .option(\"--status <status>\")\n .option(\"--limit <n>\", \"max rows\", \"25\")\n .action(async (cmdOpts: { automation?: string; status?: string; limit: string }) => {\n const { out, opts } = setup();\n try {\n const { name } = requireProject(opts);\n const params = new URLSearchParams({ project: name, limit: cmdOpts.limit });\n if (cmdOpts.automation) params.set(\"automation\", cmdOpts.automation);\n if (cmdOpts.status) params.set(\"status\", cmdOpts.status);\n const data = await api(opts).get<{ runs: Array<Record<string, unknown>> }>(`/runs?${params}`);\n out.data(data, (d: { runs: Array<{ id: string; automation_id: string; status: string; trigger_kind: string; created_at: string }> }) =>\n d.runs.map((r) => `${r.id} ${r.automation_id} ${r.status} (${r.trigger_kind}) ${r.created_at}`).join(\"\\n\") || \"(no runs)\",\n );\n } catch (err) {\n toExit(err, out);\n }\n });\nruns\n .command(\"show\")\n .argument(\"<runId>\")\n .action(async (runId: string) => {\n const { out, opts } = setup();\n try {\n out.data(await api(opts).get(`/runs/${runId}`));\n } catch (err) {\n toExit(err, out);\n }\n });\nruns\n .command(\"trigger\")\n .argument(\"<automation>\")\n .option(\"--input <json>\", \"input payload as JSON\")\n .option(\"--env <env>\", \"environment\", \"production\")\n .action(async (automation: string, cmdOpts: { input?: string; env: string }) => {\n const { out, opts } = setup();\n try {\n const { name } = requireProject(opts);\n const body: Record<string, unknown> = { project: name, automation, env: cmdOpts.env };\n if (cmdOpts.input !== undefined) body[\"input\"] = JSON.parse(cmdOpts.input);\n out.data(await api(opts).post(\"/runs\", body));\n } catch (err) {\n toExit(err, out);\n }\n });\nruns\n .command(\"signal\")\n .argument(\"<runId>\")\n .argument(\"<name>\")\n .option(\"--payload <json>\", \"signal payload as JSON\")\n .action(async (runId: string, name: string, cmdOpts: { payload?: string }) => {\n const { out, opts } = setup();\n try {\n out.data(\n await api(opts).post(`/runs/${runId}/signals/${encodeURIComponent(name)}`, {\n ...(cmdOpts.payload !== undefined ? { payload: JSON.parse(cmdOpts.payload) } : {}),\n }),\n );\n } catch (err) {\n toExit(err, out);\n }\n });\nruns\n .command(\"cancel\")\n .argument(\"<runId>\")\n .action(async (runId: string) => {\n const { out, opts } = setup();\n try {\n out.data(await api(opts).post(`/runs/${runId}/cancel`));\n } catch (err) {\n toExit(err, out);\n }\n });\n\nprogram\n .command(\"logs\")\n .argument(\"<runId>\")\n .option(\"--follow\", \"poll until the run settles\")\n .description(\"step logs for one run\")\n .action(async (runId: string, cmdOpts: { follow?: boolean }) => {\n const { out, opts } = setup();\n try {\n const client = api(opts);\n let printed = 0;\n for (;;) {\n const detail = await client.get<{\n run: { status: string };\n logs: Array<{ step: string | null; level: string; msg: string; created_at: string }>;\n }>(`/runs/${runId}`);\n const fresh = detail.logs.slice(printed);\n printed = detail.logs.length;\n if (out.json && !cmdOpts.follow) {\n out.data(detail);\n return;\n }\n for (const l of fresh) out.log(`[${l.level}]${l.step ? ` (${l.step})` : \"\"} ${l.msg}`);\n if (!cmdOpts.follow || [\"completed\", \"failed\", \"cancelled\"].includes(detail.run.status)) {\n if (!out.json) out.log(`run ${detail.run.status}`);\n else out.data(detail);\n return;\n }\n await new Promise((r) => setTimeout(r, 1000));\n }\n } catch (err) {\n toExit(err, out);\n }\n });\n\nprogram\n .command(\"replay\")\n .argument(\"<runId>\")\n .description(\"freeze a real run as a committed regression fixture + test (ADR-0008)\")\n .action(async (runId: string) => {\n const { out, opts } = setup();\n try {\n const { root } = requireProject(opts);\n await replay(out, api(opts), root, runId);\n } catch (err) {\n toExit(err, out);\n }\n });\n\nprogram\n .command(\"rollback\")\n .argument(\"<automation>\")\n .requiredOption(\"--to <version>\", \"version number to re-point the alias at\")\n .option(\"--env <env>\", \"environment\", \"production\")\n .description(\"instant alias re-point to a prior immutable version (no rebuild)\")\n .action(async (automation: string, cmdOpts: { to: string; env: string }) => {\n const { out, opts } = setup();\n try {\n const { name } = requireProject(opts);\n out.data(\n await api(opts).post(`/projects/${name}/rollback`, {\n automation,\n toVersion: Number(cmdOpts.to),\n env: cmdOpts.env,\n }),\n );\n } catch (err) {\n toExit(err, out);\n }\n });\n\nprogram\n .command(\"status\")\n .description(\"instance + project deploy status\")\n .action(async () => {\n const { out, opts } = setup();\n try {\n const t = target(opts);\n const client = api(opts);\n const health = await client.get(\"/health\");\n const status = await client.get(\"/status\");\n const manifest = t.projectRoot ? readLinkManifest(t.projectRoot) : null;\n const projectStatus = manifest ? await client.get(`/projects/${manifest.project}/deploys/latest`).catch(() => null) : null;\n out.data({ instance: t.url, health, status, project: manifest?.project ?? null, deploy: projectStatus });\n } catch (err) {\n toExit(err, out);\n }\n });\n\nprogram.parseAsync().catch((err) => {\n const out = new Output(process.argv.includes(\"--json\"));\n toExit(err, out);\n});\n", "// The structured codec carrying step results to/from the journal (ADR-0002).\n// An invisible internal (ADR-0004): authors only ever see plain values round-trip.\n//\n// Wire shape is JSON. Non-JSON serializables are tagged envelopes: {\"$t\": kind, \"v\": ...}.\n// A plain object that itself owns a \"$t\" key is wrapped as {\"$t\":\"obj\"} to stay unambiguous.\n\nexport type JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\nexport class NotSerializableError extends TypeError {\n constructor(\n readonly path: string,\n readonly kind: string,\n ) {\n super(\n `value at ${path} is not serializable (${kind}); step results are journaled and must be ` +\n `plain data \u2014 string/number/boolean/null/bigint/Date/Array/Map/Set/Uint8Array/plain object`,\n );\n this.name = \"NotSerializableError\";\n }\n}\n\nfunction describe(value: unknown): string {\n if (typeof value === \"function\") return \"a function\";\n if (typeof value === \"symbol\") return \"a symbol\";\n if (value instanceof Promise) return \"a Promise \u2014 await it inside the step\";\n const proto = Object.getPrototypeOf(value);\n const ctor = proto?.constructor?.name;\n return ctor ? `a ${ctor} instance \u2014 a live handle` : \"an exotic object\";\n}\n\nexport function encodeJournal(value: unknown, path = \"$\"): JsonValue {\n if (value === undefined) return { $t: \"undef\" };\n if (value === null) return null;\n const t = typeof value;\n if (t === \"string\" || t === \"boolean\") return value as string | boolean;\n if (t === \"number\") {\n const n = value as number;\n if (Number.isFinite(n)) return n;\n return { $t: \"num\", v: String(n) }; // NaN / Infinity / -Infinity\n }\n if (t === \"bigint\") return { $t: \"bigint\", v: (value as bigint).toString() };\n if (t === \"function\" || t === \"symbol\") throw new NotSerializableError(path, describe(value));\n if (value instanceof Date) {\n const ms = value.getTime();\n return { $t: \"date\", v: Number.isNaN(ms) ? null : value.toISOString() };\n }\n if (value instanceof Map) {\n return {\n $t: \"map\",\n v: [...value.entries()].map(([k, v], i) => [\n encodeJournal(k, `${path}.<key ${i}>`),\n encodeJournal(v, `${path}.<entry ${i}>`),\n ]) as JsonValue,\n };\n }\n if (value instanceof Set) {\n return {\n $t: \"set\",\n v: [...value.values()].map((v, i) => encodeJournal(v, `${path}.<item ${i}>`)),\n };\n }\n if (value instanceof Uint8Array) {\n return { $t: \"bytes\", v: Buffer.from(value).toString(\"base64\") };\n }\n if (Array.isArray(value)) {\n return value.map((v, i) => encodeJournal(v, `${path}[${i}]`));\n }\n if (t === \"object\") {\n const proto = Object.getPrototypeOf(value);\n if (proto !== Object.prototype && proto !== null) {\n throw new NotSerializableError(path, describe(value));\n }\n const obj = value as Record<string, unknown>;\n const out: Record<string, JsonValue> = {};\n for (const key of Object.keys(obj)) {\n out[key] = encodeJournal(obj[key], `${path}.${key}`);\n }\n if (Object.prototype.hasOwnProperty.call(obj, \"$t\")) return { $t: \"obj\", v: out };\n return out;\n }\n throw new NotSerializableError(path, describe(value));\n}\n\nexport function decodeJournal(json: JsonValue): unknown {\n if (json === null || typeof json !== \"object\") return json;\n if (Array.isArray(json)) return json.map(decodeJournal);\n const tag = (json as Record<string, JsonValue>)[\"$t\"];\n if (tag === undefined) {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(json)) out[key] = decodeJournal((json as never)[key]);\n return out;\n }\n const v = (json as Record<string, JsonValue>)[\"v\"];\n switch (tag) {\n case \"undef\":\n return undefined;\n case \"num\":\n return Number(v);\n case \"bigint\":\n return BigInt(v as string);\n case \"date\":\n return v === null ? new Date(NaN) : new Date(v as string);\n case \"map\":\n return new Map((v as JsonValue[]).map((e) => {\n const [k, val] = e as [JsonValue, JsonValue];\n return [decodeJournal(k), decodeJournal(val)] as const;\n }));\n case \"set\":\n return new Set((v as JsonValue[]).map(decodeJournal));\n case \"bytes\":\n return new Uint8Array(Buffer.from(v as string, \"base64\"));\n case \"obj\": {\n const out: Record<string, unknown> = {};\n const inner = v as Record<string, JsonValue>;\n for (const key of Object.keys(inner)) out[key] = decodeJournal(inner[key] as JsonValue);\n return out;\n }\n default:\n throw new TypeError(`journal codec: unknown tag \"${String(tag)}\"`);\n }\n}\n\n/** Stable JSON string for journal storage / content hashing (sorted object keys). */\nexport function stableStringify(json: JsonValue): string {\n if (json === null || typeof json !== \"object\") return JSON.stringify(json);\n if (Array.isArray(json)) return `[${json.map(stableStringify).join(\",\")}]`;\n const keys = Object.keys(json).sort();\n return `{${keys.map((k) => `${JSON.stringify(k)}:${stableStringify((json as never)[k])}`).join(\",\")}}`;\n}\n", "// Duration strings (\"30s\", \"1h30m\", \"250ms\", \"2d\") used across step timeouts, retry\n// backoff, sleep, and trigger cadence. An invisible internal.\n\nconst UNIT_MS: Record<string, number> = {\n ms: 1,\n s: 1000,\n m: 60_000,\n h: 3_600_000,\n d: 86_400_000,\n w: 604_800_000,\n};\n\nconst PART = /(\\d+(?:\\.\\d+)?)(ms|s|m|h|d|w)/g;\n\nexport function parseDuration(input: string | number, what = \"duration\"): number {\n if (typeof input === \"number\") {\n if (!Number.isFinite(input) || input < 0) {\n throw new TypeError(`${what}: expected a non-negative number of ms, got ${input}`);\n }\n return input;\n }\n const s = input.trim();\n let total = 0;\n let matchedLen = 0;\n for (const m of s.matchAll(PART)) {\n total += Number(m[1]) * (UNIT_MS[m[2] as string] as number);\n matchedLen += (m[0] as string).length;\n }\n if (matchedLen === 0 || matchedLen !== s.replace(/\\s+/g, \"\").length) {\n throw new TypeError(\n `${what}: \"${input}\" is not a duration \u2014 use forms like \"250ms\", \"30s\", \"5m\", \"1h30m\", \"2d\"`,\n );\n }\n return Math.round(total);\n}\n\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n const units: Array<[string, number]> = [\n [\"w\", UNIT_MS[\"w\"] as number],\n [\"d\", UNIT_MS[\"d\"] as number],\n [\"h\", UNIT_MS[\"h\"] as number],\n [\"m\", UNIT_MS[\"m\"] as number],\n [\"s\", 1000],\n ];\n let rest = ms;\n let out = \"\";\n for (const [unit, size] of units) {\n const n = Math.floor(rest / size);\n if (n > 0) {\n out += `${n}${unit}`;\n rest -= n * size;\n }\n }\n if (rest > 0) out += `${rest}ms`;\n return out;\n}\n", "// Errors control the retry policy (ADR-0002). Symbol branding keeps instanceof checks\n// honest across duplicated module instances (bundled server vs project artifact).\n\nconst RETRYABLE = Symbol.for(\"tesser.error.retryable\");\nconst TERMINAL = Symbol.for(\"tesser.error.terminal\");\n\nexport interface RetryableErrorOptions {\n cause?: unknown;\n /** Hint from the provider (e.g. Retry-After) \u2014 the engine waits at least this long. */\n retryAfterMs?: number | undefined;\n}\n\n/** Force a retry (also the default for an uncaught throw, up to maxAttempts). */\nexport class RetryableError extends Error {\n readonly retryAfterMs: number | undefined;\n\n constructor(message: string, options?: RetryableErrorOptions) {\n super(message, options?.cause === undefined ? undefined : { cause: options.cause });\n this.name = \"RetryableError\";\n this.retryAfterMs = options?.retryAfterMs;\n Object.defineProperty(this, RETRYABLE, { value: true });\n }\n}\n\n/** Stop now \u2014 do not retry. On terminal failure, completed steps' `undo` run in reverse. */\nexport class TerminalError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options?.cause === undefined ? undefined : { cause: options.cause });\n this.name = \"TerminalError\";\n Object.defineProperty(this, TERMINAL, { value: true });\n }\n}\n\nexport function isRetryableError(err: unknown): err is RetryableError {\n return (\n err instanceof RetryableError ||\n (typeof err === \"object\" && err !== null && RETRYABLE in err)\n );\n}\n\nexport function isTerminalError(err: unknown): err is TerminalError {\n return (\n err instanceof TerminalError ||\n (typeof err === \"object\" && err !== null && TERMINAL in err)\n );\n}\n", "// Standard Schema v1 (https://standardschema.dev) \u2014 the spec interface, declared by us so\n// the SDK stays zero-dependency and no third-party name appears in our surface (ADR-0004).\n// Zod / Valibot / ArkType all implement `~standard`.\n\nimport { TerminalError } from \"../errors.js\";\n\nexport interface StandardSchemaV1<Input = unknown, Output = Input> {\n readonly \"~standard\": StandardSchemaV1.Props<Input, Output>;\n}\n\nexport declare namespace StandardSchemaV1 {\n interface Props<Input = unknown, Output = Input> {\n readonly version: 1;\n readonly vendor: string;\n readonly validate: (value: unknown) => Result<Output> | Promise<Result<Output>>;\n readonly types?: Types<Input, Output> | undefined;\n }\n type Result<Output> = SuccessResult<Output> | FailureResult;\n interface SuccessResult<Output> {\n readonly value: Output;\n readonly issues?: undefined;\n }\n interface FailureResult {\n readonly issues: ReadonlyArray<Issue>;\n }\n interface Issue {\n readonly message: string;\n readonly path?: ReadonlyArray<PropertyKey | PathSegment> | undefined;\n }\n interface PathSegment {\n readonly key: PropertyKey;\n }\n interface Types<Input = unknown, Output = Input> {\n readonly input: Input;\n readonly output: Output;\n }\n}\n\nexport interface ValidationIssue {\n message: string;\n path: string;\n}\n\n/** Validation failures are terminal \u2014 bad input never retries (ADR-0002 semantics). */\nexport class SchemaValidationError extends TerminalError {\n constructor(\n readonly what: string,\n readonly issues: ValidationIssue[],\n ) {\n super(\n `${what} failed validation: ` +\n issues.map((i) => (i.path === \"$\" ? i.message : `${i.path}: ${i.message}`)).join(\"; \"),\n );\n this.name = \"SchemaValidationError\";\n }\n}\n\nfunction pathToString(path: StandardSchemaV1.Issue[\"path\"]): string {\n if (!path || path.length === 0) return \"$\";\n return (\n \"$.\" +\n path\n .map((seg) => String(typeof seg === \"object\" && seg !== null && \"key\" in seg ? seg.key : seg))\n .join(\".\")\n );\n}\n\nexport function isSchema(value: unknown): value is StandardSchemaV1 {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"~standard\" in value &&\n typeof (value as Record<string, unknown>)[\"~standard\"] === \"object\"\n );\n}\n\n/** Validate `value` against a Standard Schema; throws SchemaValidationError on failure. */\nexport async function validateSchema<T>(\n schema: StandardSchemaV1<unknown, T>,\n value: unknown,\n what: string,\n): Promise<T> {\n let result = schema[\"~standard\"].validate(value);\n if (result instanceof Promise) result = await result;\n if (result.issues) {\n throw new SchemaValidationError(\n what,\n result.issues.map((i) => ({ message: i.message, path: pathToString(i.path) })),\n );\n }\n return result.value;\n}\n", "// Declared-scheme webhook signature verification (ADR-0013): crypto an agent can get\n// wrong, implemented once. Used by the server ingress and by the testing harness.\n\nimport { createHmac, timingSafeEqual } from \"node:crypto\";\nimport type { InboundWebhookEvent, VerifyScheme } from \"../connector/index.js\";\n\nconst SLACK_TOLERANCE_MS = 5 * 60 * 1000;\n\nfunction safeEqual(a: string, b: string): boolean {\n const ab = Buffer.from(a);\n const bb = Buffer.from(b);\n if (ab.length !== bb.length) return false;\n return timingSafeEqual(ab, bb);\n}\n\nfunction header(req: InboundWebhookEvent, name: string): string | undefined {\n return req.headers[name.toLowerCase()];\n}\n\nexport async function verifyInboundEvent(\n scheme: VerifyScheme,\n req: InboundWebhookEvent,\n secret: string,\n nowMs = Date.now(),\n): Promise<boolean> {\n switch (scheme.kind) {\n case \"none\":\n return true;\n case \"hmacSha256\": {\n const provided = header(req, scheme.header);\n if (!provided) return false;\n const digest = createHmac(\"sha256\", secret).update(req.rawBody).digest(scheme.encoding);\n const expected = (scheme.prefix ?? \"\") + digest;\n return safeEqual(provided, expected);\n }\n case \"slackSigning\": {\n const ts = header(req, \"x-slack-request-timestamp\");\n const provided = header(req, \"x-slack-signature\");\n if (!ts || !provided) return false;\n const age = Math.abs(nowMs - Number(ts) * 1000);\n if (!Number.isFinite(age) || age > SLACK_TOLERANCE_MS) return false;\n const base = `v0:${ts}:${Buffer.from(req.rawBody).toString(\"utf8\")}`;\n const expected = \"v0=\" + createHmac(\"sha256\", secret).update(base).digest(\"hex\");\n return safeEqual(provided, expected);\n }\n case \"custom\":\n return scheme.verify(req, secret);\n }\n}\n", "// Retry policy resolution \u2014 one implementation so the in-process TestEngine and the\n// durable server engine schedule identical retries (ADR-0008 fidelity).\n\nimport type { RetryPolicy } from \"../automation.js\";\nimport { parseDuration } from \"./duration.js\";\n\nexport interface ResolvedRetryPolicy {\n maxAttempts: number;\n type: \"exponential\" | \"fixed\";\n baseMs: number;\n maxMs: number;\n jitter: boolean;\n}\n\nexport const DEFAULT_STEP_RETRY: ResolvedRetryPolicy = {\n maxAttempts: 3,\n type: \"exponential\",\n baseMs: 1000,\n maxMs: 3_600_000,\n jitter: true,\n};\n\nexport function resolveRetryPolicy(\n policy: RetryPolicy | undefined,\n fallback: ResolvedRetryPolicy = DEFAULT_STEP_RETRY,\n): ResolvedRetryPolicy {\n if (!policy) return fallback;\n const backoff = policy.backoff;\n if (backoff === undefined) return { ...fallback, maxAttempts: policy.maxAttempts };\n if (typeof backoff === \"string\") {\n return { ...fallback, maxAttempts: policy.maxAttempts, type: backoff };\n }\n return {\n maxAttempts: policy.maxAttempts,\n type: backoff.type,\n baseMs: backoff.base !== undefined ? parseDuration(backoff.base, \"retry.backoff.base\") : fallback.baseMs,\n maxMs: backoff.max !== undefined ? parseDuration(backoff.max, \"retry.backoff.max\") : fallback.maxMs,\n jitter: backoff.jitter ?? fallback.jitter,\n };\n}\n\n/** Delay before the NEXT attempt, or null when attempts are exhausted.\n * `attempt` is the 1-based attempt that just failed. */\nexport function nextRetryDelayMs(\n policy: ResolvedRetryPolicy,\n attempt: number,\n retryAfterMs?: number | undefined,\n random: () => number = Math.random,\n): number | null {\n if (attempt >= policy.maxAttempts) return null;\n let delay =\n policy.type === \"fixed\" ? policy.baseMs : policy.baseMs * Math.pow(2, attempt - 1);\n delay = Math.min(delay, policy.maxMs);\n if (policy.jitter) delay = delay * (0.5 + random() * 0.5);\n if (retryAfterMs !== undefined) delay = Math.max(delay, retryAfterMs);\n return Math.round(delay);\n}\n", "// Connector authoring contract (ADR-0012) + connector-defined triggers (ADR-0013).\n// Auth is declared once and injected as a pre-authed ctx.http \u2014 the author never names a\n// token. Actions are typed calls returning OUR mapped stable shape. Triggers are typed\n// constructors symmetric to actions; the runtime owns delivery/registration/dedup.\n\nimport type { Connector, Logger, Schema } from \"../automation.js\";\nimport type { HarnessDef, HarnessRunRequest, HarnessRunResult } from \"../harnesses.js\";\nimport type { NormalizedModelRequest, NormalizedModelResponse } from \"../operators.js\";\nimport type { ConnectorTrigger } from \"../triggers.js\";\nimport type { ClassifyError, TesserHttp } from \"../internal/http.js\";\nimport type { StandardSchemaV1 } from \"../internal/standard-schema.js\";\n\n/** Any Standard Schema, keeping both its input (pre-parse: defaults optional) and\n * output (post-parse) types. Callers supply the INPUT shape; handlers receive OUTPUT. */\nexport type AnySchema = StandardSchemaV1<any, any>;\nexport type SchemaIn<S> = S extends StandardSchemaV1<infer I, any> ? I : never;\nexport type SchemaOut<S> = S extends StandardSchemaV1<any, infer O> ? O : never;\n\n// ---- Provider facts (the Catalog entry shape; inline facts are promoted by codegen, ADR-0012) ----\n\nexport interface OAuth2ProviderFacts {\n authorizeUrl: string;\n tokenUrl: string;\n /** How the client authenticates at the token endpoint. Default \"body\". */\n clientAuth?: \"body\" | \"basic\";\n /** Scope list separator quirk. Default \" \". */\n scopeSeparator?: string;\n /** Use PKCE on the auth-code flow. Default true (harmless where unsupported is false). */\n pkce?: boolean;\n /** Extra params some providers require (e.g. Google access_type=offline&prompt=consent). */\n extraAuthorizeParams?: Record<string, string>;\n extraTokenParams?: Record<string, string>;\n /** Providers that rotate refresh tokens on every refresh. */\n rotatesRefreshToken?: boolean;\n}\n\nexport interface ProviderFacts {\n id: string;\n displayName?: string;\n /** Default API base URL for connectors behind this provider. */\n baseUrl?: string;\n oauth2?: OAuth2ProviderFacts;\n docsUrl?: string;\n}\n\n// ---- Auth declarations (declared once; placement applied by the runtime, ADR-0012) ----\n\nexport interface OAuth2Auth {\n readonly kind: \"oauth2\";\n readonly provider?: string;\n readonly scopes: readonly string[];\n readonly flow: \"auth_code\" | \"client_credentials\";\n readonly describe?: string;\n}\n\nexport interface ApiKeyAuth {\n readonly kind: \"apiKey\";\n readonly in: \"header\" | \"query\";\n readonly name: string;\n readonly prefix?: string;\n readonly describe?: string;\n}\n\nexport interface BasicAuth {\n readonly kind: \"basic\";\n readonly describe?: string;\n}\n\nexport interface CustomAuth {\n readonly kind: \"custom\";\n readonly describe?: string;\n /** Field names the connect page collects (empty = connection is instantly ready). */\n readonly fields?: readonly string[];\n /** Programmatic signer \u2014 receives the outbound request and the credential fields. */\n readonly sign: (\n req: { url: URL; headers: Headers },\n fields: Readonly<Record<string, string>>,\n ) => void | Promise<void>;\n}\n\nexport type AuthDecl = OAuth2Auth | ApiKeyAuth | BasicAuth | CustomAuth;\n\nexport function oauth2(opts: {\n provider?: string;\n scopes: readonly string[];\n flow?: \"auth_code\" | \"client_credentials\";\n describe?: string;\n}): OAuth2Auth {\n return Object.freeze({\n kind: \"oauth2\" as const,\n scopes: Object.freeze([...opts.scopes]),\n flow: opts.flow ?? \"auth_code\",\n ...(opts.provider !== undefined ? { provider: opts.provider } : {}),\n ...(opts.describe !== undefined ? { describe: opts.describe } : {}),\n });\n}\n\nexport function apiKey(opts: {\n in?: \"header\" | \"query\";\n name?: string;\n prefix?: string;\n describe?: string;\n}): ApiKeyAuth {\n return Object.freeze({\n kind: \"apiKey\" as const,\n in: opts?.in ?? \"header\",\n name: opts?.name ?? \"Authorization\",\n ...(opts?.prefix !== undefined ? { prefix: opts.prefix } : {}),\n ...(opts?.describe !== undefined ? { describe: opts.describe } : {}),\n });\n}\n\nexport function basic(opts?: { describe?: string }): BasicAuth {\n return Object.freeze({\n kind: \"basic\" as const,\n ...(opts?.describe !== undefined ? { describe: opts.describe } : {}),\n });\n}\n\nexport function customAuth(opts: {\n describe?: string;\n fields?: readonly string[];\n sign: CustomAuth[\"sign\"];\n}): CustomAuth {\n return Object.freeze({\n kind: \"custom\" as const,\n sign: opts.sign,\n ...(opts.describe !== undefined ? { describe: opts.describe } : {}),\n ...(opts.fields !== undefined ? { fields: Object.freeze([...opts.fields]) } : {}),\n });\n}\n\n// ---- Actions (ADR-0012): non-durable, run inside the caller's Step ----\n\n/** Runtime-resolved, log-masked credential reference \u2014 the escape hatch for non-standard\n * placement. Prefer ctx.http, which attaches the credential by declared placement. */\nexport interface AuthRef {\n readonly kind: AuthDecl[\"kind\"];\n /** Which mode of a named auth map this connection used (undefined for single-auth). */\n readonly mode?: string;\n /** Credential fields (e.g. access_token, api_key, username, password). Values are\n * masked in logs by the runtime. */\n readonly fields: Readonly<Record<string, string>>;\n}\n\nexport interface ActionCtx {\n /** Pre-authed, base-URL'd client. Status \u2192 RetryableError/TerminalError per ADR-0012. */\n readonly http: TesserHttp;\n readonly auth: AuthRef;\n /** Auto-derived (runId + step + occurrence); attach to provider idempotency headers. */\n readonly idempotencyKey?: string;\n readonly logger: Logger;\n}\n\nexport interface ModelProviderSpec {\n readonly aliases?: Record<string, string>;\n readonly call: (ctx: ActionCtx, request: NormalizedModelRequest) => Promise<NormalizedModelResponse>;\n}\n\nexport interface HarnessProviderSpec {\n readonly adapter: string;\n readonly run: (\n ctx: ActionCtx,\n request: HarnessRunRequest<unknown>,\n def: HarnessDef,\n ) => Promise<HarnessRunResult<unknown>>;\n}\n\n/** I = caller-facing input (schema input type), PI = parsed input handed to run,\n * O = validated output. */\nexport interface ActionDef<I, PI, O> {\n readonly __action: true;\n readonly describe?: string;\n readonly input: StandardSchemaV1<I, PI>;\n readonly output: Schema<O>;\n /** Reads retry freely; writes retry only with an idempotency key (derived, ADR-0012). */\n readonly safety: \"read\" | \"write\";\n /** Explicit override of derived retry-safety. */\n readonly retrySafe?: boolean;\n readonly classifyError?: ClassifyError;\n readonly run: (ctx: ActionCtx, input: PI) => Promise<O>;\n}\n\nexport type AnyAction = ActionDef<any, any, any>;\nexport type ActionsTree = { [key: string]: AnyAction | ActionsTree };\n\nexport function action<IS extends AnySchema, OS extends AnySchema>(def: {\n describe?: string;\n input: IS;\n output: OS;\n safety?: \"read\" | \"write\";\n retrySafe?: boolean;\n classifyError?: ClassifyError;\n /** Receives the PARSED input (defaults applied); returns the value `output` validates. */\n run: (ctx: ActionCtx, input: SchemaOut<IS>) => Promise<SchemaIn<OS>>;\n}): ActionDef<SchemaIn<IS>, SchemaOut<IS>, SchemaOut<OS>> {\n if (!def?.input || !def?.output || typeof def?.run !== \"function\") {\n throw new TypeError(\"action: requires { input, output, run }\");\n }\n return Object.freeze({\n __action: true as const,\n input: def.input,\n output: def.output,\n safety: def.safety ?? \"write\",\n run: def.run,\n ...(def.describe !== undefined ? { describe: def.describe } : {}),\n ...(def.retrySafe !== undefined ? { retrySafe: def.retrySafe } : {}),\n ...(def.classifyError !== undefined ? { classifyError: def.classifyError } : {}),\n }) as never;\n}\n\nexport function isAction(node: unknown): node is AnyAction {\n return typeof node === \"object\" && node !== null && (node as AnyAction).__action === true;\n}\n\n// ---- Webhook receive (connector-level, ADR-0013) ----\n\nexport interface InboundWebhookEvent {\n readonly headers: Record<string, string>;\n readonly query: Record<string, string>;\n readonly rawBody: Uint8Array;\n /** Parsed JSON body, or undefined when the body is not JSON. */\n readonly json: unknown;\n}\n\nexport type VerifyScheme =\n | {\n kind: \"hmacSha256\";\n header: string;\n prefix?: string;\n encoding: \"hex\" | \"base64\";\n }\n | { kind: \"slackSigning\" }\n | {\n kind: \"custom\";\n verify: (req: InboundWebhookEvent, secret: string) => boolean | Promise<boolean>;\n }\n | { kind: \"none\" };\n\nexport const verify = {\n hmacSha256(opts: { header: string; prefix?: string; encoding?: \"hex\" | \"base64\" }): VerifyScheme {\n return Object.freeze({\n kind: \"hmacSha256\" as const,\n header: opts.header,\n encoding: opts.encoding ?? \"hex\",\n ...(opts.prefix !== undefined ? { prefix: opts.prefix } : {}),\n });\n },\n slackSigning(): VerifyScheme {\n return Object.freeze({ kind: \"slackSigning\" as const });\n },\n custom(fn: (req: InboundWebhookEvent, secret: string) => boolean | Promise<boolean>): VerifyScheme {\n return Object.freeze({ kind: \"custom\" as const, verify: fn });\n },\n none(): VerifyScheme {\n return Object.freeze({ kind: \"none\" as const });\n },\n};\n\nexport interface IdentifiedEvent {\n /** Provider event name a trigger's `event` matches against (e.g. \"issues\", \"message\"). */\n event: string;\n /** Provider delivery id used for dedup; fall back to a payload hash when absent. */\n deliveryId?: string;\n /** Provider-side account identity (team id, installation id) to resolve the Connection. */\n connectionHint?: string;\n /** The payload handed to the trigger's map(); defaults to the request JSON. */\n payload?: unknown;\n}\n\nexport interface WebhookReceive {\n verify: VerifyScheme;\n /** Pull event name / delivery id / connection identity out of any inbound request.\n * Return null for requests that are not events (the runtime 400s them). */\n identify: (req: InboundWebhookEvent) => IdentifiedEvent | null;\n /** Endpoint-verification handshakes (e.g. Slack url_verification): return the response\n * body to answer with, or null when the request is a normal event. */\n challenge?: (req: InboundWebhookEvent) => string | null;\n}\n\n// ---- Connector triggers (ADR-0013) ----\n\nexport interface RegistrationTarget {\n /** Our ingress URL \u2014 stable per automation+trigger; never changes on redeploy. */\n url: string;\n /** The signing secret (we generate it in auto mode; the human pastes it in manual mode). */\n secret: string;\n}\n\nexport interface AutoRegistration<I> {\n mode: \"auto\";\n /** Create the provider-side hook using the brokered token (ctx.http). */\n create: (\n ctx: ActionCtx,\n reg: RegistrationTarget,\n params: I,\n ) => Promise<{ externalId?: string; state?: unknown } | void>;\n /** Remove the provider-side hook on undeploy (no orphaned hooks). */\n destroy?: (\n ctx: ActionCtx,\n reg: { externalId?: string; state?: unknown },\n params: I,\n ) => Promise<void>;\n}\n\nexport interface ManualRegistration<I> {\n mode: \"manual\";\n /** Connect-page copy: exact steps, with the ingress URL + secret available to interpolate. */\n instructions: (reg: RegistrationTarget, params: I) => string;\n}\n\nexport interface WebhookTriggerDecl<IS extends AnySchema = AnySchema, OS extends AnySchema = AnySchema> {\n readonly __trigger: \"webhook\";\n readonly describe?: string;\n readonly input: IS;\n readonly output: OS;\n /** Which identified provider event this trigger consumes. */\n readonly event: string;\n /** Raw provider payload \u2192 our stable typed payload; return null to skip (fine filter). */\n readonly map: (\n payload: unknown,\n params: SchemaOut<IS>,\n ) => SchemaIn<OS> | null | Promise<SchemaIn<OS> | null>;\n readonly register: AutoRegistration<SchemaOut<IS>> | ManualRegistration<SchemaOut<IS>>;\n}\n\nexport interface PollTriggerDecl<\n IS extends AnySchema = AnySchema,\n OS extends AnySchema = AnySchema,\n Item = unknown,\n> {\n readonly __trigger: \"poll\";\n readonly describe?: string;\n readonly input: IS;\n readonly output: OS;\n /** Connector-declared cadence; automation-author override is clamped to `floor`. */\n readonly interval?: { default: string; floor?: string };\n /** Which way the provider's natural list reads. New items fire oldest-first either way.\n * Default \"newest-first\" (how most list APIs sort). */\n readonly order?: \"newest-first\" | \"oldest-first\";\n /** Return the provider's natural current list \u2014 no cursor bookkeeping (runtime-owned\n * windowed seen-set). Opt into cursor mode by returning { items, nextCursor }. */\n readonly poll: (\n ctx: ActionCtx,\n params: SchemaOut<IS>,\n cursor: unknown,\n ) => Promise<Item[] | { items: Item[]; nextCursor?: unknown }>;\n readonly dedupeKey: (item: Item) => string;\n /** Raw item \u2192 stable typed payload (default: identity). */\n readonly map?: (item: Item, params: SchemaOut<IS>) => SchemaIn<OS> | Promise<SchemaIn<OS>>;\n}\n\nexport type AnyTriggerDecl = WebhookTriggerDecl<AnySchema, AnySchema> | PollTriggerDecl<AnySchema, AnySchema, any>;\nexport type TriggersDecl = Record<string, AnyTriggerDecl>;\n\nexport const trigger = {\n webhook<IS extends AnySchema, OS extends AnySchema>(def: {\n describe?: string;\n input: IS;\n output: OS;\n event: string;\n map: (\n payload: unknown,\n params: SchemaOut<IS>,\n ) => SchemaIn<OS> | null | Promise<SchemaIn<OS> | null>;\n register: AutoRegistration<SchemaOut<IS>> | ManualRegistration<SchemaOut<IS>>;\n }): WebhookTriggerDecl<IS, OS> {\n if (!def?.input || !def?.output || !def?.event || typeof def?.map !== \"function\" || !def?.register) {\n throw new TypeError(\"trigger.webhook: requires { input, output, event, map, register }\");\n }\n return Object.freeze({ __trigger: \"webhook\" as const, ...def });\n },\n poll<IS extends AnySchema, OS extends AnySchema, Item = SchemaIn<OS>>(def: {\n describe?: string;\n input: IS;\n output: OS;\n interval?: { default: string; floor?: string };\n order?: \"newest-first\" | \"oldest-first\";\n poll: (\n ctx: ActionCtx,\n params: SchemaOut<IS>,\n cursor: unknown,\n ) => Promise<Item[] | { items: Item[]; nextCursor?: unknown }>;\n dedupeKey: (item: Item) => string;\n map?: (item: Item, params: SchemaOut<IS>) => SchemaIn<OS> | Promise<SchemaIn<OS>>;\n }): PollTriggerDecl<IS, OS, Item> {\n if (!def?.input || !def?.output || typeof def?.poll !== \"function\" || typeof def?.dedupeKey !== \"function\") {\n throw new TypeError(\"trigger.poll: requires { input, output, poll, dedupeKey }\");\n }\n return Object.freeze({ __trigger: \"poll\" as const, ...def });\n },\n};\n\n// ---- defineConnector ----\n\n/** Optional-arg ergonomics: when every field is optional (or has a default), the call\n * needs no argument at all. */\ntype ClientFn<I, O> = undefined extends I\n ? (input?: I) => Promise<O>\n : Record<string, never> extends I\n ? (input?: I) => Promise<O>\n : (input: I) => Promise<O>;\n\nexport type ClientFromActions<A> = {\n readonly [K in keyof A]: A[K] extends ActionDef<infer I, any, infer O>\n ? ClientFn<I, O>\n : A[K] extends ActionsTree\n ? ClientFromActions<A[K]>\n : never;\n};\n\nexport type TriggerConstructors<T extends TriggersDecl> = {\n readonly [K in keyof T]: (\n params: SchemaIn<T[K][\"input\"]> & { connection?: string } & (T[K] extends { __trigger: \"poll\" }\n ? { every?: string }\n : Record<never, never>),\n ) => ConnectorTrigger<SchemaOut<T[K][\"output\"]>>;\n};\n\nexport interface ConnectorSpec<A extends ActionsTree, T extends TriggersDecl> {\n id: string;\n describe?: string;\n /** Provider id referencing the Catalog, or inline facts (promoted by codegen, ADR-0012). */\n provider?: string | ProviderFacts;\n /** API base URL; defaults to the provider's. */\n baseUrl?: string;\n /** One declaration, or a named map for multiple modes (e.g. { oauth, token }). */\n auth: AuthDecl | Record<string, AuthDecl>;\n /** Headers every ctx.http request carries (e.g. Accept/API-version/User-Agent). */\n defaultHeaders?: Record<string, string>;\n /** Provider idempotency header \u2014 when declared, the runtime auto-attaches ctx.idempotencyKey. */\n idempotencyHeader?: string;\n actions: A;\n triggers?: T;\n /** Direct model-call capability (ADR-0016). Runtime-owned; not exposed as ctx.connections actions. */\n modelProvider?: ModelProviderSpec;\n /** Sandboxed external runner capability (ADR-0019). Runtime-owned; not exposed as an Action. */\n harnessProvider?: HarnessProviderSpec;\n /** Required when any trigger is webhook-strategy. */\n webhook?: WebhookReceive;\n /** Sample outputs by dotted action path (and `trigger:<id>` for trigger payloads) \u2014\n * powers auto-mocked tests (ADR-0008) and connect-page previews. */\n samples?: Record<string, unknown>;\n}\n\n/** The full connector object: the automation-facing Connector<client> plus trigger\n * constructors plus the raw spec for build-time extraction. */\nexport interface ConnectorInstance<A extends ActionsTree, T extends TriggersDecl>\n extends Connector<ClientFromActions<A>> {\n readonly triggers: TriggerConstructors<T>;\n /** Build-time/manifest access to the declaration \u2014 not for automation code. */\n readonly __connector: ConnectorSpec<A, T>;\n /** Narrowed override so `.perUser()` keeps the trigger constructors. */\n perUser(): ConnectorInstance<A, T>;\n}\n\nconst CONNECTOR_ID = /^[a-z][a-z0-9-]{0,63}$/;\nconst AUTH_KINDS = new Set([\"oauth2\", \"apiKey\", \"basic\", \"custom\"]);\n\nfunction isAuthDecl(v: unknown): v is AuthDecl {\n return typeof v === \"object\" && v !== null && AUTH_KINDS.has((v as AuthDecl).kind);\n}\n\nexport function defineConnector<\n A extends ActionsTree,\n T extends TriggersDecl = Record<string, never>,\n>(spec: ConnectorSpec<A, T>): ConnectorInstance<A, T> {\n if (!CONNECTOR_ID.test(spec?.id ?? \"\")) {\n throw new TypeError(`defineConnector: id \"${String(spec?.id)}\" must be kebab-case`);\n }\n if (!spec.auth || (!isAuthDecl(spec.auth) && Object.values(spec.auth).every((a) => !isAuthDecl(a)))) {\n throw new TypeError(`defineConnector(${spec.id}): auth must be oauth2/apiKey/basic/customAuth (or a named map)`);\n }\n if ((!spec.actions || Object.keys(spec.actions).length === 0) && !spec.modelProvider && !spec.harnessProvider) {\n throw new TypeError(`defineConnector(${spec.id}): at least one action, modelProvider, or harnessProvider is required`);\n }\n const normalized = { ...spec, actions: (spec.actions ?? ({} as A)) } as ConnectorSpec<A, T>;\n const triggers = normalized.triggers ?? ({} as T);\n const hasWebhookTrigger = Object.values(triggers).some((t) => t.__trigger === \"webhook\");\n if (hasWebhookTrigger && !normalized.webhook) {\n throw new TypeError(\n `defineConnector(${spec.id}): webhook-strategy triggers require the connector-level webhook { verify, identify }`,\n );\n }\n\n const constructors: Record<string, (params: Record<string, unknown>) => ConnectorTrigger<unknown>> = {};\n for (const [triggerId, decl] of Object.entries(triggers)) {\n void decl;\n constructors[triggerId] = (params) => {\n // `connection` and `every` are reserved platform params, not provider filters.\n const { connection, every, ...rest } = params ?? {};\n return Object.freeze({\n kind: \"connector\" as const,\n connectorId: normalized.id,\n triggerId,\n params: rest,\n ...(connection !== undefined ? { connectionKey: String(connection) } : {}),\n ...(every !== undefined ? { every: String(every) } : {}),\n });\n };\n }\n\n function make(scope: \"workspace\" | \"per_user\"): ConnectorInstance<A, T> {\n const instance = {\n id: normalized.id,\n scope,\n triggers: Object.freeze({ ...constructors }) as TriggerConstructors<T>,\n __connector: normalized,\n perUser(): ConnectorInstance<A, T> {\n return make(\"per_user\");\n },\n };\n return Object.freeze(instance) as unknown as ConnectorInstance<A, T>;\n }\n\n return make(\"workspace\");\n}\n\nexport function isConnector(value: unknown): value is ConnectorInstance<ActionsTree, TriggersDecl> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { id?: unknown }).id === \"string\" &&\n typeof (value as { __connector?: unknown }).__connector === \"object\"\n );\n}\n\nexport type { ClassifyError, TesserHttp } from \"../internal/http.js\";\nexport type { Schema } from \"../automation.js\";\n", "// Builds the typed client tree handed to automations as ctx.connections.<name> and runs a\n// single Action with input/output validation. The runtime (server: broker-authed http;\n// testing: mocks/cassettes) supplies the invoke/ctx \u2014 the SDK owns the walking and the\n// validation so both sides behave identically.\n\nimport type { ActionCtx, ActionsTree, AnyAction, ConnectorInstance, TriggersDecl } from \"../connector/index.js\";\nimport { isAction } from \"../connector/index.js\";\nimport { validateSchema } from \"./standard-schema.js\";\n\nexport type InvokeAction = (\n actionPath: string[],\n def: AnyAction,\n input: unknown,\n) => Promise<unknown>;\n\nexport function buildConnectorClient(\n connector: ConnectorInstance<ActionsTree, TriggersDecl>,\n invoke: InvokeAction,\n): unknown {\n function walk(tree: ActionsTree, path: string[]): Record<string, unknown> {\n const node: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(tree)) {\n const childPath = [...path, key];\n if (isAction(child)) {\n node[key] = (input: unknown) => invoke(childPath, child, input);\n } else {\n node[key] = walk(child as ActionsTree, childPath);\n }\n }\n return Object.freeze(node);\n }\n return walk(connector.__connector.actions ?? {}, []);\n}\n\n/** Resolve an action by dotted path (used by webhook registrars and MCP exposure). */\nexport function actionAtPath(\n connector: ConnectorInstance<ActionsTree, TriggersDecl>,\n path: string[],\n): AnyAction | undefined {\n let node: ActionsTree | AnyAction | undefined = connector.__connector.actions ?? {};\n for (const key of path) {\n if (node === undefined || isAction(node)) return undefined;\n node = (node as ActionsTree)[key];\n }\n return node !== undefined && isAction(node) ? node : undefined;\n}\n\n/** Validate input \u2192 run \u2192 validate OUR mapped output (never the raw provider response). */\nexport async function runAction(\n def: AnyAction,\n ctx: ActionCtx,\n rawInput: unknown,\n what: string,\n): Promise<unknown> {\n const input = await validateSchema(def.input, rawInput ?? {}, `${what} input`);\n const result = await def.run(ctx, input);\n return validateSchema(def.output, result, `${what} output`);\n}\n\n/** Derived retry-safety (ADR-0012): reads retry; writes retry only with an idempotency\n * key; explicit per-action override wins. */\nexport function isRetrySafe(def: AnyAction, connectorHasIdempotencyHeader: boolean): boolean {\n if (def.retrySafe !== undefined) return def.retrySafe;\n if (def.safety === \"read\") return true;\n return connectorHasIdempotencyHeader;\n}\n", "// Static manifest extraction (ADR-0010 / 0012): the build reads an automation's or\n// connector's requirements WITHOUT executing handlers. Module evaluation is allowed;\n// `run` functions are never called. Powers deploy-halt, connect links, codegen, and CI.\n\nimport type { AutomationDef, ConnectionMap, RetryPolicy, SecretMap } from \"../automation.js\";\nimport type { HarnessDef } from \"../harnesses.js\";\nimport type { ModelDef, ModelSettingsV1, OperatorDef } from \"../operators.js\";\nimport type {\n ActionsTree,\n AnyAction,\n ConnectorInstance,\n ProviderFacts,\n TriggersDecl,\n} from \"../connector/index.js\";\nimport { isAction, isConnector } from \"../connector/index.js\";\nimport type {\n ConnectorTrigger,\n EventTrigger,\n ScheduleTrigger,\n Trigger,\n WebhookTrigger,\n} from \"../triggers.js\";\nimport { encodeJournal, type JsonValue } from \"./codec.js\";\nimport { actionAtPath, isRetrySafe } from \"./client.js\";\n\nexport type TriggerManifest =\n | { kind: \"schedule\"; cron: string; tz?: string }\n | { kind: \"webhook\"; respond: \"async\" | \"sync\"; hasInputSchema: boolean }\n | { kind: \"event\"; event: string }\n | {\n kind: \"connector\";\n connector: string;\n trigger: string;\n params: JsonValue;\n /** The `connections` key this trigger binds to (resolved here, ADR-0013). */\n connection: string;\n /** Author cadence override for poll triggers (clamped to the connector floor). */\n every?: string;\n };\n\nexport interface AutomationManifest {\n id: string;\n trigger: TriggerManifest;\n connections: Record<string, { connector: string; scope: \"workspace\" | \"per_user\" }>;\n secrets: Record<string, { describe?: string }>;\n models: Record<string, { connection: string; connector: string; alias: string; settings?: ModelSettingsV1 }>;\n operators: Record<\n string,\n {\n model: string;\n instructions: string;\n tools: Array<{ path: string; connection: string; action: string; safety: \"read\" | \"write\" }>;\n maxTurns: number;\n }\n >;\n harnesses: Record<\n string,\n {\n connection: string;\n connector: string;\n sandbox: string;\n permissions: string;\n timeout?: string;\n maxOutputBytes?: number;\n }\n >;\n budget?: { models?: { tokens: number; outputTokens: number }; harnesses?: { invocations: number; wallClock?: string } };\n retry?: RetryPolicy;\n concurrency?: { limit: number; hasKey: boolean; onConflict: \"queue\" | \"drop\" };\n hasInputSchema: boolean;\n hasOutputSchema: boolean;\n}\n\nexport class ManifestError extends TypeError {\n constructor(\n readonly automationId: string,\n message: string,\n ) {\n super(`automation \"${automationId}\": ${message}`);\n this.name = \"ManifestError\";\n }\n}\n\n// `any` maps on purpose: Ctx is contravariant in `run`, so a concretely-typed def is not\n// assignable to AutomationDef<\u2026, ConnectionMap, SecretMap>.\nexport function extractAutomationManifest(\n def: AutomationDef<any, any, any, any, any, any, any>,\n): AutomationManifest {\n const connections: AutomationManifest[\"connections\"] = {};\n const connMap = (def.connections ?? {}) as ConnectionMap;\n for (const [key, conn] of Object.entries(connMap)) {\n connections[key] = { connector: conn.id, scope: conn.scope ?? \"workspace\" };\n }\n const secrets: AutomationManifest[\"secrets\"] = {};\n const secretMap = (def.secrets ?? {}) as SecretMap;\n for (const [key, sec] of Object.entries(secretMap)) {\n secrets[key] = sec.describe !== undefined ? { describe: sec.describe } : {};\n }\n\n let trigger: TriggerManifest;\n const t = def.trigger as Trigger<unknown>;\n switch (t.kind) {\n case \"schedule\": {\n const st = t as ScheduleTrigger;\n trigger = { kind: \"schedule\", cron: st.cron, ...(st.tz !== undefined ? { tz: st.tz } : {}) };\n break;\n }\n case \"webhook\": {\n const wt = t as WebhookTrigger<unknown>;\n trigger = { kind: \"webhook\", respond: wt.respond, hasInputSchema: wt.input !== undefined };\n break;\n }\n case \"event\": {\n const et = t as EventTrigger<unknown>;\n trigger = { kind: \"event\", event: et.event.name };\n break;\n }\n case \"connector\": {\n const ct = t as ConnectorTrigger<unknown>;\n // Connection binding (ADR-0013): explicit key, else auto-bind when exactly one\n // connections entry uses this connector.\n let key = ct.connectionKey;\n if (key !== undefined) {\n const bound = connections[key];\n if (!bound) {\n throw new ManifestError(def.id, `trigger names connection \"${key}\" but connections has no such entry`);\n }\n if (bound.connector !== ct.connectorId) {\n throw new ManifestError(\n def.id,\n `trigger connection \"${key}\" is a ${bound.connector} connection, but the trigger belongs to ${ct.connectorId}`,\n );\n }\n } else {\n const candidates = Object.entries(connections).filter(([, c]) => c.connector === ct.connectorId);\n if (candidates.length === 0) {\n throw new ManifestError(\n def.id,\n `trigger ${ct.connectorId}.triggers.${ct.triggerId} requires a ${ct.connectorId} entry in connections`,\n );\n }\n if (candidates.length > 1) {\n throw new ManifestError(\n def.id,\n `trigger ${ct.connectorId}.triggers.${ct.triggerId} is ambiguous \u2014 name it: { connection: \"<key>\" } (candidates: ${candidates.map(([k]) => k).join(\", \")})`,\n );\n }\n key = (candidates[0] as [string, unknown])[0];\n }\n let params: JsonValue;\n try {\n params = encodeJournal(ct.params);\n } catch (err) {\n throw new ManifestError(def.id, `trigger params must be plain data: ${(err as Error).message}`);\n }\n trigger = {\n kind: \"connector\",\n connector: ct.connectorId,\n trigger: ct.triggerId,\n params,\n connection: key,\n ...(ct.every !== undefined ? { every: ct.every } : {}),\n };\n break;\n }\n default:\n throw new ManifestError(def.id, `unknown trigger kind \"${(t as { kind: string }).kind}\"`);\n }\n\n const models: AutomationManifest[\"models\"] = {};\n const modelMap = (def.models ?? {}) as Record<string, ModelDef>;\n for (const [key, m] of Object.entries(modelMap)) {\n const conn = connections[m.connection];\n if (!conn) {\n throw new ManifestError(def.id, `models.${key} names connection \"${m.connection}\" but connections has no such entry`);\n }\n const connector = connMap[m.connection] as ConnectorInstance<any, any> | undefined;\n if (!connector?.__connector.modelProvider) {\n throw new ManifestError(def.id, `models.${key} uses connection \"${m.connection}\" but ${conn.connector} is not model-capable`);\n }\n models[key] = {\n connection: m.connection,\n connector: conn.connector,\n alias: m.alias,\n ...(m.settings !== undefined ? { settings: m.settings } : {}),\n };\n }\n\n const operators: AutomationManifest[\"operators\"] = {};\n const operatorMap = (def.operators ?? {}) as Record<string, OperatorDef>;\n for (const [key, op] of Object.entries(operatorMap)) {\n if (!models[op.model]) {\n throw new ManifestError(def.id, `operators.${key} references unknown model \"${op.model}\"`);\n }\n const tools: AutomationManifest[\"operators\"][string][\"tools\"] = [];\n for (const tool of op.tools) {\n const [connKey, ...actionPath] = tool.split(\".\");\n const conn = connections[connKey!];\n if (!conn) {\n throw new ManifestError(def.id, `operators.${key} tool \"${tool}\" names undeclared connection \"${connKey}\"`);\n }\n const connector = connMap[connKey!] as ConnectorInstance<any, any> | undefined;\n const action = connector ? actionAtPath(connector, actionPath) : undefined;\n if (!action) {\n throw new ManifestError(def.id, `operators.${key} tool \"${tool}\" is not a declared Action`);\n }\n tools.push({ path: tool, connection: connKey!, action: actionPath.join(\".\"), safety: action.safety });\n }\n operators[key] = { model: op.model, instructions: op.instructions, tools, maxTurns: op.maxTurns };\n }\n if (Object.keys(operators).length > 0 && !def.budget?.models) {\n throw new ManifestError(def.id, `budget.models is required when operators are declared`);\n }\n\n const harnesses: AutomationManifest[\"harnesses\"] = {};\n const harnessMap = (def.harnesses ?? {}) as Record<string, HarnessDef>;\n for (const [key, h] of Object.entries(harnessMap)) {\n const conn = connections[h.connection];\n if (!conn) {\n throw new ManifestError(def.id, `harnesses.${key} names connection \"${h.connection}\" but connections has no such entry`);\n }\n const connector = connMap[h.connection] as ConnectorInstance<any, any> | undefined;\n if (!connector?.__connector.harnessProvider) {\n throw new ManifestError(def.id, `harnesses.${key} uses connection \"${h.connection}\" but ${conn.connector} is not harness-capable`);\n }\n harnesses[key] = {\n connection: h.connection,\n connector: conn.connector,\n sandbox: h.sandbox,\n permissions: h.permissions,\n ...(h.timeout !== undefined ? { timeout: h.timeout } : {}),\n ...(h.maxOutputBytes !== undefined ? { maxOutputBytes: h.maxOutputBytes } : {}),\n };\n }\n\n return {\n id: def.id,\n trigger,\n connections,\n secrets,\n models,\n operators,\n harnesses,\n ...(def.budget !== undefined ? { budget: def.budget } : {}),\n ...(def.retry !== undefined ? { retry: def.retry } : {}),\n ...(def.concurrency !== undefined\n ? {\n concurrency: {\n limit: def.concurrency.limit,\n hasKey: typeof def.concurrency.key === \"function\",\n onConflict: def.concurrency.onConflict ?? \"queue\",\n },\n }\n : {}),\n hasInputSchema: def.input !== undefined,\n hasOutputSchema: def.output !== undefined,\n };\n}\n\n// ---- Connector manifests (codegen + Catalog assembly, ADR-0012) ----\n\nexport interface ConnectorManifest {\n id: string;\n describe?: string;\n provider?: string;\n providerFacts?: ProviderFacts;\n baseUrl?: string;\n auth: Record<\n string,\n | { kind: \"oauth2\"; provider?: string; scopes: string[]; flow: string; describe?: string }\n | { kind: \"apiKey\"; in: string; name: string; prefix?: string; describe?: string }\n | { kind: \"basic\"; describe?: string }\n | { kind: \"custom\"; fields: string[]; describe?: string }\n >;\n idempotencyHeader?: string;\n actions: Array<{ path: string; describe?: string; safety: \"read\" | \"write\"; retrySafe: boolean }>;\n modelProvider?: { aliases?: Record<string, string> };\n harnessProvider?: { adapter: string };\n triggers: Array<{\n id: string;\n strategy: \"poll\" | \"webhook\";\n describe?: string;\n registerMode?: \"auto\" | \"manual\";\n intervalDefault?: string;\n intervalFloor?: string;\n event?: string;\n }>;\n webhookVerify?: string;\n}\n\nexport function extractConnectorManifest(\n connector: ConnectorInstance<ActionsTree, TriggersDecl>,\n): ConnectorManifest {\n if (!isConnector(connector)) throw new TypeError(\"extractConnectorManifest: not a connector\");\n const spec = connector.__connector;\n\n const authMap = (\"kind\" in spec.auth ? { default: spec.auth } : spec.auth) as Record<\n string,\n import(\"../connector/index.js\").AuthDecl\n >;\n const auth: ConnectorManifest[\"auth\"] = {};\n for (const [mode, decl] of Object.entries(authMap)) {\n switch (decl.kind) {\n case \"oauth2\":\n auth[mode] = {\n kind: \"oauth2\",\n scopes: [...decl.scopes],\n flow: decl.flow,\n ...(decl.provider !== undefined ? { provider: decl.provider } : {}),\n ...(decl.describe !== undefined ? { describe: decl.describe } : {}),\n };\n break;\n case \"apiKey\":\n auth[mode] = {\n kind: \"apiKey\",\n in: decl.in,\n name: decl.name,\n ...(decl.prefix !== undefined ? { prefix: decl.prefix } : {}),\n ...(decl.describe !== undefined ? { describe: decl.describe } : {}),\n };\n break;\n case \"basic\":\n auth[mode] = { kind: \"basic\", ...(decl.describe !== undefined ? { describe: decl.describe } : {}) };\n break;\n case \"custom\":\n auth[mode] = {\n kind: \"custom\",\n fields: [...(decl.fields ?? [])],\n ...(decl.describe !== undefined ? { describe: decl.describe } : {}),\n };\n break;\n }\n }\n\n const actions: ConnectorManifest[\"actions\"] = [];\n const hasIdem = spec.idempotencyHeader !== undefined;\n (function walk(tree: ActionsTree, path: string[]) {\n for (const [key, child] of Object.entries(tree)) {\n const p = [...path, key];\n if (isAction(child)) {\n const a = child as AnyAction;\n actions.push({\n path: p.join(\".\"),\n safety: a.safety,\n retrySafe: isRetrySafe(a, hasIdem),\n ...(a.describe !== undefined ? { describe: a.describe } : {}),\n });\n } else {\n walk(child as ActionsTree, p);\n }\n }\n })(spec.actions ?? {}, []);\n\n const triggers: ConnectorManifest[\"triggers\"] = [];\n for (const [id, decl] of Object.entries(spec.triggers ?? {})) {\n if (decl.__trigger === \"webhook\") {\n triggers.push({\n id,\n strategy: \"webhook\",\n registerMode: decl.register.mode,\n event: decl.event,\n ...(decl.describe !== undefined ? { describe: decl.describe } : {}),\n });\n } else {\n triggers.push({\n id,\n strategy: \"poll\",\n ...(decl.interval?.default !== undefined ? { intervalDefault: decl.interval.default } : {}),\n ...(decl.interval?.floor !== undefined ? { intervalFloor: decl.interval.floor } : {}),\n ...(decl.describe !== undefined ? { describe: decl.describe } : {}),\n });\n }\n }\n\n return {\n id: spec.id,\n auth,\n actions,\n ...(spec.modelProvider !== undefined\n ? {\n modelProvider: {\n ...(spec.modelProvider.aliases !== undefined ? { aliases: spec.modelProvider.aliases } : {}),\n },\n }\n : {}),\n ...(spec.harnessProvider !== undefined ? { harnessProvider: { adapter: spec.harnessProvider.adapter } } : {}),\n triggers,\n ...(spec.describe !== undefined ? { describe: spec.describe } : {}),\n ...(typeof spec.provider === \"string\"\n ? { provider: spec.provider }\n : spec.provider !== undefined\n ? { provider: spec.provider.id, providerFacts: spec.provider }\n : {}),\n ...(spec.baseUrl !== undefined ? { baseUrl: spec.baseUrl } : {}),\n ...(spec.idempotencyHeader !== undefined ? { idempotencyHeader: spec.idempotencyHeader } : {}),\n ...(spec.webhook !== undefined ? { webhookVerify: spec.webhook.verify.kind } : {}),\n };\n}\n", "import { TerminalError } from \"../errors.js\";\nimport type { AutomationDef, Ctx, Schema, Serializable } from \"../automation.js\";\nimport type { ActionsTree, AnyAction, ConnectorInstance, TriggersDecl } from \"../connector/index.js\";\nimport type {\n ModelDef,\n ModelMessage,\n ModelToolCall,\n ModelToolDescriptor,\n NormalizedModelRequest,\n NormalizedModelResponse,\n OperatorDef,\n Operators,\n} from \"../operators.js\";\nimport { encodeJournal, decodeJournal, type JsonValue } from \"./codec.js\";\nimport { actionAtPath } from \"./client.js\";\nimport { validateSchema } from \"./standard-schema.js\";\n\nexport interface ModelCallInfo {\n automationId: string;\n operatorKey: string;\n modelKey: string;\n model: ModelDef;\n request: NormalizedModelRequest;\n}\n\nexport type ModelCaller = (info: ModelCallInfo) => Promise<NormalizedModelResponse>;\n\ninterface ToolRuntime {\n descriptor: ModelToolDescriptor;\n connectionKey: string;\n actionPath: string[];\n action: AnyAction;\n}\n\ninterface ApprovalPayload {\n approved: boolean;\n reason?: string;\n}\n\nconst approvalSchema: Schema<ApprovalPayload> = {\n \"~standard\": {\n version: 1,\n vendor: \"tesser\",\n validate(value) {\n if (typeof value === \"object\" && value !== null && typeof (value as { approved?: unknown }).approved === \"boolean\") {\n const v = value as { approved: boolean; reason?: unknown };\n return {\n value: {\n approved: v.approved,\n ...(typeof v.reason === \"string\" ? { reason: v.reason } : {}),\n },\n };\n }\n return { issues: [{ message: \"expected { approved: boolean }\" }] };\n },\n },\n};\n\nexport function buildOperators(\n def: AutomationDef<any, any, any, any, any, any, any>,\n ctx: Ctx<any, any, any>,\n callModel: ModelCaller,\n): Operators<any> {\n const usage = { tokens: 0, outputTokens: 0 };\n const out: Record<string, (input: unknown) => Promise<unknown>> = {};\n for (const [operatorKey, op] of Object.entries(def.operators ?? {})) {\n out[operatorKey] = (input: unknown) =>\n executeOperator({ def, ctx, operatorKey, op: op as OperatorDef, input, usage, callModel });\n }\n return Object.freeze(out);\n}\n\nasync function executeOperator(opts: {\n def: AutomationDef<any, any, any, any, any, any, any>;\n ctx: Ctx<any, any, any>;\n operatorKey: string;\n op: OperatorDef;\n input: unknown;\n usage: { tokens: number; outputTokens: number };\n callModel: ModelCaller;\n}): Promise<unknown> {\n const { def, ctx, operatorKey, op } = opts;\n const modelKey = op.model;\n const model = def.models?.[modelKey];\n if (!model) throw new TerminalError(`operator.${operatorKey}: unknown model \"${modelKey}\"`);\n\n const validatedInput = await validateSchema(op.input, opts.input, `operator.${operatorKey} input`);\n const serialInput = toSerializable(validatedInput, `operator.${operatorKey} input`);\n const tools = await resolveTools(def, op, operatorKey);\n const messages: ModelMessage[] = [{ role: \"user\", content: JSON.stringify(serialInput) }];\n const outputJsonSchema = await schemaJson(op.output);\n let tainted = true; // trigger payload / Operator input is coarse-tainted in v1.\n\n for (let turn = 1; turn <= op.maxTurns; turn++) {\n assertBudget(def, model, opts.usage, operatorKey);\n const request: NormalizedModelRequest = {\n operatorKey,\n modelKey,\n alias: model.alias,\n instructions: op.instructions,\n input: serialInput,\n messages,\n tools: tools.map((t) => t.descriptor),\n ...(model.settings !== undefined ? { settings: model.settings } : {}),\n ...(outputJsonSchema !== undefined ? { outputJsonSchema } : {}),\n };\n const response = (await ctx.step(`operator.${operatorKey}.model.${turn}`, async () =>\n toSerializable(\n await opts.callModel({ automationId: def.id, operatorKey, modelKey, model, request }),\n `operator.${operatorKey} model response`,\n ),\n )) as unknown as NormalizedModelResponse;\n validateModelResponse(response, operatorKey, turn);\n addUsage(opts.usage, response);\n assertBudget(def, model, opts.usage, operatorKey);\n\n const toolCalls = response.toolCalls ?? [];\n if (toolCalls.length > 0) {\n messages.push({ role: \"assistant\", content: response.content ?? `requested ${toolCalls.length} tool call(s)` });\n let index = 0;\n for (const call of toolCalls) {\n index++;\n const tool = toolForCall(tools, call);\n if (!tool) {\n throw new TerminalError(`operator.${operatorKey}: model requested undeclared tool \"${call.name}\"`);\n }\n if (tool.action.safety === \"write\") {\n const approval = await ctx.waitForSignal(`operator.${operatorKey}.approval`, {\n schema: approvalSchema,\n timeout: \"1h\",\n });\n if (approval === null) {\n throw new TerminalError(`operator.${operatorKey}: approval timed out for write tool ${tool.descriptor.path}`);\n }\n if (!approval.approved) {\n throw new TerminalError(`operator.${operatorKey}: approval denied for write tool ${tool.descriptor.path}`);\n }\n }\n const toolResult = await ctx.step(`operator.${operatorKey}.tool.${turn}.${index}.${tool.descriptor.path}`, async () => {\n const fn = actionFunction(ctx.connections as Record<string, unknown>, tool.connectionKey, tool.actionPath);\n return toSerializable(await fn(call.input), `operator.${operatorKey} tool ${tool.descriptor.path} output`);\n });\n if (tool.action.safety === \"read\") tainted = true;\n messages.push({\n role: \"tool\",\n toolCallId: call.id,\n content: minimizeToolOutput(toolResult, { tainted }),\n });\n }\n continue;\n }\n\n const rawOutput = response.output !== undefined ? response.output : parseJson(response.content, operatorKey, turn);\n return validateSchema(op.output, rawOutput, `operator.${operatorKey} output`);\n }\n throw new TerminalError(`operator.${operatorKey}: exceeded maxTurns (${op.maxTurns})`);\n}\n\nasync function resolveTools(\n def: AutomationDef<any, any, any, any, any, any, any>,\n op: OperatorDef,\n operatorKey: string,\n): Promise<ToolRuntime[]> {\n const out: ToolRuntime[] = [];\n const connections = (def.connections ?? {}) as Record<string, ConnectorInstance<ActionsTree, TriggersDecl>>;\n for (const toolPath of op.tools) {\n const [connectionKey, ...actionPath] = toolPath.split(\".\");\n const connector = connections[connectionKey!];\n if (!connector) throw new TerminalError(`operator.${operatorKey}: undeclared tool connection \"${connectionKey}\"`);\n const action = actionAtPath(connector, actionPath);\n if (!action) throw new TerminalError(`operator.${operatorKey}: tool \"${toolPath}\" is not a declared Action`);\n const inputSchema = await schemaJson(action.input as Schema<unknown>);\n out.push({\n connectionKey: connectionKey!,\n actionPath,\n action,\n descriptor: {\n name: toolName(toolPath),\n path: toolPath,\n ...(action.describe !== undefined ? { description: action.describe } : {}),\n ...(inputSchema !== undefined ? { inputSchema } : {}),\n },\n });\n }\n return out;\n}\n\nfunction toolForCall(tools: ToolRuntime[], call: ModelToolCall): ToolRuntime | undefined {\n return tools.find((t) => call.name === t.descriptor.name || call.name === t.descriptor.path);\n}\n\nexport function toolName(path: string): string {\n return path.replace(/[^A-Za-z0-9_-]/g, \"__\");\n}\n\nfunction actionFunction(\n connections: Record<string, unknown>,\n connectionKey: string,\n actionPath: string[],\n): (input: unknown) => Promise<unknown> {\n let node = connections[connectionKey];\n for (const seg of actionPath) node = (node as Record<string, unknown> | undefined)?.[seg];\n if (typeof node !== \"function\") {\n throw new TerminalError(`operator tool ${connectionKey}.${actionPath.join(\".\")} is not callable`);\n }\n return node as (input: unknown) => Promise<unknown>;\n}\n\nfunction validateModelResponse(response: NormalizedModelResponse, operatorKey: string, turn: number): void {\n if (typeof response !== \"object\" || response === null) {\n throw new TerminalError(`operator.${operatorKey} turn ${turn}: model adapter returned a non-object response`);\n }\n if (!response.usage || typeof response.usage.inputTokens !== \"number\" || typeof response.usage.outputTokens !== \"number\") {\n throw new TerminalError(`operator.${operatorKey} turn ${turn}: model response missing usage tokens`);\n }\n}\n\nfunction addUsage(usage: { tokens: number; outputTokens: number }, response: NormalizedModelResponse): void {\n usage.tokens += response.usage.inputTokens + response.usage.outputTokens + (response.usage.reasoningTokens ?? 0);\n usage.outputTokens += response.usage.outputTokens;\n}\n\nfunction assertBudget(\n def: AutomationDef<any, any, any, any, any, any, any>,\n model: ModelDef,\n usage: { tokens: number; outputTokens: number },\n operatorKey: string,\n): void {\n const budget = def.budget?.models;\n if (!budget) throw new TerminalError(`operator.${operatorKey}: budget.models is required`);\n if (usage.tokens >= budget.tokens) {\n throw new TerminalError(`operator.${operatorKey}: model token budget exceeded (${usage.tokens}/${budget.tokens})`);\n }\n if (usage.outputTokens >= budget.outputTokens) {\n throw new TerminalError(\n `operator.${operatorKey}: model output-token budget exceeded (${usage.outputTokens}/${budget.outputTokens})`,\n );\n }\n const maxOut = model.settings?.maxOutputTokens;\n if (maxOut !== undefined && maxOut > budget.outputTokens - usage.outputTokens) {\n throw new TerminalError(`operator.${operatorKey}: model maxOutputTokens exceeds remaining output-token budget`);\n }\n}\n\nfunction parseJson(content: string | undefined, operatorKey: string, turn: number): unknown {\n if (!content) throw new TerminalError(`operator.${operatorKey} turn ${turn}: model returned no output`);\n const trimmed = content.trim().replace(/^```(?:json)?\\s*/i, \"\").replace(/\\s*```$/, \"\");\n try {\n return JSON.parse(trimmed);\n } catch (cause) {\n throw new TerminalError(`operator.${operatorKey} turn ${turn}: model output was not JSON`, { cause });\n }\n}\n\nfunction toSerializable(value: unknown, what: string): Serializable {\n try {\n return decodeJournal(encodeJournal(value)) as Serializable;\n } catch (cause) {\n throw new TerminalError(`${what} is not serializable`, { cause });\n }\n}\n\nfunction minimizeToolOutput(value: Serializable, opts: { tainted: boolean }): string {\n const raw = JSON.stringify({ tainted: opts.tainted, value: encodeJournal(value) });\n return raw.length <= 4000 ? raw : raw.slice(0, 3997) + \"...\";\n}\n\nasync function schemaJson(schema: Schema<unknown>): Promise<Serializable | undefined> {\n const std = (schema as { \"~standard\"?: { vendor?: string } })[\"~standard\"];\n try {\n let json: unknown;\n const direct = schema as unknown as { toJSONSchema?: () => unknown };\n if (typeof direct.toJSONSchema === \"function\") json = direct.toJSONSchema();\n else if (std?.vendor === \"zod\") {\n const zod = (await import(\"zod\")) as unknown as {\n toJSONSchema?: (s: unknown, opts?: unknown) => unknown;\n z?: { toJSONSchema?: (s: unknown, opts?: unknown) => unknown };\n };\n const convert = zod.toJSONSchema ?? zod.z?.toJSONSchema;\n if (convert) json = convert(schema, { unrepresentable: \"any\" });\n }\n if (json === undefined) return undefined;\n return decodeJournal(encodeJournal(json as JsonValue)) as Serializable;\n } catch {\n return undefined;\n }\n}\n", "import { TerminalError } from \"../errors.js\";\nimport type { AutomationDef, Ctx, Serializable } from \"../automation.js\";\nimport type { HarnessDef, HarnessRunRequest, HarnessRunResult, Harnesses } from \"../harnesses.js\";\nimport { encodeJournal, decodeJournal } from \"./codec.js\";\nimport { validateSchema } from \"./standard-schema.js\";\n\nexport interface HarnessCallInfo {\n automationId: string;\n harnessKey: string;\n harness: HarnessDef;\n request: HarnessRunRequest<unknown>;\n}\n\nexport type HarnessCaller = (info: HarnessCallInfo) => Promise<HarnessRunResult<unknown>>;\n\nexport function buildHarnesses(\n def: AutomationDef<any, any, any, any, any, any, any>,\n _ctx: Ctx<any, any, any, any>,\n callHarness: HarnessCaller,\n): Harnesses<any> {\n const out: Record<string, { run: (request: HarnessRunRequest<unknown>) => Promise<HarnessRunResult<unknown>> }> = {};\n const harnesses = (def.harnesses ?? {}) as Record<string, HarnessDef>;\n for (const [harnessKey, h] of Object.entries(harnesses)) {\n out[harnessKey] = {\n run: async (request) => {\n if (!request || typeof request.prompt !== \"string\" || request.prompt.length === 0) {\n throw new TerminalError(`harness.${harnessKey}: prompt is required`);\n }\n if (!request.output) throw new TerminalError(`harness.${harnessKey}: output schema is required`);\n const raw = await callHarness({ automationId: def.id, harnessKey, harness: h, request });\n const serial = toSerializable(raw, `harness.${harnessKey} result`) as unknown as HarnessRunResult<unknown>;\n const output = await validateSchema(request.output, serial.output, `harness.${harnessKey} output`);\n return { ...serial, output: toSerializable(output, `harness.${harnessKey} output`) as never };\n },\n };\n }\n return Object.freeze(out) as unknown as Harnesses<any>;\n}\n\nfunction toSerializable(value: unknown, what: string): Serializable {\n try {\n return decodeJournal(encodeJournal(value)) as Serializable;\n } catch (cause) {\n throw new TerminalError(`${what} is not serializable`, { cause });\n }\n}\n", "// The deterministic exit-code taxonomy (ADR-0007). Agents branch on these; never reuse\n// a number for a different meaning.\n\nexport const EXIT = {\n OK: 0,\n /** Unexpected/internal error. */\n ERROR: 1,\n /** Usage error \u2014 bad arguments or no linked project. */\n USAGE: 2,\n /** Tests failed (machine-actionable detail on stdout with --json). */\n TESTS_FAILED: 3,\n /** Deploy halted: credentials needed \u2014 a connect link is on stdout. */\n HALTED_CREDENTIALS: 4,\n /** Could not reach or authenticate against the instance. */\n AUTH: 5,\n /** Resource not found. */\n NOT_FOUND: 6,\n /** Conflict / invalid state for the requested operation. */\n CONFLICT: 7,\n /** Deploy failed (build error or red test gate). */\n DEPLOY_FAILED: 8,\n} as const;\n\nexport type ExitCode = (typeof EXIT)[keyof typeof EXIT];\n", "// Machine-first I/O contract (ADR-0007): stdout = data (one JSON document with --json),\n// stderr = logs/progress, deterministic exit codes.\n\nimport { EXIT, type ExitCode } from \"./exit-codes.js\";\n\nexport class Output {\n constructor(readonly json: boolean) {}\n\n /** Emit the command's data result. `human` renders the no-JSON form. */\n data(value: unknown, human?: (v: never) => string): void {\n if (this.json) {\n process.stdout.write(JSON.stringify(value, null, 2) + \"\\n\");\n } else {\n process.stdout.write((human ? human(value as never) : JSON.stringify(value, null, 2)) + \"\\n\");\n }\n }\n\n /** Progress/notes \u2192 stderr, never stdout. */\n log(msg: string): void {\n process.stderr.write(msg + \"\\n\");\n }\n\n fail(code: ExitCode, message: string, extra?: Record<string, unknown>): never {\n if (this.json) {\n process.stdout.write(JSON.stringify({ error: { code, message, ...extra } }, null, 2) + \"\\n\");\n } else {\n process.stderr.write(`error: ${message}\\n`);\n if (extra) process.stderr.write(JSON.stringify(extra, null, 2) + \"\\n\");\n }\n process.exit(code);\n }\n}\n\nexport class CliError extends Error {\n constructor(\n readonly code: ExitCode,\n message: string,\n readonly extra?: Record<string, unknown>,\n ) {\n super(message);\n }\n}\n\nexport function toExit(err: unknown, out: Output): never {\n if (err instanceof CliError) out.fail(err.code, err.message, err.extra);\n out.fail(EXIT.ERROR, err instanceof Error ? err.message : String(err));\n}\n", "// Thin control-plane client. Every command is a shell over this (ADR-0007).\n\nimport { EXIT } from \"./exit-codes.js\";\nimport { CliError } from \"./output.js\";\n\nexport class ApiClient {\n constructor(\n readonly baseUrl: string,\n readonly token: string | undefined,\n ) {}\n\n async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n if (!this.token) {\n throw new CliError(\n EXIT.AUTH,\n \"no API token \u2014 run `tesser login --url <instance> --token <tsk_\u2026>` or set TESSER_TOKEN\",\n );\n }\n let res: Response;\n try {\n res = await fetch(`${this.baseUrl}/api${path}`, {\n method,\n headers: {\n authorization: `Bearer ${this.token}`,\n ...(body !== undefined ? { \"content-type\": \"application/json\" } : {}),\n },\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n });\n } catch (cause) {\n throw new CliError(EXIT.AUTH, `cannot reach instance at ${this.baseUrl} (${String(cause)})`);\n }\n const text = await res.text();\n let parsed: unknown;\n try {\n parsed = text.length > 0 ? JSON.parse(text) : null;\n } catch {\n parsed = { raw: text };\n }\n if (!res.ok) {\n const errBody = parsed as { error?: { code?: string; message?: string } };\n const message = errBody?.error?.message ?? `instance responded ${res.status}`;\n if (res.status === 401) throw new CliError(EXIT.AUTH, message);\n if (res.status === 404) throw new CliError(EXIT.NOT_FOUND, message);\n if (res.status === 400) throw new CliError(EXIT.USAGE, message);\n if (res.status === 409) throw new CliError(EXIT.CONFLICT, message);\n throw new CliError(EXIT.ERROR, message);\n }\n return parsed as T;\n }\n\n get<T>(path: string): Promise<T> {\n return this.request(\"GET\", path);\n }\n post<T>(path: string, body?: unknown): Promise<T> {\n return this.request(\"POST\", path, body);\n }\n put<T>(path: string, body?: unknown): Promise<T> {\n return this.request(\"PUT\", path, body);\n }\n delete<T>(path: string): Promise<T> {\n return this.request(\"DELETE\", path);\n }\n}\n", "// Profiles + the link manifest. Token resolution: --token > TESSER_TOKEN > profile.\n// Instance URL: --url > tesser.json > TESSER_URL > profile > localhost default.\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nexport interface Profile {\n url?: string;\n token?: string;\n}\nexport interface CliConfig {\n current?: string;\n profiles?: Record<string, Profile>;\n}\n\n/** tesser.json \u2014 the link manifest: ties this repo (Project) to an instance (ADR-0006). */\nexport interface LinkManifest {\n project: string;\n instance?: string;\n}\n\nconst CONFIG_PATH = join(\n process.env[\"TESSER_CONFIG_DIR\"] ?? join(homedir(), \".config\", \"tesser\"),\n \"config.json\",\n);\n\nexport function readConfig(): CliConfig {\n try {\n return JSON.parse(readFileSync(CONFIG_PATH, \"utf8\")) as CliConfig;\n } catch {\n return {};\n }\n}\n\nexport function writeConfig(config: CliConfig): void {\n mkdirSync(dirname(CONFIG_PATH), { recursive: true });\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + \"\\n\", { mode: 0o600 });\n}\n\nexport function activeProfile(config: CliConfig, name?: string): Profile {\n const profileName = name ?? config.current ?? \"default\";\n return config.profiles?.[profileName] ?? {};\n}\n\nexport function findProjectRoot(start = process.cwd()): string | null {\n let dir = start;\n for (;;) {\n if (existsSync(join(dir, \"tesser.json\"))) return dir;\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nexport function readLinkManifest(root: string): LinkManifest | null {\n try {\n return JSON.parse(readFileSync(join(root, \"tesser.json\"), \"utf8\")) as LinkManifest;\n } catch {\n return null;\n }\n}\n\nexport interface ResolvedTarget {\n url: string;\n token: string | undefined;\n project: string | undefined;\n projectRoot: string | null;\n}\n\nexport function resolveTarget(opts: { url?: string; token?: string; profile?: string }): ResolvedTarget {\n const config = readConfig();\n const profile = activeProfile(config, opts.profile);\n const projectRoot = findProjectRoot();\n const manifest = projectRoot ? readLinkManifest(projectRoot) : null;\n return {\n url:\n opts.url ??\n manifest?.instance ??\n process.env[\"TESSER_URL\"] ??\n profile.url ??\n \"http://localhost:8377\",\n token: opts.token ?? process.env[\"TESSER_TOKEN\"] ?? profile.token,\n project: manifest?.project,\n projectRoot,\n };\n}\n", "// Local project introspection: discover automations, bundle one (esbuild), load its def\n// for smoke/build checks. (Apache-side implementation \u2014 the CLI never links the server.)\n\nimport { mkdtempSync, existsSync, readdirSync, statSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { build } from \"esbuild\";\nimport type { AutomationDef } from \"@devosurf/tesser-sdk\";\n\nexport interface LocalAutomation {\n automationId: string;\n dir: string;\n entry: string;\n hasTests: boolean;\n}\n\nexport function discoverLocalAutomations(projectRoot: string): LocalAutomation[] {\n const root = join(projectRoot, \"automations\");\n if (!existsSync(root)) return [];\n const out: LocalAutomation[] = [];\n for (const name of readdirSync(root).sort()) {\n const dir = join(root, name);\n if (!statSync(dir).isDirectory()) continue;\n const entry = join(dir, \"index.ts\");\n if (!existsSync(entry)) continue;\n const hasTests = readdirSync(dir).some((f) => /\\.test\\.(ts|js|mts|mjs)$/.test(f));\n out.push({ automationId: name, dir, entry, hasTests });\n }\n return out;\n}\n\nexport async function loadAutomationDef(entry: string): Promise<AutomationDef<any, any, any, any, any, any, any>> {\n const outDir = mkdtempSync(join(tmpdir(), \"tesser-cli-\"));\n const outFile = join(outDir, \"bundle.mjs\");\n await build({\n entryPoints: [entry],\n outfile: outFile,\n bundle: true,\n platform: \"node\",\n format: \"esm\",\n target: \"node20\",\n packages: \"bundle\",\n logLevel: \"silent\",\n });\n const mod = (await import(pathToFileURL(outFile).href)) as { default?: AutomationDef<any, any, any, any, any, any, any> };\n if (!mod.default || typeof mod.default.run !== \"function\") {\n throw new Error(`${entry}: no default export from defineAutomation`);\n }\n return mod.default;\n}\n", "import { spawn } from \"node:child_process\";\nimport { EXIT } from \"../exit-codes.js\";\nimport { CliError, type Output } from \"../output.js\";\n\nexport interface HarnessAuthOpts {\n connect: string;\n mode?: string;\n scope?: string;\n endUserId?: string;\n tokenStdin?: boolean;\n fromEnv?: string;\n bin?: string;\n}\n\nexport async function authClaudeCode(out: Output, instanceUrl: string, opts: HarnessAuthOpts): Promise<void> {\n const mode = opts.mode ?? \"subscription\";\n if (mode !== \"subscription\" && mode !== \"apiKey\") {\n throw new CliError(EXIT.USAGE, \"claude-code auth mode must be subscription or apiKey\");\n }\n const token =\n opts.tokenStdin === true || opts.fromEnv !== undefined\n ? await tokenFromPipeOrEnv(opts)\n : mode === \"subscription\"\n ? await runClaudeSetupToken(out, opts.bin ?? \"claude\")\n : await tokenFromPipeOrEnv({ ...opts, tokenStdin: true });\n await postConnection({\n instanceUrl,\n connect: opts.connect,\n connector: \"claude-code\",\n mode,\n scope: opts.scope ?? \"workspace\",\n ...(opts.endUserId !== undefined ? { endUserId: opts.endUserId } : {}),\n fields: mode === \"subscription\" ? { oauth_token: token } : { api_key: token },\n });\n out.data({ connector: \"claude-code\", mode, connected: true }, () => `claude-code ${mode} connected \u2713`);\n}\n\nexport async function authPi(out: Output, instanceUrl: string, opts: HarnessAuthOpts): Promise<void> {\n const mode = opts.mode ?? \"anthropicOAuth\";\n if (mode !== \"anthropicOAuth\" && mode !== \"anthropicApiKey\") {\n throw new CliError(EXIT.USAGE, \"pi auth mode must be anthropicOAuth or anthropicApiKey\");\n }\n const token = await tokenFromPipeOrEnv(opts);\n await postConnection({\n instanceUrl,\n connect: opts.connect,\n connector: \"pi\",\n mode,\n scope: opts.scope ?? \"workspace\",\n ...(opts.endUserId !== undefined ? { endUserId: opts.endUserId } : {}),\n fields: mode === \"anthropicOAuth\" ? { oauth_token: token } : { api_key: token },\n });\n out.data({ connector: \"pi\", mode, connected: true }, () => `pi ${mode} connected \u2713`);\n}\n\nasync function tokenFromPipeOrEnv(opts: HarnessAuthOpts): Promise<string> {\n if (opts.fromEnv !== undefined) {\n const value = process.env[opts.fromEnv];\n if (!value) throw new CliError(EXIT.USAGE, `env ${opts.fromEnv} is empty or missing`);\n return value;\n }\n if (opts.tokenStdin !== true) {\n throw new CliError(EXIT.USAGE, \"pass --token-stdin or --from-env <NAME> so the token never appears in argv\");\n }\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(chunk as Buffer);\n const value = Buffer.concat(chunks).toString(\"utf8\").trim();\n if (value.length === 0) throw new CliError(EXIT.USAGE, \"empty token on stdin\");\n return value;\n}\n\nasync function runClaudeSetupToken(out: Output, bin: string): Promise<string> {\n out.log(\"starting `claude setup-token`; complete the browser login if prompted...\");\n const raw = await runInteractiveCapture(bin, [\"setup-token\"]);\n const token = extractClaudeToken(raw);\n if (!token) {\n throw new CliError(\n EXIT.ERROR,\n \"could not find a Claude Code OAuth token in `claude setup-token` output; rerun with `claude setup-token | tesser auth claude-code --connect <url> --token-stdin`\",\n );\n }\n return token;\n}\n\nfunction runInteractiveCapture(command: string, args: string[]): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, { stdio: [\"inherit\", \"pipe\", \"pipe\"] });\n let raw = \"\";\n const onData = (buf: Buffer) => {\n const text = buf.toString(\"utf8\");\n raw += text;\n process.stderr.write(sanitizeSetupOutput(text));\n };\n child.stdout.on(\"data\", onData);\n child.stderr.on(\"data\", onData);\n child.on(\"error\", reject);\n child.on(\"close\", (code) => {\n if (code === 0) resolve(raw);\n else reject(new CliError(EXIT.ERROR, `${command} ${args.join(\" \")} exited ${code ?? 1}`));\n });\n });\n}\n\nfunction extractClaudeToken(raw: string): string | null {\n const envMatch = raw.match(/CLAUDE_CODE_OAUTH_TOKEN\\s*=\\s*([^\\s]+)/);\n if (envMatch?.[1]) return envMatch[1].trim().replace(/^['\"]|['\"]$/g, \"\");\n const candidates = raw\n .split(/\\r?\\n/)\n .map((l) => l.trim())\n .filter((l) => /^[A-Za-z0-9._-]{40,}$/.test(l) && !/^https?:/i.test(l));\n return candidates.at(-1) ?? null;\n}\n\nfunction sanitizeSetupOutput(text: string): string {\n return text.replace(/(CLAUDE_CODE_OAUTH_TOKEN\\s*=\\s*)[^\\s]+/g, \"$1[redacted]\").replace(/\\b[A-Za-z0-9._-]{64,}\\b/g, \"[redacted-token]\");\n}\n\nasync function postConnection(opts: {\n instanceUrl: string;\n connect: string;\n connector: string;\n mode: string;\n scope: string;\n endUserId?: string;\n fields: Record<string, string>;\n}): Promise<void> {\n const url = connectPostUrl(opts.instanceUrl, opts.connect);\n const body = new URLSearchParams({ connector: opts.connector, mode: opts.mode, scope: opts.scope });\n if (opts.endUserId !== undefined) body.set(\"end_user_id\", opts.endUserId);\n for (const [key, value] of Object.entries(opts.fields)) body.set(`field_${key}`, value);\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: body.toString(),\n redirect: \"manual\",\n });\n if (res.status >= 300 && res.status < 400) return;\n const text = await res.text().catch(() => \"\");\n throw new CliError(EXIT.ERROR, `connect page rejected ${opts.connector} ${opts.mode}: ${res.status}${text ? ` ${text}` : \"\"}`);\n}\n\nfunction connectPostUrl(instanceUrl: string, connect: string): string {\n if (/^https?:\\/\\//i.test(connect)) {\n const u = new URL(connect);\n const match = u.pathname.match(/\\/connect\\/([^/]+)/);\n if (!match?.[1]) throw new CliError(EXIT.USAGE, \"--connect must be a Tesser /connect/<token> URL or token\");\n return `${u.origin}/connect/${match[1]}/connection`;\n }\n const token = connect.replace(/^\\/?connect\\//, \"\");\n if (!/^cl_[a-f0-9]+$/i.test(token)) throw new CliError(EXIT.USAGE, \"--connect must be a Tesser /connect/<token> URL or token\");\n return `${instanceUrl.replace(/\\/$/, \"\")}/connect/${token}/connection`;\n}\n\nexport const _test = { extractClaudeToken, sanitizeSetupOutput, connectPostUrl };\n", "// `tesser deploy`: trigger a sync (git ref, or --local working tree), poll to a settled\n// state, surface the connect link on halt (exit 4), failures on red (exit 8).\n\nimport type { ApiClient } from \"../client.js\";\nimport { EXIT } from \"../exit-codes.js\";\nimport { CliError, Output } from \"../output.js\";\n\ninterface DeployState {\n repo?: { status: string; report?: DeployReport | null; error?: string | null } | null;\n live?: unknown[];\n}\ninterface DeployReport {\n sha?: string;\n env?: string;\n built?: string[];\n unchanged?: string[];\n failed?: Array<{ automation: string; stage: string; reason: string }>;\n removed?: string[];\n connectUrl?: string;\n manual?: unknown[];\n}\n\nexport async function deploy(\n out: Output,\n api: ApiClient,\n project: string,\n opts: { ref?: string | undefined; local?: string | undefined; timeoutMs?: number; wait?: boolean },\n): Promise<never> {\n await api.post(`/projects/${project}/sync`, {\n ...(opts.ref !== undefined ? { ref: opts.ref } : {}),\n ...(opts.local !== undefined ? { localPath: opts.local } : {}),\n });\n out.log(`sync queued for ${project}${opts.local ? \" (local tree)\" : opts.ref ? ` @ ${opts.ref}` : \"\"}`);\n\n if (opts.wait === false) {\n out.data({ queued: true });\n process.exit(EXIT.OK);\n }\n\n const deadline = Date.now() + (opts.timeoutMs ?? 10 * 60_000);\n let last: DeployState = {};\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, 750));\n last = await api.get<DeployState>(`/projects/${project}/deploys/latest`);\n const status = last.repo?.status;\n if (status === \"syncing\" || status === \"idle\" || status === undefined) continue;\n\n const report = (last.repo?.report ?? {}) as DeployReport;\n if (status === \"halted-credentials\") {\n out.data(\n { status, connectUrl: report.connectUrl, report },\n () =>\n `deploy HALTED \u2014 credentials needed.\\nOpen this link in a browser to connect:\\n ${report.connectUrl}\\nThen rerun: tesser deploy${opts.local ? \" --local\" : \"\"}`,\n );\n process.exit(EXIT.HALTED_CREDENTIALS);\n }\n if (status === \"failed\") {\n out.data({ status, report, error: last.repo?.error }, () =>\n [\n \"deploy FAILED:\",\n ...(report.failed ?? []).map((f) => ` ${f.automation} [${f.stage}]: ${f.reason.split(\"\\n\")[0]}`),\n ...(last.repo?.error ? [` ${last.repo.error}`] : []),\n ].join(\"\\n\"),\n );\n process.exit(EXIT.DEPLOY_FAILED);\n }\n if (status === \"synced\") {\n out.data({ status, report, live: last.live }, () =>\n [\n `deploy OK @ ${report.sha?.slice(0, 8) ?? \"?\"} \u2192 ${report.env}`,\n ` built: ${report.built?.join(\", \") || \"(none)\"}`,\n ` unchanged: ${report.unchanged?.join(\", \") || \"(none)\"}`,\n ...(report.removed?.length ? [` removed: ${report.removed.join(\", \")}`] : []),\n ].join(\"\\n\"),\n );\n process.exit(EXIT.OK);\n }\n }\n throw new CliError(EXIT.ERROR, \"timed out waiting for the deploy to settle\", { last: last as never });\n}\n", "// `tesser dev`: a real local instance with zero setup \u2014 spawns the tesser-server BINARY\n// (process boundary; the Apache CLI never links AGPL code) on embedded PGlite, deploys\n// the local working tree through the REAL reconciler, and redeploys on change.\n\nimport { randomBytes } from \"node:crypto\";\nimport { spawn } from \"node:child_process\";\nimport { existsSync, watch } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { ApiClient } from \"../client.js\";\nimport { EXIT } from \"../exit-codes.js\";\nimport { CliError, Output } from \"../output.js\";\n\n/** Returns [command, ...args]. Prefers the package's real .mjs entry (run with node);\n * falls back to the .bin shim executed directly (it is a shell script, not JS). */\nfunction findServerBin(start: string): string[] | null {\n const envBin = process.env[\"TESSER_SERVER_BIN\"];\n if (envBin && existsSync(envBin)) {\n return envBin.endsWith(\".mjs\") || envBin.endsWith(\".js\") ? [process.execPath, envBin] : [envBin];\n }\n let dir = start;\n for (;;) {\n const entry = join(dir, \"node_modules\", \"@devosurf\", \"tesser-server\", \"bin\", \"tesser-server.mjs\");\n if (existsSync(entry)) return [process.execPath, entry];\n const shim = join(dir, \"node_modules\", \".bin\", \"tesser-server\");\n if (existsSync(shim)) return [shim];\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nexport async function dev(\n out: Output,\n projectRoot: string,\n project: string,\n opts: { port?: number; watch?: boolean },\n): Promise<void> {\n const bin = findServerBin(projectRoot);\n if (!bin) {\n throw new CliError(\n EXIT.USAGE,\n \"tesser-server binary not found \u2014 install @devosurf/tesser-server (pnpm add -D @devosurf/tesser-server) or set TESSER_SERVER_BIN\",\n );\n }\n const port = opts.port ?? 8377;\n const token = `tsk_${randomBytes(24).toString(\"hex\")}`;\n const url = `http://localhost:${port}`;\n\n out.log(`starting local instance on ${url} (embedded postgres at .tesser/pglite)`);\n const child = spawn(bin[0]!, bin.slice(1), {\n env: {\n ...process.env,\n PORT: String(port),\n TESSER_DATA_DIR: join(projectRoot, \".tesser\"),\n TESSER_BOOTSTRAP_TOKEN: token,\n TESSER_BASE_URL: url,\n DATABASE_URL: \"\",\n },\n stdio: [\"ignore\", \"inherit\", \"inherit\"],\n });\n const stop = () => {\n child.kill(\"SIGTERM\");\n };\n process.on(\"SIGINT\", () => {\n stop();\n process.exit(0);\n });\n process.on(\"SIGTERM\", stop);\n\n const api = new ApiClient(url, token);\n const deadline = Date.now() + 30_000;\n for (;;) {\n try {\n await api.get(\"/health\");\n break;\n } catch {\n if (Date.now() > deadline) throw new CliError(EXIT.ERROR, \"local instance did not come up\");\n await new Promise((r) => setTimeout(r, 300));\n }\n }\n await api.post(\"/projects\", { name: project });\n\n const syncOnce = async () => {\n await api.post(`/projects/${project}/sync`, { localPath: projectRoot });\n // poll to settled, print, but DON'T exit (deploy() exits \u2014 inline a light loop)\n for (let i = 0; i < 600; i++) {\n await new Promise((r) => setTimeout(r, 500));\n const state = await api.get<{ repo?: { status: string; report?: { connectUrl?: string; failed?: unknown[] } } }>(\n `/projects/${project}/deploys/latest`,\n );\n const status = state.repo?.status;\n if (status === \"syncing\") continue;\n if (status === \"halted-credentials\") {\n out.log(`HALTED \u2014 connect credentials in your browser:\\n ${state.repo?.report?.connectUrl}`);\n } else if (status === \"failed\") {\n out.log(`deploy failed: ${JSON.stringify(state.repo?.report?.failed ?? [])}`);\n } else if (status === \"synced\") {\n out.log(`deployed \u2713 \u2014 webhooks at ${url}/hooks/${project}/<automation>`);\n }\n return;\n }\n };\n await syncOnce();\n\n if (opts.watch !== false) {\n let timer: NodeJS.Timeout | null = null;\n watch(join(projectRoot, \"automations\"), { recursive: true }, () => {\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n out.log(\"change detected \u2014 redeploying\u2026\");\n void syncOnce();\n }, 400);\n });\n out.log(\"watching automations/ for changes (ctrl-c to stop)\");\n await new Promise(() => {}); // run until interrupted\n } else {\n stop();\n }\n}\n", "// `tesser init <name>`: scaffold a Project \u2014 the linked repo unit (ADR-0006). One\n// automation per directory; colocated tests; git is the source of truth.\n\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { EXIT } from \"../exit-codes.js\";\nimport { CliError, Output } from \"../output.js\";\nimport { projectPackageJson, tesserGitignore, writeProjectAgentInstructions, writeTesserGeneratedDocs } from \"./project-docs.js\";\n\nconst EXAMPLE_AUTOMATION = `import { defineAutomation, onWebhook } from \"@devosurf/tesser-sdk\";\nimport { z } from \"zod\";\n\nexport default defineAutomation({\n id: \"hello\",\n trigger: onWebhook({ input: z.object({ name: z.string().default(\"world\") }) }),\n output: z.object({ greeting: z.string() }),\n\n run: async (input, ctx) => {\n // Plain TypeScript. Durability ONLY from ctx.step() (every side effect goes inside one).\n const greeting = await ctx.step(\"compose\", async () => \\`hello, \\${input.name}!\\`);\n return { greeting };\n },\n});\n`;\n\nconst EXAMPLE_TEST = `import { createTest } from \"@devosurf/tesser-testing\";\nimport automation from \"./index\";\n\ntest(\"greets by name\", async () => {\n const t = createTest({ automation });\n const { result } = await t.run({ input: { name: \"tesser\" } });\n expect(result).toEqual({ greeting: \"hello, tesser!\" });\n});\n`;\n\nexport function init(out: Output, name: string, opts: { dir?: string | undefined; instance?: string | undefined }, version: string): void {\n if (!/^[a-z][a-z0-9-]{0,63}$/.test(name)) {\n throw new CliError(EXIT.USAGE, \"project name must be kebab-case\");\n }\n const root = join(opts.dir ?? process.cwd(), name);\n if (existsSync(join(root, \"tesser.json\"))) {\n throw new CliError(EXIT.CONFLICT, `${root} is already a Tesser project`);\n }\n mkdirSync(join(root, \"automations\", \"hello\"), { recursive: true });\n\n writeFileSync(\n join(root, \"tesser.json\"),\n JSON.stringify({ project: name, ...(opts.instance !== undefined ? { instance: opts.instance } : {}) }, null, 2) + \"\\n\",\n );\n writeFileSync(\n join(root, \"package.json\"),\n JSON.stringify(\n projectPackageJson(name, version),\n null,\n 2,\n ) + \"\\n\",\n );\n writeFileSync(\n join(root, \"tsconfig.json\"),\n JSON.stringify(\n {\n compilerOptions: {\n target: \"ES2022\",\n module: \"ESNext\",\n moduleResolution: \"Bundler\",\n strict: true,\n skipLibCheck: true,\n types: [\"vitest/globals\"],\n },\n include: [\"automations\"],\n },\n null,\n 2,\n ) + \"\\n\",\n );\n writeFileSync(\n join(root, \"vitest.config.ts\"),\n `import { defineConfig } from \"vitest/config\";\\nexport default defineConfig({ test: { globals: true, include: [\"automations/**/*.test.ts\"] } });\\n`,\n );\n writeFileSync(join(root, \".gitignore\"), tesserGitignore());\n writeProjectAgentInstructions(root, name, version, { overwrite: true });\n const docs = writeTesserGeneratedDocs(root, name, version);\n writeFileSync(join(root, \"automations\", \"hello\", \"index.ts\"), EXAMPLE_AUTOMATION);\n writeFileSync(join(root, \"automations\", \"hello\", \"index.test.ts\"), EXAMPLE_TEST);\n\n const next = [\n \"cd \" + name,\n \"pnpm install\",\n \"git init && git add -A && git commit -m init\",\n \"tesser link\",\n \"tesser test\",\n ];\n out.data(\n { created: root, tesserVersion: version, docs, next },\n () =>\n `created ${root}\\nnext:\\n cd ${name}\\n pnpm install # creates pnpm-lock.yaml; commit it\\n git init && git add -A && git commit -m init\\n tesser link # register on your instance\\n tesser test # green in milliseconds`,\n );\n}\n", "import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { EXIT } from \"../exit-codes.js\";\nimport { CliError, Output } from \"../output.js\";\n\nexport const TESSER_DEPENDENCIES = [\"@devosurf/tesser-sdk\", \"@devosurf/tesser-connectors\"] as const;\nexport const TESSER_DEV_DEPENDENCIES = [\"@devosurf/tesser\", \"@devosurf/tesser-server\", \"@devosurf/tesser-testing\"] as const;\n\nexport const GENERATED_DOC_PATHS = [\n \".tesser/docs/manifest.json\",\n \".tesser/docs/README.md\",\n \".tesser/docs/cli.md\",\n \".tesser/docs/sdk.md\",\n \".tesser/docs/connectors.md\",\n] as const;\n\ninterface JsonObject {\n [key: string]: unknown;\n}\n\nexport function projectPackageJson(name: string, version: string): JsonObject {\n return {\n name,\n private: true,\n type: \"module\",\n packageManager: \"pnpm@9.12.0\",\n scripts: { test: \"tesser test\", deploy: \"tesser deploy\", dev: \"tesser dev\" },\n dependencies: {\n \"@devosurf/tesser-sdk\": version,\n \"@devosurf/tesser-connectors\": version,\n zod: \"^4\",\n },\n devDependencies: {\n \"@devosurf/tesser\": version,\n \"@devosurf/tesser-server\": version,\n \"@devosurf/tesser-testing\": version,\n vitest: \"^4\",\n },\n };\n}\n\nexport function writeProjectAgentInstructions(root: string, projectName: string, version: string, opts: { overwrite: boolean }): boolean {\n const path = join(root, \"AGENTS.md\");\n if (!opts.overwrite && existsSync(path)) return false;\n writeFileSync(path, projectAgentsMd(projectName, version));\n return true;\n}\n\nexport function writeTesserGeneratedDocs(root: string, projectName: string, version: string): string[] {\n const docsDir = join(root, \".tesser\", \"docs\");\n mkdirSync(docsDir, { recursive: true });\n const docs: Record<string, string> = {\n \"manifest.json\": JSON.stringify(\n {\n kind: \"tesser-agent-docs\",\n schemaVersion: 1,\n generatedBy: \"@devosurf/tesser\",\n tesserVersion: version,\n project: projectName,\n generatedFiles: GENERATED_DOC_PATHS.filter((path) => path !== \".tesser/docs/manifest.json\"),\n },\n null,\n 2,\n ) + \"\\n\",\n \"README.md\": docsReadmeMd(projectName, version),\n \"cli.md\": cliReferenceMd(version),\n \"sdk.md\": sdkReferenceMd(version),\n \"connectors.md\": connectorsReferenceMd(version),\n };\n for (const [file, content] of Object.entries(docs)) {\n writeFileSync(join(docsDir, file), content);\n }\n return [...GENERATED_DOC_PATHS];\n}\n\nexport function tesserGitignore(): string {\n return `node_modules/\\n.env\\n\\n# Tesser local runtime state from \\`tesser dev\\`; keep generated agent docs committed.\\n.tesser/*\\n!.tesser/\\n!.tesser/docs/\\n!.tesser/docs/**\\n`;\n}\n\nexport function ensureTesserDocsGitignore(root: string): boolean {\n const path = join(root, \".gitignore\");\n const block = `\\n# Tesser local runtime state from \\`tesser dev\\`; keep generated agent docs committed.\\n.tesser/*\\n!.tesser/\\n!.tesser/docs/\\n!.tesser/docs/**\\n`;\n if (!existsSync(path)) {\n writeFileSync(path, tesserGitignore());\n return true;\n }\n const existing = readFileSync(path, \"utf8\");\n if (existing.includes(\"!.tesser/docs/**\")) return false;\n writeFileSync(path, existing.replace(/\\s*$/, \"\\n\") + block);\n return true;\n}\n\nexport function upgradeProject(\n out: Output,\n project: { name: string; root: string },\n version: string,\n): void {\n const packagePath = join(project.root, \"package.json\");\n if (!existsSync(packagePath)) {\n throw new CliError(EXIT.USAGE, \"not inside a package-backed Tesser project (missing package.json)\");\n }\n const pkg = JSON.parse(readFileSync(packagePath, \"utf8\")) as JsonObject;\n pinTesserPackages(pkg, version);\n writeFileSync(packagePath, JSON.stringify(pkg, null, 2) + \"\\n\");\n\n const docs = writeTesserGeneratedDocs(project.root, project.name, version);\n const gitignoreUpdated = ensureTesserDocsGitignore(project.root);\n const agentInstructionsCreated = writeProjectAgentInstructions(project.root, project.name, version, { overwrite: false });\n const next = [\n \"pnpm install\",\n \"tesser test --json\",\n \"git add package.json pnpm-lock.yaml .gitignore AGENTS.md .tesser/docs && git commit -m \\\"upgrade tesser\\\"\",\n ];\n\n out.data(\n { upgraded: project.root, tesserVersion: version, docs, packageJson: \"package.json\", gitignoreUpdated, agentInstructionsCreated, next },\n () =>\n `upgraded ${project.root} to Tesser ${version}\\nnext:\\n pnpm install\\n tesser test --json\\n git add package.json pnpm-lock.yaml .gitignore AGENTS.md .tesser/docs && git commit -m \"upgrade tesser\"`,\n );\n}\n\nfunction pinTesserPackages(pkg: JsonObject, version: string): void {\n const dependencies = objectField(pkg, \"dependencies\");\n for (const name of TESSER_DEPENDENCIES) dependencies[name] = version;\n const devDependencies = objectField(pkg, \"devDependencies\");\n for (const name of TESSER_DEV_DEPENDENCIES) devDependencies[name] = version;\n}\n\nfunction objectField(pkg: JsonObject, key: string): JsonObject {\n const existing = pkg[key];\n if (existing && typeof existing === \"object\" && !Array.isArray(existing)) return existing as JsonObject;\n const next: JsonObject = {};\n pkg[key] = next;\n return next;\n}\n\nfunction projectAgentsMd(projectName: string, version: string): string {\n return `# Working in this Tesser Project\\n\\nThis repository is a Tesser **Project**: one git repo of automations deployed to a Tesser **Instance**.\\n\\n## Read first\\n- [Generated Tesser reference](./.tesser/docs/README.md) \u2014 generated for Tesser ${version}.\\n- [CLI reference](./.tesser/docs/cli.md) \u2014 use \\`--json\\` for machine-readable output.\\n- [SDK reference](./.tesser/docs/sdk.md) \u2014 authoring pattern, \\`ctx.step\\`, tests.\\n- [Connector reference](./.tesser/docs/connectors.md) \u2014 safe Connection and Secret usage.\\n\\n## Project rules\\n- Use Tesser terms: **Automation**, **Trigger**, **Step**, **Project**, **Instance**, **Connector**, **Connection**, **Secret**, **Credential broker**, **Replay**.\\n- One Automation per directory under \\`automations/\\`; colocate \\`*.test.ts\\` with each Automation.\\n- Every side effect and external call must be inside \\`ctx.step(\"stable-name\", async () => ...)\\`.\\n- Declare credentials statically with \\`connections: { ... }\\` and \\`secrets: { ... }\\`; never read or print secret values.\\n- Run \\`pnpm install\\` after init/upgrade, commit \\`pnpm-lock.yaml\\`, and never commit \\`node_modules/\\`.\\n- Before deploy, run \\`tesser test --json\\` (and usually \\`tesser build --json\\`).\\n- Deploy from git. Commit generated Tesser docs under \\`.tesser/docs/\\`; local runtime state in other \\`.tesser/*\\` paths stays ignored.\\n\\n## Upgrade rule\\nTo update this Project's pinned Tesser packages and generated references, run the target CLI version explicitly:\\n\\n\\`\\`\\`bash\\nnpx @devosurf/tesser@<version> upgrade\\npnpm install\\ntesser test --json\\n\\`\\`\\`\\n\\nProject name: \\`${projectName}\\`.\\n`;\n}\n\nfunction docsReadmeMd(projectName: string, version: string): string {\n return `# Tesser agent reference\\n\\nGenerated for Project \\`${projectName}\\` by \\`@devosurf/tesser@${version}\\`. Treat this directory as generated/vendor reference: do not hand-edit files under \\`.tesser/docs/\\`; customize local policy in \\`AGENTS.md\\`.\\n\\n## Start here\\n1. Read \\`AGENTS.md\\` for project-specific policy.\\n2. Use [cli.md](./cli.md) for command sequences and safe secret handling.\\n3. Use [sdk.md](./sdk.md) before editing an Automation.\\n4. Use [connectors.md](./connectors.md) before adding a Connection or Secret.\\n\\n## Version contract\\nTesser packages in \\`package.json\\` should be pinned exactly to \\`${version}\\`:\\n\\n- \\`@devosurf/tesser\\`\\n- \\`@devosurf/tesser-sdk\\`\\n- \\`@devosurf/tesser-connectors\\`\\n- \\`@devosurf/tesser-testing\\`\\n- \\`@devosurf/tesser-server\\`\\n\\nTo upgrade, run the target CLI version so docs and packages move together:\\n\\n\\`\\`\\`bash\\nnpx @devosurf/tesser@<version> upgrade\\npnpm install\\ntesser test --json\\n\\`\\`\\`\\n\\nCommit \\`package.json\\`, \\`pnpm-lock.yaml\\`, \\`.tesser/docs/\\`, and any Automation/test changes together. Do not commit \\`node_modules/\\` or local runtime files such as \\`.tesser/master.key\\`.\\n`;\n}\n\nfunction cliReferenceMd(version: string): string {\n return `# Tesser CLI reference\\n\\nGenerated for \\`@devosurf/tesser@${version}\\`. The CLI is the agent interface: prefer \\`--json\\` when output will drive follow-up actions. stdout is data; stderr is logs/progress.\\n\\n## Install and invoke\\n\\n\\`\\`\\`bash\\nnpm install -g @devosurf/tesser@${version}\\ntesser --version\\n\\n# Or run an exact version without global install:\\nnpx @devosurf/tesser@${version} --version\\n\\`\\`\\`\\n\\n## Common flow\\n\\n\\`\\`\\`bash\\ntesser init my-project --instance https://tesser.example.com\\ncd my-project\\npnpm install # creates pnpm-lock.yaml; commit it\\ngit init && git add -A && git commit -m init\\ntesser login --instance https://tesser.example.com --token \"$TESSER_TOKEN\"\\ntesser link --json # registers this Project on the Instance\\ntesser test --json\\ntesser build --json\\ntesser deploy --json\\n\\`\\`\\`\\n\\n## Commands agents commonly use\\n\\n- \\`tesser init <name> [--dir DIR] [--instance URL]\\` \u2014 scaffold a Project.\\n- \\`tesser upgrade\\` \u2014 pin Tesser packages to this CLI version and refresh \\`.tesser/docs/\\`. To target a version: \\`npx @devosurf/tesser@<version> upgrade\\`.\\n- \\`tesser login --instance URL --token TOKEN\\` \u2014 verify and store a profile. Prefer \\`TESSER_TOKEN\\` over pasting tokens into chat.\\n- \\`tesser link [--repo URL] --json\\` \u2014 register the Project and print deploy-key/webhook setup data. CLI output must not include private keys or webhook secrets.\\n- \\`tesser status --json\\` \u2014 instance health and deploy state.\\n- \\`tesser test [--smoke-only] [--automation ID] --json\\` \u2014 fast local tests plus generated smoke tests.\\n- \\`tesser build --json\\` \u2014 bundle and statically extract manifests. Use before deploy when changing requirements.\\n- \\`tesser dev [--port N] [--no-watch]\\` \u2014 local Instance with embedded Postgres under ignored \\`.tesser/*\\` state.\\n- \\`tesser deploy [--ref REF] [--local] [--no-wait] --json\\` \u2014 server-side build/test/promotion. Exit code 4 means halted on missing credentials; run \\`tesser connect\\`.\\n- \\`tesser connect [--wait] [--status TOKEN] --json\\` \u2014 mint or poll the human connect link. The human supplies credentials in the browser; the agent only sees readiness.\\n- \\`tesser secrets list --json\\`, \\`tesser secrets rm <name> --json\\`, \\`printenv MY_SECRET | tesser secrets set <name> --value-stdin --json\\`. Never put secret values in argv.\\n- \\`tesser runs list|show|trigger|signal|cancel --json\\`; \\`tesser logs <runId> [--follow]\\`; \\`tesser replay <runId>\\`.\\n- \\`tesser rollback <automation> --to <version> --json\\` \u2014 alias re-point; no rebuild.\\n\\n## Credential safety\\n\\n- Do not ask the user to paste secrets into chat. Use masked secret prompts where your harness supports them, or ask the human to run a command locally.\\n- Never pass raw secret values as CLI arguments. Use environment variables, profiles, connect links, OAuth, or \\`--value-stdin\\`.\\n- Treat connect links and status tokens as sensitive operational material.\\n\\n## Deploy hygiene\\n\\n- Run \\`pnpm install\\` after init/upgrade and commit \\`pnpm-lock.yaml\\`; the Instance installs from lockfiles for reproducible builds.\\n- Do not commit \\`node_modules/\\`, \\`.env\\`, or local runtime state in \\`.tesser/*\\` outside \\`.tesser/docs/\\`.\\n- Git is the source of truth. Commit and push before expecting a normal Instance deploy to see changes.\\n`;\n}\n\nfunction sdkReferenceMd(version: string): string {\n return `# Tesser SDK reference\\n\\nGenerated for \\`@devosurf/tesser-sdk@${version}\\`. Author ordinary async TypeScript; Tesser durability comes only from Steps.\\n\\n## Minimal Automation\\n\\n\\`\\`\\`ts\\nimport { defineAutomation, onWebhook } from \"@devosurf/tesser-sdk\";\\nimport { z } from \"zod\";\\n\\nexport default defineAutomation({\\n id: \"hello\",\\n trigger: onWebhook({ input: z.object({ name: z.string().default(\"world\") }) }),\\n output: z.object({ greeting: z.string() }),\\n\\n run: async (input, ctx) => {\\n const greeting = await ctx.step(\"compose\", async () => \\`hello, \\${input.name}!\\`);\\n return { greeting };\\n },\\n});\\n\\`\\`\\`\\n\\n## Non-negotiable rules\\n\\n- Use **Step**, not node/task/action, for durable checkpoints.\\n- Every side effect, external I/O call, Connector Action, bespoke HTTP request, file/network operation, or secret-dependent operation must happen inside \\`ctx.step(name, fn)\\`.\\n- Step names are stable API for the journal. Use short, descriptive names such as \\`fetch-customer\\`, \\`post-to-slack\\`, \\`charge-card\\`.\\n- Step outputs are journaled and must be serializable. Return plain data, not functions, class instances, streams, sockets, or live handles.\\n- An Automation declares credentials statically at the top level. Do not hide requirements inside \\`run\\`.\\n- Do not access provider tokens directly. Runtime-injected \\`ctx.connections.*\\` and \\`ctx.secrets.*\\` are the only runtime credential surfaces.\\n\\n## Triggers\\n\\n\\`\\`\\`ts\\nimport { onWebhook, onSchedule, onEvent } from \"@devosurf/tesser-sdk\";\\n\\nconst webhook = onWebhook({ input: schema, respond: \"sync\" });\\nconst schedule = onSchedule({ cron: \"0 9 * * *\", tz: \"UTC\" });\\nconst event = onEvent(myEvent);\\n\\`\\`\\`\\n\\nConnector triggers are reached from the Connector import, for example \\`github.triggers.issueOpened({ repo: \"owner/repo\" })\\` when supported.\\n\\n## Connections and Secrets\\n\\n\\`\\`\\`ts\\nimport { defineAutomation, onWebhook, secret } from \"@devosurf/tesser-sdk\";\\nimport { slack } from \"@devosurf/tesser-connectors\";\\nimport { z } from \"zod\";\\n\\nexport default defineAutomation({\\n id: \"notify\",\\n trigger: onWebhook({ input: z.object({ text: z.string() }) }),\\n connections: { slack },\\n secrets: { signingKey: secret({ describe: \"Shared HMAC signing key\" }) },\\n output: z.object({ ok: z.boolean() }),\\n\\n run: async (input, ctx) => {\\n await ctx.step(\"post-message\", () =>\\n ctx.connections.slack.chat.postMessage({ channel: \"#ops\", text: input.text }),\\n );\\n return { ok: true };\\n },\\n});\\n\\`\\`\\`\\n\\nDeploy halts if required Connections or Secrets are missing. The agent should surface the connect link to a human and poll status; it must not collect the secret value itself.\\n\\n## Tests\\n\\nColocate tests beside each Automation.\\n\\n\\`\\`\\`ts\\nimport { createTest } from \"@devosurf/tesser-testing\";\\nimport automation from \"./index\";\\n\\ntest(\"greets by name\", async () => {\\n const t = createTest({ automation });\\n const { result } = await t.run({ input: { name: \"tesser\" } });\\n expect(result).toEqual({ greeting: \"hello, tesser!\" });\\n});\\n\\`\\`\\`\\n\\nFor Connector calls, mock the Step result by Step name. Replay fixtures produced by \\`tesser replay <runId>\\` should become permanent regression tests.\\n`;\n}\n\nfunction connectorsReferenceMd(version: string): string {\n return `# Tesser Connector reference\\n\\nGenerated for \\`@devosurf/tesser-connectors@${version}\\`. A Connector is a typed integration; a Connection is an authed runtime instance injected by the Credential broker.\\n\\n## Available connector imports\\n\\n\\`\\`\\`ts\\nimport {\\n anthropic,\\n claudeCode,\\n github,\\n gmail,\\n googleCalendar,\\n googleDocs,\\n googleDrive,\\n googleSheets,\\n http,\\n pi,\\n resend,\\n slack,\\n} from \"@devosurf/tesser-connectors\";\\n\\`\\`\\`\\n\\nOnly import Connectors that the Automation declares in \\`connections: { ... }\\`.\\n\\n## Pattern\\n\\n\\`\\`\\`ts\\nimport { defineAutomation, onSchedule } from \"@devosurf/tesser-sdk\";\\nimport { github, slack } from \"@devosurf/tesser-connectors\";\\nimport { z } from \"zod\";\\n\\nexport default defineAutomation({\\n id: \"digest\",\\n trigger: onSchedule({ cron: \"0 9 * * *\", tz: \"UTC\" }),\\n connections: { github, slack },\\n output: z.object({ posted: z.boolean(), count: z.number() }),\\n\\n run: async (_input, ctx) => {\\n const issues = await ctx.step(\"fetch-open-issues\", () =>\\n ctx.connections.github.issues.list({ state: \"open\", labels: [\"bug\"] }),\\n );\\n\\n if (issues.length === 0) return { posted: false, count: 0 };\\n\\n await ctx.step(\"post-to-slack\", () =>\\n ctx.connections.slack.chat.postMessage({ channel: \"#ops\", text: \\`\\${issues.length} bugs\\` }),\\n );\\n\\n return { posted: true, count: issues.length };\\n },\\n});\\n\\`\\`\\`\\n\\n## Common Actions\\n\\n- \\`ctx.connections.http.get({ url, headers?, query? })\\` and \\`ctx.connections.http.request({ method, url, headers?, query?, body?, bodyText? })\\`. Generic writes are not retry-safe; still wrap them in a Step.\\n- \\`ctx.connections.github.issues.list({ repo?, state?, labels?, limit? })\\`, \\`issues.create({ repo, title, body?, labels? })\\`, \\`issues.comment({ repo, number, body })\\`, \\`repos.get({ repo })\\`.\\n- \\`ctx.connections.slack.chat.postMessage({ channel, text, threadTs? })\\` and related Slack chat/conversation/user Actions.\\n- \\`ctx.connections.resend.emails.send(...)\\`, Gmail/Google Calendar/Docs/Drive/Sheets Actions, Anthropic model Actions, Claude Code/Pi Harness-related Connectors: inspect package types or examples before using.\\n\\n## Connector triggers\\n\\nSome Connectors expose typed triggers, e.g. GitHub issue triggers and Slack event triggers. Use the Connector's \\`triggers\\` constructors; do not hand-roll webhook delivery unless no Connector exists.\\n\\n\\`\\`\\`ts\\ntrigger: github.triggers.issueOpened({ repo: \"owner/repo\" })\\n\\`\\`\\`\\n\\n## Safety rules\\n\\n- Connector Actions are not automatically durable. The Automation author must wrap every Action call in \\`ctx.step\\`.\\n- The imported Connector is not a token-bearing client. The authed client exists only at \\`ctx.connections.<name>\\` inside \\`run\\`.\\n- For bespoke APIs, combine \\`http\\` with declared \\`secrets: { ... }\\`; do not put API keys in source, tests, logs, CLI args, or committed env files.\\n- If deploy halts on a missing Connection, surface \\`tesser connect\\` output to the human. The agent must not complete OAuth or paste raw secrets itself.\\n`;\n}\n", "// `tesser replay <runId>` (ADR-0008): pull a real run's trigger + journal, freeze it as a\n// committed fixture, and write a regression test that re-feeds the exact input with\n// journal-derived mocks. The suite grows from real edge cases.\n\nimport { mkdirSync, writeFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { ApiClient } from \"../client.js\";\nimport { EXIT } from \"../exit-codes.js\";\nimport { CliError, Output } from \"../output.js\";\n\ninterface ReplayBundle {\n replay: {\n id: string;\n automation_id: string;\n status: string;\n trigger: Record<string, unknown>;\n input: unknown;\n output: unknown;\n error: unknown;\n journal: Array<{ name: string; occurrence: number; status: string; result: unknown; error: unknown }>;\n };\n}\n\nexport async function replay(out: Output, api: ApiClient, projectRoot: string, runId: string): Promise<void> {\n const { replay: run } = await api.get<ReplayBundle>(`/runs/${runId}/replay`);\n const dir = join(projectRoot, \"automations\", run.automation_id);\n if (!existsSync(dir)) {\n throw new CliError(EXIT.NOT_FOUND, `automation directory not found locally: automations/${run.automation_id}`);\n }\n const shortId = run.id.slice(0, 8);\n const fixtureDir = join(dir, \"__replays__\");\n mkdirSync(fixtureDir, { recursive: true });\n const fixturePath = join(fixtureDir, `${shortId}.replay.json`);\n writeFileSync(\n fixturePath,\n JSON.stringify(\n {\n runId: run.id,\n automation: run.automation_id,\n recordedStatus: run.status,\n trigger: run.trigger,\n input: run.input,\n output: run.output,\n error: run.error,\n steps: run.journal.filter((s) => !s.name.startsWith(\"$\")),\n },\n null,\n 2,\n ) + \"\\n\",\n );\n\n const testPath = join(dir, `replay-${shortId}.test.ts`);\n writeFileSync(\n testPath,\n `// Regression frozen from run ${run.id} (recorded status: ${run.status}).\n// Generated by \\`tesser replay\\` \u2014 adjust the final assertion once the bug is fixed.\nimport { createTest } from \"@devosurf/tesser-testing\";\nimport automation from \"./index\";\nimport replay from \"./__replays__/${shortId}.replay.json\";\n\ntest(\"replays run ${shortId} exactly\", async () => {\n const t = createTest({ automation });\n // Recorded step results replay through the journal \u2014 completed steps return their\n // captured values without executing, exactly like durable recovery (ADR-0002).\n const journal = replay.steps\n .filter((s) => s.status === \"completed\")\n .map((s) => ({ name: s.name, occurrence: s.occurrence, result: s.result }));\n const result = await t.run({ input: replay.input ?? undefined, journal });\n\n // Recorded behaviour at capture time \u2014 keep as the regression contract:\n expect(result.status).toBe(${JSON.stringify(run.status === \"completed\" ? \"completed\" : \"failed\")});\n${run.status === \"completed\" ? ` expect(result.result).toEqual(replay.output);` : ` // This run FAILED in production. After fixing, flip the expectation to \"completed\".`}\n});\n`,\n );\n\n out.data(\n { fixture: fixturePath, test: testPath, recordedStatus: run.status },\n () => `frozen run ${shortId} \u2192 ${testPath}\\nfixture: ${fixturePath}\\nrun \\`tesser test\\` to execute it`,\n );\n}\n", "// `tesser test` (ADR-0008): the agent's fast pass/fail loop. Colocated tests run via the\n// project's own vitest (subprocess, JSON reporter \u2014 never named in our surface); every\n// automation WITHOUT a colocated test gets the auto-generated smoke test. Failures are\n// machine-actionable on stdout with --json; exit 3 on red.\n\nimport { execFile } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { smokeTest } from \"@devosurf/tesser-testing\";\nimport { EXIT } from \"../exit-codes.js\";\nimport { CliError, Output } from \"../output.js\";\nimport { discoverLocalAutomations, loadAutomationDef } from \"../project.js\";\n\nconst exec = promisify(execFile);\n\ninterface TestReport {\n passed: boolean;\n colocated: { ran: number; passed: number; failed: number; skippedNoRunner?: boolean };\n smoke: Array<{ automation: string; passed: boolean; reason?: string; failure?: unknown }>;\n failures: Array<{\n kind: \"test\" | \"smoke\";\n automation?: string;\n file?: string;\n name?: string;\n message: string;\n }>;\n}\n\nfunction findVitest(projectRoot: string): string | null {\n let dir = projectRoot;\n for (;;) {\n const bin = join(dir, \"node_modules\", \".bin\", process.platform === \"win32\" ? \"vitest.cmd\" : \"vitest\");\n if (existsSync(bin)) return bin;\n const parent = join(dir, \"..\");\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nexport async function runTests(\n out: Output,\n projectRoot: string,\n opts: { smokeOnly?: boolean; filter?: string | undefined },\n): Promise<never> {\n const automations = discoverLocalAutomations(projectRoot).filter(\n (a) => opts.filter === undefined || a.automationId === opts.filter,\n );\n if (automations.length === 0) {\n throw new CliError(EXIT.USAGE, `no automations found under ${join(projectRoot, \"automations\")}`);\n }\n\n const report: TestReport = {\n passed: true,\n colocated: { ran: 0, passed: 0, failed: 0 },\n smoke: [],\n failures: [],\n };\n\n // ---- colocated tests through the project's test runner ----\n const withTests = automations.filter((a) => a.hasTests);\n if (!opts.smokeOnly && withTests.length > 0) {\n const vitestBin = findVitest(projectRoot);\n if (!vitestBin) {\n report.colocated.skippedNoRunner = true;\n out.log(\"note: no test runner installed in the project \u2014 running smoke tests only\");\n } else {\n const args = [\"run\", \"--reporter=json\", ...withTests.map((a) => a.dir)];\n const res = await exec(vitestBin, args, {\n cwd: projectRoot,\n env: { ...process.env, CI: \"1\" },\n maxBuffer: 64 * 1024 * 1024,\n }).catch((err: { stdout?: string; stderr?: string }) => ({\n stdout: err.stdout ?? \"\",\n stderr: err.stderr ?? \"\",\n }));\n const jsonLine = (res.stdout ?? \"\").split(\"\\n\").find((l) => l.trimStart().startsWith(\"{\"));\n if (!jsonLine) {\n report.passed = false;\n report.failures.push({ kind: \"test\", message: `test runner produced no JSON report: ${(res.stderr ?? \"\").slice(0, 800)}` });\n } else {\n const parsed = JSON.parse(jsonLine) as {\n numTotalTests: number;\n numPassedTests: number;\n numFailedTests: number;\n testResults: Array<{\n name: string;\n assertionResults: Array<{ status: string; fullName: string; failureMessages: string[] }>;\n }>;\n };\n report.colocated.ran = parsed.numTotalTests;\n report.colocated.passed = parsed.numPassedTests;\n report.colocated.failed = parsed.numFailedTests;\n if (parsed.numFailedTests > 0) {\n report.passed = false;\n for (const file of parsed.testResults) {\n for (const t of file.assertionResults) {\n if (t.status === \"failed\") {\n report.failures.push({\n kind: \"test\",\n file: file.name,\n name: t.fullName,\n message: t.failureMessages.join(\"\\n\").slice(0, 2000),\n });\n }\n }\n }\n }\n }\n }\n }\n\n // ---- auto smoke for automations without colocated tests (and all, with --smoke-only) ----\n const smokeTargets = opts.smokeOnly ? automations : automations.filter((a) => !a.hasTests);\n for (const auto of smokeTargets) {\n try {\n const def = await loadAutomationDef(auto.entry);\n const outcome = await smokeTest(def);\n report.smoke.push({\n automation: auto.automationId,\n passed: outcome.passed,\n ...(outcome.reason !== undefined ? { reason: outcome.reason } : {}),\n ...(outcome.passed ? {} : { failure: outcome.result.failure() }),\n });\n if (!outcome.passed) {\n report.passed = false;\n report.failures.push({\n kind: \"smoke\",\n automation: auto.automationId,\n message: outcome.reason ?? \"smoke test failed\",\n });\n }\n } catch (err) {\n report.passed = false;\n report.smoke.push({ automation: auto.automationId, passed: false, reason: String(err) });\n report.failures.push({ kind: \"smoke\", automation: auto.automationId, message: String(err).slice(0, 2000) });\n }\n }\n\n out.data(report, (r: TestReport) => {\n const lines = [\n `colocated: ${r.colocated.passed}/${r.colocated.ran} passed${r.colocated.skippedNoRunner ? \" (runner missing)\" : \"\"}`,\n ...r.smoke.map((s) => `smoke ${s.automation}: ${s.passed ? \"\u2713\" : `\u2717 ${s.reason ?? \"\"}`}`),\n r.passed ? \"PASS\" : `FAIL (${r.failures.length} failure${r.failures.length === 1 ? \"\" : \"s\"})`,\n ];\n return lines.join(\"\\n\");\n });\n process.exit(report.passed ? EXIT.OK : EXIT.TESTS_FAILED);\n}\n", "// The in-process TestEngine (ADR-0008): journal-of-results semantics identical to the\n// durable server engine \u2014 occurrence-disambiguated steps, real retry policies on a\n// time-skipping clock, undo-in-reverse on terminal failure, connector calls captured \u2014\n// with connectors auto-mocked. Milliseconds per run; failures machine-actionable.\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport type {\n AutomationDef,\n Ctx,\n EventDefinition,\n HarnessRunRequest,\n HarnessRunResult,\n Logger,\n NormalizedModelRequest,\n NormalizedModelResponse,\n Schema,\n StepOpts,\n WebhookRequest,\n} from \"@devosurf/tesser-sdk\";\nimport { isRetryableError, isTerminalError } from \"@devosurf/tesser-sdk\";\nimport {\n buildConnectorClient,\n buildHarnesses,\n buildOperators,\n decodeJournal,\n encodeJournal,\n isRetrySafe,\n nextRetryDelayMs,\n parseDuration,\n resolveRetryPolicy,\n validateSchema,\n type JsonValue,\n} from \"@devosurf/tesser-sdk/internal\";\nimport type { AnyAction, ConnectorInstance } from \"@devosurf/tesser-sdk/connector\";\nimport { createSpy, recordCall, type Spy } from \"./spy.js\";\nimport { sampleFromSchema } from \"./sample.js\";\n\nexport class TestConfigError extends Error {\n constructor(\n message: string,\n readonly hint?: string,\n ) {\n super(hint ? `${message}\\n hint: ${hint}` : message);\n this.name = \"TestConfigError\";\n }\n}\n\nexport interface JournalEntry {\n kind: \"step\" | \"signal\" | \"sleep\";\n name: string;\n occurrence: number;\n status: \"completed\" | \"failed\" | \"timed-out\";\n attempts: number;\n result?: unknown;\n error?: SerializedError;\n /** Step names this entry's undo was executed for (undo bookkeeping lives run-level). */\n}\n\nexport interface SerializedError {\n name: string;\n message: string;\n retryable: boolean;\n terminal: boolean;\n}\n\nexport interface MachineFailure {\n automation: string;\n status: \"failed\";\n error: SerializedError;\n failedStep?: { name: string; occurrence: number; attempts: number; error: SerializedError };\n steps: Array<{ name: string; occurrence: number; status: string; attempts: number }>;\n connectorCalls: Array<{ step?: string; action?: string; input: unknown }>;\n suggestion?: string;\n}\n\nexport type StepMock = unknown | ((input: unknown, info: { action: string; connection: string }) => unknown);\nexport type ScriptedModelTurn =\n | NormalizedModelResponse\n | ((request: NormalizedModelRequest, info: { operatorKey: string; modelKey: string; turn: number }) => NormalizedModelResponse | Promise<NormalizedModelResponse>);\nexport type ScriptedHarnessRun =\n | HarnessRunResult<unknown>\n | ((request: HarnessRunRequest<unknown>, info: { harnessKey: string; invocation: number }) => HarnessRunResult<unknown> | Promise<HarnessRunResult<unknown>>);\n\nexport interface RunOptions {\n input?: unknown;\n /** Mock connector-call results by the *step name* they happen inside. The step's own\n * code still runs; only the external call is replaced. */\n mocks?: Record<string, StepMock>;\n /** Replay seeding (ADR-0002 recovery semantics): steps listed here return their\n * recorded results WITHOUT executing \u2014 exactly how the durable engine resumes.\n * Used by `tesser replay` fixtures. */\n journal?: Array<{ name: string; occurrence?: number; result: unknown }>;\n /** Mock whole connections by action path: { slack: { chat: { postMessage: fn } } }. */\n connections?: Record<string, unknown>;\n secrets?: Record<string, string>;\n /** Scripted model responses by Operator key and Model key. Operators never call live models in tests. */\n models?: Record<string, Record<string, ScriptedModelTurn | ScriptedModelTurn[]>>;\n /** Scripted Harness results by Harness key. Harnesses never run live subprocesses in tests. */\n harnesses?: Record<string, ScriptedHarnessRun | ScriptedHarnessRun[]>;\n /** Resolutions for ctx.waitForSignal, by name; value, per-occurrence array, or fn. */\n signals?: Record<string, unknown | unknown[] | ((occurrence: number) => unknown)>;\n request?: WebhookRequest;\n}\n\nexport interface TestRunResult<TOutput = unknown> {\n status: \"completed\" | \"failed\";\n result?: TOutput;\n error?: SerializedError & { step?: string };\n /** Step results by name \u2014 the value for a single occurrence, an array for repeats. */\n steps: Record<string, unknown>;\n journal: JournalEntry[];\n /** Spies by step name AND dotted action path; safe to read for never-called names. */\n calls: Record<string, Spy>;\n emitted: Array<{ event: string; payload: unknown }>;\n slept: string[];\n undone: string[];\n logs: Array<{ level: \"info\" | \"warn\" | \"error\"; msg: string; meta?: Record<string, unknown> }>;\n failure(): MachineFailure | null;\n}\n\nfunction serializeError(err: unknown): SerializedError {\n const e = err instanceof Error ? err : new Error(String(err));\n return {\n name: e.name,\n message: e.message,\n retryable: isRetryableError(err),\n terminal: isTerminalError(err),\n };\n}\n\ninterface ActiveStep {\n name: string;\n sawUnsafeWrite: boolean;\n}\n\nexport async function executeAutomation<TOutput>(\n def: AutomationDef<any, TOutput, any, any, any, any, any>,\n opts: RunOptions = {},\n): Promise<TestRunResult<TOutput>> {\n const journal: JournalEntry[] = [];\n const journalByKey = new Map<string, JournalEntry>();\n for (const seeded of opts.journal ?? []) {\n const occurrence = seeded.occurrence ?? 1;\n const entry: JournalEntry = {\n kind: \"step\",\n name: seeded.name,\n occurrence,\n status: \"completed\",\n attempts: 1,\n result: encodeJournal(seeded.result),\n };\n journalByKey.set(`step:${seeded.name}#${occurrence}`, entry);\n journal.push(entry);\n }\n const emitted: TestRunResult[\"emitted\"] = [];\n const slept: string[] = [];\n const undone: string[] = [];\n const logs: TestRunResult[\"logs\"] = [];\n const connectorCalls: MachineFailure[\"connectorCalls\"] = [];\n const undoStack: Array<{ name: string; undo: () => unknown | Promise<unknown> }> = [];\n\n const spies = new Map<string, Spy>();\n const spyFor = (key: string): Spy => {\n let s = spies.get(key);\n if (!s) {\n s = createSpy(key);\n spies.set(key, s);\n }\n return s;\n };\n for (const key of Object.keys(opts.mocks ?? {})) spyFor(key);\n\n const calls: Record<string, Spy> = new Proxy({} as Record<string, Spy>, {\n get: (_t, prop) => (typeof prop === \"string\" ? spyFor(prop) : undefined),\n has: () => true,\n ownKeys: () => [...spies.keys()],\n getOwnPropertyDescriptor: () => ({ enumerable: true, configurable: true }),\n });\n\n const activeStep = new AsyncLocalStorage<ActiveStep>();\n\n const logger: Logger = {\n info: (msg, meta) => logs.push({ level: \"info\", msg, ...(meta ? { meta } : {}) }),\n warn: (msg, meta) => logs.push({ level: \"warn\", msg, ...(meta ? { meta } : {}) }),\n error: (msg, meta) => logs.push({ level: \"error\", msg, ...(meta ? { meta } : {}) }),\n };\n\n // ---- connections: real connector defs, mocked transport ----\n const connections: Record<string, unknown> = {};\n for (const [connKey, connector] of Object.entries((def.connections ?? {}) as Record<string, ConnectorInstance<any, any>>)) {\n connections[connKey] = buildConnectorClient(connector, async (path, actionDef, rawInput) => {\n const step = activeStep.getStore();\n const actionPath = path.join(\".\");\n const fullPath = `${connKey}.${actionPath}`;\n if (!step) {\n throw new TestConfigError(\n `connector call ${fullPath} happened outside ctx.step()`,\n `side effects must live inside a step (ADR-0002) \u2014 wrap the call: ctx.step(\"name\", () => ctx.connections.${fullPath}(...))`,\n );\n }\n const input = await validateSchema(\n (actionDef as AnyAction).input,\n rawInput ?? {},\n `${fullPath} input`,\n );\n\n if (!isRetrySafe(actionDef as AnyAction, connector.__connector.idempotencyHeader !== undefined)) {\n step.sawUnsafeWrite = true;\n }\n\n const resolve = async (): Promise<{ value: unknown; validate: boolean }> => {\n // 1) whole-connection mock by action path\n const connMockRoot = opts.connections?.[connKey];\n if (connMockRoot !== undefined) {\n let node: unknown = connMockRoot;\n for (const seg of path) node = (node as Record<string, unknown> | undefined)?.[seg];\n if (node !== undefined) {\n return {\n value: typeof node === \"function\" ? await (node as (i: unknown) => unknown)(input) : node,\n validate: false,\n };\n }\n }\n // 2) step-name mock\n const stepMock = opts.mocks?.[step.name];\n if (stepMock !== undefined) {\n return {\n value:\n typeof stepMock === \"function\"\n ? await (stepMock as (i: unknown, info: { action: string; connection: string }) => unknown)(\n input,\n { action: actionPath, connection: connKey },\n )\n : stepMock,\n validate: false,\n };\n }\n // 3) connector-declared sample\n const sample = connector.__connector.samples?.[actionPath];\n if (sample !== undefined) return { value: sample, validate: true };\n // 4) derive from the action's output schema\n const derived = await sampleFromSchema((actionDef as AnyAction).output);\n if (derived !== undefined) return { value: derived, validate: true };\n throw new TestConfigError(\n `no mock for connector call ${fullPath} in step \"${step.name}\"`,\n `provide mocks: { \"${step.name}\": () => <result> } or connections: { ${connKey}: { ${actionPath\n .split(\".\")\n .join(\": { \")}: () => <result> ${\"}\".repeat(actionPath.split(\".\").length)} }`,\n );\n };\n\n try {\n const { value, validate } = await resolve();\n const result = validate\n ? await validateSchema((actionDef as AnyAction).output, value, `${fullPath} sample output`)\n : value;\n const record = { args: [input], step: step.name, action: fullPath, result };\n recordCall(spyFor(step.name), record);\n recordCall(spyFor(fullPath), record);\n connectorCalls.push({ step: step.name, action: fullPath, input });\n return result;\n } catch (err) {\n const record = { args: [input], step: step.name, action: fullPath, error: String(err) };\n recordCall(spyFor(step.name), record);\n recordCall(spyFor(fullPath), record);\n connectorCalls.push({ step: step.name, action: fullPath, input });\n throw err;\n }\n });\n }\n\n // ---- secrets ----\n const secretNames = Object.keys((def.secrets ?? {}) as Record<string, unknown>);\n const secrets: Record<string, string> = {};\n for (const name of secretNames) {\n secrets[name] = opts.secrets?.[name] ?? `test-secret-${name}`;\n }\n\n // ---- occurrence counters (reset per handler invocation; here: single invocation) ----\n const stepOccurrence = new Map<string, number>();\n const signalOccurrence = new Map<string, number>();\n const defaultRetry = resolveRetryPolicy(def.retry);\n\n const modelTurns = new Map<string, number>();\n const harnessInvocations = new Map<string, number>();\n\n const ctx: Ctx<any, any, any, any> = {\n async step<T>(name: string, fn: () => Promise<T> | T, stepOpts?: StepOpts<T>): Promise<T> {\n if (typeof name !== \"string\" || name.length === 0 || typeof fn !== \"function\") {\n throw new TestConfigError(`ctx.step: expected (name, fn) \u2014 got name=${JSON.stringify(name)}`);\n }\n const occ = (stepOccurrence.get(name) ?? 0) + 1;\n stepOccurrence.set(name, occ);\n const key = `step:${name}#${occ}`;\n const cached = journalByKey.get(key);\n if (cached?.status === \"completed\") {\n const value = decodeJournal(cached.result as JsonValue) as T;\n if (stepOpts?.undo) undoStack.push({ name, undo: () => stepOpts.undo!(value) });\n return value;\n }\n\n const policy = resolveRetryPolicy(stepOpts?.retry, defaultRetry);\n const timeoutMs = stepOpts?.timeout !== undefined ? parseDuration(stepOpts.timeout, \"step timeout\") : undefined;\n const entry: JournalEntry = { kind: \"step\", name, occurrence: occ, status: \"failed\", attempts: 0 };\n journal.push(entry);\n journalByKey.set(key, entry);\n\n let lastError: unknown;\n for (let attempt = 1; attempt <= policy.maxAttempts; attempt++) {\n entry.attempts = attempt;\n const state: ActiveStep = { name, sawUnsafeWrite: false };\n try {\n let resultPromise = Promise.resolve(activeStep.run(state, () => fn()));\n if (timeoutMs !== undefined) {\n // Time-skipping: a step that *would* time out only does so if it actually\n // hangs on something unmocked \u2014 we reject after the wall-clock budget.\n resultPromise = Promise.race([\n resultPromise,\n new Promise<never>((_r, reject) =>\n setTimeout(\n () => reject(new TestConfigError(`step \"${name}\" exceeded its ${stepOpts?.timeout} timeout`)),\n Math.min(timeoutMs, 5_000),\n ).unref?.(),\n ),\n ]);\n }\n const result = await resultPromise;\n const encoded = encodeJournal(result); // throws NotSerializableError \u2192 terminal\n entry.status = \"completed\";\n entry.result = encoded;\n if (stepOpts?.undo) undoStack.push({ name, undo: () => stepOpts.undo!(result) });\n return result;\n } catch (err) {\n lastError = err;\n entry.error = serializeError(err);\n if (isTerminalError(err)) break;\n if (state.sawUnsafeWrite && stepOpts?.retry === undefined) {\n // Derived retry-safety (ADR-0012): a non-idempotent write never silently\n // double-fires. Explicit per-step retry opts override.\n logger.warn(\n `step \"${name}\" performed a non-retry-safe write and will not auto-retry \u2014 pass StepOpts.retry to opt in`,\n );\n break;\n }\n const delay = nextRetryDelayMs(policy, attempt, isRetryableError(err) ? err.retryAfterMs : undefined);\n if (delay === null) break;\n slept.push(`retry:${name}#${occ}@${attempt}`);\n // time-skipping clock: no real wait\n }\n }\n entry.status = \"failed\";\n throw lastError;\n },\n\n connections: connections as never,\n secrets: secrets as never,\n operators: {} as never,\n harnesses: {} as never,\n\n async sleep(duration: string): Promise<void> {\n parseDuration(duration, \"ctx.sleep\"); // validate eagerly, real engine persists it\n slept.push(duration);\n },\n\n async waitForSignal<T>(name: string, sOpts: { schema: Schema<T>; timeout?: string }): Promise<T | null> {\n const occ = (signalOccurrence.get(name) ?? 0) + 1;\n signalOccurrence.set(name, occ);\n const provided = opts.signals?.[name];\n let value: unknown;\n if (typeof provided === \"function\") value = (provided as (o: number) => unknown)(occ);\n else if (Array.isArray(provided)) value = provided[occ - 1];\n else value = provided;\n\n const entry: JournalEntry = { kind: \"signal\", name, occurrence: occ, status: \"completed\", attempts: 1 };\n journal.push(entry);\n if (value === undefined) {\n if (sOpts.timeout !== undefined) {\n parseDuration(sOpts.timeout, \"waitForSignal timeout\");\n entry.status = \"timed-out\";\n return null; // clock skips straight to the timeout\n }\n throw new TestConfigError(\n `run is suspended waiting for signal \"${name}\" (occurrence ${occ}) with no timeout`,\n `provide signals: { \"${name}\": <payload> } in t.run(...)`,\n );\n }\n const validated = await validateSchema(sOpts.schema, value, `signal \"${name}\" payload`);\n entry.result = encodeJournal(validated as unknown);\n return validated;\n },\n\n async emit<T>(event: EventDefinition<T>, payload: T): Promise<void> {\n const validated = await validateSchema(event.schema, payload, `event \"${event.name}\" payload`);\n emitted.push({ event: event.name, payload: validated });\n },\n\n ...(opts.request !== undefined || (def.trigger as { kind?: string }).kind === \"webhook\"\n ? {\n request:\n opts.request ??\n ({\n headers: { \"content-type\": \"application/json\" },\n query: {},\n rawBody: new TextEncoder().encode(JSON.stringify(opts.input ?? {})),\n } satisfies WebhookRequest),\n }\n : {}),\n\n logger,\n run: { id: `test_${Math.random().toString(36).slice(2, 10)}`, attempt: 1, automationId: def.id },\n };\n\n (ctx as { operators: unknown }).operators = buildOperators(def, ctx, async ({ operatorKey, modelKey, request }) => {\n const key = `${operatorKey}:${modelKey}`;\n const turn = (modelTurns.get(key) ?? 0) + 1;\n modelTurns.set(key, turn);\n const script = opts.models?.[operatorKey]?.[modelKey];\n if (script === undefined) {\n throw new TestConfigError(\n `unscripted model turn for operator \"${operatorKey}\" model \"${modelKey}\" (turn ${turn})`,\n `provide models: { ${operatorKey}: { ${modelKey}: [{ output: <typed output>, usage: { inputTokens, outputTokens } }] } }`,\n );\n }\n const picked = Array.isArray(script) ? script[turn - 1] : script;\n if (picked === undefined) {\n throw new TestConfigError(`no scripted model response for operator \"${operatorKey}\" model \"${modelKey}\" turn ${turn}`);\n }\n const response = typeof picked === \"function\" ? await picked(request, { operatorKey, modelKey, turn }) : picked;\n recordCall(spyFor(`operator.${operatorKey}.model`), { args: [request], result: response });\n recordCall(spyFor(`operator.${operatorKey}.model.${turn}`), { args: [request], result: response });\n return response;\n });\n\n (ctx as { harnesses: unknown }).harnesses = buildHarnesses(def, ctx, async ({ harnessKey, request }) => {\n const step = activeStep.getStore();\n if (!step) {\n throw new TestConfigError(\n `harness \"${harnessKey}\" ran outside ctx.step()`,\n `Harnesses are durable Step runners \u2014 wrap the call: ctx.step(\"name\", () => ctx.harnesses.${harnessKey}.run(...))`,\n );\n }\n const invocation = (harnessInvocations.get(harnessKey) ?? 0) + 1;\n harnessInvocations.set(harnessKey, invocation);\n const script = opts.harnesses?.[harnessKey];\n if (script === undefined) {\n throw new TestConfigError(\n `unscripted Harness run for \"${harnessKey}\"`,\n `provide harnesses: { ${harnessKey}: { output: <typed output>, status: \"completed\", artifacts: [], adapter: \"test\" } }`,\n );\n }\n const picked = Array.isArray(script) ? script[invocation - 1] : script;\n if (picked === undefined) throw new TestConfigError(`no scripted Harness result for \"${harnessKey}\" invocation ${invocation}`);\n const result = typeof picked === \"function\" ? await picked(request, { harnessKey, invocation }) : picked;\n recordCall(spyFor(`harness.${harnessKey}`), { args: [request], step: step.name, result });\n return result;\n });\n\n // ---- resolve + validate input ----\n let input = opts.input;\n const trigger = def.trigger as {\n kind: string;\n input?: Schema<unknown>;\n event?: EventDefinition<unknown>;\n connectorId?: string;\n triggerId?: string;\n };\n let inputSchema: Schema<unknown> | undefined =\n def.input ?? (trigger.kind === \"webhook\" ? trigger.input : trigger.kind === \"event\" ? trigger.event?.schema : undefined);\n\n if (trigger.kind === \"connector\" && trigger.connectorId !== undefined) {\n // A connector trigger's payload contract is its declaration's output schema; the\n // connector may also ship an explicit `trigger:<id>` sample.\n const connector = Object.values(\n (def.connections ?? {}) as Record<string, ConnectorInstance<any, any>>,\n ).find((c) => c.id === trigger.connectorId);\n const decl = connector?.__connector.triggers?.[trigger.triggerId ?? \"\"];\n if (decl) {\n inputSchema = def.input ?? (decl.output as Schema<unknown>);\n if (input === undefined) {\n input = connector?.__connector.samples?.[`trigger:${trigger.triggerId}`];\n }\n }\n }\n\n if (input === undefined && inputSchema && trigger.kind !== \"schedule\") {\n input = await sampleFromSchema(inputSchema);\n }\n if (inputSchema && input !== undefined) {\n input = await validateSchema(inputSchema, input, `automation \"${def.id}\" input`);\n }\n\n const finish = (\n status: \"completed\" | \"failed\",\n result?: TOutput,\n error?: TestRunResult[\"error\"],\n ): TestRunResult<TOutput> => {\n const stepsByName: Record<string, unknown[]> = {};\n for (const e of journal) {\n if (e.kind !== \"step\" || e.status !== \"completed\") continue;\n (stepsByName[e.name] ??= []).push(decodeJournal(e.result as JsonValue));\n }\n const steps: Record<string, unknown> = {};\n for (const [name, results] of Object.entries(stepsByName)) {\n steps[name] = results.length === 1 ? results[0] : results;\n }\n const failedEntry = journal.find((e) => e.kind === \"step\" && e.status === \"failed\");\n return {\n status,\n ...(result !== undefined ? { result } : {}),\n ...(error !== undefined ? { error } : {}),\n steps,\n journal,\n calls,\n emitted,\n slept,\n undone,\n logs,\n failure: () =>\n status === \"completed\"\n ? null\n : {\n automation: def.id,\n status: \"failed\",\n error: error as SerializedError,\n ...(failedEntry\n ? {\n failedStep: {\n name: failedEntry.name,\n occurrence: failedEntry.occurrence,\n attempts: failedEntry.attempts,\n error: failedEntry.error as SerializedError,\n },\n }\n : {}),\n steps: journal\n .filter((e) => e.kind === \"step\")\n .map((e) => ({ name: e.name, occurrence: e.occurrence, status: e.status, attempts: e.attempts })),\n connectorCalls,\n ...(failedEntry?.error?.terminal === false\n ? {}\n : failedEntry\n ? { suggestion: `step \"${failedEntry.name}\" failed terminally \u2014 fix the input or mark the error retryable` }\n : {}),\n },\n };\n };\n\n try {\n let output: unknown = await def.run(input as never, ctx as never);\n if (def.output) {\n output = await validateSchema(def.output, output, `automation \"${def.id}\" output`);\n }\n return finish(\"completed\", output as TOutput);\n } catch (err) {\n // Terminal failure \u2192 undo completed steps in reverse (ADR-0002), best-effort.\n for (const item of [...undoStack].reverse()) {\n try {\n await item.undo();\n undone.push(item.name);\n } catch (undoErr) {\n logger.error(`undo for step \"${item.name}\" failed: ${String(undoErr)}`);\n undone.push(`${item.name} (failed)`);\n }\n }\n const failedStep = journal.find((e) => e.kind === \"step\" && e.status === \"failed\");\n return finish(\"failed\", undefined, {\n ...serializeError(err),\n ...(failedStep ? { step: failedStep.name } : {}),\n });\n }\n}\n", "// A minimal mock-function record compatible with vitest/jest `expect(...).toHaveBeenCalled*`\n// matchers (they accept anything exposing _isMockFunction + .mock.calls). Hand-rolled so\n// @devosurf/tesser-testing does not depend on a test runner.\n\nexport interface CapturedCall {\n args: unknown[];\n /** Step that was active when the call happened. */\n step?: string;\n action?: string;\n result?: unknown;\n error?: string;\n}\n\nexport interface Spy {\n (...args: unknown[]): void;\n _isMockFunction: true;\n getMockName(): string;\n mock: {\n calls: unknown[][];\n results: Array<{ type: \"return\" | \"throw\"; value: unknown }>;\n instances: unknown[];\n contexts: unknown[];\n invocationCallOrder: number[];\n lastCall: unknown[] | undefined;\n };\n /** Rich capture (step/action attribution) beyond the matcher contract. */\n captured: CapturedCall[];\n}\n\nlet order = 1;\n\nexport function createSpy(name: string): Spy {\n const mock: Spy[\"mock\"] = {\n calls: [],\n results: [],\n instances: [],\n contexts: [],\n invocationCallOrder: [],\n lastCall: undefined,\n };\n const captured: CapturedCall[] = [];\n const fn = ((...args: unknown[]) => {\n mock.calls.push(args);\n mock.invocationCallOrder.push(order++);\n mock.lastCall = args;\n }) as Spy;\n fn._isMockFunction = true;\n fn.getMockName = () => name;\n fn.mock = mock;\n fn.captured = captured;\n return fn;\n}\n\nexport function recordCall(spy: Spy, call: CapturedCall): void {\n spy(...call.args);\n spy.mock.results.push(\n call.error !== undefined\n ? { type: \"throw\", value: call.error }\n : { type: \"return\", value: call.result },\n );\n spy.captured.push(call);\n}\n", "// Schema-driven sample + edge-case generation (ADR-0008). Works through JSON Schema:\n// any validator that can describe itself as JSON Schema participates; with zod we use\n// its built-in conversion. Everything degrades gracefully to \"ask for an explicit mock\".\n\nimport type { Schema } from \"@devosurf/tesser-sdk\";\n\ntype JsonSchema = {\n type?: string | string[];\n properties?: Record<string, JsonSchema>;\n required?: string[];\n items?: JsonSchema | JsonSchema[];\n prefixItems?: JsonSchema[];\n enum?: unknown[];\n const?: unknown;\n anyOf?: JsonSchema[];\n oneOf?: JsonSchema[];\n allOf?: JsonSchema[];\n nullable?: boolean;\n default?: unknown;\n minimum?: number;\n maximum?: number;\n exclusiveMinimum?: number;\n exclusiveMaximum?: number;\n minLength?: number;\n maxLength?: number;\n minItems?: number;\n format?: string;\n pattern?: string;\n additionalProperties?: JsonSchema | boolean;\n [k: string]: unknown;\n};\n\n/** Best-effort JSON Schema for a Standard Schema. Currently: zod (vendor \"zod\") via its\n * own toJSONSchema; otherwise undefined. */\nexport function toJsonSchema(schema: Schema<unknown>): JsonSchema | undefined {\n const std = (schema as { \"~standard\"?: { vendor?: string } })[\"~standard\"];\n if (!std) return undefined;\n try {\n if (std.vendor === \"zod\") {\n const z = schema as unknown as {\n constructor?: unknown;\n };\n // zod v4 exposes conversion as a static on the module; reach it through the\n // schema's own registry-free helper if present.\n const anySchema = z as { toJSONSchema?: () => unknown };\n if (typeof anySchema.toJSONSchema === \"function\") {\n return anySchema.toJSONSchema() as JsonSchema;\n }\n // Fall back to importing zod lazily \u2014 present whenever a zod schema is in play.\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n return undefined;\n }\n } catch {\n return undefined;\n }\n return undefined;\n}\n\n/** Async variant that can lazily import zod for conversion. */\nexport async function toJsonSchemaAsync(schema: Schema<unknown>): Promise<JsonSchema | undefined> {\n const direct = toJsonSchema(schema);\n if (direct) return direct;\n const std = (schema as { \"~standard\"?: { vendor?: string } })[\"~standard\"];\n if (std?.vendor === \"zod\") {\n try {\n const zod = (await import(\"zod\")) as unknown as {\n toJSONSchema?: (s: unknown, opts?: unknown) => unknown;\n z?: { toJSONSchema?: (s: unknown, opts?: unknown) => unknown };\n };\n const convert = zod.toJSONSchema ?? zod.z?.toJSONSchema;\n if (convert) return convert(schema, { unrepresentable: \"any\" }) as JsonSchema;\n } catch {\n return undefined;\n }\n }\n return undefined;\n}\n\nconst SAMPLE_STRINGS: Record<string, string> = {\n email: \"sample@example.com\",\n uri: \"https://example.com/sample\",\n url: \"https://example.com/sample\",\n uuid: \"00000000-0000-4000-8000-000000000000\",\n \"date-time\": \"2026-01-01T00:00:00.000Z\",\n date: \"2026-01-01\",\n time: \"00:00:00\",\n};\n\nexport function sampleFromJsonSchema(js: JsonSchema, depth = 0): unknown {\n if (depth > 8) return null;\n if (js.default !== undefined) return js.default;\n if (js.const !== undefined) return js.const;\n if (js.enum && js.enum.length > 0) return js.enum[0];\n const variants = js.anyOf ?? js.oneOf;\n if (variants && variants.length > 0) {\n // Prefer a non-null variant for a useful sample.\n const pick = variants.find((v) => v.type !== \"null\") ?? variants[0];\n return sampleFromJsonSchema(pick as JsonSchema, depth + 1);\n }\n if (js.allOf && js.allOf.length > 0) {\n return js.allOf.reduce<Record<string, unknown>>((acc, part) => {\n const piece = sampleFromJsonSchema(part, depth + 1);\n return typeof piece === \"object\" && piece !== null\n ? { ...acc, ...(piece as Record<string, unknown>) }\n : acc;\n }, {});\n }\n const type = Array.isArray(js.type) ? js.type[0] : js.type;\n switch (type) {\n case \"string\": {\n if (js.format && SAMPLE_STRINGS[js.format]) return SAMPLE_STRINGS[js.format];\n const min = js.minLength ?? 0;\n const base = \"sample\";\n return base.length >= min ? base : base + \"x\".repeat(min - base.length);\n }\n case \"number\":\n case \"integer\": {\n let n = 1;\n if (js.minimum !== undefined) n = js.minimum;\n if (js.exclusiveMinimum !== undefined) n = js.exclusiveMinimum + 1;\n if (js.maximum !== undefined && n > js.maximum) n = js.maximum;\n return type === \"integer\" ? Math.round(n) : n;\n }\n case \"boolean\":\n return true;\n case \"null\":\n return null;\n case \"array\": {\n const itemSchema = Array.isArray(js.items) ? js.items[0] : js.items;\n const count = Math.max(js.minItems ?? 1, 1);\n if (!itemSchema) return [];\n return Array.from({ length: count }, () => sampleFromJsonSchema(itemSchema, depth + 1));\n }\n case \"object\":\n default: {\n if (js.properties) {\n const out: Record<string, unknown> = {};\n const required = new Set(js.required ?? Object.keys(js.properties));\n for (const [key, prop] of Object.entries(js.properties)) {\n if (required.has(key) || prop.default !== undefined) {\n out[key] = sampleFromJsonSchema(prop, depth + 1);\n }\n }\n return out;\n }\n if (type === \"object\" || type === undefined) return {};\n return null;\n }\n }\n}\n\n/** A sample value satisfying the schema, or undefined when it cannot be derived. */\nexport async function sampleFromSchema(schema: Schema<unknown>): Promise<unknown | undefined> {\n const js = await toJsonSchemaAsync(schema);\n if (!js) return undefined;\n return sampleFromJsonSchema(js);\n}\n\nexport interface EdgeCase {\n name: string;\n value: unknown;\n /** Whether the schema should accept it \u2014 invalid cases assert the unhappy path. */\n expectValid: boolean;\n}\n\n/** Boundary / malformed inputs from a typed contract (ADR-0008, built incrementally). */\nexport async function edgeCasesFromSchema(schema: Schema<unknown>): Promise<EdgeCase[]> {\n const js = await toJsonSchemaAsync(schema);\n if (!js) return [];\n const valid = sampleFromJsonSchema(js);\n const cases: EdgeCase[] = [{ name: \"minimal valid sample\", value: valid, expectValid: true }];\n cases.push({ name: \"null payload\", value: null, expectValid: (js.type ?? \"object\") === \"null\" });\n cases.push({\n name: \"wrong primitive (number)\",\n value: 42,\n expectValid: js.type === \"number\" || js.type === \"integer\",\n });\n\n if (js.type === \"object\" && js.properties && typeof valid === \"object\" && valid !== null) {\n for (const key of js.required ?? []) {\n const clone = { ...(valid as Record<string, unknown>) };\n delete clone[key];\n cases.push({ name: `missing required \"${key}\"`, value: clone, expectValid: false });\n }\n for (const [key, prop] of Object.entries(js.properties)) {\n const t = Array.isArray(prop.type) ? prop.type[0] : prop.type;\n if (t === \"string\" && (js.required ?? []).includes(key)) {\n const minOk = (prop.minLength ?? 0) === 0;\n cases.push({\n name: `empty string \"${key}\"`,\n value: { ...(valid as Record<string, unknown>), [key]: \"\" },\n expectValid: minOk && prop.format === undefined && prop.pattern === undefined,\n });\n }\n if ((t === \"number\" || t === \"integer\") && prop.minimum !== undefined) {\n cases.push({\n name: `below minimum \"${key}\"`,\n value: { ...(valid as Record<string, unknown>), [key]: prop.minimum - 1 },\n expectValid: false,\n });\n }\n }\n }\n return cases;\n}\n", "// The auto-generated default smoke test (ADR-0008): fire the trigger with a sample\n// payload, auto-mock connectors, assert completion + output schema. Zero-config green/red\n// the moment an automation is written \u2014 `tesser test` synthesizes one per automation\n// that lacks a colocated test.\n\nimport type { AutomationDef, OperatorDef } from \"@devosurf/tesser-sdk\";\nimport { executeAutomation, type RunOptions, type TestRunResult } from \"./engine.js\";\nimport { sampleFromSchema } from \"./sample.js\";\n\nexport interface SmokeOutcome {\n automation: string;\n passed: boolean;\n result: TestRunResult;\n /** Machine-actionable reason when red (ADR-0008). */\n reason?: string;\n}\n\nexport async function smokeTest(def: AutomationDef<any, any, any, any, any, any, any>): Promise<SmokeOutcome> {\n try {\n const models = await smokeModelScripts(def);\n const result = await executeAutomation(def, Object.keys(models).length > 0 ? { models } : {});\n if (result.status === \"completed\") {\n return { automation: def.id, passed: true, result };\n }\n return {\n automation: def.id,\n passed: false,\n result,\n reason:\n result.error?.step !== undefined\n ? `step \"${result.error.step}\" failed: ${result.error.message}`\n : (result.error?.message ?? \"run failed\"),\n };\n } catch (err) {\n // TestConfigError (e.g. an un-derivable sample, a signal wait with no timeout) is a\n // legitimate smoke failure: the agent gets told exactly what to provide.\n return {\n automation: def.id,\n passed: false,\n result: {\n status: \"failed\",\n steps: {},\n journal: [],\n calls: {},\n emitted: [],\n slept: [],\n undone: [],\n logs: [],\n error: { name: (err as Error).name, message: (err as Error).message, retryable: false, terminal: true },\n failure: () => ({\n automation: def.id,\n status: \"failed\",\n error: { name: (err as Error).name, message: (err as Error).message, retryable: false, terminal: true },\n steps: [],\n connectorCalls: [],\n }),\n },\n reason: (err as Error).message,\n };\n }\n}\n\nasync function smokeModelScripts(\n def: AutomationDef<any, any, any, any, any, any, any>,\n): Promise<NonNullable<RunOptions[\"models\"]>> {\n const models: NonNullable<RunOptions[\"models\"]> = {};\n const operators = (def.operators ?? {}) as Record<string, OperatorDef>;\n for (const [operatorKey, op] of Object.entries(operators)) {\n const sample = await sampleFromSchema(op.output).catch(() => undefined);\n (models[operatorKey] ??= {})[op.model] = {\n ...(sample !== undefined ? { output: sample as never } : { content: \"{}\" }),\n usage: { inputTokens: 1, outputTokens: 1 },\n provider: \"tesser-smoke\",\n model: op.model,\n };\n }\n return models;\n}\n", "// Record/replay connector cassettes (ADR-0008): integration runs capture real provider\n// traffic keyed by action + input hash; replays are deterministic and offline. Cassette\n// files may contain real API responses \u2192 they are gitignored by default; replay FIXTURES\n// (sanitized trigger + journal) are a different, committed artifact.\n\nimport { mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { encodeJournal, stableStringify, type JsonValue } from \"@devosurf/tesser-sdk/internal\";\n\nexport interface CassetteEntry {\n action: string;\n inputHash: string;\n input: JsonValue;\n status: \"ok\" | \"error\";\n output?: JsonValue;\n error?: { name: string; message: string };\n recordedAt: string;\n}\n\nexport function hashInput(input: unknown): string {\n return createHash(\"sha256\").update(stableStringify(encodeJournal(input))).digest(\"hex\").slice(0, 16);\n}\n\nexport class Cassette {\n private entries: CassetteEntry[] = [];\n private used = new Set<number>();\n dirty = false;\n\n static load(path: string): Cassette {\n const c = new Cassette();\n try {\n const raw = JSON.parse(readFileSync(path, \"utf8\")) as { entries?: CassetteEntry[] };\n c.entries = raw.entries ?? [];\n } catch {\n // missing/corrupt \u2192 start empty (record mode will fill it)\n }\n return c;\n }\n\n match(action: string, input: unknown): CassetteEntry | undefined {\n const h = hashInput(input);\n const idx = this.entries.findIndex(\n (e, i) => !this.used.has(i) && e.action === action && e.inputHash === h,\n );\n if (idx === -1) {\n // fall back to a reusable match (idempotent reads recorded once, called repeatedly)\n const reusable = this.entries.find((e) => e.action === action && e.inputHash === h);\n return reusable;\n }\n this.used.add(idx);\n return this.entries[idx];\n }\n\n record(action: string, input: unknown, result: { output?: unknown; error?: { name: string; message: string } }): void {\n this.entries.push({\n action,\n inputHash: hashInput(input),\n input: encodeJournal(input),\n status: result.error ? \"error\" : \"ok\",\n ...(result.error ? { error: result.error } : { output: encodeJournal(result.output) }),\n recordedAt: new Date().toISOString(),\n });\n this.dirty = true;\n }\n\n /** Replace credential material in recorded bodies before save. */\n redact(values: string[]): void {\n if (values.length === 0) return;\n let json = JSON.stringify(this.entries);\n for (const v of values) {\n if (v.length >= 8) json = json.split(v).join(\"[REDACTED]\");\n }\n this.entries = JSON.parse(json) as CassetteEntry[];\n }\n\n save(path: string): void {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, JSON.stringify({ version: 1, entries: this.entries }, null, 2));\n this.dirty = false;\n }\n\n get size(): number {\n return this.entries.length;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["// tesser \u2014 the machine-first CLI (ADR-0007). Every command: --json (stdout = one JSON\n// document, stderr = logs), deterministic exit codes (src/exit-codes.ts), thin shell\n// over the control-plane API.\n\nimport { execFile } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport { promisify } from \"node:util\";\nimport { Command } from \"commander\";\nimport { extractAutomationManifest } from \"@devosurf/tesser-sdk/internal\";\nimport { ApiClient } from \"./client.js\";\nimport { readConfig, readLinkManifest, resolveTarget, writeConfig } from \"./config.js\";\nimport { EXIT } from \"./exit-codes.js\";\nimport { CliError, Output, toExit } from \"./output.js\";\nimport { discoverLocalAutomations, loadAutomationDef } from \"./project.js\";\nimport { authClaudeCode, authPi } from \"./commands/auth.js\";\nimport { deploy } from \"./commands/deploy.js\";\nimport { dev } from \"./commands/dev.js\";\nimport { init } from \"./commands/init.js\";\nimport { upgradeProject } from \"./commands/project-docs.js\";\nimport { replay } from \"./commands/replay.js\";\nimport { runTests } from \"./commands/test.js\";\n\nconst exec = promisify(execFile);\nconst program = new Command();\nconst VERSION = JSON.parse(readFileSync(new URL(\"../package.json\", import.meta.url), \"utf8\")).version as string;\n\ninterface GlobalOpts {\n json?: boolean;\n url?: string;\n token?: string;\n profile?: string;\n}\n\nfunction setup(): { out: Output; opts: GlobalOpts } {\n const opts = program.opts<GlobalOpts>();\n return { out: new Output(opts.json ?? false), opts };\n}\n\nfunction target(opts: GlobalOpts): ReturnType<typeof resolveTarget> {\n return resolveTarget({\n ...(opts.url !== undefined ? { url: opts.url } : {}),\n ...(opts.token !== undefined ? { token: opts.token } : {}),\n ...(opts.profile !== undefined ? { profile: opts.profile } : {}),\n });\n}\n\nfunction api(opts: GlobalOpts): ApiClient {\n const t = target(opts);\n return new ApiClient(t.url, t.token);\n}\n\nfunction requireProject(opts: GlobalOpts): { name: string; root: string } {\n const t = target(opts);\n if (!t.projectRoot || !t.project) {\n throw new CliError(EXIT.USAGE, \"not inside a Tesser project (no tesser.json) \u2014 run `tesser init <name>` or `tesser link`\");\n }\n return { name: t.project, root: t.projectRoot };\n}\n\nprogram\n .name(\"tesser\")\n .version(VERSION)\n .description(\"Code-first, agent-native automation. stdout = data, stderr = logs; --json everywhere.\")\n .option(\"--json\", \"machine output: one JSON document on stdout\")\n .option(\"--url <url>\", \"instance URL (overrides tesser.json / profile)\")\n .option(\"--token <token>\", \"API token (overrides TESSER_TOKEN / profile)\")\n .option(\"--profile <name>\", \"config profile\");\n\nprogram\n .command(\"init\")\n .argument(\"<name>\", \"project name (kebab-case)\")\n .option(\"--dir <dir>\", \"parent directory\")\n .option(\"--instance <url>\", \"instance URL to write into tesser.json\")\n .description(\"scaffold a new Project (one repo of automations)\")\n .action((name: string, cmdOpts: { dir?: string; instance?: string }) => {\n const { out } = setup();\n try {\n init(out, name, cmdOpts, VERSION);\n } catch (err) {\n toExit(err, out);\n }\n });\n\nprogram\n .command(\"upgrade\")\n .description(\"pin Tesser packages to this CLI version and refresh generated Project docs\")\n .action(() => {\n const { out, opts } = setup();\n try {\n upgradeProject(out, requireProject(opts), VERSION);\n } catch (err) {\n toExit(err, out);\n }\n });\n\nprogram\n .command(\"login\")\n .option(\"--token <token>\", \"API token from the instance (printed at first boot)\")\n .option(\"--instance <url>\", \"instance URL\", \"http://localhost:8377\")\n .option(\"--save-profile <name>\", \"profile name\", \"default\")\n .description(\"store instance credentials in ~/.config/tesser (or use env TESSER_TOKEN)\")\n .action(async (cmdOpts: { token?: string; instance: string; saveProfile: string }) => {\n const { out, opts } = setup();\n try {\n const token = cmdOpts.token ?? opts.token;\n if (!token) throw new CliError(EXIT.USAGE, \"missing required option '--token <token>'\");\n const client = new ApiClient(cmdOpts.instance, token);\n await client.get(\"/health\"); // verify before storing\n const config = readConfig();\n config.profiles = { ...config.profiles, [cmdOpts.saveProfile]: { url: cmdOpts.instance, token } };\n config.current = cmdOpts.saveProfile;\n writeConfig(config);\n out.data({ profile: cmdOpts.saveProfile, url: cmdOpts.instance }, () => `logged in to ${cmdOpts.instance} (profile \"${cmdOpts.saveProfile}\")`);\n } catch (err) {\n toExit(err, out);\n }\n });\n\nprogram\n .command(\"link\")\n .option(\"--repo <url>\", \"git remote the instance should pull (defaults to origin)\")\n .description(\"register this Project on the instance and wire git-sync\")\n .action(async (cmdOpts: { repo?: string }) => {\n const { out, opts } = setup();\n try {\n const { name } = requireProject(opts);\n let repoUrl = cmdOpts.repo;\n if (repoUrl === undefined) {\n repoUrl = await exec(\"git\", [\"remote\", \"get-url\", \"origin\"]).then(\n (r) => r.stdout.trim(),\n () => undefined,\n );\n }\n const result = await api(opts).post<{\n id: string;\n name: string;\n deployKeyPublic: string;\n webhookSetupUrl: string;\n }>(\"/projects\", {\n name,\n ...(repoUrl !== undefined ? { repoUrl } : {}),\n });\n out.data(\n { ...result, repoUrl: repoUrl ?? null },\n () =>\n `linked project \"${name}\"${repoUrl ? ` \u2190 ${repoUrl}` : \" (no git remote yet \u2014 deploy with --local or set --repo)\"}\\n` +\n `deploy key: ${result.deployKeyPublic}\\n` +\n `webhook setup: ${result.webhookSetupUrl}`,\n );\n } catch (err) {\n toExit(err, out);\n }\n });\n\nprogram\n .command(\"test\")\n .option(\"--smoke-only\", \"run only the auto-generated smoke tests\")\n .option(\"--automation <id>\", \"limit to one automation\")\n .description(\"fast in-process validation: colocated tests + auto smoke (ADR-0008)\")\n .action(async (cmdOpts: { smokeOnly?: boolean; automation?: string }) => {\n const { out, opts } = setup();\n try {\n const t = target(opts);\n const root = t.projectRoot ?? process.cwd();\n await runTests(out, root, { ...(cmdOpts.smokeOnly !== undefined ? { smokeOnly: cmdOpts.smokeOnly } : {}), filter: cmdOpts.automation });\n } catch (err) {\n toExit(err, out);\n }\n });\n\nprogram\n .command(\"build\")\n .description(\"build + statically extract every automation's manifest locally (CI check)\")\n .action(async () => {\n const { out, opts } = setup();\n try {\n const t = target(opts);\n const root = t.projectRoot ?? process.cwd();\n const autos = discoverLocalAutomations(root);\n if (autos.length === 0) throw new CliError(EXIT.USAGE, \"no automations found\");\n const manifests: Array<ReturnType<typeof extractAutomationManifest>> = [];\n for (const a of autos) {\n const def = await loadAutomationDef(a.entry);\n manifests.push(extractAutomationManifest(def));\n }\n out.data({ automations: manifests }, () =>\n manifests.map((m) => `${m.id}: trigger=${m.trigger.kind} connections=${Object.keys(m.connections).join(\",\") || \"-\"} secrets=${Object.keys(m.secrets).join(\",\") || \"-\"}`).join(\"\\n\"),\n );\n } catch (err) {\n toExit(err, out);\n }\n });\n\nprogram\n .command(\"deploy\")\n .option(\"--ref <ref>\", \"git ref to deploy (default: the project's production branch)\")\n .option(\"--local\", \"deploy the local working tree (dev/dogfood lane, skips git)\")\n .option(\"--no-wait\", \"queue the sync and return immediately\")\n .description(\"git \u2192 instance: build changed, gate on tests, promote on green (ADR-0006)\")\n .action(async (cmdOpts: { ref?: string; local?: boolean; wait?: boolean }) => {\n const { out, opts } = setup();\n try {\n const { name, root } = requireProject(opts);\n await deploy(out, api(opts), name, {\n ref: cmdOpts.ref,\n local: cmdOpts.local ? root : undefined,\n ...(cmdOpts.wait === false ? { wait: false } : {}),\n });\n } catch (err) {\n toExit(err, out);\n }\n });\n\nprogram\n .command(\"dev\")\n .option(\"--port <port>\", \"port for the local instance\", \"8377\")\n .option(\"--no-watch\", \"deploy once and keep serving without watching\")\n .description(\"zero-setup local instance (embedded postgres) + deploy-on-change\")\n .action(async (cmdOpts: { port: string; watch?: boolean }) => {\n const { out, opts } = setup();\n try {\n const { name, root } = requireProject(opts);\n await dev(out, root, name, { port: Number(cmdOpts.port), ...(cmdOpts.watch === false ? { watch: false } : {}) });\n } catch (err) {\n toExit(err, out);\n }\n });\n\nconst auth = program.command(\"auth\").description(\"agent-assisted Harness credential setup; values post directly to connect links\");\nauth\n .command(\"claude-code\")\n .requiredOption(\"--connect <urlOrToken>\", \"Tesser /connect/<token> URL or token\")\n .option(\"--mode <mode>\", \"subscription or apiKey\", \"subscription\")\n .option(\"--token-stdin\", \"read token from stdin instead of running claude setup-token\")\n .option(\"--from-env <name>\", \"read token from an environment variable\")\n .option(\"--scope <scope>\", \"workspace or per_user\", \"workspace\")\n .option(\"--end-user-id <id>\", \"end-user id for per_user connections\")\n .option(\"--bin <path>\", \"claude binary\", \"claude\")\n .description(\"connect Claude Code as a brokered Harness; subscription mode runs claude setup-token\")\n .action(async (cmdOpts: { connect: string; mode?: string; tokenStdin?: boolean; fromEnv?: string; scope?: string; endUserId?: string; bin?: string }) => {\n const { out, opts } = setup();\n try {\n await authClaudeCode(out, target(opts).url, cmdOpts);\n } catch (err) {\n toExit(err, out);\n }\n });\nauth\n .command(\"pi\")\n .requiredOption(\"--connect <urlOrToken>\", \"Tesser /connect/<token> URL or token\")\n .option(\"--mode <mode>\", \"anthropicOAuth or anthropicApiKey\", \"anthropicOAuth\")\n .option(\"--token-stdin\", \"read token from stdin\")\n .option(\"--from-env <name>\", \"read token from an environment variable\")\n .option(\"--scope <scope>\", \"workspace or per_user\", \"workspace\")\n .option(\"--end-user-id <id>\", \"end-user id for per_user connections\")\n .description(\"connect Pi as a brokered Harness\")\n .action(async (cmdOpts: { connect: string; mode?: string; tokenStdin?: boolean; fromEnv?: string; scope?: string; endUserId?: string }) => {\n const { out, opts } = setup();\n try {\n await authPi(out, target(opts).url, cmdOpts);\n } catch (err) {\n toExit(err, out);\n }\n });\n\nprogram\n .command(\"connect\")\n .option(\"--wait\", \"poll until the human completes the link\")\n .option(\"--status <token>\", \"check an existing connect link\")\n .description(\"mint a connect link for missing credentials; the human completes it in a browser (ADR-0005)\")\n .action(async (cmdOpts: { wait?: boolean; status?: string }) => {\n const { out, opts } = setup();\n try {\n const client = api(opts);\n if (cmdOpts.status) {\n out.data(await client.get(`/connect-links/${cmdOpts.status}/status`));\n return;\n }\n const { name } = requireProject(opts);\n const minted = await client.post<{ url: string | null; token?: string; requirements: unknown[] }>(\n \"/connect-links\",\n { project: name },\n );\n if (!minted.url) {\n out.data({ url: null, requirements: [] }, () => \"nothing missing \u2014 all requirements are satisfied\");\n return;\n }\n out.data(minted, () => `open in a browser to connect:\\n ${minted.url}`);\n if (cmdOpts.wait) {\n for (;;) {\n await new Promise((r) => setTimeout(r, 2000));\n const status = await client.get<{ status: string }>(`/connect-links/${minted.token}/status`);\n if (status.status === \"completed\") {\n out.log(\"connect link completed \u2713\");\n return;\n }\n if (status.status === \"expired\") throw new CliError(EXIT.HALTED_CREDENTIALS, \"connect link expired\");\n }\n }\n process.exit(EXIT.HALTED_CREDENTIALS);\n } catch (err) {\n toExit(err, out);\n }\n });\n\nconst secrets = program.command(\"secrets\").description(\"workspace secrets \u2014 names only; values never echo\");\nsecrets\n .command(\"list\")\n .action(async () => {\n const { out, opts } = setup();\n try {\n out.data(await api(opts).get(\"/secrets\"));\n } catch (err) {\n toExit(err, out);\n }\n });\nsecrets\n .command(\"set\")\n .argument(\"<name>\")\n .option(\"--value-stdin\", \"read the value from stdin (pipe it; value never appears in argv)\")\n .description(\"set a secret value (human/CI lane: pipe via --value-stdin; agents mint connect links instead)\")\n .action(async (name: string, cmdOpts: { valueStdin?: boolean }) => {\n const { out, opts } = setup();\n try {\n if (!cmdOpts.valueStdin) {\n throw new CliError(\n EXIT.USAGE,\n \"refusing a value on argv \u2014 pipe it: `printenv MY_SECRET | tesser secrets set \" + name + \" --value-stdin` (or use a connect link)\",\n );\n }\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(chunk as Buffer);\n const value = Buffer.concat(chunks).toString(\"utf8\").replace(/\\n$/, \"\");\n if (value.length === 0) throw new CliError(EXIT.USAGE, \"empty value on stdin\");\n await api(opts).put(`/secrets/${encodeURIComponent(name)}`, { value });\n out.data({ set: name }, () => `secret \"${name}\" set \u2713`);\n } catch (err) {\n toExit(err, out);\n }\n });\nsecrets\n .command(\"rm\")\n .argument(\"<name>\")\n .action(async (name: string) => {\n const { out, opts } = setup();\n try {\n out.data(await api(opts).delete(`/secrets/${encodeURIComponent(name)}`));\n } catch (err) {\n toExit(err, out);\n }\n });\n\nconst runs = program.command(\"runs\").description(\"inspect and drive runs\");\nruns\n .command(\"list\")\n .option(\"--automation <id>\")\n .option(\"--status <status>\")\n .option(\"--limit <n>\", \"max rows\", \"25\")\n .action(async (cmdOpts: { automation?: string; status?: string; limit: string }) => {\n const { out, opts } = setup();\n try {\n const { name } = requireProject(opts);\n const params = new URLSearchParams({ project: name, limit: cmdOpts.limit });\n if (cmdOpts.automation) params.set(\"automation\", cmdOpts.automation);\n if (cmdOpts.status) params.set(\"status\", cmdOpts.status);\n const data = await api(opts).get<{ runs: Array<Record<string, unknown>> }>(`/runs?${params}`);\n out.data(data, (d: { runs: Array<{ id: string; automation_id: string; status: string; trigger_kind: string; created_at: string }> }) =>\n d.runs.map((r) => `${r.id} ${r.automation_id} ${r.status} (${r.trigger_kind}) ${r.created_at}`).join(\"\\n\") || \"(no runs)\",\n );\n } catch (err) {\n toExit(err, out);\n }\n });\nruns\n .command(\"show\")\n .argument(\"<runId>\")\n .action(async (runId: string) => {\n const { out, opts } = setup();\n try {\n out.data(await api(opts).get(`/runs/${runId}`));\n } catch (err) {\n toExit(err, out);\n }\n });\nruns\n .command(\"trigger\")\n .argument(\"<automation>\")\n .option(\"--input <json>\", \"input payload as JSON\")\n .option(\"--env <env>\", \"environment\", \"production\")\n .action(async (automation: string, cmdOpts: { input?: string; env: string }) => {\n const { out, opts } = setup();\n try {\n const { name } = requireProject(opts);\n const body: Record<string, unknown> = { project: name, automation, env: cmdOpts.env };\n if (cmdOpts.input !== undefined) body[\"input\"] = JSON.parse(cmdOpts.input);\n out.data(await api(opts).post(\"/runs\", body));\n } catch (err) {\n toExit(err, out);\n }\n });\nruns\n .command(\"signal\")\n .argument(\"<runId>\")\n .argument(\"<name>\")\n .option(\"--payload <json>\", \"signal payload as JSON\")\n .action(async (runId: string, name: string, cmdOpts: { payload?: string }) => {\n const { out, opts } = setup();\n try {\n out.data(\n await api(opts).post(`/runs/${runId}/signals/${encodeURIComponent(name)}`, {\n ...(cmdOpts.payload !== undefined ? { payload: JSON.parse(cmdOpts.payload) } : {}),\n }),\n );\n } catch (err) {\n toExit(err, out);\n }\n });\nruns\n .command(\"cancel\")\n .argument(\"<runId>\")\n .action(async (runId: string) => {\n const { out, opts } = setup();\n try {\n out.data(await api(opts).post(`/runs/${runId}/cancel`));\n } catch (err) {\n toExit(err, out);\n }\n });\n\nprogram\n .command(\"logs\")\n .argument(\"<runId>\")\n .option(\"--follow\", \"poll until the run settles\")\n .description(\"step logs for one run\")\n .action(async (runId: string, cmdOpts: { follow?: boolean }) => {\n const { out, opts } = setup();\n try {\n const client = api(opts);\n let printed = 0;\n for (;;) {\n const detail = await client.get<{\n run: { status: string };\n logs: Array<{ step: string | null; level: string; msg: string; created_at: string }>;\n }>(`/runs/${runId}`);\n const fresh = detail.logs.slice(printed);\n printed = detail.logs.length;\n if (out.json && !cmdOpts.follow) {\n out.data(detail);\n return;\n }\n for (const l of fresh) out.log(`[${l.level}]${l.step ? ` (${l.step})` : \"\"} ${l.msg}`);\n if (!cmdOpts.follow || [\"completed\", \"failed\", \"cancelled\"].includes(detail.run.status)) {\n if (!out.json) out.log(`run ${detail.run.status}`);\n else out.data(detail);\n return;\n }\n await new Promise((r) => setTimeout(r, 1000));\n }\n } catch (err) {\n toExit(err, out);\n }\n });\n\nprogram\n .command(\"replay\")\n .argument(\"<runId>\")\n .description(\"freeze a real run as a committed regression fixture + test (ADR-0008)\")\n .action(async (runId: string) => {\n const { out, opts } = setup();\n try {\n const { root } = requireProject(opts);\n await replay(out, api(opts), root, runId);\n } catch (err) {\n toExit(err, out);\n }\n });\n\nprogram\n .command(\"rollback\")\n .argument(\"<automation>\")\n .requiredOption(\"--to <version>\", \"version number to re-point the alias at\")\n .option(\"--env <env>\", \"environment\", \"production\")\n .description(\"instant alias re-point to a prior immutable version (no rebuild)\")\n .action(async (automation: string, cmdOpts: { to: string; env: string }) => {\n const { out, opts } = setup();\n try {\n const { name } = requireProject(opts);\n out.data(\n await api(opts).post(`/projects/${name}/rollback`, {\n automation,\n toVersion: Number(cmdOpts.to),\n env: cmdOpts.env,\n }),\n );\n } catch (err) {\n toExit(err, out);\n }\n });\n\nprogram\n .command(\"status\")\n .description(\"instance + project deploy status\")\n .action(async () => {\n const { out, opts } = setup();\n try {\n const t = target(opts);\n const client = api(opts);\n const health = await client.get(\"/health\");\n const status = await client.get(\"/status\");\n const manifest = t.projectRoot ? readLinkManifest(t.projectRoot) : null;\n const projectStatus = manifest ? await client.get(`/projects/${manifest.project}/deploys/latest`).catch(() => null) : null;\n out.data({ instance: t.url, health, status, project: manifest?.project ?? null, deploy: projectStatus });\n } catch (err) {\n toExit(err, out);\n }\n });\n\nprogram.parseAsync().catch((err) => {\n const out = new Output(process.argv.includes(\"--json\"));\n toExit(err, out);\n});\n", "// The structured codec carrying step results to/from the journal (ADR-0002).\n// An invisible internal (ADR-0004): authors only ever see plain values round-trip.\n//\n// Wire shape is JSON. Non-JSON serializables are tagged envelopes: {\"$t\": kind, \"v\": ...}.\n// A plain object that itself owns a \"$t\" key is wrapped as {\"$t\":\"obj\"} to stay unambiguous.\n\nexport type JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\nexport class NotSerializableError extends TypeError {\n constructor(\n readonly path: string,\n readonly kind: string,\n ) {\n super(\n `value at ${path} is not serializable (${kind}); step results are journaled and must be ` +\n `plain data \u2014 string/number/boolean/null/bigint/Date/Array/Map/Set/Uint8Array/plain object`,\n );\n this.name = \"NotSerializableError\";\n }\n}\n\nfunction describe(value: unknown): string {\n if (typeof value === \"function\") return \"a function\";\n if (typeof value === \"symbol\") return \"a symbol\";\n if (value instanceof Promise) return \"a Promise \u2014 await it inside the step\";\n const proto = Object.getPrototypeOf(value);\n const ctor = proto?.constructor?.name;\n return ctor ? `a ${ctor} instance \u2014 a live handle` : \"an exotic object\";\n}\n\nexport function encodeJournal(value: unknown, path = \"$\"): JsonValue {\n if (value === undefined) return { $t: \"undef\" };\n if (value === null) return null;\n const t = typeof value;\n if (t === \"string\" || t === \"boolean\") return value as string | boolean;\n if (t === \"number\") {\n const n = value as number;\n if (Number.isFinite(n)) return n;\n return { $t: \"num\", v: String(n) }; // NaN / Infinity / -Infinity\n }\n if (t === \"bigint\") return { $t: \"bigint\", v: (value as bigint).toString() };\n if (t === \"function\" || t === \"symbol\") throw new NotSerializableError(path, describe(value));\n if (value instanceof Date) {\n const ms = value.getTime();\n return { $t: \"date\", v: Number.isNaN(ms) ? null : value.toISOString() };\n }\n if (value instanceof Map) {\n return {\n $t: \"map\",\n v: [...value.entries()].map(([k, v], i) => [\n encodeJournal(k, `${path}.<key ${i}>`),\n encodeJournal(v, `${path}.<entry ${i}>`),\n ]) as JsonValue,\n };\n }\n if (value instanceof Set) {\n return {\n $t: \"set\",\n v: [...value.values()].map((v, i) => encodeJournal(v, `${path}.<item ${i}>`)),\n };\n }\n if (value instanceof Uint8Array) {\n return { $t: \"bytes\", v: Buffer.from(value).toString(\"base64\") };\n }\n if (Array.isArray(value)) {\n return value.map((v, i) => encodeJournal(v, `${path}[${i}]`));\n }\n if (t === \"object\") {\n const proto = Object.getPrototypeOf(value);\n if (proto !== Object.prototype && proto !== null) {\n throw new NotSerializableError(path, describe(value));\n }\n const obj = value as Record<string, unknown>;\n const out: Record<string, JsonValue> = {};\n for (const key of Object.keys(obj)) {\n out[key] = encodeJournal(obj[key], `${path}.${key}`);\n }\n if (Object.prototype.hasOwnProperty.call(obj, \"$t\")) return { $t: \"obj\", v: out };\n return out;\n }\n throw new NotSerializableError(path, describe(value));\n}\n\nexport function decodeJournal(json: JsonValue): unknown {\n if (json === null || typeof json !== \"object\") return json;\n if (Array.isArray(json)) return json.map(decodeJournal);\n const tag = (json as Record<string, JsonValue>)[\"$t\"];\n if (tag === undefined) {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(json)) out[key] = decodeJournal((json as never)[key]);\n return out;\n }\n const v = (json as Record<string, JsonValue>)[\"v\"];\n switch (tag) {\n case \"undef\":\n return undefined;\n case \"num\":\n return Number(v);\n case \"bigint\":\n return BigInt(v as string);\n case \"date\":\n return v === null ? new Date(NaN) : new Date(v as string);\n case \"map\":\n return new Map((v as JsonValue[]).map((e) => {\n const [k, val] = e as [JsonValue, JsonValue];\n return [decodeJournal(k), decodeJournal(val)] as const;\n }));\n case \"set\":\n return new Set((v as JsonValue[]).map(decodeJournal));\n case \"bytes\":\n return new Uint8Array(Buffer.from(v as string, \"base64\"));\n case \"obj\": {\n const out: Record<string, unknown> = {};\n const inner = v as Record<string, JsonValue>;\n for (const key of Object.keys(inner)) out[key] = decodeJournal(inner[key] as JsonValue);\n return out;\n }\n default:\n throw new TypeError(`journal codec: unknown tag \"${String(tag)}\"`);\n }\n}\n\n/** Stable JSON string for journal storage / content hashing (sorted object keys). */\nexport function stableStringify(json: JsonValue): string {\n if (json === null || typeof json !== \"object\") return JSON.stringify(json);\n if (Array.isArray(json)) return `[${json.map(stableStringify).join(\",\")}]`;\n const keys = Object.keys(json).sort();\n return `{${keys.map((k) => `${JSON.stringify(k)}:${stableStringify((json as never)[k])}`).join(\",\")}}`;\n}\n", "// Duration strings (\"30s\", \"1h30m\", \"250ms\", \"2d\") used across step timeouts, retry\n// backoff, sleep, and trigger cadence. An invisible internal.\n\nconst UNIT_MS: Record<string, number> = {\n ms: 1,\n s: 1000,\n m: 60_000,\n h: 3_600_000,\n d: 86_400_000,\n w: 604_800_000,\n};\n\nconst PART = /(\\d+(?:\\.\\d+)?)(ms|s|m|h|d|w)/g;\n\nexport function parseDuration(input: string | number, what = \"duration\"): number {\n if (typeof input === \"number\") {\n if (!Number.isFinite(input) || input < 0) {\n throw new TypeError(`${what}: expected a non-negative number of ms, got ${input}`);\n }\n return input;\n }\n const s = input.trim();\n let total = 0;\n let matchedLen = 0;\n for (const m of s.matchAll(PART)) {\n total += Number(m[1]) * (UNIT_MS[m[2] as string] as number);\n matchedLen += (m[0] as string).length;\n }\n if (matchedLen === 0 || matchedLen !== s.replace(/\\s+/g, \"\").length) {\n throw new TypeError(\n `${what}: \"${input}\" is not a duration \u2014 use forms like \"250ms\", \"30s\", \"5m\", \"1h30m\", \"2d\"`,\n );\n }\n return Math.round(total);\n}\n\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n const units: Array<[string, number]> = [\n [\"w\", UNIT_MS[\"w\"] as number],\n [\"d\", UNIT_MS[\"d\"] as number],\n [\"h\", UNIT_MS[\"h\"] as number],\n [\"m\", UNIT_MS[\"m\"] as number],\n [\"s\", 1000],\n ];\n let rest = ms;\n let out = \"\";\n for (const [unit, size] of units) {\n const n = Math.floor(rest / size);\n if (n > 0) {\n out += `${n}${unit}`;\n rest -= n * size;\n }\n }\n if (rest > 0) out += `${rest}ms`;\n return out;\n}\n", "// Errors control the retry policy (ADR-0002). Symbol branding keeps instanceof checks\n// honest across duplicated module instances (bundled server vs project artifact).\n\nconst RETRYABLE = Symbol.for(\"tesser.error.retryable\");\nconst TERMINAL = Symbol.for(\"tesser.error.terminal\");\n\nexport interface RetryableErrorOptions {\n cause?: unknown;\n /** Hint from the provider (e.g. Retry-After) \u2014 the engine waits at least this long. */\n retryAfterMs?: number | undefined;\n}\n\n/** Force a retry (also the default for an uncaught throw, up to maxAttempts). */\nexport class RetryableError extends Error {\n readonly retryAfterMs: number | undefined;\n\n constructor(message: string, options?: RetryableErrorOptions) {\n super(message, options?.cause === undefined ? undefined : { cause: options.cause });\n this.name = \"RetryableError\";\n this.retryAfterMs = options?.retryAfterMs;\n Object.defineProperty(this, RETRYABLE, { value: true });\n }\n}\n\n/** Stop now \u2014 do not retry. On terminal failure, completed steps' `undo` run in reverse. */\nexport class TerminalError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options?.cause === undefined ? undefined : { cause: options.cause });\n this.name = \"TerminalError\";\n Object.defineProperty(this, TERMINAL, { value: true });\n }\n}\n\nexport function isRetryableError(err: unknown): err is RetryableError {\n return (\n err instanceof RetryableError ||\n (typeof err === \"object\" && err !== null && RETRYABLE in err)\n );\n}\n\nexport function isTerminalError(err: unknown): err is TerminalError {\n return (\n err instanceof TerminalError ||\n (typeof err === \"object\" && err !== null && TERMINAL in err)\n );\n}\n", "// Standard Schema v1 (https://standardschema.dev) \u2014 the spec interface, declared by us so\n// the SDK stays zero-dependency and no third-party name appears in our surface (ADR-0004).\n// Zod / Valibot / ArkType all implement `~standard`.\n\nimport { TerminalError } from \"../errors.js\";\n\nexport interface StandardSchemaV1<Input = unknown, Output = Input> {\n readonly \"~standard\": StandardSchemaV1.Props<Input, Output>;\n}\n\nexport declare namespace StandardSchemaV1 {\n interface Props<Input = unknown, Output = Input> {\n readonly version: 1;\n readonly vendor: string;\n readonly validate: (value: unknown) => Result<Output> | Promise<Result<Output>>;\n readonly types?: Types<Input, Output> | undefined;\n }\n type Result<Output> = SuccessResult<Output> | FailureResult;\n interface SuccessResult<Output> {\n readonly value: Output;\n readonly issues?: undefined;\n }\n interface FailureResult {\n readonly issues: ReadonlyArray<Issue>;\n }\n interface Issue {\n readonly message: string;\n readonly path?: ReadonlyArray<PropertyKey | PathSegment> | undefined;\n }\n interface PathSegment {\n readonly key: PropertyKey;\n }\n interface Types<Input = unknown, Output = Input> {\n readonly input: Input;\n readonly output: Output;\n }\n}\n\nexport interface ValidationIssue {\n message: string;\n path: string;\n}\n\n/** Validation failures are terminal \u2014 bad input never retries (ADR-0002 semantics). */\nexport class SchemaValidationError extends TerminalError {\n constructor(\n readonly what: string,\n readonly issues: ValidationIssue[],\n ) {\n super(\n `${what} failed validation: ` +\n issues.map((i) => (i.path === \"$\" ? i.message : `${i.path}: ${i.message}`)).join(\"; \"),\n );\n this.name = \"SchemaValidationError\";\n }\n}\n\nfunction pathToString(path: StandardSchemaV1.Issue[\"path\"]): string {\n if (!path || path.length === 0) return \"$\";\n return (\n \"$.\" +\n path\n .map((seg) => String(typeof seg === \"object\" && seg !== null && \"key\" in seg ? seg.key : seg))\n .join(\".\")\n );\n}\n\nexport function isSchema(value: unknown): value is StandardSchemaV1 {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"~standard\" in value &&\n typeof (value as Record<string, unknown>)[\"~standard\"] === \"object\"\n );\n}\n\n/** Validate `value` against a Standard Schema; throws SchemaValidationError on failure. */\nexport async function validateSchema<T>(\n schema: StandardSchemaV1<unknown, T>,\n value: unknown,\n what: string,\n): Promise<T> {\n let result = schema[\"~standard\"].validate(value);\n if (result instanceof Promise) result = await result;\n if (result.issues) {\n throw new SchemaValidationError(\n what,\n result.issues.map((i) => ({ message: i.message, path: pathToString(i.path) })),\n );\n }\n return result.value;\n}\n", "// Declared-scheme webhook signature verification (ADR-0013): crypto an agent can get\n// wrong, implemented once. Used by the server ingress and by the testing harness.\n\nimport { createHmac, timingSafeEqual } from \"node:crypto\";\nimport type { InboundWebhookEvent, VerifyScheme } from \"../connector/index.js\";\n\nconst SLACK_TOLERANCE_MS = 5 * 60 * 1000;\n\nfunction safeEqual(a: string, b: string): boolean {\n const ab = Buffer.from(a);\n const bb = Buffer.from(b);\n if (ab.length !== bb.length) return false;\n return timingSafeEqual(ab, bb);\n}\n\nfunction header(req: InboundWebhookEvent, name: string): string | undefined {\n return req.headers[name.toLowerCase()];\n}\n\nexport async function verifyInboundEvent(\n scheme: VerifyScheme,\n req: InboundWebhookEvent,\n secret: string,\n nowMs = Date.now(),\n): Promise<boolean> {\n switch (scheme.kind) {\n case \"none\":\n return true;\n case \"hmacSha256\": {\n const provided = header(req, scheme.header);\n if (!provided) return false;\n const digest = createHmac(\"sha256\", secret).update(req.rawBody).digest(scheme.encoding);\n const expected = (scheme.prefix ?? \"\") + digest;\n return safeEqual(provided, expected);\n }\n case \"slackSigning\": {\n const ts = header(req, \"x-slack-request-timestamp\");\n const provided = header(req, \"x-slack-signature\");\n if (!ts || !provided) return false;\n const age = Math.abs(nowMs - Number(ts) * 1000);\n if (!Number.isFinite(age) || age > SLACK_TOLERANCE_MS) return false;\n const base = `v0:${ts}:${Buffer.from(req.rawBody).toString(\"utf8\")}`;\n const expected = \"v0=\" + createHmac(\"sha256\", secret).update(base).digest(\"hex\");\n return safeEqual(provided, expected);\n }\n case \"custom\":\n return scheme.verify(req, secret);\n }\n}\n", "// Retry policy resolution \u2014 one implementation so the in-process TestEngine and the\n// durable server engine schedule identical retries (ADR-0008 fidelity).\n\nimport type { RetryPolicy } from \"../automation.js\";\nimport { parseDuration } from \"./duration.js\";\n\nexport interface ResolvedRetryPolicy {\n maxAttempts: number;\n type: \"exponential\" | \"fixed\";\n baseMs: number;\n maxMs: number;\n jitter: boolean;\n}\n\nexport const DEFAULT_STEP_RETRY: ResolvedRetryPolicy = {\n maxAttempts: 3,\n type: \"exponential\",\n baseMs: 1000,\n maxMs: 3_600_000,\n jitter: true,\n};\n\nexport function resolveRetryPolicy(\n policy: RetryPolicy | undefined,\n fallback: ResolvedRetryPolicy = DEFAULT_STEP_RETRY,\n): ResolvedRetryPolicy {\n if (!policy) return fallback;\n const backoff = policy.backoff;\n if (backoff === undefined) return { ...fallback, maxAttempts: policy.maxAttempts };\n if (typeof backoff === \"string\") {\n return { ...fallback, maxAttempts: policy.maxAttempts, type: backoff };\n }\n return {\n maxAttempts: policy.maxAttempts,\n type: backoff.type,\n baseMs: backoff.base !== undefined ? parseDuration(backoff.base, \"retry.backoff.base\") : fallback.baseMs,\n maxMs: backoff.max !== undefined ? parseDuration(backoff.max, \"retry.backoff.max\") : fallback.maxMs,\n jitter: backoff.jitter ?? fallback.jitter,\n };\n}\n\n/** Delay before the NEXT attempt, or null when attempts are exhausted.\n * `attempt` is the 1-based attempt that just failed. */\nexport function nextRetryDelayMs(\n policy: ResolvedRetryPolicy,\n attempt: number,\n retryAfterMs?: number | undefined,\n random: () => number = Math.random,\n): number | null {\n if (attempt >= policy.maxAttempts) return null;\n let delay =\n policy.type === \"fixed\" ? policy.baseMs : policy.baseMs * Math.pow(2, attempt - 1);\n delay = Math.min(delay, policy.maxMs);\n if (policy.jitter) delay = delay * (0.5 + random() * 0.5);\n if (retryAfterMs !== undefined) delay = Math.max(delay, retryAfterMs);\n return Math.round(delay);\n}\n", "// Connector authoring contract (ADR-0012) + connector-defined triggers (ADR-0013).\n// Auth is declared once and injected as a pre-authed ctx.http \u2014 the author never names a\n// token. Actions are typed calls returning OUR mapped stable shape. Triggers are typed\n// constructors symmetric to actions; the runtime owns delivery/registration/dedup.\n\nimport type { Connector, Logger, Schema } from \"../automation.js\";\nimport type { HarnessDef, HarnessRunRequest, HarnessRunResult } from \"../harnesses.js\";\nimport type { NormalizedModelRequest, NormalizedModelResponse } from \"../operators.js\";\nimport type { ConnectorTrigger } from \"../triggers.js\";\nimport type { ClassifyError, TesserHttp } from \"../internal/http.js\";\nimport type { StandardSchemaV1 } from \"../internal/standard-schema.js\";\n\n/** Any Standard Schema, keeping both its input (pre-parse: defaults optional) and\n * output (post-parse) types. Callers supply the INPUT shape; handlers receive OUTPUT. */\nexport type AnySchema = StandardSchemaV1<any, any>;\nexport type SchemaIn<S> = S extends StandardSchemaV1<infer I, any> ? I : never;\nexport type SchemaOut<S> = S extends StandardSchemaV1<any, infer O> ? O : never;\n\n// ---- Provider facts (the Catalog entry shape; inline facts are promoted by codegen, ADR-0012) ----\n\nexport interface OAuth2ProviderFacts {\n authorizeUrl: string;\n tokenUrl: string;\n /** How the client authenticates at the token endpoint. Default \"body\". */\n clientAuth?: \"body\" | \"basic\";\n /** Scope list separator quirk. Default \" \". */\n scopeSeparator?: string;\n /** Use PKCE on the auth-code flow. Default true (harmless where unsupported is false). */\n pkce?: boolean;\n /** Extra params some providers require (e.g. Google access_type=offline&prompt=consent). */\n extraAuthorizeParams?: Record<string, string>;\n extraTokenParams?: Record<string, string>;\n /** Providers that rotate refresh tokens on every refresh. */\n rotatesRefreshToken?: boolean;\n}\n\nexport interface ProviderFacts {\n id: string;\n displayName?: string;\n /** Default API base URL for connectors behind this provider. */\n baseUrl?: string;\n oauth2?: OAuth2ProviderFacts;\n docsUrl?: string;\n}\n\n// ---- Auth declarations (declared once; placement applied by the runtime, ADR-0012) ----\n\nexport interface OAuth2Auth {\n readonly kind: \"oauth2\";\n readonly provider?: string;\n readonly scopes: readonly string[];\n readonly flow: \"auth_code\" | \"client_credentials\";\n readonly describe?: string;\n}\n\nexport interface ApiKeyAuth {\n readonly kind: \"apiKey\";\n readonly in: \"header\" | \"query\";\n readonly name: string;\n readonly prefix?: string;\n readonly describe?: string;\n}\n\nexport interface BasicAuth {\n readonly kind: \"basic\";\n readonly describe?: string;\n}\n\nexport interface CustomAuth {\n readonly kind: \"custom\";\n readonly describe?: string;\n /** Field names the connect page collects (empty = connection is instantly ready). */\n readonly fields?: readonly string[];\n /** Programmatic signer \u2014 receives the outbound request and the credential fields. */\n readonly sign: (\n req: { url: URL; headers: Headers },\n fields: Readonly<Record<string, string>>,\n ) => void | Promise<void>;\n}\n\nexport type AuthDecl = OAuth2Auth | ApiKeyAuth | BasicAuth | CustomAuth;\n\nexport function oauth2(opts: {\n provider?: string;\n scopes: readonly string[];\n flow?: \"auth_code\" | \"client_credentials\";\n describe?: string;\n}): OAuth2Auth {\n return Object.freeze({\n kind: \"oauth2\" as const,\n scopes: Object.freeze([...opts.scopes]),\n flow: opts.flow ?? \"auth_code\",\n ...(opts.provider !== undefined ? { provider: opts.provider } : {}),\n ...(opts.describe !== undefined ? { describe: opts.describe } : {}),\n });\n}\n\nexport function apiKey(opts: {\n in?: \"header\" | \"query\";\n name?: string;\n prefix?: string;\n describe?: string;\n}): ApiKeyAuth {\n return Object.freeze({\n kind: \"apiKey\" as const,\n in: opts?.in ?? \"header\",\n name: opts?.name ?? \"Authorization\",\n ...(opts?.prefix !== undefined ? { prefix: opts.prefix } : {}),\n ...(opts?.describe !== undefined ? { describe: opts.describe } : {}),\n });\n}\n\nexport function basic(opts?: { describe?: string }): BasicAuth {\n return Object.freeze({\n kind: \"basic\" as const,\n ...(opts?.describe !== undefined ? { describe: opts.describe } : {}),\n });\n}\n\nexport function customAuth(opts: {\n describe?: string;\n fields?: readonly string[];\n sign: CustomAuth[\"sign\"];\n}): CustomAuth {\n return Object.freeze({\n kind: \"custom\" as const,\n sign: opts.sign,\n ...(opts.describe !== undefined ? { describe: opts.describe } : {}),\n ...(opts.fields !== undefined ? { fields: Object.freeze([...opts.fields]) } : {}),\n });\n}\n\n// ---- Actions (ADR-0012): non-durable, run inside the caller's Step ----\n\n/** Runtime-resolved, log-masked credential reference \u2014 the escape hatch for non-standard\n * placement. Prefer ctx.http, which attaches the credential by declared placement. */\nexport interface AuthRef {\n readonly kind: AuthDecl[\"kind\"];\n /** Which mode of a named auth map this connection used (undefined for single-auth). */\n readonly mode?: string;\n /** Credential fields (e.g. access_token, api_key, username, password). Values are\n * masked in logs by the runtime. */\n readonly fields: Readonly<Record<string, string>>;\n}\n\nexport interface ActionCtx {\n /** Pre-authed, base-URL'd client. Status \u2192 RetryableError/TerminalError per ADR-0012. */\n readonly http: TesserHttp;\n readonly auth: AuthRef;\n /** Auto-derived (runId + step + occurrence); attach to provider idempotency headers. */\n readonly idempotencyKey?: string;\n readonly logger: Logger;\n}\n\nexport interface ModelProviderSpec {\n readonly aliases?: Record<string, string>;\n readonly call: (ctx: ActionCtx, request: NormalizedModelRequest) => Promise<NormalizedModelResponse>;\n}\n\nexport interface HarnessProviderSpec {\n readonly adapter: string;\n readonly run: (\n ctx: ActionCtx,\n request: HarnessRunRequest<unknown>,\n def: HarnessDef,\n ) => Promise<HarnessRunResult<unknown>>;\n}\n\n/** I = caller-facing input (schema input type), PI = parsed input handed to run,\n * O = validated output. */\nexport interface ActionDef<I, PI, O> {\n readonly __action: true;\n readonly describe?: string;\n readonly input: StandardSchemaV1<I, PI>;\n readonly output: Schema<O>;\n /** Reads retry freely; writes retry only with an idempotency key (derived, ADR-0012). */\n readonly safety: \"read\" | \"write\";\n /** Explicit override of derived retry-safety. */\n readonly retrySafe?: boolean;\n readonly classifyError?: ClassifyError;\n readonly run: (ctx: ActionCtx, input: PI) => Promise<O>;\n}\n\nexport type AnyAction = ActionDef<any, any, any>;\nexport type ActionsTree = { [key: string]: AnyAction | ActionsTree };\n\nexport function action<IS extends AnySchema, OS extends AnySchema>(def: {\n describe?: string;\n input: IS;\n output: OS;\n safety?: \"read\" | \"write\";\n retrySafe?: boolean;\n classifyError?: ClassifyError;\n /** Receives the PARSED input (defaults applied); returns the value `output` validates. */\n run: (ctx: ActionCtx, input: SchemaOut<IS>) => Promise<SchemaIn<OS>>;\n}): ActionDef<SchemaIn<IS>, SchemaOut<IS>, SchemaOut<OS>> {\n if (!def?.input || !def?.output || typeof def?.run !== \"function\") {\n throw new TypeError(\"action: requires { input, output, run }\");\n }\n return Object.freeze({\n __action: true as const,\n input: def.input,\n output: def.output,\n safety: def.safety ?? \"write\",\n run: def.run,\n ...(def.describe !== undefined ? { describe: def.describe } : {}),\n ...(def.retrySafe !== undefined ? { retrySafe: def.retrySafe } : {}),\n ...(def.classifyError !== undefined ? { classifyError: def.classifyError } : {}),\n }) as never;\n}\n\nexport function isAction(node: unknown): node is AnyAction {\n return typeof node === \"object\" && node !== null && (node as AnyAction).__action === true;\n}\n\n// ---- Webhook receive (connector-level, ADR-0013) ----\n\nexport interface InboundWebhookEvent {\n readonly headers: Record<string, string>;\n readonly query: Record<string, string>;\n readonly rawBody: Uint8Array;\n /** Parsed JSON body, or undefined when the body is not JSON. */\n readonly json: unknown;\n}\n\nexport type VerifyScheme =\n | {\n kind: \"hmacSha256\";\n header: string;\n prefix?: string;\n encoding: \"hex\" | \"base64\";\n }\n | { kind: \"slackSigning\" }\n | {\n kind: \"custom\";\n verify: (req: InboundWebhookEvent, secret: string) => boolean | Promise<boolean>;\n }\n | { kind: \"none\" };\n\nexport const verify = {\n hmacSha256(opts: { header: string; prefix?: string; encoding?: \"hex\" | \"base64\" }): VerifyScheme {\n return Object.freeze({\n kind: \"hmacSha256\" as const,\n header: opts.header,\n encoding: opts.encoding ?? \"hex\",\n ...(opts.prefix !== undefined ? { prefix: opts.prefix } : {}),\n });\n },\n slackSigning(): VerifyScheme {\n return Object.freeze({ kind: \"slackSigning\" as const });\n },\n custom(fn: (req: InboundWebhookEvent, secret: string) => boolean | Promise<boolean>): VerifyScheme {\n return Object.freeze({ kind: \"custom\" as const, verify: fn });\n },\n none(): VerifyScheme {\n return Object.freeze({ kind: \"none\" as const });\n },\n};\n\nexport interface IdentifiedEvent {\n /** Provider event name a trigger's `event` matches against (e.g. \"issues\", \"message\"). */\n event: string;\n /** Provider delivery id used for dedup; fall back to a payload hash when absent. */\n deliveryId?: string;\n /** Provider-side account identity (team id, installation id) to resolve the Connection. */\n connectionHint?: string;\n /** The payload handed to the trigger's map(); defaults to the request JSON. */\n payload?: unknown;\n}\n\nexport interface WebhookReceive {\n verify: VerifyScheme;\n /** Pull event name / delivery id / connection identity out of any inbound request.\n * Return null for requests that are not events (the runtime 400s them). */\n identify: (req: InboundWebhookEvent) => IdentifiedEvent | null;\n /** Endpoint-verification handshakes (e.g. Slack url_verification): return the response\n * body to answer with, or null when the request is a normal event. */\n challenge?: (req: InboundWebhookEvent) => string | null;\n}\n\n// ---- Connector triggers (ADR-0013) ----\n\nexport interface RegistrationTarget {\n /** Our ingress URL \u2014 stable per automation+trigger; never changes on redeploy. */\n url: string;\n /** The signing secret (we generate it in auto mode; the human pastes it in manual mode). */\n secret: string;\n}\n\nexport interface AutoRegistration<I> {\n mode: \"auto\";\n /** Create the provider-side hook using the brokered token (ctx.http). */\n create: (\n ctx: ActionCtx,\n reg: RegistrationTarget,\n params: I,\n ) => Promise<{ externalId?: string; state?: unknown } | void>;\n /** Remove the provider-side hook on undeploy (no orphaned hooks). */\n destroy?: (\n ctx: ActionCtx,\n reg: { externalId?: string; state?: unknown },\n params: I,\n ) => Promise<void>;\n}\n\nexport interface ManualRegistration<I> {\n mode: \"manual\";\n /** Connect-page copy: exact steps, with the ingress URL + secret available to interpolate. */\n instructions: (reg: RegistrationTarget, params: I) => string;\n}\n\nexport interface WebhookTriggerDecl<IS extends AnySchema = AnySchema, OS extends AnySchema = AnySchema> {\n readonly __trigger: \"webhook\";\n readonly describe?: string;\n readonly input: IS;\n readonly output: OS;\n /** Which identified provider event this trigger consumes. */\n readonly event: string;\n /** Raw provider payload \u2192 our stable typed payload; return null to skip (fine filter). */\n readonly map: (\n payload: unknown,\n params: SchemaOut<IS>,\n ) => SchemaIn<OS> | null | Promise<SchemaIn<OS> | null>;\n readonly register: AutoRegistration<SchemaOut<IS>> | ManualRegistration<SchemaOut<IS>>;\n}\n\nexport interface PollTriggerDecl<\n IS extends AnySchema = AnySchema,\n OS extends AnySchema = AnySchema,\n Item = unknown,\n> {\n readonly __trigger: \"poll\";\n readonly describe?: string;\n readonly input: IS;\n readonly output: OS;\n /** Connector-declared cadence; automation-author override is clamped to `floor`. */\n readonly interval?: { default: string; floor?: string };\n /** Which way the provider's natural list reads. New items fire oldest-first either way.\n * Default \"newest-first\" (how most list APIs sort). */\n readonly order?: \"newest-first\" | \"oldest-first\";\n /** Return the provider's natural current list \u2014 no cursor bookkeeping (runtime-owned\n * windowed seen-set). Opt into cursor mode by returning { items, nextCursor }. */\n readonly poll: (\n ctx: ActionCtx,\n params: SchemaOut<IS>,\n cursor: unknown,\n ) => Promise<Item[] | { items: Item[]; nextCursor?: unknown }>;\n readonly dedupeKey: (item: Item) => string;\n /** Raw item \u2192 stable typed payload (default: identity). */\n readonly map?: (item: Item, params: SchemaOut<IS>) => SchemaIn<OS> | Promise<SchemaIn<OS>>;\n}\n\nexport type AnyTriggerDecl = WebhookTriggerDecl<AnySchema, AnySchema> | PollTriggerDecl<AnySchema, AnySchema, any>;\nexport type TriggersDecl = Record<string, AnyTriggerDecl>;\n\nexport const trigger = {\n webhook<IS extends AnySchema, OS extends AnySchema>(def: {\n describe?: string;\n input: IS;\n output: OS;\n event: string;\n map: (\n payload: unknown,\n params: SchemaOut<IS>,\n ) => SchemaIn<OS> | null | Promise<SchemaIn<OS> | null>;\n register: AutoRegistration<SchemaOut<IS>> | ManualRegistration<SchemaOut<IS>>;\n }): WebhookTriggerDecl<IS, OS> {\n if (!def?.input || !def?.output || !def?.event || typeof def?.map !== \"function\" || !def?.register) {\n throw new TypeError(\"trigger.webhook: requires { input, output, event, map, register }\");\n }\n return Object.freeze({ __trigger: \"webhook\" as const, ...def });\n },\n poll<IS extends AnySchema, OS extends AnySchema, Item = SchemaIn<OS>>(def: {\n describe?: string;\n input: IS;\n output: OS;\n interval?: { default: string; floor?: string };\n order?: \"newest-first\" | \"oldest-first\";\n poll: (\n ctx: ActionCtx,\n params: SchemaOut<IS>,\n cursor: unknown,\n ) => Promise<Item[] | { items: Item[]; nextCursor?: unknown }>;\n dedupeKey: (item: Item) => string;\n map?: (item: Item, params: SchemaOut<IS>) => SchemaIn<OS> | Promise<SchemaIn<OS>>;\n }): PollTriggerDecl<IS, OS, Item> {\n if (!def?.input || !def?.output || typeof def?.poll !== \"function\" || typeof def?.dedupeKey !== \"function\") {\n throw new TypeError(\"trigger.poll: requires { input, output, poll, dedupeKey }\");\n }\n return Object.freeze({ __trigger: \"poll\" as const, ...def });\n },\n};\n\n// ---- defineConnector ----\n\n/** Optional-arg ergonomics: when every field is optional (or has a default), the call\n * needs no argument at all. */\ntype ClientFn<I, O> = undefined extends I\n ? (input?: I) => Promise<O>\n : Record<string, never> extends I\n ? (input?: I) => Promise<O>\n : (input: I) => Promise<O>;\n\nexport type ClientFromActions<A> = {\n readonly [K in keyof A]: A[K] extends ActionDef<infer I, any, infer O>\n ? ClientFn<I, O>\n : A[K] extends ActionsTree\n ? ClientFromActions<A[K]>\n : never;\n};\n\nexport type TriggerConstructors<T extends TriggersDecl> = {\n readonly [K in keyof T]: (\n params: SchemaIn<T[K][\"input\"]> & { connection?: string } & (T[K] extends { __trigger: \"poll\" }\n ? { every?: string }\n : Record<never, never>),\n ) => ConnectorTrigger<SchemaOut<T[K][\"output\"]>>;\n};\n\nexport interface ConnectorSpec<A extends ActionsTree, T extends TriggersDecl> {\n id: string;\n describe?: string;\n /** Provider id referencing the Catalog, or inline facts (promoted by codegen, ADR-0012). */\n provider?: string | ProviderFacts;\n /** API base URL; defaults to the provider's. */\n baseUrl?: string;\n /** One declaration, or a named map for multiple modes (e.g. { oauth, token }). */\n auth: AuthDecl | Record<string, AuthDecl>;\n /** Headers every ctx.http request carries (e.g. Accept/API-version/User-Agent). */\n defaultHeaders?: Record<string, string>;\n /** Provider idempotency header \u2014 when declared, the runtime auto-attaches ctx.idempotencyKey. */\n idempotencyHeader?: string;\n actions: A;\n triggers?: T;\n /** Direct model-call capability (ADR-0016). Runtime-owned; not exposed as ctx.connections actions. */\n modelProvider?: ModelProviderSpec;\n /** Sandboxed external runner capability (ADR-0019). Runtime-owned; not exposed as an Action. */\n harnessProvider?: HarnessProviderSpec;\n /** Required when any trigger is webhook-strategy. */\n webhook?: WebhookReceive;\n /** Sample outputs by dotted action path (and `trigger:<id>` for trigger payloads) \u2014\n * powers auto-mocked tests (ADR-0008) and connect-page previews. */\n samples?: Record<string, unknown>;\n}\n\n/** The full connector object: the automation-facing Connector<client> plus trigger\n * constructors plus the raw spec for build-time extraction. */\nexport interface ConnectorInstance<A extends ActionsTree, T extends TriggersDecl>\n extends Connector<ClientFromActions<A>> {\n readonly triggers: TriggerConstructors<T>;\n /** Build-time/manifest access to the declaration \u2014 not for automation code. */\n readonly __connector: ConnectorSpec<A, T>;\n /** Narrowed override so `.perUser()` keeps the trigger constructors. */\n perUser(): ConnectorInstance<A, T>;\n}\n\nconst CONNECTOR_ID = /^[a-z][a-z0-9-]{0,63}$/;\nconst AUTH_KINDS = new Set([\"oauth2\", \"apiKey\", \"basic\", \"custom\"]);\n\nfunction isAuthDecl(v: unknown): v is AuthDecl {\n return typeof v === \"object\" && v !== null && AUTH_KINDS.has((v as AuthDecl).kind);\n}\n\nexport function defineConnector<\n A extends ActionsTree,\n T extends TriggersDecl = Record<string, never>,\n>(spec: ConnectorSpec<A, T>): ConnectorInstance<A, T> {\n if (!CONNECTOR_ID.test(spec?.id ?? \"\")) {\n throw new TypeError(`defineConnector: id \"${String(spec?.id)}\" must be kebab-case`);\n }\n if (!spec.auth || (!isAuthDecl(spec.auth) && Object.values(spec.auth).every((a) => !isAuthDecl(a)))) {\n throw new TypeError(`defineConnector(${spec.id}): auth must be oauth2/apiKey/basic/customAuth (or a named map)`);\n }\n if ((!spec.actions || Object.keys(spec.actions).length === 0) && !spec.modelProvider && !spec.harnessProvider) {\n throw new TypeError(`defineConnector(${spec.id}): at least one action, modelProvider, or harnessProvider is required`);\n }\n const normalized = { ...spec, actions: (spec.actions ?? ({} as A)) } as ConnectorSpec<A, T>;\n const triggers = normalized.triggers ?? ({} as T);\n const hasWebhookTrigger = Object.values(triggers).some((t) => t.__trigger === \"webhook\");\n if (hasWebhookTrigger && !normalized.webhook) {\n throw new TypeError(\n `defineConnector(${spec.id}): webhook-strategy triggers require the connector-level webhook { verify, identify }`,\n );\n }\n\n const constructors: Record<string, (params: Record<string, unknown>) => ConnectorTrigger<unknown>> = {};\n for (const [triggerId, decl] of Object.entries(triggers)) {\n void decl;\n constructors[triggerId] = (params) => {\n // `connection` and `every` are reserved platform params, not provider filters.\n const { connection, every, ...rest } = params ?? {};\n return Object.freeze({\n kind: \"connector\" as const,\n connectorId: normalized.id,\n triggerId,\n params: rest,\n ...(connection !== undefined ? { connectionKey: String(connection) } : {}),\n ...(every !== undefined ? { every: String(every) } : {}),\n });\n };\n }\n\n function make(scope: \"workspace\" | \"per_user\"): ConnectorInstance<A, T> {\n const instance = {\n id: normalized.id,\n scope,\n triggers: Object.freeze({ ...constructors }) as TriggerConstructors<T>,\n __connector: normalized,\n perUser(): ConnectorInstance<A, T> {\n return make(\"per_user\");\n },\n };\n return Object.freeze(instance) as unknown as ConnectorInstance<A, T>;\n }\n\n return make(\"workspace\");\n}\n\nexport function isConnector(value: unknown): value is ConnectorInstance<ActionsTree, TriggersDecl> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { id?: unknown }).id === \"string\" &&\n typeof (value as { __connector?: unknown }).__connector === \"object\"\n );\n}\n\nexport type { ClassifyError, TesserHttp } from \"../internal/http.js\";\nexport type { Schema } from \"../automation.js\";\n", "// Builds the typed client tree handed to automations as ctx.connections.<name> and runs a\n// single Action with input/output validation. The runtime (server: broker-authed http;\n// testing: mocks/cassettes) supplies the invoke/ctx \u2014 the SDK owns the walking and the\n// validation so both sides behave identically.\n\nimport type { ActionCtx, ActionsTree, AnyAction, ConnectorInstance, TriggersDecl } from \"../connector/index.js\";\nimport { isAction } from \"../connector/index.js\";\nimport { validateSchema } from \"./standard-schema.js\";\n\nexport type InvokeAction = (\n actionPath: string[],\n def: AnyAction,\n input: unknown,\n) => Promise<unknown>;\n\nexport function buildConnectorClient(\n connector: ConnectorInstance<ActionsTree, TriggersDecl>,\n invoke: InvokeAction,\n): unknown {\n function walk(tree: ActionsTree, path: string[]): Record<string, unknown> {\n const node: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(tree)) {\n const childPath = [...path, key];\n if (isAction(child)) {\n node[key] = (input: unknown) => invoke(childPath, child, input);\n } else {\n node[key] = walk(child as ActionsTree, childPath);\n }\n }\n return Object.freeze(node);\n }\n return walk(connector.__connector.actions ?? {}, []);\n}\n\n/** Resolve an action by dotted path (used by webhook registrars and MCP exposure). */\nexport function actionAtPath(\n connector: ConnectorInstance<ActionsTree, TriggersDecl>,\n path: string[],\n): AnyAction | undefined {\n let node: ActionsTree | AnyAction | undefined = connector.__connector.actions ?? {};\n for (const key of path) {\n if (node === undefined || isAction(node)) return undefined;\n node = (node as ActionsTree)[key];\n }\n return node !== undefined && isAction(node) ? node : undefined;\n}\n\n/** Validate input \u2192 run \u2192 validate OUR mapped output (never the raw provider response). */\nexport async function runAction(\n def: AnyAction,\n ctx: ActionCtx,\n rawInput: unknown,\n what: string,\n): Promise<unknown> {\n const input = await validateSchema(def.input, rawInput ?? {}, `${what} input`);\n const result = await def.run(ctx, input);\n return validateSchema(def.output, result, `${what} output`);\n}\n\n/** Derived retry-safety (ADR-0012): reads retry; writes retry only with an idempotency\n * key; explicit per-action override wins. */\nexport function isRetrySafe(def: AnyAction, connectorHasIdempotencyHeader: boolean): boolean {\n if (def.retrySafe !== undefined) return def.retrySafe;\n if (def.safety === \"read\") return true;\n return connectorHasIdempotencyHeader;\n}\n", "// Static manifest extraction (ADR-0010 / 0012): the build reads an automation's or\n// connector's requirements WITHOUT executing handlers. Module evaluation is allowed;\n// `run` functions are never called. Powers deploy-halt, connect links, codegen, and CI.\n\nimport type { AutomationDef, ConnectionMap, RetryPolicy, SecretMap } from \"../automation.js\";\nimport type { HarnessDef } from \"../harnesses.js\";\nimport type { ModelDef, ModelSettingsV1, OperatorDef } from \"../operators.js\";\nimport type {\n ActionsTree,\n AnyAction,\n ConnectorInstance,\n ProviderFacts,\n TriggersDecl,\n} from \"../connector/index.js\";\nimport { isAction, isConnector } from \"../connector/index.js\";\nimport type {\n ConnectorTrigger,\n EventTrigger,\n ScheduleTrigger,\n Trigger,\n WebhookTrigger,\n} from \"../triggers.js\";\nimport { encodeJournal, type JsonValue } from \"./codec.js\";\nimport { actionAtPath, isRetrySafe } from \"./client.js\";\n\nexport type TriggerManifest =\n | { kind: \"schedule\"; cron: string; tz?: string }\n | { kind: \"webhook\"; respond: \"async\" | \"sync\"; hasInputSchema: boolean }\n | { kind: \"event\"; event: string }\n | {\n kind: \"connector\";\n connector: string;\n trigger: string;\n params: JsonValue;\n /** The `connections` key this trigger binds to (resolved here, ADR-0013). */\n connection: string;\n /** Author cadence override for poll triggers (clamped to the connector floor). */\n every?: string;\n };\n\nexport interface AutomationManifest {\n id: string;\n trigger: TriggerManifest;\n connections: Record<string, { connector: string; scope: \"workspace\" | \"per_user\" }>;\n secrets: Record<string, { describe?: string }>;\n models: Record<string, { connection: string; connector: string; alias: string; settings?: ModelSettingsV1 }>;\n operators: Record<\n string,\n {\n model: string;\n instructions: string;\n tools: Array<{ path: string; connection: string; action: string; safety: \"read\" | \"write\" }>;\n maxTurns: number;\n }\n >;\n harnesses: Record<\n string,\n {\n connection: string;\n connector: string;\n sandbox: string;\n permissions: string;\n timeout?: string;\n maxOutputBytes?: number;\n }\n >;\n budget?: { models?: { tokens: number; outputTokens: number }; harnesses?: { invocations: number; wallClock?: string } };\n retry?: RetryPolicy;\n concurrency?: { limit: number; hasKey: boolean; onConflict: \"queue\" | \"drop\" };\n hasInputSchema: boolean;\n hasOutputSchema: boolean;\n}\n\nexport class ManifestError extends TypeError {\n constructor(\n readonly automationId: string,\n message: string,\n ) {\n super(`automation \"${automationId}\": ${message}`);\n this.name = \"ManifestError\";\n }\n}\n\n// `any` maps on purpose: Ctx is contravariant in `run`, so a concretely-typed def is not\n// assignable to AutomationDef<\u2026, ConnectionMap, SecretMap>.\nexport function extractAutomationManifest(\n def: AutomationDef<any, any, any, any, any, any, any>,\n): AutomationManifest {\n const connections: AutomationManifest[\"connections\"] = {};\n const connMap = (def.connections ?? {}) as ConnectionMap;\n for (const [key, conn] of Object.entries(connMap)) {\n connections[key] = { connector: conn.id, scope: conn.scope ?? \"workspace\" };\n }\n const secrets: AutomationManifest[\"secrets\"] = {};\n const secretMap = (def.secrets ?? {}) as SecretMap;\n for (const [key, sec] of Object.entries(secretMap)) {\n secrets[key] = sec.describe !== undefined ? { describe: sec.describe } : {};\n }\n\n let trigger: TriggerManifest;\n const t = def.trigger as Trigger<unknown>;\n switch (t.kind) {\n case \"schedule\": {\n const st = t as ScheduleTrigger;\n trigger = { kind: \"schedule\", cron: st.cron, ...(st.tz !== undefined ? { tz: st.tz } : {}) };\n break;\n }\n case \"webhook\": {\n const wt = t as WebhookTrigger<unknown>;\n trigger = { kind: \"webhook\", respond: wt.respond, hasInputSchema: wt.input !== undefined };\n break;\n }\n case \"event\": {\n const et = t as EventTrigger<unknown>;\n trigger = { kind: \"event\", event: et.event.name };\n break;\n }\n case \"connector\": {\n const ct = t as ConnectorTrigger<unknown>;\n // Connection binding (ADR-0013): explicit key, else auto-bind when exactly one\n // connections entry uses this connector.\n let key = ct.connectionKey;\n if (key !== undefined) {\n const bound = connections[key];\n if (!bound) {\n throw new ManifestError(def.id, `trigger names connection \"${key}\" but connections has no such entry`);\n }\n if (bound.connector !== ct.connectorId) {\n throw new ManifestError(\n def.id,\n `trigger connection \"${key}\" is a ${bound.connector} connection, but the trigger belongs to ${ct.connectorId}`,\n );\n }\n } else {\n const candidates = Object.entries(connections).filter(([, c]) => c.connector === ct.connectorId);\n if (candidates.length === 0) {\n throw new ManifestError(\n def.id,\n `trigger ${ct.connectorId}.triggers.${ct.triggerId} requires a ${ct.connectorId} entry in connections`,\n );\n }\n if (candidates.length > 1) {\n throw new ManifestError(\n def.id,\n `trigger ${ct.connectorId}.triggers.${ct.triggerId} is ambiguous \u2014 name it: { connection: \"<key>\" } (candidates: ${candidates.map(([k]) => k).join(\", \")})`,\n );\n }\n key = (candidates[0] as [string, unknown])[0];\n }\n let params: JsonValue;\n try {\n params = encodeJournal(ct.params);\n } catch (err) {\n throw new ManifestError(def.id, `trigger params must be plain data: ${(err as Error).message}`);\n }\n trigger = {\n kind: \"connector\",\n connector: ct.connectorId,\n trigger: ct.triggerId,\n params,\n connection: key,\n ...(ct.every !== undefined ? { every: ct.every } : {}),\n };\n break;\n }\n default:\n throw new ManifestError(def.id, `unknown trigger kind \"${(t as { kind: string }).kind}\"`);\n }\n\n const models: AutomationManifest[\"models\"] = {};\n const modelMap = (def.models ?? {}) as Record<string, ModelDef>;\n for (const [key, m] of Object.entries(modelMap)) {\n const conn = connections[m.connection];\n if (!conn) {\n throw new ManifestError(def.id, `models.${key} names connection \"${m.connection}\" but connections has no such entry`);\n }\n const connector = connMap[m.connection] as ConnectorInstance<any, any> | undefined;\n if (!connector?.__connector.modelProvider) {\n throw new ManifestError(def.id, `models.${key} uses connection \"${m.connection}\" but ${conn.connector} is not model-capable`);\n }\n models[key] = {\n connection: m.connection,\n connector: conn.connector,\n alias: m.alias,\n ...(m.settings !== undefined ? { settings: m.settings } : {}),\n };\n }\n\n const operators: AutomationManifest[\"operators\"] = {};\n const operatorMap = (def.operators ?? {}) as Record<string, OperatorDef>;\n for (const [key, op] of Object.entries(operatorMap)) {\n if (!models[op.model]) {\n throw new ManifestError(def.id, `operators.${key} references unknown model \"${op.model}\"`);\n }\n const tools: AutomationManifest[\"operators\"][string][\"tools\"] = [];\n for (const tool of op.tools) {\n const [connKey, ...actionPath] = tool.split(\".\");\n const conn = connections[connKey!];\n if (!conn) {\n throw new ManifestError(def.id, `operators.${key} tool \"${tool}\" names undeclared connection \"${connKey}\"`);\n }\n const connector = connMap[connKey!] as ConnectorInstance<any, any> | undefined;\n const action = connector ? actionAtPath(connector, actionPath) : undefined;\n if (!action) {\n throw new ManifestError(def.id, `operators.${key} tool \"${tool}\" is not a declared Action`);\n }\n tools.push({ path: tool, connection: connKey!, action: actionPath.join(\".\"), safety: action.safety });\n }\n operators[key] = { model: op.model, instructions: op.instructions, tools, maxTurns: op.maxTurns };\n }\n if (Object.keys(operators).length > 0 && !def.budget?.models) {\n throw new ManifestError(def.id, `budget.models is required when operators are declared`);\n }\n\n const harnesses: AutomationManifest[\"harnesses\"] = {};\n const harnessMap = (def.harnesses ?? {}) as Record<string, HarnessDef>;\n for (const [key, h] of Object.entries(harnessMap)) {\n const conn = connections[h.connection];\n if (!conn) {\n throw new ManifestError(def.id, `harnesses.${key} names connection \"${h.connection}\" but connections has no such entry`);\n }\n const connector = connMap[h.connection] as ConnectorInstance<any, any> | undefined;\n if (!connector?.__connector.harnessProvider) {\n throw new ManifestError(def.id, `harnesses.${key} uses connection \"${h.connection}\" but ${conn.connector} is not harness-capable`);\n }\n harnesses[key] = {\n connection: h.connection,\n connector: conn.connector,\n sandbox: h.sandbox,\n permissions: h.permissions,\n ...(h.timeout !== undefined ? { timeout: h.timeout } : {}),\n ...(h.maxOutputBytes !== undefined ? { maxOutputBytes: h.maxOutputBytes } : {}),\n };\n }\n\n return {\n id: def.id,\n trigger,\n connections,\n secrets,\n models,\n operators,\n harnesses,\n ...(def.budget !== undefined ? { budget: def.budget } : {}),\n ...(def.retry !== undefined ? { retry: def.retry } : {}),\n ...(def.concurrency !== undefined\n ? {\n concurrency: {\n limit: def.concurrency.limit,\n hasKey: typeof def.concurrency.key === \"function\",\n onConflict: def.concurrency.onConflict ?? \"queue\",\n },\n }\n : {}),\n hasInputSchema: def.input !== undefined,\n hasOutputSchema: def.output !== undefined,\n };\n}\n\n// ---- Connector manifests (codegen + Catalog assembly, ADR-0012) ----\n\nexport interface ConnectorManifest {\n id: string;\n describe?: string;\n provider?: string;\n providerFacts?: ProviderFacts;\n baseUrl?: string;\n auth: Record<\n string,\n | { kind: \"oauth2\"; provider?: string; scopes: string[]; flow: string; describe?: string }\n | { kind: \"apiKey\"; in: string; name: string; prefix?: string; describe?: string }\n | { kind: \"basic\"; describe?: string }\n | { kind: \"custom\"; fields: string[]; describe?: string }\n >;\n idempotencyHeader?: string;\n actions: Array<{ path: string; describe?: string; safety: \"read\" | \"write\"; retrySafe: boolean }>;\n modelProvider?: { aliases?: Record<string, string> };\n harnessProvider?: { adapter: string };\n triggers: Array<{\n id: string;\n strategy: \"poll\" | \"webhook\";\n describe?: string;\n registerMode?: \"auto\" | \"manual\";\n intervalDefault?: string;\n intervalFloor?: string;\n event?: string;\n }>;\n webhookVerify?: string;\n}\n\nexport function extractConnectorManifest(\n connector: ConnectorInstance<ActionsTree, TriggersDecl>,\n): ConnectorManifest {\n if (!isConnector(connector)) throw new TypeError(\"extractConnectorManifest: not a connector\");\n const spec = connector.__connector;\n\n const authMap = (\"kind\" in spec.auth ? { default: spec.auth } : spec.auth) as Record<\n string,\n import(\"../connector/index.js\").AuthDecl\n >;\n const auth: ConnectorManifest[\"auth\"] = {};\n for (const [mode, decl] of Object.entries(authMap)) {\n switch (decl.kind) {\n case \"oauth2\":\n auth[mode] = {\n kind: \"oauth2\",\n scopes: [...decl.scopes],\n flow: decl.flow,\n ...(decl.provider !== undefined ? { provider: decl.provider } : {}),\n ...(decl.describe !== undefined ? { describe: decl.describe } : {}),\n };\n break;\n case \"apiKey\":\n auth[mode] = {\n kind: \"apiKey\",\n in: decl.in,\n name: decl.name,\n ...(decl.prefix !== undefined ? { prefix: decl.prefix } : {}),\n ...(decl.describe !== undefined ? { describe: decl.describe } : {}),\n };\n break;\n case \"basic\":\n auth[mode] = { kind: \"basic\", ...(decl.describe !== undefined ? { describe: decl.describe } : {}) };\n break;\n case \"custom\":\n auth[mode] = {\n kind: \"custom\",\n fields: [...(decl.fields ?? [])],\n ...(decl.describe !== undefined ? { describe: decl.describe } : {}),\n };\n break;\n }\n }\n\n const actions: ConnectorManifest[\"actions\"] = [];\n const hasIdem = spec.idempotencyHeader !== undefined;\n (function walk(tree: ActionsTree, path: string[]) {\n for (const [key, child] of Object.entries(tree)) {\n const p = [...path, key];\n if (isAction(child)) {\n const a = child as AnyAction;\n actions.push({\n path: p.join(\".\"),\n safety: a.safety,\n retrySafe: isRetrySafe(a, hasIdem),\n ...(a.describe !== undefined ? { describe: a.describe } : {}),\n });\n } else {\n walk(child as ActionsTree, p);\n }\n }\n })(spec.actions ?? {}, []);\n\n const triggers: ConnectorManifest[\"triggers\"] = [];\n for (const [id, decl] of Object.entries(spec.triggers ?? {})) {\n if (decl.__trigger === \"webhook\") {\n triggers.push({\n id,\n strategy: \"webhook\",\n registerMode: decl.register.mode,\n event: decl.event,\n ...(decl.describe !== undefined ? { describe: decl.describe } : {}),\n });\n } else {\n triggers.push({\n id,\n strategy: \"poll\",\n ...(decl.interval?.default !== undefined ? { intervalDefault: decl.interval.default } : {}),\n ...(decl.interval?.floor !== undefined ? { intervalFloor: decl.interval.floor } : {}),\n ...(decl.describe !== undefined ? { describe: decl.describe } : {}),\n });\n }\n }\n\n return {\n id: spec.id,\n auth,\n actions,\n ...(spec.modelProvider !== undefined\n ? {\n modelProvider: {\n ...(spec.modelProvider.aliases !== undefined ? { aliases: spec.modelProvider.aliases } : {}),\n },\n }\n : {}),\n ...(spec.harnessProvider !== undefined ? { harnessProvider: { adapter: spec.harnessProvider.adapter } } : {}),\n triggers,\n ...(spec.describe !== undefined ? { describe: spec.describe } : {}),\n ...(typeof spec.provider === \"string\"\n ? { provider: spec.provider }\n : spec.provider !== undefined\n ? { provider: spec.provider.id, providerFacts: spec.provider }\n : {}),\n ...(spec.baseUrl !== undefined ? { baseUrl: spec.baseUrl } : {}),\n ...(spec.idempotencyHeader !== undefined ? { idempotencyHeader: spec.idempotencyHeader } : {}),\n ...(spec.webhook !== undefined ? { webhookVerify: spec.webhook.verify.kind } : {}),\n };\n}\n", "import { TerminalError } from \"../errors.js\";\nimport type { AutomationDef, Ctx, Schema, Serializable } from \"../automation.js\";\nimport type { ActionsTree, AnyAction, ConnectorInstance, TriggersDecl } from \"../connector/index.js\";\nimport type {\n ModelDef,\n ModelMessage,\n ModelToolCall,\n ModelToolDescriptor,\n NormalizedModelRequest,\n NormalizedModelResponse,\n OperatorDef,\n Operators,\n} from \"../operators.js\";\nimport { encodeJournal, decodeJournal, type JsonValue } from \"./codec.js\";\nimport { actionAtPath } from \"./client.js\";\nimport { validateSchema } from \"./standard-schema.js\";\n\nexport interface ModelCallInfo {\n automationId: string;\n operatorKey: string;\n modelKey: string;\n model: ModelDef;\n request: NormalizedModelRequest;\n}\n\nexport type ModelCaller = (info: ModelCallInfo) => Promise<NormalizedModelResponse>;\n\ninterface ToolRuntime {\n descriptor: ModelToolDescriptor;\n connectionKey: string;\n actionPath: string[];\n action: AnyAction;\n}\n\ninterface ApprovalPayload {\n approved: boolean;\n reason?: string;\n}\n\nconst approvalSchema: Schema<ApprovalPayload> = {\n \"~standard\": {\n version: 1,\n vendor: \"tesser\",\n validate(value) {\n if (typeof value === \"object\" && value !== null && typeof (value as { approved?: unknown }).approved === \"boolean\") {\n const v = value as { approved: boolean; reason?: unknown };\n return {\n value: {\n approved: v.approved,\n ...(typeof v.reason === \"string\" ? { reason: v.reason } : {}),\n },\n };\n }\n return { issues: [{ message: \"expected { approved: boolean }\" }] };\n },\n },\n};\n\nexport function buildOperators(\n def: AutomationDef<any, any, any, any, any, any, any>,\n ctx: Ctx<any, any, any>,\n callModel: ModelCaller,\n): Operators<any> {\n const usage = { tokens: 0, outputTokens: 0 };\n const out: Record<string, (input: unknown) => Promise<unknown>> = {};\n for (const [operatorKey, op] of Object.entries(def.operators ?? {})) {\n out[operatorKey] = (input: unknown) =>\n executeOperator({ def, ctx, operatorKey, op: op as OperatorDef, input, usage, callModel });\n }\n return Object.freeze(out);\n}\n\nasync function executeOperator(opts: {\n def: AutomationDef<any, any, any, any, any, any, any>;\n ctx: Ctx<any, any, any>;\n operatorKey: string;\n op: OperatorDef;\n input: unknown;\n usage: { tokens: number; outputTokens: number };\n callModel: ModelCaller;\n}): Promise<unknown> {\n const { def, ctx, operatorKey, op } = opts;\n const modelKey = op.model;\n const model = def.models?.[modelKey];\n if (!model) throw new TerminalError(`operator.${operatorKey}: unknown model \"${modelKey}\"`);\n\n const validatedInput = await validateSchema(op.input, opts.input, `operator.${operatorKey} input`);\n const serialInput = toSerializable(validatedInput, `operator.${operatorKey} input`);\n const tools = await resolveTools(def, op, operatorKey);\n const messages: ModelMessage[] = [{ role: \"user\", content: JSON.stringify(serialInput) }];\n const outputJsonSchema = await schemaJson(op.output);\n let tainted = true; // trigger payload / Operator input is coarse-tainted in v1.\n\n for (let turn = 1; turn <= op.maxTurns; turn++) {\n assertBudget(def, model, opts.usage, operatorKey);\n const request: NormalizedModelRequest = {\n operatorKey,\n modelKey,\n alias: model.alias,\n instructions: op.instructions,\n input: serialInput,\n messages,\n tools: tools.map((t) => t.descriptor),\n ...(model.settings !== undefined ? { settings: model.settings } : {}),\n ...(outputJsonSchema !== undefined ? { outputJsonSchema } : {}),\n };\n const response = (await ctx.step(`operator.${operatorKey}.model.${turn}`, async () =>\n toSerializable(\n await opts.callModel({ automationId: def.id, operatorKey, modelKey, model, request }),\n `operator.${operatorKey} model response`,\n ),\n )) as unknown as NormalizedModelResponse;\n validateModelResponse(response, operatorKey, turn);\n addUsage(opts.usage, response);\n assertBudget(def, model, opts.usage, operatorKey);\n\n const toolCalls = response.toolCalls ?? [];\n if (toolCalls.length > 0) {\n messages.push({ role: \"assistant\", content: response.content ?? `requested ${toolCalls.length} tool call(s)` });\n let index = 0;\n for (const call of toolCalls) {\n index++;\n const tool = toolForCall(tools, call);\n if (!tool) {\n throw new TerminalError(`operator.${operatorKey}: model requested undeclared tool \"${call.name}\"`);\n }\n if (tool.action.safety === \"write\") {\n const approval = await ctx.waitForSignal(`operator.${operatorKey}.approval`, {\n schema: approvalSchema,\n timeout: \"1h\",\n });\n if (approval === null) {\n throw new TerminalError(`operator.${operatorKey}: approval timed out for write tool ${tool.descriptor.path}`);\n }\n if (!approval.approved) {\n throw new TerminalError(`operator.${operatorKey}: approval denied for write tool ${tool.descriptor.path}`);\n }\n }\n const toolResult = await ctx.step(`operator.${operatorKey}.tool.${turn}.${index}.${tool.descriptor.path}`, async () => {\n const fn = actionFunction(ctx.connections as Record<string, unknown>, tool.connectionKey, tool.actionPath);\n return toSerializable(await fn(call.input), `operator.${operatorKey} tool ${tool.descriptor.path} output`);\n });\n if (tool.action.safety === \"read\") tainted = true;\n messages.push({\n role: \"tool\",\n toolCallId: call.id,\n content: minimizeToolOutput(toolResult, { tainted }),\n });\n }\n continue;\n }\n\n const rawOutput = response.output !== undefined ? response.output : parseJson(response.content, operatorKey, turn);\n return validateSchema(op.output, rawOutput, `operator.${operatorKey} output`);\n }\n throw new TerminalError(`operator.${operatorKey}: exceeded maxTurns (${op.maxTurns})`);\n}\n\nasync function resolveTools(\n def: AutomationDef<any, any, any, any, any, any, any>,\n op: OperatorDef,\n operatorKey: string,\n): Promise<ToolRuntime[]> {\n const out: ToolRuntime[] = [];\n const connections = (def.connections ?? {}) as Record<string, ConnectorInstance<ActionsTree, TriggersDecl>>;\n for (const toolPath of op.tools) {\n const [connectionKey, ...actionPath] = toolPath.split(\".\");\n const connector = connections[connectionKey!];\n if (!connector) throw new TerminalError(`operator.${operatorKey}: undeclared tool connection \"${connectionKey}\"`);\n const action = actionAtPath(connector, actionPath);\n if (!action) throw new TerminalError(`operator.${operatorKey}: tool \"${toolPath}\" is not a declared Action`);\n const inputSchema = await schemaJson(action.input as Schema<unknown>);\n out.push({\n connectionKey: connectionKey!,\n actionPath,\n action,\n descriptor: {\n name: toolName(toolPath),\n path: toolPath,\n ...(action.describe !== undefined ? { description: action.describe } : {}),\n ...(inputSchema !== undefined ? { inputSchema } : {}),\n },\n });\n }\n return out;\n}\n\nfunction toolForCall(tools: ToolRuntime[], call: ModelToolCall): ToolRuntime | undefined {\n return tools.find((t) => call.name === t.descriptor.name || call.name === t.descriptor.path);\n}\n\nexport function toolName(path: string): string {\n return path.replace(/[^A-Za-z0-9_-]/g, \"__\");\n}\n\nfunction actionFunction(\n connections: Record<string, unknown>,\n connectionKey: string,\n actionPath: string[],\n): (input: unknown) => Promise<unknown> {\n let node = connections[connectionKey];\n for (const seg of actionPath) node = (node as Record<string, unknown> | undefined)?.[seg];\n if (typeof node !== \"function\") {\n throw new TerminalError(`operator tool ${connectionKey}.${actionPath.join(\".\")} is not callable`);\n }\n return node as (input: unknown) => Promise<unknown>;\n}\n\nfunction validateModelResponse(response: NormalizedModelResponse, operatorKey: string, turn: number): void {\n if (typeof response !== \"object\" || response === null) {\n throw new TerminalError(`operator.${operatorKey} turn ${turn}: model adapter returned a non-object response`);\n }\n if (!response.usage || typeof response.usage.inputTokens !== \"number\" || typeof response.usage.outputTokens !== \"number\") {\n throw new TerminalError(`operator.${operatorKey} turn ${turn}: model response missing usage tokens`);\n }\n}\n\nfunction addUsage(usage: { tokens: number; outputTokens: number }, response: NormalizedModelResponse): void {\n usage.tokens += response.usage.inputTokens + response.usage.outputTokens + (response.usage.reasoningTokens ?? 0);\n usage.outputTokens += response.usage.outputTokens;\n}\n\nfunction assertBudget(\n def: AutomationDef<any, any, any, any, any, any, any>,\n model: ModelDef,\n usage: { tokens: number; outputTokens: number },\n operatorKey: string,\n): void {\n const budget = def.budget?.models;\n if (!budget) throw new TerminalError(`operator.${operatorKey}: budget.models is required`);\n if (usage.tokens >= budget.tokens) {\n throw new TerminalError(`operator.${operatorKey}: model token budget exceeded (${usage.tokens}/${budget.tokens})`);\n }\n if (usage.outputTokens >= budget.outputTokens) {\n throw new TerminalError(\n `operator.${operatorKey}: model output-token budget exceeded (${usage.outputTokens}/${budget.outputTokens})`,\n );\n }\n const maxOut = model.settings?.maxOutputTokens;\n if (maxOut !== undefined && maxOut > budget.outputTokens - usage.outputTokens) {\n throw new TerminalError(`operator.${operatorKey}: model maxOutputTokens exceeds remaining output-token budget`);\n }\n}\n\nfunction parseJson(content: string | undefined, operatorKey: string, turn: number): unknown {\n if (!content) throw new TerminalError(`operator.${operatorKey} turn ${turn}: model returned no output`);\n const trimmed = content.trim().replace(/^```(?:json)?\\s*/i, \"\").replace(/\\s*```$/, \"\");\n try {\n return JSON.parse(trimmed);\n } catch (cause) {\n throw new TerminalError(`operator.${operatorKey} turn ${turn}: model output was not JSON`, { cause });\n }\n}\n\nfunction toSerializable(value: unknown, what: string): Serializable {\n try {\n return decodeJournal(encodeJournal(value)) as Serializable;\n } catch (cause) {\n throw new TerminalError(`${what} is not serializable`, { cause });\n }\n}\n\nfunction minimizeToolOutput(value: Serializable, opts: { tainted: boolean }): string {\n const raw = JSON.stringify({ tainted: opts.tainted, value: encodeJournal(value) });\n return raw.length <= 4000 ? raw : raw.slice(0, 3997) + \"...\";\n}\n\nasync function schemaJson(schema: Schema<unknown>): Promise<Serializable | undefined> {\n const std = (schema as { \"~standard\"?: { vendor?: string } })[\"~standard\"];\n try {\n let json: unknown;\n const direct = schema as unknown as { toJSONSchema?: () => unknown };\n if (typeof direct.toJSONSchema === \"function\") json = direct.toJSONSchema();\n else if (std?.vendor === \"zod\") {\n const zod = (await import(\"zod\")) as unknown as {\n toJSONSchema?: (s: unknown, opts?: unknown) => unknown;\n z?: { toJSONSchema?: (s: unknown, opts?: unknown) => unknown };\n };\n const convert = zod.toJSONSchema ?? zod.z?.toJSONSchema;\n if (convert) json = convert(schema, { unrepresentable: \"any\" });\n }\n if (json === undefined) return undefined;\n return decodeJournal(encodeJournal(json as JsonValue)) as Serializable;\n } catch {\n return undefined;\n }\n}\n", "import { TerminalError } from \"../errors.js\";\nimport type { AutomationDef, Ctx, Serializable } from \"../automation.js\";\nimport type { HarnessDef, HarnessRunRequest, HarnessRunResult, Harnesses } from \"../harnesses.js\";\nimport { encodeJournal, decodeJournal } from \"./codec.js\";\nimport { validateSchema } from \"./standard-schema.js\";\n\nexport interface HarnessCallInfo {\n automationId: string;\n harnessKey: string;\n harness: HarnessDef;\n request: HarnessRunRequest<unknown>;\n}\n\nexport type HarnessCaller = (info: HarnessCallInfo) => Promise<HarnessRunResult<unknown>>;\n\nexport function buildHarnesses(\n def: AutomationDef<any, any, any, any, any, any, any>,\n _ctx: Ctx<any, any, any, any>,\n callHarness: HarnessCaller,\n): Harnesses<any> {\n const out: Record<string, { run: (request: HarnessRunRequest<unknown>) => Promise<HarnessRunResult<unknown>> }> = {};\n const harnesses = (def.harnesses ?? {}) as Record<string, HarnessDef>;\n for (const [harnessKey, h] of Object.entries(harnesses)) {\n out[harnessKey] = {\n run: async (request) => {\n if (!request || typeof request.prompt !== \"string\" || request.prompt.length === 0) {\n throw new TerminalError(`harness.${harnessKey}: prompt is required`);\n }\n if (!request.output) throw new TerminalError(`harness.${harnessKey}: output schema is required`);\n const raw = await callHarness({ automationId: def.id, harnessKey, harness: h, request });\n const serial = toSerializable(raw, `harness.${harnessKey} result`) as unknown as HarnessRunResult<unknown>;\n const output = await validateSchema(request.output, serial.output, `harness.${harnessKey} output`);\n return { ...serial, output: toSerializable(output, `harness.${harnessKey} output`) as never };\n },\n };\n }\n return Object.freeze(out) as unknown as Harnesses<any>;\n}\n\nfunction toSerializable(value: unknown, what: string): Serializable {\n try {\n return decodeJournal(encodeJournal(value)) as Serializable;\n } catch (cause) {\n throw new TerminalError(`${what} is not serializable`, { cause });\n }\n}\n", "// The deterministic exit-code taxonomy (ADR-0007). Agents branch on these; never reuse\n// a number for a different meaning.\n\nexport const EXIT = {\n OK: 0,\n /** Unexpected/internal error. */\n ERROR: 1,\n /** Usage error \u2014 bad arguments or no linked project. */\n USAGE: 2,\n /** Tests failed (machine-actionable detail on stdout with --json). */\n TESTS_FAILED: 3,\n /** Deploy halted: credentials needed \u2014 a connect link is on stdout. */\n HALTED_CREDENTIALS: 4,\n /** Could not reach or authenticate against the instance. */\n AUTH: 5,\n /** Resource not found. */\n NOT_FOUND: 6,\n /** Conflict / invalid state for the requested operation. */\n CONFLICT: 7,\n /** Deploy failed (build error or red test gate). */\n DEPLOY_FAILED: 8,\n} as const;\n\nexport type ExitCode = (typeof EXIT)[keyof typeof EXIT];\n", "// Machine-first I/O contract (ADR-0007): stdout = data (one JSON document with --json),\n// stderr = logs/progress, deterministic exit codes.\n\nimport { EXIT, type ExitCode } from \"./exit-codes.js\";\n\nexport class Output {\n constructor(readonly json: boolean) {}\n\n /** Emit the command's data result. `human` renders the no-JSON form. */\n data(value: unknown, human?: (v: never) => string): void {\n if (this.json) {\n process.stdout.write(JSON.stringify(value, null, 2) + \"\\n\");\n } else {\n process.stdout.write((human ? human(value as never) : JSON.stringify(value, null, 2)) + \"\\n\");\n }\n }\n\n /** Progress/notes \u2192 stderr, never stdout. */\n log(msg: string): void {\n process.stderr.write(msg + \"\\n\");\n }\n\n fail(code: ExitCode, message: string, extra?: Record<string, unknown>): never {\n if (this.json) {\n process.stdout.write(JSON.stringify({ error: { code, message, ...extra } }, null, 2) + \"\\n\");\n } else {\n process.stderr.write(`error: ${message}\\n`);\n if (extra) process.stderr.write(JSON.stringify(extra, null, 2) + \"\\n\");\n }\n process.exit(code);\n }\n}\n\nexport class CliError extends Error {\n constructor(\n readonly code: ExitCode,\n message: string,\n readonly extra?: Record<string, unknown>,\n ) {\n super(message);\n }\n}\n\nexport function toExit(err: unknown, out: Output): never {\n if (err instanceof CliError) out.fail(err.code, err.message, err.extra);\n out.fail(EXIT.ERROR, err instanceof Error ? err.message : String(err));\n}\n", "// Thin control-plane client. Every command is a shell over this (ADR-0007).\n\nimport { EXIT } from \"./exit-codes.js\";\nimport { CliError } from \"./output.js\";\n\nexport class ApiClient {\n constructor(\n readonly baseUrl: string,\n readonly token: string | undefined,\n ) {}\n\n async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n if (!this.token) {\n throw new CliError(\n EXIT.AUTH,\n \"no API token \u2014 run `tesser login --url <instance> --token <tsk_\u2026>` or set TESSER_TOKEN\",\n );\n }\n let res: Response;\n try {\n res = await fetch(`${this.baseUrl}/api${path}`, {\n method,\n headers: {\n authorization: `Bearer ${this.token}`,\n ...(body !== undefined ? { \"content-type\": \"application/json\" } : {}),\n },\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n });\n } catch (cause) {\n throw new CliError(EXIT.AUTH, `cannot reach instance at ${this.baseUrl} (${String(cause)})`);\n }\n const text = await res.text();\n let parsed: unknown;\n try {\n parsed = text.length > 0 ? JSON.parse(text) : null;\n } catch {\n parsed = { raw: text };\n }\n if (!res.ok) {\n const errBody = parsed as { error?: { code?: string; message?: string } };\n const message = errBody?.error?.message ?? `instance responded ${res.status}`;\n if (res.status === 401) throw new CliError(EXIT.AUTH, message);\n if (res.status === 404) throw new CliError(EXIT.NOT_FOUND, message);\n if (res.status === 400) throw new CliError(EXIT.USAGE, message);\n if (res.status === 409) throw new CliError(EXIT.CONFLICT, message);\n throw new CliError(EXIT.ERROR, message);\n }\n return parsed as T;\n }\n\n get<T>(path: string): Promise<T> {\n return this.request(\"GET\", path);\n }\n post<T>(path: string, body?: unknown): Promise<T> {\n return this.request(\"POST\", path, body);\n }\n put<T>(path: string, body?: unknown): Promise<T> {\n return this.request(\"PUT\", path, body);\n }\n delete<T>(path: string): Promise<T> {\n return this.request(\"DELETE\", path);\n }\n}\n", "// Profiles + the link manifest. Token resolution: --token > TESSER_TOKEN > profile.\n// Instance URL: --url > tesser.json > TESSER_URL > profile > localhost default.\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nexport interface Profile {\n url?: string;\n token?: string;\n}\nexport interface CliConfig {\n current?: string;\n profiles?: Record<string, Profile>;\n}\n\n/** tesser.json \u2014 the link manifest: ties this repo (Project) to an instance (ADR-0006). */\nexport interface LinkManifest {\n project: string;\n instance?: string;\n}\n\nconst CONFIG_PATH = join(\n process.env[\"TESSER_CONFIG_DIR\"] ?? join(homedir(), \".config\", \"tesser\"),\n \"config.json\",\n);\n\nexport function readConfig(): CliConfig {\n try {\n return JSON.parse(readFileSync(CONFIG_PATH, \"utf8\")) as CliConfig;\n } catch {\n return {};\n }\n}\n\nexport function writeConfig(config: CliConfig): void {\n mkdirSync(dirname(CONFIG_PATH), { recursive: true });\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + \"\\n\", { mode: 0o600 });\n}\n\nexport function activeProfile(config: CliConfig, name?: string): Profile {\n const profileName = name ?? config.current ?? \"default\";\n return config.profiles?.[profileName] ?? {};\n}\n\nexport function findProjectRoot(start = process.cwd()): string | null {\n let dir = start;\n for (;;) {\n if (existsSync(join(dir, \"tesser.json\"))) return dir;\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nexport function readLinkManifest(root: string): LinkManifest | null {\n try {\n return JSON.parse(readFileSync(join(root, \"tesser.json\"), \"utf8\")) as LinkManifest;\n } catch {\n return null;\n }\n}\n\nexport interface ResolvedTarget {\n url: string;\n token: string | undefined;\n project: string | undefined;\n projectRoot: string | null;\n}\n\nexport function resolveTarget(opts: { url?: string; token?: string; profile?: string }): ResolvedTarget {\n const config = readConfig();\n const profile = activeProfile(config, opts.profile);\n const projectRoot = findProjectRoot();\n const manifest = projectRoot ? readLinkManifest(projectRoot) : null;\n return {\n url:\n opts.url ??\n manifest?.instance ??\n process.env[\"TESSER_URL\"] ??\n profile.url ??\n \"http://localhost:8377\",\n token: opts.token ?? process.env[\"TESSER_TOKEN\"] ?? profile.token,\n project: manifest?.project,\n projectRoot,\n };\n}\n", "// Local project introspection: discover automations, bundle one (esbuild), load its def\n// for smoke/build checks. (Apache-side implementation \u2014 the CLI never links the server.)\n\nimport { mkdtempSync, existsSync, readdirSync, statSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { build } from \"esbuild\";\nimport type { AutomationDef } from \"@devosurf/tesser-sdk\";\n\nexport interface LocalAutomation {\n automationId: string;\n dir: string;\n entry: string;\n hasTests: boolean;\n}\n\nexport function discoverLocalAutomations(projectRoot: string): LocalAutomation[] {\n const root = join(projectRoot, \"automations\");\n if (!existsSync(root)) return [];\n const out: LocalAutomation[] = [];\n for (const name of readdirSync(root).sort()) {\n const dir = join(root, name);\n if (!statSync(dir).isDirectory()) continue;\n const entry = join(dir, \"index.ts\");\n if (!existsSync(entry)) continue;\n const hasTests = readdirSync(dir).some((f) => /\\.test\\.(ts|js|mts|mjs)$/.test(f));\n out.push({ automationId: name, dir, entry, hasTests });\n }\n return out;\n}\n\nexport async function loadAutomationDef(entry: string): Promise<AutomationDef<any, any, any, any, any, any, any>> {\n const outDir = mkdtempSync(join(tmpdir(), \"tesser-cli-\"));\n const outFile = join(outDir, \"bundle.mjs\");\n await build({\n entryPoints: [entry],\n outfile: outFile,\n bundle: true,\n platform: \"node\",\n format: \"esm\",\n target: \"node20\",\n packages: \"bundle\",\n logLevel: \"silent\",\n });\n const mod = (await import(pathToFileURL(outFile).href)) as { default?: AutomationDef<any, any, any, any, any, any, any> };\n if (!mod.default || typeof mod.default.run !== \"function\") {\n throw new Error(`${entry}: no default export from defineAutomation`);\n }\n return mod.default;\n}\n", "import { spawn } from \"node:child_process\";\nimport { EXIT } from \"../exit-codes.js\";\nimport { CliError, type Output } from \"../output.js\";\n\nexport interface HarnessAuthOpts {\n connect: string;\n mode?: string;\n scope?: string;\n endUserId?: string;\n tokenStdin?: boolean;\n fromEnv?: string;\n bin?: string;\n}\n\nexport async function authClaudeCode(out: Output, instanceUrl: string, opts: HarnessAuthOpts): Promise<void> {\n const mode = opts.mode ?? \"subscription\";\n if (mode !== \"subscription\" && mode !== \"apiKey\") {\n throw new CliError(EXIT.USAGE, \"claude-code auth mode must be subscription or apiKey\");\n }\n const token =\n opts.tokenStdin === true || opts.fromEnv !== undefined\n ? await tokenFromPipeOrEnv(opts)\n : mode === \"subscription\"\n ? await runClaudeSetupToken(out, opts.bin ?? \"claude\")\n : await tokenFromPipeOrEnv({ ...opts, tokenStdin: true });\n await postConnection({\n instanceUrl,\n connect: opts.connect,\n connector: \"claude-code\",\n mode,\n scope: opts.scope ?? \"workspace\",\n ...(opts.endUserId !== undefined ? { endUserId: opts.endUserId } : {}),\n fields: mode === \"subscription\" ? { oauth_token: token } : { api_key: token },\n });\n out.data({ connector: \"claude-code\", mode, connected: true }, () => `claude-code ${mode} connected \u2713`);\n}\n\nexport async function authPi(out: Output, instanceUrl: string, opts: HarnessAuthOpts): Promise<void> {\n const mode = opts.mode ?? \"anthropicOAuth\";\n if (mode !== \"anthropicOAuth\" && mode !== \"anthropicApiKey\") {\n throw new CliError(EXIT.USAGE, \"pi auth mode must be anthropicOAuth or anthropicApiKey\");\n }\n const token = await tokenFromPipeOrEnv(opts);\n await postConnection({\n instanceUrl,\n connect: opts.connect,\n connector: \"pi\",\n mode,\n scope: opts.scope ?? \"workspace\",\n ...(opts.endUserId !== undefined ? { endUserId: opts.endUserId } : {}),\n fields: mode === \"anthropicOAuth\" ? { oauth_token: token } : { api_key: token },\n });\n out.data({ connector: \"pi\", mode, connected: true }, () => `pi ${mode} connected \u2713`);\n}\n\nasync function tokenFromPipeOrEnv(opts: HarnessAuthOpts): Promise<string> {\n if (opts.fromEnv !== undefined) {\n const value = process.env[opts.fromEnv];\n if (!value) throw new CliError(EXIT.USAGE, `env ${opts.fromEnv} is empty or missing`);\n return value;\n }\n if (opts.tokenStdin !== true) {\n throw new CliError(EXIT.USAGE, \"pass --token-stdin or --from-env <NAME> so the token never appears in argv\");\n }\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(chunk as Buffer);\n const value = Buffer.concat(chunks).toString(\"utf8\").trim();\n if (value.length === 0) throw new CliError(EXIT.USAGE, \"empty token on stdin\");\n return value;\n}\n\nasync function runClaudeSetupToken(out: Output, bin: string): Promise<string> {\n out.log(\"starting `claude setup-token`; complete the browser login if prompted...\");\n const raw = await runInteractiveCapture(bin, [\"setup-token\"]);\n const token = extractClaudeToken(raw);\n if (!token) {\n throw new CliError(\n EXIT.ERROR,\n \"could not find a Claude Code OAuth token in `claude setup-token` output; rerun with `claude setup-token | tesser auth claude-code --connect <url> --token-stdin`\",\n );\n }\n return token;\n}\n\nfunction runInteractiveCapture(command: string, args: string[]): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, { stdio: [\"inherit\", \"pipe\", \"pipe\"] });\n let raw = \"\";\n const onData = (buf: Buffer) => {\n const text = buf.toString(\"utf8\");\n raw += text;\n process.stderr.write(sanitizeSetupOutput(text));\n };\n child.stdout.on(\"data\", onData);\n child.stderr.on(\"data\", onData);\n child.on(\"error\", reject);\n child.on(\"close\", (code) => {\n if (code === 0) resolve(raw);\n else reject(new CliError(EXIT.ERROR, `${command} ${args.join(\" \")} exited ${code ?? 1}`));\n });\n });\n}\n\nfunction extractClaudeToken(raw: string): string | null {\n const envMatch = raw.match(/CLAUDE_CODE_OAUTH_TOKEN\\s*=\\s*([^\\s]+)/);\n if (envMatch?.[1]) return envMatch[1].trim().replace(/^['\"]|['\"]$/g, \"\");\n const candidates = raw\n .split(/\\r?\\n/)\n .map((l) => l.trim())\n .filter((l) => /^[A-Za-z0-9._-]{40,}$/.test(l) && !/^https?:/i.test(l));\n return candidates.at(-1) ?? null;\n}\n\nfunction sanitizeSetupOutput(text: string): string {\n return text.replace(/(CLAUDE_CODE_OAUTH_TOKEN\\s*=\\s*)[^\\s]+/g, \"$1[redacted]\").replace(/\\b[A-Za-z0-9._-]{64,}\\b/g, \"[redacted-token]\");\n}\n\nasync function postConnection(opts: {\n instanceUrl: string;\n connect: string;\n connector: string;\n mode: string;\n scope: string;\n endUserId?: string;\n fields: Record<string, string>;\n}): Promise<void> {\n const url = connectPostUrl(opts.instanceUrl, opts.connect);\n const body = new URLSearchParams({ connector: opts.connector, mode: opts.mode, scope: opts.scope });\n if (opts.endUserId !== undefined) body.set(\"end_user_id\", opts.endUserId);\n for (const [key, value] of Object.entries(opts.fields)) body.set(`field_${key}`, value);\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: body.toString(),\n redirect: \"manual\",\n });\n if (res.status >= 300 && res.status < 400) return;\n const text = await res.text().catch(() => \"\");\n throw new CliError(EXIT.ERROR, `connect page rejected ${opts.connector} ${opts.mode}: ${res.status}${text ? ` ${text}` : \"\"}`);\n}\n\nfunction connectPostUrl(instanceUrl: string, connect: string): string {\n if (/^https?:\\/\\//i.test(connect)) {\n const u = new URL(connect);\n const match = u.pathname.match(/\\/connect\\/([^/]+)/);\n if (!match?.[1]) throw new CliError(EXIT.USAGE, \"--connect must be a Tesser /connect/<token> URL or token\");\n return `${u.origin}/connect/${match[1]}/connection`;\n }\n const token = connect.replace(/^\\/?connect\\//, \"\");\n if (!/^cl_[a-f0-9]+$/i.test(token)) throw new CliError(EXIT.USAGE, \"--connect must be a Tesser /connect/<token> URL or token\");\n return `${instanceUrl.replace(/\\/$/, \"\")}/connect/${token}/connection`;\n}\n\nexport const _test = { extractClaudeToken, sanitizeSetupOutput, connectPostUrl };\n", "// `tesser deploy`: trigger a sync (git ref, or --local working tree), poll to a settled\n// state, surface the connect link on halt (exit 4), failures on red (exit 8).\n\nimport type { ApiClient } from \"../client.js\";\nimport { EXIT } from \"../exit-codes.js\";\nimport { CliError, Output } from \"../output.js\";\n\ninterface DeployState {\n repo?: { status: string; report?: DeployReport | null; error?: string | null } | null;\n live?: unknown[];\n}\ninterface DeployReport {\n sha?: string;\n env?: string;\n built?: string[];\n unchanged?: string[];\n failed?: Array<{ automation: string; stage: string; reason: string }>;\n removed?: string[];\n connectUrl?: string;\n manual?: unknown[];\n}\n\nexport async function deploy(\n out: Output,\n api: ApiClient,\n project: string,\n opts: { ref?: string | undefined; local?: string | undefined; timeoutMs?: number; wait?: boolean },\n): Promise<never> {\n await api.post(`/projects/${project}/sync`, {\n ...(opts.ref !== undefined ? { ref: opts.ref } : {}),\n ...(opts.local !== undefined ? { localPath: opts.local } : {}),\n });\n out.log(`sync queued for ${project}${opts.local ? \" (local tree)\" : opts.ref ? ` @ ${opts.ref}` : \"\"}`);\n\n if (opts.wait === false) {\n out.data({ queued: true });\n process.exit(EXIT.OK);\n }\n\n const deadline = Date.now() + (opts.timeoutMs ?? 10 * 60_000);\n let last: DeployState = {};\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, 750));\n last = await api.get<DeployState>(`/projects/${project}/deploys/latest`);\n const status = last.repo?.status;\n if (status === \"syncing\" || status === \"idle\" || status === undefined) continue;\n\n const report = (last.repo?.report ?? {}) as DeployReport;\n if (status === \"halted-credentials\") {\n out.data(\n { status, connectUrl: report.connectUrl, report },\n () =>\n `deploy HALTED \u2014 credentials needed.\\nOpen this link in a browser to connect:\\n ${report.connectUrl}\\nThen rerun: tesser deploy${opts.local ? \" --local\" : \"\"}`,\n );\n process.exit(EXIT.HALTED_CREDENTIALS);\n }\n if (status === \"failed\") {\n out.data({ status, report, error: last.repo?.error }, () =>\n [\n \"deploy FAILED:\",\n ...(report.failed ?? []).map((f) => ` ${f.automation} [${f.stage}]: ${f.reason.split(\"\\n\")[0]}`),\n ...(last.repo?.error ? [` ${last.repo.error}`] : []),\n ].join(\"\\n\"),\n );\n process.exit(EXIT.DEPLOY_FAILED);\n }\n if (status === \"synced\") {\n out.data({ status, report, live: last.live }, () =>\n [\n `deploy OK @ ${report.sha?.slice(0, 8) ?? \"?\"} \u2192 ${report.env}`,\n ` built: ${report.built?.join(\", \") || \"(none)\"}`,\n ` unchanged: ${report.unchanged?.join(\", \") || \"(none)\"}`,\n ...(report.removed?.length ? [` removed: ${report.removed.join(\", \")}`] : []),\n ].join(\"\\n\"),\n );\n process.exit(EXIT.OK);\n }\n }\n throw new CliError(EXIT.ERROR, \"timed out waiting for the deploy to settle\", { last: last as never });\n}\n", "// `tesser dev`: a real local instance with zero setup \u2014 spawns the tesser-server BINARY\n// (process boundary; the Apache CLI never links AGPL code) on embedded PGlite, deploys\n// the local working tree through the REAL reconciler, and redeploys on change.\n\nimport { randomBytes } from \"node:crypto\";\nimport { spawn } from \"node:child_process\";\nimport { existsSync, watch } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { ApiClient } from \"../client.js\";\nimport { EXIT } from \"../exit-codes.js\";\nimport { CliError, Output } from \"../output.js\";\n\n/** Returns [command, ...args]. Prefers the package's real .mjs entry (run with node);\n * falls back to the .bin shim executed directly (it is a shell script, not JS). */\nfunction findServerBin(start: string): string[] | null {\n const envBin = process.env[\"TESSER_SERVER_BIN\"];\n if (envBin && existsSync(envBin)) {\n return envBin.endsWith(\".mjs\") || envBin.endsWith(\".js\") ? [process.execPath, envBin] : [envBin];\n }\n let dir = start;\n for (;;) {\n const entry = join(dir, \"node_modules\", \"@devosurf\", \"tesser-server\", \"bin\", \"tesser-server.mjs\");\n if (existsSync(entry)) return [process.execPath, entry];\n const shim = join(dir, \"node_modules\", \".bin\", \"tesser-server\");\n if (existsSync(shim)) return [shim];\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nexport async function dev(\n out: Output,\n projectRoot: string,\n project: string,\n opts: { port?: number; watch?: boolean },\n): Promise<void> {\n const bin = findServerBin(projectRoot);\n if (!bin) {\n throw new CliError(\n EXIT.USAGE,\n \"tesser-server binary not found \u2014 install @devosurf/tesser-server (pnpm add -D @devosurf/tesser-server) or set TESSER_SERVER_BIN\",\n );\n }\n const port = opts.port ?? 8377;\n const token = `tsk_${randomBytes(24).toString(\"hex\")}`;\n const url = `http://localhost:${port}`;\n\n out.log(`starting local instance on ${url} (embedded postgres at .tesser/pglite)`);\n const child = spawn(bin[0]!, bin.slice(1), {\n env: {\n ...process.env,\n PORT: String(port),\n TESSER_DATA_DIR: join(projectRoot, \".tesser\"),\n TESSER_BOOTSTRAP_TOKEN: token,\n TESSER_BASE_URL: url,\n DATABASE_URL: \"\",\n },\n stdio: [\"ignore\", \"inherit\", \"inherit\"],\n });\n const stop = () => {\n child.kill(\"SIGTERM\");\n };\n process.on(\"SIGINT\", () => {\n stop();\n process.exit(0);\n });\n process.on(\"SIGTERM\", stop);\n\n const api = new ApiClient(url, token);\n const deadline = Date.now() + 30_000;\n for (;;) {\n try {\n await api.get(\"/health\");\n break;\n } catch {\n if (Date.now() > deadline) throw new CliError(EXIT.ERROR, \"local instance did not come up\");\n await new Promise((r) => setTimeout(r, 300));\n }\n }\n await api.post(\"/projects\", { name: project });\n\n const syncOnce = async () => {\n await api.post(`/projects/${project}/sync`, { localPath: projectRoot });\n // poll to settled, print, but DON'T exit (deploy() exits \u2014 inline a light loop)\n for (let i = 0; i < 600; i++) {\n await new Promise((r) => setTimeout(r, 500));\n const state = await api.get<{ repo?: { status: string; report?: { connectUrl?: string; failed?: unknown[] } } }>(\n `/projects/${project}/deploys/latest`,\n );\n const status = state.repo?.status;\n if (status === \"syncing\") continue;\n if (status === \"halted-credentials\") {\n out.log(`HALTED \u2014 connect credentials in your browser:\\n ${state.repo?.report?.connectUrl}`);\n } else if (status === \"failed\") {\n out.log(`deploy failed: ${JSON.stringify(state.repo?.report?.failed ?? [])}`);\n } else if (status === \"synced\") {\n out.log(`deployed \u2713 \u2014 webhooks at ${url}/hooks/${project}/<automation>`);\n }\n return;\n }\n };\n await syncOnce();\n\n if (opts.watch !== false) {\n let timer: NodeJS.Timeout | null = null;\n watch(join(projectRoot, \"automations\"), { recursive: true }, () => {\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n out.log(\"change detected \u2014 redeploying\u2026\");\n void syncOnce();\n }, 400);\n });\n out.log(\"watching automations/ for changes (ctrl-c to stop)\");\n await new Promise(() => {}); // run until interrupted\n } else {\n stop();\n }\n}\n", "// `tesser init <name>`: scaffold a Project \u2014 the linked repo unit (ADR-0006). One\n// automation per directory; colocated tests; git is the source of truth.\n\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { EXIT } from \"../exit-codes.js\";\nimport { CliError, Output } from \"../output.js\";\nimport { projectPackageJson, tesserGitignore, writeProjectAgentInstructions, writeTesserGeneratedDocs } from \"./project-docs.js\";\n\nconst EXAMPLE_AUTOMATION = `import { defineAutomation, onWebhook } from \"@devosurf/tesser-sdk\";\nimport { z } from \"zod\";\n\nexport default defineAutomation({\n id: \"hello\",\n trigger: onWebhook({ input: z.object({ name: z.string().default(\"world\") }) }),\n output: z.object({ greeting: z.string() }),\n\n run: async (input, ctx) => {\n // Plain TypeScript. Durability ONLY from ctx.step() (every side effect goes inside one).\n const greeting = await ctx.step(\"compose\", async () => \\`hello, \\${input.name}!\\`);\n return { greeting };\n },\n});\n`;\n\nconst EXAMPLE_TEST = `import { createTest } from \"@devosurf/tesser-testing\";\nimport automation from \"./index\";\n\ntest(\"greets by name\", async () => {\n const t = createTest({ automation });\n const { result } = await t.run({ input: { name: \"tesser\" } });\n expect(result).toEqual({ greeting: \"hello, tesser!\" });\n});\n`;\n\nexport function init(out: Output, name: string, opts: { dir?: string | undefined; instance?: string | undefined }, version: string): void {\n if (!/^[a-z][a-z0-9-]{0,63}$/.test(name)) {\n throw new CliError(EXIT.USAGE, \"project name must be kebab-case\");\n }\n const root = join(opts.dir ?? process.cwd(), name);\n if (existsSync(join(root, \"tesser.json\"))) {\n throw new CliError(EXIT.CONFLICT, `${root} is already a Tesser project`);\n }\n mkdirSync(join(root, \"automations\", \"hello\"), { recursive: true });\n\n writeFileSync(\n join(root, \"tesser.json\"),\n JSON.stringify({ project: name, ...(opts.instance !== undefined ? { instance: opts.instance } : {}) }, null, 2) + \"\\n\",\n );\n writeFileSync(\n join(root, \"package.json\"),\n JSON.stringify(\n projectPackageJson(name, version),\n null,\n 2,\n ) + \"\\n\",\n );\n writeFileSync(\n join(root, \"tsconfig.json\"),\n JSON.stringify(\n {\n compilerOptions: {\n target: \"ES2022\",\n module: \"ESNext\",\n moduleResolution: \"Bundler\",\n strict: true,\n skipLibCheck: true,\n types: [\"vitest/globals\"],\n },\n include: [\"automations\"],\n },\n null,\n 2,\n ) + \"\\n\",\n );\n writeFileSync(\n join(root, \"vitest.config.ts\"),\n `import { defineConfig } from \"vitest/config\";\\nexport default defineConfig({ test: { globals: true, include: [\"automations/**/*.test.ts\"] } });\\n`,\n );\n writeFileSync(join(root, \".gitignore\"), tesserGitignore());\n writeProjectAgentInstructions(root, name, version, { overwrite: true });\n const docs = writeTesserGeneratedDocs(root, name, version);\n writeFileSync(join(root, \"automations\", \"hello\", \"index.ts\"), EXAMPLE_AUTOMATION);\n writeFileSync(join(root, \"automations\", \"hello\", \"index.test.ts\"), EXAMPLE_TEST);\n\n const next = [\n \"cd \" + name,\n \"pnpm install\",\n \"git init && git add -A && git commit -m init\",\n \"tesser link\",\n \"tesser test\",\n ];\n out.data(\n { created: root, tesserVersion: version, docs, next },\n () =>\n `created ${root}\\nnext:\\n cd ${name}\\n pnpm install # creates pnpm-lock.yaml; commit it\\n git init && git add -A && git commit -m init\\n tesser link # register on your instance\\n tesser test # green in milliseconds`,\n );\n}\n", "import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { EXIT } from \"../exit-codes.js\";\nimport { CliError, Output } from \"../output.js\";\n\nexport const TESSER_DEPENDENCIES = [\"@devosurf/tesser-sdk\", \"@devosurf/tesser-connectors\"] as const;\nexport const TESSER_DEV_DEPENDENCIES = [\"@devosurf/tesser\", \"@devosurf/tesser-server\", \"@devosurf/tesser-testing\"] as const;\n\nexport const GENERATED_DOC_PATHS = [\n \".tesser/docs/manifest.json\",\n \".tesser/docs/README.md\",\n \".tesser/docs/cli.md\",\n \".tesser/docs/sdk.md\",\n \".tesser/docs/connectors.md\",\n] as const;\n\ninterface JsonObject {\n [key: string]: unknown;\n}\n\nexport function projectPackageJson(name: string, version: string): JsonObject {\n return {\n name,\n private: true,\n type: \"module\",\n packageManager: \"pnpm@9.12.0\",\n scripts: { test: \"tesser test\", deploy: \"tesser deploy\", dev: \"tesser dev\" },\n dependencies: {\n \"@devosurf/tesser-sdk\": version,\n \"@devosurf/tesser-connectors\": version,\n zod: \"^4\",\n },\n devDependencies: {\n \"@devosurf/tesser\": version,\n \"@devosurf/tesser-server\": version,\n \"@devosurf/tesser-testing\": version,\n vitest: \"^4\",\n },\n };\n}\n\nexport function writeProjectAgentInstructions(root: string, projectName: string, version: string, opts: { overwrite: boolean }): boolean {\n const path = join(root, \"AGENTS.md\");\n if (!opts.overwrite && existsSync(path)) return false;\n writeFileSync(path, projectAgentsMd(projectName, version));\n return true;\n}\n\nexport function writeTesserGeneratedDocs(root: string, projectName: string, version: string): string[] {\n const docsDir = join(root, \".tesser\", \"docs\");\n mkdirSync(docsDir, { recursive: true });\n const docs: Record<string, string> = {\n \"manifest.json\": JSON.stringify(\n {\n kind: \"tesser-agent-docs\",\n schemaVersion: 1,\n generatedBy: \"@devosurf/tesser\",\n tesserVersion: version,\n project: projectName,\n generatedFiles: GENERATED_DOC_PATHS.filter((path) => path !== \".tesser/docs/manifest.json\"),\n },\n null,\n 2,\n ) + \"\\n\",\n \"README.md\": docsReadmeMd(projectName, version),\n \"cli.md\": cliReferenceMd(version),\n \"sdk.md\": sdkReferenceMd(version),\n \"connectors.md\": connectorsReferenceMd(version),\n };\n for (const [file, content] of Object.entries(docs)) {\n writeFileSync(join(docsDir, file), content);\n }\n return [...GENERATED_DOC_PATHS];\n}\n\nexport function tesserGitignore(): string {\n return `node_modules/\\n.env\\n\\n# Tesser local runtime state from \\`tesser dev\\`; keep generated agent docs committed.\\n.tesser/*\\n!.tesser/\\n!.tesser/docs/\\n!.tesser/docs/**\\n`;\n}\n\nexport function ensureTesserDocsGitignore(root: string): boolean {\n const path = join(root, \".gitignore\");\n const block = `\\n# Tesser local runtime state from \\`tesser dev\\`; keep generated agent docs committed.\\n.tesser/*\\n!.tesser/\\n!.tesser/docs/\\n!.tesser/docs/**\\n`;\n if (!existsSync(path)) {\n writeFileSync(path, tesserGitignore());\n return true;\n }\n const existing = readFileSync(path, \"utf8\");\n if (existing.includes(\"!.tesser/docs/**\")) return false;\n writeFileSync(path, existing.replace(/\\s*$/, \"\\n\") + block);\n return true;\n}\n\nexport function upgradeProject(\n out: Output,\n project: { name: string; root: string },\n version: string,\n): void {\n const packagePath = join(project.root, \"package.json\");\n if (!existsSync(packagePath)) {\n throw new CliError(EXIT.USAGE, \"not inside a package-backed Tesser project (missing package.json)\");\n }\n const pkg = JSON.parse(readFileSync(packagePath, \"utf8\")) as JsonObject;\n pinTesserPackages(pkg, version);\n writeFileSync(packagePath, JSON.stringify(pkg, null, 2) + \"\\n\");\n\n const docs = writeTesserGeneratedDocs(project.root, project.name, version);\n const gitignoreUpdated = ensureTesserDocsGitignore(project.root);\n const agentInstructionsCreated = writeProjectAgentInstructions(project.root, project.name, version, { overwrite: false });\n const next = [\n \"pnpm install\",\n \"tesser test --json\",\n \"git add package.json pnpm-lock.yaml .gitignore AGENTS.md .tesser/docs && git commit -m \\\"upgrade tesser\\\"\",\n ];\n\n out.data(\n { upgraded: project.root, tesserVersion: version, docs, packageJson: \"package.json\", gitignoreUpdated, agentInstructionsCreated, next },\n () =>\n `upgraded ${project.root} to Tesser ${version}\\nnext:\\n pnpm install\\n tesser test --json\\n git add package.json pnpm-lock.yaml .gitignore AGENTS.md .tesser/docs && git commit -m \"upgrade tesser\"`,\n );\n}\n\nfunction pinTesserPackages(pkg: JsonObject, version: string): void {\n const dependencies = objectField(pkg, \"dependencies\");\n for (const name of TESSER_DEPENDENCIES) dependencies[name] = version;\n const devDependencies = objectField(pkg, \"devDependencies\");\n for (const name of TESSER_DEV_DEPENDENCIES) devDependencies[name] = version;\n}\n\nfunction objectField(pkg: JsonObject, key: string): JsonObject {\n const existing = pkg[key];\n if (existing && typeof existing === \"object\" && !Array.isArray(existing)) return existing as JsonObject;\n const next: JsonObject = {};\n pkg[key] = next;\n return next;\n}\n\nfunction projectAgentsMd(projectName: string, version: string): string {\n return `# Working in this Tesser Project\\n\\nThis repository is a Tesser **Project**: one git repo of automations deployed to a Tesser **Instance**.\\n\\n## Read first\\n- [Generated Tesser reference](./.tesser/docs/README.md) \u2014 generated for Tesser ${version}.\\n- [CLI reference](./.tesser/docs/cli.md) \u2014 use \\`--json\\` for machine-readable output.\\n- [SDK reference](./.tesser/docs/sdk.md) \u2014 authoring pattern, \\`ctx.step\\`, tests.\\n- [Connector reference](./.tesser/docs/connectors.md) \u2014 safe Connection and Secret usage.\\n\\n## Project rules\\n- Use Tesser terms: **Automation**, **Trigger**, **Step**, **Project**, **Instance**, **Connector**, **Connection**, **Secret**, **Credential broker**, **Replay**.\\n- One Automation per directory under \\`automations/\\`; colocate \\`*.test.ts\\` with each Automation.\\n- Every side effect and external call must be inside \\`ctx.step(\"stable-name\", async () => ...)\\`.\\n- Declare credentials statically with \\`connections: { ... }\\` and \\`secrets: { ... }\\`; never read or print secret values.\\n- Run \\`pnpm install\\` after init/upgrade, commit \\`pnpm-lock.yaml\\`, and never commit \\`node_modules/\\`.\\n- Before deploy, run \\`tesser test --json\\` (and usually \\`tesser build --json\\`).\\n- Deploy from git. Commit generated Tesser docs under \\`.tesser/docs/\\`; local runtime state in other \\`.tesser/*\\` paths stays ignored.\\n\\n## Upgrade rule\\nTo update this Project's pinned Tesser packages and generated references, run the target CLI version explicitly:\\n\\n\\`\\`\\`bash\\nnpx @devosurf/tesser@<version> upgrade\\npnpm install\\ntesser test --json\\n\\`\\`\\`\\n\\nProject name: \\`${projectName}\\`.\\n`;\n}\n\nfunction docsReadmeMd(projectName: string, version: string): string {\n return `# Tesser agent reference\\n\\nGenerated for Project \\`${projectName}\\` by \\`@devosurf/tesser@${version}\\`. Treat this directory as generated/vendor reference: do not hand-edit files under \\`.tesser/docs/\\`; customize local policy in \\`AGENTS.md\\`.\\n\\n## Start here\\n1. Read \\`AGENTS.md\\` for project-specific policy.\\n2. Use [cli.md](./cli.md) for command sequences and safe secret handling.\\n3. Use [sdk.md](./sdk.md) before editing an Automation.\\n4. Use [connectors.md](./connectors.md) before adding a Connection or Secret.\\n\\n## Version contract\\nTesser packages in \\`package.json\\` should be pinned exactly to \\`${version}\\`:\\n\\n- \\`@devosurf/tesser\\`\\n- \\`@devosurf/tesser-sdk\\`\\n- \\`@devosurf/tesser-connectors\\`\\n- \\`@devosurf/tesser-testing\\`\\n- \\`@devosurf/tesser-server\\`\\n\\nTo upgrade, run the target CLI version so docs and packages move together:\\n\\n\\`\\`\\`bash\\nnpx @devosurf/tesser@<version> upgrade\\npnpm install\\ntesser test --json\\n\\`\\`\\`\\n\\nCommit \\`package.json\\`, \\`pnpm-lock.yaml\\`, \\`.tesser/docs/\\`, and any Automation/test changes together. Do not commit \\`node_modules/\\` or local runtime files such as \\`.tesser/master.key\\`.\\n`;\n}\n\nfunction cliReferenceMd(version: string): string {\n return `# Tesser CLI reference\\n\\nGenerated for \\`@devosurf/tesser@${version}\\`. The CLI is the agent interface: prefer \\`--json\\` when output will drive follow-up actions. stdout is data; stderr is logs/progress.\\n\\n## Install and invoke\\n\\n\\`\\`\\`bash\\nnpm install -g @devosurf/tesser@${version}\\ntesser --version\\n\\n# Or run an exact version without global install:\\nnpx @devosurf/tesser@${version} --version\\n\\`\\`\\`\\n\\n## Common flow\\n\\n\\`\\`\\`bash\\ntesser init my-project --instance https://tesser.example.com\\ncd my-project\\npnpm install # creates pnpm-lock.yaml; commit it\\ngit init && git add -A && git commit -m init\\ntesser login --instance https://tesser.example.com --token \"$TESSER_TOKEN\"\\ntesser link --json # registers this Project on the Instance\\ntesser test --json\\ntesser build --json\\ntesser deploy --json\\n\\`\\`\\`\\n\\n## Commands agents commonly use\\n\\n- \\`tesser init <name> [--dir DIR] [--instance URL]\\` \u2014 scaffold a Project.\\n- \\`tesser upgrade\\` \u2014 pin Tesser packages to this CLI version and refresh \\`.tesser/docs/\\`. To target a version: \\`npx @devosurf/tesser@<version> upgrade\\`.\\n- \\`tesser login --instance URL --token TOKEN\\` \u2014 verify and store a profile. Prefer \\`TESSER_TOKEN\\` over pasting tokens into chat.\\n- \\`tesser link [--repo URL] --json\\` \u2014 register the Project and print deploy-key/webhook setup data. CLI output must not include private keys or webhook secrets.\\n- \\`tesser status --json\\` \u2014 instance health and deploy state.\\n- \\`tesser test [--smoke-only] [--automation ID] --json\\` \u2014 fast local tests plus generated smoke tests.\\n- \\`tesser build --json\\` \u2014 bundle and statically extract manifests. Use before deploy when changing requirements.\\n- \\`tesser dev [--port N] [--no-watch]\\` \u2014 local Instance with embedded Postgres under ignored \\`.tesser/*\\` state.\\n- \\`tesser deploy [--ref REF] [--local] [--no-wait] --json\\` \u2014 server-side build/test/promotion. Exit code 4 means halted on missing credentials; run \\`tesser connect\\`.\\n- \\`tesser connect [--wait] [--status TOKEN] --json\\` \u2014 mint or poll the human connect link. The human supplies credentials in the browser; the agent only sees readiness.\\n- \\`tesser secrets list --json\\`, \\`tesser secrets rm <name> --json\\`, \\`printenv MY_SECRET | tesser secrets set <name> --value-stdin --json\\`. Never put secret values in argv.\\n- \\`tesser runs list|show|trigger|signal|cancel --json\\`; \\`tesser logs <runId> [--follow]\\`; \\`tesser replay <runId>\\`.\\n- \\`tesser rollback <automation> --to <version> --json\\` \u2014 alias re-point; no rebuild.\\n\\n## Credential safety\\n\\n- Do not ask the user to paste secrets into chat. Use masked secret prompts where your harness supports them, or ask the human to run a command locally.\\n- Never pass raw secret values as CLI arguments. Use environment variables, profiles, connect links, OAuth, or \\`--value-stdin\\`.\\n- Treat connect links and status tokens as sensitive operational material.\\n\\n## Deploy hygiene\\n\\n- Run \\`pnpm install\\` after init/upgrade and commit \\`pnpm-lock.yaml\\`; the Instance installs from lockfiles for reproducible builds.\\n- Do not commit \\`node_modules/\\`, \\`.env\\`, or local runtime state in \\`.tesser/*\\` outside \\`.tesser/docs/\\`.\\n- Git is the source of truth. Commit and push before expecting a normal Instance deploy to see changes.\\n`;\n}\n\nfunction sdkReferenceMd(version: string): string {\n return `# Tesser SDK reference\\n\\nGenerated for \\`@devosurf/tesser-sdk@${version}\\`. Author ordinary async TypeScript; Tesser durability comes only from Steps.\\n\\n## Minimal Automation\\n\\n\\`\\`\\`ts\\nimport { defineAutomation, onWebhook } from \"@devosurf/tesser-sdk\";\\nimport { z } from \"zod\";\\n\\nexport default defineAutomation({\\n id: \"hello\",\\n trigger: onWebhook({ input: z.object({ name: z.string().default(\"world\") }) }),\\n output: z.object({ greeting: z.string() }),\\n\\n run: async (input, ctx) => {\\n const greeting = await ctx.step(\"compose\", async () => \\`hello, \\${input.name}!\\`);\\n return { greeting };\\n },\\n});\\n\\`\\`\\`\\n\\n## Non-negotiable rules\\n\\n- Use **Step**, not node/task/action, for durable checkpoints.\\n- Every side effect, external I/O call, Connector Action, bespoke HTTP request, file/network operation, or secret-dependent operation must happen inside \\`ctx.step(name, fn)\\`.\\n- Step names are stable API for the journal. Use short, descriptive names such as \\`fetch-customer\\`, \\`post-to-slack\\`, \\`charge-card\\`.\\n- Step outputs are journaled and must be serializable. Return plain data, not functions, class instances, streams, sockets, or live handles.\\n- An Automation declares credentials statically at the top level. Do not hide requirements inside \\`run\\`.\\n- Do not access provider tokens directly. Runtime-injected \\`ctx.connections.*\\` and \\`ctx.secrets.*\\` are the only runtime credential surfaces.\\n\\n## Triggers\\n\\n\\`\\`\\`ts\\nimport { onWebhook, onSchedule, onEvent } from \"@devosurf/tesser-sdk\";\\n\\nconst webhook = onWebhook({ input: schema, respond: \"sync\" });\\nconst schedule = onSchedule({ cron: \"0 9 * * *\", tz: \"UTC\" });\\nconst event = onEvent(myEvent);\\n\\`\\`\\`\\n\\nConnector triggers are reached from the Connector import, for example \\`github.triggers.issueOpened({ repo: \"owner/repo\" })\\` when supported.\\n\\n## Connections and Secrets\\n\\n\\`\\`\\`ts\\nimport { defineAutomation, onWebhook, secret } from \"@devosurf/tesser-sdk\";\\nimport { slack } from \"@devosurf/tesser-connectors\";\\nimport { z } from \"zod\";\\n\\nexport default defineAutomation({\\n id: \"notify\",\\n trigger: onWebhook({ input: z.object({ text: z.string() }) }),\\n connections: { slack },\\n secrets: { signingKey: secret({ describe: \"Shared HMAC signing key\" }) },\\n output: z.object({ ok: z.boolean() }),\\n\\n run: async (input, ctx) => {\\n await ctx.step(\"post-message\", () =>\\n ctx.connections.slack.chat.postMessage({ channel: \"#ops\", text: input.text }),\\n );\\n return { ok: true };\\n },\\n});\\n\\`\\`\\`\\n\\nDeploy halts if required Connections or Secrets are missing. The agent should surface the connect link to a human and poll status; it must not collect the secret value itself.\\n\\n## Tests\\n\\nColocate tests beside each Automation.\\n\\n\\`\\`\\`ts\\nimport { createTest } from \"@devosurf/tesser-testing\";\\nimport automation from \"./index\";\\n\\ntest(\"greets by name\", async () => {\\n const t = createTest({ automation });\\n const { result } = await t.run({ input: { name: \"tesser\" } });\\n expect(result).toEqual({ greeting: \"hello, tesser!\" });\\n});\\n\\`\\`\\`\\n\\nFor Connector calls, mock the Step result by Step name. Replay fixtures produced by \\`tesser replay <runId>\\` should become permanent regression tests.\\n`;\n}\n\nfunction connectorsReferenceMd(version: string): string {\n return `# Tesser Connector reference\\n\\nGenerated for \\`@devosurf/tesser-connectors@${version}\\`. A Connector is a typed integration; a Connection is an authed runtime instance injected by the Credential broker.\\n\\n## Available connector imports\\n\\n\\`\\`\\`ts\\nimport {\\n anthropic,\\n claudeCode,\\n github,\\n gmail,\\n googleCalendar,\\n googleDocs,\\n googleDrive,\\n googleSheets,\\n http,\\n outlookMail,\\n pi,\\n resend,\\n slack,\\n} from \"@devosurf/tesser-connectors\";\\n\\`\\`\\`\\n\\nOnly import Connectors that the Automation declares in \\`connections: { ... }\\`.\\n\\n## Pattern\\n\\n\\`\\`\\`ts\\nimport { defineAutomation, onSchedule } from \"@devosurf/tesser-sdk\";\\nimport { github, slack } from \"@devosurf/tesser-connectors\";\\nimport { z } from \"zod\";\\n\\nexport default defineAutomation({\\n id: \"digest\",\\n trigger: onSchedule({ cron: \"0 9 * * *\", tz: \"UTC\" }),\\n connections: { github, slack },\\n output: z.object({ posted: z.boolean(), count: z.number() }),\\n\\n run: async (_input, ctx) => {\\n const issues = await ctx.step(\"fetch-open-issues\", () =>\\n ctx.connections.github.issues.list({ state: \"open\", labels: [\"bug\"] }),\\n );\\n\\n if (issues.length === 0) return { posted: false, count: 0 };\\n\\n await ctx.step(\"post-to-slack\", () =>\\n ctx.connections.slack.chat.postMessage({ channel: \"#ops\", text: \\`\\${issues.length} bugs\\` }),\\n );\\n\\n return { posted: true, count: issues.length };\\n },\\n});\\n\\`\\`\\`\\n\\n## Common Actions\\n\\n- \\`ctx.connections.http.get({ url, headers?, query? })\\` and \\`ctx.connections.http.request({ method, url, headers?, query?, body?, bodyText? })\\`. Generic writes are not retry-safe; still wrap them in a Step.\\n- \\`ctx.connections.github.issues.list({ repo?, state?, labels?, limit? })\\`, \\`issues.create({ repo, title, body?, labels? })\\`, \\`issues.comment({ repo, number, body })\\`, \\`repos.get({ repo })\\`.\\n- \\`ctx.connections.slack.chat.postMessage({ channel, text, threadTs? })\\` and related Slack chat/conversation/user Actions.\\n- \\`ctx.connections.resend.emails.send(...)\\`, Gmail/Outlook Mail and Google Calendar/Docs/Drive/Sheets Actions, Anthropic model Actions, Claude Code/Pi Harness-related Connectors: inspect package types or examples before using.\\n\\n## Connector triggers\\n\\nSome Connectors expose typed triggers, e.g. GitHub issue triggers, Slack event triggers, Gmail/Outlook mailbox poll triggers. Use the Connector's \\`triggers\\` constructors; do not hand-roll webhook delivery unless no Connector exists.\\n\\n\\`\\`\\`ts\\ntrigger: github.triggers.issueOpened({ repo: \"owner/repo\" })\\n\\`\\`\\`\\n\\n## Safety rules\\n\\n- Connector Actions are not automatically durable. The Automation author must wrap every Action call in \\`ctx.step\\`.\\n- The imported Connector is not a token-bearing client. The authed client exists only at \\`ctx.connections.<name>\\` inside \\`run\\`.\\n- For bespoke APIs, combine \\`http\\` with declared \\`secrets: { ... }\\`; do not put API keys in source, tests, logs, CLI args, or committed env files.\\n- If deploy halts on a missing Connection, surface \\`tesser connect\\` output to the human. The agent must not complete OAuth or paste raw secrets itself.\\n`;\n}\n", "// `tesser replay <runId>` (ADR-0008): pull a real run's trigger + journal, freeze it as a\n// committed fixture, and write a regression test that re-feeds the exact input with\n// journal-derived mocks. The suite grows from real edge cases.\n\nimport { mkdirSync, writeFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { ApiClient } from \"../client.js\";\nimport { EXIT } from \"../exit-codes.js\";\nimport { CliError, Output } from \"../output.js\";\n\ninterface ReplayBundle {\n replay: {\n id: string;\n automation_id: string;\n status: string;\n trigger: Record<string, unknown>;\n input: unknown;\n output: unknown;\n error: unknown;\n journal: Array<{ name: string; occurrence: number; status: string; result: unknown; error: unknown }>;\n };\n}\n\nexport async function replay(out: Output, api: ApiClient, projectRoot: string, runId: string): Promise<void> {\n const { replay: run } = await api.get<ReplayBundle>(`/runs/${runId}/replay`);\n const dir = join(projectRoot, \"automations\", run.automation_id);\n if (!existsSync(dir)) {\n throw new CliError(EXIT.NOT_FOUND, `automation directory not found locally: automations/${run.automation_id}`);\n }\n const shortId = run.id.slice(0, 8);\n const fixtureDir = join(dir, \"__replays__\");\n mkdirSync(fixtureDir, { recursive: true });\n const fixturePath = join(fixtureDir, `${shortId}.replay.json`);\n writeFileSync(\n fixturePath,\n JSON.stringify(\n {\n runId: run.id,\n automation: run.automation_id,\n recordedStatus: run.status,\n trigger: run.trigger,\n input: run.input,\n output: run.output,\n error: run.error,\n steps: run.journal.filter((s) => !s.name.startsWith(\"$\")),\n },\n null,\n 2,\n ) + \"\\n\",\n );\n\n const testPath = join(dir, `replay-${shortId}.test.ts`);\n writeFileSync(\n testPath,\n `// Regression frozen from run ${run.id} (recorded status: ${run.status}).\n// Generated by \\`tesser replay\\` \u2014 adjust the final assertion once the bug is fixed.\nimport { createTest } from \"@devosurf/tesser-testing\";\nimport automation from \"./index\";\nimport replay from \"./__replays__/${shortId}.replay.json\";\n\ntest(\"replays run ${shortId} exactly\", async () => {\n const t = createTest({ automation });\n // Recorded step results replay through the journal \u2014 completed steps return their\n // captured values without executing, exactly like durable recovery (ADR-0002).\n const journal = replay.steps\n .filter((s) => s.status === \"completed\")\n .map((s) => ({ name: s.name, occurrence: s.occurrence, result: s.result }));\n const result = await t.run({ input: replay.input ?? undefined, journal });\n\n // Recorded behaviour at capture time \u2014 keep as the regression contract:\n expect(result.status).toBe(${JSON.stringify(run.status === \"completed\" ? \"completed\" : \"failed\")});\n${run.status === \"completed\" ? ` expect(result.result).toEqual(replay.output);` : ` // This run FAILED in production. After fixing, flip the expectation to \"completed\".`}\n});\n`,\n );\n\n out.data(\n { fixture: fixturePath, test: testPath, recordedStatus: run.status },\n () => `frozen run ${shortId} \u2192 ${testPath}\\nfixture: ${fixturePath}\\nrun \\`tesser test\\` to execute it`,\n );\n}\n", "// `tesser test` (ADR-0008): the agent's fast pass/fail loop. Colocated tests run via the\n// project's own vitest (subprocess, JSON reporter \u2014 never named in our surface); every\n// automation WITHOUT a colocated test gets the auto-generated smoke test. Failures are\n// machine-actionable on stdout with --json; exit 3 on red.\n\nimport { execFile } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { smokeTest } from \"@devosurf/tesser-testing\";\nimport { EXIT } from \"../exit-codes.js\";\nimport { CliError, Output } from \"../output.js\";\nimport { discoverLocalAutomations, loadAutomationDef } from \"../project.js\";\n\nconst exec = promisify(execFile);\n\ninterface TestReport {\n passed: boolean;\n colocated: { ran: number; passed: number; failed: number; skippedNoRunner?: boolean };\n smoke: Array<{ automation: string; passed: boolean; reason?: string; failure?: unknown }>;\n failures: Array<{\n kind: \"test\" | \"smoke\";\n automation?: string;\n file?: string;\n name?: string;\n message: string;\n }>;\n}\n\nfunction findVitest(projectRoot: string): string | null {\n let dir = projectRoot;\n for (;;) {\n const bin = join(dir, \"node_modules\", \".bin\", process.platform === \"win32\" ? \"vitest.cmd\" : \"vitest\");\n if (existsSync(bin)) return bin;\n const parent = join(dir, \"..\");\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nexport async function runTests(\n out: Output,\n projectRoot: string,\n opts: { smokeOnly?: boolean; filter?: string | undefined },\n): Promise<never> {\n const automations = discoverLocalAutomations(projectRoot).filter(\n (a) => opts.filter === undefined || a.automationId === opts.filter,\n );\n if (automations.length === 0) {\n throw new CliError(EXIT.USAGE, `no automations found under ${join(projectRoot, \"automations\")}`);\n }\n\n const report: TestReport = {\n passed: true,\n colocated: { ran: 0, passed: 0, failed: 0 },\n smoke: [],\n failures: [],\n };\n\n // ---- colocated tests through the project's test runner ----\n const withTests = automations.filter((a) => a.hasTests);\n if (!opts.smokeOnly && withTests.length > 0) {\n const vitestBin = findVitest(projectRoot);\n if (!vitestBin) {\n report.colocated.skippedNoRunner = true;\n out.log(\"note: no test runner installed in the project \u2014 running smoke tests only\");\n } else {\n const args = [\"run\", \"--reporter=json\", ...withTests.map((a) => a.dir)];\n const res = await exec(vitestBin, args, {\n cwd: projectRoot,\n env: { ...process.env, CI: \"1\" },\n maxBuffer: 64 * 1024 * 1024,\n }).catch((err: { stdout?: string; stderr?: string }) => ({\n stdout: err.stdout ?? \"\",\n stderr: err.stderr ?? \"\",\n }));\n const jsonLine = (res.stdout ?? \"\").split(\"\\n\").find((l) => l.trimStart().startsWith(\"{\"));\n if (!jsonLine) {\n report.passed = false;\n report.failures.push({ kind: \"test\", message: `test runner produced no JSON report: ${(res.stderr ?? \"\").slice(0, 800)}` });\n } else {\n const parsed = JSON.parse(jsonLine) as {\n numTotalTests: number;\n numPassedTests: number;\n numFailedTests: number;\n testResults: Array<{\n name: string;\n assertionResults: Array<{ status: string; fullName: string; failureMessages: string[] }>;\n }>;\n };\n report.colocated.ran = parsed.numTotalTests;\n report.colocated.passed = parsed.numPassedTests;\n report.colocated.failed = parsed.numFailedTests;\n if (parsed.numFailedTests > 0) {\n report.passed = false;\n for (const file of parsed.testResults) {\n for (const t of file.assertionResults) {\n if (t.status === \"failed\") {\n report.failures.push({\n kind: \"test\",\n file: file.name,\n name: t.fullName,\n message: t.failureMessages.join(\"\\n\").slice(0, 2000),\n });\n }\n }\n }\n }\n }\n }\n }\n\n // ---- auto smoke for automations without colocated tests (and all, with --smoke-only) ----\n const smokeTargets = opts.smokeOnly ? automations : automations.filter((a) => !a.hasTests);\n for (const auto of smokeTargets) {\n try {\n const def = await loadAutomationDef(auto.entry);\n const outcome = await smokeTest(def);\n report.smoke.push({\n automation: auto.automationId,\n passed: outcome.passed,\n ...(outcome.reason !== undefined ? { reason: outcome.reason } : {}),\n ...(outcome.passed ? {} : { failure: outcome.result.failure() }),\n });\n if (!outcome.passed) {\n report.passed = false;\n report.failures.push({\n kind: \"smoke\",\n automation: auto.automationId,\n message: outcome.reason ?? \"smoke test failed\",\n });\n }\n } catch (err) {\n report.passed = false;\n report.smoke.push({ automation: auto.automationId, passed: false, reason: String(err) });\n report.failures.push({ kind: \"smoke\", automation: auto.automationId, message: String(err).slice(0, 2000) });\n }\n }\n\n out.data(report, (r: TestReport) => {\n const lines = [\n `colocated: ${r.colocated.passed}/${r.colocated.ran} passed${r.colocated.skippedNoRunner ? \" (runner missing)\" : \"\"}`,\n ...r.smoke.map((s) => `smoke ${s.automation}: ${s.passed ? \"\u2713\" : `\u2717 ${s.reason ?? \"\"}`}`),\n r.passed ? \"PASS\" : `FAIL (${r.failures.length} failure${r.failures.length === 1 ? \"\" : \"s\"})`,\n ];\n return lines.join(\"\\n\");\n });\n process.exit(report.passed ? EXIT.OK : EXIT.TESTS_FAILED);\n}\n", "// The in-process TestEngine (ADR-0008): journal-of-results semantics identical to the\n// durable server engine \u2014 occurrence-disambiguated steps, real retry policies on a\n// time-skipping clock, undo-in-reverse on terminal failure, connector calls captured \u2014\n// with connectors auto-mocked. Milliseconds per run; failures machine-actionable.\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport type {\n AutomationDef,\n Ctx,\n EventDefinition,\n HarnessRunRequest,\n HarnessRunResult,\n Logger,\n NormalizedModelRequest,\n NormalizedModelResponse,\n Schema,\n StepOpts,\n WebhookRequest,\n} from \"@devosurf/tesser-sdk\";\nimport { isRetryableError, isTerminalError } from \"@devosurf/tesser-sdk\";\nimport {\n buildConnectorClient,\n buildHarnesses,\n buildOperators,\n decodeJournal,\n encodeJournal,\n isRetrySafe,\n nextRetryDelayMs,\n parseDuration,\n resolveRetryPolicy,\n validateSchema,\n type JsonValue,\n} from \"@devosurf/tesser-sdk/internal\";\nimport type { AnyAction, ConnectorInstance } from \"@devosurf/tesser-sdk/connector\";\nimport { createSpy, recordCall, type Spy } from \"./spy.js\";\nimport { sampleFromSchema } from \"./sample.js\";\n\nexport class TestConfigError extends Error {\n constructor(\n message: string,\n readonly hint?: string,\n ) {\n super(hint ? `${message}\\n hint: ${hint}` : message);\n this.name = \"TestConfigError\";\n }\n}\n\nexport interface JournalEntry {\n kind: \"step\" | \"signal\" | \"sleep\";\n name: string;\n occurrence: number;\n status: \"completed\" | \"failed\" | \"timed-out\";\n attempts: number;\n result?: unknown;\n error?: SerializedError;\n /** Step names this entry's undo was executed for (undo bookkeeping lives run-level). */\n}\n\nexport interface SerializedError {\n name: string;\n message: string;\n retryable: boolean;\n terminal: boolean;\n}\n\nexport interface MachineFailure {\n automation: string;\n status: \"failed\";\n error: SerializedError;\n failedStep?: { name: string; occurrence: number; attempts: number; error: SerializedError };\n steps: Array<{ name: string; occurrence: number; status: string; attempts: number }>;\n connectorCalls: Array<{ step?: string; action?: string; input: unknown }>;\n suggestion?: string;\n}\n\nexport type StepMock = unknown | ((input: unknown, info: { action: string; connection: string }) => unknown);\nexport type ScriptedModelTurn =\n | NormalizedModelResponse\n | ((request: NormalizedModelRequest, info: { operatorKey: string; modelKey: string; turn: number }) => NormalizedModelResponse | Promise<NormalizedModelResponse>);\nexport type ScriptedHarnessRun =\n | HarnessRunResult<unknown>\n | ((request: HarnessRunRequest<unknown>, info: { harnessKey: string; invocation: number }) => HarnessRunResult<unknown> | Promise<HarnessRunResult<unknown>>);\n\nexport interface RunOptions {\n input?: unknown;\n /** Mock connector-call results by the *step name* they happen inside. The step's own\n * code still runs; only the external call is replaced. */\n mocks?: Record<string, StepMock>;\n /** Replay seeding (ADR-0002 recovery semantics): steps listed here return their\n * recorded results WITHOUT executing \u2014 exactly how the durable engine resumes.\n * Used by `tesser replay` fixtures. */\n journal?: Array<{ name: string; occurrence?: number; result: unknown }>;\n /** Mock whole connections by action path: { slack: { chat: { postMessage: fn } } }. */\n connections?: Record<string, unknown>;\n secrets?: Record<string, string>;\n /** Scripted model responses by Operator key and Model key. Operators never call live models in tests. */\n models?: Record<string, Record<string, ScriptedModelTurn | ScriptedModelTurn[]>>;\n /** Scripted Harness results by Harness key. Harnesses never run live subprocesses in tests. */\n harnesses?: Record<string, ScriptedHarnessRun | ScriptedHarnessRun[]>;\n /** Resolutions for ctx.waitForSignal, by name; value, per-occurrence array, or fn. */\n signals?: Record<string, unknown | unknown[] | ((occurrence: number) => unknown)>;\n request?: WebhookRequest;\n}\n\nexport interface TestRunResult<TOutput = unknown> {\n status: \"completed\" | \"failed\";\n result?: TOutput;\n error?: SerializedError & { step?: string };\n /** Step results by name \u2014 the value for a single occurrence, an array for repeats. */\n steps: Record<string, unknown>;\n journal: JournalEntry[];\n /** Spies by step name AND dotted action path; safe to read for never-called names. */\n calls: Record<string, Spy>;\n emitted: Array<{ event: string; payload: unknown }>;\n slept: string[];\n undone: string[];\n logs: Array<{ level: \"info\" | \"warn\" | \"error\"; msg: string; meta?: Record<string, unknown> }>;\n failure(): MachineFailure | null;\n}\n\nfunction serializeError(err: unknown): SerializedError {\n const e = err instanceof Error ? err : new Error(String(err));\n return {\n name: e.name,\n message: e.message,\n retryable: isRetryableError(err),\n terminal: isTerminalError(err),\n };\n}\n\ninterface ActiveStep {\n name: string;\n sawUnsafeWrite: boolean;\n}\n\nexport async function executeAutomation<TOutput>(\n def: AutomationDef<any, TOutput, any, any, any, any, any>,\n opts: RunOptions = {},\n): Promise<TestRunResult<TOutput>> {\n const journal: JournalEntry[] = [];\n const journalByKey = new Map<string, JournalEntry>();\n for (const seeded of opts.journal ?? []) {\n const occurrence = seeded.occurrence ?? 1;\n const entry: JournalEntry = {\n kind: \"step\",\n name: seeded.name,\n occurrence,\n status: \"completed\",\n attempts: 1,\n result: encodeJournal(seeded.result),\n };\n journalByKey.set(`step:${seeded.name}#${occurrence}`, entry);\n journal.push(entry);\n }\n const emitted: TestRunResult[\"emitted\"] = [];\n const slept: string[] = [];\n const undone: string[] = [];\n const logs: TestRunResult[\"logs\"] = [];\n const connectorCalls: MachineFailure[\"connectorCalls\"] = [];\n const undoStack: Array<{ name: string; undo: () => unknown | Promise<unknown> }> = [];\n\n const spies = new Map<string, Spy>();\n const spyFor = (key: string): Spy => {\n let s = spies.get(key);\n if (!s) {\n s = createSpy(key);\n spies.set(key, s);\n }\n return s;\n };\n for (const key of Object.keys(opts.mocks ?? {})) spyFor(key);\n\n const calls: Record<string, Spy> = new Proxy({} as Record<string, Spy>, {\n get: (_t, prop) => (typeof prop === \"string\" ? spyFor(prop) : undefined),\n has: () => true,\n ownKeys: () => [...spies.keys()],\n getOwnPropertyDescriptor: () => ({ enumerable: true, configurable: true }),\n });\n\n const activeStep = new AsyncLocalStorage<ActiveStep>();\n\n const logger: Logger = {\n info: (msg, meta) => logs.push({ level: \"info\", msg, ...(meta ? { meta } : {}) }),\n warn: (msg, meta) => logs.push({ level: \"warn\", msg, ...(meta ? { meta } : {}) }),\n error: (msg, meta) => logs.push({ level: \"error\", msg, ...(meta ? { meta } : {}) }),\n };\n\n // ---- connections: real connector defs, mocked transport ----\n const connections: Record<string, unknown> = {};\n for (const [connKey, connector] of Object.entries((def.connections ?? {}) as Record<string, ConnectorInstance<any, any>>)) {\n connections[connKey] = buildConnectorClient(connector, async (path, actionDef, rawInput) => {\n const step = activeStep.getStore();\n const actionPath = path.join(\".\");\n const fullPath = `${connKey}.${actionPath}`;\n if (!step) {\n throw new TestConfigError(\n `connector call ${fullPath} happened outside ctx.step()`,\n `side effects must live inside a step (ADR-0002) \u2014 wrap the call: ctx.step(\"name\", () => ctx.connections.${fullPath}(...))`,\n );\n }\n const input = await validateSchema(\n (actionDef as AnyAction).input,\n rawInput ?? {},\n `${fullPath} input`,\n );\n\n if (!isRetrySafe(actionDef as AnyAction, connector.__connector.idempotencyHeader !== undefined)) {\n step.sawUnsafeWrite = true;\n }\n\n const resolve = async (): Promise<{ value: unknown; validate: boolean }> => {\n // 1) whole-connection mock by action path\n const connMockRoot = opts.connections?.[connKey];\n if (connMockRoot !== undefined) {\n let node: unknown = connMockRoot;\n for (const seg of path) node = (node as Record<string, unknown> | undefined)?.[seg];\n if (node !== undefined) {\n return {\n value: typeof node === \"function\" ? await (node as (i: unknown) => unknown)(input) : node,\n validate: false,\n };\n }\n }\n // 2) step-name mock\n const stepMock = opts.mocks?.[step.name];\n if (stepMock !== undefined) {\n return {\n value:\n typeof stepMock === \"function\"\n ? await (stepMock as (i: unknown, info: { action: string; connection: string }) => unknown)(\n input,\n { action: actionPath, connection: connKey },\n )\n : stepMock,\n validate: false,\n };\n }\n // 3) connector-declared sample\n const sample = connector.__connector.samples?.[actionPath];\n if (sample !== undefined) return { value: sample, validate: true };\n // 4) derive from the action's output schema\n const derived = await sampleFromSchema((actionDef as AnyAction).output);\n if (derived !== undefined) return { value: derived, validate: true };\n throw new TestConfigError(\n `no mock for connector call ${fullPath} in step \"${step.name}\"`,\n `provide mocks: { \"${step.name}\": () => <result> } or connections: { ${connKey}: { ${actionPath\n .split(\".\")\n .join(\": { \")}: () => <result> ${\"}\".repeat(actionPath.split(\".\").length)} }`,\n );\n };\n\n try {\n const { value, validate } = await resolve();\n const result = validate\n ? await validateSchema((actionDef as AnyAction).output, value, `${fullPath} sample output`)\n : value;\n const record = { args: [input], step: step.name, action: fullPath, result };\n recordCall(spyFor(step.name), record);\n recordCall(spyFor(fullPath), record);\n connectorCalls.push({ step: step.name, action: fullPath, input });\n return result;\n } catch (err) {\n const record = { args: [input], step: step.name, action: fullPath, error: String(err) };\n recordCall(spyFor(step.name), record);\n recordCall(spyFor(fullPath), record);\n connectorCalls.push({ step: step.name, action: fullPath, input });\n throw err;\n }\n });\n }\n\n // ---- secrets ----\n const secretNames = Object.keys((def.secrets ?? {}) as Record<string, unknown>);\n const secrets: Record<string, string> = {};\n for (const name of secretNames) {\n secrets[name] = opts.secrets?.[name] ?? `test-secret-${name}`;\n }\n\n // ---- occurrence counters (reset per handler invocation; here: single invocation) ----\n const stepOccurrence = new Map<string, number>();\n const signalOccurrence = new Map<string, number>();\n const defaultRetry = resolveRetryPolicy(def.retry);\n\n const modelTurns = new Map<string, number>();\n const harnessInvocations = new Map<string, number>();\n\n const ctx: Ctx<any, any, any, any> = {\n async step<T>(name: string, fn: () => Promise<T> | T, stepOpts?: StepOpts<T>): Promise<T> {\n if (typeof name !== \"string\" || name.length === 0 || typeof fn !== \"function\") {\n throw new TestConfigError(`ctx.step: expected (name, fn) \u2014 got name=${JSON.stringify(name)}`);\n }\n const occ = (stepOccurrence.get(name) ?? 0) + 1;\n stepOccurrence.set(name, occ);\n const key = `step:${name}#${occ}`;\n const cached = journalByKey.get(key);\n if (cached?.status === \"completed\") {\n const value = decodeJournal(cached.result as JsonValue) as T;\n if (stepOpts?.undo) undoStack.push({ name, undo: () => stepOpts.undo!(value) });\n return value;\n }\n\n const policy = resolveRetryPolicy(stepOpts?.retry, defaultRetry);\n const timeoutMs = stepOpts?.timeout !== undefined ? parseDuration(stepOpts.timeout, \"step timeout\") : undefined;\n const entry: JournalEntry = { kind: \"step\", name, occurrence: occ, status: \"failed\", attempts: 0 };\n journal.push(entry);\n journalByKey.set(key, entry);\n\n let lastError: unknown;\n for (let attempt = 1; attempt <= policy.maxAttempts; attempt++) {\n entry.attempts = attempt;\n const state: ActiveStep = { name, sawUnsafeWrite: false };\n try {\n let resultPromise = Promise.resolve(activeStep.run(state, () => fn()));\n if (timeoutMs !== undefined) {\n // Time-skipping: a step that *would* time out only does so if it actually\n // hangs on something unmocked \u2014 we reject after the wall-clock budget.\n resultPromise = Promise.race([\n resultPromise,\n new Promise<never>((_r, reject) =>\n setTimeout(\n () => reject(new TestConfigError(`step \"${name}\" exceeded its ${stepOpts?.timeout} timeout`)),\n Math.min(timeoutMs, 5_000),\n ).unref?.(),\n ),\n ]);\n }\n const result = await resultPromise;\n const encoded = encodeJournal(result); // throws NotSerializableError \u2192 terminal\n entry.status = \"completed\";\n entry.result = encoded;\n if (stepOpts?.undo) undoStack.push({ name, undo: () => stepOpts.undo!(result) });\n return result;\n } catch (err) {\n lastError = err;\n entry.error = serializeError(err);\n if (isTerminalError(err)) break;\n if (state.sawUnsafeWrite && stepOpts?.retry === undefined) {\n // Derived retry-safety (ADR-0012): a non-idempotent write never silently\n // double-fires. Explicit per-step retry opts override.\n logger.warn(\n `step \"${name}\" performed a non-retry-safe write and will not auto-retry \u2014 pass StepOpts.retry to opt in`,\n );\n break;\n }\n const delay = nextRetryDelayMs(policy, attempt, isRetryableError(err) ? err.retryAfterMs : undefined);\n if (delay === null) break;\n slept.push(`retry:${name}#${occ}@${attempt}`);\n // time-skipping clock: no real wait\n }\n }\n entry.status = \"failed\";\n throw lastError;\n },\n\n connections: connections as never,\n secrets: secrets as never,\n operators: {} as never,\n harnesses: {} as never,\n\n async sleep(duration: string): Promise<void> {\n parseDuration(duration, \"ctx.sleep\"); // validate eagerly, real engine persists it\n slept.push(duration);\n },\n\n async waitForSignal<T>(name: string, sOpts: { schema: Schema<T>; timeout?: string }): Promise<T | null> {\n const occ = (signalOccurrence.get(name) ?? 0) + 1;\n signalOccurrence.set(name, occ);\n const provided = opts.signals?.[name];\n let value: unknown;\n if (typeof provided === \"function\") value = (provided as (o: number) => unknown)(occ);\n else if (Array.isArray(provided)) value = provided[occ - 1];\n else value = provided;\n\n const entry: JournalEntry = { kind: \"signal\", name, occurrence: occ, status: \"completed\", attempts: 1 };\n journal.push(entry);\n if (value === undefined) {\n if (sOpts.timeout !== undefined) {\n parseDuration(sOpts.timeout, \"waitForSignal timeout\");\n entry.status = \"timed-out\";\n return null; // clock skips straight to the timeout\n }\n throw new TestConfigError(\n `run is suspended waiting for signal \"${name}\" (occurrence ${occ}) with no timeout`,\n `provide signals: { \"${name}\": <payload> } in t.run(...)`,\n );\n }\n const validated = await validateSchema(sOpts.schema, value, `signal \"${name}\" payload`);\n entry.result = encodeJournal(validated as unknown);\n return validated;\n },\n\n async emit<T>(event: EventDefinition<T>, payload: T): Promise<void> {\n const validated = await validateSchema(event.schema, payload, `event \"${event.name}\" payload`);\n emitted.push({ event: event.name, payload: validated });\n },\n\n ...(opts.request !== undefined || (def.trigger as { kind?: string }).kind === \"webhook\"\n ? {\n request:\n opts.request ??\n ({\n headers: { \"content-type\": \"application/json\" },\n query: {},\n rawBody: new TextEncoder().encode(JSON.stringify(opts.input ?? {})),\n } satisfies WebhookRequest),\n }\n : {}),\n\n logger,\n run: { id: `test_${Math.random().toString(36).slice(2, 10)}`, attempt: 1, automationId: def.id },\n };\n\n (ctx as { operators: unknown }).operators = buildOperators(def, ctx, async ({ operatorKey, modelKey, request }) => {\n const key = `${operatorKey}:${modelKey}`;\n const turn = (modelTurns.get(key) ?? 0) + 1;\n modelTurns.set(key, turn);\n const script = opts.models?.[operatorKey]?.[modelKey];\n if (script === undefined) {\n throw new TestConfigError(\n `unscripted model turn for operator \"${operatorKey}\" model \"${modelKey}\" (turn ${turn})`,\n `provide models: { ${operatorKey}: { ${modelKey}: [{ output: <typed output>, usage: { inputTokens, outputTokens } }] } }`,\n );\n }\n const picked = Array.isArray(script) ? script[turn - 1] : script;\n if (picked === undefined) {\n throw new TestConfigError(`no scripted model response for operator \"${operatorKey}\" model \"${modelKey}\" turn ${turn}`);\n }\n const response = typeof picked === \"function\" ? await picked(request, { operatorKey, modelKey, turn }) : picked;\n recordCall(spyFor(`operator.${operatorKey}.model`), { args: [request], result: response });\n recordCall(spyFor(`operator.${operatorKey}.model.${turn}`), { args: [request], result: response });\n return response;\n });\n\n (ctx as { harnesses: unknown }).harnesses = buildHarnesses(def, ctx, async ({ harnessKey, request }) => {\n const step = activeStep.getStore();\n if (!step) {\n throw new TestConfigError(\n `harness \"${harnessKey}\" ran outside ctx.step()`,\n `Harnesses are durable Step runners \u2014 wrap the call: ctx.step(\"name\", () => ctx.harnesses.${harnessKey}.run(...))`,\n );\n }\n const invocation = (harnessInvocations.get(harnessKey) ?? 0) + 1;\n harnessInvocations.set(harnessKey, invocation);\n const script = opts.harnesses?.[harnessKey];\n if (script === undefined) {\n throw new TestConfigError(\n `unscripted Harness run for \"${harnessKey}\"`,\n `provide harnesses: { ${harnessKey}: { output: <typed output>, status: \"completed\", artifacts: [], adapter: \"test\" } }`,\n );\n }\n const picked = Array.isArray(script) ? script[invocation - 1] : script;\n if (picked === undefined) throw new TestConfigError(`no scripted Harness result for \"${harnessKey}\" invocation ${invocation}`);\n const result = typeof picked === \"function\" ? await picked(request, { harnessKey, invocation }) : picked;\n recordCall(spyFor(`harness.${harnessKey}`), { args: [request], step: step.name, result });\n return result;\n });\n\n // ---- resolve + validate input ----\n let input = opts.input;\n const trigger = def.trigger as {\n kind: string;\n input?: Schema<unknown>;\n event?: EventDefinition<unknown>;\n connectorId?: string;\n triggerId?: string;\n };\n let inputSchema: Schema<unknown> | undefined =\n def.input ?? (trigger.kind === \"webhook\" ? trigger.input : trigger.kind === \"event\" ? trigger.event?.schema : undefined);\n\n if (trigger.kind === \"connector\" && trigger.connectorId !== undefined) {\n // A connector trigger's payload contract is its declaration's output schema; the\n // connector may also ship an explicit `trigger:<id>` sample.\n const connector = Object.values(\n (def.connections ?? {}) as Record<string, ConnectorInstance<any, any>>,\n ).find((c) => c.id === trigger.connectorId);\n const decl = connector?.__connector.triggers?.[trigger.triggerId ?? \"\"];\n if (decl) {\n inputSchema = def.input ?? (decl.output as Schema<unknown>);\n if (input === undefined) {\n input = connector?.__connector.samples?.[`trigger:${trigger.triggerId}`];\n }\n }\n }\n\n if (input === undefined && inputSchema && trigger.kind !== \"schedule\") {\n input = await sampleFromSchema(inputSchema);\n }\n if (inputSchema && input !== undefined) {\n input = await validateSchema(inputSchema, input, `automation \"${def.id}\" input`);\n }\n\n const finish = (\n status: \"completed\" | \"failed\",\n result?: TOutput,\n error?: TestRunResult[\"error\"],\n ): TestRunResult<TOutput> => {\n const stepsByName: Record<string, unknown[]> = {};\n for (const e of journal) {\n if (e.kind !== \"step\" || e.status !== \"completed\") continue;\n (stepsByName[e.name] ??= []).push(decodeJournal(e.result as JsonValue));\n }\n const steps: Record<string, unknown> = {};\n for (const [name, results] of Object.entries(stepsByName)) {\n steps[name] = results.length === 1 ? results[0] : results;\n }\n const failedEntry = journal.find((e) => e.kind === \"step\" && e.status === \"failed\");\n return {\n status,\n ...(result !== undefined ? { result } : {}),\n ...(error !== undefined ? { error } : {}),\n steps,\n journal,\n calls,\n emitted,\n slept,\n undone,\n logs,\n failure: () =>\n status === \"completed\"\n ? null\n : {\n automation: def.id,\n status: \"failed\",\n error: error as SerializedError,\n ...(failedEntry\n ? {\n failedStep: {\n name: failedEntry.name,\n occurrence: failedEntry.occurrence,\n attempts: failedEntry.attempts,\n error: failedEntry.error as SerializedError,\n },\n }\n : {}),\n steps: journal\n .filter((e) => e.kind === \"step\")\n .map((e) => ({ name: e.name, occurrence: e.occurrence, status: e.status, attempts: e.attempts })),\n connectorCalls,\n ...(failedEntry?.error?.terminal === false\n ? {}\n : failedEntry\n ? { suggestion: `step \"${failedEntry.name}\" failed terminally \u2014 fix the input or mark the error retryable` }\n : {}),\n },\n };\n };\n\n try {\n let output: unknown = await def.run(input as never, ctx as never);\n if (def.output) {\n output = await validateSchema(def.output, output, `automation \"${def.id}\" output`);\n }\n return finish(\"completed\", output as TOutput);\n } catch (err) {\n // Terminal failure \u2192 undo completed steps in reverse (ADR-0002), best-effort.\n for (const item of [...undoStack].reverse()) {\n try {\n await item.undo();\n undone.push(item.name);\n } catch (undoErr) {\n logger.error(`undo for step \"${item.name}\" failed: ${String(undoErr)}`);\n undone.push(`${item.name} (failed)`);\n }\n }\n const failedStep = journal.find((e) => e.kind === \"step\" && e.status === \"failed\");\n return finish(\"failed\", undefined, {\n ...serializeError(err),\n ...(failedStep ? { step: failedStep.name } : {}),\n });\n }\n}\n", "// A minimal mock-function record compatible with vitest/jest `expect(...).toHaveBeenCalled*`\n// matchers (they accept anything exposing _isMockFunction + .mock.calls). Hand-rolled so\n// @devosurf/tesser-testing does not depend on a test runner.\n\nexport interface CapturedCall {\n args: unknown[];\n /** Step that was active when the call happened. */\n step?: string;\n action?: string;\n result?: unknown;\n error?: string;\n}\n\nexport interface Spy {\n (...args: unknown[]): void;\n _isMockFunction: true;\n getMockName(): string;\n mock: {\n calls: unknown[][];\n results: Array<{ type: \"return\" | \"throw\"; value: unknown }>;\n instances: unknown[];\n contexts: unknown[];\n invocationCallOrder: number[];\n lastCall: unknown[] | undefined;\n };\n /** Rich capture (step/action attribution) beyond the matcher contract. */\n captured: CapturedCall[];\n}\n\nlet order = 1;\n\nexport function createSpy(name: string): Spy {\n const mock: Spy[\"mock\"] = {\n calls: [],\n results: [],\n instances: [],\n contexts: [],\n invocationCallOrder: [],\n lastCall: undefined,\n };\n const captured: CapturedCall[] = [];\n const fn = ((...args: unknown[]) => {\n mock.calls.push(args);\n mock.invocationCallOrder.push(order++);\n mock.lastCall = args;\n }) as Spy;\n fn._isMockFunction = true;\n fn.getMockName = () => name;\n fn.mock = mock;\n fn.captured = captured;\n return fn;\n}\n\nexport function recordCall(spy: Spy, call: CapturedCall): void {\n spy(...call.args);\n spy.mock.results.push(\n call.error !== undefined\n ? { type: \"throw\", value: call.error }\n : { type: \"return\", value: call.result },\n );\n spy.captured.push(call);\n}\n", "// Schema-driven sample + edge-case generation (ADR-0008). Works through JSON Schema:\n// any validator that can describe itself as JSON Schema participates; with zod we use\n// its built-in conversion. Everything degrades gracefully to \"ask for an explicit mock\".\n\nimport type { Schema } from \"@devosurf/tesser-sdk\";\n\ntype JsonSchema = {\n type?: string | string[];\n properties?: Record<string, JsonSchema>;\n required?: string[];\n items?: JsonSchema | JsonSchema[];\n prefixItems?: JsonSchema[];\n enum?: unknown[];\n const?: unknown;\n anyOf?: JsonSchema[];\n oneOf?: JsonSchema[];\n allOf?: JsonSchema[];\n nullable?: boolean;\n default?: unknown;\n minimum?: number;\n maximum?: number;\n exclusiveMinimum?: number;\n exclusiveMaximum?: number;\n minLength?: number;\n maxLength?: number;\n minItems?: number;\n format?: string;\n pattern?: string;\n additionalProperties?: JsonSchema | boolean;\n [k: string]: unknown;\n};\n\n/** Best-effort JSON Schema for a Standard Schema. Currently: zod (vendor \"zod\") via its\n * own toJSONSchema; otherwise undefined. */\nexport function toJsonSchema(schema: Schema<unknown>): JsonSchema | undefined {\n const std = (schema as { \"~standard\"?: { vendor?: string } })[\"~standard\"];\n if (!std) return undefined;\n try {\n if (std.vendor === \"zod\") {\n const z = schema as unknown as {\n constructor?: unknown;\n };\n // zod v4 exposes conversion as a static on the module; reach it through the\n // schema's own registry-free helper if present.\n const anySchema = z as { toJSONSchema?: () => unknown };\n if (typeof anySchema.toJSONSchema === \"function\") {\n return anySchema.toJSONSchema() as JsonSchema;\n }\n // Fall back to importing zod lazily \u2014 present whenever a zod schema is in play.\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n return undefined;\n }\n } catch {\n return undefined;\n }\n return undefined;\n}\n\n/** Async variant that can lazily import zod for conversion. */\nexport async function toJsonSchemaAsync(schema: Schema<unknown>): Promise<JsonSchema | undefined> {\n const direct = toJsonSchema(schema);\n if (direct) return direct;\n const std = (schema as { \"~standard\"?: { vendor?: string } })[\"~standard\"];\n if (std?.vendor === \"zod\") {\n try {\n const zod = (await import(\"zod\")) as unknown as {\n toJSONSchema?: (s: unknown, opts?: unknown) => unknown;\n z?: { toJSONSchema?: (s: unknown, opts?: unknown) => unknown };\n };\n const convert = zod.toJSONSchema ?? zod.z?.toJSONSchema;\n if (convert) return convert(schema, { unrepresentable: \"any\" }) as JsonSchema;\n } catch {\n return undefined;\n }\n }\n return undefined;\n}\n\nconst SAMPLE_STRINGS: Record<string, string> = {\n email: \"sample@example.com\",\n uri: \"https://example.com/sample\",\n url: \"https://example.com/sample\",\n uuid: \"00000000-0000-4000-8000-000000000000\",\n \"date-time\": \"2026-01-01T00:00:00.000Z\",\n date: \"2026-01-01\",\n time: \"00:00:00\",\n};\n\nexport function sampleFromJsonSchema(js: JsonSchema, depth = 0): unknown {\n if (depth > 8) return null;\n if (js.default !== undefined) return js.default;\n if (js.const !== undefined) return js.const;\n if (js.enum && js.enum.length > 0) return js.enum[0];\n const variants = js.anyOf ?? js.oneOf;\n if (variants && variants.length > 0) {\n // Prefer a non-null variant for a useful sample.\n const pick = variants.find((v) => v.type !== \"null\") ?? variants[0];\n return sampleFromJsonSchema(pick as JsonSchema, depth + 1);\n }\n if (js.allOf && js.allOf.length > 0) {\n return js.allOf.reduce<Record<string, unknown>>((acc, part) => {\n const piece = sampleFromJsonSchema(part, depth + 1);\n return typeof piece === \"object\" && piece !== null\n ? { ...acc, ...(piece as Record<string, unknown>) }\n : acc;\n }, {});\n }\n const type = Array.isArray(js.type) ? js.type[0] : js.type;\n switch (type) {\n case \"string\": {\n if (js.format && SAMPLE_STRINGS[js.format]) return SAMPLE_STRINGS[js.format];\n const min = js.minLength ?? 0;\n const base = \"sample\";\n return base.length >= min ? base : base + \"x\".repeat(min - base.length);\n }\n case \"number\":\n case \"integer\": {\n let n = 1;\n if (js.minimum !== undefined) n = js.minimum;\n if (js.exclusiveMinimum !== undefined) n = js.exclusiveMinimum + 1;\n if (js.maximum !== undefined && n > js.maximum) n = js.maximum;\n return type === \"integer\" ? Math.round(n) : n;\n }\n case \"boolean\":\n return true;\n case \"null\":\n return null;\n case \"array\": {\n const itemSchema = Array.isArray(js.items) ? js.items[0] : js.items;\n const count = Math.max(js.minItems ?? 1, 1);\n if (!itemSchema) return [];\n return Array.from({ length: count }, () => sampleFromJsonSchema(itemSchema, depth + 1));\n }\n case \"object\":\n default: {\n if (js.properties) {\n const out: Record<string, unknown> = {};\n const required = new Set(js.required ?? Object.keys(js.properties));\n for (const [key, prop] of Object.entries(js.properties)) {\n if (required.has(key) || prop.default !== undefined) {\n out[key] = sampleFromJsonSchema(prop, depth + 1);\n }\n }\n return out;\n }\n if (type === \"object\" || type === undefined) return {};\n return null;\n }\n }\n}\n\n/** A sample value satisfying the schema, or undefined when it cannot be derived. */\nexport async function sampleFromSchema(schema: Schema<unknown>): Promise<unknown | undefined> {\n const js = await toJsonSchemaAsync(schema);\n if (!js) return undefined;\n return sampleFromJsonSchema(js);\n}\n\nexport interface EdgeCase {\n name: string;\n value: unknown;\n /** Whether the schema should accept it \u2014 invalid cases assert the unhappy path. */\n expectValid: boolean;\n}\n\n/** Boundary / malformed inputs from a typed contract (ADR-0008, built incrementally). */\nexport async function edgeCasesFromSchema(schema: Schema<unknown>): Promise<EdgeCase[]> {\n const js = await toJsonSchemaAsync(schema);\n if (!js) return [];\n const valid = sampleFromJsonSchema(js);\n const cases: EdgeCase[] = [{ name: \"minimal valid sample\", value: valid, expectValid: true }];\n cases.push({ name: \"null payload\", value: null, expectValid: (js.type ?? \"object\") === \"null\" });\n cases.push({\n name: \"wrong primitive (number)\",\n value: 42,\n expectValid: js.type === \"number\" || js.type === \"integer\",\n });\n\n if (js.type === \"object\" && js.properties && typeof valid === \"object\" && valid !== null) {\n for (const key of js.required ?? []) {\n const clone = { ...(valid as Record<string, unknown>) };\n delete clone[key];\n cases.push({ name: `missing required \"${key}\"`, value: clone, expectValid: false });\n }\n for (const [key, prop] of Object.entries(js.properties)) {\n const t = Array.isArray(prop.type) ? prop.type[0] : prop.type;\n if (t === \"string\" && (js.required ?? []).includes(key)) {\n const minOk = (prop.minLength ?? 0) === 0;\n cases.push({\n name: `empty string \"${key}\"`,\n value: { ...(valid as Record<string, unknown>), [key]: \"\" },\n expectValid: minOk && prop.format === undefined && prop.pattern === undefined,\n });\n }\n if ((t === \"number\" || t === \"integer\") && prop.minimum !== undefined) {\n cases.push({\n name: `below minimum \"${key}\"`,\n value: { ...(valid as Record<string, unknown>), [key]: prop.minimum - 1 },\n expectValid: false,\n });\n }\n }\n }\n return cases;\n}\n", "// The auto-generated default smoke test (ADR-0008): fire the trigger with a sample\n// payload, auto-mock connectors, assert completion + output schema. Zero-config green/red\n// the moment an automation is written \u2014 `tesser test` synthesizes one per automation\n// that lacks a colocated test.\n\nimport type { AutomationDef, OperatorDef } from \"@devosurf/tesser-sdk\";\nimport { executeAutomation, type RunOptions, type TestRunResult } from \"./engine.js\";\nimport { sampleFromSchema } from \"./sample.js\";\n\nexport interface SmokeOutcome {\n automation: string;\n passed: boolean;\n result: TestRunResult;\n /** Machine-actionable reason when red (ADR-0008). */\n reason?: string;\n}\n\nexport async function smokeTest(def: AutomationDef<any, any, any, any, any, any, any>): Promise<SmokeOutcome> {\n try {\n const models = await smokeModelScripts(def);\n const result = await executeAutomation(def, Object.keys(models).length > 0 ? { models } : {});\n if (result.status === \"completed\") {\n return { automation: def.id, passed: true, result };\n }\n return {\n automation: def.id,\n passed: false,\n result,\n reason:\n result.error?.step !== undefined\n ? `step \"${result.error.step}\" failed: ${result.error.message}`\n : (result.error?.message ?? \"run failed\"),\n };\n } catch (err) {\n // TestConfigError (e.g. an un-derivable sample, a signal wait with no timeout) is a\n // legitimate smoke failure: the agent gets told exactly what to provide.\n return {\n automation: def.id,\n passed: false,\n result: {\n status: \"failed\",\n steps: {},\n journal: [],\n calls: {},\n emitted: [],\n slept: [],\n undone: [],\n logs: [],\n error: { name: (err as Error).name, message: (err as Error).message, retryable: false, terminal: true },\n failure: () => ({\n automation: def.id,\n status: \"failed\",\n error: { name: (err as Error).name, message: (err as Error).message, retryable: false, terminal: true },\n steps: [],\n connectorCalls: [],\n }),\n },\n reason: (err as Error).message,\n };\n }\n}\n\nasync function smokeModelScripts(\n def: AutomationDef<any, any, any, any, any, any, any>,\n): Promise<NonNullable<RunOptions[\"models\"]>> {\n const models: NonNullable<RunOptions[\"models\"]> = {};\n const operators = (def.operators ?? {}) as Record<string, OperatorDef>;\n for (const [operatorKey, op] of Object.entries(operators)) {\n const sample = await sampleFromSchema(op.output).catch(() => undefined);\n (models[operatorKey] ??= {})[op.model] = {\n ...(sample !== undefined ? { output: sample as never } : { content: \"{}\" }),\n usage: { inputTokens: 1, outputTokens: 1 },\n provider: \"tesser-smoke\",\n model: op.model,\n };\n }\n return models;\n}\n", "// Record/replay connector cassettes (ADR-0008): integration runs capture real provider\n// traffic keyed by action + input hash; replays are deterministic and offline. Cassette\n// files may contain real API responses \u2192 they are gitignored by default; replay FIXTURES\n// (sanitized trigger + journal) are a different, committed artifact.\n\nimport { mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { encodeJournal, stableStringify, type JsonValue } from \"@devosurf/tesser-sdk/internal\";\n\nexport interface CassetteEntry {\n action: string;\n inputHash: string;\n input: JsonValue;\n status: \"ok\" | \"error\";\n output?: JsonValue;\n error?: { name: string; message: string };\n recordedAt: string;\n}\n\nexport function hashInput(input: unknown): string {\n return createHash(\"sha256\").update(stableStringify(encodeJournal(input))).digest(\"hex\").slice(0, 16);\n}\n\nexport class Cassette {\n private entries: CassetteEntry[] = [];\n private used = new Set<number>();\n dirty = false;\n\n static load(path: string): Cassette {\n const c = new Cassette();\n try {\n const raw = JSON.parse(readFileSync(path, \"utf8\")) as { entries?: CassetteEntry[] };\n c.entries = raw.entries ?? [];\n } catch {\n // missing/corrupt \u2192 start empty (record mode will fill it)\n }\n return c;\n }\n\n match(action: string, input: unknown): CassetteEntry | undefined {\n const h = hashInput(input);\n const idx = this.entries.findIndex(\n (e, i) => !this.used.has(i) && e.action === action && e.inputHash === h,\n );\n if (idx === -1) {\n // fall back to a reusable match (idempotent reads recorded once, called repeatedly)\n const reusable = this.entries.find((e) => e.action === action && e.inputHash === h);\n return reusable;\n }\n this.used.add(idx);\n return this.entries[idx];\n }\n\n record(action: string, input: unknown, result: { output?: unknown; error?: { name: string; message: string } }): void {\n this.entries.push({\n action,\n inputHash: hashInput(input),\n input: encodeJournal(input),\n status: result.error ? \"error\" : \"ok\",\n ...(result.error ? { error: result.error } : { output: encodeJournal(result.output) }),\n recordedAt: new Date().toISOString(),\n });\n this.dirty = true;\n }\n\n /** Replace credential material in recorded bodies before save. */\n redact(values: string[]): void {\n if (values.length === 0) return;\n let json = JSON.stringify(this.entries);\n for (const v of values) {\n if (v.length >= 8) json = json.split(v).join(\"[REDACTED]\");\n }\n this.entries = JSON.parse(json) as CassetteEntry[];\n }\n\n save(path: string): void {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, JSON.stringify({ version: 1, entries: this.entries }, null, 2));\n this.dirty = false;\n }\n\n get size(): number {\n return this.entries.length;\n }\n}\n"],
|
|
5
|
+
"mappings": ";AAIA,SAAS,YAAAA,iBAAgB;AACzB,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,eAAe;;;ACOjB,IAAM,uBAAN,cAAmC,UAAU;AAAA,EAClD,YACW,MACA,MACT;AACA;AAAA,MACE,YAAY,IAAI,yBAAyB,IAAI;AAAA,IAE/C;AANS;AACA;AAMT,SAAK,OAAO;AAAA,EACd;AAAA,EARW;AAAA,EACA;AAQb;AAEA,SAAS,SAAS,OAAwB;AACxC,MAAI,OAAO,UAAU,WAAY,QAAO;AACxC,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,iBAAiB,QAAS,QAAO;AACrC,QAAM,QAAQ,OAAO,eAAe,KAAK;AACzC,QAAM,OAAO,OAAO,aAAa;AACjC,SAAO,OAAO,KAAK,IAAI,mCAA8B;AACvD;AAEO,SAAS,cAAc,OAAgB,OAAO,KAAgB;AACnE,MAAI,UAAU,OAAW,QAAO,EAAE,IAAI,QAAQ;AAC9C,MAAI,UAAU,KAAM,QAAO;AAC3B,QAAM,IAAI,OAAO;AACjB,MAAI,MAAM,YAAY,MAAM,UAAW,QAAO;AAC9C,MAAI,MAAM,UAAU;AAClB,UAAM,IAAI;AACV,QAAI,OAAO,SAAS,CAAC,EAAG,QAAO;AAC/B,WAAO,EAAE,IAAI,OAAO,GAAG,OAAO,CAAC,EAAE;AAAA,EACnC;AACA,MAAI,MAAM,SAAU,QAAO,EAAE,IAAI,UAAU,GAAI,MAAiB,SAAS,EAAE;AAC3E,MAAI,MAAM,cAAc,MAAM,SAAU,OAAM,IAAI,qBAAqB,MAAM,SAAS,KAAK,CAAC;AAC5F,MAAI,iBAAiB,MAAM;AACzB,UAAM,KAAK,MAAM,QAAQ;AACzB,WAAO,EAAE,IAAI,QAAQ,GAAG,OAAO,MAAM,EAAE,IAAI,OAAO,MAAM,YAAY,EAAE;AAAA,EACxE;AACA,MAAI,iBAAiB,KAAK;AACxB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,GAAG,CAAC,GAAG,MAAM,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM;AAAA,QACzC,cAAc,GAAG,GAAG,IAAI,SAAS,CAAC,GAAG;AAAA,QACrC,cAAc,GAAG,GAAG,IAAI,WAAW,CAAC,GAAG;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,EACF;AACA,MAAI,iBAAiB,KAAK;AACxB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,GAAG,CAAC,GAAG,MAAM,OAAO,CAAC,EAAE,IAAI,CAAC,GAAG,MAAM,cAAc,GAAG,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC;AAAA,IAC9E;AAAA,EACF;AACA,MAAI,iBAAiB,YAAY;AAC/B,WAAO,EAAE,IAAI,SAAS,GAAG,OAAO,KAAK,KAAK,EAAE,SAAS,QAAQ,EAAE;AAAA,EACjE;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,GAAG,MAAM,cAAc,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;AAAA,EAC9D;AACA,MAAI,MAAM,UAAU;AAClB,UAAM,QAAQ,OAAO,eAAe,KAAK;AACzC,QAAI,UAAU,OAAO,aAAa,UAAU,MAAM;AAChD,YAAM,IAAI,qBAAqB,MAAM,SAAS,KAAK,CAAC;AAAA,IACtD;AACA,UAAM,MAAM;AACZ,UAAM,MAAiC,CAAC;AACxC,eAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,UAAI,GAAG,IAAI,cAAc,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,EAAE;AAAA,IACrD;AACA,QAAI,OAAO,UAAU,eAAe,KAAK,KAAK,IAAI,EAAG,QAAO,EAAE,IAAI,OAAO,GAAG,IAAI;AAChF,WAAO;AAAA,EACT;AACA,QAAM,IAAI,qBAAqB,MAAM,SAAS,KAAK,CAAC;AACtD;AAEO,SAAS,cAAc,MAA0B;AACtD,MAAI,SAAS,QAAQ,OAAO,SAAS,SAAU,QAAO;AACtD,MAAI,MAAM,QAAQ,IAAI,EAAG,QAAO,KAAK,IAAI,aAAa;AACtD,QAAM,MAAO,KAAmC,IAAI;AACpD,MAAI,QAAQ,QAAW;AACrB,UAAM,MAA+B,CAAC;AACtC,eAAW,OAAO,OAAO,KAAK,IAAI,EAAG,KAAI,GAAG,IAAI,cAAe,KAAe,GAAG,CAAC;AAClF,WAAO;AAAA,EACT;AACA,QAAM,IAAK,KAAmC,GAAG;AACjD,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,OAAO,CAAC;AAAA,IACjB,KAAK;AACH,aAAO,OAAO,CAAW;AAAA,IAC3B,KAAK;AACH,aAAO,MAAM,OAAO,oBAAI,KAAK,GAAG,IAAI,IAAI,KAAK,CAAW;AAAA,IAC1D,KAAK;AACH,aAAO,IAAI,IAAK,EAAkB,IAAI,CAAC,MAAM;AAC3C,cAAM,CAAC,GAAG,GAAG,IAAI;AACjB,eAAO,CAAC,cAAc,CAAC,GAAG,cAAc,GAAG,CAAC;AAAA,MAC9C,CAAC,CAAC;AAAA,IACJ,KAAK;AACH,aAAO,IAAI,IAAK,EAAkB,IAAI,aAAa,CAAC;AAAA,IACtD,KAAK;AACH,aAAO,IAAI,WAAW,OAAO,KAAK,GAAa,QAAQ,CAAC;AAAA,IAC1D,KAAK,OAAO;AACV,YAAM,MAA+B,CAAC;AACtC,YAAM,QAAQ;AACd,iBAAW,OAAO,OAAO,KAAK,KAAK,EAAG,KAAI,GAAG,IAAI,cAAc,MAAM,GAAG,CAAc;AACtF,aAAO;AAAA,IACT;AAAA,IACA;AACE,YAAM,IAAI,UAAU,+BAA+B,OAAO,GAAG,CAAC,GAAG;AAAA,EACrE;AACF;;;AC3HA,IAAM,UAAkC;AAAA,EACtC,IAAI;AAAA,EACJ,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAEA,IAAM,OAAO;AAEN,SAAS,cAAc,OAAwB,OAAO,YAAoB;AAC/E,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,GAAG;AACxC,YAAM,IAAI,UAAU,GAAG,IAAI,+CAA+C,KAAK,EAAE;AAAA,IACnF;AACA,WAAO;AAAA,EACT;AACA,QAAM,IAAI,MAAM,KAAK;AACrB,MAAI,QAAQ;AACZ,MAAI,aAAa;AACjB,aAAW,KAAK,EAAE,SAAS,IAAI,GAAG;AAChC,aAAS,OAAO,EAAE,CAAC,CAAC,IAAK,QAAQ,EAAE,CAAC,CAAW;AAC/C,kBAAe,EAAE,CAAC,EAAa;AAAA,EACjC;AACA,MAAI,eAAe,KAAK,eAAe,EAAE,QAAQ,QAAQ,EAAE,EAAE,QAAQ;AACnE,UAAM,IAAI;AAAA,MACR,GAAG,IAAI,MAAM,KAAK;AAAA,IACpB;AAAA,EACF;AACA,SAAO,KAAK,MAAM,KAAK;AACzB;;;AC/BA,IAAM,YAAY,uBAAO,IAAI,wBAAwB;AACrD,IAAM,WAAW,uBAAO,IAAI,uBAAuB;AAS5C,IAAM,iBAAN,cAA6B,MAAM;AAAA,EAC/B;AAAA,EAET,YAAY,SAAiB,SAAiC;AAC5D,UAAM,SAAS,SAAS,UAAU,SAAY,SAAY,EAAE,OAAO,QAAQ,MAAM,CAAC;AAClF,SAAK,OAAO;AACZ,SAAK,eAAe,SAAS;AAC7B,WAAO,eAAe,MAAM,WAAW,EAAE,OAAO,KAAK,CAAC;AAAA,EACxD;AACF;AAGO,IAAM,gBAAN,cAA4B,MAAM;AAAA,EACvC,YAAY,SAAiB,SAA+B;AAC1D,UAAM,SAAS,SAAS,UAAU,SAAY,SAAY,EAAE,OAAO,QAAQ,MAAM,CAAC;AAClF,SAAK,OAAO;AACZ,WAAO,eAAe,MAAM,UAAU,EAAE,OAAO,KAAK,CAAC;AAAA,EACvD;AACF;AAEO,SAAS,iBAAiB,KAAqC;AACpE,SACE,eAAe,kBACd,OAAO,QAAQ,YAAY,QAAQ,QAAQ,aAAa;AAE7D;AAEO,SAAS,gBAAgB,KAAoC;AAClE,SACE,eAAe,iBACd,OAAO,QAAQ,YAAY,QAAQ,QAAQ,YAAY;AAE5D;;;ACDO,IAAM,wBAAN,cAAoC,cAAc;AAAA,EACvD,YACW,MACA,QACT;AACA;AAAA,MACE,GAAG,IAAI,yBACL,OAAO,IAAI,CAAC,MAAO,EAAE,SAAS,MAAM,EAAE,UAAU,GAAG,EAAE,IAAI,KAAK,EAAE,OAAO,EAAG,EAAE,KAAK,IAAI;AAAA,IACzF;AANS;AACA;AAMT,SAAK,OAAO;AAAA,EACd;AAAA,EARW;AAAA,EACA;AAQb;AAEA,SAAS,aAAa,MAA8C;AAClE,MAAI,CAAC,QAAQ,KAAK,WAAW,EAAG,QAAO;AACvC,SACE,OACA,KACG,IAAI,CAAC,QAAQ,OAAO,OAAO,QAAQ,YAAY,QAAQ,QAAQ,SAAS,MAAM,IAAI,MAAM,GAAG,CAAC,EAC5F,KAAK,GAAG;AAEf;AAYA,eAAsB,eACpB,QACA,OACA,MACY;AACZ,MAAI,SAAS,OAAO,WAAW,EAAE,SAAS,KAAK;AAC/C,MAAI,kBAAkB,QAAS,UAAS,MAAM;AAC9C,MAAI,OAAO,QAAQ;AACjB,UAAM,IAAI;AAAA,MACR;AAAA,MACA,OAAO,OAAO,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,MAAM,aAAa,EAAE,IAAI,EAAE,EAAE;AAAA,IAC/E;AAAA,EACF;AACA,SAAO,OAAO;AAChB;;;ACxFA,SAAS,YAAY,uBAAuB;AAG5C,IAAM,qBAAqB,IAAI,KAAK;;;ACQ7B,IAAM,qBAA0C;AAAA,EACrD,aAAa;AAAA,EACb,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AACV;AAEO,SAAS,mBACd,QACA,WAAgC,oBACX;AACrB,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,UAAU,OAAO;AACvB,MAAI,YAAY,OAAW,QAAO,EAAE,GAAG,UAAU,aAAa,OAAO,YAAY;AACjF,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO,EAAE,GAAG,UAAU,aAAa,OAAO,aAAa,MAAM,QAAQ;AAAA,EACvE;AACA,SAAO;AAAA,IACL,aAAa,OAAO;AAAA,IACpB,MAAM,QAAQ;AAAA,IACd,QAAQ,QAAQ,SAAS,SAAY,cAAc,QAAQ,MAAM,oBAAoB,IAAI,SAAS;AAAA,IAClG,OAAO,QAAQ,QAAQ,SAAY,cAAc,QAAQ,KAAK,mBAAmB,IAAI,SAAS;AAAA,IAC9F,QAAQ,QAAQ,UAAU,SAAS;AAAA,EACrC;AACF;AAIO,SAAS,iBACd,QACA,SACA,cACA,SAAuB,KAAK,QACb;AACf,MAAI,WAAW,OAAO,YAAa,QAAO;AAC1C,MAAI,QACF,OAAO,SAAS,UAAU,OAAO,SAAS,OAAO,SAAS,KAAK,IAAI,GAAG,UAAU,CAAC;AACnF,UAAQ,KAAK,IAAI,OAAO,OAAO,KAAK;AACpC,MAAI,OAAO,OAAQ,SAAQ,SAAS,MAAM,OAAO,IAAI;AACrD,MAAI,iBAAiB,OAAW,SAAQ,KAAK,IAAI,OAAO,YAAY;AACpE,SAAO,KAAK,MAAM,KAAK;AACzB;;;AC2JO,SAAS,SAAS,MAAkC;AACzD,SAAO,OAAO,SAAS,YAAY,SAAS,QAAS,KAAmB,aAAa;AACvF;;;ACtMO,SAAS,qBACd,WACA,QACS;AACT,WAAS,KAAK,MAAmB,MAAyC;AACxE,UAAM,OAAgC,CAAC;AACvC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,YAAM,YAAY,CAAC,GAAG,MAAM,GAAG;AAC/B,UAAI,SAAS,KAAK,GAAG;AACnB,aAAK,GAAG,IAAI,CAAC,UAAmB,OAAO,WAAW,OAAO,KAAK;AAAA,MAChE,OAAO;AACL,aAAK,GAAG,IAAI,KAAK,OAAsB,SAAS;AAAA,MAClD;AAAA,IACF;AACA,WAAO,OAAO,OAAO,IAAI;AAAA,EAC3B;AACA,SAAO,KAAK,UAAU,YAAY,WAAW,CAAC,GAAG,CAAC,CAAC;AACrD;AAGO,SAAS,aACd,WACA,MACuB;AACvB,MAAI,OAA4C,UAAU,YAAY,WAAW,CAAC;AAClF,aAAW,OAAO,MAAM;AACtB,QAAI,SAAS,UAAa,SAAS,IAAI,EAAG,QAAO;AACjD,WAAQ,KAAqB,GAAG;AAAA,EAClC;AACA,SAAO,SAAS,UAAa,SAAS,IAAI,IAAI,OAAO;AACvD;AAgBO,SAAS,YAAY,KAAgB,+BAAiD;AAC3F,MAAI,IAAI,cAAc,OAAW,QAAO,IAAI;AAC5C,MAAI,IAAI,WAAW,OAAQ,QAAO;AAClC,SAAO;AACT;;;ACQO,IAAM,gBAAN,cAA4B,UAAU;AAAA,EAC3C,YACW,cACT,SACA;AACA,UAAM,eAAe,YAAY,MAAM,OAAO,EAAE;AAHvC;AAIT,SAAK,OAAO;AAAA,EACd;AAAA,EALW;AAMb;AAIO,SAAS,0BACd,KACoB;AACpB,QAAM,cAAiD,CAAC;AACxD,QAAM,UAAW,IAAI,eAAe,CAAC;AACrC,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,OAAO,GAAG;AACjD,gBAAY,GAAG,IAAI,EAAE,WAAW,KAAK,IAAI,OAAO,KAAK,SAAS,YAAY;AAAA,EAC5E;AACA,QAAMC,WAAyC,CAAC;AAChD,QAAM,YAAa,IAAI,WAAW,CAAC;AACnC,aAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,SAAS,GAAG;AAClD,IAAAA,SAAQ,GAAG,IAAI,IAAI,aAAa,SAAY,EAAE,UAAU,IAAI,SAAS,IAAI,CAAC;AAAA,EAC5E;AAEA,MAAI;AACJ,QAAM,IAAI,IAAI;AACd,UAAQ,EAAE,MAAM;AAAA,IACd,KAAK,YAAY;AACf,YAAM,KAAK;AACX,gBAAU,EAAE,MAAM,YAAY,MAAM,GAAG,MAAM,GAAI,GAAG,OAAO,SAAY,EAAE,IAAI,GAAG,GAAG,IAAI,CAAC,EAAG;AAC3F;AAAA,IACF;AAAA,IACA,KAAK,WAAW;AACd,YAAM,KAAK;AACX,gBAAU,EAAE,MAAM,WAAW,SAAS,GAAG,SAAS,gBAAgB,GAAG,UAAU,OAAU;AACzF;AAAA,IACF;AAAA,IACA,KAAK,SAAS;AACZ,YAAM,KAAK;AACX,gBAAU,EAAE,MAAM,SAAS,OAAO,GAAG,MAAM,KAAK;AAChD;AAAA,IACF;AAAA,IACA,KAAK,aAAa;AAChB,YAAM,KAAK;AAGX,UAAI,MAAM,GAAG;AACb,UAAI,QAAQ,QAAW;AACrB,cAAM,QAAQ,YAAY,GAAG;AAC7B,YAAI,CAAC,OAAO;AACV,gBAAM,IAAI,cAAc,IAAI,IAAI,6BAA6B,GAAG,qCAAqC;AAAA,QACvG;AACA,YAAI,MAAM,cAAc,GAAG,aAAa;AACtC,gBAAM,IAAI;AAAA,YACR,IAAI;AAAA,YACJ,uBAAuB,GAAG,UAAU,MAAM,SAAS,2CAA2C,GAAG,WAAW;AAAA,UAC9G;AAAA,QACF;AAAA,MACF,OAAO;AACL,cAAM,aAAa,OAAO,QAAQ,WAAW,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,GAAG,WAAW;AAC/F,YAAI,WAAW,WAAW,GAAG;AAC3B,gBAAM,IAAI;AAAA,YACR,IAAI;AAAA,YACJ,WAAW,GAAG,WAAW,aAAa,GAAG,SAAS,eAAe,GAAG,WAAW;AAAA,UACjF;AAAA,QACF;AACA,YAAI,WAAW,SAAS,GAAG;AACzB,gBAAM,IAAI;AAAA,YACR,IAAI;AAAA,YACJ,WAAW,GAAG,WAAW,aAAa,GAAG,SAAS,sEAAiE,WAAW,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,UAC1J;AAAA,QACF;AACA,cAAO,WAAW,CAAC,EAAwB,CAAC;AAAA,MAC9C;AACA,UAAI;AACJ,UAAI;AACF,iBAAS,cAAc,GAAG,MAAM;AAAA,MAClC,SAAS,KAAK;AACZ,cAAM,IAAI,cAAc,IAAI,IAAI,sCAAuC,IAAc,OAAO,EAAE;AAAA,MAChG;AACA,gBAAU;AAAA,QACR,MAAM;AAAA,QACN,WAAW,GAAG;AAAA,QACd,SAAS,GAAG;AAAA,QACZ;AAAA,QACA,YAAY;AAAA,QACZ,GAAI,GAAG,UAAU,SAAY,EAAE,OAAO,GAAG,MAAM,IAAI,CAAC;AAAA,MACtD;AACA;AAAA,IACF;AAAA,IACA;AACE,YAAM,IAAI,cAAc,IAAI,IAAI,yBAA0B,EAAuB,IAAI,GAAG;AAAA,EAC5F;AAEA,QAAM,SAAuC,CAAC;AAC9C,QAAM,WAAY,IAAI,UAAU,CAAC;AACjC,aAAW,CAAC,KAAK,CAAC,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAC/C,UAAM,OAAO,YAAY,EAAE,UAAU;AACrC,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,cAAc,IAAI,IAAI,UAAU,GAAG,sBAAsB,EAAE,UAAU,qCAAqC;AAAA,IACtH;AACA,UAAM,YAAY,QAAQ,EAAE,UAAU;AACtC,QAAI,CAAC,WAAW,YAAY,eAAe;AACzC,YAAM,IAAI,cAAc,IAAI,IAAI,UAAU,GAAG,qBAAqB,EAAE,UAAU,SAAS,KAAK,SAAS,uBAAuB;AAAA,IAC9H;AACA,WAAO,GAAG,IAAI;AAAA,MACZ,YAAY,EAAE;AAAA,MACd,WAAW,KAAK;AAAA,MAChB,OAAO,EAAE;AAAA,MACT,GAAI,EAAE,aAAa,SAAY,EAAE,UAAU,EAAE,SAAS,IAAI,CAAC;AAAA,IAC7D;AAAA,EACF;AAEA,QAAM,YAA6C,CAAC;AACpD,QAAM,cAAe,IAAI,aAAa,CAAC;AACvC,aAAW,CAAC,KAAK,EAAE,KAAK,OAAO,QAAQ,WAAW,GAAG;AACnD,QAAI,CAAC,OAAO,GAAG,KAAK,GAAG;AACrB,YAAM,IAAI,cAAc,IAAI,IAAI,aAAa,GAAG,8BAA8B,GAAG,KAAK,GAAG;AAAA,IAC3F;AACA,UAAM,QAA0D,CAAC;AACjE,eAAW,QAAQ,GAAG,OAAO;AAC3B,YAAM,CAAC,SAAS,GAAG,UAAU,IAAI,KAAK,MAAM,GAAG;AAC/C,YAAM,OAAO,YAAY,OAAQ;AACjC,UAAI,CAAC,MAAM;AACT,cAAM,IAAI,cAAc,IAAI,IAAI,aAAa,GAAG,UAAU,IAAI,kCAAkC,OAAO,GAAG;AAAA,MAC5G;AACA,YAAM,YAAY,QAAQ,OAAQ;AAClC,YAAM,SAAS,YAAY,aAAa,WAAW,UAAU,IAAI;AACjE,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,cAAc,IAAI,IAAI,aAAa,GAAG,UAAU,IAAI,4BAA4B;AAAA,MAC5F;AACA,YAAM,KAAK,EAAE,MAAM,MAAM,YAAY,SAAU,QAAQ,WAAW,KAAK,GAAG,GAAG,QAAQ,OAAO,OAAO,CAAC;AAAA,IACtG;AACA,cAAU,GAAG,IAAI,EAAE,OAAO,GAAG,OAAO,cAAc,GAAG,cAAc,OAAO,UAAU,GAAG,SAAS;AAAA,EAClG;AACA,MAAI,OAAO,KAAK,SAAS,EAAE,SAAS,KAAK,CAAC,IAAI,QAAQ,QAAQ;AAC5D,UAAM,IAAI,cAAc,IAAI,IAAI,uDAAuD;AAAA,EACzF;AAEA,QAAM,YAA6C,CAAC;AACpD,QAAM,aAAc,IAAI,aAAa,CAAC;AACtC,aAAW,CAAC,KAAK,CAAC,KAAK,OAAO,QAAQ,UAAU,GAAG;AACjD,UAAM,OAAO,YAAY,EAAE,UAAU;AACrC,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,cAAc,IAAI,IAAI,aAAa,GAAG,sBAAsB,EAAE,UAAU,qCAAqC;AAAA,IACzH;AACA,UAAM,YAAY,QAAQ,EAAE,UAAU;AACtC,QAAI,CAAC,WAAW,YAAY,iBAAiB;AAC3C,YAAM,IAAI,cAAc,IAAI,IAAI,aAAa,GAAG,qBAAqB,EAAE,UAAU,SAAS,KAAK,SAAS,yBAAyB;AAAA,IACnI;AACA,cAAU,GAAG,IAAI;AAAA,MACf,YAAY,EAAE;AAAA,MACd,WAAW,KAAK;AAAA,MAChB,SAAS,EAAE;AAAA,MACX,aAAa,EAAE;AAAA,MACf,GAAI,EAAE,YAAY,SAAY,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,MACxD,GAAI,EAAE,mBAAmB,SAAY,EAAE,gBAAgB,EAAE,eAAe,IAAI,CAAC;AAAA,IAC/E;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR;AAAA,IACA;AAAA,IACA,SAAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAI,IAAI,WAAW,SAAY,EAAE,QAAQ,IAAI,OAAO,IAAI,CAAC;AAAA,IACzD,GAAI,IAAI,UAAU,SAAY,EAAE,OAAO,IAAI,MAAM,IAAI,CAAC;AAAA,IACtD,GAAI,IAAI,gBAAgB,SACpB;AAAA,MACE,aAAa;AAAA,QACX,OAAO,IAAI,YAAY;AAAA,QACvB,QAAQ,OAAO,IAAI,YAAY,QAAQ;AAAA,QACvC,YAAY,IAAI,YAAY,cAAc;AAAA,MAC5C;AAAA,IACF,IACA,CAAC;AAAA,IACL,gBAAgB,IAAI,UAAU;AAAA,IAC9B,iBAAiB,IAAI,WAAW;AAAA,EAClC;AACF;;;AC1NA,IAAM,iBAA0C;AAAA,EAC9C,aAAa;AAAA,IACX,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS,OAAO;AACd,UAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,OAAQ,MAAiC,aAAa,WAAW;AAClH,cAAM,IAAI;AACV,eAAO;AAAA,UACL,OAAO;AAAA,YACL,UAAU,EAAE;AAAA,YACZ,GAAI,OAAO,EAAE,WAAW,WAAW,EAAE,QAAQ,EAAE,OAAO,IAAI,CAAC;AAAA,UAC7D;AAAA,QACF;AAAA,MACF;AACA,aAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,iCAAiC,CAAC,EAAE;AAAA,IACnE;AAAA,EACF;AACF;AAEO,SAAS,eACd,KACA,KACA,WACgB;AAChB,QAAM,QAAQ,EAAE,QAAQ,GAAG,cAAc,EAAE;AAC3C,QAAM,MAA4D,CAAC;AACnE,aAAW,CAAC,aAAa,EAAE,KAAK,OAAO,QAAQ,IAAI,aAAa,CAAC,CAAC,GAAG;AACnE,QAAI,WAAW,IAAI,CAAC,UAClB,gBAAgB,EAAE,KAAK,KAAK,aAAa,IAAuB,OAAO,OAAO,UAAU,CAAC;AAAA,EAC7F;AACA,SAAO,OAAO,OAAO,GAAG;AAC1B;AAEA,eAAe,gBAAgB,MAQV;AACnB,QAAM,EAAE,KAAK,KAAK,aAAa,GAAG,IAAI;AACtC,QAAM,WAAW,GAAG;AACpB,QAAMC,SAAQ,IAAI,SAAS,QAAQ;AACnC,MAAI,CAACA,OAAO,OAAM,IAAI,cAAc,YAAY,WAAW,oBAAoB,QAAQ,GAAG;AAE1F,QAAM,iBAAiB,MAAM,eAAe,GAAG,OAAO,KAAK,OAAO,YAAY,WAAW,QAAQ;AACjG,QAAM,cAAc,eAAe,gBAAgB,YAAY,WAAW,QAAQ;AAClF,QAAM,QAAQ,MAAM,aAAa,KAAK,IAAI,WAAW;AACrD,QAAM,WAA2B,CAAC,EAAE,MAAM,QAAQ,SAAS,KAAK,UAAU,WAAW,EAAE,CAAC;AACxF,QAAM,mBAAmB,MAAM,WAAW,GAAG,MAAM;AACnD,MAAI,UAAU;AAEd,WAAS,OAAO,GAAG,QAAQ,GAAG,UAAU,QAAQ;AAC9C,iBAAa,KAAKA,QAAO,KAAK,OAAO,WAAW;AAChD,UAAM,UAAkC;AAAA,MACtC;AAAA,MACA;AAAA,MACA,OAAOA,OAAM;AAAA,MACb,cAAc,GAAG;AAAA,MACjB,OAAO;AAAA,MACP;AAAA,MACA,OAAO,MAAM,IAAI,CAAC,MAAM,EAAE,UAAU;AAAA,MACpC,GAAIA,OAAM,aAAa,SAAY,EAAE,UAAUA,OAAM,SAAS,IAAI,CAAC;AAAA,MACnE,GAAI,qBAAqB,SAAY,EAAE,iBAAiB,IAAI,CAAC;AAAA,IAC/D;AACA,UAAM,WAAY,MAAM,IAAI;AAAA,MAAK,YAAY,WAAW,UAAU,IAAI;AAAA,MAAI,YACxE;AAAA,QACE,MAAM,KAAK,UAAU,EAAE,cAAc,IAAI,IAAI,aAAa,UAAU,OAAAA,QAAO,QAAQ,CAAC;AAAA,QACpF,YAAY,WAAW;AAAA,MACzB;AAAA,IACF;AACA,0BAAsB,UAAU,aAAa,IAAI;AACjD,aAAS,KAAK,OAAO,QAAQ;AAC7B,iBAAa,KAAKA,QAAO,KAAK,OAAO,WAAW;AAEhD,UAAM,YAAY,SAAS,aAAa,CAAC;AACzC,QAAI,UAAU,SAAS,GAAG;AACxB,eAAS,KAAK,EAAE,MAAM,aAAa,SAAS,SAAS,WAAW,aAAa,UAAU,MAAM,gBAAgB,CAAC;AAC9G,UAAI,QAAQ;AACZ,iBAAW,QAAQ,WAAW;AAC5B;AACA,cAAM,OAAO,YAAY,OAAO,IAAI;AACpC,YAAI,CAAC,MAAM;AACT,gBAAM,IAAI,cAAc,YAAY,WAAW,sCAAsC,KAAK,IAAI,GAAG;AAAA,QACnG;AACA,YAAI,KAAK,OAAO,WAAW,SAAS;AAClC,gBAAM,WAAW,MAAM,IAAI,cAAc,YAAY,WAAW,aAAa;AAAA,YAC3E,QAAQ;AAAA,YACR,SAAS;AAAA,UACX,CAAC;AACD,cAAI,aAAa,MAAM;AACrB,kBAAM,IAAI,cAAc,YAAY,WAAW,uCAAuC,KAAK,WAAW,IAAI,EAAE;AAAA,UAC9G;AACA,cAAI,CAAC,SAAS,UAAU;AACtB,kBAAM,IAAI,cAAc,YAAY,WAAW,oCAAoC,KAAK,WAAW,IAAI,EAAE;AAAA,UAC3G;AAAA,QACF;AACA,cAAM,aAAa,MAAM,IAAI,KAAK,YAAY,WAAW,SAAS,IAAI,IAAI,KAAK,IAAI,KAAK,WAAW,IAAI,IAAI,YAAY;AACrH,gBAAM,KAAK,eAAe,IAAI,aAAwC,KAAK,eAAe,KAAK,UAAU;AACzG,iBAAO,eAAe,MAAM,GAAG,KAAK,KAAK,GAAG,YAAY,WAAW,SAAS,KAAK,WAAW,IAAI,SAAS;AAAA,QAC3G,CAAC;AACD,YAAI,KAAK,OAAO,WAAW,OAAQ,WAAU;AAC7C,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,YAAY,KAAK;AAAA,UACjB,SAAS,mBAAmB,YAAY,EAAE,QAAQ,CAAC;AAAA,QACrD,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,UAAM,YAAY,SAAS,WAAW,SAAY,SAAS,SAAS,UAAU,SAAS,SAAS,aAAa,IAAI;AACjH,WAAO,eAAe,GAAG,QAAQ,WAAW,YAAY,WAAW,SAAS;AAAA,EAC9E;AACA,QAAM,IAAI,cAAc,YAAY,WAAW,wBAAwB,GAAG,QAAQ,GAAG;AACvF;AAEA,eAAe,aACb,KACA,IACA,aACwB;AACxB,QAAM,MAAqB,CAAC;AAC5B,QAAM,cAAe,IAAI,eAAe,CAAC;AACzC,aAAW,YAAY,GAAG,OAAO;AAC/B,UAAM,CAAC,eAAe,GAAG,UAAU,IAAI,SAAS,MAAM,GAAG;AACzD,UAAM,YAAY,YAAY,aAAc;AAC5C,QAAI,CAAC,UAAW,OAAM,IAAI,cAAc,YAAY,WAAW,iCAAiC,aAAa,GAAG;AAChH,UAAM,SAAS,aAAa,WAAW,UAAU;AACjD,QAAI,CAAC,OAAQ,OAAM,IAAI,cAAc,YAAY,WAAW,WAAW,QAAQ,4BAA4B;AAC3G,UAAM,cAAc,MAAM,WAAW,OAAO,KAAwB;AACpE,QAAI,KAAK;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY;AAAA,QACV,MAAM,SAAS,QAAQ;AAAA,QACvB,MAAM;AAAA,QACN,GAAI,OAAO,aAAa,SAAY,EAAE,aAAa,OAAO,SAAS,IAAI,CAAC;AAAA,QACxE,GAAI,gBAAgB,SAAY,EAAE,YAAY,IAAI,CAAC;AAAA,MACrD;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,YAAY,OAAsB,MAA8C;AACvF,SAAO,MAAM,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,WAAW,QAAQ,KAAK,SAAS,EAAE,WAAW,IAAI;AAC7F;AAEO,SAAS,SAAS,MAAsB;AAC7C,SAAO,KAAK,QAAQ,mBAAmB,IAAI;AAC7C;AAEA,SAAS,eACP,aACA,eACA,YACsC;AACtC,MAAI,OAAO,YAAY,aAAa;AACpC,aAAW,OAAO,WAAY,QAAQ,OAA+C,GAAG;AACxF,MAAI,OAAO,SAAS,YAAY;AAC9B,UAAM,IAAI,cAAc,iBAAiB,aAAa,IAAI,WAAW,KAAK,GAAG,CAAC,kBAAkB;AAAA,EAClG;AACA,SAAO;AACT;AAEA,SAAS,sBAAsB,UAAmC,aAAqB,MAAoB;AACzG,MAAI,OAAO,aAAa,YAAY,aAAa,MAAM;AACrD,UAAM,IAAI,cAAc,YAAY,WAAW,SAAS,IAAI,gDAAgD;AAAA,EAC9G;AACA,MAAI,CAAC,SAAS,SAAS,OAAO,SAAS,MAAM,gBAAgB,YAAY,OAAO,SAAS,MAAM,iBAAiB,UAAU;AACxH,UAAM,IAAI,cAAc,YAAY,WAAW,SAAS,IAAI,uCAAuC;AAAA,EACrG;AACF;AAEA,SAAS,SAAS,OAAiD,UAAyC;AAC1G,QAAM,UAAU,SAAS,MAAM,cAAc,SAAS,MAAM,gBAAgB,SAAS,MAAM,mBAAmB;AAC9G,QAAM,gBAAgB,SAAS,MAAM;AACvC;AAEA,SAAS,aACP,KACAA,QACA,OACA,aACM;AACN,QAAM,SAAS,IAAI,QAAQ;AAC3B,MAAI,CAAC,OAAQ,OAAM,IAAI,cAAc,YAAY,WAAW,6BAA6B;AACzF,MAAI,MAAM,UAAU,OAAO,QAAQ;AACjC,UAAM,IAAI,cAAc,YAAY,WAAW,kCAAkC,MAAM,MAAM,IAAI,OAAO,MAAM,GAAG;AAAA,EACnH;AACA,MAAI,MAAM,gBAAgB,OAAO,cAAc;AAC7C,UAAM,IAAI;AAAA,MACR,YAAY,WAAW,yCAAyC,MAAM,YAAY,IAAI,OAAO,YAAY;AAAA,IAC3G;AAAA,EACF;AACA,QAAM,SAASA,OAAM,UAAU;AAC/B,MAAI,WAAW,UAAa,SAAS,OAAO,eAAe,MAAM,cAAc;AAC7E,UAAM,IAAI,cAAc,YAAY,WAAW,+DAA+D;AAAA,EAChH;AACF;AAEA,SAAS,UAAU,SAA6B,aAAqB,MAAuB;AAC1F,MAAI,CAAC,QAAS,OAAM,IAAI,cAAc,YAAY,WAAW,SAAS,IAAI,4BAA4B;AACtG,QAAM,UAAU,QAAQ,KAAK,EAAE,QAAQ,qBAAqB,EAAE,EAAE,QAAQ,WAAW,EAAE;AACrF,MAAI;AACF,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,SAAS,OAAO;AACd,UAAM,IAAI,cAAc,YAAY,WAAW,SAAS,IAAI,+BAA+B,EAAE,MAAM,CAAC;AAAA,EACtG;AACF;AAEA,SAAS,eAAe,OAAgB,MAA4B;AAClE,MAAI;AACF,WAAO,cAAc,cAAc,KAAK,CAAC;AAAA,EAC3C,SAAS,OAAO;AACd,UAAM,IAAI,cAAc,GAAG,IAAI,wBAAwB,EAAE,MAAM,CAAC;AAAA,EAClE;AACF;AAEA,SAAS,mBAAmB,OAAqB,MAAoC;AACnF,QAAM,MAAM,KAAK,UAAU,EAAE,SAAS,KAAK,SAAS,OAAO,cAAc,KAAK,EAAE,CAAC;AACjF,SAAO,IAAI,UAAU,MAAO,MAAM,IAAI,MAAM,GAAG,IAAI,IAAI;AACzD;AAEA,eAAe,WAAW,QAA4D;AACpF,QAAM,MAAO,OAAiD,WAAW;AACzE,MAAI;AACF,QAAI;AACJ,UAAM,SAAS;AACf,QAAI,OAAO,OAAO,iBAAiB,WAAY,QAAO,OAAO,aAAa;AAAA,aACjE,KAAK,WAAW,OAAO;AAC9B,YAAM,MAAO,MAAM,OAAO,KAAK;AAI/B,YAAM,UAAU,IAAI,gBAAgB,IAAI,GAAG;AAC3C,UAAI,QAAS,QAAO,QAAQ,QAAQ,EAAE,iBAAiB,MAAM,CAAC;AAAA,IAChE;AACA,QAAI,SAAS,OAAW,QAAO;AAC/B,WAAO,cAAc,cAAc,IAAiB,CAAC;AAAA,EACvD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AC/QO,SAAS,eACd,KACA,MACA,aACgB;AAChB,QAAM,MAA4G,CAAC;AACnH,QAAM,YAAa,IAAI,aAAa,CAAC;AACrC,aAAW,CAAC,YAAY,CAAC,KAAK,OAAO,QAAQ,SAAS,GAAG;AACvD,QAAI,UAAU,IAAI;AAAA,MAChB,KAAK,OAAO,YAAY;AACtB,YAAI,CAAC,WAAW,OAAO,QAAQ,WAAW,YAAY,QAAQ,OAAO,WAAW,GAAG;AACjF,gBAAM,IAAI,cAAc,WAAW,UAAU,sBAAsB;AAAA,QACrE;AACA,YAAI,CAAC,QAAQ,OAAQ,OAAM,IAAI,cAAc,WAAW,UAAU,6BAA6B;AAC/F,cAAM,MAAM,MAAM,YAAY,EAAE,cAAc,IAAI,IAAI,YAAY,SAAS,GAAG,QAAQ,CAAC;AACvF,cAAM,SAASC,gBAAe,KAAK,WAAW,UAAU,SAAS;AACjE,cAAM,SAAS,MAAM,eAAe,QAAQ,QAAQ,OAAO,QAAQ,WAAW,UAAU,SAAS;AACjG,eAAO,EAAE,GAAG,QAAQ,QAAQA,gBAAe,QAAQ,WAAW,UAAU,SAAS,EAAW;AAAA,MAC9F;AAAA,IACF;AAAA,EACF;AACA,SAAO,OAAO,OAAO,GAAG;AAC1B;AAEA,SAASA,gBAAe,OAAgB,MAA4B;AAClE,MAAI;AACF,WAAO,cAAc,cAAc,KAAK,CAAC;AAAA,EAC3C,SAAS,OAAO;AACd,UAAM,IAAI,cAAc,GAAG,IAAI,wBAAwB,EAAE,MAAM,CAAC;AAAA,EAClE;AACF;;;AC1CO,IAAM,OAAO;AAAA,EAClB,IAAI;AAAA;AAAA,EAEJ,OAAO;AAAA;AAAA,EAEP,OAAO;AAAA;AAAA,EAEP,cAAc;AAAA;AAAA,EAEd,oBAAoB;AAAA;AAAA,EAEpB,MAAM;AAAA;AAAA,EAEN,WAAW;AAAA;AAAA,EAEX,UAAU;AAAA;AAAA,EAEV,eAAe;AACjB;;;AChBO,IAAM,SAAN,MAAa;AAAA,EAClB,YAAqB,MAAe;AAAf;AAAA,EAAgB;AAAA,EAAhB;AAAA;AAAA,EAGrB,KAAK,OAAgB,OAAoC;AACvD,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,KAAK,UAAU,OAAO,MAAM,CAAC,IAAI,IAAI;AAAA,IAC5D,OAAO;AACL,cAAQ,OAAO,OAAO,QAAQ,MAAM,KAAc,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,KAAK,IAAI;AAAA,IAC9F;AAAA,EACF;AAAA;AAAA,EAGA,IAAI,KAAmB;AACrB,YAAQ,OAAO,MAAM,MAAM,IAAI;AAAA,EACjC;AAAA,EAEA,KAAK,MAAgB,SAAiB,OAAwC;AAC5E,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,KAAK,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,IAAI;AAAA,IAC7F,OAAO;AACL,cAAQ,OAAO,MAAM,UAAU,OAAO;AAAA,CAAI;AAC1C,UAAI,MAAO,SAAQ,OAAO,MAAM,KAAK,UAAU,OAAO,MAAM,CAAC,IAAI,IAAI;AAAA,IACvE;AACA,YAAQ,KAAK,IAAI;AAAA,EACnB;AACF;AAEO,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClC,YACW,MACT,SACS,OACT;AACA,UAAM,OAAO;AAJJ;AAEA;AAAA,EAGX;AAAA,EALW;AAAA,EAEA;AAIb;AAEO,SAAS,OAAO,KAAc,KAAoB;AACvD,MAAI,eAAe,SAAU,KAAI,KAAK,IAAI,MAAM,IAAI,SAAS,IAAI,KAAK;AACtE,MAAI,KAAK,KAAK,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AACvE;;;ACzCO,IAAM,YAAN,MAAgB;AAAA,EACrB,YACW,SACA,OACT;AAFS;AACA;AAAA,EACR;AAAA,EAFQ;AAAA,EACA;AAAA,EAGX,MAAM,QAAW,QAAgB,MAAc,MAA4B;AACzE,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI;AAAA,QACR,KAAK;AAAA,QACL;AAAA,MACF;AAAA,IACF;AACA,QAAI;AACJ,QAAI;AACF,YAAM,MAAM,MAAM,GAAG,KAAK,OAAO,OAAO,IAAI,IAAI;AAAA,QAC9C;AAAA,QACA,SAAS;AAAA,UACP,eAAe,UAAU,KAAK,KAAK;AAAA,UACnC,GAAI,SAAS,SAAY,EAAE,gBAAgB,mBAAmB,IAAI,CAAC;AAAA,QACrE;AAAA,QACA,GAAI,SAAS,SAAY,EAAE,MAAM,KAAK,UAAU,IAAI,EAAE,IAAI,CAAC;AAAA,MAC7D,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,IAAI,SAAS,KAAK,MAAM,4BAA4B,KAAK,OAAO,KAAK,OAAO,KAAK,CAAC,GAAG;AAAA,IAC7F;AACA,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,SAAS,IAAI,KAAK,MAAM,IAAI,IAAI;AAAA,IAChD,QAAQ;AACN,eAAS,EAAE,KAAK,KAAK;AAAA,IACvB;AACA,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,UAAU;AAChB,YAAM,UAAU,SAAS,OAAO,WAAW,sBAAsB,IAAI,MAAM;AAC3E,UAAI,IAAI,WAAW,IAAK,OAAM,IAAI,SAAS,KAAK,MAAM,OAAO;AAC7D,UAAI,IAAI,WAAW,IAAK,OAAM,IAAI,SAAS,KAAK,WAAW,OAAO;AAClE,UAAI,IAAI,WAAW,IAAK,OAAM,IAAI,SAAS,KAAK,OAAO,OAAO;AAC9D,UAAI,IAAI,WAAW,IAAK,OAAM,IAAI,SAAS,KAAK,UAAU,OAAO;AACjE,YAAM,IAAI,SAAS,KAAK,OAAO,OAAO;AAAA,IACxC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,IAAO,MAA0B;AAC/B,WAAO,KAAK,QAAQ,OAAO,IAAI;AAAA,EACjC;AAAA,EACA,KAAQ,MAAc,MAA4B;AAChD,WAAO,KAAK,QAAQ,QAAQ,MAAM,IAAI;AAAA,EACxC;AAAA,EACA,IAAO,MAAc,MAA4B;AAC/C,WAAO,KAAK,QAAQ,OAAO,MAAM,IAAI;AAAA,EACvC;AAAA,EACA,OAAU,MAA0B;AAClC,WAAO,KAAK,QAAQ,UAAU,IAAI;AAAA,EACpC;AACF;;;AC3DA,SAAS,YAAY,WAAW,cAAc,qBAAqB;AACnE,SAAS,eAAe;AACxB,SAAS,SAAS,YAAY;AAiB9B,IAAM,cAAc;AAAA,EAClB,QAAQ,IAAI,mBAAmB,KAAK,KAAK,QAAQ,GAAG,WAAW,QAAQ;AAAA,EACvE;AACF;AAEO,SAAS,aAAwB;AACtC,MAAI;AACF,WAAO,KAAK,MAAM,aAAa,aAAa,MAAM,CAAC;AAAA,EACrD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,YAAY,QAAyB;AACnD,YAAU,QAAQ,WAAW,GAAG,EAAE,WAAW,KAAK,CAAC;AACnD,gBAAc,aAAa,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,MAAM,EAAE,MAAM,IAAM,CAAC;AACpF;AAEO,SAAS,cAAc,QAAmB,MAAwB;AACvE,QAAM,cAAc,QAAQ,OAAO,WAAW;AAC9C,SAAO,OAAO,WAAW,WAAW,KAAK,CAAC;AAC5C;AAEO,SAAS,gBAAgB,QAAQ,QAAQ,IAAI,GAAkB;AACpE,MAAI,MAAM;AACV,aAAS;AACP,QAAI,WAAW,KAAK,KAAK,aAAa,CAAC,EAAG,QAAO;AACjD,UAAM,SAAS,QAAQ,GAAG;AAC1B,QAAI,WAAW,IAAK,QAAO;AAC3B,UAAM;AAAA,EACR;AACF;AAEO,SAAS,iBAAiB,MAAmC;AAClE,MAAI;AACF,WAAO,KAAK,MAAM,aAAa,KAAK,MAAM,aAAa,GAAG,MAAM,CAAC;AAAA,EACnE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AASO,SAAS,cAAc,MAA0E;AACtG,QAAM,SAAS,WAAW;AAC1B,QAAM,UAAU,cAAc,QAAQ,KAAK,OAAO;AAClD,QAAM,cAAc,gBAAgB;AACpC,QAAM,WAAW,cAAc,iBAAiB,WAAW,IAAI;AAC/D,SAAO;AAAA,IACL,KACE,KAAK,OACL,UAAU,YACV,QAAQ,IAAI,YAAY,KACxB,QAAQ,OACR;AAAA,IACF,OAAO,KAAK,SAAS,QAAQ,IAAI,cAAc,KAAK,QAAQ;AAAA,IAC5D,SAAS,UAAU;AAAA,IACnB;AAAA,EACF;AACF;;;ACnFA,SAAS,aAAa,cAAAC,aAAY,aAAa,gBAAgB;AAC/D,SAAS,cAAc;AACvB,SAAS,QAAAC,aAAY;AACrB,SAAS,qBAAqB;AAC9B,SAAS,aAAa;AAUf,SAAS,yBAAyB,aAAwC;AAC/E,QAAM,OAAOA,MAAK,aAAa,aAAa;AAC5C,MAAI,CAACD,YAAW,IAAI,EAAG,QAAO,CAAC;AAC/B,QAAM,MAAyB,CAAC;AAChC,aAAW,QAAQ,YAAY,IAAI,EAAE,KAAK,GAAG;AAC3C,UAAM,MAAMC,MAAK,MAAM,IAAI;AAC3B,QAAI,CAAC,SAAS,GAAG,EAAE,YAAY,EAAG;AAClC,UAAM,QAAQA,MAAK,KAAK,UAAU;AAClC,QAAI,CAACD,YAAW,KAAK,EAAG;AACxB,UAAM,WAAW,YAAY,GAAG,EAAE,KAAK,CAAC,MAAM,2BAA2B,KAAK,CAAC,CAAC;AAChF,QAAI,KAAK,EAAE,cAAc,MAAM,KAAK,OAAO,SAAS,CAAC;AAAA,EACvD;AACA,SAAO;AACT;AAEA,eAAsB,kBAAkB,OAA0E;AAChH,QAAM,SAAS,YAAYC,MAAK,OAAO,GAAG,aAAa,CAAC;AACxD,QAAM,UAAUA,MAAK,QAAQ,YAAY;AACzC,QAAM,MAAM;AAAA,IACV,aAAa,CAAC,KAAK;AAAA,IACnB,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,EACZ,CAAC;AACD,QAAM,MAAO,MAAM,OAAO,cAAc,OAAO,EAAE;AACjD,MAAI,CAAC,IAAI,WAAW,OAAO,IAAI,QAAQ,QAAQ,YAAY;AACzD,UAAM,IAAI,MAAM,GAAG,KAAK,2CAA2C;AAAA,EACrE;AACA,SAAO,IAAI;AACb;;;AClDA,SAAS,aAAa;AActB,eAAsB,eAAe,KAAa,aAAqB,MAAsC;AAC3G,QAAM,OAAO,KAAK,QAAQ;AAC1B,MAAI,SAAS,kBAAkB,SAAS,UAAU;AAChD,UAAM,IAAI,SAAS,KAAK,OAAO,sDAAsD;AAAA,EACvF;AACA,QAAM,QACJ,KAAK,eAAe,QAAQ,KAAK,YAAY,SACzC,MAAM,mBAAmB,IAAI,IAC7B,SAAS,iBACP,MAAM,oBAAoB,KAAK,KAAK,OAAO,QAAQ,IACnD,MAAM,mBAAmB,EAAE,GAAG,MAAM,YAAY,KAAK,CAAC;AAC9D,QAAM,eAAe;AAAA,IACnB;AAAA,IACA,SAAS,KAAK;AAAA,IACd,WAAW;AAAA,IACX;AAAA,IACA,OAAO,KAAK,SAAS;AAAA,IACrB,GAAI,KAAK,cAAc,SAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,IACpE,QAAQ,SAAS,iBAAiB,EAAE,aAAa,MAAM,IAAI,EAAE,SAAS,MAAM;AAAA,EAC9E,CAAC;AACD,MAAI,KAAK,EAAE,WAAW,eAAe,MAAM,WAAW,KAAK,GAAG,MAAM,eAAe,IAAI,mBAAc;AACvG;AAEA,eAAsB,OAAO,KAAa,aAAqB,MAAsC;AACnG,QAAM,OAAO,KAAK,QAAQ;AAC1B,MAAI,SAAS,oBAAoB,SAAS,mBAAmB;AAC3D,UAAM,IAAI,SAAS,KAAK,OAAO,wDAAwD;AAAA,EACzF;AACA,QAAM,QAAQ,MAAM,mBAAmB,IAAI;AAC3C,QAAM,eAAe;AAAA,IACnB;AAAA,IACA,SAAS,KAAK;AAAA,IACd,WAAW;AAAA,IACX;AAAA,IACA,OAAO,KAAK,SAAS;AAAA,IACrB,GAAI,KAAK,cAAc,SAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,IACpE,QAAQ,SAAS,mBAAmB,EAAE,aAAa,MAAM,IAAI,EAAE,SAAS,MAAM;AAAA,EAChF,CAAC;AACD,MAAI,KAAK,EAAE,WAAW,MAAM,MAAM,WAAW,KAAK,GAAG,MAAM,MAAM,IAAI,mBAAc;AACrF;AAEA,eAAe,mBAAmB,MAAwC;AACxE,MAAI,KAAK,YAAY,QAAW;AAC9B,UAAMC,SAAQ,QAAQ,IAAI,KAAK,OAAO;AACtC,QAAI,CAACA,OAAO,OAAM,IAAI,SAAS,KAAK,OAAO,OAAO,KAAK,OAAO,sBAAsB;AACpF,WAAOA;AAAA,EACT;AACA,MAAI,KAAK,eAAe,MAAM;AAC5B,UAAM,IAAI,SAAS,KAAK,OAAO,4EAA4E;AAAA,EAC7G;AACA,QAAM,SAAmB,CAAC;AAC1B,mBAAiB,SAAS,QAAQ,MAAO,QAAO,KAAK,KAAe;AACpE,QAAM,QAAQ,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM,EAAE,KAAK;AAC1D,MAAI,MAAM,WAAW,EAAG,OAAM,IAAI,SAAS,KAAK,OAAO,sBAAsB;AAC7E,SAAO;AACT;AAEA,eAAe,oBAAoB,KAAa,KAA8B;AAC5E,MAAI,IAAI,0EAA0E;AAClF,QAAM,MAAM,MAAM,sBAAsB,KAAK,CAAC,aAAa,CAAC;AAC5D,QAAM,QAAQ,mBAAmB,GAAG;AACpC,MAAI,CAAC,OAAO;AACV,UAAM,IAAI;AAAA,MACR,KAAK;AAAA,MACL;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,sBAAsB,SAAiB,MAAiC;AAC/E,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,QAAQ,MAAM,SAAS,MAAM,EAAE,OAAO,CAAC,WAAW,QAAQ,MAAM,EAAE,CAAC;AACzE,QAAI,MAAM;AACV,UAAM,SAAS,CAAC,QAAgB;AAC9B,YAAM,OAAO,IAAI,SAAS,MAAM;AAChC,aAAO;AACP,cAAQ,OAAO,MAAM,oBAAoB,IAAI,CAAC;AAAA,IAChD;AACA,UAAM,OAAO,GAAG,QAAQ,MAAM;AAC9B,UAAM,OAAO,GAAG,QAAQ,MAAM;AAC9B,UAAM,GAAG,SAAS,MAAM;AACxB,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,UAAI,SAAS,EAAG,SAAQ,GAAG;AAAA,UACtB,QAAO,IAAI,SAAS,KAAK,OAAO,GAAG,OAAO,IAAI,KAAK,KAAK,GAAG,CAAC,WAAW,QAAQ,CAAC,EAAE,CAAC;AAAA,IAC1F,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,mBAAmB,KAA4B;AACtD,QAAM,WAAW,IAAI,MAAM,wCAAwC;AACnE,MAAI,WAAW,CAAC,EAAG,QAAO,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,gBAAgB,EAAE;AACvE,QAAM,aAAa,IAChB,MAAM,OAAO,EACb,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,wBAAwB,KAAK,CAAC,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC;AACxE,SAAO,WAAW,GAAG,EAAE,KAAK;AAC9B;AAEA,SAAS,oBAAoB,MAAsB;AACjD,SAAO,KAAK,QAAQ,2CAA2C,cAAc,EAAE,QAAQ,4BAA4B,kBAAkB;AACvI;AAEA,eAAe,eAAe,MAQZ;AAChB,QAAM,MAAM,eAAe,KAAK,aAAa,KAAK,OAAO;AACzD,QAAM,OAAO,IAAI,gBAAgB,EAAE,WAAW,KAAK,WAAW,MAAM,KAAK,MAAM,OAAO,KAAK,MAAM,CAAC;AAClG,MAAI,KAAK,cAAc,OAAW,MAAK,IAAI,eAAe,KAAK,SAAS;AACxE,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,MAAM,EAAG,MAAK,IAAI,SAAS,GAAG,IAAI,KAAK;AACtF,QAAM,MAAM,MAAM,MAAM,KAAK;AAAA,IAC3B,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,oCAAoC;AAAA,IAC/D,MAAM,KAAK,SAAS;AAAA,IACpB,UAAU;AAAA,EACZ,CAAC;AACD,MAAI,IAAI,UAAU,OAAO,IAAI,SAAS,IAAK;AAC3C,QAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,QAAM,IAAI,SAAS,KAAK,OAAO,yBAAyB,KAAK,SAAS,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM,GAAG,OAAO,IAAI,IAAI,KAAK,EAAE,EAAE;AAC/H;AAEA,SAAS,eAAe,aAAqB,SAAyB;AACpE,MAAI,gBAAgB,KAAK,OAAO,GAAG;AACjC,UAAM,IAAI,IAAI,IAAI,OAAO;AACzB,UAAM,QAAQ,EAAE,SAAS,MAAM,oBAAoB;AACnD,QAAI,CAAC,QAAQ,CAAC,EAAG,OAAM,IAAI,SAAS,KAAK,OAAO,0DAA0D;AAC1G,WAAO,GAAG,EAAE,MAAM,YAAY,MAAM,CAAC,CAAC;AAAA,EACxC;AACA,QAAM,QAAQ,QAAQ,QAAQ,iBAAiB,EAAE;AACjD,MAAI,CAAC,kBAAkB,KAAK,KAAK,EAAG,OAAM,IAAI,SAAS,KAAK,OAAO,0DAA0D;AAC7H,SAAO,GAAG,YAAY,QAAQ,OAAO,EAAE,CAAC,YAAY,KAAK;AAC3D;;;ACjIA,eAAsB,OACpB,KACAC,MACA,SACA,MACgB;AAChB,QAAMA,KAAI,KAAK,aAAa,OAAO,SAAS;AAAA,IAC1C,GAAI,KAAK,QAAQ,SAAY,EAAE,KAAK,KAAK,IAAI,IAAI,CAAC;AAAA,IAClD,GAAI,KAAK,UAAU,SAAY,EAAE,WAAW,KAAK,MAAM,IAAI,CAAC;AAAA,EAC9D,CAAC;AACD,MAAI,IAAI,mBAAmB,OAAO,GAAG,KAAK,QAAQ,kBAAkB,KAAK,MAAM,MAAM,KAAK,GAAG,KAAK,EAAE,EAAE;AAEtG,MAAI,KAAK,SAAS,OAAO;AACvB,QAAI,KAAK,EAAE,QAAQ,KAAK,CAAC;AACzB,YAAQ,KAAK,KAAK,EAAE;AAAA,EACtB;AAEA,QAAM,WAAW,KAAK,IAAI,KAAK,KAAK,aAAa,KAAK;AACtD,MAAI,OAAoB,CAAC;AACzB,SAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,UAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAC3C,WAAO,MAAMA,KAAI,IAAiB,aAAa,OAAO,iBAAiB;AACvE,UAAM,SAAS,KAAK,MAAM;AAC1B,QAAI,WAAW,aAAa,WAAW,UAAU,WAAW,OAAW;AAEvE,UAAM,SAAU,KAAK,MAAM,UAAU,CAAC;AACtC,QAAI,WAAW,sBAAsB;AACnC,UAAI;AAAA,QACF,EAAE,QAAQ,YAAY,OAAO,YAAY,OAAO;AAAA,QAChD,MACE;AAAA;AAAA,IAAmF,OAAO,UAAU;AAAA,2BAA8B,KAAK,QAAQ,aAAa,EAAE;AAAA,MAClK;AACA,cAAQ,KAAK,KAAK,kBAAkB;AAAA,IACtC;AACA,QAAI,WAAW,UAAU;AACvB,UAAI;AAAA,QAAK,EAAE,QAAQ,QAAQ,OAAO,KAAK,MAAM,MAAM;AAAA,QAAG,MACpD;AAAA,UACE;AAAA,UACA,IAAI,OAAO,UAAU,CAAC,GAAG,IAAI,CAAC,MAAM,KAAK,EAAE,UAAU,KAAK,EAAE,KAAK,MAAM,EAAE,OAAO,MAAM,IAAI,EAAE,CAAC,CAAC,EAAE;AAAA,UAChG,GAAI,KAAK,MAAM,QAAQ,CAAC,KAAK,KAAK,KAAK,KAAK,EAAE,IAAI,CAAC;AAAA,QACrD,EAAE,KAAK,IAAI;AAAA,MACb;AACA,cAAQ,KAAK,KAAK,aAAa;AAAA,IACjC;AACA,QAAI,WAAW,UAAU;AACvB,UAAI;AAAA,QAAK,EAAE,QAAQ,QAAQ,MAAM,KAAK,KAAK;AAAA,QAAG,MAC5C;AAAA,UACE,eAAe,OAAO,KAAK,MAAM,GAAG,CAAC,KAAK,GAAG,WAAM,OAAO,GAAG;AAAA,UAC7D,gBAAgB,OAAO,OAAO,KAAK,IAAI,KAAK,QAAQ;AAAA,UACpD,gBAAgB,OAAO,WAAW,KAAK,IAAI,KAAK,QAAQ;AAAA,UACxD,GAAI,OAAO,SAAS,SAAS,CAAC,gBAAgB,OAAO,QAAQ,KAAK,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,QAChF,EAAE,KAAK,IAAI;AAAA,MACb;AACA,cAAQ,KAAK,KAAK,EAAE;AAAA,IACtB;AAAA,EACF;AACA,QAAM,IAAI,SAAS,KAAK,OAAO,8CAA8C,EAAE,KAAoB,CAAC;AACtG;;;AC3EA,SAAS,mBAAmB;AAC5B,SAAS,SAAAC,cAAa;AACtB,SAAS,cAAAC,aAAY,aAAa;AAClC,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAO9B,SAAS,cAAc,OAAgC;AACrD,QAAM,SAAS,QAAQ,IAAI,mBAAmB;AAC9C,MAAI,UAAUC,YAAW,MAAM,GAAG;AAChC,WAAO,OAAO,SAAS,MAAM,KAAK,OAAO,SAAS,KAAK,IAAI,CAAC,QAAQ,UAAU,MAAM,IAAI,CAAC,MAAM;AAAA,EACjG;AACA,MAAI,MAAM;AACV,aAAS;AACP,UAAM,QAAQC,MAAK,KAAK,gBAAgB,aAAa,iBAAiB,OAAO,mBAAmB;AAChG,QAAID,YAAW,KAAK,EAAG,QAAO,CAAC,QAAQ,UAAU,KAAK;AACtD,UAAM,OAAOC,MAAK,KAAK,gBAAgB,QAAQ,eAAe;AAC9D,QAAID,YAAW,IAAI,EAAG,QAAO,CAAC,IAAI;AAClC,UAAM,SAASE,SAAQ,GAAG;AAC1B,QAAI,WAAW,IAAK,QAAO;AAC3B,UAAM;AAAA,EACR;AACF;AAEA,eAAsB,IACpB,KACA,aACA,SACA,MACe;AACf,QAAM,MAAM,cAAc,WAAW;AACrC,MAAI,CAAC,KAAK;AACR,UAAM,IAAI;AAAA,MACR,KAAK;AAAA,MACL;AAAA,IACF;AAAA,EACF;AACA,QAAM,OAAO,KAAK,QAAQ;AAC1B,QAAM,QAAQ,OAAO,YAAY,EAAE,EAAE,SAAS,KAAK,CAAC;AACpD,QAAM,MAAM,oBAAoB,IAAI;AAEpC,MAAI,IAAI,8BAA8B,GAAG,wCAAwC;AACjF,QAAM,QAAQC,OAAM,IAAI,CAAC,GAAI,IAAI,MAAM,CAAC,GAAG;AAAA,IACzC,KAAK;AAAA,MACH,GAAG,QAAQ;AAAA,MACX,MAAM,OAAO,IAAI;AAAA,MACjB,iBAAiBF,MAAK,aAAa,SAAS;AAAA,MAC5C,wBAAwB;AAAA,MACxB,iBAAiB;AAAA,MACjB,cAAc;AAAA,IAChB;AAAA,IACA,OAAO,CAAC,UAAU,WAAW,SAAS;AAAA,EACxC,CAAC;AACD,QAAM,OAAO,MAAM;AACjB,UAAM,KAAK,SAAS;AAAA,EACtB;AACA,UAAQ,GAAG,UAAU,MAAM;AACzB,SAAK;AACL,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACD,UAAQ,GAAG,WAAW,IAAI;AAE1B,QAAMG,OAAM,IAAI,UAAU,KAAK,KAAK;AACpC,QAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,aAAS;AACP,QAAI;AACF,YAAMA,KAAI,IAAI,SAAS;AACvB;AAAA,IACF,QAAQ;AACN,UAAI,KAAK,IAAI,IAAI,SAAU,OAAM,IAAI,SAAS,KAAK,OAAO,gCAAgC;AAC1F,YAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAAA,IAC7C;AAAA,EACF;AACA,QAAMA,KAAI,KAAK,aAAa,EAAE,MAAM,QAAQ,CAAC;AAE7C,QAAM,WAAW,YAAY;AAC3B,UAAMA,KAAI,KAAK,aAAa,OAAO,SAAS,EAAE,WAAW,YAAY,CAAC;AAEtE,aAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,YAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAC3C,YAAM,QAAQ,MAAMA,KAAI;AAAA,QACtB,aAAa,OAAO;AAAA,MACtB;AACA,YAAM,SAAS,MAAM,MAAM;AAC3B,UAAI,WAAW,UAAW;AAC1B,UAAI,WAAW,sBAAsB;AACnC,YAAI,IAAI;AAAA,IAAoD,MAAM,MAAM,QAAQ,UAAU,EAAE;AAAA,MAC9F,WAAW,WAAW,UAAU;AAC9B,YAAI,IAAI,kBAAkB,KAAK,UAAU,MAAM,MAAM,QAAQ,UAAU,CAAC,CAAC,CAAC,EAAE;AAAA,MAC9E,WAAW,WAAW,UAAU;AAC9B,YAAI,IAAI,sCAA4B,GAAG,UAAU,OAAO,eAAe;AAAA,MACzE;AACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,SAAS;AAEf,MAAI,KAAK,UAAU,OAAO;AACxB,QAAI,QAA+B;AACnC,UAAMH,MAAK,aAAa,aAAa,GAAG,EAAE,WAAW,KAAK,GAAG,MAAM;AACjE,UAAI,MAAO,cAAa,KAAK;AAC7B,cAAQ,WAAW,MAAM;AACvB,YAAI,IAAI,0CAAgC;AACxC,aAAK,SAAS;AAAA,MAChB,GAAG,GAAG;AAAA,IACR,CAAC;AACD,QAAI,IAAI,oDAAoD;AAC5D,UAAM,IAAI,QAAQ,MAAM;AAAA,IAAC,CAAC;AAAA,EAC5B,OAAO;AACL,SAAK;AAAA,EACP;AACF;;;ACnHA,SAAS,cAAAI,aAAY,aAAAC,YAAW,iBAAAC,sBAAqB;AACrD,SAAS,QAAAC,aAAY;;;ACJrB,SAAS,cAAAC,aAAY,aAAAC,YAAW,gBAAAC,eAAc,iBAAAC,sBAAqB;AACnE,SAAS,QAAAC,aAAY;AAId,IAAM,sBAAsB,CAAC,wBAAwB,6BAA6B;AAClF,IAAM,0BAA0B,CAAC,oBAAoB,2BAA2B,0BAA0B;AAE1G,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMO,SAAS,mBAAmB,MAAc,SAA6B;AAC5E,SAAO;AAAA,IACL;AAAA,IACA,SAAS;AAAA,IACT,MAAM;AAAA,IACN,gBAAgB;AAAA,IAChB,SAAS,EAAE,MAAM,eAAe,QAAQ,iBAAiB,KAAK,aAAa;AAAA,IAC3E,cAAc;AAAA,MACZ,wBAAwB;AAAA,MACxB,+BAA+B;AAAA,MAC/B,KAAK;AAAA,IACP;AAAA,IACA,iBAAiB;AAAA,MACf,oBAAoB;AAAA,MACpB,2BAA2B;AAAA,MAC3B,4BAA4B;AAAA,MAC5B,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AAEO,SAAS,8BAA8B,MAAc,aAAqB,SAAiB,MAAuC;AACvI,QAAM,OAAOC,MAAK,MAAM,WAAW;AACnC,MAAI,CAAC,KAAK,aAAaC,YAAW,IAAI,EAAG,QAAO;AAChD,EAAAC,eAAc,MAAM,gBAAgB,aAAa,OAAO,CAAC;AACzD,SAAO;AACT;AAEO,SAAS,yBAAyB,MAAc,aAAqB,SAA2B;AACrG,QAAM,UAAUF,MAAK,MAAM,WAAW,MAAM;AAC5C,EAAAG,WAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AACtC,QAAM,OAA+B;AAAA,IACnC,iBAAiB,KAAK;AAAA,MACpB;AAAA,QACE,MAAM;AAAA,QACN,eAAe;AAAA,QACf,aAAa;AAAA,QACb,eAAe;AAAA,QACf,SAAS;AAAA,QACT,gBAAgB,oBAAoB,OAAO,CAAC,SAAS,SAAS,4BAA4B;AAAA,MAC5F;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI;AAAA,IACJ,aAAa,aAAa,aAAa,OAAO;AAAA,IAC9C,UAAU,eAAe,OAAO;AAAA,IAChC,UAAU,eAAe,OAAO;AAAA,IAChC,iBAAiB,sBAAsB,OAAO;AAAA,EAChD;AACA,aAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,IAAI,GAAG;AAClD,IAAAD,eAAcF,MAAK,SAAS,IAAI,GAAG,OAAO;AAAA,EAC5C;AACA,SAAO,CAAC,GAAG,mBAAmB;AAChC;AAEO,SAAS,kBAA0B;AACxC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACT;AAEO,SAAS,0BAA0B,MAAuB;AAC/D,QAAM,OAAOA,MAAK,MAAM,YAAY;AACpC,QAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACd,MAAI,CAACC,YAAW,IAAI,GAAG;AACrB,IAAAC,eAAc,MAAM,gBAAgB,CAAC;AACrC,WAAO;AAAA,EACT;AACA,QAAM,WAAWE,cAAa,MAAM,MAAM;AAC1C,MAAI,SAAS,SAAS,kBAAkB,EAAG,QAAO;AAClD,EAAAF,eAAc,MAAM,SAAS,QAAQ,QAAQ,IAAI,IAAI,KAAK;AAC1D,SAAO;AACT;AAEO,SAAS,eACd,KACA,SACA,SACM;AACN,QAAM,cAAcF,MAAK,QAAQ,MAAM,cAAc;AACrD,MAAI,CAACC,YAAW,WAAW,GAAG;AAC5B,UAAM,IAAI,SAAS,KAAK,OAAO,mEAAmE;AAAA,EACpG;AACA,QAAM,MAAM,KAAK,MAAMG,cAAa,aAAa,MAAM,CAAC;AACxD,oBAAkB,KAAK,OAAO;AAC9B,EAAAF,eAAc,aAAa,KAAK,UAAU,KAAK,MAAM,CAAC,IAAI,IAAI;AAE9D,QAAM,OAAO,yBAAyB,QAAQ,MAAM,QAAQ,MAAM,OAAO;AACzE,QAAM,mBAAmB,0BAA0B,QAAQ,IAAI;AAC/D,QAAM,2BAA2B,8BAA8B,QAAQ,MAAM,QAAQ,MAAM,SAAS,EAAE,WAAW,MAAM,CAAC;AACxH,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI;AAAA,IACF,EAAE,UAAU,QAAQ,MAAM,eAAe,SAAS,MAAM,aAAa,gBAAgB,kBAAkB,0BAA0B,KAAK;AAAA,IACtI,MACE,YAAY,QAAQ,IAAI,cAAc,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EACjD;AACF;AAEA,SAAS,kBAAkB,KAAiB,SAAuB;AACjE,QAAM,eAAe,YAAY,KAAK,cAAc;AACpD,aAAW,QAAQ,oBAAqB,cAAa,IAAI,IAAI;AAC7D,QAAM,kBAAkB,YAAY,KAAK,iBAAiB;AAC1D,aAAW,QAAQ,wBAAyB,iBAAgB,IAAI,IAAI;AACtE;AAEA,SAAS,YAAY,KAAiB,KAAyB;AAC7D,QAAM,WAAW,IAAI,GAAG;AACxB,MAAI,YAAY,OAAO,aAAa,YAAY,CAAC,MAAM,QAAQ,QAAQ,EAAG,QAAO;AACjF,QAAM,OAAmB,CAAC;AAC1B,MAAI,GAAG,IAAI;AACX,SAAO;AACT;AAEA,SAAS,gBAAgB,aAAqB,SAAyB;AACrE,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,uFAAiP,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA40C,WAAW;AAAA;AACxlD;AAEA,SAAS,aAAa,aAAqB,SAAyB;AAClE,SAAO;AAAA;AAAA,0BAAuD,WAAW,4BAA4B,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oEAAsgB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAC3nB;AAEA,SAAS,eAAe,SAAyB;AAC/C,SAAO;AAAA;AAAA,mCAA8D,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,kCAAoN,OAAO;AAAA;AAAA;AAAA;AAAA,uBAAiG,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACjZ;AAEA,SAAS,eAAe,SAAyB;AAC/C,SAAO;AAAA;AAAA,uCAAkE,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAClF;AAEA,SAAS,sBAAsB,SAAyB;AACtD,SAAO;AAAA;AAAA,8CAA+E,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAC/F;;;ADjJA,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgB3B,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUd,SAAS,KAAK,KAAa,MAAc,MAAmE,SAAuB;AACxI,MAAI,CAAC,yBAAyB,KAAK,IAAI,GAAG;AACxC,UAAM,IAAI,SAAS,KAAK,OAAO,iCAAiC;AAAA,EAClE;AACA,QAAM,OAAOG,MAAK,KAAK,OAAO,QAAQ,IAAI,GAAG,IAAI;AACjD,MAAIC,YAAWD,MAAK,MAAM,aAAa,CAAC,GAAG;AACzC,UAAM,IAAI,SAAS,KAAK,UAAU,GAAG,IAAI,8BAA8B;AAAA,EACzE;AACA,EAAAE,WAAUF,MAAK,MAAM,eAAe,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AAEjE,EAAAG;AAAA,IACEH,MAAK,MAAM,aAAa;AAAA,IACxB,KAAK,UAAU,EAAE,SAAS,MAAM,GAAI,KAAK,aAAa,SAAY,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC,EAAG,GAAG,MAAM,CAAC,IAAI;AAAA,EACpH;AACA,EAAAG;AAAA,IACEH,MAAK,MAAM,cAAc;AAAA,IACzB,KAAK;AAAA,MACH,mBAAmB,MAAM,OAAO;AAAA,MAChC;AAAA,MACA;AAAA,IACF,IAAI;AAAA,EACN;AACA,EAAAG;AAAA,IACEH,MAAK,MAAM,eAAe;AAAA,IAC1B,KAAK;AAAA,MACH;AAAA,QACE,iBAAiB;AAAA,UACf,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,kBAAkB;AAAA,UAClB,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,OAAO,CAAC,gBAAgB;AAAA,QAC1B;AAAA,QACA,SAAS,CAAC,aAAa;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI;AAAA,EACN;AACA,EAAAG;AAAA,IACEH,MAAK,MAAM,kBAAkB;AAAA,IAC7B;AAAA;AAAA;AAAA,EACF;AACA,EAAAG,eAAcH,MAAK,MAAM,YAAY,GAAG,gBAAgB,CAAC;AACzD,gCAA8B,MAAM,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AACtE,QAAM,OAAO,yBAAyB,MAAM,MAAM,OAAO;AACzD,EAAAG,eAAcH,MAAK,MAAM,eAAe,SAAS,UAAU,GAAG,kBAAkB;AAChF,EAAAG,eAAcH,MAAK,MAAM,eAAe,SAAS,eAAe,GAAG,YAAY;AAE/E,QAAM,OAAO;AAAA,IACX,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI;AAAA,IACF,EAAE,SAAS,MAAM,eAAe,SAAS,MAAM,KAAK;AAAA,IACpD,MACE,WAAW,IAAI;AAAA;AAAA,OAAiB,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,EACxC;AACF;;;AE7FA,SAAS,aAAAI,YAAW,iBAAAC,gBAAe,cAAAC,mBAAkB;AACrD,SAAS,QAAAC,aAAY;AAkBrB,eAAsB,OAAO,KAAaC,MAAgB,aAAqB,OAA8B;AAC3G,QAAM,EAAE,QAAQ,IAAI,IAAI,MAAMA,KAAI,IAAkB,SAAS,KAAK,SAAS;AAC3E,QAAM,MAAMC,MAAK,aAAa,eAAe,IAAI,aAAa;AAC9D,MAAI,CAACC,YAAW,GAAG,GAAG;AACpB,UAAM,IAAI,SAAS,KAAK,WAAW,uDAAuD,IAAI,aAAa,EAAE;AAAA,EAC/G;AACA,QAAM,UAAU,IAAI,GAAG,MAAM,GAAG,CAAC;AACjC,QAAM,aAAaD,MAAK,KAAK,aAAa;AAC1C,EAAAE,WAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AACzC,QAAM,cAAcF,MAAK,YAAY,GAAG,OAAO,cAAc;AAC7D,EAAAG;AAAA,IACE;AAAA,IACA,KAAK;AAAA,MACH;AAAA,QACE,OAAO,IAAI;AAAA,QACX,YAAY,IAAI;AAAA,QAChB,gBAAgB,IAAI;AAAA,QACpB,SAAS,IAAI;AAAA,QACb,OAAO,IAAI;AAAA,QACX,QAAQ,IAAI;AAAA,QACZ,OAAO,IAAI;AAAA,QACX,OAAO,IAAI,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,WAAW,GAAG,CAAC;AAAA,MAC1D;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI;AAAA,EACN;AAEA,QAAM,WAAWH,MAAK,KAAK,UAAU,OAAO,UAAU;AACtD,EAAAG;AAAA,IACE;AAAA,IACA,iCAAiC,IAAI,EAAE,sBAAsB,IAAI,MAAM;AAAA;AAAA;AAAA;AAAA,oCAIvC,OAAO;AAAA;AAAA,oBAEvB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAUI,KAAK,UAAU,IAAI,WAAW,cAAc,cAAc,QAAQ,CAAC;AAAA,EAChG,IAAI,WAAW,cAAc,oDAAoD,wFAAwF;AAAA;AAAA;AAAA,EAGzK;AAEA,MAAI;AAAA,IACF,EAAE,SAAS,aAAa,MAAM,UAAU,gBAAgB,IAAI,OAAO;AAAA,IACnE,MAAM,cAAc,OAAO,WAAM,QAAQ;AAAA,WAAc,WAAW;AAAA;AAAA,EACpE;AACF;;;AC3EA,SAAS,gBAAgB;AACzB,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,QAAAC,aAAY;AACrB,SAAS,iBAAiB;;;ACH1B,SAAS,yBAAyB;;;ACwBlC,IAAI,QAAQ;AAEL,SAAS,UAAU,MAAmB;AAC3C,QAAM,OAAoB;AAAA,IACxB,OAAO,CAAC;AAAA,IACR,SAAS,CAAC;AAAA,IACV,WAAW,CAAC;AAAA,IACZ,UAAU,CAAC;AAAA,IACX,qBAAqB,CAAC;AAAA,IACtB,UAAU;AAAA,EACZ;AACA,QAAM,WAA2B,CAAC;AAClC,QAAM,MAAM,IAAI,SAAoB;AAClC,SAAK,MAAM,KAAK,IAAI;AACpB,SAAK,oBAAoB,KAAK,OAAO;AACrC,SAAK,WAAW;AAAA,EAClB;AACA,KAAG,kBAAkB;AACrB,KAAG,cAAc,MAAM;AACvB,KAAG,OAAO;AACV,KAAG,WAAW;AACd,SAAO;AACT;AAEO,SAAS,WAAW,KAAU,MAA0B;AAC7D,MAAI,GAAG,KAAK,IAAI;AAChB,MAAI,KAAK,QAAQ;AAAA,IACf,KAAK,UAAU,SACX,EAAE,MAAM,SAAS,OAAO,KAAK,MAAM,IACnC,EAAE,MAAM,UAAU,OAAO,KAAK,OAAO;AAAA,EAC3C;AACA,MAAI,SAAS,KAAK,IAAI;AACxB;;;AC3BO,SAAS,aAAa,QAAiD;AAC5E,QAAM,MAAO,OAAiD,WAAW;AACzE,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI;AACF,QAAI,IAAI,WAAW,OAAO;AACxB,YAAM,IAAI;AAKV,YAAM,YAAY;AAClB,UAAI,OAAO,UAAU,iBAAiB,YAAY;AAChD,eAAO,UAAU,aAAa;AAAA,MAChC;AAGA,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAGA,eAAsB,kBAAkB,QAA0D;AAChG,QAAM,SAAS,aAAa,MAAM;AAClC,MAAI,OAAQ,QAAO;AACnB,QAAM,MAAO,OAAiD,WAAW;AACzE,MAAI,KAAK,WAAW,OAAO;AACzB,QAAI;AACF,YAAM,MAAO,MAAM,OAAO,KAAK;AAI/B,YAAM,UAAU,IAAI,gBAAgB,IAAI,GAAG;AAC3C,UAAI,QAAS,QAAO,QAAQ,QAAQ,EAAE,iBAAiB,MAAM,CAAC;AAAA,IAChE,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,iBAAyC;AAAA,EAC7C,OAAO;AAAA,EACP,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAM;AAAA,EACN,MAAM;AACR;AAEO,SAAS,qBAAqB,IAAgB,QAAQ,GAAY;AACvE,MAAI,QAAQ,EAAG,QAAO;AACtB,MAAI,GAAG,YAAY,OAAW,QAAO,GAAG;AACxC,MAAI,GAAG,UAAU,OAAW,QAAO,GAAG;AACtC,MAAI,GAAG,QAAQ,GAAG,KAAK,SAAS,EAAG,QAAO,GAAG,KAAK,CAAC;AACnD,QAAM,WAAW,GAAG,SAAS,GAAG;AAChC,MAAI,YAAY,SAAS,SAAS,GAAG;AAEnC,UAAM,OAAO,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,KAAK,SAAS,CAAC;AAClE,WAAO,qBAAqB,MAAoB,QAAQ,CAAC;AAAA,EAC3D;AACA,MAAI,GAAG,SAAS,GAAG,MAAM,SAAS,GAAG;AACnC,WAAO,GAAG,MAAM,OAAgC,CAAC,KAAK,SAAS;AAC7D,YAAM,QAAQ,qBAAqB,MAAM,QAAQ,CAAC;AAClD,aAAO,OAAO,UAAU,YAAY,UAAU,OAC1C,EAAE,GAAG,KAAK,GAAI,MAAkC,IAChD;AAAA,IACN,GAAG,CAAC,CAAC;AAAA,EACP;AACA,QAAM,OAAO,MAAM,QAAQ,GAAG,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG;AACtD,UAAQ,MAAM;AAAA,IACZ,KAAK,UAAU;AACb,UAAI,GAAG,UAAU,eAAe,GAAG,MAAM,EAAG,QAAO,eAAe,GAAG,MAAM;AAC3E,YAAM,MAAM,GAAG,aAAa;AAC5B,YAAM,OAAO;AACb,aAAO,KAAK,UAAU,MAAM,OAAO,OAAO,IAAI,OAAO,MAAM,KAAK,MAAM;AAAA,IACxE;AAAA,IACA,KAAK;AAAA,IACL,KAAK,WAAW;AACd,UAAI,IAAI;AACR,UAAI,GAAG,YAAY,OAAW,KAAI,GAAG;AACrC,UAAI,GAAG,qBAAqB,OAAW,KAAI,GAAG,mBAAmB;AACjE,UAAI,GAAG,YAAY,UAAa,IAAI,GAAG,QAAS,KAAI,GAAG;AACvD,aAAO,SAAS,YAAY,KAAK,MAAM,CAAC,IAAI;AAAA,IAC9C;AAAA,IACA,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK,SAAS;AACZ,YAAM,aAAa,MAAM,QAAQ,GAAG,KAAK,IAAI,GAAG,MAAM,CAAC,IAAI,GAAG;AAC9D,YAAM,QAAQ,KAAK,IAAI,GAAG,YAAY,GAAG,CAAC;AAC1C,UAAI,CAAC,WAAY,QAAO,CAAC;AACzB,aAAO,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,MAAM,qBAAqB,YAAY,QAAQ,CAAC,CAAC;AAAA,IACxF;AAAA,IACA,KAAK;AAAA,IACL,SAAS;AACP,UAAI,GAAG,YAAY;AACjB,cAAM,MAA+B,CAAC;AACtC,cAAM,WAAW,IAAI,IAAI,GAAG,YAAY,OAAO,KAAK,GAAG,UAAU,CAAC;AAClE,mBAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,GAAG,UAAU,GAAG;AACvD,cAAI,SAAS,IAAI,GAAG,KAAK,KAAK,YAAY,QAAW;AACnD,gBAAI,GAAG,IAAI,qBAAqB,MAAM,QAAQ,CAAC;AAAA,UACjD;AAAA,QACF;AACA,eAAO;AAAA,MACT;AACA,UAAI,SAAS,YAAY,SAAS,OAAW,QAAO,CAAC;AACrD,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAGA,eAAsB,iBAAiB,QAAuD;AAC5F,QAAM,KAAK,MAAM,kBAAkB,MAAM;AACzC,MAAI,CAAC,GAAI,QAAO;AAChB,SAAO,qBAAqB,EAAE;AAChC;;;AFvHO,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzC,YACE,SACS,MACT;AACA,UAAM,OAAO,GAAG,OAAO;AAAA,UAAa,IAAI,KAAK,OAAO;AAF3C;AAGT,SAAK,OAAO;AAAA,EACd;AAAA,EAJW;AAKb;AA2EA,SAAS,eAAe,KAA+B;AACrD,QAAM,IAAI,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAC5D,SAAO;AAAA,IACL,MAAM,EAAE;AAAA,IACR,SAAS,EAAE;AAAA,IACX,WAAW,iBAAiB,GAAG;AAAA,IAC/B,UAAU,gBAAgB,GAAG;AAAA,EAC/B;AACF;AAOA,eAAsB,kBACpB,KACA,OAAmB,CAAC,GACa;AACjC,QAAM,UAA0B,CAAC;AACjC,QAAM,eAAe,oBAAI,IAA0B;AACnD,aAAW,UAAU,KAAK,WAAW,CAAC,GAAG;AACvC,UAAM,aAAa,OAAO,cAAc;AACxC,UAAM,QAAsB;AAAA,MAC1B,MAAM;AAAA,MACN,MAAM,OAAO;AAAA,MACb;AAAA,MACA,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,QAAQ,cAAc,OAAO,MAAM;AAAA,IACrC;AACA,iBAAa,IAAI,QAAQ,OAAO,IAAI,IAAI,UAAU,IAAI,KAAK;AAC3D,YAAQ,KAAK,KAAK;AAAA,EACpB;AACA,QAAM,UAAoC,CAAC;AAC3C,QAAM,QAAkB,CAAC;AACzB,QAAM,SAAmB,CAAC;AAC1B,QAAM,OAA8B,CAAC;AACrC,QAAM,iBAAmD,CAAC;AAC1D,QAAM,YAA6E,CAAC;AAEpF,QAAM,QAAQ,oBAAI,IAAiB;AACnC,QAAM,SAAS,CAAC,QAAqB;AACnC,QAAI,IAAI,MAAM,IAAI,GAAG;AACrB,QAAI,CAAC,GAAG;AACN,UAAI,UAAU,GAAG;AACjB,YAAM,IAAI,KAAK,CAAC;AAAA,IAClB;AACA,WAAO;AAAA,EACT;AACA,aAAW,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,EAAG,QAAO,GAAG;AAE3D,QAAM,QAA6B,IAAI,MAAM,CAAC,GAA0B;AAAA,IACtE,KAAK,CAAC,IAAI,SAAU,OAAO,SAAS,WAAW,OAAO,IAAI,IAAI;AAAA,IAC9D,KAAK,MAAM;AAAA,IACX,SAAS,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC;AAAA,IAC/B,0BAA0B,OAAO,EAAE,YAAY,MAAM,cAAc,KAAK;AAAA,EAC1E,CAAC;AAED,QAAM,aAAa,IAAI,kBAA8B;AAErD,QAAM,SAAiB;AAAA,IACrB,MAAM,CAAC,KAAK,SAAS,KAAK,KAAK,EAAE,OAAO,QAAQ,KAAK,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC,EAAG,CAAC;AAAA,IAChF,MAAM,CAAC,KAAK,SAAS,KAAK,KAAK,EAAE,OAAO,QAAQ,KAAK,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC,EAAG,CAAC;AAAA,IAChF,OAAO,CAAC,KAAK,SAAS,KAAK,KAAK,EAAE,OAAO,SAAS,KAAK,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC,EAAG,CAAC;AAAA,EACpF;AAGA,QAAM,cAAuC,CAAC;AAC9C,aAAW,CAAC,SAAS,SAAS,KAAK,OAAO,QAAS,IAAI,eAAe,CAAC,CAAiD,GAAG;AACzH,gBAAY,OAAO,IAAI,qBAAqB,WAAW,OAAO,MAAM,WAAW,aAAa;AAC1F,YAAM,OAAO,WAAW,SAAS;AACjC,YAAM,aAAa,KAAK,KAAK,GAAG;AAChC,YAAM,WAAW,GAAG,OAAO,IAAI,UAAU;AACzC,UAAI,CAAC,MAAM;AACT,cAAM,IAAI;AAAA,UACR,kBAAkB,QAAQ;AAAA,UAC1B,gHAA2G,QAAQ;AAAA,QACrH;AAAA,MACF;AACA,YAAMC,SAAQ,MAAM;AAAA,QACjB,UAAwB;AAAA,QACzB,YAAY,CAAC;AAAA,QACb,GAAG,QAAQ;AAAA,MACb;AAEA,UAAI,CAAC,YAAY,WAAwB,UAAU,YAAY,sBAAsB,MAAS,GAAG;AAC/F,aAAK,iBAAiB;AAAA,MACxB;AAEA,YAAM,UAAU,YAA4D;AAE1E,cAAM,eAAe,KAAK,cAAc,OAAO;AAC/C,YAAI,iBAAiB,QAAW;AAC9B,cAAI,OAAgB;AACpB,qBAAW,OAAO,KAAM,QAAQ,OAA+C,GAAG;AAClF,cAAI,SAAS,QAAW;AACtB,mBAAO;AAAA,cACL,OAAO,OAAO,SAAS,aAAa,MAAO,KAAiCA,MAAK,IAAI;AAAA,cACrF,UAAU;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAEA,cAAM,WAAW,KAAK,QAAQ,KAAK,IAAI;AACvC,YAAI,aAAa,QAAW;AAC1B,iBAAO;AAAA,YACL,OACE,OAAO,aAAa,aAChB,MAAO;AAAA,cACLA;AAAA,cACA,EAAE,QAAQ,YAAY,YAAY,QAAQ;AAAA,YAC5C,IACA;AAAA,YACN,UAAU;AAAA,UACZ;AAAA,QACF;AAEA,cAAM,SAAS,UAAU,YAAY,UAAU,UAAU;AACzD,YAAI,WAAW,OAAW,QAAO,EAAE,OAAO,QAAQ,UAAU,KAAK;AAEjE,cAAM,UAAU,MAAM,iBAAkB,UAAwB,MAAM;AACtE,YAAI,YAAY,OAAW,QAAO,EAAE,OAAO,SAAS,UAAU,KAAK;AACnE,cAAM,IAAI;AAAA,UACR,8BAA8B,QAAQ,aAAa,KAAK,IAAI;AAAA,UAC5D,qBAAqB,KAAK,IAAI,yCAAyC,OAAO,OAAO,WAClF,MAAM,GAAG,EACT,KAAK,MAAM,CAAC,oBAAoB,IAAI,OAAO,WAAW,MAAM,GAAG,EAAE,MAAM,CAAC;AAAA,QAC7E;AAAA,MACF;AAEA,UAAI;AACF,cAAM,EAAE,OAAO,SAAS,IAAI,MAAM,QAAQ;AAC1C,cAAM,SAAS,WACX,MAAM,eAAgB,UAAwB,QAAQ,OAAO,GAAG,QAAQ,gBAAgB,IACxF;AACJ,cAAM,SAAS,EAAE,MAAM,CAACA,MAAK,GAAG,MAAM,KAAK,MAAM,QAAQ,UAAU,OAAO;AAC1E,mBAAW,OAAO,KAAK,IAAI,GAAG,MAAM;AACpC,mBAAW,OAAO,QAAQ,GAAG,MAAM;AACnC,uBAAe,KAAK,EAAE,MAAM,KAAK,MAAM,QAAQ,UAAU,OAAAA,OAAM,CAAC;AAChE,eAAO;AAAA,MACT,SAAS,KAAK;AACZ,cAAM,SAAS,EAAE,MAAM,CAACA,MAAK,GAAG,MAAM,KAAK,MAAM,QAAQ,UAAU,OAAO,OAAO,GAAG,EAAE;AACtF,mBAAW,OAAO,KAAK,IAAI,GAAG,MAAM;AACpC,mBAAW,OAAO,QAAQ,GAAG,MAAM;AACnC,uBAAe,KAAK,EAAE,MAAM,KAAK,MAAM,QAAQ,UAAU,OAAAA,OAAM,CAAC;AAChE,cAAM;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAGA,QAAM,cAAc,OAAO,KAAM,IAAI,WAAW,CAAC,CAA6B;AAC9E,QAAMC,WAAkC,CAAC;AACzC,aAAW,QAAQ,aAAa;AAC9B,IAAAA,SAAQ,IAAI,IAAI,KAAK,UAAU,IAAI,KAAK,eAAe,IAAI;AAAA,EAC7D;AAGA,QAAM,iBAAiB,oBAAI,IAAoB;AAC/C,QAAM,mBAAmB,oBAAI,IAAoB;AACjD,QAAM,eAAe,mBAAmB,IAAI,KAAK;AAEjD,QAAM,aAAa,oBAAI,IAAoB;AAC3C,QAAM,qBAAqB,oBAAI,IAAoB;AAEnD,QAAM,MAA+B;AAAA,IACnC,MAAM,KAAQ,MAAc,IAA0B,UAAoC;AACxF,UAAI,OAAO,SAAS,YAAY,KAAK,WAAW,KAAK,OAAO,OAAO,YAAY;AAC7E,cAAM,IAAI,gBAAgB,iDAA4C,KAAK,UAAU,IAAI,CAAC,EAAE;AAAA,MAC9F;AACA,YAAM,OAAO,eAAe,IAAI,IAAI,KAAK,KAAK;AAC9C,qBAAe,IAAI,MAAM,GAAG;AAC5B,YAAM,MAAM,QAAQ,IAAI,IAAI,GAAG;AAC/B,YAAM,SAAS,aAAa,IAAI,GAAG;AACnC,UAAI,QAAQ,WAAW,aAAa;AAClC,cAAM,QAAQ,cAAc,OAAO,MAAmB;AACtD,YAAI,UAAU,KAAM,WAAU,KAAK,EAAE,MAAM,MAAM,MAAM,SAAS,KAAM,KAAK,EAAE,CAAC;AAC9E,eAAO;AAAA,MACT;AAEA,YAAM,SAAS,mBAAmB,UAAU,OAAO,YAAY;AAC/D,YAAM,YAAY,UAAU,YAAY,SAAY,cAAc,SAAS,SAAS,cAAc,IAAI;AACtG,YAAM,QAAsB,EAAE,MAAM,QAAQ,MAAM,YAAY,KAAK,QAAQ,UAAU,UAAU,EAAE;AACjG,cAAQ,KAAK,KAAK;AAClB,mBAAa,IAAI,KAAK,KAAK;AAE3B,UAAI;AACJ,eAAS,UAAU,GAAG,WAAW,OAAO,aAAa,WAAW;AAC9D,cAAM,WAAW;AACjB,cAAM,QAAoB,EAAE,MAAM,gBAAgB,MAAM;AACxD,YAAI;AACF,cAAI,gBAAgB,QAAQ,QAAQ,WAAW,IAAI,OAAO,MAAM,GAAG,CAAC,CAAC;AACrE,cAAI,cAAc,QAAW;AAG3B,4BAAgB,QAAQ,KAAK;AAAA,cAC3B;AAAA,cACA,IAAI;AAAA,gBAAe,CAAC,IAAI,WACtB;AAAA,kBACE,MAAM,OAAO,IAAI,gBAAgB,SAAS,IAAI,kBAAkB,UAAU,OAAO,UAAU,CAAC;AAAA,kBAC5F,KAAK,IAAI,WAAW,GAAK;AAAA,gBAC3B,EAAE,QAAQ;AAAA,cACZ;AAAA,YACF,CAAC;AAAA,UACH;AACA,gBAAM,SAAS,MAAM;AACrB,gBAAM,UAAU,cAAc,MAAM;AACpC,gBAAM,SAAS;AACf,gBAAM,SAAS;AACf,cAAI,UAAU,KAAM,WAAU,KAAK,EAAE,MAAM,MAAM,MAAM,SAAS,KAAM,MAAM,EAAE,CAAC;AAC/E,iBAAO;AAAA,QACT,SAAS,KAAK;AACZ,sBAAY;AACZ,gBAAM,QAAQ,eAAe,GAAG;AAChC,cAAI,gBAAgB,GAAG,EAAG;AAC1B,cAAI,MAAM,kBAAkB,UAAU,UAAU,QAAW;AAGzD,mBAAO;AAAA,cACL,SAAS,IAAI;AAAA,YACf;AACA;AAAA,UACF;AACA,gBAAM,QAAQ,iBAAiB,QAAQ,SAAS,iBAAiB,GAAG,IAAI,IAAI,eAAe,MAAS;AACpG,cAAI,UAAU,KAAM;AACpB,gBAAM,KAAK,SAAS,IAAI,IAAI,GAAG,IAAI,OAAO,EAAE;AAAA,QAE9C;AAAA,MACF;AACA,YAAM,SAAS;AACf,YAAM;AAAA,IACR;AAAA,IAEA;AAAA,IACA,SAASA;AAAA,IACT,WAAW,CAAC;AAAA,IACZ,WAAW,CAAC;AAAA,IAEZ,MAAM,MAAM,UAAiC;AAC3C,oBAAc,UAAU,WAAW;AACnC,YAAM,KAAK,QAAQ;AAAA,IACrB;AAAA,IAEA,MAAM,cAAiB,MAAc,OAAmE;AACtG,YAAM,OAAO,iBAAiB,IAAI,IAAI,KAAK,KAAK;AAChD,uBAAiB,IAAI,MAAM,GAAG;AAC9B,YAAM,WAAW,KAAK,UAAU,IAAI;AACpC,UAAI;AACJ,UAAI,OAAO,aAAa,WAAY,SAAS,SAAoC,GAAG;AAAA,eAC3E,MAAM,QAAQ,QAAQ,EAAG,SAAQ,SAAS,MAAM,CAAC;AAAA,UACrD,SAAQ;AAEb,YAAM,QAAsB,EAAE,MAAM,UAAU,MAAM,YAAY,KAAK,QAAQ,aAAa,UAAU,EAAE;AACtG,cAAQ,KAAK,KAAK;AAClB,UAAI,UAAU,QAAW;AACvB,YAAI,MAAM,YAAY,QAAW;AAC/B,wBAAc,MAAM,SAAS,uBAAuB;AACpD,gBAAM,SAAS;AACf,iBAAO;AAAA,QACT;AACA,cAAM,IAAI;AAAA,UACR,wCAAwC,IAAI,iBAAiB,GAAG;AAAA,UAChE,uBAAuB,IAAI;AAAA,QAC7B;AAAA,MACF;AACA,YAAM,YAAY,MAAM,eAAe,MAAM,QAAQ,OAAO,WAAW,IAAI,WAAW;AACtF,YAAM,SAAS,cAAc,SAAoB;AACjD,aAAO;AAAA,IACT;AAAA,IAEA,MAAM,KAAQ,OAA2B,SAA2B;AAClE,YAAM,YAAY,MAAM,eAAe,MAAM,QAAQ,SAAS,UAAU,MAAM,IAAI,WAAW;AAC7F,cAAQ,KAAK,EAAE,OAAO,MAAM,MAAM,SAAS,UAAU,CAAC;AAAA,IACxD;AAAA,IAEA,GAAI,KAAK,YAAY,UAAc,IAAI,QAA8B,SAAS,YAC1E;AAAA,MACE,SACE,KAAK,WACJ;AAAA,QACC,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,OAAO,CAAC;AAAA,QACR,SAAS,IAAI,YAAY,EAAE,OAAO,KAAK,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC;AAAA,MACpE;AAAA,IACJ,IACA,CAAC;AAAA,IAEL;AAAA,IACA,KAAK,EAAE,IAAI,QAAQ,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,IAAI,SAAS,GAAG,cAAc,IAAI,GAAG;AAAA,EACjG;AAEA,EAAC,IAA+B,YAAY,eAAe,KAAK,KAAK,OAAO,EAAE,aAAa,UAAU,QAAQ,MAAM;AACjH,UAAM,MAAM,GAAG,WAAW,IAAI,QAAQ;AACtC,UAAM,QAAQ,WAAW,IAAI,GAAG,KAAK,KAAK;AAC1C,eAAW,IAAI,KAAK,IAAI;AACxB,UAAM,SAAS,KAAK,SAAS,WAAW,IAAI,QAAQ;AACpD,QAAI,WAAW,QAAW;AACxB,YAAM,IAAI;AAAA,QACR,uCAAuC,WAAW,YAAY,QAAQ,WAAW,IAAI;AAAA,QACrF,qBAAqB,WAAW,OAAO,QAAQ;AAAA,MACjD;AAAA,IACF;AACA,UAAM,SAAS,MAAM,QAAQ,MAAM,IAAI,OAAO,OAAO,CAAC,IAAI;AAC1D,QAAI,WAAW,QAAW;AACxB,YAAM,IAAI,gBAAgB,4CAA4C,WAAW,YAAY,QAAQ,UAAU,IAAI,EAAE;AAAA,IACvH;AACA,UAAM,WAAW,OAAO,WAAW,aAAa,MAAM,OAAO,SAAS,EAAE,aAAa,UAAU,KAAK,CAAC,IAAI;AACzG,eAAW,OAAO,YAAY,WAAW,QAAQ,GAAG,EAAE,MAAM,CAAC,OAAO,GAAG,QAAQ,SAAS,CAAC;AACzF,eAAW,OAAO,YAAY,WAAW,UAAU,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,OAAO,GAAG,QAAQ,SAAS,CAAC;AACjG,WAAO;AAAA,EACT,CAAC;AAED,EAAC,IAA+B,YAAY,eAAe,KAAK,KAAK,OAAO,EAAE,YAAY,QAAQ,MAAM;AACtG,UAAM,OAAO,WAAW,SAAS;AACjC,QAAI,CAAC,MAAM;AACT,YAAM,IAAI;AAAA,QACR,YAAY,UAAU;AAAA,QACtB,iGAA4F,UAAU;AAAA,MACxG;AAAA,IACF;AACA,UAAM,cAAc,mBAAmB,IAAI,UAAU,KAAK,KAAK;AAC/D,uBAAmB,IAAI,YAAY,UAAU;AAC7C,UAAM,SAAS,KAAK,YAAY,UAAU;AAC1C,QAAI,WAAW,QAAW;AACxB,YAAM,IAAI;AAAA,QACR,+BAA+B,UAAU;AAAA,QACzC,wBAAwB,UAAU;AAAA,MACpC;AAAA,IACF;AACA,UAAM,SAAS,MAAM,QAAQ,MAAM,IAAI,OAAO,aAAa,CAAC,IAAI;AAChE,QAAI,WAAW,OAAW,OAAM,IAAI,gBAAgB,mCAAmC,UAAU,gBAAgB,UAAU,EAAE;AAC7H,UAAM,SAAS,OAAO,WAAW,aAAa,MAAM,OAAO,SAAS,EAAE,YAAY,WAAW,CAAC,IAAI;AAClG,eAAW,OAAO,WAAW,UAAU,EAAE,GAAG,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,KAAK,MAAM,OAAO,CAAC;AACxF,WAAO;AAAA,EACT,CAAC;AAGD,MAAI,QAAQ,KAAK;AACjB,QAAM,UAAU,IAAI;AAOpB,MAAI,cACF,IAAI,UAAU,QAAQ,SAAS,YAAY,QAAQ,QAAQ,QAAQ,SAAS,UAAU,QAAQ,OAAO,SAAS;AAEhH,MAAI,QAAQ,SAAS,eAAe,QAAQ,gBAAgB,QAAW;AAGrE,UAAM,YAAY,OAAO;AAAA,MACtB,IAAI,eAAe,CAAC;AAAA,IACvB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,WAAW;AAC1C,UAAM,OAAO,WAAW,YAAY,WAAW,QAAQ,aAAa,EAAE;AACtE,QAAI,MAAM;AACR,oBAAc,IAAI,SAAU,KAAK;AACjC,UAAI,UAAU,QAAW;AACvB,gBAAQ,WAAW,YAAY,UAAU,WAAW,QAAQ,SAAS,EAAE;AAAA,MACzE;AAAA,IACF;AAAA,EACF;AAEA,MAAI,UAAU,UAAa,eAAe,QAAQ,SAAS,YAAY;AACrE,YAAQ,MAAM,iBAAiB,WAAW;AAAA,EAC5C;AACA,MAAI,eAAe,UAAU,QAAW;AACtC,YAAQ,MAAM,eAAe,aAAa,OAAO,eAAe,IAAI,EAAE,SAAS;AAAA,EACjF;AAEA,QAAM,SAAS,CACb,QACA,QACA,UAC2B;AAC3B,UAAM,cAAyC,CAAC;AAChD,eAAW,KAAK,SAAS;AACvB,UAAI,EAAE,SAAS,UAAU,EAAE,WAAW,YAAa;AACnD,OAAC,YAAY,EAAE,IAAI,MAAM,CAAC,GAAG,KAAK,cAAc,EAAE,MAAmB,CAAC;AAAA,IACxE;AACA,UAAM,QAAiC,CAAC;AACxC,eAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,WAAW,GAAG;AACzD,YAAM,IAAI,IAAI,QAAQ,WAAW,IAAI,QAAQ,CAAC,IAAI;AAAA,IACpD;AACA,UAAM,cAAc,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,WAAW,QAAQ;AAClF,WAAO;AAAA,MACL;AAAA,MACA,GAAI,WAAW,SAAY,EAAE,OAAO,IAAI,CAAC;AAAA,MACzC,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,MACP,WAAW,cACP,OACA;AAAA,QACE,YAAY,IAAI;AAAA,QAChB,QAAQ;AAAA,QACR;AAAA,QACA,GAAI,cACA;AAAA,UACE,YAAY;AAAA,YACV,MAAM,YAAY;AAAA,YAClB,YAAY,YAAY;AAAA,YACxB,UAAU,YAAY;AAAA,YACtB,OAAO,YAAY;AAAA,UACrB;AAAA,QACF,IACA,CAAC;AAAA,QACL,OAAO,QACJ,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,EAC/B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,EAAE,YAAY,QAAQ,EAAE,QAAQ,UAAU,EAAE,SAAS,EAAE;AAAA,QAClG;AAAA,QACA,GAAI,aAAa,OAAO,aAAa,QACjC,CAAC,IACD,cACE,EAAE,YAAY,SAAS,YAAY,IAAI,uEAAkE,IACzG,CAAC;AAAA,MACT;AAAA,IACR;AAAA,EACF;AAEA,MAAI;AACF,QAAI,SAAkB,MAAM,IAAI,IAAI,OAAgB,GAAY;AAChE,QAAI,IAAI,QAAQ;AACd,eAAS,MAAM,eAAe,IAAI,QAAQ,QAAQ,eAAe,IAAI,EAAE,UAAU;AAAA,IACnF;AACA,WAAO,OAAO,aAAa,MAAiB;AAAA,EAC9C,SAAS,KAAK;AAEZ,eAAW,QAAQ,CAAC,GAAG,SAAS,EAAE,QAAQ,GAAG;AAC3C,UAAI;AACF,cAAM,KAAK,KAAK;AAChB,eAAO,KAAK,KAAK,IAAI;AAAA,MACvB,SAAS,SAAS;AAChB,eAAO,MAAM,kBAAkB,KAAK,IAAI,aAAa,OAAO,OAAO,CAAC,EAAE;AACtE,eAAO,KAAK,GAAG,KAAK,IAAI,WAAW;AAAA,MACrC;AAAA,IACF;AACA,UAAM,aAAa,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,WAAW,QAAQ;AACjF,WAAO,OAAO,UAAU,QAAW;AAAA,MACjC,GAAG,eAAe,GAAG;AAAA,MACrB,GAAI,aAAa,EAAE,MAAM,WAAW,KAAK,IAAI,CAAC;AAAA,IAChD,CAAC;AAAA,EACH;AACF;;;AGziBA,eAAsB,UAAU,KAA8E;AAC5G,MAAI;AACF,UAAM,SAAS,MAAM,kBAAkB,GAAG;AAC1C,UAAM,SAAS,MAAM,kBAAkB,KAAK,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,EAAE,OAAO,IAAI,CAAC,CAAC;AAC5F,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,EAAE,YAAY,IAAI,IAAI,QAAQ,MAAM,OAAO;AAAA,IACpD;AACA,WAAO;AAAA,MACL,YAAY,IAAI;AAAA,MAChB,QAAQ;AAAA,MACR;AAAA,MACA,QACE,OAAO,OAAO,SAAS,SACnB,SAAS,OAAO,MAAM,IAAI,aAAa,OAAO,MAAM,OAAO,KAC1D,OAAO,OAAO,WAAW;AAAA,IAClC;AAAA,EACF,SAAS,KAAK;AAGZ,WAAO;AAAA,MACL,YAAY,IAAI;AAAA,MAChB,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,QAAQ;AAAA,QACR,OAAO,CAAC;AAAA,QACR,SAAS,CAAC;AAAA,QACV,OAAO,CAAC;AAAA,QACR,SAAS,CAAC;AAAA,QACV,OAAO,CAAC;AAAA,QACR,QAAQ,CAAC;AAAA,QACT,MAAM,CAAC;AAAA,QACP,OAAO,EAAE,MAAO,IAAc,MAAM,SAAU,IAAc,SAAS,WAAW,OAAO,UAAU,KAAK;AAAA,QACtG,SAAS,OAAO;AAAA,UACd,YAAY,IAAI;AAAA,UAChB,QAAQ;AAAA,UACR,OAAO,EAAE,MAAO,IAAc,MAAM,SAAU,IAAc,SAAS,WAAW,OAAO,UAAU,KAAK;AAAA,UACtG,OAAO,CAAC;AAAA,UACR,gBAAgB,CAAC;AAAA,QACnB;AAAA,MACF;AAAA,MACA,QAAS,IAAc;AAAA,IACzB;AAAA,EACF;AACF;AAEA,eAAe,kBACb,KAC4C;AAC5C,QAAM,SAA4C,CAAC;AACnD,QAAM,YAAa,IAAI,aAAa,CAAC;AACrC,aAAW,CAAC,aAAa,EAAE,KAAK,OAAO,QAAQ,SAAS,GAAG;AACzD,UAAM,SAAS,MAAM,iBAAiB,GAAG,MAAM,EAAE,MAAM,MAAM,MAAS;AACtE,KAAC,OAAO,WAAW,MAAM,CAAC,GAAG,GAAG,KAAK,IAAI;AAAA,MACvC,GAAI,WAAW,SAAY,EAAE,QAAQ,OAAgB,IAAI,EAAE,SAAS,KAAK;AAAA,MACzE,OAAO,EAAE,aAAa,GAAG,cAAc,EAAE;AAAA,MACzC,UAAU;AAAA,MACV,OAAO,GAAG;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;;;ACxEA,SAAS,aAAAC,YAAW,gBAAAC,eAAc,iBAAAC,sBAAqB;AACvD,SAAS,WAAAC,gBAAe;AACxB,SAAS,kBAAkB;;;ALO3B,IAAM,OAAO,UAAU,QAAQ;AAe/B,SAAS,WAAW,aAAoC;AACtD,MAAI,MAAM;AACV,aAAS;AACP,UAAM,MAAMC,MAAK,KAAK,gBAAgB,QAAQ,QAAQ,aAAa,UAAU,eAAe,QAAQ;AACpG,QAAIC,YAAW,GAAG,EAAG,QAAO;AAC5B,UAAM,SAASD,MAAK,KAAK,IAAI;AAC7B,QAAI,WAAW,IAAK,QAAO;AAC3B,UAAM;AAAA,EACR;AACF;AAEA,eAAsB,SACpB,KACA,aACA,MACgB;AAChB,QAAM,cAAc,yBAAyB,WAAW,EAAE;AAAA,IACxD,CAAC,MAAM,KAAK,WAAW,UAAa,EAAE,iBAAiB,KAAK;AAAA,EAC9D;AACA,MAAI,YAAY,WAAW,GAAG;AAC5B,UAAM,IAAI,SAAS,KAAK,OAAO,8BAA8BA,MAAK,aAAa,aAAa,CAAC,EAAE;AAAA,EACjG;AAEA,QAAM,SAAqB;AAAA,IACzB,QAAQ;AAAA,IACR,WAAW,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,EAAE;AAAA,IAC1C,OAAO,CAAC;AAAA,IACR,UAAU,CAAC;AAAA,EACb;AAGA,QAAM,YAAY,YAAY,OAAO,CAAC,MAAM,EAAE,QAAQ;AACtD,MAAI,CAAC,KAAK,aAAa,UAAU,SAAS,GAAG;AAC3C,UAAM,YAAY,WAAW,WAAW;AACxC,QAAI,CAAC,WAAW;AACd,aAAO,UAAU,kBAAkB;AACnC,UAAI,IAAI,+EAA0E;AAAA,IACpF,OAAO;AACL,YAAM,OAAO,CAAC,OAAO,mBAAmB,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;AACtE,YAAM,MAAM,MAAM,KAAK,WAAW,MAAM;AAAA,QACtC,KAAK;AAAA,QACL,KAAK,EAAE,GAAG,QAAQ,KAAK,IAAI,IAAI;AAAA,QAC/B,WAAW,KAAK,OAAO;AAAA,MACzB,CAAC,EAAE,MAAM,CAAC,SAA+C;AAAA,QACvD,QAAQ,IAAI,UAAU;AAAA,QACtB,QAAQ,IAAI,UAAU;AAAA,MACxB,EAAE;AACF,YAAM,YAAY,IAAI,UAAU,IAAI,MAAM,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,GAAG,CAAC;AACzF,UAAI,CAAC,UAAU;AACb,eAAO,SAAS;AAChB,eAAO,SAAS,KAAK,EAAE,MAAM,QAAQ,SAAS,yCAAyC,IAAI,UAAU,IAAI,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC;AAAA,MAC5H,OAAO;AACL,cAAM,SAAS,KAAK,MAAM,QAAQ;AASlC,eAAO,UAAU,MAAM,OAAO;AAC9B,eAAO,UAAU,SAAS,OAAO;AACjC,eAAO,UAAU,SAAS,OAAO;AACjC,YAAI,OAAO,iBAAiB,GAAG;AAC7B,iBAAO,SAAS;AAChB,qBAAW,QAAQ,OAAO,aAAa;AACrC,uBAAW,KAAK,KAAK,kBAAkB;AACrC,kBAAI,EAAE,WAAW,UAAU;AACzB,uBAAO,SAAS,KAAK;AAAA,kBACnB,MAAM;AAAA,kBACN,MAAM,KAAK;AAAA,kBACX,MAAM,EAAE;AAAA,kBACR,SAAS,EAAE,gBAAgB,KAAK,IAAI,EAAE,MAAM,GAAG,GAAI;AAAA,gBACrD,CAAC;AAAA,cACH;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,eAAe,KAAK,YAAY,cAAc,YAAY,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ;AACzF,aAAW,QAAQ,cAAc;AAC/B,QAAI;AACF,YAAM,MAAM,MAAM,kBAAkB,KAAK,KAAK;AAC9C,YAAM,UAAU,MAAM,UAAU,GAAG;AACnC,aAAO,MAAM,KAAK;AAAA,QAChB,YAAY,KAAK;AAAA,QACjB,QAAQ,QAAQ;AAAA,QAChB,GAAI,QAAQ,WAAW,SAAY,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,QACjE,GAAI,QAAQ,SAAS,CAAC,IAAI,EAAE,SAAS,QAAQ,OAAO,QAAQ,EAAE;AAAA,MAChE,CAAC;AACD,UAAI,CAAC,QAAQ,QAAQ;AACnB,eAAO,SAAS;AAChB,eAAO,SAAS,KAAK;AAAA,UACnB,MAAM;AAAA,UACN,YAAY,KAAK;AAAA,UACjB,SAAS,QAAQ,UAAU;AAAA,QAC7B,CAAC;AAAA,MACH;AAAA,IACF,SAAS,KAAK;AACZ,aAAO,SAAS;AAChB,aAAO,MAAM,KAAK,EAAE,YAAY,KAAK,cAAc,QAAQ,OAAO,QAAQ,OAAO,GAAG,EAAE,CAAC;AACvF,aAAO,SAAS,KAAK,EAAE,MAAM,SAAS,YAAY,KAAK,cAAc,SAAS,OAAO,GAAG,EAAE,MAAM,GAAG,GAAI,EAAE,CAAC;AAAA,IAC5G;AAAA,EACF;AAEA,MAAI,KAAK,QAAQ,CAAC,MAAkB;AAClC,UAAM,QAAQ;AAAA,MACZ,cAAc,EAAE,UAAU,MAAM,IAAI,EAAE,UAAU,GAAG,UAAU,EAAE,UAAU,kBAAkB,sBAAsB,EAAE;AAAA,MACnH,GAAG,EAAE,MAAM,IAAI,CAAC,MAAM,SAAS,EAAE,UAAU,KAAK,EAAE,SAAS,WAAM,UAAK,EAAE,UAAU,EAAE,EAAE,EAAE;AAAA,MACxF,EAAE,SAAS,SAAS,SAAS,EAAE,SAAS,MAAM,WAAW,EAAE,SAAS,WAAW,IAAI,KAAK,GAAG;AAAA,IAC7F;AACA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB,CAAC;AACD,UAAQ,KAAK,OAAO,SAAS,KAAK,KAAK,KAAK,YAAY;AAC1D;;;AvB9HA,IAAME,QAAOC,WAAUC,SAAQ;AAC/B,IAAM,UAAU,IAAI,QAAQ;AAC5B,IAAM,UAAU,KAAK,MAAMC,cAAa,IAAI,IAAI,mBAAmB,YAAY,GAAG,GAAG,MAAM,CAAC,EAAE;AAS9F,SAAS,QAA2C;AAClD,QAAM,OAAO,QAAQ,KAAiB;AACtC,SAAO,EAAE,KAAK,IAAI,OAAO,KAAK,QAAQ,KAAK,GAAG,KAAK;AACrD;AAEA,SAAS,OAAO,MAAoD;AAClE,SAAO,cAAc;AAAA,IACnB,GAAI,KAAK,QAAQ,SAAY,EAAE,KAAK,KAAK,IAAI,IAAI,CAAC;AAAA,IAClD,GAAI,KAAK,UAAU,SAAY,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,IACxD,GAAI,KAAK,YAAY,SAAY,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,EAChE,CAAC;AACH;AAEA,SAAS,IAAI,MAA6B;AACxC,QAAM,IAAI,OAAO,IAAI;AACrB,SAAO,IAAI,UAAU,EAAE,KAAK,EAAE,KAAK;AACrC;AAEA,SAAS,eAAe,MAAkD;AACxE,QAAM,IAAI,OAAO,IAAI;AACrB,MAAI,CAAC,EAAE,eAAe,CAAC,EAAE,SAAS;AAChC,UAAM,IAAI,SAAS,KAAK,OAAO,+FAA0F;AAAA,EAC3H;AACA,SAAO,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,YAAY;AAChD;AAEA,QACG,KAAK,QAAQ,EACb,QAAQ,OAAO,EACf,YAAY,uFAAuF,EACnG,OAAO,UAAU,6CAA6C,EAC9D,OAAO,eAAe,gDAAgD,EACtE,OAAO,mBAAmB,8CAA8C,EACxE,OAAO,oBAAoB,gBAAgB;AAE9C,QACG,QAAQ,MAAM,EACd,SAAS,UAAU,2BAA2B,EAC9C,OAAO,eAAe,kBAAkB,EACxC,OAAO,oBAAoB,wCAAwC,EACnE,YAAY,kDAAkD,EAC9D,OAAO,CAAC,MAAc,YAAiD;AACtE,QAAM,EAAE,IAAI,IAAI,MAAM;AACtB,MAAI;AACF,SAAK,KAAK,MAAM,SAAS,OAAO;AAAA,EAClC,SAAS,KAAK;AACZ,WAAO,KAAK,GAAG;AAAA,EACjB;AACF,CAAC;AAEH,QACG,QAAQ,SAAS,EACjB,YAAY,4EAA4E,EACxF,OAAO,MAAM;AACZ,QAAM,EAAE,KAAK,KAAK,IAAI,MAAM;AAC5B,MAAI;AACF,mBAAe,KAAK,eAAe,IAAI,GAAG,OAAO;AAAA,EACnD,SAAS,KAAK;AACZ,WAAO,KAAK,GAAG;AAAA,EACjB;AACF,CAAC;AAEH,QACG,QAAQ,OAAO,EACf,OAAO,mBAAmB,qDAAqD,EAC/E,OAAO,oBAAoB,gBAAgB,uBAAuB,EAClE,OAAO,yBAAyB,gBAAgB,SAAS,EACzD,YAAY,0EAA0E,EACtF,OAAO,OAAO,YAAuE;AACpF,QAAM,EAAE,KAAK,KAAK,IAAI,MAAM;AAC5B,MAAI;AACF,UAAM,QAAQ,QAAQ,SAAS,KAAK;AACpC,QAAI,CAAC,MAAO,OAAM,IAAI,SAAS,KAAK,OAAO,2CAA2C;AACtF,UAAM,SAAS,IAAI,UAAU,QAAQ,UAAU,KAAK;AACpD,UAAM,OAAO,IAAI,SAAS;AAC1B,UAAM,SAAS,WAAW;AAC1B,WAAO,WAAW,EAAE,GAAG,OAAO,UAAU,CAAC,QAAQ,WAAW,GAAG,EAAE,KAAK,QAAQ,UAAU,MAAM,EAAE;AAChG,WAAO,UAAU,QAAQ;AACzB,gBAAY,MAAM;AAClB,QAAI,KAAK,EAAE,SAAS,QAAQ,aAAa,KAAK,QAAQ,SAAS,GAAG,MAAM,gBAAgB,QAAQ,QAAQ,cAAc,QAAQ,WAAW,IAAI;AAAA,EAC/I,SAAS,KAAK;AACZ,WAAO,KAAK,GAAG;AAAA,EACjB;AACF,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,OAAO,gBAAgB,0DAA0D,EACjF,YAAY,yDAAyD,EACrE,OAAO,OAAO,YAA+B;AAC5C,QAAM,EAAE,KAAK,KAAK,IAAI,MAAM;AAC5B,MAAI;AACF,UAAM,EAAE,KAAK,IAAI,eAAe,IAAI;AACpC,QAAI,UAAU,QAAQ;AACtB,QAAI,YAAY,QAAW;AACzB,gBAAU,MAAMH,MAAK,OAAO,CAAC,UAAU,WAAW,QAAQ,CAAC,EAAE;AAAA,QAC3D,CAAC,MAAM,EAAE,OAAO,KAAK;AAAA,QACrB,MAAM;AAAA,MACR;AAAA,IACF;AACA,UAAM,SAAS,MAAM,IAAI,IAAI,EAAE,KAK5B,aAAa;AAAA,MACd;AAAA,MACA,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC7C,CAAC;AACD,QAAI;AAAA,MACF,EAAE,GAAG,QAAQ,SAAS,WAAW,KAAK;AAAA,MACtC,MACE,mBAAmB,IAAI,IAAI,UAAU,WAAM,OAAO,KAAK,+DAA0D;AAAA,cAClG,OAAO,eAAe;AAAA,iBACnB,OAAO,eAAe;AAAA,IAC5C;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,KAAK,GAAG;AAAA,EACjB;AACF,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,OAAO,gBAAgB,yCAAyC,EAChE,OAAO,qBAAqB,yBAAyB,EACrD,YAAY,qEAAqE,EACjF,OAAO,OAAO,YAA0D;AACvE,QAAM,EAAE,KAAK,KAAK,IAAI,MAAM;AAC5B,MAAI;AACF,UAAM,IAAI,OAAO,IAAI;AACrB,UAAM,OAAO,EAAE,eAAe,QAAQ,IAAI;AAC1C,UAAM,SAAS,KAAK,MAAM,EAAE,GAAI,QAAQ,cAAc,SAAY,EAAE,WAAW,QAAQ,UAAU,IAAI,CAAC,GAAI,QAAQ,QAAQ,WAAW,CAAC;AAAA,EACxI,SAAS,KAAK;AACZ,WAAO,KAAK,GAAG;AAAA,EACjB;AACF,CAAC;AAEH,QACG,QAAQ,OAAO,EACf,YAAY,2EAA2E,EACvF,OAAO,YAAY;AAClB,QAAM,EAAE,KAAK,KAAK,IAAI,MAAM;AAC5B,MAAI;AACF,UAAM,IAAI,OAAO,IAAI;AACrB,UAAM,OAAO,EAAE,eAAe,QAAQ,IAAI;AAC1C,UAAM,QAAQ,yBAAyB,IAAI;AAC3C,QAAI,MAAM,WAAW,EAAG,OAAM,IAAI,SAAS,KAAK,OAAO,sBAAsB;AAC7E,UAAM,YAAiE,CAAC;AACxE,eAAW,KAAK,OAAO;AACrB,YAAM,MAAM,MAAM,kBAAkB,EAAE,KAAK;AAC3C,gBAAU,KAAK,0BAA0B,GAAG,CAAC;AAAA,IAC/C;AACA,QAAI;AAAA,MAAK,EAAE,aAAa,UAAU;AAAA,MAAG,MACnC,UAAU,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,aAAa,EAAE,QAAQ,IAAI,gBAAgB,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,GAAG,KAAK,GAAG,YAAY,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,GAAG,KAAK,GAAG,EAAE,EAAE,KAAK,IAAI;AAAA,IACpL;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,KAAK,GAAG;AAAA,EACjB;AACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,OAAO,eAAe,8DAA8D,EACpF,OAAO,WAAW,6DAA6D,EAC/E,OAAO,aAAa,uCAAuC,EAC3D,YAAY,gFAA2E,EACvF,OAAO,OAAO,YAA+D;AAC5E,QAAM,EAAE,KAAK,KAAK,IAAI,MAAM;AAC5B,MAAI;AACF,UAAM,EAAE,MAAM,KAAK,IAAI,eAAe,IAAI;AAC1C,UAAM,OAAO,KAAK,IAAI,IAAI,GAAG,MAAM;AAAA,MACjC,KAAK,QAAQ;AAAA,MACb,OAAO,QAAQ,QAAQ,OAAO;AAAA,MAC9B,GAAI,QAAQ,SAAS,QAAQ,EAAE,MAAM,MAAM,IAAI,CAAC;AAAA,IAClD,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,KAAK,GAAG;AAAA,EACjB;AACF,CAAC;AAEH,QACG,QAAQ,KAAK,EACb,OAAO,iBAAiB,+BAA+B,MAAM,EAC7D,OAAO,cAAc,+CAA+C,EACpE,YAAY,kEAAkE,EAC9E,OAAO,OAAO,YAA+C;AAC5D,QAAM,EAAE,KAAK,KAAK,IAAI,MAAM;AAC5B,MAAI;AACF,UAAM,EAAE,MAAM,KAAK,IAAI,eAAe,IAAI;AAC1C,UAAM,IAAI,KAAK,MAAM,MAAM,EAAE,MAAM,OAAO,QAAQ,IAAI,GAAG,GAAI,QAAQ,UAAU,QAAQ,EAAE,OAAO,MAAM,IAAI,CAAC,EAAG,CAAC;AAAA,EACjH,SAAS,KAAK;AACZ,WAAO,KAAK,GAAG;AAAA,EACjB;AACF,CAAC;AAEH,IAAM,OAAO,QAAQ,QAAQ,MAAM,EAAE,YAAY,gFAAgF;AACjI,KACG,QAAQ,aAAa,EACrB,eAAe,0BAA0B,sCAAsC,EAC/E,OAAO,iBAAiB,0BAA0B,cAAc,EAChE,OAAO,iBAAiB,6DAA6D,EACrF,OAAO,qBAAqB,yCAAyC,EACrE,OAAO,mBAAmB,yBAAyB,WAAW,EAC9D,OAAO,sBAAsB,sCAAsC,EACnE,OAAO,gBAAgB,iBAAiB,QAAQ,EAChD,YAAY,sFAAsF,EAClG,OAAO,OAAO,YAA0I;AACvJ,QAAM,EAAE,KAAK,KAAK,IAAI,MAAM;AAC5B,MAAI;AACF,UAAM,eAAe,KAAK,OAAO,IAAI,EAAE,KAAK,OAAO;AAAA,EACrD,SAAS,KAAK;AACZ,WAAO,KAAK,GAAG;AAAA,EACjB;AACF,CAAC;AACH,KACG,QAAQ,IAAI,EACZ,eAAe,0BAA0B,sCAAsC,EAC/E,OAAO,iBAAiB,qCAAqC,gBAAgB,EAC7E,OAAO,iBAAiB,uBAAuB,EAC/C,OAAO,qBAAqB,yCAAyC,EACrE,OAAO,mBAAmB,yBAAyB,WAAW,EAC9D,OAAO,sBAAsB,sCAAsC,EACnE,YAAY,kCAAkC,EAC9C,OAAO,OAAO,YAA4H;AACzI,QAAM,EAAE,KAAK,KAAK,IAAI,MAAM;AAC5B,MAAI;AACF,UAAM,OAAO,KAAK,OAAO,IAAI,EAAE,KAAK,OAAO;AAAA,EAC7C,SAAS,KAAK;AACZ,WAAO,KAAK,GAAG;AAAA,EACjB;AACF,CAAC;AAEH,QACG,QAAQ,SAAS,EACjB,OAAO,UAAU,yCAAyC,EAC1D,OAAO,oBAAoB,gCAAgC,EAC3D,YAAY,6FAA6F,EACzG,OAAO,OAAO,YAAiD;AAC9D,QAAM,EAAE,KAAK,KAAK,IAAI,MAAM;AAC5B,MAAI;AACF,UAAM,SAAS,IAAI,IAAI;AACvB,QAAI,QAAQ,QAAQ;AAClB,UAAI,KAAK,MAAM,OAAO,IAAI,kBAAkB,QAAQ,MAAM,SAAS,CAAC;AACpE;AAAA,IACF;AACA,UAAM,EAAE,KAAK,IAAI,eAAe,IAAI;AACpC,UAAM,SAAS,MAAM,OAAO;AAAA,MAC1B;AAAA,MACA,EAAE,SAAS,KAAK;AAAA,IAClB;AACA,QAAI,CAAC,OAAO,KAAK;AACf,UAAI,KAAK,EAAE,KAAK,MAAM,cAAc,CAAC,EAAE,GAAG,MAAM,uDAAkD;AAClG;AAAA,IACF;AACA,QAAI,KAAK,QAAQ,MAAM;AAAA,IAAoC,OAAO,GAAG,EAAE;AACvE,QAAI,QAAQ,MAAM;AAChB,iBAAS;AACP,cAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAI,CAAC;AAC5C,cAAM,SAAS,MAAM,OAAO,IAAwB,kBAAkB,OAAO,KAAK,SAAS;AAC3F,YAAI,OAAO,WAAW,aAAa;AACjC,cAAI,IAAI,+BAA0B;AAClC;AAAA,QACF;AACA,YAAI,OAAO,WAAW,UAAW,OAAM,IAAI,SAAS,KAAK,oBAAoB,sBAAsB;AAAA,MACrG;AAAA,IACF;AACA,YAAQ,KAAK,KAAK,kBAAkB;AAAA,EACtC,SAAS,KAAK;AACZ,WAAO,KAAK,GAAG;AAAA,EACjB;AACF,CAAC;AAEH,IAAM,UAAU,QAAQ,QAAQ,SAAS,EAAE,YAAY,wDAAmD;AAC1G,QACG,QAAQ,MAAM,EACd,OAAO,YAAY;AAClB,QAAM,EAAE,KAAK,KAAK,IAAI,MAAM;AAC5B,MAAI;AACF,QAAI,KAAK,MAAM,IAAI,IAAI,EAAE,IAAI,UAAU,CAAC;AAAA,EAC1C,SAAS,KAAK;AACZ,WAAO,KAAK,GAAG;AAAA,EACjB;AACF,CAAC;AACH,QACG,QAAQ,KAAK,EACb,SAAS,QAAQ,EACjB,OAAO,iBAAiB,kEAAkE,EAC1F,YAAY,+FAA+F,EAC3G,OAAO,OAAO,MAAc,YAAsC;AACjE,QAAM,EAAE,KAAK,KAAK,IAAI,MAAM;AAC5B,MAAI;AACF,QAAI,CAAC,QAAQ,YAAY;AACvB,YAAM,IAAI;AAAA,QACR,KAAK;AAAA,QACL,uFAAkF,OAAO;AAAA,MAC3F;AAAA,IACF;AACA,UAAM,SAAmB,CAAC;AAC1B,qBAAiB,SAAS,QAAQ,MAAO,QAAO,KAAK,KAAe;AACpE,UAAM,QAAQ,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM,EAAE,QAAQ,OAAO,EAAE;AACtE,QAAI,MAAM,WAAW,EAAG,OAAM,IAAI,SAAS,KAAK,OAAO,sBAAsB;AAC7E,UAAM,IAAI,IAAI,EAAE,IAAI,YAAY,mBAAmB,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;AACrE,QAAI,KAAK,EAAE,KAAK,KAAK,GAAG,MAAM,WAAW,IAAI,cAAS;AAAA,EACxD,SAAS,KAAK;AACZ,WAAO,KAAK,GAAG;AAAA,EACjB;AACF,CAAC;AACH,QACG,QAAQ,IAAI,EACZ,SAAS,QAAQ,EACjB,OAAO,OAAO,SAAiB;AAC9B,QAAM,EAAE,KAAK,KAAK,IAAI,MAAM;AAC5B,MAAI;AACF,QAAI,KAAK,MAAM,IAAI,IAAI,EAAE,OAAO,YAAY,mBAAmB,IAAI,CAAC,EAAE,CAAC;AAAA,EACzE,SAAS,KAAK;AACZ,WAAO,KAAK,GAAG;AAAA,EACjB;AACF,CAAC;AAEH,IAAM,OAAO,QAAQ,QAAQ,MAAM,EAAE,YAAY,wBAAwB;AACzE,KACG,QAAQ,MAAM,EACd,OAAO,mBAAmB,EAC1B,OAAO,mBAAmB,EAC1B,OAAO,eAAe,YAAY,IAAI,EACtC,OAAO,OAAO,YAAqE;AAClF,QAAM,EAAE,KAAK,KAAK,IAAI,MAAM;AAC5B,MAAI;AACF,UAAM,EAAE,KAAK,IAAI,eAAe,IAAI;AACpC,UAAM,SAAS,IAAI,gBAAgB,EAAE,SAAS,MAAM,OAAO,QAAQ,MAAM,CAAC;AAC1E,QAAI,QAAQ,WAAY,QAAO,IAAI,cAAc,QAAQ,UAAU;AACnE,QAAI,QAAQ,OAAQ,QAAO,IAAI,UAAU,QAAQ,MAAM;AACvD,UAAM,OAAO,MAAM,IAAI,IAAI,EAAE,IAA8C,SAAS,MAAM,EAAE;AAC5F,QAAI;AAAA,MAAK;AAAA,MAAM,CAAC,MACd,EAAE,KAAK,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,KAAK,EAAE,aAAa,KAAK,EAAE,MAAM,MAAM,EAAE,YAAY,MAAM,EAAE,UAAU,EAAE,EAAE,KAAK,IAAI,KAAK;AAAA,IACpH;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,KAAK,GAAG;AAAA,EACjB;AACF,CAAC;AACH,KACG,QAAQ,MAAM,EACd,SAAS,SAAS,EAClB,OAAO,OAAO,UAAkB;AAC/B,QAAM,EAAE,KAAK,KAAK,IAAI,MAAM;AAC5B,MAAI;AACF,QAAI,KAAK,MAAM,IAAI,IAAI,EAAE,IAAI,SAAS,KAAK,EAAE,CAAC;AAAA,EAChD,SAAS,KAAK;AACZ,WAAO,KAAK,GAAG;AAAA,EACjB;AACF,CAAC;AACH,KACG,QAAQ,SAAS,EACjB,SAAS,cAAc,EACvB,OAAO,kBAAkB,uBAAuB,EAChD,OAAO,eAAe,eAAe,YAAY,EACjD,OAAO,OAAO,YAAoB,YAA6C;AAC9E,QAAM,EAAE,KAAK,KAAK,IAAI,MAAM;AAC5B,MAAI;AACF,UAAM,EAAE,KAAK,IAAI,eAAe,IAAI;AACpC,UAAM,OAAgC,EAAE,SAAS,MAAM,YAAY,KAAK,QAAQ,IAAI;AACpF,QAAI,QAAQ,UAAU,OAAW,MAAK,OAAO,IAAI,KAAK,MAAM,QAAQ,KAAK;AACzE,QAAI,KAAK,MAAM,IAAI,IAAI,EAAE,KAAK,SAAS,IAAI,CAAC;AAAA,EAC9C,SAAS,KAAK;AACZ,WAAO,KAAK,GAAG;AAAA,EACjB;AACF,CAAC;AACH,KACG,QAAQ,QAAQ,EAChB,SAAS,SAAS,EAClB,SAAS,QAAQ,EACjB,OAAO,oBAAoB,wBAAwB,EACnD,OAAO,OAAO,OAAe,MAAc,YAAkC;AAC5E,QAAM,EAAE,KAAK,KAAK,IAAI,MAAM;AAC5B,MAAI;AACF,QAAI;AAAA,MACF,MAAM,IAAI,IAAI,EAAE,KAAK,SAAS,KAAK,YAAY,mBAAmB,IAAI,CAAC,IAAI;AAAA,QACzE,GAAI,QAAQ,YAAY,SAAY,EAAE,SAAS,KAAK,MAAM,QAAQ,OAAO,EAAE,IAAI,CAAC;AAAA,MAClF,CAAC;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,KAAK,GAAG;AAAA,EACjB;AACF,CAAC;AACH,KACG,QAAQ,QAAQ,EAChB,SAAS,SAAS,EAClB,OAAO,OAAO,UAAkB;AAC/B,QAAM,EAAE,KAAK,KAAK,IAAI,MAAM;AAC5B,MAAI;AACF,QAAI,KAAK,MAAM,IAAI,IAAI,EAAE,KAAK,SAAS,KAAK,SAAS,CAAC;AAAA,EACxD,SAAS,KAAK;AACZ,WAAO,KAAK,GAAG;AAAA,EACjB;AACF,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,SAAS,SAAS,EAClB,OAAO,YAAY,4BAA4B,EAC/C,YAAY,uBAAuB,EACnC,OAAO,OAAO,OAAe,YAAkC;AAC9D,QAAM,EAAE,KAAK,KAAK,IAAI,MAAM;AAC5B,MAAI;AACF,UAAM,SAAS,IAAI,IAAI;AACvB,QAAI,UAAU;AACd,eAAS;AACP,YAAM,SAAS,MAAM,OAAO,IAGzB,SAAS,KAAK,EAAE;AACnB,YAAM,QAAQ,OAAO,KAAK,MAAM,OAAO;AACvC,gBAAU,OAAO,KAAK;AACtB,UAAI,IAAI,QAAQ,CAAC,QAAQ,QAAQ;AAC/B,YAAI,KAAK,MAAM;AACf;AAAA,MACF;AACA,iBAAW,KAAK,MAAO,KAAI,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE,OAAO,KAAK,EAAE,IAAI,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE;AACrF,UAAI,CAAC,QAAQ,UAAU,CAAC,aAAa,UAAU,WAAW,EAAE,SAAS,OAAO,IAAI,MAAM,GAAG;AACvF,YAAI,CAAC,IAAI,KAAM,KAAI,IAAI,OAAO,OAAO,IAAI,MAAM,EAAE;AAAA,YAC5C,KAAI,KAAK,MAAM;AACpB;AAAA,MACF;AACA,YAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAI,CAAC;AAAA,IAC9C;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,KAAK,GAAG;AAAA,EACjB;AACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,SAAS,SAAS,EAClB,YAAY,uEAAuE,EACnF,OAAO,OAAO,UAAkB;AAC/B,QAAM,EAAE,KAAK,KAAK,IAAI,MAAM;AAC5B,MAAI;AACF,UAAM,EAAE,KAAK,IAAI,eAAe,IAAI;AACpC,UAAM,OAAO,KAAK,IAAI,IAAI,GAAG,MAAM,KAAK;AAAA,EAC1C,SAAS,KAAK;AACZ,WAAO,KAAK,GAAG;AAAA,EACjB;AACF,CAAC;AAEH,QACG,QAAQ,UAAU,EAClB,SAAS,cAAc,EACvB,eAAe,kBAAkB,yCAAyC,EAC1E,OAAO,eAAe,eAAe,YAAY,EACjD,YAAY,kEAAkE,EAC9E,OAAO,OAAO,YAAoB,YAAyC;AAC1E,QAAM,EAAE,KAAK,KAAK,IAAI,MAAM;AAC5B,MAAI;AACF,UAAM,EAAE,KAAK,IAAI,eAAe,IAAI;AACpC,QAAI;AAAA,MACF,MAAM,IAAI,IAAI,EAAE,KAAK,aAAa,IAAI,aAAa;AAAA,QACjD;AAAA,QACA,WAAW,OAAO,QAAQ,EAAE;AAAA,QAC5B,KAAK,QAAQ;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,KAAK,GAAG;AAAA,EACjB;AACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,kCAAkC,EAC9C,OAAO,YAAY;AAClB,QAAM,EAAE,KAAK,KAAK,IAAI,MAAM;AAC5B,MAAI;AACF,UAAM,IAAI,OAAO,IAAI;AACrB,UAAM,SAAS,IAAI,IAAI;AACvB,UAAM,SAAS,MAAM,OAAO,IAAI,SAAS;AACzC,UAAM,SAAS,MAAM,OAAO,IAAI,SAAS;AACzC,UAAM,WAAW,EAAE,cAAc,iBAAiB,EAAE,WAAW,IAAI;AACnE,UAAM,gBAAgB,WAAW,MAAM,OAAO,IAAI,aAAa,SAAS,OAAO,iBAAiB,EAAE,MAAM,MAAM,IAAI,IAAI;AACtH,QAAI,KAAK,EAAE,UAAU,EAAE,KAAK,QAAQ,QAAQ,SAAS,UAAU,WAAW,MAAM,QAAQ,cAAc,CAAC;AAAA,EACzG,SAAS,KAAK;AACZ,WAAO,KAAK,GAAG;AAAA,EACjB;AACF,CAAC;AAEH,QAAQ,WAAW,EAAE,MAAM,CAAC,QAAQ;AAClC,QAAM,MAAM,IAAI,OAAO,QAAQ,KAAK,SAAS,QAAQ,CAAC;AACtD,SAAO,KAAK,GAAG;AACjB,CAAC;",
|
|
6
6
|
"names": ["execFile", "readFileSync", "promisify", "secrets", "model", "toSerializable", "existsSync", "join", "value", "api", "spawn", "existsSync", "join", "dirname", "existsSync", "join", "dirname", "spawn", "api", "existsSync", "mkdirSync", "writeFileSync", "join", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "join", "join", "existsSync", "writeFileSync", "mkdirSync", "readFileSync", "join", "existsSync", "mkdirSync", "writeFileSync", "mkdirSync", "writeFileSync", "existsSync", "join", "api", "join", "existsSync", "mkdirSync", "writeFileSync", "existsSync", "join", "input", "secrets", "mkdirSync", "readFileSync", "writeFileSync", "dirname", "join", "existsSync", "exec", "promisify", "execFile", "readFileSync"]
|
|
7
7
|
}
|