@devosurf/tesser-server 0.1.0-alpha.3 → 0.1.0-alpha.4

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/main.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/server.ts", "../src/config.ts", "../src/db/db.ts", "../src/db/migrations.ts", "../src/db/migrate.ts", "../src/broker/crypto.ts", "../src/broker/oauth.ts", "../src/broker/broker.ts", "../src/broker/masking.ts", "../../sdk/src/errors.ts", "../../sdk/src/internal/codec.ts", "../../sdk/src/internal/duration.ts", "../../sdk/src/internal/standard-schema.ts", "../../sdk/src/internal/http.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/broker/connections.ts", "../src/engine/executor.ts", "../src/queue/queue.ts", "../src/engine/signals.ts", "../src/engine/runs.ts", "../src/events/fanout.ts", "../src/http/app.ts", "../src/http/api.ts", "../src/broker/connect.ts", "../src/http/tokens.ts", "../src/http/status.ts", "../src/gitsync/deploy-keys.ts", "../src/http/connect.ts", "../../brand/src/tokens.ts", "../../brand/src/ui.ts", "../../brand/src/mark.ts", "../../brand/src/index.ts", "../src/http/connect-view.ts", "../src/http/ingress.ts", "../src/queue/worker.ts", "../src/scheduler/cron.ts", "../src/scheduler/reaper.ts", "../src/registry/loader.ts", "../src/triggers/ingress.ts", "../src/triggers/shared.ts", "../src/triggers/poll.ts", "../src/gitsync/reconciler.ts", "../../testing/src/engine.ts", "../../testing/src/spy.ts", "../../testing/src/sample.ts", "../../testing/src/smoke.ts", "../../testing/src/cassette.ts", "../src/triggers/registrar.ts", "../src/gitsync/build.ts", "../src/main.ts"],
4
- "sourcesContent": ["// Instance composition: one process hosts api + worker + scheduler + reconciler by\n// default (TESSER_ROLES splits them; ~3 services in prod: this, workers, Postgres).\n\nimport { serve, type ServerType } from \"@hono/node-server\";\nimport type { Hono } from \"hono\";\nimport { loadConfig, type ServerConfig } from \"./config.js\";\nimport { createDb, type Db } from \"./db/db.js\";\nimport { migrate } from \"./db/migrate.js\";\nimport { Broker } from \"./broker/broker.js\";\nimport { Masker } from \"./broker/masking.js\";\nimport { makeEngineBindings } from \"./broker/connections.js\";\nimport { executeRun } from \"./engine/executor.js\";\nimport type { EngineDeps } from \"./engine/types.js\";\nimport { fanoutEvent } from \"./events/fanout.js\";\nimport { createApp } from \"./http/app.js\";\nimport { ensureAdminToken } from \"./http/tokens.js\";\nimport { Worker } from \"./queue/worker.js\";\nimport type { ClaimedJob } from \"./queue/queue.js\";\nimport { startScheduler } from \"./scheduler/cron.js\";\nimport { startReaper } from \"./scheduler/reaper.js\";\nimport { ArtifactLoader } from \"./registry/loader.js\";\nimport { createConnectorIngress } from \"./triggers/ingress.js\";\nimport { runPoll, type PollJobPayload } from \"./triggers/poll.js\";\nimport type { TriggerLayerDeps } from \"./triggers/shared.js\";\nimport { deployStatus, reconcileProject, type ReconcilerDeps } from \"./gitsync/reconciler.js\";\n\nexport interface TesserServer {\n config: ServerConfig;\n db: Db;\n broker: Broker;\n masker: Masker;\n loader: ArtifactLoader;\n engineDeps: EngineDeps;\n triggerDeps: TriggerLayerDeps;\n reconcilerDeps: ReconcilerDeps;\n worker: Worker;\n app: Hono;\n /** Set when roles.api and started via listen(). */\n httpServer?: ServerType;\n adminToken?: string;\n start(): Promise<void>;\n stop(): Promise<void>;\n}\n\nexport async function createTesserServer(\n overrides: Partial<ServerConfig> = {},\n): Promise<TesserServer> {\n const config = { ...loadConfig(), ...overrides };\n const db = await createDb({\n databaseUrl: config.databaseUrl,\n dataDir: config.databaseUrl ? undefined : `${config.dataDir}/pglite`,\n });\n await migrate(db);\n\n const masker = new Masker();\n const broker = new Broker(db, config.masterKey, masker);\n const workspaceId = await broker.ensureDefaultWorkspace();\n const adminToken = await ensureAdminToken(db, workspaceId);\n\n const loader = new ArtifactLoader(db);\n const bindings = makeEngineBindings({ db, broker });\n const engineDeps: EngineDeps = {\n db,\n loadAutomation: loader.load,\n buildConnections: bindings.buildConnections,\n resolveSecrets: bindings.resolveSecrets,\n ...(bindings.callModel !== undefined ? { callModel: bindings.callModel } : {}),\n ...(bindings.callHarness !== undefined ? { callHarness: bindings.callHarness } : {}),\n mask: (s) => masker.mask(s),\n };\n const triggerDeps: TriggerLayerDeps = {\n db,\n broker,\n baseUrl: config.baseUrl,\n loadAutomation: loader.load,\n };\n const reconcilerDeps: ReconcilerDeps = {\n db,\n broker,\n loader,\n dataDir: config.dataDir,\n baseUrl: config.baseUrl,\n triggerDeps,\n };\n\n const workerHandlers = {\n run: async (job: ClaimedJob) => {\n await executeRun(engineDeps, (job.payload as { runId: string }).runId);\n },\n \"event-fanout\": async (job: ClaimedJob) => {\n await fanoutEvent(db, (job.payload as { eventId: string }).eventId);\n },\n \"trigger-poll\": async (job: ClaimedJob) => {\n await runPoll(triggerDeps, job.payload as never as PollJobPayload);\n },\n reconcile: async (job: ClaimedJob) => {\n const p = job.payload as { projectId: string; ref?: string; localPath?: string };\n await reconcileProject(reconcilerDeps, p.projectId, { ref: p.ref, localPath: p.localPath });\n },\n };\n const workerKinds = [\n ...(config.roles.worker ? ([\"run\", \"event-fanout\", \"trigger-poll\"] as const) : []),\n ...(config.roles.reconciler ? ([\"reconcile\"] as const) : []),\n ];\n const worker = new Worker(\n db,\n Object.fromEntries(workerKinds.map((kind) => [kind, workerHandlers[kind]])),\n {\n tags: config.workerTags,\n kinds: workerKinds,\n pollIntervalMs: config.pollIntervalMs,\n onError: (e) => console.error(\"[worker]\", e),\n },\n );\n\n const app = createApp({\n db,\n broker,\n baseUrl: config.baseUrl,\n dataDir: config.dataDir,\n roles: config.roles,\n connectorIngress: createConnectorIngress(triggerDeps),\n deployStatus: (projectId, env) => deployStatus(db, projectId, env),\n });\n\n let stopScheduler: (() => void) | undefined;\n let stopReaper: (() => void) | undefined;\n let httpServer: ServerType | undefined;\n\n const server: TesserServer = {\n config,\n db,\n broker,\n masker,\n loader,\n engineDeps,\n triggerDeps,\n reconcilerDeps,\n worker,\n app,\n ...(adminToken !== null ? { adminToken } : {}),\n async start() {\n if (config.roles.api) {\n httpServer = serve({ fetch: app.fetch, port: config.port, hostname: \"0.0.0.0\" });\n server.httpServer = httpServer;\n }\n if (config.roles.worker || config.roles.reconciler) worker.start();\n if (config.roles.scheduler) {\n stopScheduler = startScheduler(db, { onError: (e) => console.error(\"[scheduler]\", e) });\n stopReaper = startReaper(db, { onError: (e) => console.error(\"[reaper]\", e) });\n }\n },\n async stop() {\n stopScheduler?.();\n stopReaper?.();\n await worker.stop();\n if (httpServer) await new Promise<void>((r) => httpServer!.close(() => r()));\n await db.close();\n },\n };\n return server;\n}\n", "// Instance configuration \u2014 env-driven, defaults tuned for `tesser dev` (embedded PGlite,\n// auto master key). Production fails fast on missing or unsafe required env.\n\nimport { mkdirSync, readFileSync, writeFileSync, existsSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\n\nexport interface ServerConfig {\n port: number;\n /** Public base URL for webhooks/connect links (defaults to http://localhost:<port>). */\n baseUrl: string;\n databaseUrl: string | undefined;\n dataDir: string;\n masterKey: Buffer;\n /** Which duties this process performs. */\n roles: { api: boolean; worker: boolean; scheduler: boolean; reconciler: boolean };\n workerTags: string[] | undefined;\n pollIntervalMs: number;\n env: \"production\" | \"development\";\n}\n\nexport function loadConfig(env: NodeJS.ProcessEnv = process.env): ServerConfig {\n const port = Number(env[\"PORT\"] ?? env[\"TESSER_PORT\"] ?? 8377);\n const mode: ServerConfig[\"env\"] = env[\"NODE_ENV\"] === \"production\" ? \"production\" : \"development\";\n const production = mode === \"production\";\n const dataDir = env[\"TESSER_DATA_DIR\"] ?? join(process.cwd(), \".tesser\");\n const databaseUrl = env[\"DATABASE_URL\"] ?? env[\"TESSER_DATABASE_URL\"];\n const baseUrl = env[\"TESSER_BASE_URL\"] ?? (production ? undefined : `http://localhost:${port}`);\n const rolesEnv = env[\"TESSER_ROLES\"]; // e.g. \"api,worker\" \u2014 dev default: everything\n\n if (production) {\n const missing = [\n ...(databaseUrl ? [] : [\"DATABASE_URL\"]),\n ...(baseUrl ? [] : [\"TESSER_BASE_URL\"]),\n ...(env[\"TESSER_MASTER_KEY\"] ? [] : [\"TESSER_MASTER_KEY\"]),\n ...(rolesEnv ? [] : [\"TESSER_ROLES\"]),\n ];\n if (missing.length > 0) {\n throw new Error(`production configuration missing required env: ${missing.join(\", \")}`);\n }\n }\n\n const normalizedBaseUrl = validateBaseUrl(baseUrl!, { production, allowLocalhost: env[\"TESSER_ALLOW_LOCALHOST_BASE_URL\"] === \"true\" });\n ensureWritableDataDir(dataDir);\n\n let masterKey: Buffer;\n const fromEnv = env[\"TESSER_MASTER_KEY\"];\n if (fromEnv) {\n masterKey = Buffer.from(fromEnv, \"base64\");\n if (masterKey.length !== 32) {\n throw new Error(\"TESSER_MASTER_KEY must be 32 bytes, base64-encoded\");\n }\n } else {\n // Dev convenience: generate once into the data dir, loudly. Production should set\n // TESSER_MASTER_KEY explicitly (custody/rotation: docs/SCOPES.md \u00A74).\n const keyPath = join(dataDir, \"master.key\");\n if (existsSync(keyPath)) {\n masterKey = Buffer.from(readFileSync(keyPath, \"utf8\").trim(), \"base64\");\n } else {\n masterKey = randomBytes(32);\n writeFileSync(keyPath, masterKey.toString(\"base64\") + \"\\n\", { mode: 0o600 });\n console.error(\n `[tesser] generated a development master key at ${keyPath} \u2014 set TESSER_MASTER_KEY in production`,\n );\n }\n }\n\n const roleSet = parseRoles(rolesEnv ?? \"api,worker,scheduler,reconciler\");\n\n return {\n port,\n baseUrl: normalizedBaseUrl,\n databaseUrl,\n dataDir,\n masterKey,\n roles: {\n api: roleSet.has(\"api\"),\n worker: roleSet.has(\"worker\"),\n scheduler: roleSet.has(\"scheduler\"),\n reconciler: roleSet.has(\"reconciler\"),\n },\n workerTags: env[\"TESSER_WORKER_TAGS\"]?.split(\",\").map((tag) => tag.trim()).filter(Boolean),\n pollIntervalMs: Number(env[\"TESSER_QUEUE_POLL_MS\"] ?? 250),\n env: mode,\n };\n}\n\nfunction validateBaseUrl(input: string, opts: { production: boolean; allowLocalhost: boolean }): string {\n let parsed: URL;\n try {\n parsed = new URL(input);\n } catch {\n throw new Error(\"TESSER_BASE_URL must be an absolute URL\");\n }\n if (parsed.pathname !== \"/\" || parsed.search || parsed.hash) {\n throw new Error(\"TESSER_BASE_URL must be an origin only, for example https://tesser.example.com\");\n }\n if (opts.production && !opts.allowLocalhost && isLocalhost(parsed.hostname)) {\n throw new Error(\"TESSER_BASE_URL must not be localhost in production; set a public origin\");\n }\n return parsed.origin;\n}\n\nfunction isLocalhost(hostname: string): boolean {\n const host = hostname.toLowerCase();\n return host === \"localhost\" || host === \"127.0.0.1\" || host === \"::1\" || host === \"[::1]\";\n}\n\nfunction parseRoles(input: string): Set<string> {\n const allowed = new Set([\"api\", \"worker\", \"scheduler\", \"reconciler\"]);\n const roles = input.split(\",\").map((role) => role.trim()).filter(Boolean);\n const unknown = roles.filter((role) => !allowed.has(role));\n if (unknown.length > 0) throw new Error(`TESSER_ROLES includes unknown role(s): ${unknown.join(\", \")}`);\n if (roles.length === 0) throw new Error(\"TESSER_ROLES must include at least one role\");\n return new Set(roles);\n}\n\nfunction ensureWritableDataDir(dataDir: string): void {\n try {\n mkdirSync(dataDir, { recursive: true });\n const probe = join(dataDir, `.tesser-write-probe-${randomBytes(8).toString(\"hex\")}`);\n writeFileSync(probe, \"ok\", { flag: \"wx\" });\n rmSync(probe, { force: true });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new Error(`TESSER_DATA_DIR must be writable for runtime data and artifacts: ${message}`);\n }\n}\n", "// One thin Db seam over plain Postgres (ADR-0003): pg.Pool in production, embedded\n// PGlite for `tesser dev` and tests \u2014 same SQL, same semantics (PGlite is real Postgres\n// compiled to wasm; it is single-connection, so SKIP LOCKED contention is simply absent).\n\nexport interface QueryResult<R> {\n rows: R[];\n rowCount: number;\n}\n\nexport interface DbClient {\n query<R = Record<string, unknown>>(text: string, params?: unknown[]): Promise<QueryResult<R>>;\n}\n\nexport interface Db extends DbClient {\n readonly kind: \"pg\" | \"pglite\";\n tx<T>(fn: (client: DbClient) => Promise<T>): Promise<T>;\n close(): Promise<void>;\n}\n\nexport interface DbConfig {\n /** postgres:// URL \u2192 pg; absent \u2192 PGlite at dataDir (or in-memory). */\n databaseUrl?: string | undefined;\n /** PGlite data directory; \"memory://\" or undefined = ephemeral in-memory. */\n dataDir?: string | undefined;\n}\n\nexport async function createDb(config: DbConfig): Promise<Db> {\n if (config.databaseUrl) {\n const { default: pg } = await import(\"pg\");\n const pool = new pg.Pool({ connectionString: config.databaseUrl, max: 10 });\n // Multi-statement simple-protocol queries yield an array of results \u2014 take the last.\n const normalize = <R>(res: unknown): QueryResult<R> => {\n const r = (Array.isArray(res) ? res[res.length - 1] : res) as {\n rows?: R[];\n rowCount?: number | null;\n };\n const rows = r?.rows ?? [];\n return { rows, rowCount: r?.rowCount ?? rows.length };\n };\n return {\n kind: \"pg\",\n async query(text, params) {\n return normalize(await pool.query(text, params as never[]));\n },\n async tx(fn) {\n const client = await pool.connect();\n try {\n await client.query(\"BEGIN\");\n const result = await fn({\n async query(text, params) {\n return normalize(await client.query(text, params as never[]));\n },\n });\n await client.query(\"COMMIT\");\n return result;\n } catch (err) {\n await client.query(\"ROLLBACK\").catch(() => {});\n throw err;\n } finally {\n client.release();\n }\n },\n async close() {\n await pool.end();\n },\n };\n }\n\n const { PGlite } = await import(\"@electric-sql/pglite\");\n let pglite: InstanceType<typeof PGlite>;\n if (config.dataDir && config.dataDir !== \"memory://\") {\n const { mkdirSync } = await import(\"node:fs\");\n mkdirSync(config.dataDir, { recursive: true });\n pglite = new PGlite(config.dataDir);\n } else {\n pglite = new PGlite();\n }\n await pglite.waitReady;\n\n // PGlite is one connection: serialize interactive transactions behind a mutex so a\n // worker tx and an API tx never interleave statements.\n let mutex: Promise<unknown> = Promise.resolve();\n const withMutex = <T>(fn: () => Promise<T>): Promise<T> => {\n const next = mutex.then(fn, fn);\n mutex = next.catch(() => {});\n return next;\n };\n\n return {\n kind: \"pglite\",\n async query(text, params) {\n const res = await withMutex(() => pglite.query(text, params as never[]));\n return { rows: res.rows as never[], rowCount: (res as { affectedRows?: number }).affectedRows ?? res.rows.length };\n },\n async tx(fn) {\n return withMutex(() =>\n pglite.transaction(async (t) => {\n return fn({\n async query(text, params) {\n const res = await t.query(text, params as never[]);\n return {\n rows: res.rows as never[],\n rowCount: (res as { affectedRows?: number }).affectedRows ?? res.rows.length,\n };\n },\n });\n }),\n ) as Promise<never>;\n },\n async close() {\n await pglite.close();\n },\n };\n}\n", "// Schema migrations \u2014 applied in order, recorded in schema_migrations. Postgres is the\n// single stateful dependency (ADR-0003): metadata, queue, journal, encrypted secrets.\n\nexport interface Migration {\n id: string;\n sql: string;\n}\n\nexport const migrations: Migration[] = [\n {\n id: \"0001-core\",\n sql: /* sql */ `\nCREATE TABLE workspaces (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n name text NOT NULL,\n data_key_cipher text NOT NULL,\n created_at timestamptz NOT NULL DEFAULT now()\n);\n\nCREATE TABLE api_tokens (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n workspace_id uuid NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,\n name text NOT NULL,\n token_hash text NOT NULL UNIQUE,\n created_at timestamptz NOT NULL DEFAULT now(),\n last_used_at timestamptz\n);\n\nCREATE TABLE projects (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n workspace_id uuid NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,\n name text NOT NULL,\n repo_url text,\n deploy_key_public text,\n deploy_key_private_cipher text,\n prod_branch text NOT NULL DEFAULT 'main',\n push_webhook_secret text,\n poll_interval_s integer,\n created_at timestamptz NOT NULL DEFAULT now(),\n UNIQUE (workspace_id, name)\n);\n\nCREATE TABLE repo_state (\n project_id uuid PRIMARY KEY REFERENCES projects(id) ON DELETE CASCADE,\n branch text NOT NULL DEFAULT 'main',\n last_sha text,\n status text NOT NULL DEFAULT 'idle', -- idle|syncing|synced|halted-credentials|failed\n error text,\n report jsonb,\n last_synced_at timestamptz\n);\n\nCREATE TABLE automation_versions (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n project_id uuid NOT NULL REFERENCES projects(id) ON DELETE CASCADE,\n automation_id text NOT NULL,\n version integer NOT NULL,\n content_hash text NOT NULL,\n bundle_path text NOT NULL,\n manifest jsonb NOT NULL,\n git_sha text,\n branch text NOT NULL DEFAULT 'main',\n status text NOT NULL DEFAULT 'staged', -- staged|live|superseded|failed\n test_report jsonb,\n created_at timestamptz NOT NULL DEFAULT now(),\n UNIQUE (project_id, automation_id, version)\n);\n\nCREATE TABLE aliases (\n project_id uuid NOT NULL REFERENCES projects(id) ON DELETE CASCADE,\n automation_id text NOT NULL,\n env text NOT NULL, -- 'production' | 'preview:<branch>'\n version_id uuid NOT NULL REFERENCES automation_versions(id),\n updated_at timestamptz NOT NULL DEFAULT now(),\n PRIMARY KEY (project_id, automation_id, env)\n);\n\nCREATE TABLE runs (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n project_id uuid NOT NULL REFERENCES projects(id) ON DELETE CASCADE,\n automation_id text NOT NULL,\n version_id uuid REFERENCES automation_versions(id) ON DELETE SET NULL,\n env text NOT NULL DEFAULT 'production',\n status text NOT NULL DEFAULT 'queued', -- queued|running|suspended|completed|failed|cancelled\n trigger jsonb NOT NULL,\n input jsonb,\n output jsonb,\n error jsonb,\n attempt integer NOT NULL DEFAULT 0,\n concurrency_key text,\n wake_at timestamptz,\n waiting_signal text,\n created_at timestamptz NOT NULL DEFAULT now(),\n started_at timestamptz,\n finished_at timestamptz\n);\nCREATE INDEX runs_by_automation ON runs (project_id, automation_id, created_at DESC);\nCREATE INDEX runs_by_status ON runs (status) WHERE status IN ('queued','running','suspended');\nCREATE INDEX runs_concurrency ON runs (project_id, automation_id, concurrency_key)\n WHERE status IN ('queued','running','suspended');\n\nCREATE TABLE run_steps (\n run_id uuid NOT NULL REFERENCES runs(id) ON DELETE CASCADE,\n name text NOT NULL,\n occurrence integer NOT NULL,\n status text NOT NULL, -- running|completed|failed\n attempts integer NOT NULL DEFAULT 0,\n result jsonb,\n error jsonb,\n has_undo boolean NOT NULL DEFAULT false,\n undone boolean NOT NULL DEFAULT false,\n started_at timestamptz NOT NULL DEFAULT now(),\n finished_at timestamptz,\n PRIMARY KEY (run_id, name, occurrence)\n);\n\nCREATE TABLE queue_jobs (\n id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,\n kind text NOT NULL,\n payload jsonb NOT NULL,\n status text NOT NULL DEFAULT 'ready', -- ready|dead\n run_at timestamptz NOT NULL DEFAULT now(),\n priority integer NOT NULL DEFAULT 0,\n lease_until timestamptz,\n attempts integer NOT NULL DEFAULT 0,\n max_attempts integer NOT NULL DEFAULT 10,\n tag text,\n dedupe_key text,\n last_error text,\n created_at timestamptz NOT NULL DEFAULT now()\n);\nCREATE INDEX queue_ready ON queue_jobs (run_at, priority DESC) WHERE status = 'ready';\nCREATE UNIQUE INDEX queue_dedupe ON queue_jobs (dedupe_key) WHERE dedupe_key IS NOT NULL;\n\nCREATE TABLE schedules (\n project_id uuid NOT NULL REFERENCES projects(id) ON DELETE CASCADE,\n automation_id text NOT NULL,\n env text NOT NULL,\n cron text NOT NULL,\n tz text,\n enabled boolean NOT NULL DEFAULT true,\n next_fire timestamptz,\n PRIMARY KEY (project_id, automation_id, env)\n);\n\nCREATE TABLE events (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n project_id uuid NOT NULL REFERENCES projects(id) ON DELETE CASCADE,\n env text NOT NULL DEFAULT 'production',\n name text NOT NULL,\n payload jsonb,\n emitted_by_run uuid,\n created_at timestamptz NOT NULL DEFAULT now()\n);\n\nCREATE TABLE event_subscriptions (\n project_id uuid NOT NULL REFERENCES projects(id) ON DELETE CASCADE,\n env text NOT NULL,\n event_name text NOT NULL,\n automation_id text NOT NULL,\n PRIMARY KEY (project_id, env, event_name, automation_id)\n);\n\nCREATE TABLE signals (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n run_id uuid NOT NULL REFERENCES runs(id) ON DELETE CASCADE,\n name text NOT NULL,\n payload jsonb,\n consumed boolean NOT NULL DEFAULT false,\n created_at timestamptz NOT NULL DEFAULT now()\n);\nCREATE INDEX signals_by_run ON signals (run_id, name) WHERE NOT consumed;\n\nCREATE TABLE connections (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n workspace_id uuid NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,\n connector_id text NOT NULL,\n provider text,\n auth_mode text NOT NULL DEFAULT 'default',\n scope text NOT NULL DEFAULT 'workspace', -- workspace|per_user\n end_user_id text,\n label text,\n credential_cipher text,\n credential_meta jsonb NOT NULL DEFAULT '{}',\n status text NOT NULL DEFAULT 'pending', -- pending|ready|error\n error text,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n);\nCREATE INDEX connections_lookup ON connections (workspace_id, connector_id, status);\n\nCREATE TABLE requirement_bindings (\n project_id uuid NOT NULL REFERENCES projects(id) ON DELETE CASCADE,\n automation_id text NOT NULL,\n env text NOT NULL,\n req_key text NOT NULL,\n connection_id uuid NOT NULL REFERENCES connections(id) ON DELETE CASCADE,\n PRIMARY KEY (project_id, automation_id, env, req_key)\n);\n\nCREATE TABLE secrets (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n workspace_id uuid NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,\n name text NOT NULL,\n value_cipher text NOT NULL,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now(),\n UNIQUE (workspace_id, name)\n);\n\nCREATE TABLE connect_links (\n token text PRIMARY KEY,\n workspace_id uuid NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,\n project_id uuid REFERENCES projects(id) ON DELETE CASCADE,\n requirements jsonb NOT NULL,\n status text NOT NULL DEFAULT 'pending', -- pending|completed|expired\n expires_at timestamptz NOT NULL,\n created_at timestamptz NOT NULL DEFAULT now(),\n completed_at timestamptz\n);\n\nCREATE TABLE oauth_apps (\n workspace_id uuid NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,\n provider text NOT NULL,\n client_id text NOT NULL,\n client_secret_cipher text NOT NULL,\n PRIMARY KEY (workspace_id, provider)\n);\n\nCREATE TABLE oauth_states (\n state text PRIMARY KEY,\n connect_token text REFERENCES connect_links(token) ON DELETE CASCADE,\n connection_id uuid REFERENCES connections(id) ON DELETE CASCADE,\n provider text NOT NULL,\n code_verifier text,\n redirect_uri text NOT NULL,\n created_at timestamptz NOT NULL DEFAULT now(),\n expires_at timestamptz NOT NULL\n);\n\nCREATE TABLE webhook_registrations (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n project_id uuid NOT NULL REFERENCES projects(id) ON DELETE CASCADE,\n automation_id text NOT NULL,\n trigger_id text NOT NULL,\n connector_id text NOT NULL,\n connection_id uuid REFERENCES connections(id) ON DELETE SET NULL,\n env text NOT NULL,\n config_hash text NOT NULL,\n ingress_token text NOT NULL UNIQUE,\n signing_secret_cipher text,\n external_id text,\n state jsonb,\n status text NOT NULL DEFAULT 'pending', -- pending|registered|manual-pending|failed|removed\n error text,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now(),\n UNIQUE (project_id, automation_id, trigger_id, connection_id, env)\n);\n\nCREATE TABLE trigger_state (\n project_id uuid NOT NULL REFERENCES projects(id) ON DELETE CASCADE,\n automation_id text NOT NULL,\n trigger_id text NOT NULL,\n connection_id uuid NOT NULL,\n kind text NOT NULL, -- poll|webhook\n seen jsonb NOT NULL DEFAULT '[]',\n cursor jsonb,\n seeded boolean NOT NULL DEFAULT false,\n last_poll_at timestamptz,\n last_delivery_at timestamptz,\n PRIMARY KEY (project_id, automation_id, trigger_id, connection_id)\n);\n\nCREATE TABLE run_logs (\n id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,\n run_id uuid NOT NULL REFERENCES runs(id) ON DELETE CASCADE,\n step text,\n level text NOT NULL,\n msg text NOT NULL,\n meta jsonb,\n created_at timestamptz NOT NULL DEFAULT now()\n);\nCREATE INDEX run_logs_by_run ON run_logs (run_id, id);\n`,\n },\n {\n id: \"0002-project-webhook-bootstrap\",\n sql: /* sql */ `\nALTER TABLE projects ADD COLUMN IF NOT EXISTS push_webhook_secret_cipher text;\nALTER TABLE projects ADD COLUMN IF NOT EXISTS push_webhook_setup_token_hash text;\n`,\n },\n {\n id: \"0003-run-version-delete-policy\",\n sql: /* sql */ `\nALTER TABLE runs DROP CONSTRAINT IF EXISTS runs_version_id_fkey;\nALTER TABLE runs ADD CONSTRAINT runs_version_id_fkey\n FOREIGN KEY (version_id) REFERENCES automation_versions(id) ON DELETE SET NULL;\n`,\n },\n];\n", "import type { Db } from \"./db.js\";\nimport { migrations } from \"./migrations.js\";\n\nexport async function migrate(db: Db): Promise<string[]> {\n await db.query(\n `CREATE TABLE IF NOT EXISTS schema_migrations (\n id text PRIMARY KEY,\n applied_at timestamptz NOT NULL DEFAULT now()\n )`,\n );\n const { rows } = await db.query<{ id: string }>(`SELECT id FROM schema_migrations`);\n const applied = new Set(rows.map((r) => r.id));\n const ran: string[] = [];\n for (const m of migrations) {\n if (applied.has(m.id)) continue;\n await db.tx(async (c) => {\n // PGlite/pg both accept multi-statement strings via simple query protocol \u2014 but the\n // pg extended protocol (with params) does not; migrations carry no params.\n for (const statement of splitStatements(m.sql)) {\n await c.query(statement);\n }\n await c.query(`INSERT INTO schema_migrations (id) VALUES ($1)`, [m.id]);\n });\n ran.push(m.id);\n }\n return ran;\n}\n\n/** Split on top-level semicolons (none of our DDL contains procedural bodies). */\nfunction splitStatements(sql: string): string[] {\n return sql\n .split(/;\\s*(?=\\n|$)/)\n .map((s) => s.trim())\n .filter((s) => s.length > 0 && !s.startsWith(\"--\"));\n}\n", "// Envelope encryption (ADR-0005): master key (env/file) wraps per-workspace data keys;\n// data keys encrypt credential/secret values at rest. AES-256-GCM, versioned format.\n\nimport { createCipheriv, createDecipheriv, randomBytes } from \"node:crypto\";\n\nconst VERSION = \"v1\";\n\nexport function encrypt(key: Buffer, plaintext: string | Buffer): string {\n if (key.length !== 32) throw new Error(\"encryption key must be 32 bytes\");\n const iv = randomBytes(12);\n const cipher = createCipheriv(\"aes-256-gcm\", key, iv);\n const data = Buffer.concat([cipher.update(plaintext), cipher.final()]);\n const tag = cipher.getAuthTag();\n return [VERSION, iv.toString(\"base64\"), tag.toString(\"base64\"), data.toString(\"base64\")].join(\":\");\n}\n\nexport function decrypt(key: Buffer, payload: string): Buffer {\n const [version, ivB64, tagB64, dataB64] = payload.split(\":\");\n if (version !== VERSION || !ivB64 || !tagB64 || !dataB64) {\n throw new Error(\"unrecognized ciphertext format\");\n }\n const decipher = createDecipheriv(\"aes-256-gcm\", key, Buffer.from(ivB64, \"base64\"));\n decipher.setAuthTag(Buffer.from(tagB64, \"base64\"));\n return Buffer.concat([decipher.update(Buffer.from(dataB64, \"base64\")), decipher.final()]);\n}\n\nexport function generateDataKey(): Buffer {\n return randomBytes(32);\n}\n\nexport function wrapDataKey(masterKey: Buffer, dataKey: Buffer): string {\n return encrypt(masterKey, dataKey);\n}\n\nexport function unwrapDataKey(masterKey: Buffer, wrapped: string): Buffer {\n const key = decrypt(masterKey, wrapped);\n if (key.length !== 32) throw new Error(\"unwrapped data key has wrong length\");\n return key;\n}\n", "// Our own OAuth2 executor (ADR-0004): auth-code + PKCE, refresh, client-credentials \u2014\n// driven entirely by Catalog provider facts. No third-party OAuth code ships.\n\nimport { createHash, randomBytes } from \"node:crypto\";\nimport type { OAuth2ProviderFacts } from \"@devosurf/tesser-sdk/connector\";\n\nexport interface TokenSet {\n accessToken: string;\n refreshToken?: string;\n /** Epoch ms; undefined = non-expiring (e.g. GitHub OAuth-app tokens). */\n expiresAt?: number;\n tokenType?: string;\n scope?: string;\n raw: Record<string, unknown>;\n}\n\nexport class OAuthError extends Error {\n constructor(\n message: string,\n readonly providerResponse?: unknown,\n ) {\n super(message);\n this.name = \"OAuthError\";\n }\n}\n\nfunction b64url(buf: Buffer): string {\n return buf.toString(\"base64\").replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\nexport function generatePkce(): { verifier: string; challenge: string } {\n const verifier = b64url(randomBytes(48));\n const challenge = b64url(createHash(\"sha256\").update(verifier).digest());\n return { verifier, challenge };\n}\n\nexport function buildAuthorizeUrl(opts: {\n facts: OAuth2ProviderFacts;\n clientId: string;\n redirectUri: string;\n scopes: readonly string[];\n state: string;\n codeChallenge?: string | undefined;\n}): string {\n const url = new URL(opts.facts.authorizeUrl);\n url.searchParams.set(\"client_id\", opts.clientId);\n url.searchParams.set(\"redirect_uri\", opts.redirectUri);\n url.searchParams.set(\"response_type\", \"code\");\n url.searchParams.set(\"state\", opts.state);\n if (opts.scopes.length > 0) {\n url.searchParams.set(\"scope\", opts.scopes.join(opts.facts.scopeSeparator ?? \" \"));\n }\n if (opts.codeChallenge !== undefined) {\n url.searchParams.set(\"code_challenge\", opts.codeChallenge);\n url.searchParams.set(\"code_challenge_method\", \"S256\");\n }\n for (const [k, v] of Object.entries(opts.facts.extraAuthorizeParams ?? {})) {\n url.searchParams.set(k, v);\n }\n return url.toString();\n}\n\nasync function tokenRequest(\n facts: OAuth2ProviderFacts,\n clientId: string,\n clientSecret: string | undefined,\n params: Record<string, string>,\n fetchImpl: typeof fetch,\n): Promise<TokenSet> {\n const body = new URLSearchParams(params);\n const headers = new Headers({\n \"content-type\": \"application/x-www-form-urlencoded\",\n // GitHub answers form-encoded unless asked for JSON.\n accept: \"application/json\",\n });\n if ((facts.clientAuth ?? \"body\") === \"basic\") {\n headers.set(\"authorization\", `Basic ${Buffer.from(`${clientId}:${clientSecret ?? \"\"}`).toString(\"base64\")}`);\n } else {\n body.set(\"client_id\", clientId);\n if (clientSecret !== undefined) body.set(\"client_secret\", clientSecret);\n }\n for (const [k, v] of Object.entries(facts.extraTokenParams ?? {})) body.set(k, v);\n\n let res: Response;\n try {\n res = await fetchImpl(facts.tokenUrl, { method: \"POST\", headers, body });\n } catch (cause) {\n throw new OAuthError(`token endpoint unreachable: ${String(cause)}`);\n }\n const text = await res.text();\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(text) as Record<string, unknown>;\n } catch {\n parsed = Object.fromEntries(new URLSearchParams(text)); // form-encoded fallback\n }\n if (!res.ok || parsed[\"error\"] !== undefined || typeof parsed[\"access_token\"] !== \"string\") {\n throw new OAuthError(\n `token endpoint ${res.status}: ${String(parsed[\"error\"] ?? text.slice(0, 200))}`,\n parsed,\n );\n }\n const expiresIn = Number(parsed[\"expires_in\"]);\n return {\n accessToken: parsed[\"access_token\"] as string,\n ...(typeof parsed[\"refresh_token\"] === \"string\" ? { refreshToken: parsed[\"refresh_token\"] } : {}),\n ...(Number.isFinite(expiresIn) && expiresIn > 0 ? { expiresAt: Date.now() + expiresIn * 1000 } : {}),\n ...(typeof parsed[\"token_type\"] === \"string\" ? { tokenType: parsed[\"token_type\"] } : {}),\n ...(typeof parsed[\"scope\"] === \"string\" ? { scope: parsed[\"scope\"] } : {}),\n raw: parsed,\n };\n}\n\nexport async function exchangeCode(opts: {\n facts: OAuth2ProviderFacts;\n clientId: string;\n clientSecret?: string | undefined;\n code: string;\n redirectUri: string;\n codeVerifier?: string | undefined;\n fetchImpl?: typeof fetch;\n}): Promise<TokenSet> {\n return tokenRequest(\n opts.facts,\n opts.clientId,\n opts.clientSecret,\n {\n grant_type: \"authorization_code\",\n code: opts.code,\n redirect_uri: opts.redirectUri,\n ...(opts.codeVerifier !== undefined ? { code_verifier: opts.codeVerifier } : {}),\n },\n opts.fetchImpl ?? fetch,\n );\n}\n\nexport async function refreshToken(opts: {\n facts: OAuth2ProviderFacts;\n clientId: string;\n clientSecret?: string | undefined;\n refreshToken: string;\n fetchImpl?: typeof fetch;\n}): Promise<TokenSet> {\n return tokenRequest(\n opts.facts,\n opts.clientId,\n opts.clientSecret,\n { grant_type: \"refresh_token\", refresh_token: opts.refreshToken },\n opts.fetchImpl ?? fetch,\n );\n}\n\nexport async function clientCredentials(opts: {\n facts: OAuth2ProviderFacts;\n clientId: string;\n clientSecret: string;\n scopes: readonly string[];\n fetchImpl?: typeof fetch;\n}): Promise<TokenSet> {\n return tokenRequest(\n opts.facts,\n opts.clientId,\n opts.clientSecret,\n {\n grant_type: \"client_credentials\",\n ...(opts.scopes.length > 0 ? { scope: opts.scopes.join(opts.facts.scopeSeparator ?? \" \") } : {}),\n },\n opts.fetchImpl ?? fetch,\n );\n}\n", "// The Credential broker (ADR-0004/0005): the ONLY place credential values are decrypted.\n// Automations hold handles; the broker injects values at call time and registers every\n// decrypted value with the log masker. Refresh is single-flight per connection.\n\nimport type { OAuth2ProviderFacts } from \"@devosurf/tesser-sdk/connector\";\nimport type { Db } from \"../db/db.js\";\nimport { decrypt, encrypt, generateDataKey, unwrapDataKey, wrapDataKey } from \"./crypto.js\";\nimport { Masker } from \"./masking.js\";\nimport { refreshToken } from \"./oauth.js\";\n\nexport interface ConnectionRow {\n id: string;\n workspace_id: string;\n connector_id: string;\n provider: string | null;\n auth_mode: string;\n scope: string;\n end_user_id: string | null;\n label: string | null;\n credential_cipher: string | null;\n credential_meta: { expiresAt?: number; scope?: string; tokenType?: string };\n status: string;\n}\n\nexport interface CredentialBundle {\n fields: Record<string, string>;\n meta: ConnectionRow[\"credential_meta\"];\n}\n\nexport class Broker {\n private dataKeys = new Map<string, Buffer>();\n private refreshing = new Map<string, Promise<boolean>>();\n\n constructor(\n private readonly db: Db,\n private readonly masterKey: Buffer,\n readonly masker: Masker,\n private readonly fetchImpl: typeof fetch = fetch,\n ) {}\n\n // ---- workspaces & data keys ----\n\n async ensureDefaultWorkspace(): Promise<string> {\n const existing = await this.db.query<{ id: string }>(\n `SELECT id FROM workspaces ORDER BY created_at LIMIT 1`,\n );\n if (existing.rows[0]) return existing.rows[0].id;\n const wrapped = wrapDataKey(this.masterKey, generateDataKey());\n const created = await this.db.query<{ id: string }>(\n `INSERT INTO workspaces (name, data_key_cipher) VALUES ('default', $1) RETURNING id`,\n [wrapped],\n );\n return created.rows[0]!.id;\n }\n\n private async dataKey(workspaceId: string): Promise<Buffer> {\n const cached = this.dataKeys.get(workspaceId);\n if (cached) return cached;\n const { rows } = await this.db.query<{ data_key_cipher: string }>(\n `SELECT data_key_cipher FROM workspaces WHERE id = $1`,\n [workspaceId],\n );\n if (!rows[0]) throw new Error(`workspace ${workspaceId} not found`);\n const key = unwrapDataKey(this.masterKey, rows[0].data_key_cipher);\n this.dataKeys.set(workspaceId, key);\n return key;\n }\n\n // ---- secrets (raw values, ADR-0010) ----\n\n async setSecret(workspaceId: string, name: string, value: string): Promise<void> {\n const cipher = encrypt(await this.dataKey(workspaceId), value);\n await this.db.query(\n `INSERT INTO secrets (workspace_id, name, value_cipher) VALUES ($1,$2,$3)\n ON CONFLICT (workspace_id, name) DO UPDATE SET value_cipher = EXCLUDED.value_cipher, updated_at = now()`,\n [workspaceId, name, cipher],\n );\n this.masker.add(value, `secret.${name}`);\n }\n\n async getSecretValue(workspaceId: string, name: string): Promise<string | null> {\n const { rows } = await this.db.query<{ value_cipher: string }>(\n `SELECT value_cipher FROM secrets WHERE workspace_id=$1 AND name=$2`,\n [workspaceId, name],\n );\n if (!rows[0]) return null;\n const value = decrypt(await this.dataKey(workspaceId), rows[0].value_cipher).toString(\"utf8\");\n this.masker.add(value, `secret.${name}`);\n return value;\n }\n\n async listSecretNames(workspaceId: string): Promise<Array<{ name: string; updatedAt: string }>> {\n const { rows } = await this.db.query<{ name: string; updated_at: string }>(\n `SELECT name, updated_at FROM secrets WHERE workspace_id=$1 ORDER BY name`,\n [workspaceId],\n );\n return rows.map((r) => ({ name: r.name, updatedAt: String(r.updated_at) }));\n }\n\n async deleteSecret(workspaceId: string, name: string): Promise<boolean> {\n const { rowCount } = await this.db.query(`DELETE FROM secrets WHERE workspace_id=$1 AND name=$2`, [\n workspaceId,\n name,\n ]);\n return rowCount > 0;\n }\n\n // ---- connections ----\n\n async createConnection(opts: {\n workspaceId: string;\n connectorId: string;\n provider?: string | undefined;\n authMode?: string;\n scope?: \"workspace\" | \"per_user\";\n endUserId?: string;\n label?: string;\n }): Promise<string> {\n const { rows } = await this.db.query<{ id: string }>(\n `INSERT INTO connections (workspace_id, connector_id, provider, auth_mode, scope, end_user_id, label, status)\n VALUES ($1,$2,$3,$4,$5,$6,$7,'pending') RETURNING id`,\n [\n opts.workspaceId,\n opts.connectorId,\n opts.provider ?? null,\n opts.authMode ?? \"default\",\n opts.scope ?? \"workspace\",\n opts.endUserId ?? null,\n opts.label ?? null,\n ],\n );\n return rows[0]!.id;\n }\n\n async setConnectionCredential(\n connectionId: string,\n fields: Record<string, string>,\n meta: ConnectionRow[\"credential_meta\"] = {},\n ): Promise<void> {\n const { rows } = await this.db.query<{ workspace_id: string; connector_id: string }>(\n `SELECT workspace_id, connector_id FROM connections WHERE id=$1`,\n [connectionId],\n );\n if (!rows[0]) throw new Error(`connection ${connectionId} not found`);\n const cipher = encrypt(await this.dataKey(rows[0].workspace_id), JSON.stringify(fields));\n await this.db.query(\n `UPDATE connections SET credential_cipher=$2, credential_meta=$3::jsonb, status='ready', error=NULL, updated_at=now()\n WHERE id=$1`,\n [connectionId, cipher, JSON.stringify(meta)],\n );\n this.masker.addFields(fields, `connection.${rows[0].connector_id}`);\n }\n\n async getConnection(connectionId: string): Promise<ConnectionRow | null> {\n const { rows } = await this.db.query<ConnectionRow>(`SELECT * FROM connections WHERE id=$1`, [connectionId]);\n return rows[0] ?? null;\n }\n\n async getCredential(connectionId: string): Promise<CredentialBundle> {\n const row = await this.getConnection(connectionId);\n if (!row || row.status !== \"ready\" || !row.credential_cipher) {\n throw new Error(`connection ${connectionId} is not ready`);\n }\n const fields = JSON.parse(\n decrypt(await this.dataKey(row.workspace_id), row.credential_cipher).toString(\"utf8\"),\n ) as Record<string, string>;\n this.masker.addFields(fields, `connection.${row.connector_id}`);\n return { fields, meta: row.credential_meta ?? {} };\n }\n\n async listConnections(workspaceId: string): Promise<\n Array<{ id: string; connectorId: string; authMode: string; scope: string; label: string | null; status: string; endUserId: string | null }>\n > {\n const { rows } = await this.db.query<ConnectionRow>(\n `SELECT * FROM connections WHERE workspace_id=$1 ORDER BY created_at`,\n [workspaceId],\n );\n return rows.map((r) => ({\n id: r.id,\n connectorId: r.connector_id,\n authMode: r.auth_mode,\n scope: r.scope,\n label: r.label,\n status: r.status,\n endUserId: r.end_user_id,\n }));\n }\n\n /** Resolve an automation's `connections.<reqKey>` to a concrete ready Connection \u2014\n * the persisted binding wins; otherwise auto-bind when exactly one candidate exists. */\n async resolveBinding(opts: {\n workspaceId: string;\n projectId: string;\n automationId: string;\n env: string;\n reqKey: string;\n connectorId: string;\n scope: \"workspace\" | \"per_user\";\n endUserId?: string | undefined;\n }): Promise<ConnectionRow | null> {\n if (opts.scope === \"workspace\") {\n const bound = await this.db.query<{ connection_id: string }>(\n `SELECT connection_id FROM requirement_bindings\n WHERE project_id=$1 AND automation_id=$2 AND env=$3 AND req_key=$4`,\n [opts.projectId, opts.automationId, opts.env, opts.reqKey],\n );\n if (bound.rows[0]) {\n const conn = await this.getConnection(bound.rows[0].connection_id);\n if (conn?.status === \"ready\") return conn;\n }\n }\n const endUserFilter = opts.scope === \"per_user\" ? `AND end_user_id = $4` : `AND scope = 'workspace'`;\n const params: unknown[] =\n opts.scope === \"per_user\"\n ? [opts.workspaceId, opts.connectorId, \"ready\", opts.endUserId ?? null]\n : [opts.workspaceId, opts.connectorId, \"ready\"];\n const { rows } = await this.db.query<ConnectionRow>(\n `SELECT * FROM connections WHERE workspace_id=$1 AND connector_id=$2 AND status=$3 ${endUserFilter}\n ORDER BY created_at`,\n params,\n );\n if (rows.length !== 1) return null; // 0 = missing; >1 = ambiguous \u2192 must bind explicitly\n const conn = rows[0]!;\n if (opts.scope === \"workspace\") {\n await this.db.query(\n `INSERT INTO requirement_bindings (project_id, automation_id, env, req_key, connection_id)\n VALUES ($1,$2,$3,$4,$5)\n ON CONFLICT (project_id, automation_id, env, req_key) DO UPDATE SET connection_id = EXCLUDED.connection_id`,\n [opts.projectId, opts.automationId, opts.env, opts.reqKey, conn.id],\n );\n }\n return conn;\n }\n\n // ---- OAuth apps (BYO per workspace, ADR-0005; env fallback for dev) ----\n\n async setOAuthApp(workspaceId: string, provider: string, clientId: string, clientSecret: string): Promise<void> {\n const cipher = encrypt(await this.dataKey(workspaceId), clientSecret);\n await this.db.query(\n `INSERT INTO oauth_apps (workspace_id, provider, client_id, client_secret_cipher)\n VALUES ($1,$2,$3,$4)\n ON CONFLICT (workspace_id, provider) DO UPDATE SET client_id=EXCLUDED.client_id, client_secret_cipher=EXCLUDED.client_secret_cipher`,\n [workspaceId, provider, clientId, cipher],\n );\n this.masker.add(clientSecret, `oauthapp.${provider}`);\n }\n\n async getOAuthApp(\n workspaceId: string,\n provider: string,\n ): Promise<{ clientId: string; clientSecret: string } | null> {\n const { rows } = await this.db.query<{ client_id: string; client_secret_cipher: string }>(\n `SELECT client_id, client_secret_cipher FROM oauth_apps WHERE workspace_id=$1 AND provider=$2`,\n [workspaceId, provider],\n );\n if (rows[0]) {\n const clientSecret = decrypt(await this.dataKey(workspaceId), rows[0].client_secret_cipher).toString(\"utf8\");\n this.masker.add(clientSecret, `oauthapp.${provider}`);\n return { clientId: rows[0].client_id, clientSecret };\n }\n const envKey = provider.toUpperCase().replace(/[^A-Z0-9]/g, \"_\");\n const clientId = process.env[`TESSER_OAUTH_${envKey}_CLIENT_ID`];\n const clientSecret = process.env[`TESSER_OAUTH_${envKey}_CLIENT_SECRET`];\n if (clientId && clientSecret) return { clientId, clientSecret };\n return null;\n }\n\n // ---- token freshness (refresh-once, single-flight per connection) ----\n\n /** Returns true when a refresh happened (caller should re-read the credential). */\n async refreshConnection(connectionId: string, facts: OAuth2ProviderFacts): Promise<boolean> {\n const inFlight = this.refreshing.get(connectionId);\n if (inFlight) return inFlight;\n const p = (async (): Promise<boolean> => {\n const row = await this.getConnection(connectionId);\n if (!row) return false;\n const { fields, meta } = await this.getCredential(connectionId);\n const rt = fields[\"refresh_token\"];\n if (rt === undefined) return false;\n const app = await this.getOAuthApp(row.workspace_id, row.provider ?? row.connector_id);\n if (!app) return false;\n const tokens = await refreshToken({\n facts,\n clientId: app.clientId,\n clientSecret: app.clientSecret,\n refreshToken: rt,\n fetchImpl: this.fetchImpl,\n });\n const nextFields: Record<string, string> = {\n ...fields,\n access_token: tokens.accessToken,\n ...(tokens.refreshToken !== undefined ? { refresh_token: tokens.refreshToken } : {}),\n };\n await this.setConnectionCredential(connectionId, nextFields, {\n ...meta,\n ...(tokens.expiresAt !== undefined ? { expiresAt: tokens.expiresAt } : {}),\n });\n return true;\n })().finally(() => this.refreshing.delete(connectionId));\n this.refreshing.set(connectionId, p);\n return p;\n }\n\n /** Workspace-keyed encryption for values that live outside the secrets table\n * (deploy keys, webhook signing secrets). */\n async encryptValue(workspaceId: string, value: string, maskLabel?: string): Promise<string> {\n if (maskLabel !== undefined) this.masker.add(value, maskLabel);\n return encrypt(await this.dataKey(workspaceId), value);\n }\n\n async decryptValue(workspaceId: string, cipher: string, maskLabel?: string): Promise<string> {\n const value = decrypt(await this.dataKey(workspaceId), cipher).toString(\"utf8\");\n if (maskLabel !== undefined) this.masker.add(value, maskLabel);\n return value;\n }\n\n /** Ensure a fresh access token (60s slack) before injecting. */\n async freshCredential(connectionId: string, facts: OAuth2ProviderFacts | undefined): Promise<CredentialBundle> {\n let bundle = await this.getCredential(connectionId);\n const expiresAt = bundle.meta.expiresAt;\n if (\n facts !== undefined &&\n typeof expiresAt === \"number\" &&\n expiresAt < Date.now() + 60_000 &&\n bundle.fields[\"refresh_token\"] !== undefined\n ) {\n const refreshed = await this.refreshConnection(connectionId, facts);\n if (refreshed) bundle = await this.getCredential(connectionId);\n }\n return bundle;\n }\n}\n", "// Log masking (ADR-0005): every decrypted credential value (\u2265 8 chars \u2014 shorter values\n// would mask common words) is registered here; every string headed to logs passes\n// through mask(). The broker is the only place values are decrypted, so registration\n// is structurally complete.\n\nconst MIN_LENGTH = 8;\n\nexport class Masker {\n private values = new Map<string, string>(); // value \u2192 label\n\n add(value: string, label = \"secret\"): void {\n if (typeof value !== \"string\" || value.length < MIN_LENGTH) return;\n this.values.set(value, label);\n }\n\n addFields(fields: Record<string, string>, prefix: string): void {\n for (const [k, v] of Object.entries(fields)) this.add(v, `${prefix}.${k}`);\n }\n\n mask(text: string): string {\n if (typeof text !== \"string\" || text.length === 0) return text;\n let out = text;\n for (const [value, label] of this.values) {\n if (out.includes(value)) out = out.split(value).join(`[masked:${label}]`);\n }\n return out;\n }\n\n get size(): number {\n return this.values.size;\n }\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", "// 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", "// 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", "// The pre-authed connector HTTP client (ADR-0012). The SDK owns the *mechanics* \u2014\n// URL/base-URL handling, JSON encoding, status\u2192Retryable/Terminal classification,\n// Retry-After, refresh-once on 401 \u2014 while the credential itself enters only through\n// the runtime-supplied `applyAuth` hook at call time (the broker boundary, ADR-0004).\n\nimport { RetryableError, TerminalError } from \"../errors.js\";\n\nexport interface HttpRequestOptions {\n method?: string;\n path?: string;\n query?: Record<string, string | number | boolean | undefined>;\n headers?: Record<string, string>;\n /** JSON-encoded unless `body` is a string / Uint8Array / URLSearchParams / FormData. */\n body?: unknown;\n /** Return the raw Response instead of the parsed body. */\n raw?: boolean;\n timeoutMs?: number;\n}\n\nexport interface ProviderHttpError {\n status: number;\n bodySnippet: string;\n url: string;\n}\n\n/** Classification override, per action (ADR-0012). Return an Error to throw it as-is. */\nexport type ClassifyError = (\n err: ProviderHttpError,\n) => \"retry\" | \"terminal\" | Error | undefined;\n\nexport interface TesserHttpConfig {\n baseUrl?: string;\n fetchImpl?: typeof fetch;\n defaultHeaders?: Record<string, string>;\n /** Inject the credential into the outbound request. Supplied by the runtime, never by authors. */\n applyAuth?: (req: { url: URL; headers: Headers }) => void | Promise<void>;\n /** Broker refresh-once hook: called on 401; return true to retry the call once. */\n onUnauthorized?: () => Promise<boolean>;\n classifyError?: ClassifyError;\n timeoutMs?: number;\n}\n\nexport interface TesserHttp {\n get(path: string, opts?: HttpRequestOptions): Promise<any>;\n delete(path: string, opts?: HttpRequestOptions): Promise<any>;\n post(path: string, body?: unknown, opts?: HttpRequestOptions): Promise<any>;\n put(path: string, body?: unknown, opts?: HttpRequestOptions): Promise<any>;\n patch(path: string, body?: unknown, opts?: HttpRequestOptions): Promise<any>;\n request(opts: HttpRequestOptions & { path: string }): Promise<any>;\n}\n\nfunction parseRetryAfter(value: string | null): number | undefined {\n if (!value) return undefined;\n const secs = Number(value);\n if (Number.isFinite(secs)) return Math.max(0, secs * 1000);\n const date = Date.parse(value);\n if (!Number.isNaN(date)) return Math.max(0, date - Date.now());\n return undefined;\n}\n\nconst RETRYABLE_STATUS = new Set([408, 425, 429, 500, 502, 503, 504]);\n\nexport function classifyStatus(status: number): \"retry\" | \"terminal\" | \"ok\" | \"unauthorized\" {\n if (status >= 200 && status < 300) return \"ok\";\n if (status === 401) return \"unauthorized\";\n if (RETRYABLE_STATUS.has(status) || status >= 500) return \"retry\";\n return \"terminal\";\n}\n\nexport function createHttpClient(config: TesserHttpConfig): TesserHttp {\n const fetchImpl = config.fetchImpl ?? fetch;\n\n function buildUrl(path: string, query?: HttpRequestOptions[\"query\"]): URL {\n let url: URL;\n if (/^https?:\\/\\//.test(path)) {\n url = new URL(path);\n } else {\n if (!config.baseUrl) {\n throw new TerminalError(`http: relative path \"${path}\" but the connector has no baseUrl`);\n }\n const base = config.baseUrl.endsWith(\"/\") ? config.baseUrl : config.baseUrl + \"/\";\n url = new URL(path.startsWith(\"/\") ? path.slice(1) : path, base);\n }\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined) url.searchParams.set(k, String(v));\n }\n }\n return url;\n }\n\n async function exec(opts: HttpRequestOptions & { path: string }, isRetryAfter401 = false): Promise<any> {\n const url = buildUrl(opts.path, opts.query);\n const headers = new Headers(config.defaultHeaders);\n headers.set(\"accept\", headers.get(\"accept\") ?? \"application/json\");\n if (opts.headers) for (const [k, v] of Object.entries(opts.headers)) headers.set(k, v);\n\n type FetchBody = NonNullable<Parameters<typeof fetch>[1]> extends { body?: infer B }\n ? B\n : never;\n let body: FetchBody | undefined;\n if (opts.body !== undefined) {\n if (\n typeof opts.body === \"string\" ||\n opts.body instanceof Uint8Array ||\n opts.body instanceof URLSearchParams ||\n (typeof FormData !== \"undefined\" && opts.body instanceof FormData)\n ) {\n body = opts.body as FetchBody;\n } else {\n body = JSON.stringify(opts.body);\n if (!headers.has(\"content-type\")) headers.set(\"content-type\", \"application/json\");\n }\n }\n\n await config.applyAuth?.({ url, headers });\n\n const timeoutMs = opts.timeoutMs ?? config.timeoutMs ?? 30_000;\n let res: Response;\n try {\n res = await fetchImpl(url, {\n method: opts.method ?? \"GET\",\n headers,\n signal: AbortSignal.timeout(timeoutMs),\n ...(body !== undefined ? { body } : {}),\n });\n } catch (cause) {\n throw new RetryableError(`http: network failure for ${opts.method ?? \"GET\"} ${url.host}${url.pathname}`, {\n cause,\n });\n }\n\n // raw mode: the caller owns status handling entirely (e.g. the generic http connector).\n if (opts.raw) return res;\n\n const kind = classifyStatus(res.status);\n if (kind === \"ok\") {\n const text = await res.text();\n if (text.length === 0) return null;\n const contentType = res.headers.get(\"content-type\") ?? \"\";\n if (contentType.includes(\"json\")) return JSON.parse(text);\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }\n\n if (kind === \"unauthorized\" && !isRetryAfter401 && config.onUnauthorized) {\n const refreshed = await config.onUnauthorized();\n if (refreshed) return exec(opts, true);\n }\n\n const bodySnippet = (await res.text().catch(() => \"\")).slice(0, 600);\n const providerErr: ProviderHttpError = { status: res.status, bodySnippet, url: url.toString() };\n const overridden = config.classifyError?.(providerErr);\n if (overridden instanceof Error) throw overridden;\n const finalKind = overridden ?? (kind === \"unauthorized\" ? \"terminal\" : kind);\n\n const message = `provider responded ${res.status} for ${opts.method ?? \"GET\"} ${url.pathname}${\n bodySnippet ? ` \u2014 ${bodySnippet}` : \"\"\n }`;\n if (finalKind === \"retry\") {\n throw new RetryableError(message, {\n retryAfterMs: parseRetryAfter(res.headers.get(\"retry-after\")),\n });\n }\n throw new TerminalError(message);\n }\n\n return {\n get: (path, opts) => exec({ ...opts, path, method: \"GET\" }),\n delete: (path, opts) => exec({ ...opts, path, method: \"DELETE\" }),\n post: (path, body, opts) => exec({ ...opts, path, body, method: \"POST\" }),\n put: (path, body, opts) => exec({ ...opts, path, body, method: \"PUT\" }),\n patch: (path, body, opts) => exec({ ...opts, path, body, method: \"PATCH\" }),\n request: (opts) => exec(opts),\n };\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", "// Wires the broker into the engine: builds ctx.connections (typed clients whose every\n// call gets the credential injected at call time) and ctx.secrets. The automation never\n// sees a value that isn't masked in logs.\n\nimport { TerminalError, type AutomationDef, type HarnessRunResult, type Logger, type NormalizedModelResponse } from \"@devosurf/tesser-sdk\";\nimport type {\n ActionCtx,\n AnyAction,\n AuthDecl,\n ConnectorInstance,\n OAuth2ProviderFacts,\n ProviderFacts,\n} from \"@devosurf/tesser-sdk/connector\";\nimport {\n buildConnectorClient,\n createHttpClient,\n isRetrySafe,\n runAction,\n type HarnessCallInfo,\n type ModelCallInfo,\n type TesserHttpConfig,\n} from \"@devosurf/tesser-sdk/internal\";\nimport type { Db } from \"../db/db.js\";\nimport type { ActiveStepHooks, EngineDeps, RunRow } from \"../engine/types.js\";\nimport type { Broker, ConnectionRow } from \"./broker.js\";\n\nexport function authDeclFor(spec: ConnectorInstance<any, any>[\"__connector\"], mode: string): AuthDecl {\n const auth = spec.auth as AuthDecl | Record<string, AuthDecl>;\n if (\"kind\" in auth && typeof auth.kind === \"string\") return auth as AuthDecl;\n const decl = (auth as Record<string, AuthDecl>)[mode];\n if (!decl) throw new TerminalError(`connector ${spec.id}: unknown auth mode \"${mode}\"`);\n return decl;\n}\n\nexport function providerFactsOf(spec: ConnectorInstance<any, any>[\"__connector\"]): ProviderFacts | undefined {\n return typeof spec.provider === \"object\" ? spec.provider : undefined;\n}\n\nexport function applyAuthFor(decl: AuthDecl, fields: Record<string, string>): TesserHttpConfig[\"applyAuth\"] {\n switch (decl.kind) {\n case \"oauth2\":\n return ({ headers }) => {\n headers.set(\"authorization\", `Bearer ${fields[\"access_token\"] ?? \"\"}`);\n };\n case \"apiKey\": {\n const value = (decl.prefix ?? \"\") + (fields[\"api_key\"] ?? \"\");\n if (decl.in === \"query\") {\n return ({ url }) => {\n url.searchParams.set(decl.name, fields[\"api_key\"] ?? \"\");\n };\n }\n return ({ headers }) => {\n headers.set(decl.name, value);\n };\n }\n case \"basic\":\n return ({ headers }) => {\n headers.set(\n \"authorization\",\n `Basic ${Buffer.from(`${fields[\"username\"] ?? \"\"}:${fields[\"password\"] ?? \"\"}`).toString(\"base64\")}`,\n );\n };\n case \"custom\":\n return (req) => decl.sign(req, fields);\n }\n}\n\nexport interface BindingDeps {\n db: Db;\n broker: Broker;\n fetchImpl?: typeof fetch;\n}\n\nasync function workspaceOf(db: Db, projectId: string): Promise<string> {\n const { rows } = await db.query<{ workspace_id: string }>(\n `SELECT workspace_id FROM projects WHERE id=$1`,\n [projectId],\n );\n if (!rows[0]) throw new TerminalError(`project ${projectId} not found`);\n return rows[0].workspace_id;\n}\n\nexport function makeEngineBindings(deps: BindingDeps): Pick<EngineDeps, \"buildConnections\" | \"resolveSecrets\" | \"callModel\" | \"callHarness\"> {\n async function connectionFor(run: RunRow, def: AutomationDef<any, any, any, any, any, any, any>, reqKey: string) {\n const connector = ((def.connections ?? {}) as Record<string, ConnectorInstance<any, any>>)[reqKey];\n if (!connector) throw new TerminalError(`connection \"${reqKey}\" is not declared`);\n const workspaceId = await workspaceOf(deps.db, run.project_id);\n const endUserId = (run.trigger[\"endUserId\"] as string | undefined) ?? undefined;\n const conn = await deps.broker.resolveBinding({\n workspaceId,\n projectId: run.project_id,\n automationId: run.automation_id,\n env: run.env,\n reqKey,\n connectorId: connector.id,\n scope: connector.scope ?? \"workspace\",\n endUserId,\n });\n if (!conn) {\n throw new TerminalError(\n `no ready ${connector.id} connection for \"${reqKey}\" \u2014 run \\`tesser connect\\` (deploy should have halted; ADR-0005)`,\n );\n }\n return { workspaceId, connector, conn };\n }\n\n return {\n async buildConnections(run: RunRow, def: AutomationDef<any, any, any, any, any, any, any>, hooks: ActiveStepHooks) {\n const out: Record<string, unknown> = {};\n const entries = Object.entries((def.connections ?? {}) as Record<string, ConnectorInstance<any, any>>);\n if (entries.length === 0) return out;\n const workspaceId = await workspaceOf(deps.db, run.project_id);\n\n for (const [reqKey, connector] of entries) {\n const spec = connector.__connector;\n const facts = providerFactsOf(spec);\n const endUserId = (run.trigger[\"endUserId\"] as string | undefined) ?? undefined;\n\n out[reqKey] = buildConnectorClient(connector, async (path, actionDef, input) => {\n const step = hooks.current();\n if (!step) {\n throw new TerminalError(\n `connector call ${connector.id}.${path.join(\".\")} outside ctx.step \u2014 side effects live inside steps (ADR-0002)`,\n );\n }\n const { conn } = await connectionFor(run, def, reqKey);\n if (!isRetrySafe(actionDef as AnyAction, spec.idempotencyHeader !== undefined)) {\n step.markUnsafeWrite();\n }\n const decl = authDeclFor(spec, conn.auth_mode);\n const bundle = await deps.broker.freshCredential(conn.id, facts?.oauth2);\n\n const actx = makeActionCtx({\n spec,\n decl,\n conn,\n facts,\n fields: bundle.fields,\n broker: deps.broker,\n idempotencyKey: step.idempotencyKey,\n ...(deps.fetchImpl !== undefined ? { fetchImpl: deps.fetchImpl } : {}),\n ...(actionDef.classifyError !== undefined ? { classifyError: actionDef.classifyError } : {}),\n });\n return runAction(actionDef as AnyAction, actx, input, `${connector.id}.${path.join(\".\")}`);\n });\n }\n return out;\n },\n\n async resolveSecrets(run: RunRow, def: AutomationDef<any, any, any, any, any, any, any>) {\n const names = Object.keys((def.secrets ?? {}) as Record<string, unknown>);\n if (names.length === 0) return {};\n const workspaceId = await workspaceOf(deps.db, run.project_id);\n const out: Record<string, string> = {};\n for (const name of names) {\n const value = await deps.broker.getSecretValue(workspaceId, name);\n if (value === null) {\n throw new TerminalError(`secret \"${name}\" is not set \u2014 deploy should have halted (ADR-0005)`);\n }\n out[name] = value;\n }\n return out;\n },\n\n async callModel(\n run: RunRow,\n def: AutomationDef<any, any, any, any, any, any, any>,\n hooks: ActiveStepHooks,\n info: ModelCallInfo,\n ): Promise<NormalizedModelResponse> {\n const step = hooks.current();\n if (!step) {\n throw new TerminalError(`model call ${info.operatorKey}.${info.modelKey} outside ctx.step`);\n }\n const { connector, conn } = await connectionFor(run, def, info.model.connection);\n const spec = connector.__connector;\n if (!spec.modelProvider) {\n throw new TerminalError(`connection \"${info.model.connection}\" (${connector.id}) is not model-capable`);\n }\n const facts = providerFactsOf(spec);\n const decl = authDeclFor(spec, conn.auth_mode);\n const bundle = await deps.broker.freshCredential(conn.id, facts?.oauth2);\n const actx = makeActionCtx({\n spec,\n decl,\n conn,\n facts,\n fields: bundle.fields,\n broker: deps.broker,\n idempotencyKey: step.idempotencyKey,\n ...(deps.fetchImpl !== undefined ? { fetchImpl: deps.fetchImpl } : {}),\n });\n return spec.modelProvider.call(actx, info.request);\n },\n\n async callHarness(\n run: RunRow,\n def: AutomationDef<any, any, any, any, any, any, any>,\n hooks: ActiveStepHooks,\n info: HarnessCallInfo,\n ): Promise<HarnessRunResult<unknown>> {\n const step = hooks.current();\n if (!step) throw new TerminalError(`harness.${info.harnessKey} ran outside ctx.step`);\n const { connector, conn } = await connectionFor(run, def, info.harness.connection);\n const spec = connector.__connector;\n if (!spec.harnessProvider) {\n throw new TerminalError(`connection \"${info.harness.connection}\" (${connector.id}) is not harness-capable`);\n }\n const facts = providerFactsOf(spec);\n const decl = authDeclFor(spec, conn.auth_mode);\n const bundle = await deps.broker.freshCredential(conn.id, facts?.oauth2);\n const actx = makeActionCtx({\n spec,\n decl,\n conn,\n facts,\n fields: bundle.fields,\n broker: deps.broker,\n idempotencyKey: step.idempotencyKey,\n ...(deps.fetchImpl !== undefined ? { fetchImpl: deps.fetchImpl } : {}),\n });\n return spec.harnessProvider.run(actx, info.request, info.harness);\n },\n };\n}\n\n/** Build a pre-authed ActionCtx for one connector call \u2014 also used by the trigger\n * registrar and pollers (ADR-0013 shares the broker boundary). */\nexport function makeActionCtx(opts: {\n spec: ConnectorInstance<any, any>[\"__connector\"];\n decl: AuthDecl;\n conn: ConnectionRow;\n facts: ProviderFacts | undefined;\n fields: Record<string, string>;\n broker: Broker;\n idempotencyKey?: string | undefined;\n fetchImpl?: typeof fetch | undefined;\n classifyError?: AnyAction[\"classifyError\"] | undefined;\n logger?: Logger;\n}): ActionCtx {\n const baseUrl = opts.spec.baseUrl ?? opts.facts?.baseUrl;\n const oauthFacts: OAuth2ProviderFacts | undefined = opts.facts?.oauth2;\n let fields = opts.fields;\n\n const http = createHttpClient({\n ...(baseUrl !== undefined ? { baseUrl } : {}),\n ...(opts.spec.defaultHeaders !== undefined ? { defaultHeaders: opts.spec.defaultHeaders } : {}),\n ...(opts.fetchImpl !== undefined ? { fetchImpl: opts.fetchImpl } : {}),\n ...(opts.classifyError !== undefined ? { classifyError: opts.classifyError } : {}),\n applyAuth: async (req) => {\n const apply = applyAuthFor(opts.decl, fields);\n await apply?.(req);\n },\n ...(opts.decl.kind === \"oauth2\" && oauthFacts !== undefined\n ? {\n onUnauthorized: async () => {\n const refreshed = await opts.broker.refreshConnection(opts.conn.id, oauthFacts);\n if (refreshed) {\n fields = (await opts.broker.getCredential(opts.conn.id)).fields;\n }\n return refreshed;\n },\n }\n : {}),\n });\n\n const silent: Logger = { info() {}, warn() {}, error() {} };\n return {\n http,\n auth: {\n kind: opts.decl.kind,\n ...(opts.conn.auth_mode !== \"default\" ? { mode: opts.conn.auth_mode } : {}),\n fields,\n },\n logger: opts.logger ?? silent,\n ...(opts.idempotencyKey !== undefined ? { idempotencyKey: opts.idempotencyKey } : {}),\n };\n}\n", "// The durable engine (ADR-0002/0003): journal-of-results over plain Postgres. The\n// handler re-executes from the top on every (re)invocation; completed steps return\n// journaled results; everything else is ordinary TypeScript. Suspensions (sleep, signal\n// waits, durable retries) unwind via RunSuspended and a queue job re-invokes later \u2014\n// hibernate-on-wait, zero idle cost.\n//\n// Exactly-once INTERNAL: a step's checkpoint (result + buffered events + fan-out jobs)\n// commits in ONE transaction. External connector calls stay at-least-once with the\n// auto-derived idempotency key (runId + step + occurrence).\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { AutomationDef, Ctx, EventDefinition, Logger, Schema, StepOpts } from \"@devosurf/tesser-sdk\";\nimport { isRetryableError, isTerminalError, TerminalError, RetryableError } from \"@devosurf/tesser-sdk\";\nimport {\n buildHarnesses,\n buildOperators,\n decodeJournal,\n encodeJournal,\n nextRetryDelayMs,\n parseDuration,\n resolveRetryPolicy,\n validateSchema,\n type JsonValue,\n} from \"@devosurf/tesser-sdk/internal\";\nimport { enqueue } from \"../queue/queue.js\";\nimport { RunSuspended } from \"./signals.js\";\nimport type { EngineDeps, RunOutcome, RunRow } from \"./types.js\";\n\ninterface StepRow {\n name: string;\n occurrence: number;\n status: string;\n attempts: number;\n result: JsonValue | null;\n error: { name?: string; message?: string } | null;\n}\n\ninterface ActiveStep {\n name: string;\n occurrence: number;\n idempotencyKey: string;\n unsafeWrite: boolean;\n events: Array<{ name: string; payload: JsonValue }>;\n}\n\nfunction serializeError(err: unknown): JsonValue {\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 ...(e.stack !== undefined ? { stack: e.stack.split(\"\\n\").slice(0, 12).join(\"\\n\") } : {}),\n };\n}\n\nexport async function executeRun(deps: EngineDeps, runId: string): Promise<RunOutcome> {\n const { db } = deps;\n const { rows: runRows } = await db.query<RunRow>(`SELECT * FROM runs WHERE id = $1`, [runId]);\n const run = runRows[0];\n if (!run) return \"skipped\";\n if ([\"completed\", \"failed\", \"cancelled\"].includes(run.status)) return \"skipped\";\n if (!run.version_id) {\n await db.query(`UPDATE runs SET status='failed', error=$2::jsonb, finished_at=now() WHERE id=$1`, [\n runId,\n JSON.stringify({ name: \"TesserError\", message: \"run has no version\" }),\n ]);\n return \"failed\";\n }\n\n const def = await deps.loadAutomation(run.version_id);\n let input = run.input === null ? undefined : decodeJournal(run.input);\n\n // Validate input against the declared schema (def.input, or the trigger's own).\n const inputSchema =\n def.input ??\n (def.trigger as { input?: Schema<unknown> }).input ??\n (def.trigger as { event?: { schema?: Schema<unknown> } }).event?.schema;\n if (inputSchema !== undefined && input !== undefined) {\n try {\n input = await validateSchema(inputSchema, input, `automation \"${def.id}\" input`);\n } catch (err) {\n await db.query(`UPDATE runs SET status='failed', error=$2::jsonb, finished_at=now() WHERE id=$1`, [\n runId,\n JSON.stringify(serializeError(err)),\n ]);\n return \"failed\";\n }\n }\n\n // ---- concurrency gate (first start only; ADR sketch: onConflict queue|drop) ----\n if (run.status === \"queued\" && def.concurrency) {\n const key =\n run.concurrency_key ??\n (typeof def.concurrency.key === \"function\" ? String(def.concurrency.key(input as never)) : \"\");\n const decision = await db.tx(async (c) => {\n await c.query(`UPDATE runs SET concurrency_key = $2 WHERE id = $1`, [runId, key]);\n const { rows } = await c.query<{ n: string }>(\n `SELECT count(*)::text AS n FROM runs\n WHERE project_id = $1 AND automation_id = $2 AND env = $3\n AND concurrency_key = $4 AND id <> $5\n AND status IN ('running','suspended')`,\n [run.project_id, run.automation_id, run.env, key, runId],\n );\n const active = Number(rows[0]?.n ?? 0);\n if (active < def.concurrency!.limit) return \"go\";\n if ((def.concurrency!.onConflict ?? \"queue\") === \"drop\") {\n await c.query(\n `UPDATE runs SET status='cancelled', error=$2::jsonb, finished_at=now() WHERE id=$1`,\n [runId, JSON.stringify({ name: \"ConcurrencyDrop\", message: \"dropped: concurrency limit reached\" })],\n );\n return \"drop\";\n }\n await enqueue(c, {\n kind: \"run\",\n payload: { runId },\n runAtMs: Date.now() + 2000,\n dedupeKey: `run:${runId}`,\n });\n return \"defer\";\n });\n if (decision === \"drop\") return \"skipped\";\n if (decision === \"defer\") return \"deferred\";\n }\n\n const attempt = run.attempt + 1;\n await db.query(\n `UPDATE runs SET status='running', attempt=$2, started_at=COALESCE(started_at, now()),\n waiting_signal=NULL, wake_at=NULL WHERE id=$1`,\n [runId, attempt],\n );\n\n // ---- journal ----\n const { rows: stepRows } = await db.query<StepRow>(\n `SELECT name, occurrence, status, attempts, result, error FROM run_steps WHERE run_id = $1`,\n [runId],\n );\n const journal = new Map<string, StepRow>();\n for (const r of stepRows) journal.set(`${r.name}#${r.occurrence}`, r);\n\n const occurrences = new Map<string, number>();\n const nextOcc = (name: string): number => {\n const n = (occurrences.get(name) ?? 0) + 1;\n occurrences.set(name, n);\n return n;\n };\n\n const undoStack: Array<{ name: string; occurrence: number; undo: () => unknown | Promise<unknown> }> = [];\n const active = new AsyncLocalStorage<ActiveStep>();\n const defaultRetry = resolveRetryPolicy(def.retry);\n\n const log = (level: \"info\" | \"warn\" | \"error\", msg: string, meta?: Record<string, unknown>, step?: string) => {\n void db\n .query(`INSERT INTO run_logs (run_id, step, level, msg, meta) VALUES ($1,$2,$3,$4,$5::jsonb)`, [\n runId,\n step ?? active.getStore()?.name ?? null,\n level,\n deps.mask(msg),\n meta ? deps.mask(JSON.stringify(encodeJournal(meta))) : null,\n ])\n .catch(() => {});\n };\n const logger: Logger = {\n info: (m, meta) => log(\"info\", m, meta),\n warn: (m, meta) => log(\"warn\", m, meta),\n error: (m, meta) => log(\"error\", m, meta),\n };\n\n const hooks = {\n current() {\n const s = active.getStore();\n if (!s) return undefined;\n return {\n name: s.name,\n occurrence: s.occurrence,\n idempotencyKey: s.idempotencyKey,\n markUnsafeWrite: () => {\n s.unsafeWrite = true;\n },\n };\n },\n };\n\n const connections = await deps.buildConnections(run, def, hooks);\n const secrets = await deps.resolveSecrets(run, def);\n\n const suspendForRetry = async (delayMs: number, reason: string): Promise<never> => {\n await db.tx(async (c) => {\n await c.query(`UPDATE runs SET status='suspended', wake_at=$2 WHERE id=$1`, [\n runId,\n new Date(Date.now() + delayMs).toISOString(),\n ]);\n await enqueue(c, {\n kind: \"run\",\n payload: { runId },\n runAtMs: Date.now() + delayMs,\n dedupeKey: `run:${runId}`,\n });\n });\n throw new RunSuspended(reason);\n };\n\n const ctx: Ctx<any, any, any, any> = {\n async step<T>(name: string, fn: () => Promise<T> | T, opts?: StepOpts<T>): Promise<T> {\n if (typeof name !== \"string\" || name.length === 0 || name.startsWith(\"$\")) {\n throw new TerminalError(`ctx.step: invalid step name ${JSON.stringify(name)} (\"$\" prefix is reserved)`);\n }\n if (active.getStore()) {\n throw new TerminalError(`ctx.step(\"${name}\") called inside step \"${active.getStore()!.name}\" \u2014 steps do not nest`);\n }\n const occurrence = nextOcc(name);\n const key = `${name}#${occurrence}`;\n const row = journal.get(key);\n\n if (row?.status === \"completed\") {\n const value = decodeJournal(row.result as JsonValue) as T;\n if (opts?.undo) undoStack.push({ name, occurrence, undo: () => opts.undo!(value) });\n return value;\n }\n if (row?.status === \"failed\") {\n // The step already exhausted its attempts in a prior invocation; re-throwing the\n // recorded error keeps author-level try/catch paths deterministic.\n const msg = row.error?.message ?? \"step failed\";\n throw row.error?.name === \"RetryableError\" ? new RetryableError(msg) : new TerminalError(msg);\n }\n\n const policy = resolveRetryPolicy(opts?.retry, defaultRetry);\n const attempts = (row?.attempts ?? 0) + 1;\n if (row) {\n await db.query(`UPDATE run_steps SET attempts=$3, status='running' WHERE run_id=$1 AND name=$2 AND occurrence=$4`, [\n runId,\n name,\n attempts,\n occurrence,\n ]);\n } else {\n await db.query(\n `INSERT INTO run_steps (run_id, name, occurrence, status, attempts, has_undo)\n VALUES ($1,$2,$3,'running',$4,$5)`,\n [runId, name, occurrence, attempts, opts?.undo !== undefined],\n );\n }\n\n const state: ActiveStep = {\n name,\n occurrence,\n idempotencyKey: `${runId}:${name}:${occurrence}`,\n unsafeWrite: false,\n events: [],\n };\n\n try {\n let p = Promise.resolve(active.run(state, () => fn()));\n const timeoutMs = opts?.timeout !== undefined ? parseDuration(opts.timeout, \"step timeout\") : undefined;\n if (timeoutMs !== undefined) {\n let timer: NodeJS.Timeout;\n p = Promise.race([\n p,\n new Promise<never>((_res, reject) => {\n timer = setTimeout(\n () => reject(new RetryableError(`step \"${name}\" timed out after ${opts?.timeout}`)),\n timeoutMs,\n );\n timer.unref?.();\n }),\n ]).finally(() => clearTimeout(timer));\n }\n const result = await p;\n const encoded = encodeJournal(result);\n\n // THE exactly-once-internal checkpoint: result + outbox events + fan-out jobs.\n await db.tx(async (c) => {\n await c.query(\n `UPDATE run_steps SET status='completed', result=$4::jsonb, finished_at=now()\n WHERE run_id=$1 AND name=$2 AND occurrence=$3`,\n [runId, name, occurrence, JSON.stringify(encoded)],\n );\n for (const evt of state.events) {\n const { rows } = await c.query<{ id: string }>(\n `INSERT INTO events (project_id, env, name, payload, emitted_by_run)\n VALUES ($1,$2,$3,$4::jsonb,$5) RETURNING id`,\n [run.project_id, run.env, evt.name, JSON.stringify(evt.payload), runId],\n );\n await enqueue(c, { kind: \"event-fanout\", payload: { eventId: rows[0]!.id } });\n }\n });\n journal.set(key, { name, occurrence, status: \"completed\", attempts, result: encoded, error: null });\n if (opts?.undo) undoStack.push({ name, occurrence, undo: () => opts.undo!(result) });\n return result;\n } catch (err) {\n if (err instanceof RunSuspended) throw err;\n const serialized = serializeError(err);\n const finalize = async () => {\n await db.query(\n `UPDATE run_steps SET status='failed', error=$4::jsonb, finished_at=now()\n WHERE run_id=$1 AND name=$2 AND occurrence=$3`,\n [runId, name, occurrence, JSON.stringify(serialized)],\n );\n journal.set(key, { name, occurrence, status: \"failed\", attempts, result: null, error: serialized as never });\n };\n\n if (isTerminalError(err)) {\n await finalize();\n throw err;\n }\n if (state.unsafeWrite && opts?.retry === undefined) {\n log(\n \"warn\",\n `step \"${name}\" performed a non-retry-safe write and will not auto-retry (ADR-0012) \u2014 pass StepOpts.retry to opt in`,\n undefined,\n name,\n );\n await finalize();\n throw err;\n }\n const delay = nextRetryDelayMs(policy, attempts, isRetryableError(err) ? err.retryAfterMs : undefined);\n if (delay === null) {\n await finalize();\n throw err;\n }\n await db.query(\n `UPDATE run_steps SET error=$4::jsonb WHERE run_id=$1 AND name=$2 AND occurrence=$3`,\n [runId, name, occurrence, JSON.stringify(serialized)],\n );\n log(\"warn\", `step \"${name}\" attempt ${attempts} failed (${(err as Error).message}) \u2014 retrying in ${delay}ms`, undefined, name);\n return suspendForRetry(delay, `retry step ${name}#${occurrence}`);\n }\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 if (active.getStore()) {\n throw new TerminalError(`ctx.sleep cannot be called inside step \"${active.getStore()!.name}\"`);\n }\n const ms = parseDuration(duration, \"ctx.sleep\");\n const occurrence = nextOcc(\"$sleep\");\n const row = journal.get(`$sleep#${occurrence}`);\n if (row?.status === \"completed\") return;\n\n let wakeAtMs: number;\n if (row) {\n wakeAtMs = Date.parse((decodeJournal(row.result as JsonValue) as { wakeAt: string }).wakeAt);\n } else {\n wakeAtMs = Date.now() + ms;\n await db.query(\n `INSERT INTO run_steps (run_id, name, occurrence, status, attempts, result)\n VALUES ($1,'$sleep',$2,'running',1,$3::jsonb)`,\n [runId, occurrence, JSON.stringify(encodeJournal({ wakeAt: new Date(wakeAtMs).toISOString() }))],\n );\n }\n if (wakeAtMs <= Date.now()) {\n await db.query(\n `UPDATE run_steps SET status='completed', finished_at=now() WHERE run_id=$1 AND name='$sleep' AND occurrence=$2`,\n [runId, occurrence],\n );\n journal.set(`$sleep#${occurrence}`, { name: \"$sleep\", occurrence, status: \"completed\", attempts: 1, result: null, error: null });\n return;\n }\n return suspendForRetry(wakeAtMs - Date.now(), `sleep ${duration}`) as Promise<never>;\n },\n\n async waitForSignal<T>(name: string, opts: { schema: Schema<T>; timeout?: string }): Promise<T | null> {\n if (active.getStore()) {\n throw new TerminalError(`ctx.waitForSignal cannot be called inside step \"${active.getStore()!.name}\"`);\n }\n const stepName = `$signal:${name}`;\n const occurrence = nextOcc(stepName);\n const row = journal.get(`${stepName}#${occurrence}`);\n if (row?.status === \"completed\") {\n const stored = decodeJournal(row.result as JsonValue) as { value?: unknown; timedOut?: boolean };\n return stored.timedOut === true ? null : (stored.value as T);\n }\n\n let deadlineMs: number | undefined;\n if (row) {\n const stored = decodeJournal(row.result as JsonValue) as { deadline?: string };\n deadlineMs = stored.deadline !== undefined ? Date.parse(stored.deadline) : undefined;\n } else if (opts.timeout !== undefined) {\n deadlineMs = Date.now() + parseDuration(opts.timeout, \"waitForSignal timeout\");\n }\n\n // Try to consume a delivered signal (exactly-once: consumption + checkpoint in one tx).\n const consumed = await db.tx(async (c) => {\n const { rows } = await c.query<{ id: string; payload: JsonValue }>(\n `SELECT id, payload FROM signals\n WHERE run_id=$1 AND name=$2 AND NOT consumed\n ORDER BY created_at LIMIT 1 FOR UPDATE SKIP LOCKED`,\n [runId, name],\n );\n const sig = rows[0];\n if (!sig) return undefined;\n await c.query(`UPDATE signals SET consumed=true WHERE id=$1`, [sig.id]);\n const resultJson = JSON.stringify(encodeJournal({ value: decodeJournal(sig.payload ?? null) }));\n if (row) {\n await c.query(\n `UPDATE run_steps SET status='completed', result=$4::jsonb, finished_at=now()\n WHERE run_id=$1 AND name=$2 AND occurrence=$3`,\n [runId, stepName, occurrence, resultJson],\n );\n } else {\n await c.query(\n `INSERT INTO run_steps (run_id, name, occurrence, status, attempts, result, finished_at)\n VALUES ($1,$2,$3,'completed',1,$4::jsonb,now())`,\n [runId, stepName, occurrence, resultJson],\n );\n }\n return sig.payload ?? null;\n });\n if (consumed !== undefined) {\n const value = decodeJournal(consumed);\n journal.set(`${stepName}#${occurrence}`, {\n name: stepName,\n occurrence,\n status: \"completed\",\n attempts: 1,\n result: encodeJournal({ value }),\n error: null,\n });\n return validateSchema(opts.schema, value, `signal \"${name}\" payload`);\n }\n\n if (deadlineMs !== undefined && deadlineMs <= Date.now()) {\n const resultJson = JSON.stringify(encodeJournal({ timedOut: true }));\n await db.query(\n row\n ? `UPDATE run_steps SET status='completed', result=$4::jsonb, finished_at=now() WHERE run_id=$1 AND name=$2 AND occurrence=$3`\n : `INSERT INTO run_steps (run_id, name, occurrence, status, attempts, result, finished_at) VALUES ($1,$2,$3,'completed',1,$4::jsonb,now())`,\n [runId, stepName, occurrence, resultJson],\n );\n journal.set(`${stepName}#${occurrence}`, { name: stepName, occurrence, status: \"completed\", attempts: 1, result: { timedOut: true } as never, error: null });\n return null;\n }\n\n if (!row) {\n await db.query(\n `INSERT INTO run_steps (run_id, name, occurrence, status, attempts, result)\n VALUES ($1,$2,$3,'running',1,$4::jsonb)`,\n [\n runId,\n stepName,\n occurrence,\n JSON.stringify(\n encodeJournal(deadlineMs !== undefined ? { deadline: new Date(deadlineMs).toISOString() } : {}),\n ),\n ],\n );\n }\n await db.tx(async (c) => {\n await c.query(`UPDATE runs SET status='suspended', waiting_signal=$2, wake_at=$3 WHERE id=$1`, [\n runId,\n name,\n deadlineMs !== undefined ? new Date(deadlineMs).toISOString() : null,\n ]);\n if (deadlineMs !== undefined) {\n await enqueue(c, { kind: \"run\", payload: { runId }, runAtMs: deadlineMs, dedupeKey: `run:${runId}` });\n }\n });\n throw new RunSuspended(`waitForSignal ${name}`);\n },\n\n async emit<T>(event: EventDefinition<T>, payload: T): Promise<void> {\n const state = active.getStore();\n if (!state) {\n throw new TerminalError(\n `ctx.emit(\"${event.name}\") outside ctx.step \u2014 emitting is a side effect; wrap it (ADR-0002)`,\n );\n }\n const validated = await validateSchema(event.schema, payload, `event \"${event.name}\" payload`);\n state.events.push({ name: event.name, payload: encodeJournal(validated as unknown) });\n },\n\n ...(run.trigger[\"request\"] !== undefined\n ? {\n request: (() => {\n const r = run.trigger[\"request\"] as { headers: Record<string, string>; query: Record<string, string>; rawBodyB64: string };\n return {\n headers: r.headers ?? {},\n query: r.query ?? {},\n rawBody: new Uint8Array(Buffer.from(r.rawBodyB64 ?? \"\", \"base64\")),\n };\n })(),\n }\n : {}),\n\n logger,\n run: { id: runId, attempt, automationId: run.automation_id },\n };\n\n (ctx as { operators: unknown }).operators = buildOperators(def, ctx, async (info) => {\n if (!deps.callModel) throw new TerminalError(`operator.${info.operatorKey}: no model adapter configured`);\n return deps.callModel(run, def, hooks, info);\n });\n (ctx as { harnesses: unknown }).harnesses = buildHarnesses(def, ctx, async (info) => {\n if (!deps.callHarness) throw new TerminalError(`harness.${info.harnessKey}: no Harness adapter configured`);\n return deps.callHarness(run, def, hooks, info);\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 await db.query(`UPDATE runs SET status='completed', output=$2::jsonb, finished_at=now() WHERE id=$1`, [\n runId,\n JSON.stringify(encodeJournal(output)),\n ]);\n return \"completed\";\n } catch (err) {\n if (err instanceof RunSuspended) return \"suspended\";\n\n // Terminal failure \u2192 undo completed steps in reverse, best-effort + durable bookkeeping.\n for (const item of [...undoStack].reverse()) {\n try {\n await item.undo();\n await db.query(`UPDATE run_steps SET undone=true WHERE run_id=$1 AND name=$2 AND occurrence=$3`, [\n runId,\n item.name,\n item.occurrence,\n ]);\n log(\"info\", `undo: reversed step \"${item.name}\"`, undefined, item.name);\n } catch (undoErr) {\n log(\"error\", `undo for step \"${item.name}\" failed: ${(undoErr as Error).message}`, undefined, item.name);\n }\n }\n await db.query(`UPDATE runs SET status='failed', error=$2::jsonb, finished_at=now() WHERE id=$1`, [\n runId,\n JSON.stringify(serializeError(err)),\n ]);\n log(\"error\", `run failed: ${(err as Error).message}`);\n return \"failed\";\n }\n}\n", "// Postgres-as-queue (ADR-0003): SELECT \u2026 FOR UPDATE SKIP LOCKED claims, leases with\n// heartbeat, durable re-enqueue, dedupe-keyed upserts (one pending wake job per run).\n\nimport type { Db, DbClient } from \"../db/db.js\";\n\nexport interface EnqueueOpts {\n kind: string;\n payload: Record<string, unknown>;\n runAtMs?: number | undefined;\n priority?: number | undefined;\n tag?: string | undefined;\n /** Upsert key: an existing ready job with this key has its run_at moved EARLIER. */\n dedupeKey?: string | undefined;\n maxAttempts?: number | undefined;\n}\n\nexport async function enqueue(client: DbClient, opts: EnqueueOpts): Promise<void> {\n const runAt = opts.runAtMs !== undefined ? new Date(opts.runAtMs).toISOString() : new Date().toISOString();\n if (opts.dedupeKey !== undefined) {\n await client.query(\n `INSERT INTO queue_jobs (kind, payload, run_at, priority, tag, dedupe_key, max_attempts)\n VALUES ($1, $2::jsonb, $3, $4, $5, $6, $7)\n ON CONFLICT (dedupe_key) WHERE dedupe_key IS NOT NULL DO UPDATE\n SET run_at = LEAST(queue_jobs.run_at, EXCLUDED.run_at),\n status = 'ready',\n payload = EXCLUDED.payload`,\n [\n opts.kind,\n JSON.stringify(opts.payload),\n runAt,\n opts.priority ?? 0,\n opts.tag ?? null,\n opts.dedupeKey,\n opts.maxAttempts ?? 10,\n ],\n );\n } else {\n await client.query(\n `INSERT INTO queue_jobs (kind, payload, run_at, priority, tag, max_attempts)\n VALUES ($1, $2::jsonb, $3, $4, $5, $6)`,\n [opts.kind, JSON.stringify(opts.payload), runAt, opts.priority ?? 0, opts.tag ?? null, opts.maxAttempts ?? 10],\n );\n }\n}\n\nexport interface ClaimedJob {\n id: string;\n kind: string;\n payload: Record<string, unknown>;\n attempts: number;\n maxAttempts: number;\n}\n\nconst LEASE_SECONDS = 60;\n\n/** Claim one due job (tag/kind-routed when filters are given). Expired leases are reclaimable. */\nexport async function claim(\n db: Db,\n tags?: string[] | undefined,\n kinds?: string[] | undefined,\n): Promise<ClaimedJob | null> {\n return db.tx(async (c) => {\n const params: unknown[] = [];\n const tagFilter = tags && tags.length > 0 ? `AND (tag IS NULL OR tag = ANY($${params.push(tags)}))` : \"\";\n const kindFilter = kinds && kinds.length > 0 ? `AND kind = ANY($${params.push(kinds)})` : \"\";\n const { rows } = await c.query<{\n id: string;\n kind: string;\n payload: Record<string, unknown>;\n attempts: number;\n max_attempts: number;\n }>(\n `SELECT id, kind, payload, attempts, max_attempts FROM queue_jobs\n WHERE status = 'ready'\n AND run_at <= now()\n AND (lease_until IS NULL OR lease_until < now())\n ${tagFilter}\n ${kindFilter}\n ORDER BY priority DESC, run_at\n FOR UPDATE SKIP LOCKED\n LIMIT 1`,\n params,\n );\n const job = rows[0];\n if (!job) return null;\n // dedupe_key is cleared on claim: a suspension that re-arms the same logical wake\n // must insert a FRESH row, not collide with the job currently being executed.\n await c.query(\n `UPDATE queue_jobs\n SET lease_until = now() + interval '${LEASE_SECONDS} seconds',\n attempts = attempts + 1,\n dedupe_key = NULL\n WHERE id = $1`,\n [job.id],\n );\n return {\n id: job.id,\n kind: job.kind,\n payload: job.payload,\n attempts: job.attempts + 1,\n maxAttempts: job.max_attempts,\n };\n });\n}\n\nexport async function heartbeat(db: Db, jobId: string): Promise<void> {\n await db.query(\n `UPDATE queue_jobs SET lease_until = now() + interval '${LEASE_SECONDS} seconds' WHERE id = $1`,\n [jobId],\n );\n}\n\nexport async function complete(db: Db, jobId: string): Promise<void> {\n await db.query(`DELETE FROM queue_jobs WHERE id = $1`, [jobId]);\n}\n\n/** Release after failure: retry with backoff until attempts exhaust \u2192 dead. */\nexport async function fail(db: Db, job: ClaimedJob, error: string): Promise<void> {\n if (job.attempts >= job.maxAttempts) {\n await db.query(\n `UPDATE queue_jobs SET status = 'dead', lease_until = NULL, last_error = $2 WHERE id = $1`,\n [job.id, error.slice(0, 2000)],\n );\n return;\n }\n const delaySeconds = Math.min(60 * 15, 2 ** job.attempts);\n await db.query(\n `UPDATE queue_jobs\n SET lease_until = NULL, last_error = $2, run_at = now() + ($3 || ' seconds')::interval\n WHERE id = $1`,\n [job.id, error.slice(0, 2000), String(delaySeconds)],\n );\n}\n", "// Control-flow signal: thrown to unwind the handler when a run hibernates (sleep,\n// waitForSignal, durable retry). Zero idle cost (ADR-0002): nothing stays in memory \u2014\n// a queue job (or an arriving Signal) re-invokes the handler, and completed steps\n// replay from the journal.\n//\n// Authors: never catch this. `catch (e)` blocks that swallow unknown errors instead of\n// rethrowing will break suspension \u2014 the same caveat every durable runtime carries.\n\nexport class RunSuspended extends Error {\n constructor(readonly reason: string) {\n super(`tesser: run suspended (${reason}) \u2014 do not catch this`);\n this.name = \"TesserRunSuspended\";\n }\n}\n\nexport function isRunSuspended(err: unknown): err is RunSuspended {\n return err instanceof RunSuspended || (err as Error)?.name === \"TesserRunSuspended\";\n}\n", "// Run lifecycle entry points: create-and-enqueue (one tx), signal delivery (wakes the\n// waiting run), cancel.\n\nimport type { JsonValue } from \"@devosurf/tesser-sdk/internal\";\nimport { encodeJournal } from \"@devosurf/tesser-sdk/internal\";\nimport type { Db, DbClient } from \"../db/db.js\";\nimport { enqueue } from \"../queue/queue.js\";\n\nexport interface CreateRunOpts {\n projectId: string;\n automationId: string;\n versionId: string;\n env?: string;\n trigger: { kind: string; [k: string]: unknown };\n input?: unknown;\n /** Cross-trigger dedup (e.g. webhook delivery id): same key \u2192 one run, ever. */\n dedupeKey?: string;\n}\n\nexport async function createRun(dbOrClient: Db | DbClient, opts: CreateRunOpts): Promise<string | null> {\n const exec = async (c: DbClient): Promise<string | null> => {\n const { rows } = await c.query<{ id: string }>(\n `INSERT INTO runs (project_id, automation_id, version_id, env, status, trigger, input)\n VALUES ($1,$2,$3,$4,'queued',$5::jsonb,$6::jsonb)\n RETURNING id`,\n [\n opts.projectId,\n opts.automationId,\n opts.versionId,\n opts.env ?? \"production\",\n JSON.stringify(opts.trigger),\n opts.input === undefined ? null : JSON.stringify(encodeJournal(opts.input)),\n ],\n );\n const runId = rows[0]!.id;\n await enqueue(c, {\n kind: \"run\",\n payload: { runId },\n dedupeKey: `run:${runId}`,\n ...(opts.dedupeKey !== undefined ? {} : {}),\n });\n return runId;\n };\n if (\"tx\" in dbOrClient) return dbOrClient.tx(exec);\n return exec(dbOrClient);\n}\n\nexport interface SignalDelivery {\n runId: string;\n name: string;\n payload?: unknown;\n}\n\n/** Deliver a Signal: exactly-once input for ONE suspended run. Wakes it immediately\n * when it is waiting on this name. Returns false when the run doesn't exist. */\nexport async function deliverSignal(db: Db, sig: SignalDelivery): Promise<boolean> {\n return db.tx(async (c) => {\n const { rows } = await c.query<{ id: string; status: string; waiting_signal: string | null }>(\n `SELECT id, status, waiting_signal FROM runs WHERE id = $1 FOR UPDATE`,\n [sig.runId],\n );\n const run = rows[0];\n if (!run) return false;\n await c.query(`INSERT INTO signals (run_id, name, payload) VALUES ($1,$2,$3::jsonb)`, [\n sig.runId,\n sig.name,\n sig.payload === undefined ? null : JSON.stringify(encodeJournal(sig.payload)),\n ]);\n if (run.status === \"suspended\" && run.waiting_signal === sig.name) {\n await enqueue(c, { kind: \"run\", payload: { runId: sig.runId }, dedupeKey: `run:${sig.runId}` });\n }\n return true;\n });\n}\n\nexport async function cancelRun(db: Db, runId: string, reason: string): Promise<boolean> {\n const { rowCount } = await db.query(\n `UPDATE runs SET status='cancelled', error=$2::jsonb, finished_at=now()\n WHERE id=$1 AND status IN ('queued','suspended')`,\n [runId, JSON.stringify({ name: \"Cancelled\", message: reason } satisfies Record<string, JsonValue>)],\n );\n return rowCount > 0;\n}\n", "// Event fan-out (ADR-0011): an emitted Project-scoped event creates one independent\n// durable run per subscriber. At-least-once delivery; duplicate fan-out job executions\n// are absorbed by a per-(event, automation) existence check.\n\nimport { decodeJournal, type JsonValue } from \"@devosurf/tesser-sdk/internal\";\nimport type { Db } from \"../db/db.js\";\nimport { createRun } from \"../engine/runs.js\";\n\nexport async function fanoutEvent(db: Db, eventId: string): Promise<string[]> {\n const { rows } = await db.query<{\n id: string;\n project_id: string;\n env: string;\n name: string;\n payload: JsonValue | null;\n }>(`SELECT id, project_id, env, name, payload FROM events WHERE id=$1`, [eventId]);\n const event = rows[0];\n if (!event) return [];\n\n const subs = await db.query<{ automation_id: string }>(\n `SELECT automation_id FROM event_subscriptions WHERE project_id=$1 AND env=$2 AND event_name=$3`,\n [event.project_id, event.env, event.name],\n );\n\n const created: string[] = [];\n for (const sub of subs.rows) {\n const runId = await db.tx(async (c) => {\n const existing = await c.query(\n `SELECT 1 FROM runs WHERE automation_id=$1 AND project_id=$2 AND trigger->>'eventId' = $3`,\n [sub.automation_id, event.project_id, event.id],\n );\n if (existing.rows.length > 0) return null;\n\n const alias = await c.query<{ version_id: string }>(\n `SELECT version_id FROM aliases WHERE project_id=$1 AND automation_id=$2 AND env=$3`,\n [event.project_id, sub.automation_id, event.env],\n );\n const versionId = alias.rows[0]?.version_id;\n if (!versionId) return null;\n\n return createRun(c, {\n projectId: event.project_id,\n automationId: sub.automation_id,\n versionId,\n env: event.env,\n trigger: { kind: \"event\", event: event.name, eventId: event.id },\n // stored payload is journal-encoded; createRun re-encodes, so decode here\n input: event.payload === null ? undefined : decodeJournal(event.payload),\n });\n });\n if (runId) created.push(runId);\n }\n return created;\n}\n\n/** Sync a project+env's event subscriptions from promoted manifests. */\nexport async function syncSubscriptions(\n db: Db,\n projectId: string,\n env: string,\n subs: Array<{ eventName: string; automationId: string }>,\n): Promise<void> {\n await db.tx(async (c) => {\n await c.query(`DELETE FROM event_subscriptions WHERE project_id=$1 AND env=$2`, [projectId, env]);\n for (const s of subs) {\n await c.query(\n `INSERT INTO event_subscriptions (project_id, env, event_name, automation_id)\n VALUES ($1,$2,$3,$4) ON CONFLICT DO NOTHING`,\n [projectId, env, s.eventName, s.automationId],\n );\n }\n });\n}\n", "// Assemble the HTTP surface: /api (control plane), connect pages + OAuth callback,\n// trigger ingress, and a minimal index.\n\nimport { Hono } from \"hono\";\nimport { createApi, type ApiDeps } from \"./api.js\";\nimport { createConnectRoutes, type ConnectDeps } from \"./connect.js\";\nimport { createIngress, type IngressDeps } from \"./ingress.js\";\nimport { readinessStatus, RUNTIME_VERSION, type RuntimeStatusDeps } from \"./status.js\";\n\nexport interface HttpDeps extends ApiDeps, ConnectDeps, IngressDeps, RuntimeStatusDeps {}\n\nexport function createApp(deps: HttpDeps): Hono {\n const app = new Hono();\n const version = deps.version ?? RUNTIME_VERSION;\n app.get(\"/\", (c) =>\n c.json({\n service: \"tesser\",\n docs: \"https://github.com/tesser \u2014 self-hosted automation instance\",\n api: \"/api/health\",\n health: \"/healthz\",\n readiness: \"/readyz\",\n }),\n );\n app.get(\"/healthz\", (c) => c.json({ ok: true, service: \"tesser\", version }));\n app.get(\"/readyz\", async (c) => {\n const status = await readinessStatus(deps);\n return c.json(status, status.ok ? 200 : 503);\n });\n app.route(\"/api\", createApi(deps));\n app.route(\"/\", createConnectRoutes(deps));\n app.route(\"/\", createIngress(deps));\n return app;\n}\n", "// Control-plane API (ADR-0007: the CLI is a thin shell over this). JSON in/out,\n// bearer-token auth, deterministic error shapes: { error: { code, message } }.\n\nimport { Hono } from \"hono\";\nimport type { Db } from \"../db/db.js\";\nimport type { Broker } from \"../broker/broker.js\";\nimport {\n computeMissingRequirements,\n connectLinkStatus,\n getConnectLink,\n mintConnectLink,\n} from \"../broker/connect.js\";\nimport { createRun, deliverSignal, cancelRun } from \"../engine/runs.js\";\nimport { enqueue } from \"../queue/queue.js\";\nimport { mintToken, verifyToken } from \"./tokens.js\";\nimport { runtimeStatus, type RuntimeStatusDeps } from \"./status.js\";\nimport {\n generateDeployKeyPair,\n hashWebhookSetupToken,\n mintWebhookSetupToken,\n mintWebhookSigningSecret,\n} from \"../gitsync/deploy-keys.js\";\n\nexport interface ApiEnv {\n Variables: { workspaceId: string };\n}\n\nexport interface ApiDeps extends RuntimeStatusDeps {\n broker: Broker;\n /** Filled by git-sync (task: reconciler); returns latest deploy state for a project. */\n deployStatus?: (projectId: string, env: string) => Promise<unknown>;\n}\n\nconst err = (code: string, message: string) => ({ error: { code, message } });\n\ntype ProjectBootstrap = {\n deployKeyPublic: string;\n webhookSetupUrl: string;\n};\n\nasync function ensureProjectBootstrap(deps: ApiDeps, workspaceId: string, projectId: string): Promise<ProjectBootstrap> {\n const { rows } = await deps.db.query<{\n deploy_key_public: string | null;\n deploy_key_private_cipher: string | null;\n push_webhook_secret_cipher: string | null;\n }>(\n `SELECT deploy_key_public, deploy_key_private_cipher, push_webhook_secret_cipher FROM projects WHERE id=$1 AND workspace_id=$2`,\n [projectId, workspaceId],\n );\n const project = rows[0];\n if (!project) throw new Error(`project ${projectId} not found`);\n\n let deployKeyPublic = project.deploy_key_public;\n let deployPrivateCipher = project.deploy_key_private_cipher;\n if (!deployKeyPublic || !deployPrivateCipher) {\n const key = generateDeployKeyPair();\n deployKeyPublic = key.publicKey;\n deployPrivateCipher = await deps.broker.encryptValue(workspaceId, key.privateKey, \"deploykey\");\n }\n\n let pushWebhookSecretCipher = project.push_webhook_secret_cipher;\n if (!pushWebhookSecretCipher) {\n pushWebhookSecretCipher = await deps.broker.encryptValue(workspaceId, mintWebhookSigningSecret(), \"project.webhook.signing\");\n }\n\n const setupToken = mintWebhookSetupToken();\n await deps.db.query(\n `UPDATE projects\n SET deploy_key_public=$3,\n deploy_key_private_cipher=$4,\n push_webhook_secret_cipher=$5,\n push_webhook_setup_token_hash=$6\n WHERE id=$1 AND workspace_id=$2`,\n [projectId, workspaceId, deployKeyPublic, deployPrivateCipher, pushWebhookSecretCipher, hashWebhookSetupToken(setupToken)],\n );\n\n return {\n deployKeyPublic,\n webhookSetupUrl: `${deps.baseUrl.replace(/\\/$/, \"\")}/setup/git/${setupToken}`,\n };\n}\n\nexport function createApi(deps: ApiDeps): Hono<ApiEnv> {\n const api = new Hono<ApiEnv>();\n\n api.use(\"*\", async (c, next) => {\n const header = c.req.header(\"authorization\") ?? \"\";\n const token = header.startsWith(\"Bearer \") ? header.slice(7) : \"\";\n const auth = token ? await verifyToken(deps.db, token) : null;\n if (!auth) return c.json(err(\"unauthorized\", \"missing or invalid bearer token\"), 401);\n c.set(\"workspaceId\", auth.workspaceId);\n await next();\n return;\n });\n\n api.get(\"/health\", (c) => c.json({ ok: true }));\n api.get(\"/status\", async (c) => c.json(await runtimeStatus(deps, c.get(\"workspaceId\"))));\n\n // ---- projects ----\n\n api.post(\"/projects\", async (c) => {\n const body = (await c.req.json().catch(() => ({}))) as { name?: string; repoUrl?: string; prodBranch?: string };\n if (!body.name || !/^[a-z][a-z0-9-]{0,63}$/.test(body.name)) {\n return c.json(err(\"invalid\", \"project name must be kebab-case\"), 400);\n }\n const { rows } = await deps.db.query<{ id: string }>(\n `INSERT INTO projects (workspace_id, name, repo_url, prod_branch)\n VALUES ($1,$2,$3,$4)\n ON CONFLICT (workspace_id, name) DO UPDATE SET repo_url = COALESCE(EXCLUDED.repo_url, projects.repo_url)\n RETURNING id`,\n [c.get(\"workspaceId\"), body.name, body.repoUrl ?? null, body.prodBranch ?? \"main\"],\n );\n const projectId = rows[0]!.id;\n await deps.db.query(\n `INSERT INTO repo_state (project_id) VALUES ($1) ON CONFLICT (project_id) DO NOTHING`,\n [projectId],\n );\n const bootstrap = await ensureProjectBootstrap(deps, c.get(\"workspaceId\"), projectId);\n return c.json({ id: projectId, name: body.name, ...bootstrap });\n });\n\n api.get(\"/projects\", async (c) => {\n const { rows } = await deps.db.query(\n `SELECT p.id, p.name, p.repo_url, p.prod_branch, r.last_sha, r.status AS sync_status, r.last_synced_at\n FROM projects p LEFT JOIN repo_state r ON r.project_id = p.id\n WHERE p.workspace_id = $1 ORDER BY p.name`,\n [c.get(\"workspaceId\")],\n );\n return c.json({ projects: rows });\n });\n\n const findProject = async (workspaceId: string, name: string) => {\n const { rows } = await deps.db.query<{ id: string; name: string; repo_url: string | null; prod_branch: string }>(\n `SELECT id, name, repo_url, prod_branch FROM projects WHERE workspace_id=$1 AND name=$2`,\n [workspaceId, name],\n );\n return rows[0] ?? null;\n };\n\n api.post(\"/projects/:name/sync\", async (c) => {\n const project = await findProject(c.get(\"workspaceId\"), c.req.param(\"name\"));\n if (!project) return c.json(err(\"not-found\", \"no such project\"), 404);\n const body = (await c.req.json().catch(() => ({}))) as { ref?: string; localPath?: string };\n await deps.db.tx((t) =>\n enqueue(t, {\n kind: \"reconcile\",\n payload: {\n projectId: project.id,\n ...(body.ref !== undefined ? { ref: body.ref } : {}),\n ...(body.localPath !== undefined ? { localPath: body.localPath } : {}),\n },\n dedupeKey: `reconcile:${project.id}:${body.ref ?? \"default\"}`,\n maxAttempts: 1,\n }),\n );\n return c.json({ queued: true });\n });\n\n api.get(\"/projects/:name/deploys/latest\", async (c) => {\n const project = await findProject(c.get(\"workspaceId\"), c.req.param(\"name\"));\n if (!project) return c.json(err(\"not-found\", \"no such project\"), 404);\n const env = c.req.query(\"env\") ?? \"production\";\n if (deps.deployStatus) {\n return c.json((await deps.deployStatus(project.id, env)) as Record<string, unknown>);\n }\n const { rows } = await deps.db.query(\n `SELECT status, error, last_sha, last_synced_at FROM repo_state WHERE project_id=$1`,\n [project.id],\n );\n return c.json({ repo: rows[0] ?? null });\n });\n\n api.get(\"/projects/:name/automations\", async (c) => {\n const project = await findProject(c.get(\"workspaceId\"), c.req.param(\"name\"));\n if (!project) return c.json(err(\"not-found\", \"no such project\"), 404);\n const { rows } = await deps.db.query(\n `SELECT a.automation_id, a.env, v.version, v.git_sha, v.status, v.created_at, v.manifest\n FROM aliases a JOIN automation_versions v ON v.id = a.version_id\n WHERE a.project_id = $1 ORDER BY a.automation_id, a.env`,\n [project.id],\n );\n return c.json({ automations: rows });\n });\n\n api.post(\"/projects/:name/rollback\", async (c) => {\n const project = await findProject(c.get(\"workspaceId\"), c.req.param(\"name\"));\n if (!project) return c.json(err(\"not-found\", \"no such project\"), 404);\n const body = (await c.req.json().catch(() => ({}))) as { automation?: string; toVersion?: number; env?: string };\n if (!body.automation || typeof body.toVersion !== \"number\") {\n return c.json(err(\"invalid\", \"need { automation, toVersion }\"), 400);\n }\n const env = body.env ?? \"production\";\n const { rows } = await deps.db.query<{ id: string }>(\n `SELECT id FROM automation_versions WHERE project_id=$1 AND automation_id=$2 AND version=$3`,\n [project.id, body.automation, body.toVersion],\n );\n if (!rows[0]) return c.json(err(\"not-found\", \"no such version\"), 404);\n const { rowCount } = await deps.db.query(\n `UPDATE aliases SET version_id=$4, updated_at=now()\n WHERE project_id=$1 AND automation_id=$2 AND env=$3`,\n [project.id, body.automation, env, rows[0].id],\n );\n if (rowCount === 0) return c.json(err(\"not-found\", \"automation has no live alias in this env\"), 404);\n return c.json({ rolledBack: true, automation: body.automation, env, toVersion: body.toVersion });\n });\n\n // ---- runs ----\n\n api.post(\"/runs\", async (c) => {\n const body = (await c.req.json().catch(() => ({}))) as {\n project?: string;\n automation?: string;\n input?: unknown;\n env?: string;\n };\n if (!body.project || !body.automation) return c.json(err(\"invalid\", \"need { project, automation }\"), 400);\n const project = await findProject(c.get(\"workspaceId\"), body.project);\n if (!project) return c.json(err(\"not-found\", \"no such project\"), 404);\n const env = body.env ?? \"production\";\n const { rows } = await deps.db.query<{ version_id: string }>(\n `SELECT version_id FROM aliases WHERE project_id=$1 AND automation_id=$2 AND env=$3`,\n [project.id, body.automation, env],\n );\n if (!rows[0]) return c.json(err(\"not-found\", `automation \"${body.automation}\" has no live version in ${env}`), 404);\n const runId = await createRun(deps.db, {\n projectId: project.id,\n automationId: body.automation,\n versionId: rows[0].version_id,\n env,\n trigger: { kind: \"manual\" },\n ...(body.input !== undefined ? { input: body.input } : {}),\n });\n return c.json({ runId }, 202);\n });\n\n api.get(\"/runs\", async (c) => {\n const limit = Math.min(Number(c.req.query(\"limit\") ?? 50), 200);\n const params: unknown[] = [c.get(\"workspaceId\")];\n let filter = \"\";\n if (c.req.query(\"project\")) {\n params.push(c.req.query(\"project\"));\n filter += ` AND p.name = $${params.length}`;\n }\n if (c.req.query(\"automation\")) {\n params.push(c.req.query(\"automation\"));\n filter += ` AND r.automation_id = $${params.length}`;\n }\n if (c.req.query(\"status\")) {\n params.push(c.req.query(\"status\"));\n filter += ` AND r.status = $${params.length}`;\n }\n params.push(limit);\n const { rows } = await deps.db.query(\n `SELECT r.id, p.name AS project, r.automation_id, r.env, r.status, r.attempt,\n r.trigger->>'kind' AS trigger_kind, r.created_at, r.started_at, r.finished_at\n FROM runs r JOIN projects p ON p.id = r.project_id\n WHERE p.workspace_id = $1 ${filter}\n ORDER BY r.created_at DESC LIMIT $${params.length}`,\n params,\n );\n return c.json({ runs: rows });\n });\n\n api.get(\"/runs/:id\", async (c) => {\n const { rows } = await deps.db.query(\n `SELECT r.*, p.name AS project FROM runs r JOIN projects p ON p.id = r.project_id\n WHERE r.id = $1 AND p.workspace_id = $2`,\n [c.req.param(\"id\"), c.get(\"workspaceId\")],\n );\n if (!rows[0]) return c.json(err(\"not-found\", \"no such run\"), 404);\n const steps = await deps.db.query(\n `SELECT name, occurrence, status, attempts, result, error, undone, started_at, finished_at\n FROM run_steps WHERE run_id = $1 ORDER BY started_at, occurrence`,\n [c.req.param(\"id\")],\n );\n const logs = await deps.db.query(\n `SELECT step, level, msg, meta, created_at FROM run_logs WHERE run_id = $1 ORDER BY id LIMIT 500`,\n [c.req.param(\"id\")],\n );\n return c.json({ run: rows[0], steps: steps.rows, logs: logs.rows });\n });\n\n api.get(\"/runs/:id/replay\", async (c) => {\n const { rows } = await deps.db.query(\n `SELECT r.id, r.automation_id, r.env, r.trigger, r.input, r.output, r.status, r.error\n FROM runs r JOIN projects p ON p.id = r.project_id\n WHERE r.id = $1 AND p.workspace_id = $2`,\n [c.req.param(\"id\"), c.get(\"workspaceId\")],\n );\n if (!rows[0]) return c.json(err(\"not-found\", \"no such run\"), 404);\n const steps = await deps.db.query(\n `SELECT name, occurrence, status, attempts, result, error FROM run_steps WHERE run_id=$1 ORDER BY started_at, occurrence`,\n [c.req.param(\"id\")],\n );\n return c.json({ replay: { ...rows[0], journal: steps.rows } });\n });\n\n api.post(\"/runs/:id/signals/:name\", async (c) => {\n const body = (await c.req.json().catch(() => ({}))) as { payload?: unknown };\n const ok = await deliverSignal(deps.db, {\n runId: c.req.param(\"id\"),\n name: c.req.param(\"name\"),\n payload: body.payload,\n });\n if (!ok) return c.json(err(\"not-found\", \"no such run\"), 404);\n return c.json({ delivered: true });\n });\n\n api.post(\"/runs/:id/cancel\", async (c) => {\n const ok = await cancelRun(deps.db, c.req.param(\"id\"), \"cancelled via API\");\n return c.json({ cancelled: ok });\n });\n\n // ---- connections & secrets (agent lane: names/status only \u2014 never values) ----\n\n api.get(\"/connections\", async (c) => {\n return c.json({ connections: await deps.broker.listConnections(c.get(\"workspaceId\")) });\n });\n\n api.get(\"/secrets\", async (c) => {\n return c.json({ secrets: await deps.broker.listSecretNames(c.get(\"workspaceId\")) });\n });\n\n // The piped human/CI lane (`tesser secrets set NAME --value-stdin`): value travels\n // request-body \u2192 TLS \u2192 encrypted store; it is never echoed back.\n api.put(\"/secrets/:name\", async (c) => {\n const name = c.req.param(\"name\");\n if (!/^[a-zA-Z][a-zA-Z0-9_-]{0,127}$/.test(name)) return c.json(err(\"invalid\", \"bad secret name\"), 400);\n const body = (await c.req.json().catch(() => ({}))) as { value?: string };\n if (typeof body.value !== \"string\" || body.value.length === 0) {\n return c.json(err(\"invalid\", \"need { value }\"), 400);\n }\n await deps.broker.setSecret(c.get(\"workspaceId\"), name, body.value);\n return c.json({ set: name });\n });\n\n api.delete(\"/secrets/:name\", async (c) => {\n const ok = await deps.broker.deleteSecret(c.get(\"workspaceId\"), c.req.param(\"name\"));\n return c.json({ deleted: ok });\n });\n\n // ---- connect links ----\n\n api.post(\"/connect-links\", async (c) => {\n const body = (await c.req.json().catch(() => ({}))) as {\n project?: string;\n env?: string;\n };\n let projectId: string | undefined;\n let requirements: import(\"../broker/connect.js\").Requirement[] = [];\n if (body.project) {\n const project = await findProject(c.get(\"workspaceId\"), body.project);\n if (!project) return c.json(err(\"not-found\", \"no such project\"), 404);\n projectId = project.id;\n const env = body.env ?? \"production\";\n const versions = await deps.db.query<{ manifest: { connections?: never; secrets?: never; id: string }; automation_id: string }>(\n `SELECT v.manifest, a.automation_id FROM aliases a JOIN automation_versions v ON v.id=a.version_id\n WHERE a.project_id=$1 AND a.env=$2`,\n [project.id, env],\n );\n const staged = await deps.db.query<{ manifest: never; automation_id: string }>(\n `SELECT DISTINCT ON (automation_id) manifest, automation_id FROM automation_versions\n WHERE project_id=$1 AND status='staged' ORDER BY automation_id, version DESC`,\n [project.id],\n );\n const sources = [...versions.rows, ...staged.rows].map((r) => {\n const m = r.manifest as { connections?: Record<string, { connector: string; scope: \"workspace\" | \"per_user\" }>; secrets?: Record<string, { describe?: string }> };\n return { automationId: r.automation_id, connections: m.connections ?? {}, secrets: m.secrets ?? {} };\n });\n const connectorManifests = await collectConnectorManifests(deps.db, project.id);\n requirements = await computeMissingRequirements({\n db: deps.db,\n broker: deps.broker,\n workspaceId: c.get(\"workspaceId\"),\n projectId: project.id,\n env,\n automations: sources,\n connectorManifests,\n });\n }\n if (requirements.length === 0) return c.json({ url: null, requirements: [] });\n const token = await mintConnectLink({\n db: deps.db,\n workspaceId: c.get(\"workspaceId\"),\n projectId,\n requirements,\n });\n return c.json({ url: `${deps.baseUrl}/connect/${token}`, token, requirements });\n });\n\n api.get(\"/connect-links/:token/status\", async (c) => {\n const link = await getConnectLink(deps.db, c.req.param(\"token\"));\n if (!link || link.workspace_id !== c.get(\"workspaceId\")) return c.json(err(\"not-found\", \"no such link\"), 404);\n const status = await connectLinkStatus(deps.db, deps.broker, link);\n return c.json(status);\n });\n\n // ---- tokens ----\n\n api.post(\"/tokens\", async (c) => {\n const body = (await c.req.json().catch(() => ({}))) as { name?: string };\n const token = await mintToken(deps.db, c.get(\"workspaceId\"), body.name ?? \"cli\");\n return c.json({ token });\n });\n\n return api;\n}\n\n/** Connector manifests embedded in this project's built versions (per-project facts). */\nexport async function collectConnectorManifests(\n db: Db,\n projectId: string,\n): Promise<Record<string, import(\"@devosurf/tesser-sdk/internal\").ConnectorManifest>> {\n const { rows } = await db.query<{ manifest: { connectors?: Record<string, never> } }>(\n `SELECT manifest FROM automation_versions WHERE project_id=$1 ORDER BY created_at DESC LIMIT 50`,\n [projectId],\n );\n const out: Record<string, never> = {};\n for (const row of rows) {\n for (const [id, m] of Object.entries(row.manifest?.connectors ?? {})) {\n if (!(id in out)) out[id as never] = m;\n }\n }\n return out;\n}\n", "// The credential handoff (ADR-0005): deploy halts on missing requirements; the server\n// mints a short-lived single-use connect link; a human completes OAuth / pastes values\n// in their browser; the agent only ever polls a status.\n\nimport { randomBytes } from \"node:crypto\";\nimport type { ConnectorManifest } from \"@devosurf/tesser-sdk/internal\";\nimport type { ProviderFacts } from \"@devosurf/tesser-sdk/connector\";\nimport type { Db } from \"../db/db.js\";\nimport type { Broker } from \"./broker.js\";\n\nexport interface ConnectionRequirement {\n type: \"connection\";\n key: string;\n connector: string;\n scope: \"workspace\" | \"per_user\";\n /** Auth modes the human can choose between (from the connector manifest). */\n modes: Array<{\n name: string;\n kind: \"oauth2\" | \"apiKey\" | \"basic\" | \"custom\";\n describe?: string;\n /** Paste-field names for non-OAuth modes. */\n fields: string[];\n scopes?: string[];\n }>;\n provider?: string;\n providerFacts?: ProviderFacts;\n automations: string[];\n}\n\nexport interface SecretRequirement {\n type: \"secret\";\n name: string;\n describe?: string;\n automations: string[];\n}\n\nexport interface ManualWebhookRequirement {\n type: \"webhook-manual\";\n registrationId: string;\n connector: string;\n trigger: string;\n automation: string;\n instructions: string;\n url: string;\n}\n\nexport type Requirement = ConnectionRequirement | SecretRequirement | ManualWebhookRequirement;\n\nexport interface AutomationRequirementSource {\n automationId: string;\n connections: Record<string, { connector: string; scope: \"workspace\" | \"per_user\" }>;\n secrets: Record<string, { describe?: string }>;\n}\n\nfunction fieldsFor(kind: string, declared?: string[]): string[] {\n switch (kind) {\n case \"apiKey\":\n return [\"api_key\"];\n case \"basic\":\n return [\"username\", \"password\"];\n case \"custom\":\n return declared ?? [];\n default:\n return [];\n }\n}\n\n/** Compute what is still missing for a set of automations (deploy-halt gate). */\nexport async function computeMissingRequirements(opts: {\n db: Db;\n broker: Broker;\n workspaceId: string;\n projectId: string;\n env: string;\n automations: AutomationRequirementSource[];\n connectorManifests: Record<string, ConnectorManifest & { providerFacts?: ProviderFacts }>;\n}): Promise<Requirement[]> {\n const connReqs = new Map<string, ConnectionRequirement>();\n const secretReqs = new Map<string, SecretRequirement>();\n\n for (const auto of opts.automations) {\n for (const [key, decl] of Object.entries(auto.connections)) {\n let satisfied = false;\n if (decl.scope === \"per_user\") {\n // Deploy-time validation cannot know every future end user. For per-user\n // requirements, the production gate only proves that this Instance has at\n // least one non-null end-user Connection for the Connector; runtime still\n // resolves the exact endUserId and fails closed for unknown users.\n const { rows } = await opts.db.query(\n `SELECT 1 FROM connections\n WHERE workspace_id=$1 AND connector_id=$2 AND status='ready' AND scope='per_user' AND end_user_id IS NOT NULL\n LIMIT 1`,\n [opts.workspaceId, decl.connector],\n );\n satisfied = rows.length > 0;\n } else {\n const resolved = await opts.broker.resolveBinding({\n workspaceId: opts.workspaceId,\n projectId: opts.projectId,\n automationId: auto.automationId,\n env: opts.env,\n reqKey: key,\n connectorId: decl.connector,\n scope: decl.scope,\n });\n satisfied = resolved !== null;\n }\n if (satisfied) continue;\n const manifest = opts.connectorManifests[decl.connector];\n const id = `${decl.connector}:${decl.scope}`;\n const existing = connReqs.get(id);\n if (existing) {\n if (!existing.automations.includes(auto.automationId)) existing.automations.push(auto.automationId);\n continue;\n }\n const modes = Object.entries(manifest?.auth ?? { default: { kind: \"apiKey\" as const, in: \"header\", name: \"Authorization\" } }).map(\n ([name, decl2]) => ({\n name,\n kind: decl2.kind as ConnectionRequirement[\"modes\"][number][\"kind\"],\n fields: fieldsFor(decl2.kind, (decl2 as { fields?: string[] }).fields),\n ...(\"describe\" in decl2 && decl2.describe !== undefined ? { describe: decl2.describe } : {}),\n ...(decl2.kind === \"oauth2\" && \"scopes\" in decl2 ? { scopes: decl2.scopes } : {}),\n }),\n );\n connReqs.set(id, {\n type: \"connection\",\n key,\n connector: decl.connector,\n scope: decl.scope,\n modes,\n ...(manifest?.provider !== undefined ? { provider: manifest.provider } : {}),\n ...(manifest?.providerFacts !== undefined ? { providerFacts: manifest.providerFacts } : {}),\n automations: [auto.automationId],\n });\n }\n for (const [name, decl] of Object.entries(auto.secrets)) {\n const value = await opts.broker.getSecretValue(opts.workspaceId, name);\n if (value !== null) continue;\n const existing = secretReqs.get(name);\n if (existing) {\n if (!existing.automations.includes(auto.automationId)) existing.automations.push(auto.automationId);\n continue;\n }\n secretReqs.set(name, {\n type: \"secret\",\n name,\n ...(decl.describe !== undefined ? { describe: decl.describe } : {}),\n automations: [auto.automationId],\n });\n }\n }\n return [...connReqs.values(), ...secretReqs.values()];\n}\n\nexport async function mintConnectLink(opts: {\n db: Db;\n workspaceId: string;\n projectId?: string | undefined;\n requirements: Requirement[];\n ttlMs?: number;\n}): Promise<string> {\n const token = `cl_${randomBytes(18).toString(\"hex\")}`;\n await opts.db.query(\n `INSERT INTO connect_links (token, workspace_id, project_id, requirements, expires_at)\n VALUES ($1,$2,$3,$4::jsonb, now() + ($5 || ' milliseconds')::interval)`,\n [token, opts.workspaceId, opts.projectId ?? null, JSON.stringify(opts.requirements), String(opts.ttlMs ?? 24 * 3600 * 1000)],\n );\n return token;\n}\n\nexport interface ConnectLinkRow {\n token: string;\n workspace_id: string;\n project_id: string | null;\n requirements: Requirement[];\n status: string;\n expires_at: string;\n}\n\nexport async function getConnectLink(db: Db, token: string): Promise<ConnectLinkRow | null> {\n const { rows } = await db.query<ConnectLinkRow>(`SELECT * FROM connect_links WHERE token=$1`, [token]);\n const link = rows[0];\n if (!link) return null;\n if (link.status === \"pending\" && new Date(String(link.expires_at)).getTime() < Date.now()) {\n await db.query(`UPDATE connect_links SET status='expired' WHERE token=$1`, [token]);\n link.status = \"expired\";\n }\n return link;\n}\n\n/** Per-requirement satisfaction + link completion. */\nexport async function connectLinkStatus(\n db: Db,\n broker: Broker,\n link: ConnectLinkRow,\n): Promise<{ status: string; requirements: Array<{ requirement: Requirement; satisfied: boolean }> }> {\n const detail: Array<{ requirement: Requirement; satisfied: boolean }> = [];\n for (const req of link.requirements) {\n let satisfied = false;\n if (req.type === \"connection\") {\n const scopeFilter = req.scope === \"per_user\" ? `AND scope='per_user' AND end_user_id IS NOT NULL` : `AND scope='workspace'`;\n const { rows } = await db.query(\n `SELECT 1 FROM connections WHERE workspace_id=$1 AND connector_id=$2 AND status='ready' ${scopeFilter} LIMIT 1`,\n [link.workspace_id, req.connector],\n );\n satisfied = rows.length > 0;\n } else if (req.type === \"secret\") {\n satisfied = (await broker.getSecretValue(link.workspace_id, req.name)) !== null;\n } else {\n const { rows } = await db.query<{ status: string }>(\n `SELECT status FROM webhook_registrations WHERE id=$1`,\n [req.registrationId],\n );\n satisfied = rows[0]?.status === \"registered\";\n }\n detail.push({ requirement: req, satisfied });\n }\n const allSatisfied = detail.every((d) => d.satisfied);\n if (allSatisfied && link.status === \"pending\") {\n await db.query(`UPDATE connect_links SET status='completed', completed_at=now() WHERE token=$1`, [link.token]);\n link.status = \"completed\";\n }\n return { status: link.status, requirements: detail };\n}\n", "// API tokens: sha256-at-rest, shown once at mint. The first boot prints an admin token;\n// further tokens are minted via the API (CLI: `tesser login --token` / TESSER_TOKEN env).\n\nimport { createHash, randomBytes } from \"node:crypto\";\nimport type { Db } from \"../db/db.js\";\n\nexport function hashToken(token: string): string {\n return createHash(\"sha256\").update(token).digest(\"hex\");\n}\n\nexport async function mintToken(db: Db, workspaceId: string, name: string): Promise<string> {\n const token = `tsk_${randomBytes(24).toString(\"hex\")}`;\n await db.query(`INSERT INTO api_tokens (workspace_id, name, token_hash) VALUES ($1,$2,$3)`, [\n workspaceId,\n name,\n hashToken(token),\n ]);\n return token;\n}\n\nexport async function verifyToken(db: Db, token: string): Promise<{ workspaceId: string } | null> {\n if (!token.startsWith(\"tsk_\")) return null;\n const { rows } = await db.query<{ workspace_id: string; id: string }>(\n `SELECT id, workspace_id FROM api_tokens WHERE token_hash = $1`,\n [hashToken(token)],\n );\n if (!rows[0]) return null;\n void db.query(`UPDATE api_tokens SET last_used_at = now() WHERE id = $1`, [rows[0].id]).catch(() => {});\n return { workspaceId: rows[0].workspace_id };\n}\n\nexport async function ensureAdminToken(db: Db, workspaceId: string): Promise<string | null> {\n const { rows } = await db.query(`SELECT 1 FROM api_tokens WHERE workspace_id = $1 LIMIT 1`, [workspaceId]);\n if (rows.length > 0) return null;\n // `tesser dev` hands its spawned instance a known token (process boundary \u2014 the\n // Apache CLI never links this AGPL code).\n const preset = process.env[\"TESSER_BOOTSTRAP_TOKEN\"];\n if (preset && preset.startsWith(\"tsk_\")) {\n await db.query(`INSERT INTO api_tokens (workspace_id, name, token_hash) VALUES ($1,'bootstrap',$2)`, [\n workspaceId,\n hashToken(preset),\n ]);\n return preset;\n }\n return mintToken(db, workspaceId, \"admin (first boot)\");\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Db } from \"../db/db.js\";\nimport { migrations } from \"../db/migrations.js\";\nimport type { ServerConfig } from \"../config.js\";\n\nexport const RUNTIME_VERSION = readRuntimeVersion();\n\nfunction readRuntimeVersion(): string {\n for (const rel of [\"../package.json\", \"../../package.json\"]) {\n try {\n const pkg = JSON.parse(readFileSync(new URL(rel, import.meta.url), \"utf8\")) as { version?: unknown };\n if (typeof pkg.version === \"string\") return pkg.version;\n } catch {\n // Try the next runtime layout: source TS vs bundled dist.\n }\n }\n return \"0.0.0\";\n}\n\nexport interface RuntimeStatusDeps {\n db: Db;\n baseUrl: string;\n dataDir: string;\n roles: ServerConfig[\"roles\"];\n version?: string;\n}\n\nexport interface ReadinessStatus {\n ok: boolean;\n service: \"tesser\";\n version: string;\n checks: {\n database: { ok: boolean; kind: Db[\"kind\"]; reachable: boolean; message?: string };\n migrations: { ok: boolean; current: boolean; applied: string[]; pending: string[]; message?: string };\n dataDir: { ok: boolean; writable: boolean; message?: string };\n };\n}\n\nexport async function readinessStatus(deps: RuntimeStatusDeps): Promise<ReadinessStatus> {\n const database: ReadinessStatus[\"checks\"][\"database\"] = { ok: false, kind: deps.db.kind, reachable: false };\n const migrationsCheck: ReadinessStatus[\"checks\"][\"migrations\"] = {\n ok: false,\n current: false,\n applied: [],\n pending: migrations.map((m) => m.id),\n };\n\n try {\n await deps.db.query(`SELECT 1 AS ok`);\n database.ok = true;\n database.reachable = true;\n } catch {\n database.message = \"database query failed\";\n }\n\n if (database.reachable) {\n try {\n const { rows } = await deps.db.query<{ id: string }>(`SELECT id FROM schema_migrations ORDER BY id`);\n const applied = rows.map((r) => r.id);\n const appliedSet = new Set(applied);\n const pending = migrations.map((m) => m.id).filter((id) => !appliedSet.has(id));\n migrationsCheck.applied = applied;\n migrationsCheck.pending = pending;\n migrationsCheck.current = pending.length === 0;\n migrationsCheck.ok = migrationsCheck.current;\n } catch {\n migrationsCheck.message = \"schema_migrations check failed\";\n }\n }\n\n const dataDir = checkWritableDir(deps.dataDir);\n return {\n ok: database.ok && migrationsCheck.ok && dataDir.ok,\n service: \"tesser\",\n version: deps.version ?? RUNTIME_VERSION,\n checks: { database, migrations: migrationsCheck, dataDir },\n };\n}\n\nexport async function runtimeStatus(deps: RuntimeStatusDeps, workspaceId: string): Promise<Record<string, unknown>> {\n const readiness = await readinessStatus(deps);\n const queue = await queueStatus(deps.db);\n const deployments = await deploymentStatus(deps.db, workspaceId);\n const haltedCredentials = deployments.projects.filter((p) => p.status === \"halted-credentials\");\n const degraded = queue.dead > 0 || (deployments.byStatus[\"failed\"] ?? 0) > 0 || haltedCredentials.length > 0;\n\n return {\n ok: readiness.ok,\n degraded,\n service: \"tesser\",\n version: deps.version ?? RUNTIME_VERSION,\n booted: true,\n baseUrl: deps.baseUrl,\n roles: deps.roles,\n readiness,\n queue,\n deployments,\n haltedCredentials: {\n count: haltedCredentials.length,\n projects: haltedCredentials.map((p) => ({\n name: p.name,\n requirements: p.requirements,\n lastSyncedAt: p.lastSyncedAt,\n })),\n },\n };\n}\n\nfunction checkWritableDir(dataDir: string): { ok: boolean; writable: boolean; message?: string } {\n const probe = join(dataDir, `.tesser-write-probe-${randomUUID()}`);\n try {\n writeFileSync(probe, \"ok\", { flag: \"wx\" });\n rmSync(probe, { force: true });\n return { ok: true, writable: true };\n } catch {\n return { ok: false, writable: false, message: \"data directory is not writable\" };\n }\n}\n\nasync function queueStatus(db: Db): Promise<{ ready: number; leased: number; dead: number }> {\n const { rows } = await db.query<{ ready: string; leased: string; dead: string }>(\n `SELECT\n SUM(CASE WHEN status = 'ready' AND lease_until IS NULL THEN 1 ELSE 0 END)::text AS ready,\n SUM(CASE WHEN status = 'ready' AND lease_until IS NOT NULL THEN 1 ELSE 0 END)::text AS leased,\n SUM(CASE WHEN status = 'dead' THEN 1 ELSE 0 END)::text AS dead\n FROM queue_jobs`,\n );\n const row = rows[0] ?? { ready: \"0\", leased: \"0\", dead: \"0\" };\n return { ready: Number(row.ready), leased: Number(row.leased), dead: Number(row.dead) };\n}\n\nasync function deploymentStatus(\n db: Db,\n workspaceId: string,\n): Promise<{ byStatus: Record<string, number>; projects: Array<{ name: string; status: string; lastSha: string | null; lastSyncedAt: string | null; requirements: number }> }> {\n const { rows } = await db.query<{\n name: string;\n status: string | null;\n last_sha: string | null;\n last_synced_at: string | null;\n report: unknown;\n }>(\n `SELECT p.name, r.status, r.last_sha, r.last_synced_at, r.report\n FROM projects p LEFT JOIN repo_state r ON r.project_id = p.id\n WHERE p.workspace_id = $1\n ORDER BY p.name`,\n [workspaceId],\n );\n const byStatus: Record<string, number> = {};\n const projects = rows.map((row) => {\n const status = row.status ?? \"unlinked\";\n byStatus[status] = (byStatus[status] ?? 0) + 1;\n return {\n name: row.name,\n status,\n lastSha: row.last_sha,\n lastSyncedAt: row.last_synced_at,\n requirements: requirementCount(row.report),\n };\n });\n return { byStatus, projects };\n}\n\nfunction requirementCount(report: unknown): number {\n if (report && typeof report === \"object\" && Array.isArray((report as { requirements?: unknown }).requirements)) {\n return (report as { requirements: unknown[] }).requirements.length;\n }\n return 0;\n}\n", "import { createHash, generateKeyPairSync, randomBytes } from \"node:crypto\";\n\nexport interface DeployKeyPair {\n publicKey: string;\n privateKey: string;\n}\n\ninterface RsaPublicJwk {\n kty?: string;\n n?: string;\n e?: string;\n}\n\nfunction sshWireString(value: string | Buffer): Buffer {\n const bytes = typeof value === \"string\" ? Buffer.from(value, \"utf8\") : value;\n const len = Buffer.alloc(4);\n len.writeUInt32BE(bytes.length, 0);\n return Buffer.concat([len, bytes]);\n}\n\nfunction sshMpint(value: Buffer): Buffer {\n let bytes = value;\n while (bytes.length > 1 && bytes[0] === 0) bytes = bytes.subarray(1);\n if ((bytes[0]! & 0x80) !== 0) bytes = Buffer.concat([Buffer.from([0]), bytes]);\n return sshWireString(bytes);\n}\n\nfunction rsaPublicKeyFromJwk(jwk: RsaPublicJwk): string {\n if (jwk.kty !== \"RSA\" || typeof jwk.n !== \"string\" || typeof jwk.e !== \"string\") {\n throw new Error(\"unexpected rsa public key encoding\");\n }\n const algorithm = \"ssh-rsa\";\n const exponent = Buffer.from(jwk.e, \"base64url\");\n const modulus = Buffer.from(jwk.n, \"base64url\");\n const wire = Buffer.concat([sshWireString(algorithm), sshMpint(exponent), sshMpint(modulus)]).toString(\"base64\");\n return `${algorithm} ${wire}`;\n}\n\nexport function generateDeployKeyPair(): DeployKeyPair {\n // OpenSSH accepts PKCS#1 RSA private keys for `GIT_SSH_COMMAND=ssh -i ...`.\n // Keep generation pure-Node so the server does not need `ssh-keygen` at link time.\n const { publicKey, privateKey } = generateKeyPairSync(\"rsa\", { modulusLength: 3072, publicExponent: 0x10001 });\n return {\n publicKey: rsaPublicKeyFromJwk(publicKey.export({ format: \"jwk\" })),\n privateKey: privateKey.export({ type: \"pkcs1\", format: \"pem\" }).toString(),\n };\n}\n\nexport function mintWebhookSigningSecret(): string {\n return `whsec_${randomBytes(32).toString(\"base64url\")}`;\n}\n\nexport function mintWebhookSetupToken(): string {\n return `wst_${randomBytes(24).toString(\"base64url\")}`;\n}\n\nexport function hashWebhookSetupToken(token: string): string {\n return createHash(\"sha256\").update(token).digest(\"hex\");\n}\n", "// The connect pages (ADR-0005): the human's browser is where values enter the system.\n// Single-use links; OAuth consent and secret paste both land directly in the encrypted\n// store; the agent only polls /api/connect-links/:token/status. Plain HTML forms,\n// rendered by connect-view.ts in the @devosurf/tesser-brand system.\n\nimport { randomBytes } from \"node:crypto\";\nimport { Hono } from \"hono\";\nimport type { Db } from \"../db/db.js\";\nimport type { Broker } from \"../broker/broker.js\";\nimport {\n connectLinkStatus,\n getConnectLink,\n type ConnectionRequirement,\n type ConnectLinkRow,\n} from \"../broker/connect.js\";\nimport { buildAuthorizeUrl, exchangeCode, generatePkce } from \"../broker/oauth.js\";\nimport { hashWebhookSetupToken } from \"../gitsync/deploy-keys.js\";\nimport { esc, linkPage, messagePage, oauthAppPage, shell } from \"./connect-view.js\";\n\nexport interface ConnectDeps {\n db: Db;\n broker: Broker;\n baseUrl: string;\n}\n\nfunction hostOf(baseUrl: string): string {\n try {\n return new URL(baseUrl).host;\n } catch {\n return baseUrl;\n }\n}\n\nasync function renderLink(deps: ConnectDeps, link: ConnectLinkRow, notice?: string): Promise<string> {\n const status = await connectLinkStatus(deps.db, deps.broker, link);\n return linkPage({\n host: hostOf(deps.baseUrl),\n token: link.token,\n requirements: status.requirements,\n completed: status.status === \"completed\",\n notice,\n });\n}\n\nexport function createConnectRoutes(deps: ConnectDeps): Hono {\n const app = new Hono();\n const host = hostOf(deps.baseUrl);\n\n app.get(\"/setup/git/:token\", async (c) => {\n const tokenHash = hashWebhookSetupToken(c.req.param(\"token\"));\n const { rows } = await deps.db.query<{\n id: string;\n name: string;\n workspace_id: string;\n deploy_key_public: string | null;\n push_webhook_secret_cipher: string | null;\n }>(\n `SELECT id, name, workspace_id, deploy_key_public, push_webhook_secret_cipher\n FROM projects WHERE push_webhook_setup_token_hash=$1`,\n [tokenHash],\n );\n const project = rows[0];\n if (!project || !project.push_webhook_secret_cipher || !project.deploy_key_public) {\n return c.html(\n messagePage({\n host,\n title: \"Unknown setup link\",\n chip: { dot: \"danger\", label: \"unknown setup\" },\n headline: \"Unknown setup link.\",\n lead: \"This Project git setup link does not exist. Ask the agent to run <code class=\\\"t-code\\\">tesser link</code> again.\",\n }),\n 404,\n );\n }\n const webhookSecret = await deps.broker.decryptValue(\n project.workspace_id,\n project.push_webhook_secret_cipher,\n \"project.webhook.signing\",\n );\n const webhookUrl = `${deps.baseUrl.replace(/\\/$/, \"\")}/hooks/git/${project.id}/push`;\n return c.html(\n shell({\n title: `Git setup for ${project.name}`,\n host,\n chip: { dot: \"warning\", label: \"human setup\" },\n headline: \"Configure git deploy access.\",\n lead: `Add the deploy key and push webhook below in your git host for Project <code class=\\\"t-code\\\">${esc(project.name)}</code>. The private key and webhook signing secret are stored encrypted by this Instance and never returned by the CLI/API JSON.`,\n body: `<div class=\"t-stack t-gap-top-32\">\n <div class=\"t-card\"><div class=\"t-card-band t-card-band--stacked\">\n <span class=\"t-scopes\">deploy key (public)</span>\n <pre class=\"t-pre\">${esc(project.deploy_key_public)}</pre>\n </div></div>\n <div class=\"t-card\"><div class=\"t-card-band t-card-band--stacked\">\n <span class=\"t-scopes\">push webhook url</span>\n <pre class=\"t-pre\">${esc(webhookUrl)}</pre>\n <span class=\"t-scopes\">signing secret</span>\n <pre class=\"t-pre\">${esc(webhookSecret)}</pre>\n <span class=\"t-scopes\">signature header</span>\n <pre class=\"t-pre\">X-Hub-Signature-256: sha256=&lt;hmac-sha256 body with signing secret&gt;</pre>\n </div></div>\n </div>`,\n }),\n );\n });\n\n app.get(\"/connect/:token\", async (c) => {\n const link = await getConnectLink(deps.db, c.req.param(\"token\"));\n if (!link) {\n return c.html(\n messagePage({\n host,\n title: \"Unknown link\",\n chip: { dot: \"danger\", label: \"unknown link\" },\n headline: \"Unknown link.\",\n lead: \"This connect link does not exist.\",\n }),\n 404,\n );\n }\n if (link.status === \"expired\") {\n return c.html(\n messagePage({\n host,\n title: \"Link expired\",\n chip: { dot: \"warning\", label: \"link expired\" },\n headline: \"Link expired.\",\n lead: `Connect links are single use and short-lived. Ask the agent to mint a new one with <code class=\"t-code\">tesser connect</code>.`,\n }),\n 410,\n );\n }\n const notice = c.req.query(\"done\");\n return c.html(await renderLink(deps, link, notice));\n });\n\n app.post(\"/connect/:token/secret\", async (c) => {\n const link = await getConnectLink(deps.db, c.req.param(\"token\"));\n if (!link || link.status !== \"pending\") return c.text(\"link not active\", 410);\n const form = await c.req.parseBody();\n const name = String(form[\"name\"] ?? \"\");\n const value = String(form[\"value\"] ?? \"\");\n if (!link.requirements.some((r) => r.type === \"secret\" && r.name === name)) {\n return c.text(\"secret not part of this link\", 400);\n }\n if (value.length === 0) return c.text(\"empty value\", 400);\n await deps.broker.setSecret(link.workspace_id, name, value);\n return c.redirect(`/connect/${link.token}?done=secret:${encodeURIComponent(name)}`);\n });\n\n app.post(\"/connect/:token/connection\", async (c) => {\n const link = await getConnectLink(deps.db, c.req.param(\"token\"));\n if (!link || link.status !== \"pending\") return c.text(\"link not active\", 410);\n const form = await c.req.parseBody();\n const connector = String(form[\"connector\"] ?? \"\");\n const modeName = String(form[\"mode\"] ?? \"\");\n const scope = String(form[\"scope\"] ?? \"workspace\");\n const req = link.requirements.find(\n (r): r is ConnectionRequirement => r.type === \"connection\" && r.connector === connector && r.scope === scope,\n );\n const mode = req?.modes.find((m) => m.name === modeName);\n if (!req || !mode || mode.kind === \"oauth2\") return c.text(\"unknown connection requirement/mode\", 400);\n\n const endUserId = req.scope === \"per_user\" ? String(form[\"end_user_id\"] ?? \"\").trim() : \"\";\n if (req.scope === \"per_user\" && endUserId.length === 0) return c.text(\"missing end_user_id\", 400);\n const fields: Record<string, string> = {};\n for (const f of mode.fields) {\n const v = String(form[`field_${f}`] ?? \"\");\n if (v.length === 0) return c.text(`missing field ${f}`, 400);\n fields[f] = v;\n }\n const connectionId = await deps.broker.createConnection({\n workspaceId: link.workspace_id,\n connectorId: connector,\n ...(req.provider !== undefined ? { provider: req.provider } : {}),\n authMode: modeName,\n scope: req.scope,\n ...(req.scope === \"per_user\" ? { endUserId } : {}),\n label: `via connect link`,\n });\n await deps.broker.setConnectionCredential(connectionId, fields);\n return c.redirect(`/connect/${link.token}?done=${encodeURIComponent(connector)}`);\n });\n\n app.get(\"/connect/:token/oauth/start\", async (c) => {\n const link = await getConnectLink(deps.db, c.req.param(\"token\"));\n if (!link || link.status !== \"pending\") return c.text(\"link not active\", 410);\n const connector = c.req.query(\"connector\") ?? \"\";\n const modeName = c.req.query(\"mode\") ?? \"\";\n const scope = c.req.query(\"scope\") ?? \"workspace\";\n const req = link.requirements.find(\n (r): r is ConnectionRequirement => r.type === \"connection\" && r.connector === connector && r.scope === scope,\n );\n const mode = req?.modes.find((m) => m.name === modeName);\n if (!req || !mode || mode.kind !== \"oauth2\" || !req.providerFacts?.oauth2) {\n return c.text(\"unknown oauth requirement\", 400);\n }\n const endUserId = req.scope === \"per_user\" ? (c.req.query(\"end_user_id\") ?? \"\").trim() : \"\";\n if (req.scope === \"per_user\" && endUserId.length === 0) return c.text(\"missing end_user_id\", 400);\n const provider = req.provider ?? req.providerFacts.id;\n const app2 = await deps.broker.getOAuthApp(link.workspace_id, provider);\n if (!app2) {\n // BYO OAuth app (ADR-0005): collect the operator's client id/secret first.\n return c.html(\n oauthAppPage({\n host,\n token: link.token,\n provider,\n connector,\n mode: modeName,\n scope: req.scope,\n ...(endUserId ? { endUserId } : {}),\n callbackUrl: `${deps.baseUrl}/oauth/callback`,\n }),\n );\n }\n\n const connectionId = await deps.broker.createConnection({\n workspaceId: link.workspace_id,\n connectorId: connector,\n provider,\n authMode: modeName,\n scope: req.scope,\n ...(req.scope === \"per_user\" ? { endUserId } : {}),\n label: \"via connect link (oauth)\",\n });\n const state = `st_${randomBytes(16).toString(\"hex\")}`;\n const facts = req.providerFacts.oauth2;\n const pkce = facts.pkce === false ? undefined : generatePkce();\n const redirectUri = `${deps.baseUrl}/oauth/callback`;\n await deps.db.query(\n `INSERT INTO oauth_states (state, connect_token, connection_id, provider, code_verifier, redirect_uri, expires_at)\n VALUES ($1,$2,$3,$4,$5,$6, now() + interval '15 minutes')`,\n [state, link.token, connectionId, provider, pkce?.verifier ?? null, redirectUri],\n );\n const url = buildAuthorizeUrl({\n facts,\n clientId: app2.clientId,\n redirectUri,\n scopes: mode.scopes ?? [],\n state,\n codeChallenge: pkce?.challenge,\n });\n return c.redirect(url);\n });\n\n app.post(\"/connect/:token/oauth/app\", async (c) => {\n const link = await getConnectLink(deps.db, c.req.param(\"token\"));\n if (!link || link.status !== \"pending\") return c.text(\"link not active\", 410);\n const form = await c.req.parseBody();\n const provider = String(form[\"provider\"] ?? \"\");\n const clientId = String(form[\"client_id\"] ?? \"\");\n const clientSecret = String(form[\"client_secret\"] ?? \"\");\n if (!provider || !clientId || !clientSecret) return c.text(\"missing fields\", 400);\n await deps.broker.setOAuthApp(link.workspace_id, provider, clientId, clientSecret);\n const params = new URLSearchParams({\n connector: String(form[\"connector\"]),\n mode: String(form[\"mode\"]),\n scope: String(form[\"scope\"] ?? \"workspace\"),\n });\n const endUserId = String(form[\"end_user_id\"] ?? \"\").trim();\n if (endUserId) params.set(\"end_user_id\", endUserId);\n return c.redirect(`/connect/${link.token}/oauth/start?${params}`);\n });\n\n app.get(\"/oauth/callback\", async (c) => {\n const oauthError = (lead: string, pre?: string): string =>\n messagePage({\n host,\n title: \"OAuth error\",\n chip: { dot: \"danger\", label: \"oauth error\" },\n headline: \"OAuth error.\",\n lead,\n ...(pre !== undefined ? { pre } : {}),\n });\n\n const state = c.req.query(\"state\") ?? \"\";\n const code = c.req.query(\"code\") ?? \"\";\n const { rows } = await deps.db.query<{\n state: string;\n connect_token: string | null;\n connection_id: string;\n provider: string;\n code_verifier: string | null;\n redirect_uri: string;\n expires_at: string;\n }>(`SELECT * FROM oauth_states WHERE state=$1`, [state]);\n const st = rows[0];\n if (!st || new Date(String(st.expires_at)).getTime() < Date.now()) {\n return c.html(oauthError(\"State expired or unknown. Restart from the connect page.\"), 400);\n }\n await deps.db.query(`DELETE FROM oauth_states WHERE state=$1`, [state]); // single-use\n if (!code) return c.html(oauthError(`The provider returned: ${esc(c.req.query(\"error\") ?? \"consent denied\")}.`), 400);\n\n const link = st.connect_token ? await getConnectLink(deps.db, st.connect_token) : null;\n const req = link?.requirements.find(\n (r): r is ConnectionRequirement =>\n r.type === \"connection\" && (r.provider ?? r.providerFacts?.id) === st.provider,\n );\n const facts = req?.providerFacts?.oauth2;\n if (!link || !facts) return c.html(oauthError(\"Connect link no longer valid.\"), 400);\n\n const app2 = await deps.broker.getOAuthApp(link.workspace_id, st.provider);\n if (!app2) return c.html(oauthError(\"OAuth app vanished mid-flow.\"), 400);\n\n try {\n const tokens = await exchangeCode({\n facts,\n clientId: app2.clientId,\n clientSecret: app2.clientSecret,\n code,\n redirectUri: st.redirect_uri,\n codeVerifier: st.code_verifier ?? undefined,\n });\n await deps.broker.setConnectionCredential(\n st.connection_id,\n {\n access_token: tokens.accessToken,\n ...(tokens.refreshToken !== undefined ? { refresh_token: tokens.refreshToken } : {}),\n },\n {\n ...(tokens.expiresAt !== undefined ? { expiresAt: tokens.expiresAt } : {}),\n ...(tokens.scope !== undefined ? { scope: tokens.scope } : {}),\n },\n );\n } catch (err) {\n return c.html(oauthError(\"Token exchange failed.\", (err as Error).message), 502);\n }\n return c.redirect(`/connect/${link.token}?done=${encodeURIComponent(req!.connector)}`);\n });\n\n // Manual webhook registration completion (ADR-0013 manual mode).\n app.post(\"/connect/:token/webhook/:registrationId\", async (c) => {\n const link = await getConnectLink(deps.db, c.req.param(\"token\"));\n if (!link || link.status !== \"pending\") return c.text(\"link not active\", 410);\n const regId = c.req.param(\"registrationId\");\n if (!link.requirements.some((r) => r.type === \"webhook-manual\" && r.registrationId === regId)) {\n return c.text(\"registration not part of this link\", 400);\n }\n const form = await c.req.parseBody();\n const secret = String(form[\"signing_secret\"] ?? \"\");\n if (secret.length === 0) return c.text(\"empty signing secret\", 400);\n const cipher = await deps.broker.encryptValue(link.workspace_id, secret, \"webhook.signing\");\n await deps.db.query(\n `UPDATE webhook_registrations SET signing_secret_cipher=$2, status='registered', updated_at=now() WHERE id=$1`,\n [regId, cipher],\n );\n return c.redirect(`/connect/${link.token}?done=webhook`);\n });\n\n return app;\n}\n", "// Tesser design tokens \u2014 the single source of truth, transcribed from the Paper\n// design system (pages 01-04: The Mark, Color, Typography, Grid & Spacing).\n// tokens.css is generated from this file: `pnpm --filter @devosurf/tesser-brand emit`.\n\n/** Core, neutral, and functional colors. One blue, used on purpose. */\nexport const color = {\n /** The single brand accent. Links, indices, focus, primary action. */\n cobalt: \"#1B45E0\",\n /** Active / pressed cobalt. */\n cobaltPress: \"#1438B0\",\n /** Subtle fills, grid backgrounds. */\n cobaltWash: \"#EEF1FD\",\n /** Primary text, rules, and primary buttons. The structural color. */\n ink: \"#111111\",\n /** The page and every surface. White space is part of the system. */\n paper: \"#FFFFFF\",\n /** Body strong. */\n grey700: \"#444444\",\n /** Muted text. */\n grey500: \"#666666\",\n /** Captions. */\n grey400: \"#8A8A8A\",\n /** Borders. */\n grey200: \"#E6E6E6\",\n /** Dividers: ink at 16%. */\n hairline: \"rgba(17, 17, 17, 0.16)\",\n /** Run status: live, passing. Never a brand accent. */\n positive: \"#1F7A4D\",\n /** Run status: halted, pending. */\n warning: \"#B7791F\",\n /** Run status: failed, rolled back. */\n danger: \"#C0392B\",\n} as const;\n\n/** Inter carries the system; Geist Mono carries code and machine values. */\nexport const font = {\n sans: `\"Inter\", system-ui, -apple-system, \"Segoe UI\", sans-serif`,\n mono: `\"Geist Mono\", ui-monospace, \"SF Mono\", Menlo, Consolas, monospace`,\n} as const;\n\nexport interface TypeStep {\n family: keyof typeof font;\n weight: number;\n /** px */\n size: number;\n /** px */\n line: number;\n /** em */\n tracking: number;\n uppercase?: boolean;\n}\n\n/** The type scale. Scale and weight do the work that color does not. */\nexport const text = {\n /** Hero statements. */\n display: { family: \"sans\", weight: 800, size: 80, line: 80, tracking: -0.04 },\n /** Page titles. */\n h1: { family: \"sans\", weight: 800, size: 58, line: 60, tracking: -0.035 },\n /** Section titles. */\n h2: { family: \"sans\", weight: 700, size: 38, line: 44, tracking: -0.03 },\n /** Card and subsection titles. */\n h3: { family: \"sans\", weight: 700, size: 24, line: 30, tracking: -0.02 },\n /** Lead paragraphs. */\n bodyLg: { family: \"sans\", weight: 400, size: 19, line: 30, tracking: 0 },\n /** Default body. */\n body: { family: \"sans\", weight: 400, size: 17, line: 26, tracking: 0 },\n /** Secondary and captions. */\n bodySm: { family: \"sans\", weight: 400, size: 15, line: 23, tracking: 0 },\n /** Eyebrows and tracked labels. */\n label: { family: \"sans\", weight: 600, size: 12, line: 16, tracking: 0.14, uppercase: true },\n /** Code and machine values. */\n mono: { family: \"mono\", weight: 400, size: 14, line: 22, tracking: 0 },\n} as const satisfies Record<string, TypeStep>;\n\n/** Base unit 4px. Every gap and pad is a multiple. */\nexport const space = [4, 8, 12, 16, 24, 32, 48, 64, 80, 112] as const;\n\n/** Every layout sits on a 12 column grid with a 64px margin. */\nexport const grid = {\n columns: 12,\n /** px, page edge to content */\n margin: 64,\n /** px, space between columns */\n gutter: 24,\n /** px, canvas width */\n max: 1440,\n} as const;\n\n/** Two rules. 1.5px ink separates bands; 1px ink at 16% separates rows. Nothing heavier. */\nexport const rule = {\n strong: `1.5px solid ${color.ink}`,\n hairline: `1px solid ${color.hairline}`,\n} as const;\n\n/** Square by default. The system is built from rules and the grid, not rounded shapes. */\nexport const radius = { none: \"0px\" } as const;\n\nexport const tokens = { color, font, text, space, grid, rule, radius } as const;\n\nconst kebab = (s: string): string => s.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").replace(/([a-z]{2,})([0-9]+)$/, \"$1-$2\").toLowerCase();\n\n/** The :root custom-property block. tokens.css is exactly this string. */\nexport function tokensCss(): string {\n const lines: string[] = [];\n for (const [name, value] of Object.entries(color)) lines.push(` --color-${kebab(name)}: ${value};`);\n for (const [name, value] of Object.entries(font)) lines.push(` --font-${name}: ${value};`);\n for (const [name, step] of Object.entries(text) as Array<[string, TypeStep]>) {\n const n = kebab(name);\n lines.push(\n ` --text-${n}: ${step.weight} ${step.size}px/${step.line}px var(--font-${step.family});`,\n ` --text-${n}-tracking: ${step.tracking}em;`,\n );\n }\n for (const step of space) lines.push(` --space-${step}: ${step}px;`);\n for (const [name, value] of Object.entries(grid)) {\n lines.push(` --grid-${name}: ${typeof value === \"number\" && name !== \"columns\" ? `${value}px` : value};`);\n }\n for (const [name, value] of Object.entries(rule)) lines.push(` --rule-${name}: ${value};`);\n lines.push(` --radius-none: ${radius.none};`);\n return `:root {\\n${lines.join(\"\\n\")}\\n}\\n`;\n}\n", "// The UI primitive layer \u2014 a small set of classes assembled from the tokens\n// (Paper design system page 05: Components). Square corners, ink rules, one blue.\n// ui.css is generated from this file: `pnpm --filter @devosurf/tesser-brand emit`.\n//\n// Class prefix `t-`. Every value is a token reference; the two literals allowed\n// are pure black (the documented hover state) and the 4px progress bar.\n\nexport const uiCss = `/* base ------------------------------------------------------------------ */\n.t-page {\n margin: 0;\n background: var(--color-paper);\n color: var(--color-ink);\n font: var(--text-body-sm);\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.t-main {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: var(--space-64) var(--space-24) var(--space-80);\n}\n.t-col {\n width: 100%;\n max-width: 720px;\n display: flex;\n flex-direction: column;\n}\n:is(.t-page) :focus-visible {\n outline: 2px solid var(--color-cobalt);\n outline-offset: 2px;\n}\n\n/* type ------------------------------------------------------------------ */\n.t-display { font: var(--text-display); letter-spacing: var(--text-display-tracking); margin: 0; }\n.t-h1 { font: var(--text-h1); letter-spacing: var(--text-h1-tracking); margin: 0; }\n.t-h2 { font: var(--text-h2); letter-spacing: var(--text-h2-tracking); margin: 0; }\n.t-h3 { font: var(--text-h3); letter-spacing: var(--text-h3-tracking); margin: 0; }\n.t-body-lg { font: var(--text-body-lg); margin: 0; }\n.t-body { font: var(--text-body); margin: 0; }\n.t-body-sm { font: var(--text-body-sm); margin: 0; }\n.t-label {\n font: var(--text-label);\n letter-spacing: var(--text-label-tracking);\n text-transform: uppercase;\n margin: 0;\n}\n.t-mono { font: var(--text-mono); margin: 0; }\n/* Product page title: h2 scale carrying h1 weight, as set on the connect comp. */\n.t-page-title { font: 800 38px/44px var(--font-sans); letter-spacing: -0.03em; margin: 0; }\n.t-lead { font: var(--text-body); color: var(--color-grey-500); margin: var(--space-16) 0 0; }\n\n/* top bar ----------------------------------------------------------------- */\n.t-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-16);\n padding: var(--space-16) var(--space-32);\n border-bottom: 1px solid var(--color-grey-200);\n background: var(--color-paper);\n}\n.t-bar--strong { border-bottom: var(--rule-strong); }\n.t-brand {\n display: flex;\n align-items: center;\n gap: var(--space-8);\n color: inherit;\n text-decoration: none;\n}\n.t-brand svg { flex-shrink: 0; display: block; }\n.t-wordmark { font: 700 18px/22px var(--font-sans); letter-spacing: -0.02em; }\n.t-bar-meta { display: flex; align-items: center; gap: var(--space-12); }\n.t-host { font: 400 13px/16px var(--font-mono); color: var(--color-grey-400); }\n\n/* chips, dots, status ------------------------------------------------------ */\n.t-chip {\n display: inline-flex;\n align-items: center;\n gap: var(--space-8);\n padding: var(--space-4) var(--space-12);\n border: 1px solid var(--color-grey-200);\n font: 400 12.5px/16px var(--font-mono);\n color: var(--color-grey-700);\n white-space: nowrap;\n}\n.t-dot { width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; background: var(--color-grey-400); }\n.t-dot--positive { background: var(--color-positive); }\n.t-dot--warning { background: var(--color-warning); }\n.t-dot--danger { background: var(--color-danger); }\n.t-status { display: inline-flex; align-items: center; gap: var(--space-8); font: 400 13.5px/18px var(--font-sans); white-space: nowrap; }\n.t-status--pending { color: var(--color-warning); }\n.t-status--ready { color: var(--color-grey-500); }\n.t-status--danger { color: var(--color-danger); }\n\n/* progress ----------------------------------------------------------------- */\n.t-progress { display: flex; flex-direction: column; gap: var(--space-8); }\n.t-progress-meta { display: flex; align-items: center; justify-content: space-between; font: 400 13px/16px var(--font-mono); color: var(--color-ink); }\n.t-progress-meta .is-remaining { color: var(--color-grey-400); }\n.t-progress-track { height: 4px; background: var(--color-grey-200); }\n.t-progress-fill { height: 4px; background: var(--color-cobalt); }\n\n/* cards ---------------------------------------------------------------- */\n.t-stack { display: flex; flex-direction: column; gap: var(--space-16); }\n.t-card { border: 1px solid var(--color-grey-200); background: var(--color-paper); }\n.t-card-head { display: flex; align-items: center; gap: var(--space-16); padding: var(--space-16) var(--space-24); }\n.t-card-band {\n display: flex;\n align-items: center;\n gap: var(--space-16);\n padding: var(--space-12) var(--space-24);\n border-top: 1px solid var(--color-grey-200);\n}\n.t-card-band--stacked { flex-direction: column; align-items: stretch; }\n.t-tile {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n border: 1px solid var(--color-grey-200);\n font: 600 15px/18px var(--font-mono);\n color: var(--color-ink);\n}\n.t-card-id { display: flex; flex-direction: column; gap: 2px; min-width: 0; }\n.t-card-title-row { display: flex; align-items: center; gap: var(--space-8); }\n.t-card-title { font: 600 16px/20px var(--font-sans); }\n.t-card-title--mono { font: 600 15px/18px var(--font-mono); }\n.t-kind { font: 400 13px/16px var(--font-sans); color: var(--color-grey-400); }\n.t-meta { font: 400 13px/16px var(--font-sans); color: var(--color-grey-400); overflow-wrap: anywhere; }\n.t-scopes { font: 400 12.5px/16px var(--font-mono); color: var(--color-grey-400); overflow-wrap: anywhere; }\n\n/* buttons -------------------------------------------------------------- */\n.t-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--space-8);\n border: 0;\n border-radius: var(--radius-none);\n padding: var(--space-12) 20px;\n font: 600 14.5px/18px var(--font-sans);\n cursor: pointer;\n text-decoration: none;\n white-space: nowrap;\n}\n.t-btn svg { flex-shrink: 0; display: block; }\n.t-btn--primary { background: var(--color-ink); color: var(--color-paper); }\n.t-btn--primary:hover { background: #000000; }\n.t-btn--accent { background: var(--color-cobalt); color: var(--color-paper); }\n.t-btn--accent:hover, .t-btn--accent:active { background: var(--color-cobalt-press); }\n.t-btn--secondary { background: transparent; color: var(--color-ink); border: 1px solid var(--color-ink); padding: 11px 19px; }\n.t-btn--secondary:hover { background: var(--color-cobalt-wash); }\n.t-btn:disabled { background: var(--color-grey-200); color: var(--color-grey-400); cursor: not-allowed; }\n.t-link { color: var(--color-cobalt); text-decoration: underline; text-underline-offset: 3px; }\n.t-link:hover { color: var(--color-cobalt-press); }\n\n/* forms ----------------------------------------------------------------- */\n.t-field { display: flex; flex-direction: column; gap: var(--space-4); flex: 1 1 auto; min-width: 0; }\n.t-field-label {\n font: var(--text-label);\n letter-spacing: var(--text-label-tracking);\n text-transform: uppercase;\n color: var(--color-grey-500);\n}\n.t-input {\n width: 100%;\n box-sizing: border-box;\n border: 1px solid var(--color-grey-200);\n border-radius: var(--radius-none);\n background: var(--color-paper);\n padding: var(--space-12) var(--space-16);\n font: 400 14px/18px var(--font-mono);\n color: var(--color-ink);\n}\n.t-input::placeholder { color: var(--color-grey-400); }\n.t-input:focus-visible { outline: 2px solid var(--color-cobalt); outline-offset: -1px; }\n.t-form-row { display: flex; align-items: center; gap: var(--space-12); flex: 1 1 auto; }\n.t-form-col { display: flex; flex-direction: column; align-items: stretch; gap: var(--space-12); flex: 1 1 auto; min-width: 0; }\n.t-form-col .t-btn { align-self: flex-end; }\n\n/* notices, code, footnote ---------------------------------------------- */\n.t-notice {\n display: flex;\n align-items: center;\n gap: var(--space-8);\n padding: var(--space-12) var(--space-16);\n border: 1px solid var(--color-grey-200);\n font: 400 13.5px/18px var(--font-sans);\n color: var(--color-grey-700);\n}\n.t-pre {\n margin: 0;\n padding: var(--space-16);\n background: var(--color-cobalt-wash);\n font: 400 13px/20px var(--font-mono);\n overflow: auto;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n.t-code { font-family: var(--font-mono); font-size: 0.92em; background: var(--color-cobalt-wash); padding: 1px 5px; }\n.t-footnote {\n display: flex;\n align-items: center;\n gap: var(--space-12);\n padding-top: var(--space-24);\n font: 400 13.5px/18px var(--font-sans);\n color: var(--color-grey-400);\n}\n.t-footnote svg { flex-shrink: 0; display: block; }\n\n/* utilities -------------------------------------------------------------- */\n.t-right { margin-left: auto; }\n.t-grow { flex: 1 1 auto; min-width: 0; }\n.t-gap-top-16 { margin-top: var(--space-16); }\n.t-gap-top-24 { margin-top: var(--space-24); }\n.t-gap-top-32 { margin-top: var(--space-32); }\n.t-gap-top-48 { margin-top: var(--space-48); }\n\n/* small screens ----------------------------------------------------------- */\n@media (max-width: 640px) {\n .t-bar { padding: var(--space-12) var(--space-16); }\n .t-host { display: none; }\n .t-main { padding: var(--space-32) var(--space-16) var(--space-48); }\n .t-page-title { font-size: 28px; line-height: 34px; }\n .t-card-head { flex-wrap: wrap; }\n .t-card-band { flex-wrap: wrap; }\n .t-form-row { flex-wrap: wrap; }\n}\n`;\n", "// The mark (Paper design system page 01): a tesseract \u2014 a square nested inside a\n// square, joined at the corners. Cobalt outer, ink inner. It sits upright, flat,\n// always square. Below 20px the connectors drop and only the two squares remain.\n\nimport { color } from \"./tokens.js\";\n\nexport type MarkVariant =\n /** Cobalt outer, ink inner. The primary mark on paper. */\n | \"brand\"\n /** One color, ink. Print, stamps. */\n | \"mono\"\n /** On ink. Cobalt outer, white inner. */\n | \"reversed\"\n /** On cobalt. All white. */\n | \"on-accent\";\n\nexport interface MarkOptions {\n /** Rendered size in px. Minimum 16. */\n size?: number;\n variant?: MarkVariant;\n /** Accessible name. Omitted: the mark is decorative (aria-hidden). */\n title?: string;\n}\n\nconst PALETTE: Record<MarkVariant, { outer: string; inner: string }> = {\n brand: { outer: color.cobalt, inner: color.ink },\n mono: { outer: color.ink, inner: color.ink },\n reversed: { outer: color.cobalt, inner: color.paper },\n \"on-accent\": { outer: color.paper, inner: color.paper },\n};\n\nconst escAttr = (s: string): string =>\n s.replace(/[&<>\"]/g, (ch) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\" })[ch]!);\n\n/** The mark as an inline SVG string. */\nexport function markSvg(options: MarkOptions = {}): string {\n const { size = 22, variant = \"brand\", title } = options;\n const { outer, inner } = PALETTE[variant];\n // Outer square frames the bounding box; inner square is two fifths, centered;\n // four connectors join matching corners. Stroke ~ one fortieth of the width.\n const connectors =\n size >= 20\n ? `<line x1=\"12\" y1=\"12\" x2=\"36\" y2=\"36\" stroke=\"${inner}\" stroke-width=\"5\"/>` +\n `<line x1=\"88\" y1=\"12\" x2=\"64\" y2=\"36\" stroke=\"${inner}\" stroke-width=\"5\"/>` +\n `<line x1=\"12\" y1=\"88\" x2=\"36\" y2=\"64\" stroke=\"${inner}\" stroke-width=\"5\"/>` +\n `<line x1=\"88\" y1=\"88\" x2=\"64\" y2=\"64\" stroke=\"${inner}\" stroke-width=\"5\"/>`\n : \"\";\n const a11y = title ? `role=\"img\" aria-label=\"${escAttr(title)}\"` : `aria-hidden=\"true\"`;\n return (\n `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 100 100\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" ${a11y}>` +\n `<rect x=\"12\" y=\"12\" width=\"76\" height=\"76\" stroke=\"${outer}\" stroke-width=\"6\"/>` +\n `<rect x=\"36\" y=\"36\" width=\"28\" height=\"28\" stroke=\"${inner}\" stroke-width=\"6\"/>` +\n connectors +\n `</svg>`\n );\n}\n", "// @devosurf/tesser-brand \u2014 the Tesser design system as code.\n// Tokens (color, type, grid, spacing), the UI primitive layer, and the mark.\n// Static consumers import tokens.css / ui.css; TypeScript consumers import here.\n\nexport { color, font, text, space, grid, rule, radius, tokens, tokensCss, type TypeStep } from \"./tokens.js\";\nexport { uiCss } from \"./ui.js\";\nexport { markSvg, type MarkOptions, type MarkVariant } from \"./mark.js\";\n\nimport { tokensCss } from \"./tokens.js\";\nimport { uiCss } from \"./ui.js\";\n\n/** The full stylesheet (tokens + primitives) for inlining into a server-rendered page. */\nexport function inlineCss(): string {\n return `${tokensCss()}\\n${uiCss}`;\n}\n", "// Rendering for the connect pages \u2014 pure functions from view data to HTML.\n// Styled by @devosurf/tesser-brand; no styling decisions live in this file beyond\n// composing the t- primitives. The requirement cards are manifest-driven, so a\n// custom connector renders exactly like a built-in one: a monogram tile, the\n// modes its manifest declares, and nothing hardcoded per provider.\n\nimport { inlineCss, markSvg } from \"@devosurf/tesser-brand\";\nimport type { ConnectionRequirement, Requirement } from \"../broker/connect.js\";\n\nexport const esc = (s: unknown): string =>\n String(s ?? \"\").replace(/[&<>\"']/g, (ch) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" })[ch]!);\n\nconst CSS = inlineCss();\n\nconst ARROW = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path d=\"M5 12h14M13 6l6 6-6 6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`;\nconst SHIELD = `<svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path d=\"M12 3l7 3v5c0 4.5-3 7.5-7 9-4-1.5-7-4.5-7-9V6l7-3Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linejoin=\"round\"/><path d=\"M9 12l2 2 4-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`;\n\nexport interface ShellOptions {\n /** Browser tab title; the page headline carries the brand, the tab gets \"\u00B7 tesser\". */\n title: string;\n /** Instance host shown in the top bar. */\n host: string;\n /** Link-state chip in the top bar. */\n chip?: { dot: \"positive\" | \"warning\" | \"danger\"; label: string };\n headline: string;\n /** May contain markup; callers escape interpolations. */\n lead?: string;\n body?: string;\n /** The encrypted-store footnote; on for pages that accept values. */\n securityNote?: boolean;\n}\n\nexport function shell(o: ShellOptions): string {\n const chip = o.chip\n ? `<span class=\"t-chip\"><span class=\"t-dot t-dot--${o.chip.dot}\"></span>${esc(o.chip.label)}</span>`\n : \"\";\n return `<!doctype html><html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n<title>${esc(o.title)} \u00B7 tesser</title>\n<style>${CSS}</style></head><body class=\"t-page\">\n<header class=\"t-bar\">\n <span class=\"t-brand\">${markSvg({ size: 22 })}<span class=\"t-wordmark\">tesser</span></span>\n <span class=\"t-bar-meta\">${chip}<span class=\"t-host\">${esc(o.host)}</span></span>\n</header>\n<main class=\"t-main\"><div class=\"t-col\">\n <h1 class=\"t-page-title\">${esc(o.headline)}</h1>\n ${o.lead ? `<p class=\"t-lead\">${o.lead}</p>` : \"\"}\n ${o.body ?? \"\"}\n ${o.securityNote ? `<p class=\"t-footnote\">${SHIELD}<span>Single use and expiring. Values go to the encrypted store. The agent holds a handle, never the value.</span></p>` : \"\"}\n</div></main>\n</body></html>`;\n}\n\n/* requirement cards ----------------------------------------------------- */\n\nexport interface RequirementView {\n requirement: Requirement;\n satisfied: boolean;\n}\n\n/** Monogram tile glyph: the first character of the thing's own name, any connector. */\nconst glyph = (id: string): string => (id.trim().charAt(0) || \"?\").toUpperCase();\n\nconst status = (satisfied: boolean, pendingLabel: string, readyLabel: string): string =>\n satisfied\n ? `<span class=\"t-status t-status--ready t-right\"><span class=\"t-dot t-dot--positive\"></span>${esc(readyLabel)}</span>`\n : `<span class=\"t-status t-status--pending t-right\"><span class=\"t-dot t-dot--warning\"></span>${esc(pendingLabel)}</span>`;\n\nconst head = (o: { glyph: string; title: string; mono?: boolean; kind: string; meta: string; status: string }): string =>\n `<div class=\"t-card-head\">\n <span class=\"t-tile\" aria-hidden=\"true\">${esc(o.glyph)}</span>\n <span class=\"t-card-id\">\n <span class=\"t-card-title-row\"><span class=\"t-card-title${o.mono ? \" t-card-title--mono\" : \"\"}\">${esc(o.title)}</span><span class=\"t-kind\">${esc(o.kind)}</span></span>\n <span class=\"t-meta\">${esc(o.meta)}</span>\n </span>\n ${o.status}\n </div>`;\n\nconst neededBy = (automations: string[]): string => `Needed by ${automations.join(\", \")}`;\n\nconst fieldInput = (name: string, label: string): string => {\n const type = /key|token|password|secret/i.test(label) ? \"password\" : \"text\";\n return `<label class=\"t-field\"><span class=\"t-field-label\">${esc(label.replace(/_/g, \" \"))}</span><input class=\"t-input\" name=\"${esc(name)}\" type=\"${type}\" required autocomplete=\"off\"></label>`;\n};\n\nfunction endUserInput(req: ConnectionRequirement): string {\n return req.scope === \"per_user\" ? fieldInput(\"end_user_id\", \"end user id\") : \"\";\n}\n\nfunction connectionBands(token: string, req: ConnectionRequirement): string {\n return req.modes\n .map((mode) => {\n if (mode.kind === \"oauth2\") {\n const note = mode.scopes?.length ? `scopes \u00B7 ${mode.scopes.join(\" \u00B7 \")}` : `mode \u00B7 ${mode.name}`;\n return `<form class=\"t-card-band${req.scope === \"per_user\" ? \" t-card-band--stacked\" : \"\"}\" method=\"get\" action=\"/connect/${esc(token)}/oauth/start\">\n <input type=\"hidden\" name=\"connector\" value=\"${esc(req.connector)}\">\n <input type=\"hidden\" name=\"mode\" value=\"${esc(mode.name)}\">\n <input type=\"hidden\" name=\"scope\" value=\"${esc(req.scope)}\">\n <span class=\"t-scopes\">${esc(note)}${req.scope === \"per_user\" ? \" \u00B7 end user required\" : \"\"}</span>\n ${endUserInput(req)}\n <button class=\"t-btn t-btn--accent${req.scope === \"per_user\" ? \"\" : \" t-right\"}\">Connect with OAuth ${ARROW}</button>\n </form>`;\n }\n const hidden = `<input type=\"hidden\" name=\"connector\" value=\"${esc(req.connector)}\">\n <input type=\"hidden\" name=\"mode\" value=\"${esc(mode.name)}\">\n <input type=\"hidden\" name=\"scope\" value=\"${esc(req.scope)}\">`;\n if (mode.fields.length === 0) {\n return `<form class=\"t-card-band${req.scope === \"per_user\" ? \" t-card-band--stacked\" : \"\"}\" method=\"post\" action=\"/connect/${esc(token)}/connection\">\n ${hidden}\n <span class=\"t-scopes\">mode \u00B7 ${esc(mode.name)}${req.scope === \"per_user\" ? \" \u00B7 end user required\" : \"\"}</span>\n ${endUserInput(req)}\n <button class=\"t-btn t-btn--primary${req.scope === \"per_user\" ? \"\" : \" t-right\"}\">Create connection</button>\n </form>`;\n }\n return `<div class=\"t-card-band t-card-band--stacked\">\n <span class=\"t-scopes\">mode \u00B7 ${esc(mode.name)}${mode.describe ? ` \u00B7 ${esc(mode.describe)}` : \"\"}</span>\n <form class=\"t-form-col\" method=\"post\" action=\"/connect/${esc(token)}/connection\">\n ${hidden}\n ${endUserInput(req)}\n ${mode.fields.map((f) => fieldInput(`field_${f}`, f)).join(\"\\n\")}\n <button class=\"t-btn t-btn--primary\">Save credential</button>\n </form>\n </div>`;\n })\n .join(\"\");\n}\n\nexport function requirementCard(token: string, view: RequirementView): string {\n const { requirement: req, satisfied } = view;\n\n if (req.type === \"connection\") {\n const scope = req.scope === \"per_user\" ? \"per user\" : req.scope;\n const top = head({\n glyph: glyph(req.connector),\n title: req.connector,\n kind: \"connection\",\n meta: `${satisfied ? \"Connected \u00B7 \" : \"\"}${neededBy(req.automations)} \u00B7 ${scope}`,\n status: status(satisfied, \"pending\", \"ready\"),\n });\n return `<div class=\"t-card\">${top}${satisfied ? \"\" : connectionBands(token, req)}</div>`;\n }\n\n if (req.type === \"secret\") {\n const top = head({\n glyph: glyph(req.name),\n title: req.name,\n mono: true,\n kind: \"secret\",\n meta: `${req.describe ? `${req.describe} \u00B7 ` : \"\"}${neededBy(req.automations)}`,\n status: status(satisfied, \"pending\", \"set\"),\n });\n const band = satisfied\n ? \"\"\n : `<form class=\"t-card-band\" method=\"post\" action=\"/connect/${esc(token)}/secret\">\n <input type=\"hidden\" name=\"name\" value=\"${esc(req.name)}\">\n <input class=\"t-input t-grow\" name=\"value\" type=\"password\" placeholder=\"value\" required autocomplete=\"off\" aria-label=\"value for ${esc(req.name)}\">\n <button class=\"t-btn t-btn--primary\">Save</button>\n </form>`;\n return `<div class=\"t-card\">${top}${band}</div>`;\n }\n\n const top = head({\n glyph: glyph(req.connector),\n title: `${req.connector}.${req.trigger}`,\n mono: true,\n kind: \"webhook\",\n meta: `Register with the provider \u00B7 needed by ${req.automation}`,\n status: status(satisfied, \"action needed\", \"registered\"),\n });\n const band = satisfied\n ? \"\"\n : `<div class=\"t-card-band t-card-band--stacked\">\n <pre class=\"t-pre\">${esc(req.instructions)}</pre>\n <form class=\"t-form-row\" method=\"post\" action=\"/connect/${esc(token)}/webhook/${esc(req.registrationId)}\">\n <input class=\"t-input t-grow\" name=\"signing_secret\" type=\"password\" placeholder=\"signing secret\" required autocomplete=\"off\" aria-label=\"signing secret\">\n <button class=\"t-btn t-btn--primary\">Save and mark registered</button>\n </form>\n </div>`;\n return `<div class=\"t-card\">${top}${band}</div>`;\n}\n\n/* the link page ---------------------------------------------------------- */\n\nconst COUNT_WORDS = [\"Zero\", \"One\", \"Two\", \"Three\", \"Four\", \"Five\", \"Six\", \"Seven\", \"Eight\", \"Nine\"];\n\nexport function linkHeadline(total: number, done: boolean): string {\n if (done) return \"All set.\";\n const count = COUNT_WORDS[total] ?? String(total);\n return `${count} ${total === 1 ? \"thing\" : \"things\"} to connect.`;\n}\n\n/** Maps the ?done= redirect param to a human notice. */\nexport function noticeLabel(done: string): string {\n if (done.startsWith(\"secret:\")) return `Saved ${done.slice(\"secret:\".length)}.`;\n if (done === \"webhook\") return \"Webhook registered.\";\n return `Connected ${done}.`;\n}\n\nexport function linkPage(o: {\n host: string;\n token: string;\n requirements: RequirementView[];\n completed: boolean;\n notice?: string | undefined;\n}): string {\n const total = o.requirements.length;\n const ready = o.requirements.filter((r) => r.satisfied).length;\n const pending = total - ready;\n const done = o.completed || (total > 0 && pending === 0);\n\n const progress =\n total === 0\n ? \"\"\n : `<div class=\"t-progress t-gap-top-32\">\n <div class=\"t-progress-meta\"><span>${ready} of ${total} ready</span><span class=\"is-remaining\">${pending > 0 ? `${pending} pending` : \"complete\"}</span></div>\n <div class=\"t-progress-track\"><div class=\"t-progress-fill\" style=\"width:${Math.round((ready / total) * 100)}%\"></div></div>\n </div>`;\n\n const notice = o.notice\n ? `<div class=\"t-notice t-gap-top-24\"><span class=\"t-dot t-dot--positive\"></span>${esc(noticeLabel(o.notice))}</div>`\n : \"\";\n\n const cards = total === 0 ? \"\" : `<div class=\"t-stack t-gap-top-32\">${o.requirements.map((r) => requirementCard(o.token, r)).join(\"\\n\")}</div>`;\n\n return shell({\n title: done ? \"All set\" : \"Connect\",\n host: o.host,\n chip: { dot: \"positive\", label: \"single-use link\" },\n headline: linkHeadline(total, done),\n lead: done\n ? \"Everything this deploy needs is in place. You can close this page. The agent picks it up from here.\"\n : \"Your agent halted this deploy until these are in place. The agent takes it from there.\",\n body: `${notice}${progress}${cards}`,\n securityNote: true,\n });\n}\n\n/* secondary pages --------------------------------------------------------- */\n\nexport function oauthAppPage(o: { host: string; token: string; provider: string; connector: string; mode: string; scope: string; endUserId?: string | undefined; callbackUrl: string }): string {\n const top = head({\n glyph: glyph(o.provider),\n title: o.provider,\n kind: \"oauth app\",\n meta: \"Bring your own app: the instance stores the client credentials, encrypted\",\n status: status(false, \"action needed\", \"ready\"),\n });\n const body = `<div class=\"t-card t-gap-top-32\">${top}\n <div class=\"t-card-band t-card-band--stacked\">\n <span class=\"t-scopes\">callback url</span>\n <pre class=\"t-pre\">${esc(o.callbackUrl)}</pre>\n <form class=\"t-form-col\" method=\"post\" action=\"/connect/${esc(o.token)}/oauth/app\">\n <input type=\"hidden\" name=\"provider\" value=\"${esc(o.provider)}\">\n <input type=\"hidden\" name=\"connector\" value=\"${esc(o.connector)}\">\n <input type=\"hidden\" name=\"mode\" value=\"${esc(o.mode)}\">\n <input type=\"hidden\" name=\"scope\" value=\"${esc(o.scope)}\">\n ${o.endUserId ? `<input type=\"hidden\" name=\"end_user_id\" value=\"${esc(o.endUserId)}\">` : \"\"}\n ${fieldInput(\"client_id\", \"client id\")}\n ${fieldInput(\"client_secret\", \"client secret\")}\n <button class=\"t-btn t-btn--accent\">Connect with OAuth ${ARROW}</button>\n </form>\n </div>\n </div>`;\n return shell({\n title: `OAuth app for ${o.provider}`,\n host: o.host,\n chip: { dot: \"warning\", label: \"setup needed\" },\n headline: \"One app to register.\",\n lead: `This instance has no OAuth app for <code class=\"t-code\">${esc(o.provider)}</code> yet. Create one in the provider's developer console with the callback URL below, then continue to consent.`,\n body,\n securityNote: true,\n });\n}\n\nexport function messagePage(o: {\n host: string;\n title: string;\n chip: NonNullable<ShellOptions[\"chip\"]>;\n headline: string;\n lead: string;\n pre?: string;\n}): string {\n return shell({\n title: o.title,\n host: o.host,\n chip: o.chip,\n headline: o.headline,\n lead: o.lead,\n body: o.pre ? `<pre class=\"t-pre t-gap-top-24\">${esc(o.pre)}</pre>` : \"\",\n });\n}\n", "// Inbound trigger ingress. Generic webhooks: stable route per project+automation, latest\n// alias resolved at receive time (ADR-0013 spirit), version-pinned via @v. Connector\n// webhooks land on /ingress/c/:token and are demuxed by the trigger layer. Git pushes\n// land on /hooks/git/\u2026 and enqueue a reconcile.\n\nimport { createHmac, timingSafeEqual } from \"node:crypto\";\nimport { Hono } from \"hono\";\nimport type { Db } from \"../db/db.js\";\nimport type { Broker } from \"../broker/broker.js\";\nimport { createRun } from \"../engine/runs.js\";\nimport { enqueue } from \"../queue/queue.js\";\n\nexport interface IngressDeps {\n db: Db;\n broker: Broker;\n /** Connector-trigger demux (trigger layer); 404 until a registration exists. */\n connectorIngress?: (\n ingressToken: string,\n req: { headers: Record<string, string>; query: Record<string, string>; rawBody: Uint8Array },\n ) => Promise<{ status: number; body: string; contentType?: string }>;\n}\n\nfunction headersToRecord(h: Headers): Record<string, string> {\n const out: Record<string, string> = {};\n h.forEach((v, k) => {\n out[k.toLowerCase()] = v;\n });\n return out;\n}\n\nfunction safeEqualString(a: string, b: string): boolean {\n const ab = Buffer.from(a);\n const bb = Buffer.from(b);\n return ab.length === bb.length && timingSafeEqual(ab, bb);\n}\n\nfunction verifyGitWebhookSignature(headers: Headers, rawBody: Uint8Array, secret: string): boolean {\n const expected = createHmac(\"sha256\", secret).update(rawBody).digest(\"hex\");\n const github = headers.get(\"x-hub-signature-256\");\n if (github?.startsWith(\"sha256=\") && safeEqualString(github.slice(\"sha256=\".length), expected)) return true;\n const tesser = headers.get(\"x-tesser-signature\");\n if (tesser?.startsWith(\"sha256=\") && safeEqualString(tesser.slice(\"sha256=\".length), expected)) return true;\n return false;\n}\n\nexport function createIngress(deps: IngressDeps): Hono {\n const app = new Hono();\n\n // Generic inbound webhook trigger (onWebhook). Public by design: verification is the\n // author's contract via ctx.request + a signing secret (ADR-0010 escape hatch).\n app.post(\"/hooks/:project/:automation{[a-z0-9-]+(@v[0-9]+)?}\", async (c) => {\n const projectName = c.req.param(\"project\");\n const autoParam = c.req.param(\"automation\");\n const pinMatch = /^(?<id>[a-z0-9-]+?)(?:@v(?<v>\\d+))?$/.exec(autoParam);\n const automationId = pinMatch?.groups?.[\"id\"] ?? autoParam;\n const pinned = pinMatch?.groups?.[\"v\"];\n\n const { rows: projects } = await deps.db.query<{ id: string }>(\n `SELECT id FROM projects WHERE name=$1`,\n [projectName],\n );\n const project = projects[0];\n if (!project) return c.json({ error: { code: \"not-found\", message: \"unknown project\" } }, 404);\n\n let versionId: string | undefined;\n let manifest: { trigger?: { kind?: string; respond?: string } } = {};\n if (pinned !== undefined) {\n const { rows } = await deps.db.query<{ id: string; manifest: typeof manifest }>(\n `SELECT id, manifest FROM automation_versions WHERE project_id=$1 AND automation_id=$2 AND version=$3`,\n [project.id, automationId, Number(pinned)],\n );\n versionId = rows[0]?.id;\n manifest = rows[0]?.manifest ?? {};\n } else {\n const { rows } = await deps.db.query<{ version_id: string; manifest: typeof manifest }>(\n `SELECT a.version_id, v.manifest FROM aliases a JOIN automation_versions v ON v.id=a.version_id\n WHERE a.project_id=$1 AND a.automation_id=$2 AND a.env='production'`,\n [project.id, automationId],\n );\n versionId = rows[0]?.version_id;\n manifest = rows[0]?.manifest ?? {};\n }\n if (!versionId) return c.json({ error: { code: \"not-found\", message: \"automation not deployed\" } }, 404);\n if (manifest.trigger?.kind !== undefined && manifest.trigger.kind !== \"webhook\") {\n return c.json({ error: { code: \"wrong-trigger\", message: \"automation is not webhook-triggered\" } }, 404);\n }\n\n const rawBody = new Uint8Array(await c.req.arrayBuffer());\n let input: unknown;\n const text = new TextDecoder().decode(rawBody);\n try {\n input = text.length > 0 ? JSON.parse(text) : undefined;\n } catch {\n input = undefined; // non-JSON bodies stay reachable via ctx.request.rawBody\n }\n const query: Record<string, string> = {};\n for (const [k, v] of new URL(c.req.url).searchParams) query[k] = v;\n\n const runId = await createRun(deps.db, {\n projectId: project.id,\n automationId,\n versionId,\n trigger: {\n kind: \"webhook\",\n request: {\n headers: headersToRecord(c.req.raw.headers),\n query,\n rawBodyB64: Buffer.from(rawBody).toString(\"base64\"),\n },\n },\n ...(input !== undefined ? { input } : {}),\n });\n\n if (manifest.trigger?.respond === \"sync\") {\n const deadline = Date.now() + 30_000;\n while (Date.now() < deadline) {\n const { rows } = await deps.db.query<{ status: string; output: unknown; error: unknown }>(\n `SELECT status, output, error FROM runs WHERE id=$1`,\n [runId!],\n );\n const run = rows[0]!;\n if (run.status === \"completed\") return c.json({ runId, output: run.output });\n if (run.status === \"failed\" || run.status === \"cancelled\") {\n return c.json({ runId, error: run.error }, 502);\n }\n await new Promise((r) => setTimeout(r, 200));\n }\n }\n return c.json({ runId }, 202);\n });\n\n // Connector-trigger ingress (ADR-0013): stable per-registration URL.\n app.post(\"/ingress/c/:token\", async (c) => {\n if (!deps.connectorIngress) {\n return c.json({ error: { code: \"not-ready\", message: \"trigger ingress not configured\" } }, 503);\n }\n const rawBody = new Uint8Array(await c.req.arrayBuffer());\n const query: Record<string, string> = {};\n for (const [k, v] of new URL(c.req.url).searchParams) query[k] = v;\n const result = await deps.connectorIngress(c.req.param(\"token\"), {\n headers: headersToRecord(c.req.raw.headers),\n query,\n rawBody,\n });\n return c.newResponse(result.body, result.status as never, {\n \"content-type\": result.contentType ?? \"application/json\",\n });\n });\n\n // Git push webhook (ADR-0006 default sync path) \u2014 project id in path, HMAC over the\n // raw body with encrypted per-Project signing material. The secret never appears in\n // CLI/API JSON or URL paths.\n const enqueueReconcile = async (projectId: string): Promise<void> => {\n await deps.db.tx((t) =>\n enqueue(t, {\n kind: \"reconcile\",\n payload: { projectId },\n dedupeKey: `reconcile:${projectId}:default`,\n maxAttempts: 1,\n }),\n );\n };\n\n app.post(\"/hooks/git/:projectId/push\", async (c) => {\n const { rows } = await deps.db.query<{\n id: string;\n workspace_id: string;\n push_webhook_secret_cipher: string | null;\n }>(`SELECT id, workspace_id, push_webhook_secret_cipher FROM projects WHERE id=$1`, [c.req.param(\"projectId\")]);\n const project = rows[0];\n if (!project?.push_webhook_secret_cipher) {\n return c.json({ error: { code: \"not-found\", message: \"unknown hook\" } }, 404);\n }\n const rawBody = new Uint8Array(await c.req.arrayBuffer());\n const secret = await deps.broker.decryptValue(\n project.workspace_id,\n project.push_webhook_secret_cipher,\n \"project.webhook.signing\",\n );\n if (!verifyGitWebhookSignature(c.req.raw.headers, rawBody, secret)) {\n return c.json({ error: { code: \"unauthorized\", message: \"invalid hook signature\" } }, 401);\n }\n await enqueueReconcile(project.id);\n return c.json({ queued: true }, 202);\n });\n\n // Legacy v0 bootstrap route. Kept so Instances upgraded from the path-token webhook\n // can keep receiving pushes until the self-host administrator re-runs `tesser link`\n // and moves the git host to the HMAC `/push` route.\n app.post(\"/hooks/git/:projectId/:secret\", async (c) => {\n const { rows } = await deps.db.query<{ id: string; push_webhook_secret: string | null }>(\n `SELECT id, push_webhook_secret FROM projects WHERE id=$1`,\n [c.req.param(\"projectId\")],\n );\n const project = rows[0];\n if (!project?.push_webhook_secret || !safeEqualString(project.push_webhook_secret, c.req.param(\"secret\"))) {\n return c.json({ error: { code: \"not-found\", message: \"unknown hook\" } }, 404);\n }\n await enqueueReconcile(project.id);\n return c.json({ queued: true }, 202);\n });\n\n return app;\n}\n", "// The worker loop: long-poll claim \u2192 dispatch by job kind \u2192 complete/fail. Leases are\n// heartbeat-extended; a crashed worker's jobs are reclaimed on lease expiry (the\n// journal-of-results executor makes re-execution safe).\n\nimport type { Db } from \"../db/db.js\";\nimport { claim, complete, fail, heartbeat, type ClaimedJob } from \"./queue.js\";\n\nexport type JobHandler = (job: ClaimedJob) => Promise<void>;\n\nexport interface WorkerOpts {\n tags?: string[] | undefined;\n /** Job kinds this worker duty is allowed to claim. Omitted means all kinds. */\n kinds?: string[] | undefined;\n pollIntervalMs?: number;\n onError?: (err: unknown, job?: ClaimedJob) => void;\n}\n\nexport class Worker {\n private running = false;\n private loopPromise: Promise<void> | null = null;\n\n constructor(\n private readonly db: Db,\n private readonly handlers: Record<string, JobHandler>,\n private readonly opts: WorkerOpts = {},\n ) {}\n\n start(): void {\n if (this.running) return;\n this.running = true;\n this.loopPromise = this.loop();\n }\n\n async stop(): Promise<void> {\n this.running = false;\n await this.loopPromise;\n }\n\n /** Process every due job right now (test + reconcile-now convenience). */\n async drain(maxJobs = 1000): Promise<number> {\n let n = 0;\n while (n < maxJobs) {\n const job = await claim(this.db, this.opts.tags, this.opts.kinds);\n if (!job) break;\n await this.dispatch(job);\n n++;\n }\n return n;\n }\n\n private async loop(): Promise<void> {\n const pollMs = this.opts.pollIntervalMs ?? 250;\n while (this.running) {\n let job: ClaimedJob | null = null;\n try {\n job = await claim(this.db, this.opts.tags, this.opts.kinds);\n } catch (err) {\n this.opts.onError?.(err);\n }\n if (!job) {\n await new Promise((r) => setTimeout(r, pollMs));\n continue;\n }\n await this.dispatch(job);\n }\n }\n\n private async dispatch(job: ClaimedJob): Promise<void> {\n const handler = this.handlers[job.kind];\n const beat = setInterval(() => {\n void heartbeat(this.db, job.id).catch(() => {});\n }, 20_000);\n beat.unref?.();\n try {\n if (!handler) throw new Error(`no handler for job kind \"${job.kind}\"`);\n await handler(job);\n await complete(this.db, job.id);\n } catch (err) {\n this.opts.onError?.(err, job);\n await fail(this.db, job, (err as Error)?.stack ?? String(err)).catch(() => {});\n } finally {\n clearInterval(beat);\n }\n }\n}\n", "// Cron scheduler: schedules are synced from manifests on promote; a tick fires due ones\n// by creating runs (overlap policy is the automation's own `concurrency` \u2014 the engine\n// gates it). Cron parsing/tz via an internal dependency, never in the public surface.\n\nimport { Cron } from \"croner\";\nimport type { Db } from \"../db/db.js\";\nimport { createRun } from \"../engine/runs.js\";\n\nexport interface ScheduleSpec {\n automationId: string;\n cron: string;\n tz?: string | undefined;\n}\n\nexport function nextFire(cron: string, tz: string | undefined, after = new Date()): Date | null {\n const c = new Cron(cron, { timezone: tz ?? \"UTC\" });\n return c.nextRun(after);\n}\n\n/** Reconcile a project+env's schedules to exactly `specs` (called on promote). */\nexport async function syncSchedules(\n db: Db,\n projectId: string,\n env: string,\n specs: ScheduleSpec[],\n): Promise<void> {\n await db.tx(async (c) => {\n const ids = specs.map((s) => s.automationId);\n if (ids.length === 0) {\n await c.query(`DELETE FROM schedules WHERE project_id=$1 AND env=$2`, [projectId, env]);\n return;\n }\n await c.query(\n `DELETE FROM schedules WHERE project_id=$1 AND env=$2 AND NOT (automation_id = ANY($3))`,\n [projectId, env, ids],\n );\n for (const spec of specs) {\n const fire = nextFire(spec.cron, spec.tz);\n await c.query(\n `INSERT INTO schedules (project_id, automation_id, env, cron, tz, enabled, next_fire)\n VALUES ($1,$2,$3,$4,$5,true,$6)\n ON CONFLICT (project_id, automation_id, env) DO UPDATE\n SET cron = EXCLUDED.cron,\n tz = EXCLUDED.tz,\n enabled = true,\n -- recompute only when the cron/tz changed; otherwise keep the watermark\n next_fire = CASE\n WHEN schedules.cron <> EXCLUDED.cron OR schedules.tz IS DISTINCT FROM EXCLUDED.tz\n THEN EXCLUDED.next_fire\n ELSE schedules.next_fire\n END`,\n [projectId, spec.automationId, env, spec.cron, spec.tz ?? null, fire?.toISOString() ?? null],\n );\n }\n });\n}\n\n/** Fire everything due. Returns created run ids. Safe under concurrent tickers\n * (FOR UPDATE SKIP LOCKED on the schedule rows). */\nexport async function schedulerTick(db: Db, now = new Date()): Promise<string[]> {\n const created: string[] = [];\n // Claim due schedules one at a time \u2014 each fire commits independently.\n for (;;) {\n const fired = await db.tx(async (c) => {\n const { rows } = await c.query<{\n project_id: string;\n automation_id: string;\n env: string;\n cron: string;\n tz: string | null;\n next_fire: string;\n }>(\n `SELECT project_id, automation_id, env, cron, tz, next_fire FROM schedules\n WHERE enabled AND next_fire IS NOT NULL AND next_fire <= $1\n FOR UPDATE SKIP LOCKED LIMIT 1`,\n [now.toISOString()],\n );\n const due = rows[0];\n if (!due) return null;\n\n const next = nextFire(due.cron, due.tz ?? undefined, now);\n await c.query(\n `UPDATE schedules SET next_fire=$4 WHERE project_id=$1 AND automation_id=$2 AND env=$3`,\n [due.project_id, due.automation_id, due.env, next?.toISOString() ?? null],\n );\n\n const alias = await c.query<{ version_id: string }>(\n `SELECT version_id FROM aliases WHERE project_id=$1 AND automation_id=$2 AND env=$3`,\n [due.project_id, due.automation_id, due.env],\n );\n const versionId = alias.rows[0]?.version_id;\n if (!versionId) return \"no-alias\";\n\n const runId = await createRun(c, {\n projectId: due.project_id,\n automationId: due.automation_id,\n versionId,\n env: due.env,\n trigger: { kind: \"schedule\", cron: due.cron, scheduledFor: due.next_fire },\n });\n return runId;\n });\n if (fired === null) break;\n if (typeof fired === \"string\" && fired !== \"no-alias\") created.push(fired);\n }\n return created;\n}\n\nexport function startScheduler(db: Db, opts: { intervalMs?: number; onError?: (e: unknown) => void } = {}): () => void {\n const interval = setInterval(() => {\n schedulerTick(db).catch((e) => opts.onError?.(e));\n }, opts.intervalMs ?? 5_000);\n interval.unref?.();\n return () => clearInterval(interval);\n}\n", "// Dead-work reaper: repairs queue/run states that cannot make progress, while leaving\n// intentionally suspended runs alone (Signal waits, wake times, durable waits).\n\nimport type { Db } from \"../db/db.js\";\n\nexport interface DeadWorkRecoveryOpts {\n now?: Date | undefined;\n /** How old a queued/running run must be before missing run jobs are repaired. */\n leaseGraceMs?: number | undefined;\n}\n\nexport interface DeadWorkRecoveryReport {\n deadRunJobsFailed: number;\n orphanedRunsReenqueued: number;\n}\n\nconst DEFAULT_LEASE_GRACE_MS = 2 * 60 * 1000;\nconst DEFAULT_REAPER_INTERVAL_MS = 30_000;\n\nexport async function recoverDeadWork(db: Db, opts: DeadWorkRecoveryOpts = {}): Promise<DeadWorkRecoveryReport> {\n const now = opts.now ?? new Date();\n const staleBefore = new Date(now.getTime() - (opts.leaseGraceMs ?? DEFAULT_LEASE_GRACE_MS));\n\n const failed = await db.query(\n `WITH dead_run_jobs AS (\n SELECT q.id, q.kind, q.payload->>'runId' AS run_id, q.last_error\n FROM queue_jobs q\n JOIN runs r ON r.id::text = q.payload->>'runId'\n WHERE q.kind = 'run'\n AND q.status = 'dead'\n AND r.status IN ('queued','running')\n )\n UPDATE runs r\n SET status = 'failed',\n error = jsonb_build_object(\n 'name', 'DeadRunJob',\n 'code', 'dead_run_job',\n 'message', 'run job attempts exhausted',\n 'jobId', dead_run_jobs.id::text,\n 'jobKind', dead_run_jobs.kind,\n 'lastError', dead_run_jobs.last_error\n ),\n finished_at = $1\n FROM dead_run_jobs\n WHERE r.id::text = dead_run_jobs.run_id`,\n [now.toISOString()],\n );\n\n const reenqueue = await db.query<{ count: string }>(\n `WITH stale_runs AS (\n SELECT r.id\n FROM runs r\n WHERE r.status IN ('queued','running')\n AND COALESCE(r.started_at, r.created_at) <= $1\n AND NOT EXISTS (\n SELECT 1 FROM queue_jobs q\n WHERE q.kind = 'run'\n AND q.payload->>'runId' = r.id::text\n AND q.status = 'ready'\n )\n AND NOT EXISTS (\n SELECT 1 FROM queue_jobs q\n WHERE q.kind = 'run'\n AND q.payload->>'runId' = r.id::text\n AND q.status = 'dead'\n )\n ), inserted AS (\n INSERT INTO queue_jobs (kind, payload, dedupe_key, run_at)\n SELECT 'run', jsonb_build_object('runId', id::text), 'run:' || id::text, $2\n FROM stale_runs\n ON CONFLICT (dedupe_key) WHERE dedupe_key IS NOT NULL DO UPDATE\n SET run_at = LEAST(queue_jobs.run_at, EXCLUDED.run_at),\n status = 'ready',\n payload = EXCLUDED.payload\n RETURNING 1\n )\n SELECT count(*)::text AS count FROM inserted`,\n [staleBefore.toISOString(), now.toISOString()],\n );\n\n return {\n deadRunJobsFailed: failed.rowCount,\n orphanedRunsReenqueued: Number(reenqueue.rows[0]?.count ?? 0),\n };\n}\n\nexport function startReaper(\n db: Db,\n opts: { intervalMs?: number | undefined; leaseGraceMs?: number | undefined; onError?: (e: unknown) => void } = {},\n): () => void {\n let inFlight = false;\n const tick = () => {\n if (inFlight) return;\n inFlight = true;\n void recoverDeadWork(db, { leaseGraceMs: opts.leaseGraceMs })\n .catch((e) => opts.onError?.(e))\n .finally(() => {\n inFlight = false;\n });\n };\n const interval = setInterval(tick, opts.intervalMs ?? DEFAULT_REAPER_INTERVAL_MS);\n interval.unref?.();\n tick();\n return () => clearInterval(interval);\n}\n", "// Artifact loader: versionId \u2192 the automation def from its immutable bundle. Bundles are\n// content-addressed and immutable, so the cache never invalidates. Test seam included.\n\nimport { pathToFileURL } from \"node:url\";\nimport type { AutomationDef } from \"@devosurf/tesser-sdk\";\nimport type { Db } from \"../db/db.js\";\n\nexport class ArtifactLoader {\n private cache = new Map<string, Promise<AutomationDef<any, any, any, any, any, any, any>>>();\n private injected = new Map<string, AutomationDef<any, any, any, any, any, any, any>>();\n\n constructor(private readonly db: Db) {}\n\n /** Tests (and the reconciler, right after extraction) hand defs over directly. */\n inject(versionId: string, def: AutomationDef<any, any, any, any, any, any, any>): void {\n this.injected.set(versionId, def);\n }\n\n load = async (versionId: string): Promise<AutomationDef<any, any, any, any, any, any, any>> => {\n const injected = this.injected.get(versionId);\n if (injected) return injected;\n let p = this.cache.get(versionId);\n if (!p) {\n p = (async () => {\n const { rows } = await this.db.query<{ bundle_path: string }>(\n `SELECT bundle_path FROM automation_versions WHERE id=$1`,\n [versionId],\n );\n if (!rows[0]) throw new Error(`no automation version ${versionId}`);\n const mod = (await import(pathToFileURL(rows[0].bundle_path).href)) as {\n default?: AutomationDef<any, any, any, any, any, any, any>;\n };\n if (!mod.default) throw new Error(`bundle missing default export: ${rows[0].bundle_path}`);\n return mod.default;\n })();\n this.cache.set(versionId, p);\n p.catch(() => this.cache.delete(versionId));\n }\n return p;\n };\n}\n", "// Connector-webhook ingress demux (ADR-0013): verify by the connector's declared scheme,\n// answer endpoint challenges, identify the event, dedup by delivery id, fan out across\n// every registration sharing the connector+connection (app-level URLs like Slack's serve\n// several triggers), map \u2192 typed payload \u2192 one durable run each.\n\nimport type { InboundWebhookEvent } from \"@devosurf/tesser-sdk/connector\";\nimport { validateSchema, verifyInboundEvent } from \"@devosurf/tesser-sdk/internal\";\nimport { createHash } from \"node:crypto\";\nimport { createRun } from \"../engine/runs.js\";\nimport {\n isWebhookDecl,\n loadTriggerState,\n pruneSeen,\n resolveLiveTrigger,\n saveTriggerState,\n type TriggerLayerDeps,\n} from \"./shared.js\";\n\ninterface IngressResult {\n status: number;\n body: string;\n contentType?: string;\n}\n\nconst json = (status: number, body: unknown): IngressResult => ({ status, body: JSON.stringify(body) });\n\nexport function createConnectorIngress(deps: TriggerLayerDeps) {\n return async function connectorIngress(\n ingressToken: string,\n req: { headers: Record<string, string>; query: Record<string, string>; rawBody: Uint8Array },\n ): Promise<IngressResult> {\n const { rows } = await deps.db.query<{\n id: string;\n project_id: string;\n automation_id: string;\n trigger_id: string;\n connector_id: string;\n connection_id: string;\n env: string;\n status: string;\n signing_secret_cipher: string | null;\n }>(`SELECT * FROM webhook_registrations WHERE ingress_token=$1`, [ingressToken]);\n const reg = rows[0];\n if (!reg || ![\"registered\", \"manual-pending\"].includes(reg.status)) {\n return json(404, { error: \"unknown ingress\" });\n }\n\n const resolved = await resolveLiveTrigger(deps, reg.project_id, reg.automation_id, reg.env).catch(() => null);\n if (!resolved || !isWebhookDecl(resolved.decl)) return json(404, { error: \"trigger not live\" });\n const webhook = resolved.connector.__connector.webhook;\n if (!webhook) return json(500, { error: \"connector has no webhook config\" });\n\n let body: unknown;\n try {\n body = JSON.parse(new TextDecoder().decode(req.rawBody));\n } catch {\n body = undefined;\n }\n const event: InboundWebhookEvent = { headers: req.headers, query: req.query, rawBody: req.rawBody, json: body };\n\n // Endpoint verification handshakes (Slack url_verification) answer BEFORE signature\n // checks \u2014 Slack signs them, but a manual-pending registration has no secret yet.\n const challenge = webhook.challenge?.(event);\n if (challenge !== null && challenge !== undefined) {\n return { status: 200, body: challenge, contentType: \"text/plain\" };\n }\n\n if (reg.status !== \"registered\" || reg.signing_secret_cipher === null) {\n return json(409, { error: \"registration incomplete \u2014 signing secret not configured\" });\n }\n const { rows: wsRows } = await deps.db.query<{ workspace_id: string }>(\n `SELECT workspace_id FROM projects WHERE id=$1`,\n [reg.project_id],\n );\n const secret = await deps.broker.decryptValue(wsRows[0]!.workspace_id, reg.signing_secret_cipher, \"webhook.signing\");\n if (!(await verifyInboundEvent(webhook.verify, event, secret))) {\n return json(401, { error: \"signature verification failed\" });\n }\n\n const identified = webhook.identify(event);\n if (!identified) return json(400, { error: \"unrecognized event\" });\n const deliveryId =\n identified.deliveryId ?? createHash(\"sha256\").update(req.rawBody).digest(\"hex\").slice(0, 24);\n\n // Fan out across all live registrations sharing connector+connection (one app-level\n // URL can serve several triggers) \u2014 the receiving registration's siblings included.\n const { rows: siblings } = await deps.db.query<{\n id: string;\n automation_id: string;\n trigger_id: string;\n connection_id: string;\n status: string;\n }>(\n `SELECT id, automation_id, trigger_id, connection_id, status FROM webhook_registrations\n WHERE project_id=$1 AND env=$2 AND connector_id=$3 AND connection_id=$4 AND status='registered'`,\n [reg.project_id, reg.env, reg.connector_id, reg.connection_id],\n );\n\n let fired = 0;\n for (const sib of siblings) {\n const sibResolved =\n sib.id === reg.id\n ? resolved\n : await resolveLiveTrigger(deps, reg.project_id, sib.automation_id, reg.env).catch(() => null);\n if (!sibResolved || !isWebhookDecl(sibResolved.decl)) continue;\n if (sibResolved.decl.event !== identified.event) continue;\n\n const stateKey = {\n projectId: reg.project_id,\n automationId: sib.automation_id,\n triggerId: sib.trigger_id,\n connectionId: sib.connection_id,\n };\n const state = await loadTriggerState(deps.db, stateKey, \"webhook\");\n const seen = new Map(pruneSeen(state.seen, Date.now()));\n if (seen.has(deliveryId)) continue; // provider redelivery \u2192 drop\n\n const mapped = await sibResolved.decl.map(identified.payload ?? body, sibResolved.params);\n if (mapped === null) {\n seen.set(deliveryId, Date.now());\n await saveTriggerState(deps.db, stateKey, { seen: [...seen.entries()], seeded: true });\n continue;\n }\n const validated = await validateSchema(\n sibResolved.decl.output,\n mapped,\n `${reg.connector_id}.triggers.${sib.trigger_id} payload`,\n );\n await createRun(deps.db, {\n projectId: reg.project_id,\n automationId: sib.automation_id,\n versionId: sibResolved.versionId,\n env: reg.env,\n trigger: {\n kind: \"connector\",\n connector: reg.connector_id,\n trigger: sib.trigger_id,\n strategy: \"webhook\",\n deliveryId,\n event: identified.event,\n connectionId: sib.connection_id,\n ...(sibResolved.connection.end_user_id !== null\n ? { endUserId: sibResolved.connection.end_user_id }\n : {}),\n },\n input: validated,\n });\n seen.set(deliveryId, Date.now());\n await saveTriggerState(deps.db, stateKey, { seen: [...seen.entries()], seeded: true, touch: \"delivery\" });\n fired++;\n }\n return json(202, { ok: true, fired });\n };\n}\n", "// Shared plumbing for the connector-trigger layer (ADR-0013): resolve a live automation\n// version to its def + connector instance + trigger declaration, and manage the\n// version-independent trigger state (windowed seen-set keyed by automation+trigger+connection).\n\nimport { TerminalError, type AutomationDef } from \"@devosurf/tesser-sdk\";\nimport type {\n AnyTriggerDecl,\n ConnectorInstance,\n PollTriggerDecl,\n WebhookTriggerDecl,\n} from \"@devosurf/tesser-sdk/connector\";\nimport { decodeJournal, validateSchema, type JsonValue } from \"@devosurf/tesser-sdk/internal\";\nimport type { Db } from \"../db/db.js\";\nimport type { Broker, ConnectionRow } from \"../broker/broker.js\";\n\nexport interface TriggerLayerDeps {\n db: Db;\n broker: Broker;\n baseUrl: string;\n loadAutomation(versionId: string): Promise<AutomationDef<any, any, any, any, any, any, any>>;\n fetchImpl?: typeof fetch | undefined;\n}\n\nexport interface ConnectorTriggerManifest {\n kind: \"connector\";\n connector: string;\n trigger: string;\n params: JsonValue;\n connection: string;\n every?: string;\n}\n\nexport interface ResolvedTrigger {\n projectId: string;\n workspaceId: string;\n automationId: string;\n env: string;\n versionId: string;\n def: AutomationDef<any, any, any, any, any, any, any>;\n manifest: ConnectorTriggerManifest;\n connector: ConnectorInstance<any, any>;\n decl: AnyTriggerDecl;\n /** Validated trigger params (decl.input). */\n params: unknown;\n connection: ConnectionRow;\n}\n\nexport function isPollDecl(d: AnyTriggerDecl): d is PollTriggerDecl<any, any, any> {\n return d.__trigger === \"poll\";\n}\nexport function isWebhookDecl(d: AnyTriggerDecl): d is WebhookTriggerDecl<any, any> {\n return d.__trigger === \"webhook\";\n}\n\n/** Resolve everything a poll/delivery needs from the CURRENT live alias \u2014 the stable\n * registration outlives versions; the version is resolved at fire time (ADR-0013). */\nexport async function resolveLiveTrigger(\n deps: TriggerLayerDeps,\n projectId: string,\n automationId: string,\n env: string,\n): Promise<ResolvedTrigger | null> {\n const { rows } = await deps.db.query<{\n version_id: string;\n manifest: { trigger?: ConnectorTriggerManifest };\n workspace_id: string;\n }>(\n `SELECT a.version_id, v.manifest, p.workspace_id\n FROM aliases a\n JOIN automation_versions v ON v.id = a.version_id\n JOIN projects p ON p.id = a.project_id\n WHERE a.project_id=$1 AND a.automation_id=$2 AND a.env=$3`,\n [projectId, automationId, env],\n );\n const row = rows[0];\n if (!row || row.manifest.trigger?.kind !== \"connector\") return null;\n const manifest = row.manifest.trigger;\n\n const def = await deps.loadAutomation(row.version_id);\n const connector = (def.connections as Record<string, ConnectorInstance<any, any>> | undefined)?.[\n manifest.connection\n ];\n if (!connector || connector.id !== manifest.connector) {\n throw new TerminalError(\n `automation ${automationId}: trigger connection \"${manifest.connection}\" missing from the loaded bundle`,\n );\n }\n const decl = connector.__connector.triggers?.[manifest.trigger];\n if (!decl) {\n throw new TerminalError(`connector ${manifest.connector} has no trigger \"${manifest.trigger}\"`);\n }\n\n const conn = await deps.broker.resolveBinding({\n workspaceId: row.workspace_id,\n projectId,\n automationId,\n env,\n reqKey: manifest.connection,\n connectorId: manifest.connector,\n scope: connector.scope ?? \"workspace\",\n });\n if (!conn) return null; // connection went away \u2192 trigger dormant until reconnected\n\n const params = await validateSchema(\n decl.input,\n decodeJournal(manifest.params),\n `${manifest.connector}.triggers.${manifest.trigger} params`,\n );\n\n return {\n projectId,\n workspaceId: row.workspace_id,\n automationId,\n env,\n versionId: row.version_id,\n def,\n manifest,\n connector,\n decl,\n params,\n connection: conn,\n };\n}\n\n// ---- windowed seen-set (version-independent dedup, ADR-0013) ----\n\nconst SEEN_WINDOW_MS = 14 * 24 * 3600 * 1000;\nconst SEEN_MAX = 2000;\n\nexport interface TriggerState {\n seen: Array<[string, number]>;\n cursor: JsonValue | null;\n seeded: boolean;\n}\n\nexport async function loadTriggerState(\n db: Db,\n key: { projectId: string; automationId: string; triggerId: string; connectionId: string },\n kind: \"poll\" | \"webhook\",\n): Promise<TriggerState> {\n const { rows } = await db.query<{ seen: Array<[string, number]>; cursor: JsonValue | null; seeded: boolean }>(\n `SELECT seen, cursor, seeded FROM trigger_state\n WHERE project_id=$1 AND automation_id=$2 AND trigger_id=$3 AND connection_id=$4`,\n [key.projectId, key.automationId, key.triggerId, key.connectionId],\n );\n if (rows[0]) return rows[0];\n await db.query(\n `INSERT INTO trigger_state (project_id, automation_id, trigger_id, connection_id, kind)\n VALUES ($1,$2,$3,$4,$5) ON CONFLICT DO NOTHING`,\n [key.projectId, key.automationId, key.triggerId, key.connectionId, kind],\n );\n return { seen: [], cursor: null, seeded: false };\n}\n\nexport function pruneSeen(seen: Array<[string, number]>, nowMs: number): Array<[string, number]> {\n const cutoff = nowMs - SEEN_WINDOW_MS;\n const pruned = seen.filter(([, ts]) => ts >= cutoff);\n return pruned.length > SEEN_MAX ? pruned.slice(pruned.length - SEEN_MAX) : pruned;\n}\n\nexport async function saveTriggerState(\n db: Db,\n key: { projectId: string; automationId: string; triggerId: string; connectionId: string },\n state: { seen?: Array<[string, number]>; cursor?: JsonValue | null; seeded?: boolean; touch?: \"poll\" | \"delivery\" },\n): Promise<void> {\n const sets: string[] = [];\n const params: unknown[] = [key.projectId, key.automationId, key.triggerId, key.connectionId];\n if (state.seen !== undefined) {\n params.push(JSON.stringify(state.seen));\n sets.push(`seen = $${params.length}::jsonb`);\n }\n if (state.cursor !== undefined) {\n params.push(state.cursor === null ? null : JSON.stringify(state.cursor));\n sets.push(`cursor = $${params.length}::jsonb`);\n }\n if (state.seeded !== undefined) {\n params.push(state.seeded);\n sets.push(`seeded = $${params.length}`);\n }\n if (state.touch === \"poll\") sets.push(`last_poll_at = now()`);\n if (state.touch === \"delivery\") sets.push(`last_delivery_at = now()`);\n if (sets.length === 0) return;\n await db.query(\n `UPDATE trigger_state SET ${sets.join(\", \")}\n WHERE project_id=$1 AND automation_id=$2 AND trigger_id=$3 AND connection_id=$4`,\n params,\n );\n}\n", "// Poll-strategy connector triggers (ADR-0013): the runtime owns the loop \u2014 windowed\n// seen-set dedup by the author's dedupeKey, seed-without-firing on first activation,\n// one independent durable run per new item (oldest-first), opt-in cursor mode,\n// self-rescheduling with the author's `every` clamped to the connector floor + stagger.\n\nimport { encodeJournal, parseDuration, validateSchema, type JsonValue } from \"@devosurf/tesser-sdk/internal\";\nimport type { Db, DbClient } from \"../db/db.js\";\nimport { createRun } from \"../engine/runs.js\";\nimport { enqueue } from \"../queue/queue.js\";\nimport { authDeclFor, makeActionCtx, providerFactsOf } from \"../broker/connections.js\";\nimport {\n isPollDecl,\n loadTriggerState,\n pruneSeen,\n resolveLiveTrigger,\n saveTriggerState,\n type TriggerLayerDeps,\n} from \"./shared.js\";\n\nexport interface PollJobPayload {\n projectId: string;\n automationId: string;\n env: string;\n}\n\nexport function pollDedupeKey(p: PollJobPayload): string {\n return `trigger-poll:${p.projectId}:${p.automationId}:${p.env}`;\n}\n\nexport function pollIntervalMs(decl: { interval?: { default: string; floor?: string } }, every?: string): number {\n const defaultMs = parseDuration(decl.interval?.default ?? \"2m\", \"trigger interval\");\n const floorMs = parseDuration(decl.interval?.floor ?? \"30s\", \"trigger interval floor\");\n if (every === undefined) return Math.max(defaultMs, floorMs);\n return Math.max(parseDuration(every, \"trigger `every`\"), floorMs);\n}\n\nexport async function schedulePoll(\n client: DbClient,\n payload: PollJobPayload,\n delayMs: number,\n stagger = true,\n): Promise<void> {\n // Stagger \u00B110% so many triggers on one cadence don't thundering-herd a provider.\n const jitter = stagger ? delayMs * (Math.random() * 0.2 - 0.1) : 0;\n await enqueue(client, {\n kind: \"trigger-poll\",\n payload: payload as never,\n runAtMs: Date.now() + Math.max(1000, delayMs + jitter),\n dedupeKey: pollDedupeKey(payload),\n maxAttempts: 5,\n });\n}\n\n/** Execute one poll for one (automation, trigger, connection); reschedules itself. */\nexport async function runPoll(deps: TriggerLayerDeps, payload: PollJobPayload): Promise<{ fired: number } | null> {\n const resolved = await resolveLiveTrigger(deps, payload.projectId, payload.automationId, payload.env);\n if (!resolved) return null; // undeployed / connection missing \u2192 stop rescheduling\n const { decl, manifest } = resolved;\n if (!isPollDecl(decl)) return null;\n\n const reschedule = async (db: Db) => {\n await db.tx((c) => schedulePoll(c, payload, pollIntervalMs(decl, manifest.every)));\n };\n\n const stateKey = {\n projectId: payload.projectId,\n automationId: payload.automationId,\n triggerId: manifest.trigger,\n connectionId: resolved.connection.id,\n };\n\n try {\n const bundle = await deps.broker.freshCredential(\n resolved.connection.id,\n providerFactsOf(resolved.connector.__connector)?.oauth2,\n );\n const actx = makeActionCtx({\n spec: resolved.connector.__connector,\n decl: authDeclFor(resolved.connector.__connector, resolved.connection.auth_mode),\n conn: resolved.connection,\n facts: providerFactsOf(resolved.connector.__connector),\n fields: bundle.fields,\n broker: deps.broker,\n fetchImpl: deps.fetchImpl,\n });\n\n const state = await loadTriggerState(deps.db, stateKey, \"poll\");\n const polled = await decl.poll(actx, resolved.params, state.cursor ?? undefined);\n const items: unknown[] = Array.isArray(polled) ? polled : polled.items;\n const nextCursor = Array.isArray(polled) ? undefined : polled.nextCursor;\n\n const now = Date.now();\n const seen = new Map(pruneSeen(state.seen, now));\n let fired = 0;\n\n if (!state.seeded) {\n // First activation: seed without firing \u2014 turning a trigger on never floods (ADR-0013).\n for (const item of items) seen.set(decl.dedupeKey(item), now);\n } else {\n const fresh = items.filter((item) => !seen.has(decl.dedupeKey(item)));\n // Fire oldest-first regardless of the provider's natural order.\n const ordered = (decl.order ?? \"newest-first\") === \"newest-first\" ? [...fresh].reverse() : fresh;\n for (const item of ordered) {\n const key = decl.dedupeKey(item);\n const mapped = decl.map ? await decl.map(item, resolved.params) : item;\n const validated = await validateSchema(\n decl.output,\n mapped,\n `${manifest.connector}.triggers.${manifest.trigger} payload`,\n );\n await createRun(deps.db, {\n projectId: payload.projectId,\n automationId: payload.automationId,\n versionId: resolved.versionId,\n env: payload.env,\n trigger: {\n kind: \"connector\",\n connector: manifest.connector,\n trigger: manifest.trigger,\n strategy: \"poll\",\n itemKey: key,\n connectionId: resolved.connection.id,\n ...(resolved.connection.end_user_id !== null ? { endUserId: resolved.connection.end_user_id } : {}),\n },\n input: validated,\n });\n seen.set(key, now);\n fired++;\n }\n }\n\n await saveTriggerState(deps.db, stateKey, {\n seen: [...seen.entries()],\n ...(nextCursor !== undefined ? { cursor: encodeJournal(nextCursor) as JsonValue } : {}),\n seeded: true,\n touch: \"poll\",\n });\n return { fired };\n } finally {\n await reschedule(deps.db);\n }\n}\n\n/** Activate polling for every live connector-poll trigger of a project+env (on promote). */\nexport async function activatePolls(\n deps: TriggerLayerDeps,\n projectId: string,\n env: string,\n): Promise<number> {\n if (env !== \"production\") return 0; // preview is trigger-inert (ADR-0013)\n const { rows } = await deps.db.query<{ automation_id: string; manifest: { trigger?: { kind?: string } } }>(\n `SELECT a.automation_id, v.manifest FROM aliases a JOIN automation_versions v ON v.id=a.version_id\n WHERE a.project_id=$1 AND a.env=$2`,\n [projectId, env],\n );\n let activated = 0;\n for (const row of rows) {\n if (row.manifest.trigger?.kind !== \"connector\") continue;\n const resolved = await resolveLiveTrigger(deps, projectId, row.automation_id, env).catch(() => null);\n if (!resolved || !isPollDecl(resolved.decl)) continue;\n await deps.db.tx((c) =>\n schedulePoll(c, { projectId, automationId: row.automation_id, env }, 1500, false),\n );\n activated++;\n }\n return activated;\n}\n", "// The reconciler (ADR-0006): git \u2192 instance, one-way. Clone/fetch the commit, content-\n// hash-diff each automation directory, build only the changed ones into immutable staged\n// versions, halt on missing credentials (connect link), gate on tests (auto smoke), and\n// only on green swap aliases \u2014 red leaves production untouched. Then wire schedules,\n// event subscriptions, webhook registrations, and polls. Undeployed automations are\n// unaliased and their provider hooks destroyed.\n\nimport { execFile } from \"node:child_process\";\nimport { mkdirSync, existsSync, rmSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { smokeTest } from \"@devosurf/tesser-testing\";\nimport type { Db } from \"../db/db.js\";\nimport type { Broker } from \"../broker/broker.js\";\nimport {\n computeMissingRequirements,\n mintConnectLink,\n type AutomationRequirementSource,\n type Requirement,\n} from \"../broker/connect.js\";\nimport { syncSchedules, type ScheduleSpec } from \"../scheduler/cron.js\";\nimport { syncSubscriptions } from \"../events/fanout.js\";\nimport { ensureRegistrations } from \"../triggers/registrar.js\";\nimport { activatePolls } from \"../triggers/poll.js\";\nimport type { TriggerLayerDeps } from \"../triggers/shared.js\";\nimport type { ArtifactLoader } from \"../registry/loader.js\";\nimport { buildAutomationBundle, discoverAutomations, extractBundle } from \"./build.js\";\n\nconst exec = promisify(execFile);\n\nexport interface ReconcilerDeps {\n db: Db;\n broker: Broker;\n loader: ArtifactLoader;\n dataDir: string;\n baseUrl: string;\n triggerDeps: TriggerLayerDeps;\n /** Run colocated project tests as the deploy gate (in addition to auto smoke). */\n runProjectTests?: boolean;\n}\n\nexport interface DeployReport {\n sha: string;\n ref: string;\n env: string;\n built: string[];\n unchanged: string[];\n failed: Array<{ automation: string; stage: \"build\" | \"test\"; reason: string }>;\n removed: string[];\n connectUrl?: string;\n requirements?: Requirement[];\n manual?: Array<{ automation: string; trigger: string }>;\n}\n\nasync function git(args: string[], cwd?: string, env?: Record<string, string>): Promise<string> {\n const { stdout } = await exec(\"git\", args, {\n ...(cwd !== undefined ? { cwd } : {}),\n env: { ...process.env, GIT_TERMINAL_PROMPT: \"0\", ...env },\n maxBuffer: 16 * 1024 * 1024,\n });\n return stdout.trim();\n}\n\nasync function syncWorkdir(opts: {\n dataDir: string;\n projectId: string;\n repoUrl: string;\n ref: string;\n sshKeyPath?: string | undefined;\n}): Promise<{ dir: string; sha: string }> {\n const dir = join(opts.dataDir, \"repos\", opts.projectId);\n const env: Record<string, string> = {};\n if (opts.sshKeyPath !== undefined) {\n env[\"GIT_SSH_COMMAND\"] = `ssh -i ${opts.sshKeyPath} -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new`;\n }\n const localRepoPath = localPathForGitSafeDirectory(opts.repoUrl);\n if (localRepoPath !== undefined) {\n const gitConfigDir = join(opts.dataDir, \"git-config\");\n mkdirSync(gitConfigDir, { recursive: true, mode: 0o700 });\n const gitConfigPath = join(gitConfigDir, `${opts.projectId}.gitconfig`);\n writeFileSync(gitConfigPath, `[safe]\\n\\tdirectory = ${localRepoPath}\\n`, { mode: 0o600 });\n env[\"GIT_CONFIG_GLOBAL\"] = gitConfigPath;\n }\n if (!existsSync(join(dir, \".git\"))) {\n rmSync(dir, { recursive: true, force: true });\n mkdirSync(dir, { recursive: true });\n await git([\"clone\", \"--no-single-branch\", opts.repoUrl, dir], undefined, env);\n } else {\n await git([\"fetch\", \"origin\", \"--prune\"], dir, env);\n }\n await git([\"checkout\", \"--force\", opts.ref], dir, env).catch(async () => {\n await git([\"checkout\", \"--force\", `origin/${opts.ref}`], dir, env);\n });\n // fast-forward to remote when the ref is a branch\n await git([\"reset\", \"--hard\", `origin/${opts.ref}`], dir, env).catch(() => {});\n const sha = await git([\"rev-parse\", \"HEAD\"], dir);\n return { dir, sha };\n}\n\nfunction localPathForGitSafeDirectory(repoUrl: string): string | undefined {\n if (repoUrl.startsWith(\"/\")) return repoUrl;\n if (repoUrl.startsWith(\"file://\")) {\n try {\n return new URL(repoUrl).pathname;\n } catch {\n return undefined;\n }\n }\n return undefined;\n}\n\nasync function installDeps(dir: string): Promise<void> {\n // Install only when a lockfile pins the dependency graph (reproducible builds,\n // ADR-0006). Lockfile-less trees resolve from their surroundings (dev/dogfood lane).\n const runner = existsSync(join(dir, \"pnpm-lock.yaml\"))\n ? [\"pnpm\", [\"install\", \"--ignore-scripts\", \"--prefer-offline\", \"--frozen-lockfile\"]]\n : existsSync(join(dir, \"package-lock.json\"))\n ? [\"npm\", [\"ci\", \"--ignore-scripts\", \"--no-audit\", \"--no-fund\"]]\n : null;\n if (!runner) return;\n await exec(runner[0] as string, runner[1] as string[], {\n cwd: dir,\n env: { ...process.env, CI: \"1\" },\n maxBuffer: 32 * 1024 * 1024,\n });\n}\n\nexport async function reconcileProject(\n deps: ReconcilerDeps,\n projectId: string,\n opts: { ref?: string | undefined; localPath?: string | undefined } = {},\n): Promise<DeployReport> {\n const { rows: projects } = await deps.db.query<{\n id: string;\n workspace_id: string;\n name: string;\n repo_url: string | null;\n prod_branch: string;\n deploy_key_private_cipher: string | null;\n }>(`SELECT * FROM projects WHERE id=$1`, [projectId]);\n const project = projects[0];\n if (!project) throw new Error(`no project ${projectId}`);\n\n await deps.db.query(\n `INSERT INTO repo_state (project_id, status) VALUES ($1,'syncing')\n ON CONFLICT (project_id) DO UPDATE SET status='syncing', error=NULL`,\n [projectId],\n );\n\n const finish = async (status: string, report: DeployReport): Promise<DeployReport> => {\n await deps.db.query(\n `UPDATE repo_state SET status=$2, report=$3::jsonb, last_sha=$4, branch=$5, last_synced_at=now() WHERE project_id=$1`,\n [projectId, status, JSON.stringify(report), report.sha, report.ref],\n );\n return report;\n };\n\n const ref = opts.ref ?? project.prod_branch;\n const env = ref === project.prod_branch ? \"production\" : `preview:${ref}`;\n const report: DeployReport = { sha: \"\", ref, env, built: [], unchanged: [], failed: [], removed: [] };\n\n try {\n // ---- 1. working copy at the requested ref ----\n let workdir: string;\n if (opts.localPath !== undefined) {\n workdir = opts.localPath; // tesser dev / tests: build straight from a local tree\n report.sha = await git([\"rev-parse\", \"HEAD\"], workdir).catch(() => \"local\");\n } else {\n const repoUrl = project.repo_url;\n if (!repoUrl) throw new Error(\"project has no repo_url and no localPath was given\");\n let sshKeyPath: string | undefined;\n if (project.deploy_key_private_cipher) {\n const key = await deps.broker.decryptValue(project.workspace_id, project.deploy_key_private_cipher, \"deploykey\");\n const keyDir = join(deps.dataDir, \"keys\");\n mkdirSync(keyDir, { recursive: true, mode: 0o700 });\n sshKeyPath = join(keyDir, `${projectId}.key`);\n writeFileSync(sshKeyPath, key + \"\\n\", { mode: 0o600 });\n }\n const synced = await syncWorkdir({ dataDir: deps.dataDir, projectId, repoUrl, ref, sshKeyPath });\n workdir = synced.dir;\n report.sha = synced.sha;\n }\n\n await installDeps(workdir);\n\n // ---- 2. discover + diff + build changed only ----\n const discovered = discoverAutomations(workdir);\n const sources: AutomationRequirementSource[] = [];\n const schedules: ScheduleSpec[] = [];\n const subscriptions: Array<{ eventName: string; automationId: string }> = [];\n const promote: Array<{ automationId: string; versionId: string }> = [];\n const connectorManifests: Record<string, never> = {};\n\n for (const auto of discovered) {\n const { rows: latest } = await deps.db.query<{\n id: string;\n version: number;\n content_hash: string;\n status: string;\n manifest: never;\n }>(\n `SELECT id, version, content_hash, status, manifest FROM automation_versions\n WHERE project_id=$1 AND automation_id=$2 ORDER BY version DESC LIMIT 1`,\n [projectId, auto.automationId],\n );\n\n let versionId: string;\n let manifest: import(\"./build.js\").ExtractedBundle[\"manifest\"];\n\n if (latest[0] && latest[0].content_hash === auto.contentHash && latest[0].status !== \"failed\") {\n versionId = latest[0].id;\n manifest = latest[0].manifest;\n report.unchanged.push(auto.automationId);\n } else {\n const version = (latest[0]?.version ?? 0) + 1;\n const bundlePath = join(\n deps.dataDir,\n \"artifacts\",\n projectId,\n auto.automationId,\n `v${version}`,\n \"bundle.mjs\",\n );\n try {\n await buildAutomationBundle(auto.entry, bundlePath);\n } catch (err) {\n report.failed.push({ automation: auto.automationId, stage: \"build\", reason: String(err).slice(0, 2000) });\n continue;\n }\n let extracted: import(\"./build.js\").ExtractedBundle;\n try {\n extracted = await extractBundle(bundlePath);\n if (extracted.manifest.id !== auto.automationId) {\n throw new Error(\n `automation id \"${extracted.manifest.id}\" must match its directory \"automations/${auto.automationId}\"`,\n );\n }\n } catch (err) {\n report.failed.push({ automation: auto.automationId, stage: \"build\", reason: String(err).slice(0, 2000) });\n continue;\n }\n manifest = extracted.manifest;\n\n // ---- 3. test gate (ADR-0008): auto smoke against the REAL bundle ----\n const smoke = await smokeTest(extracted.def);\n const { rows: inserted } = await deps.db.query<{ id: string }>(\n `INSERT INTO automation_versions\n (project_id, automation_id, version, content_hash, bundle_path, manifest, git_sha, branch, status, test_report)\n VALUES ($1,$2,$3,$4,$5,$6::jsonb,$7,$8,$9,$10::jsonb)\n RETURNING id`,\n [\n projectId,\n auto.automationId,\n version,\n auto.contentHash,\n bundlePath,\n JSON.stringify(manifest),\n report.sha,\n ref,\n smoke.passed ? \"staged\" : \"failed\",\n JSON.stringify({\n smoke: { passed: smoke.passed, ...(smoke.reason !== undefined ? { reason: smoke.reason } : {}) },\n }),\n ],\n );\n versionId = inserted[0]!.id;\n deps.loader.inject(versionId, extracted.def);\n if (!smoke.passed) {\n report.failed.push({\n automation: auto.automationId,\n stage: \"test\",\n reason: smoke.reason ?? \"smoke test failed\",\n });\n continue; // red never promotes (ADR-0006)\n }\n report.built.push(auto.automationId);\n }\n\n Object.assign(connectorManifests, manifest.connectors ?? {});\n sources.push({\n automationId: auto.automationId,\n connections: (manifest.connections ?? {}) as never,\n secrets: (manifest.secrets ?? {}) as never,\n });\n if (manifest.trigger.kind === \"schedule\") {\n schedules.push({\n automationId: auto.automationId,\n cron: manifest.trigger.cron,\n tz: (manifest.trigger as { tz?: string }).tz,\n });\n }\n if (manifest.trigger.kind === \"event\") {\n subscriptions.push({ eventName: (manifest.trigger as { event: string }).event, automationId: auto.automationId });\n }\n promote.push({ automationId: auto.automationId, versionId });\n }\n\n // ---- 4. credential gate: halt BEFORE promotion (ADR-0005) ----\n const missing = await computeMissingRequirements({\n db: deps.db,\n broker: deps.broker,\n workspaceId: project.workspace_id,\n projectId,\n env,\n automations: sources,\n connectorManifests: connectorManifests as never,\n });\n if (missing.length > 0) {\n const token = await mintConnectLink({\n db: deps.db,\n workspaceId: project.workspace_id,\n projectId,\n requirements: missing,\n });\n report.connectUrl = `${deps.baseUrl}/connect/${token}`;\n report.requirements = missing;\n return finish(\"halted-credentials\", report);\n }\n\n // ---- 5. promote green versions: alias swap, instant + atomic per automation ----\n for (const p of promote) {\n await deps.db.tx(async (c) => {\n await c.query(\n `INSERT INTO aliases (project_id, automation_id, env, version_id) VALUES ($1,$2,$3,$4)\n ON CONFLICT (project_id, automation_id, env)\n DO UPDATE SET version_id=EXCLUDED.version_id, updated_at=now()`,\n [projectId, p.automationId, env, p.versionId],\n );\n await c.query(\n `UPDATE automation_versions SET status='superseded'\n WHERE project_id=$1 AND automation_id=$2 AND id <> $3 AND status='live'`,\n [projectId, p.automationId, p.versionId],\n );\n await c.query(`UPDATE automation_versions SET status='live' WHERE id=$1`, [p.versionId]);\n });\n }\n\n // ---- 6. undeployed automations: unalias + teardown ----\n const liveIds = new Set(discovered.map((d) => d.automationId));\n const { rows: aliased } = await deps.db.query<{ automation_id: string }>(\n `SELECT automation_id FROM aliases WHERE project_id=$1 AND env=$2`,\n [projectId, env],\n );\n for (const row of aliased) {\n if (!liveIds.has(row.automation_id)) {\n await deps.db.query(`DELETE FROM aliases WHERE project_id=$1 AND automation_id=$2 AND env=$3`, [\n projectId,\n row.automation_id,\n env,\n ]);\n report.removed.push(row.automation_id);\n }\n }\n\n // ---- 7. wire triggers (production only; previews are trigger-inert, ADR-0013) ----\n if (env === \"production\") {\n await syncSchedules(deps.db, projectId, env, schedules);\n await syncSubscriptions(deps.db, projectId, env, subscriptions);\n const regs = await ensureRegistrations(deps.triggerDeps, projectId, env);\n const manualReqs = regs.flatMap((r) => (r.manualRequirement !== undefined ? [r.manualRequirement] : []));\n report.manual = regs\n .filter((r) => r.status === \"manual-pending\")\n .map((r) => ({ automation: r.automationId, trigger: r.trigger }));\n await activatePolls(deps.triggerDeps, projectId, env);\n if (manualReqs.length > 0) {\n const token = await mintConnectLink({\n db: deps.db,\n workspaceId: project.workspace_id,\n projectId,\n requirements: manualReqs,\n });\n report.connectUrl = `${deps.baseUrl}/connect/${token}`;\n report.requirements = manualReqs;\n return finish(\"halted-credentials\", report);\n }\n }\n\n await gcArtifacts(deps.db, projectId);\n return finish(report.failed.length > 0 ? \"failed\" : \"synced\", report);\n } catch (err) {\n report.failed.push({ automation: \"*\", stage: \"build\", reason: String(err).slice(0, 2000) });\n await deps.db.query(\n `UPDATE repo_state SET status='failed', error=$2, report=$3::jsonb, last_synced_at=now() WHERE project_id=$1`,\n [projectId, String(err).slice(0, 2000), JSON.stringify(report)],\n );\n return report;\n }\n}\n\n/** Keep the last 10 versions per automation, plus aliased or active-run versions. */\nexport async function gcArtifacts(db: Db, projectId: string): Promise<void> {\n await db.query(\n `UPDATE automation_versions v SET status='superseded'\n WHERE v.project_id=$1 AND v.status='staged'\n AND v.created_at < now() - interval '1 day'`,\n [projectId],\n );\n // row GC only; artifact files are cheap and removed with the data dir\n await db.query(\n `DELETE FROM automation_versions v\n WHERE v.project_id=$1\n AND NOT EXISTS (\n SELECT 1 FROM aliases a\n WHERE a.project_id=$1 AND a.version_id=v.id\n )\n AND NOT EXISTS (\n SELECT 1 FROM runs r\n WHERE r.project_id=$1\n AND r.version_id=v.id\n AND r.status IN ('queued','running','suspended')\n )\n AND v.version < COALESCE((\n SELECT max(v2.version) - 9 FROM automation_versions v2\n WHERE v2.project_id=v.project_id AND v2.automation_id=v.automation_id\n ), 0)`,\n [projectId],\n );\n}\n\nexport async function deployStatus(db: Db, projectId: string, env: string): Promise<unknown> {\n const { rows: state } = await db.query(`SELECT status, error, report, last_sha, branch, last_synced_at FROM repo_state WHERE project_id=$1`, [projectId]);\n const { rows: versions } = await db.query(\n `SELECT a.automation_id, a.env, v.version, v.status, v.test_report\n FROM aliases a JOIN automation_versions v ON v.id=a.version_id\n WHERE a.project_id=$1 AND a.env=$2`,\n [projectId, env],\n );\n return { repo: state[0] ?? null, live: versions };\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", "// Webhook-strategy registration lifecycle (ADR-0013): auto mode rides the brokered token\n// to create/destroy provider hooks pointing at our stable ingress URL; manual mode\n// surfaces a connect-page step. Config-hash decides re-registration; undeploy\n// unregisters (no orphaned hooks).\n\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { decodeJournal, stableStringify } from \"@devosurf/tesser-sdk/internal\";\nimport type { Db } from \"../db/db.js\";\nimport { authDeclFor, makeActionCtx, providerFactsOf } from \"../broker/connections.js\";\nimport type { ManualWebhookRequirement } from \"../broker/connect.js\";\nimport {\n isWebhookDecl,\n resolveLiveTrigger,\n type TriggerLayerDeps,\n} from \"./shared.js\";\n\nfunction configHash(manifest: { connector: string; trigger: string; params: unknown }, connectionId: string): string {\n return createHash(\"sha256\")\n .update(stableStringify({\n connector: manifest.connector,\n trigger: manifest.trigger,\n params: manifest.params,\n connection: connectionId,\n } as never))\n .digest(\"hex\")\n .slice(0, 24);\n}\n\nexport interface RegistrationOutcome {\n automationId: string;\n trigger: string;\n status: \"registered\" | \"manual-pending\" | \"failed\" | \"unchanged\";\n manualRequirement?: ManualWebhookRequirement;\n error?: string;\n}\n\n/** Bring one automation's webhook trigger to its registered state. */\nexport async function ensureRegistration(\n deps: TriggerLayerDeps,\n projectId: string,\n automationId: string,\n env: string,\n): Promise<RegistrationOutcome | null> {\n if (env !== \"production\") return null; // preview is trigger-inert (ADR-0013)\n const resolved = await resolveLiveTrigger(deps, projectId, automationId, env);\n if (!resolved || !isWebhookDecl(resolved.decl)) return null;\n const { decl, manifest, connection } = resolved;\n const hash = configHash(manifest, connection.id);\n\n const { rows } = await deps.db.query<{\n id: string;\n config_hash: string;\n status: string;\n ingress_token: string;\n external_id: string | null;\n state: unknown;\n signing_secret_cipher: string | null;\n }>(\n `SELECT id, config_hash, status, ingress_token, external_id, state, signing_secret_cipher\n FROM webhook_registrations\n WHERE project_id=$1 AND automation_id=$2 AND trigger_id=$3 AND connection_id=$4 AND env=$5`,\n [projectId, automationId, manifest.trigger, connection.id, env],\n );\n const existing = rows[0];\n\n if (existing && existing.config_hash === hash && [\"registered\", \"manual-pending\"].includes(existing.status)) {\n if (existing.status === \"registered\") {\n return { automationId, trigger: manifest.trigger, status: \"unchanged\" };\n }\n // still waiting on the human \u2014 re-surface the same requirement\n return {\n automationId,\n trigger: manifest.trigger,\n status: \"manual-pending\",\n manualRequirement: manualRequirementFor(deps, existing.id, existing.ingress_token, resolved, decl),\n };\n }\n\n // Config changed \u2192 tear down the old provider hook first (auto mode only).\n if (existing && existing.config_hash !== hash) {\n await destroyRegistration(deps, projectId, automationId, env, existing.id).catch(() => {});\n }\n\n const ingressToken = existing?.config_hash === hash ? existing.ingress_token : `wt_${randomBytes(16).toString(\"hex\")}`;\n const url = `${deps.baseUrl}/ingress/c/${ingressToken}`;\n\n if (decl.register.mode === \"manual\") {\n const { rows: created } = await deps.db.query<{ id: string }>(\n `INSERT INTO webhook_registrations\n (project_id, automation_id, trigger_id, connector_id, connection_id, env, config_hash, ingress_token, status)\n VALUES ($1,$2,$3,$4,$5,$6,$7,$8,'manual-pending')\n ON CONFLICT (project_id, automation_id, trigger_id, connection_id, env)\n DO UPDATE SET config_hash=EXCLUDED.config_hash, status='manual-pending', updated_at=now()\n RETURNING id`,\n [projectId, automationId, manifest.trigger, manifest.connector, connection.id, env, hash, ingressToken],\n );\n return {\n automationId,\n trigger: manifest.trigger,\n status: \"manual-pending\",\n manualRequirement: manualRequirementFor(deps, created[0]!.id, ingressToken, resolved, decl),\n };\n }\n\n // auto mode: we generate the signing secret and call the provider's hook API.\n const secret = randomBytes(24).toString(\"hex\");\n try {\n const bundle = await deps.broker.freshCredential(\n connection.id,\n providerFactsOf(resolved.connector.__connector)?.oauth2,\n );\n const actx = makeActionCtx({\n spec: resolved.connector.__connector,\n decl: authDeclFor(resolved.connector.__connector, connection.auth_mode),\n conn: connection,\n facts: providerFactsOf(resolved.connector.__connector),\n fields: bundle.fields,\n broker: deps.broker,\n fetchImpl: deps.fetchImpl,\n });\n const result = await decl.register.create(actx, { url, secret }, resolved.params);\n const cipher = await deps.broker.encryptValue(resolved.workspaceId, secret, \"webhook.signing\");\n await deps.db.query(\n `INSERT INTO webhook_registrations\n (project_id, automation_id, trigger_id, connector_id, connection_id, env, config_hash, ingress_token,\n signing_secret_cipher, external_id, state, status)\n VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11::jsonb,'registered')\n ON CONFLICT (project_id, automation_id, trigger_id, connection_id, env)\n DO UPDATE SET config_hash=EXCLUDED.config_hash, ingress_token=EXCLUDED.ingress_token,\n signing_secret_cipher=EXCLUDED.signing_secret_cipher, external_id=EXCLUDED.external_id,\n state=EXCLUDED.state, status='registered', error=NULL, updated_at=now()`,\n [\n projectId,\n automationId,\n manifest.trigger,\n manifest.connector,\n connection.id,\n env,\n hash,\n ingressToken,\n cipher,\n result && typeof result === \"object\" && \"externalId\" in result ? ((result as { externalId?: string }).externalId ?? null) : null,\n result && typeof result === \"object\" && \"state\" in result ? JSON.stringify((result as { state?: unknown }).state ?? null) : null,\n ],\n );\n return { automationId, trigger: manifest.trigger, status: \"registered\" };\n } catch (err) {\n await deps.db.query(\n `INSERT INTO webhook_registrations\n (project_id, automation_id, trigger_id, connector_id, connection_id, env, config_hash, ingress_token, status, error)\n VALUES ($1,$2,$3,$4,$5,$6,$7,$8,'failed',$9)\n ON CONFLICT (project_id, automation_id, trigger_id, connection_id, env)\n DO UPDATE SET status='failed', error=EXCLUDED.error, updated_at=now()`,\n [projectId, automationId, manifest.trigger, manifest.connector, connection.id, env, hash, ingressToken, String(err).slice(0, 1000)],\n );\n return { automationId, trigger: manifest.trigger, status: \"failed\", error: String(err) };\n }\n}\n\nfunction manualRequirementFor(\n deps: TriggerLayerDeps,\n registrationId: string,\n ingressToken: string,\n resolved: NonNullable<Awaited<ReturnType<typeof resolveLiveTrigger>>>,\n decl: import(\"@devosurf/tesser-sdk/connector\").WebhookTriggerDecl<any, any>,\n): ManualWebhookRequirement {\n const url = `${deps.baseUrl}/ingress/c/${ingressToken}`;\n const instructions =\n decl.register.mode === \"manual\"\n ? decl.register.instructions({ url, secret: \"(paste your provider's signing secret below)\" }, resolved.params)\n : \"\";\n return {\n type: \"webhook-manual\",\n registrationId,\n connector: resolved.manifest.connector,\n trigger: resolved.manifest.trigger,\n automation: resolved.automationId,\n instructions,\n url,\n };\n}\n\n/** Undeploy / config-change teardown: destroy the provider hook, mark removed, GC state. */\nexport async function destroyRegistration(\n deps: TriggerLayerDeps,\n projectId: string,\n automationId: string,\n env: string,\n registrationId: string,\n): Promise<void> {\n const { rows } = await deps.db.query<{\n id: string;\n trigger_id: string;\n connector_id: string;\n connection_id: string | null;\n external_id: string | null;\n state: unknown;\n status: string;\n }>(`SELECT id, trigger_id, connector_id, connection_id, external_id, state, status FROM webhook_registrations WHERE id=$1`, [\n registrationId,\n ]);\n const reg = rows[0];\n if (!reg) return;\n\n if (reg.status === \"registered\" && reg.connection_id) {\n const resolved = await resolveLiveTrigger(deps, projectId, automationId, env).catch(() => null);\n if (resolved && isWebhookDecl(resolved.decl) && resolved.decl.register.mode === \"auto\" && resolved.decl.register.destroy) {\n try {\n const bundle = await deps.broker.freshCredential(\n resolved.connection.id,\n providerFactsOf(resolved.connector.__connector)?.oauth2,\n );\n const actx = makeActionCtx({\n spec: resolved.connector.__connector,\n decl: authDeclFor(resolved.connector.__connector, resolved.connection.auth_mode),\n conn: resolved.connection,\n facts: providerFactsOf(resolved.connector.__connector),\n fields: bundle.fields,\n broker: deps.broker,\n fetchImpl: deps.fetchImpl,\n });\n await resolved.decl.register.destroy(\n actx,\n { ...(reg.external_id !== null ? { externalId: reg.external_id } : {}), state: decodeJournal(reg.state as never) },\n resolved.params,\n );\n } catch {\n // best-effort: the provider hook may already be gone\n }\n }\n }\n await deps.db.query(`UPDATE webhook_registrations SET status='removed', updated_at=now() WHERE id=$1`, [reg.id]);\n if (reg.connection_id) {\n await deps.db.query(\n `DELETE FROM trigger_state WHERE project_id=$1 AND automation_id=$2 AND trigger_id=$3 AND connection_id=$4`,\n [projectId, automationId, reg.trigger_id, reg.connection_id],\n );\n }\n}\n\n/** Reconcile all webhook registrations for a project+env after promote. Returns the\n * manual steps that still need a human (they join the connect link). */\nexport async function ensureRegistrations(\n deps: TriggerLayerDeps,\n projectId: string,\n env: string,\n): Promise<RegistrationOutcome[]> {\n if (env !== \"production\") return [];\n const { rows } = await deps.db.query<{ automation_id: string; manifest: { trigger?: { kind?: string } } }>(\n `SELECT a.automation_id, v.manifest FROM aliases a JOIN automation_versions v ON v.id=a.version_id\n WHERE a.project_id=$1 AND a.env=$2`,\n [projectId, env],\n );\n const outcomes: RegistrationOutcome[] = [];\n const liveAutomationIds = new Set<string>();\n for (const row of rows) {\n liveAutomationIds.add(row.automation_id);\n if (row.manifest.trigger?.kind !== \"connector\") continue;\n const outcome = await ensureRegistration(deps, projectId, row.automation_id, env);\n if (outcome) outcomes.push(outcome);\n }\n // Undeployed automations: tear down their registrations.\n const stale = await deps.db.query<{ id: string; automation_id: string }>(\n `SELECT id, automation_id FROM webhook_registrations\n WHERE project_id=$1 AND env=$2 AND status IN ('registered','manual-pending','failed')`,\n [projectId, env],\n );\n for (const reg of stale.rows) {\n if (!liveAutomationIds.has(reg.automation_id)) {\n await destroyRegistration(deps, projectId, reg.automation_id, env, reg.id);\n }\n }\n return outcomes;\n}\n", "// Server-side build (ADR-0006): bundle each changed automation into a self-contained\n// immutable artifact (SDK + connectors + deps compiled in) and statically extract its\n// manifest \u2014 module evaluation only, the handler never runs (ADR-0010).\n\nimport { createHash } from \"node:crypto\";\nimport { mkdirSync, readdirSync, readFileSync, statSync, existsSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { build } from \"esbuild\";\nimport type { AutomationDef } from \"@devosurf/tesser-sdk\";\nimport type { ConnectorInstance } from \"@devosurf/tesser-sdk/connector\";\nimport {\n extractAutomationManifest,\n extractConnectorManifest,\n type AutomationManifest,\n type ConnectorManifest,\n} from \"@devosurf/tesser-sdk/internal\";\n\nexport interface DiscoveredAutomation {\n automationId: string;\n dir: string;\n entry: string;\n contentHash: string;\n}\n\nconst LOCKFILES = [\"pnpm-lock.yaml\", \"package-lock.json\", \"yarn.lock\", \"package.json\", \"tesser.json\"];\n\nexport function discoverAutomations(repoDir: string): DiscoveredAutomation[] {\n const root = join(repoDir, \"automations\");\n if (!existsSync(root)) return [];\n const lockHash = createHash(\"sha256\");\n for (const f of LOCKFILES) {\n const p = join(repoDir, f);\n if (existsSync(p)) lockHash.update(f).update(readFileSync(p));\n }\n const lock = lockHash.digest(\"hex\");\n\n const out: DiscoveredAutomation[] = [];\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 out.push({ automationId: name, dir, entry, contentHash: hashDir(dir, lock) });\n }\n return out;\n}\n\nfunction hashDir(dir: string, seed: string): string {\n const h = createHash(\"sha256\").update(seed);\n const walk = (d: string) => {\n for (const entry of readdirSync(d).sort()) {\n if (entry === \"node_modules\" || entry.startsWith(\".\")) continue;\n const p = join(d, entry);\n const st = statSync(p);\n if (st.isDirectory()) walk(p);\n else h.update(relative(dir, p)).update(readFileSync(p));\n }\n };\n walk(dir);\n return h.digest(\"hex\").slice(0, 24);\n}\n\nexport async function buildAutomationBundle(entry: string, outFile: string): Promise<void> {\n mkdirSync(join(outFile, \"..\"), { recursive: true });\n await build({\n entryPoints: [entry],\n outfile: outFile,\n bundle: true,\n platform: \"node\",\n format: \"esm\",\n target: \"node20\",\n sourcemap: \"inline\",\n // Self-contained: everything (sdk, connectors, zod) is compiled in; only node\n // builtins stay external. The artifact runs with no node_modules next to it.\n packages: \"bundle\",\n logLevel: \"silent\",\n });\n}\n\nexport interface ExtractedBundle {\n manifest: AutomationManifest & { connectors: Record<string, ConnectorManifest> };\n def: AutomationDef<any, any, any, any, any, any, any>;\n}\n\n/** Import the built artifact and statically extract its manifest (module evaluation\n * only; `run` is never called). The cache-busting query keeps re-extraction honest. */\nexport async function extractBundle(bundlePath: string): Promise<ExtractedBundle> {\n const mod = (await import(`${pathToFileURL(bundlePath).href}?t=${Date.now()}`)) as {\n default?: AutomationDef<any, any, any, any, any, any, any>;\n };\n const def = mod.default;\n if (!def || typeof def !== \"object\" || typeof def.run !== \"function\") {\n throw new Error(`bundle has no default export from defineAutomation: ${bundlePath}`);\n }\n const manifest = extractAutomationManifest(def);\n const connectors: Record<string, ConnectorManifest> = {};\n for (const conn of Object.values((def.connections ?? {}) as Record<string, ConnectorInstance<any, any>>)) {\n connectors[conn.id] = extractConnectorManifest(conn);\n }\n return { manifest: { ...manifest, connectors }, def };\n}\n", "// tesser-server entrypoint.\n\nimport { createTesserServer } from \"./server.js\";\n\nconst server = await createTesserServer();\nawait server.start();\n\nconsole.error(`[tesser] instance up on ${server.config.baseUrl} (db: ${server.db.kind})`);\nconsole.error(\n `[tesser] roles: ${Object.entries(server.config.roles)\n .filter(([, on]) => on)\n .map(([r]) => r)\n .join(\", \")}`,\n);\nif (server.adminToken) {\n console.error(`[tesser] FIRST BOOT \u2014 admin API token (store it now, it is not shown again):`);\n console.error(`[tesser] ${server.adminToken}`);\n}\n\nconst shutdown = async (signal: string) => {\n console.error(`[tesser] ${signal} \u2014 draining`);\n await server.stop();\n process.exit(0);\n};\nprocess.on(\"SIGINT\", () => void shutdown(\"SIGINT\"));\nprocess.on(\"SIGTERM\", () => void shutdown(\"SIGTERM\"));\n"],
5
- "mappings": "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J;AAAA;AAAA,MAAe;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;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;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;AAA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",
4
+ "sourcesContent": ["// Instance composition: one process hosts api + worker + scheduler + reconciler by\n// default (TESSER_ROLES splits them; ~3 services in prod: this, workers, Postgres).\n\nimport { serve, type ServerType } from \"@hono/node-server\";\nimport type { Hono } from \"hono\";\nimport { loadConfig, type ServerConfig } from \"./config.js\";\nimport { createDb, type Db } from \"./db/db.js\";\nimport { migrate } from \"./db/migrate.js\";\nimport { Broker } from \"./broker/broker.js\";\nimport { Masker } from \"./broker/masking.js\";\nimport { makeEngineBindings } from \"./broker/connections.js\";\nimport { executeRun } from \"./engine/executor.js\";\nimport type { EngineDeps } from \"./engine/types.js\";\nimport { fanoutEvent } from \"./events/fanout.js\";\nimport { createApp } from \"./http/app.js\";\nimport { ensureAdminToken } from \"./http/tokens.js\";\nimport { Worker } from \"./queue/worker.js\";\nimport type { ClaimedJob } from \"./queue/queue.js\";\nimport { startScheduler } from \"./scheduler/cron.js\";\nimport { startReaper } from \"./scheduler/reaper.js\";\nimport { ArtifactLoader } from \"./registry/loader.js\";\nimport { createConnectorIngress } from \"./triggers/ingress.js\";\nimport { runPoll, type PollJobPayload } from \"./triggers/poll.js\";\nimport type { TriggerLayerDeps } from \"./triggers/shared.js\";\nimport { deployStatus, reconcileProject, type ReconcilerDeps } from \"./gitsync/reconciler.js\";\n\nexport interface TesserServer {\n config: ServerConfig;\n db: Db;\n broker: Broker;\n masker: Masker;\n loader: ArtifactLoader;\n engineDeps: EngineDeps;\n triggerDeps: TriggerLayerDeps;\n reconcilerDeps: ReconcilerDeps;\n worker: Worker;\n app: Hono;\n /** Set when roles.api and started via listen(). */\n httpServer?: ServerType;\n adminToken?: string;\n start(): Promise<void>;\n stop(): Promise<void>;\n}\n\nexport async function createTesserServer(\n overrides: Partial<ServerConfig> = {},\n): Promise<TesserServer> {\n const config = { ...loadConfig(), ...overrides };\n const db = await createDb({\n databaseUrl: config.databaseUrl,\n dataDir: config.databaseUrl ? undefined : `${config.dataDir}/pglite`,\n });\n await migrate(db);\n\n const masker = new Masker();\n const broker = new Broker(db, config.masterKey, masker);\n const workspaceId = await broker.ensureDefaultWorkspace();\n const adminToken = await ensureAdminToken(db, workspaceId);\n\n const loader = new ArtifactLoader(db);\n const bindings = makeEngineBindings({ db, broker });\n const engineDeps: EngineDeps = {\n db,\n loadAutomation: loader.load,\n buildConnections: bindings.buildConnections,\n resolveSecrets: bindings.resolveSecrets,\n ...(bindings.callModel !== undefined ? { callModel: bindings.callModel } : {}),\n ...(bindings.callHarness !== undefined ? { callHarness: bindings.callHarness } : {}),\n mask: (s) => masker.mask(s),\n };\n const triggerDeps: TriggerLayerDeps = {\n db,\n broker,\n baseUrl: config.baseUrl,\n loadAutomation: loader.load,\n };\n const reconcilerDeps: ReconcilerDeps = {\n db,\n broker,\n loader,\n dataDir: config.dataDir,\n baseUrl: config.baseUrl,\n triggerDeps,\n };\n\n const workerHandlers = {\n run: async (job: ClaimedJob) => {\n await executeRun(engineDeps, (job.payload as { runId: string }).runId);\n },\n \"event-fanout\": async (job: ClaimedJob) => {\n await fanoutEvent(db, (job.payload as { eventId: string }).eventId);\n },\n \"trigger-poll\": async (job: ClaimedJob) => {\n await runPoll(triggerDeps, job.payload as never as PollJobPayload);\n },\n reconcile: async (job: ClaimedJob) => {\n const p = job.payload as { projectId: string; ref?: string; localPath?: string };\n await reconcileProject(reconcilerDeps, p.projectId, { ref: p.ref, localPath: p.localPath });\n },\n };\n const workerKinds = [\n ...(config.roles.worker ? ([\"run\", \"event-fanout\", \"trigger-poll\"] as const) : []),\n ...(config.roles.reconciler ? ([\"reconcile\"] as const) : []),\n ];\n const worker = new Worker(\n db,\n Object.fromEntries(workerKinds.map((kind) => [kind, workerHandlers[kind]])),\n {\n tags: config.workerTags,\n kinds: workerKinds,\n pollIntervalMs: config.pollIntervalMs,\n onError: (e) => console.error(\"[worker]\", e),\n },\n );\n\n const app = createApp({\n db,\n broker,\n baseUrl: config.baseUrl,\n dataDir: config.dataDir,\n roles: config.roles,\n connectorIngress: createConnectorIngress(triggerDeps),\n deployStatus: (projectId, env) => deployStatus(db, projectId, env),\n });\n\n let stopScheduler: (() => void) | undefined;\n let stopReaper: (() => void) | undefined;\n let httpServer: ServerType | undefined;\n\n const server: TesserServer = {\n config,\n db,\n broker,\n masker,\n loader,\n engineDeps,\n triggerDeps,\n reconcilerDeps,\n worker,\n app,\n ...(adminToken !== null ? { adminToken } : {}),\n async start() {\n if (config.roles.api) {\n httpServer = serve({ fetch: app.fetch, port: config.port, hostname: \"0.0.0.0\" });\n server.httpServer = httpServer;\n }\n if (config.roles.worker || config.roles.reconciler) worker.start();\n if (config.roles.scheduler) {\n stopScheduler = startScheduler(db, { onError: (e) => console.error(\"[scheduler]\", e) });\n stopReaper = startReaper(db, { onError: (e) => console.error(\"[reaper]\", e) });\n }\n },\n async stop() {\n stopScheduler?.();\n stopReaper?.();\n await worker.stop();\n if (httpServer) await new Promise<void>((r) => httpServer!.close(() => r()));\n await db.close();\n },\n };\n return server;\n}\n", "// Instance configuration \u2014 env-driven, defaults tuned for `tesser dev` (embedded PGlite,\n// auto master key). Production fails fast on missing or unsafe required env.\n\nimport { mkdirSync, readFileSync, writeFileSync, existsSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\n\nexport interface ServerConfig {\n port: number;\n /** Public base URL for webhooks/connect links (defaults to http://localhost:<port>). */\n baseUrl: string;\n databaseUrl: string | undefined;\n dataDir: string;\n masterKey: Buffer;\n /** Which duties this process performs. */\n roles: { api: boolean; worker: boolean; scheduler: boolean; reconciler: boolean };\n workerTags: string[] | undefined;\n pollIntervalMs: number;\n env: \"production\" | \"development\";\n}\n\nexport function loadConfig(env: NodeJS.ProcessEnv = process.env): ServerConfig {\n const port = Number(env[\"PORT\"] ?? env[\"TESSER_PORT\"] ?? 8377);\n const mode: ServerConfig[\"env\"] = env[\"NODE_ENV\"] === \"production\" ? \"production\" : \"development\";\n const production = mode === \"production\";\n const dataDir = env[\"TESSER_DATA_DIR\"] ?? join(process.cwd(), \".tesser\");\n const databaseUrl = env[\"DATABASE_URL\"] ?? env[\"TESSER_DATABASE_URL\"];\n const baseUrl = env[\"TESSER_BASE_URL\"] ?? (production ? undefined : `http://localhost:${port}`);\n const rolesEnv = env[\"TESSER_ROLES\"]; // e.g. \"api,worker\" \u2014 dev default: everything\n\n if (production) {\n const missing = [\n ...(databaseUrl ? [] : [\"DATABASE_URL\"]),\n ...(baseUrl ? [] : [\"TESSER_BASE_URL\"]),\n ...(env[\"TESSER_MASTER_KEY\"] ? [] : [\"TESSER_MASTER_KEY\"]),\n ...(rolesEnv ? [] : [\"TESSER_ROLES\"]),\n ];\n if (missing.length > 0) {\n throw new Error(`production configuration missing required env: ${missing.join(\", \")}`);\n }\n }\n\n const normalizedBaseUrl = validateBaseUrl(baseUrl!, { production, allowLocalhost: env[\"TESSER_ALLOW_LOCALHOST_BASE_URL\"] === \"true\" });\n ensureWritableDataDir(dataDir);\n\n let masterKey: Buffer;\n const fromEnv = env[\"TESSER_MASTER_KEY\"];\n if (fromEnv) {\n masterKey = Buffer.from(fromEnv, \"base64\");\n if (masterKey.length !== 32) {\n throw new Error(\"TESSER_MASTER_KEY must be 32 bytes, base64-encoded\");\n }\n } else {\n // Dev convenience: generate once into the data dir, loudly. Production should set\n // TESSER_MASTER_KEY explicitly (custody/rotation: docs/SCOPES.md \u00A74).\n const keyPath = join(dataDir, \"master.key\");\n if (existsSync(keyPath)) {\n masterKey = Buffer.from(readFileSync(keyPath, \"utf8\").trim(), \"base64\");\n } else {\n masterKey = randomBytes(32);\n writeFileSync(keyPath, masterKey.toString(\"base64\") + \"\\n\", { mode: 0o600 });\n console.error(\n `[tesser] generated a development master key at ${keyPath} \u2014 set TESSER_MASTER_KEY in production`,\n );\n }\n }\n\n const roleSet = parseRoles(rolesEnv ?? \"api,worker,scheduler,reconciler\");\n\n return {\n port,\n baseUrl: normalizedBaseUrl,\n databaseUrl,\n dataDir,\n masterKey,\n roles: {\n api: roleSet.has(\"api\"),\n worker: roleSet.has(\"worker\"),\n scheduler: roleSet.has(\"scheduler\"),\n reconciler: roleSet.has(\"reconciler\"),\n },\n workerTags: env[\"TESSER_WORKER_TAGS\"]?.split(\",\").map((tag) => tag.trim()).filter(Boolean),\n pollIntervalMs: Number(env[\"TESSER_QUEUE_POLL_MS\"] ?? 250),\n env: mode,\n };\n}\n\nfunction validateBaseUrl(input: string, opts: { production: boolean; allowLocalhost: boolean }): string {\n let parsed: URL;\n try {\n parsed = new URL(input);\n } catch {\n throw new Error(\"TESSER_BASE_URL must be an absolute URL\");\n }\n if (parsed.pathname !== \"/\" || parsed.search || parsed.hash) {\n throw new Error(\"TESSER_BASE_URL must be an origin only, for example https://tesser.example.com\");\n }\n if (opts.production && !opts.allowLocalhost && isLocalhost(parsed.hostname)) {\n throw new Error(\"TESSER_BASE_URL must not be localhost in production; set a public origin\");\n }\n return parsed.origin;\n}\n\nfunction isLocalhost(hostname: string): boolean {\n const host = hostname.toLowerCase();\n return host === \"localhost\" || host === \"127.0.0.1\" || host === \"::1\" || host === \"[::1]\";\n}\n\nfunction parseRoles(input: string): Set<string> {\n const allowed = new Set([\"api\", \"worker\", \"scheduler\", \"reconciler\"]);\n const roles = input.split(\",\").map((role) => role.trim()).filter(Boolean);\n const unknown = roles.filter((role) => !allowed.has(role));\n if (unknown.length > 0) throw new Error(`TESSER_ROLES includes unknown role(s): ${unknown.join(\", \")}`);\n if (roles.length === 0) throw new Error(\"TESSER_ROLES must include at least one role\");\n return new Set(roles);\n}\n\nfunction ensureWritableDataDir(dataDir: string): void {\n try {\n mkdirSync(dataDir, { recursive: true });\n const probe = join(dataDir, `.tesser-write-probe-${randomBytes(8).toString(\"hex\")}`);\n writeFileSync(probe, \"ok\", { flag: \"wx\" });\n rmSync(probe, { force: true });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new Error(`TESSER_DATA_DIR must be writable for runtime data and artifacts: ${message}`);\n }\n}\n", "// One thin Db seam over plain Postgres (ADR-0003): pg.Pool in production, embedded\n// PGlite for `tesser dev` and tests \u2014 same SQL, same semantics (PGlite is real Postgres\n// compiled to wasm; it is single-connection, so SKIP LOCKED contention is simply absent).\n\nexport interface QueryResult<R> {\n rows: R[];\n rowCount: number;\n}\n\nexport interface DbClient {\n query<R = Record<string, unknown>>(text: string, params?: unknown[]): Promise<QueryResult<R>>;\n}\n\nexport interface Db extends DbClient {\n readonly kind: \"pg\" | \"pglite\";\n tx<T>(fn: (client: DbClient) => Promise<T>): Promise<T>;\n close(): Promise<void>;\n}\n\nexport interface DbConfig {\n /** postgres:// URL \u2192 pg; absent \u2192 PGlite at dataDir (or in-memory). */\n databaseUrl?: string | undefined;\n /** PGlite data directory; \"memory://\" or undefined = ephemeral in-memory. */\n dataDir?: string | undefined;\n}\n\nexport async function createDb(config: DbConfig): Promise<Db> {\n if (config.databaseUrl) {\n const { default: pg } = await import(\"pg\");\n const pool = new pg.Pool({ connectionString: config.databaseUrl, max: 10 });\n // Multi-statement simple-protocol queries yield an array of results \u2014 take the last.\n const normalize = <R>(res: unknown): QueryResult<R> => {\n const r = (Array.isArray(res) ? res[res.length - 1] : res) as {\n rows?: R[];\n rowCount?: number | null;\n };\n const rows = r?.rows ?? [];\n return { rows, rowCount: r?.rowCount ?? rows.length };\n };\n return {\n kind: \"pg\",\n async query(text, params) {\n return normalize(await pool.query(text, params as never[]));\n },\n async tx(fn) {\n const client = await pool.connect();\n try {\n await client.query(\"BEGIN\");\n const result = await fn({\n async query(text, params) {\n return normalize(await client.query(text, params as never[]));\n },\n });\n await client.query(\"COMMIT\");\n return result;\n } catch (err) {\n await client.query(\"ROLLBACK\").catch(() => {});\n throw err;\n } finally {\n client.release();\n }\n },\n async close() {\n await pool.end();\n },\n };\n }\n\n const { PGlite } = await import(\"@electric-sql/pglite\");\n let pglite: InstanceType<typeof PGlite>;\n if (config.dataDir && config.dataDir !== \"memory://\") {\n const { mkdirSync } = await import(\"node:fs\");\n mkdirSync(config.dataDir, { recursive: true });\n pglite = new PGlite(config.dataDir);\n } else {\n pglite = new PGlite();\n }\n await pglite.waitReady;\n\n // PGlite is one connection: serialize interactive transactions behind a mutex so a\n // worker tx and an API tx never interleave statements.\n let mutex: Promise<unknown> = Promise.resolve();\n const withMutex = <T>(fn: () => Promise<T>): Promise<T> => {\n const next = mutex.then(fn, fn);\n mutex = next.catch(() => {});\n return next;\n };\n\n return {\n kind: \"pglite\",\n async query(text, params) {\n const res = await withMutex(() => pglite.query(text, params as never[]));\n return { rows: res.rows as never[], rowCount: (res as { affectedRows?: number }).affectedRows ?? res.rows.length };\n },\n async tx(fn) {\n return withMutex(() =>\n pglite.transaction(async (t) => {\n return fn({\n async query(text, params) {\n const res = await t.query(text, params as never[]);\n return {\n rows: res.rows as never[],\n rowCount: (res as { affectedRows?: number }).affectedRows ?? res.rows.length,\n };\n },\n });\n }),\n ) as Promise<never>;\n },\n async close() {\n await pglite.close();\n },\n };\n}\n", "// Schema migrations \u2014 applied in order, recorded in schema_migrations. Postgres is the\n// single stateful dependency (ADR-0003): metadata, queue, journal, encrypted secrets.\n\nexport interface Migration {\n id: string;\n sql: string;\n}\n\nexport const migrations: Migration[] = [\n {\n id: \"0001-core\",\n sql: /* sql */ `\nCREATE TABLE workspaces (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n name text NOT NULL,\n data_key_cipher text NOT NULL,\n created_at timestamptz NOT NULL DEFAULT now()\n);\n\nCREATE TABLE api_tokens (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n workspace_id uuid NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,\n name text NOT NULL,\n token_hash text NOT NULL UNIQUE,\n created_at timestamptz NOT NULL DEFAULT now(),\n last_used_at timestamptz\n);\n\nCREATE TABLE projects (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n workspace_id uuid NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,\n name text NOT NULL,\n repo_url text,\n deploy_key_public text,\n deploy_key_private_cipher text,\n prod_branch text NOT NULL DEFAULT 'main',\n push_webhook_secret text,\n poll_interval_s integer,\n created_at timestamptz NOT NULL DEFAULT now(),\n UNIQUE (workspace_id, name)\n);\n\nCREATE TABLE repo_state (\n project_id uuid PRIMARY KEY REFERENCES projects(id) ON DELETE CASCADE,\n branch text NOT NULL DEFAULT 'main',\n last_sha text,\n status text NOT NULL DEFAULT 'idle', -- idle|syncing|synced|halted-credentials|failed\n error text,\n report jsonb,\n last_synced_at timestamptz\n);\n\nCREATE TABLE automation_versions (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n project_id uuid NOT NULL REFERENCES projects(id) ON DELETE CASCADE,\n automation_id text NOT NULL,\n version integer NOT NULL,\n content_hash text NOT NULL,\n bundle_path text NOT NULL,\n manifest jsonb NOT NULL,\n git_sha text,\n branch text NOT NULL DEFAULT 'main',\n status text NOT NULL DEFAULT 'staged', -- staged|live|superseded|failed\n test_report jsonb,\n created_at timestamptz NOT NULL DEFAULT now(),\n UNIQUE (project_id, automation_id, version)\n);\n\nCREATE TABLE aliases (\n project_id uuid NOT NULL REFERENCES projects(id) ON DELETE CASCADE,\n automation_id text NOT NULL,\n env text NOT NULL, -- 'production' | 'preview:<branch>'\n version_id uuid NOT NULL REFERENCES automation_versions(id),\n updated_at timestamptz NOT NULL DEFAULT now(),\n PRIMARY KEY (project_id, automation_id, env)\n);\n\nCREATE TABLE runs (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n project_id uuid NOT NULL REFERENCES projects(id) ON DELETE CASCADE,\n automation_id text NOT NULL,\n version_id uuid REFERENCES automation_versions(id) ON DELETE SET NULL,\n env text NOT NULL DEFAULT 'production',\n status text NOT NULL DEFAULT 'queued', -- queued|running|suspended|completed|failed|cancelled\n trigger jsonb NOT NULL,\n input jsonb,\n output jsonb,\n error jsonb,\n attempt integer NOT NULL DEFAULT 0,\n concurrency_key text,\n wake_at timestamptz,\n waiting_signal text,\n created_at timestamptz NOT NULL DEFAULT now(),\n started_at timestamptz,\n finished_at timestamptz\n);\nCREATE INDEX runs_by_automation ON runs (project_id, automation_id, created_at DESC);\nCREATE INDEX runs_by_status ON runs (status) WHERE status IN ('queued','running','suspended');\nCREATE INDEX runs_concurrency ON runs (project_id, automation_id, concurrency_key)\n WHERE status IN ('queued','running','suspended');\n\nCREATE TABLE run_steps (\n run_id uuid NOT NULL REFERENCES runs(id) ON DELETE CASCADE,\n name text NOT NULL,\n occurrence integer NOT NULL,\n status text NOT NULL, -- running|completed|failed\n attempts integer NOT NULL DEFAULT 0,\n result jsonb,\n error jsonb,\n has_undo boolean NOT NULL DEFAULT false,\n undone boolean NOT NULL DEFAULT false,\n started_at timestamptz NOT NULL DEFAULT now(),\n finished_at timestamptz,\n PRIMARY KEY (run_id, name, occurrence)\n);\n\nCREATE TABLE queue_jobs (\n id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,\n kind text NOT NULL,\n payload jsonb NOT NULL,\n status text NOT NULL DEFAULT 'ready', -- ready|dead\n run_at timestamptz NOT NULL DEFAULT now(),\n priority integer NOT NULL DEFAULT 0,\n lease_until timestamptz,\n attempts integer NOT NULL DEFAULT 0,\n max_attempts integer NOT NULL DEFAULT 10,\n tag text,\n dedupe_key text,\n last_error text,\n created_at timestamptz NOT NULL DEFAULT now()\n);\nCREATE INDEX queue_ready ON queue_jobs (run_at, priority DESC) WHERE status = 'ready';\nCREATE UNIQUE INDEX queue_dedupe ON queue_jobs (dedupe_key) WHERE dedupe_key IS NOT NULL;\n\nCREATE TABLE schedules (\n project_id uuid NOT NULL REFERENCES projects(id) ON DELETE CASCADE,\n automation_id text NOT NULL,\n env text NOT NULL,\n cron text NOT NULL,\n tz text,\n enabled boolean NOT NULL DEFAULT true,\n next_fire timestamptz,\n PRIMARY KEY (project_id, automation_id, env)\n);\n\nCREATE TABLE events (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n project_id uuid NOT NULL REFERENCES projects(id) ON DELETE CASCADE,\n env text NOT NULL DEFAULT 'production',\n name text NOT NULL,\n payload jsonb,\n emitted_by_run uuid,\n created_at timestamptz NOT NULL DEFAULT now()\n);\n\nCREATE TABLE event_subscriptions (\n project_id uuid NOT NULL REFERENCES projects(id) ON DELETE CASCADE,\n env text NOT NULL,\n event_name text NOT NULL,\n automation_id text NOT NULL,\n PRIMARY KEY (project_id, env, event_name, automation_id)\n);\n\nCREATE TABLE signals (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n run_id uuid NOT NULL REFERENCES runs(id) ON DELETE CASCADE,\n name text NOT NULL,\n payload jsonb,\n consumed boolean NOT NULL DEFAULT false,\n created_at timestamptz NOT NULL DEFAULT now()\n);\nCREATE INDEX signals_by_run ON signals (run_id, name) WHERE NOT consumed;\n\nCREATE TABLE connections (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n workspace_id uuid NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,\n connector_id text NOT NULL,\n provider text,\n auth_mode text NOT NULL DEFAULT 'default',\n scope text NOT NULL DEFAULT 'workspace', -- workspace|per_user\n end_user_id text,\n label text,\n credential_cipher text,\n credential_meta jsonb NOT NULL DEFAULT '{}',\n status text NOT NULL DEFAULT 'pending', -- pending|ready|error\n error text,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n);\nCREATE INDEX connections_lookup ON connections (workspace_id, connector_id, status);\n\nCREATE TABLE requirement_bindings (\n project_id uuid NOT NULL REFERENCES projects(id) ON DELETE CASCADE,\n automation_id text NOT NULL,\n env text NOT NULL,\n req_key text NOT NULL,\n connection_id uuid NOT NULL REFERENCES connections(id) ON DELETE CASCADE,\n PRIMARY KEY (project_id, automation_id, env, req_key)\n);\n\nCREATE TABLE secrets (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n workspace_id uuid NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,\n name text NOT NULL,\n value_cipher text NOT NULL,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now(),\n UNIQUE (workspace_id, name)\n);\n\nCREATE TABLE connect_links (\n token text PRIMARY KEY,\n workspace_id uuid NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,\n project_id uuid REFERENCES projects(id) ON DELETE CASCADE,\n requirements jsonb NOT NULL,\n status text NOT NULL DEFAULT 'pending', -- pending|completed|expired\n expires_at timestamptz NOT NULL,\n created_at timestamptz NOT NULL DEFAULT now(),\n completed_at timestamptz\n);\n\nCREATE TABLE oauth_apps (\n workspace_id uuid NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,\n provider text NOT NULL,\n client_id text NOT NULL,\n client_secret_cipher text NOT NULL,\n PRIMARY KEY (workspace_id, provider)\n);\n\nCREATE TABLE oauth_states (\n state text PRIMARY KEY,\n connect_token text REFERENCES connect_links(token) ON DELETE CASCADE,\n connection_id uuid REFERENCES connections(id) ON DELETE CASCADE,\n provider text NOT NULL,\n code_verifier text,\n redirect_uri text NOT NULL,\n created_at timestamptz NOT NULL DEFAULT now(),\n expires_at timestamptz NOT NULL\n);\n\nCREATE TABLE webhook_registrations (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n project_id uuid NOT NULL REFERENCES projects(id) ON DELETE CASCADE,\n automation_id text NOT NULL,\n trigger_id text NOT NULL,\n connector_id text NOT NULL,\n connection_id uuid REFERENCES connections(id) ON DELETE SET NULL,\n env text NOT NULL,\n config_hash text NOT NULL,\n ingress_token text NOT NULL UNIQUE,\n signing_secret_cipher text,\n external_id text,\n state jsonb,\n status text NOT NULL DEFAULT 'pending', -- pending|registered|manual-pending|failed|removed\n error text,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now(),\n UNIQUE (project_id, automation_id, trigger_id, connection_id, env)\n);\n\nCREATE TABLE trigger_state (\n project_id uuid NOT NULL REFERENCES projects(id) ON DELETE CASCADE,\n automation_id text NOT NULL,\n trigger_id text NOT NULL,\n connection_id uuid NOT NULL,\n kind text NOT NULL, -- poll|webhook\n seen jsonb NOT NULL DEFAULT '[]',\n cursor jsonb,\n seeded boolean NOT NULL DEFAULT false,\n last_poll_at timestamptz,\n last_delivery_at timestamptz,\n PRIMARY KEY (project_id, automation_id, trigger_id, connection_id)\n);\n\nCREATE TABLE run_logs (\n id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,\n run_id uuid NOT NULL REFERENCES runs(id) ON DELETE CASCADE,\n step text,\n level text NOT NULL,\n msg text NOT NULL,\n meta jsonb,\n created_at timestamptz NOT NULL DEFAULT now()\n);\nCREATE INDEX run_logs_by_run ON run_logs (run_id, id);\n`,\n },\n {\n id: \"0002-project-webhook-bootstrap\",\n sql: /* sql */ `\nALTER TABLE projects ADD COLUMN IF NOT EXISTS push_webhook_secret_cipher text;\nALTER TABLE projects ADD COLUMN IF NOT EXISTS push_webhook_setup_token_hash text;\n`,\n },\n {\n id: \"0003-run-version-delete-policy\",\n sql: /* sql */ `\nALTER TABLE runs DROP CONSTRAINT IF EXISTS runs_version_id_fkey;\nALTER TABLE runs ADD CONSTRAINT runs_version_id_fkey\n FOREIGN KEY (version_id) REFERENCES automation_versions(id) ON DELETE SET NULL;\n`,\n },\n];\n", "import type { Db } from \"./db.js\";\nimport { migrations } from \"./migrations.js\";\n\nexport async function migrate(db: Db): Promise<string[]> {\n await db.query(\n `CREATE TABLE IF NOT EXISTS schema_migrations (\n id text PRIMARY KEY,\n applied_at timestamptz NOT NULL DEFAULT now()\n )`,\n );\n const { rows } = await db.query<{ id: string }>(`SELECT id FROM schema_migrations`);\n const applied = new Set(rows.map((r) => r.id));\n const ran: string[] = [];\n for (const m of migrations) {\n if (applied.has(m.id)) continue;\n await db.tx(async (c) => {\n // PGlite/pg both accept multi-statement strings via simple query protocol \u2014 but the\n // pg extended protocol (with params) does not; migrations carry no params.\n for (const statement of splitStatements(m.sql)) {\n await c.query(statement);\n }\n await c.query(`INSERT INTO schema_migrations (id) VALUES ($1)`, [m.id]);\n });\n ran.push(m.id);\n }\n return ran;\n}\n\n/** Split on top-level semicolons (none of our DDL contains procedural bodies). */\nfunction splitStatements(sql: string): string[] {\n return sql\n .split(/;\\s*(?=\\n|$)/)\n .map((s) => s.trim())\n .filter((s) => s.length > 0 && !s.startsWith(\"--\"));\n}\n", "// Envelope encryption (ADR-0005): master key (env/file) wraps per-workspace data keys;\n// data keys encrypt credential/secret values at rest. AES-256-GCM, versioned format.\n\nimport { createCipheriv, createDecipheriv, randomBytes } from \"node:crypto\";\n\nconst VERSION = \"v1\";\n\nexport function encrypt(key: Buffer, plaintext: string | Buffer): string {\n if (key.length !== 32) throw new Error(\"encryption key must be 32 bytes\");\n const iv = randomBytes(12);\n const cipher = createCipheriv(\"aes-256-gcm\", key, iv);\n const data = Buffer.concat([cipher.update(plaintext), cipher.final()]);\n const tag = cipher.getAuthTag();\n return [VERSION, iv.toString(\"base64\"), tag.toString(\"base64\"), data.toString(\"base64\")].join(\":\");\n}\n\nexport function decrypt(key: Buffer, payload: string): Buffer {\n const [version, ivB64, tagB64, dataB64] = payload.split(\":\");\n if (version !== VERSION || !ivB64 || !tagB64 || !dataB64) {\n throw new Error(\"unrecognized ciphertext format\");\n }\n const decipher = createDecipheriv(\"aes-256-gcm\", key, Buffer.from(ivB64, \"base64\"));\n decipher.setAuthTag(Buffer.from(tagB64, \"base64\"));\n return Buffer.concat([decipher.update(Buffer.from(dataB64, \"base64\")), decipher.final()]);\n}\n\nexport function generateDataKey(): Buffer {\n return randomBytes(32);\n}\n\nexport function wrapDataKey(masterKey: Buffer, dataKey: Buffer): string {\n return encrypt(masterKey, dataKey);\n}\n\nexport function unwrapDataKey(masterKey: Buffer, wrapped: string): Buffer {\n const key = decrypt(masterKey, wrapped);\n if (key.length !== 32) throw new Error(\"unwrapped data key has wrong length\");\n return key;\n}\n", "// Our own OAuth2 executor (ADR-0004): auth-code + PKCE, refresh, client-credentials \u2014\n// driven entirely by Catalog provider facts. No third-party OAuth code ships.\n\nimport { createHash, randomBytes } from \"node:crypto\";\nimport type { OAuth2ProviderFacts } from \"@devosurf/tesser-sdk/connector\";\n\nexport interface TokenSet {\n accessToken: string;\n refreshToken?: string;\n /** Epoch ms; undefined = non-expiring (e.g. GitHub OAuth-app tokens). */\n expiresAt?: number;\n tokenType?: string;\n scope?: string;\n raw: Record<string, unknown>;\n}\n\nexport class OAuthError extends Error {\n constructor(\n message: string,\n readonly providerResponse?: unknown,\n ) {\n super(message);\n this.name = \"OAuthError\";\n }\n}\n\nfunction b64url(buf: Buffer): string {\n return buf.toString(\"base64\").replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\nexport function generatePkce(): { verifier: string; challenge: string } {\n const verifier = b64url(randomBytes(48));\n const challenge = b64url(createHash(\"sha256\").update(verifier).digest());\n return { verifier, challenge };\n}\n\nexport function buildAuthorizeUrl(opts: {\n facts: OAuth2ProviderFacts;\n clientId: string;\n redirectUri: string;\n scopes: readonly string[];\n state: string;\n codeChallenge?: string | undefined;\n}): string {\n const url = new URL(opts.facts.authorizeUrl);\n url.searchParams.set(\"client_id\", opts.clientId);\n url.searchParams.set(\"redirect_uri\", opts.redirectUri);\n url.searchParams.set(\"response_type\", \"code\");\n url.searchParams.set(\"state\", opts.state);\n if (opts.scopes.length > 0) {\n url.searchParams.set(\"scope\", opts.scopes.join(opts.facts.scopeSeparator ?? \" \"));\n }\n if (opts.codeChallenge !== undefined) {\n url.searchParams.set(\"code_challenge\", opts.codeChallenge);\n url.searchParams.set(\"code_challenge_method\", \"S256\");\n }\n for (const [k, v] of Object.entries(opts.facts.extraAuthorizeParams ?? {})) {\n url.searchParams.set(k, v);\n }\n return url.toString();\n}\n\nasync function tokenRequest(\n facts: OAuth2ProviderFacts,\n clientId: string,\n clientSecret: string | undefined,\n params: Record<string, string>,\n fetchImpl: typeof fetch,\n): Promise<TokenSet> {\n const body = new URLSearchParams(params);\n const headers = new Headers({\n \"content-type\": \"application/x-www-form-urlencoded\",\n // GitHub answers form-encoded unless asked for JSON.\n accept: \"application/json\",\n });\n if ((facts.clientAuth ?? \"body\") === \"basic\") {\n headers.set(\"authorization\", `Basic ${Buffer.from(`${clientId}:${clientSecret ?? \"\"}`).toString(\"base64\")}`);\n } else {\n body.set(\"client_id\", clientId);\n if (clientSecret !== undefined) body.set(\"client_secret\", clientSecret);\n }\n for (const [k, v] of Object.entries(facts.extraTokenParams ?? {})) body.set(k, v);\n\n let res: Response;\n try {\n res = await fetchImpl(facts.tokenUrl, { method: \"POST\", headers, body });\n } catch (cause) {\n throw new OAuthError(`token endpoint unreachable: ${String(cause)}`);\n }\n const text = await res.text();\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(text) as Record<string, unknown>;\n } catch {\n parsed = Object.fromEntries(new URLSearchParams(text)); // form-encoded fallback\n }\n if (!res.ok || parsed[\"error\"] !== undefined || typeof parsed[\"access_token\"] !== \"string\") {\n throw new OAuthError(\n `token endpoint ${res.status}: ${String(parsed[\"error\"] ?? text.slice(0, 200))}`,\n parsed,\n );\n }\n const expiresIn = Number(parsed[\"expires_in\"]);\n return {\n accessToken: parsed[\"access_token\"] as string,\n ...(typeof parsed[\"refresh_token\"] === \"string\" ? { refreshToken: parsed[\"refresh_token\"] } : {}),\n ...(Number.isFinite(expiresIn) && expiresIn > 0 ? { expiresAt: Date.now() + expiresIn * 1000 } : {}),\n ...(typeof parsed[\"token_type\"] === \"string\" ? { tokenType: parsed[\"token_type\"] } : {}),\n ...(typeof parsed[\"scope\"] === \"string\" ? { scope: parsed[\"scope\"] } : {}),\n raw: parsed,\n };\n}\n\nexport async function exchangeCode(opts: {\n facts: OAuth2ProviderFacts;\n clientId: string;\n clientSecret?: string | undefined;\n code: string;\n redirectUri: string;\n codeVerifier?: string | undefined;\n fetchImpl?: typeof fetch;\n}): Promise<TokenSet> {\n return tokenRequest(\n opts.facts,\n opts.clientId,\n opts.clientSecret,\n {\n grant_type: \"authorization_code\",\n code: opts.code,\n redirect_uri: opts.redirectUri,\n ...(opts.codeVerifier !== undefined ? { code_verifier: opts.codeVerifier } : {}),\n },\n opts.fetchImpl ?? fetch,\n );\n}\n\nexport async function refreshToken(opts: {\n facts: OAuth2ProviderFacts;\n clientId: string;\n clientSecret?: string | undefined;\n refreshToken: string;\n fetchImpl?: typeof fetch;\n}): Promise<TokenSet> {\n return tokenRequest(\n opts.facts,\n opts.clientId,\n opts.clientSecret,\n { grant_type: \"refresh_token\", refresh_token: opts.refreshToken },\n opts.fetchImpl ?? fetch,\n );\n}\n\nexport async function clientCredentials(opts: {\n facts: OAuth2ProviderFacts;\n clientId: string;\n clientSecret: string;\n scopes: readonly string[];\n fetchImpl?: typeof fetch;\n}): Promise<TokenSet> {\n return tokenRequest(\n opts.facts,\n opts.clientId,\n opts.clientSecret,\n {\n grant_type: \"client_credentials\",\n ...(opts.scopes.length > 0 ? { scope: opts.scopes.join(opts.facts.scopeSeparator ?? \" \") } : {}),\n },\n opts.fetchImpl ?? fetch,\n );\n}\n", "// The Credential broker (ADR-0004/0005): the ONLY place credential values are decrypted.\n// Automations hold handles; the broker injects values at call time and registers every\n// decrypted value with the log masker. Refresh is single-flight per connection.\n\nimport type { OAuth2ProviderFacts } from \"@devosurf/tesser-sdk/connector\";\nimport type { Db } from \"../db/db.js\";\nimport { decrypt, encrypt, generateDataKey, unwrapDataKey, wrapDataKey } from \"./crypto.js\";\nimport { Masker } from \"./masking.js\";\nimport { refreshToken } from \"./oauth.js\";\n\nexport interface ConnectionRow {\n id: string;\n workspace_id: string;\n connector_id: string;\n provider: string | null;\n auth_mode: string;\n scope: string;\n end_user_id: string | null;\n label: string | null;\n credential_cipher: string | null;\n credential_meta: { expiresAt?: number; scope?: string; tokenType?: string };\n status: string;\n}\n\nexport interface CredentialBundle {\n fields: Record<string, string>;\n meta: ConnectionRow[\"credential_meta\"];\n}\n\nexport class Broker {\n private dataKeys = new Map<string, Buffer>();\n private refreshing = new Map<string, Promise<boolean>>();\n\n constructor(\n private readonly db: Db,\n private readonly masterKey: Buffer,\n readonly masker: Masker,\n private readonly fetchImpl: typeof fetch = fetch,\n ) {}\n\n // ---- workspaces & data keys ----\n\n async ensureDefaultWorkspace(): Promise<string> {\n const existing = await this.db.query<{ id: string }>(\n `SELECT id FROM workspaces ORDER BY created_at LIMIT 1`,\n );\n if (existing.rows[0]) return existing.rows[0].id;\n const wrapped = wrapDataKey(this.masterKey, generateDataKey());\n const created = await this.db.query<{ id: string }>(\n `INSERT INTO workspaces (name, data_key_cipher) VALUES ('default', $1) RETURNING id`,\n [wrapped],\n );\n return created.rows[0]!.id;\n }\n\n private async dataKey(workspaceId: string): Promise<Buffer> {\n const cached = this.dataKeys.get(workspaceId);\n if (cached) return cached;\n const { rows } = await this.db.query<{ data_key_cipher: string }>(\n `SELECT data_key_cipher FROM workspaces WHERE id = $1`,\n [workspaceId],\n );\n if (!rows[0]) throw new Error(`workspace ${workspaceId} not found`);\n const key = unwrapDataKey(this.masterKey, rows[0].data_key_cipher);\n this.dataKeys.set(workspaceId, key);\n return key;\n }\n\n // ---- secrets (raw values, ADR-0010) ----\n\n async setSecret(workspaceId: string, name: string, value: string): Promise<void> {\n const cipher = encrypt(await this.dataKey(workspaceId), value);\n await this.db.query(\n `INSERT INTO secrets (workspace_id, name, value_cipher) VALUES ($1,$2,$3)\n ON CONFLICT (workspace_id, name) DO UPDATE SET value_cipher = EXCLUDED.value_cipher, updated_at = now()`,\n [workspaceId, name, cipher],\n );\n this.masker.add(value, `secret.${name}`);\n }\n\n async getSecretValue(workspaceId: string, name: string): Promise<string | null> {\n const { rows } = await this.db.query<{ value_cipher: string }>(\n `SELECT value_cipher FROM secrets WHERE workspace_id=$1 AND name=$2`,\n [workspaceId, name],\n );\n if (!rows[0]) return null;\n const value = decrypt(await this.dataKey(workspaceId), rows[0].value_cipher).toString(\"utf8\");\n this.masker.add(value, `secret.${name}`);\n return value;\n }\n\n async listSecretNames(workspaceId: string): Promise<Array<{ name: string; updatedAt: string }>> {\n const { rows } = await this.db.query<{ name: string; updated_at: string }>(\n `SELECT name, updated_at FROM secrets WHERE workspace_id=$1 ORDER BY name`,\n [workspaceId],\n );\n return rows.map((r) => ({ name: r.name, updatedAt: String(r.updated_at) }));\n }\n\n async deleteSecret(workspaceId: string, name: string): Promise<boolean> {\n const { rowCount } = await this.db.query(`DELETE FROM secrets WHERE workspace_id=$1 AND name=$2`, [\n workspaceId,\n name,\n ]);\n return rowCount > 0;\n }\n\n // ---- connections ----\n\n async createConnection(opts: {\n workspaceId: string;\n connectorId: string;\n provider?: string | undefined;\n authMode?: string;\n scope?: \"workspace\" | \"per_user\";\n endUserId?: string;\n label?: string;\n }): Promise<string> {\n const { rows } = await this.db.query<{ id: string }>(\n `INSERT INTO connections (workspace_id, connector_id, provider, auth_mode, scope, end_user_id, label, status)\n VALUES ($1,$2,$3,$4,$5,$6,$7,'pending') RETURNING id`,\n [\n opts.workspaceId,\n opts.connectorId,\n opts.provider ?? null,\n opts.authMode ?? \"default\",\n opts.scope ?? \"workspace\",\n opts.endUserId ?? null,\n opts.label ?? null,\n ],\n );\n return rows[0]!.id;\n }\n\n async setConnectionCredential(\n connectionId: string,\n fields: Record<string, string>,\n meta: ConnectionRow[\"credential_meta\"] = {},\n ): Promise<void> {\n const { rows } = await this.db.query<{ workspace_id: string; connector_id: string }>(\n `SELECT workspace_id, connector_id FROM connections WHERE id=$1`,\n [connectionId],\n );\n if (!rows[0]) throw new Error(`connection ${connectionId} not found`);\n const cipher = encrypt(await this.dataKey(rows[0].workspace_id), JSON.stringify(fields));\n await this.db.query(\n `UPDATE connections SET credential_cipher=$2, credential_meta=$3::jsonb, status='ready', error=NULL, updated_at=now()\n WHERE id=$1`,\n [connectionId, cipher, JSON.stringify(meta)],\n );\n this.masker.addFields(fields, `connection.${rows[0].connector_id}`);\n }\n\n async getConnection(connectionId: string): Promise<ConnectionRow | null> {\n const { rows } = await this.db.query<ConnectionRow>(`SELECT * FROM connections WHERE id=$1`, [connectionId]);\n return rows[0] ?? null;\n }\n\n async getCredential(connectionId: string): Promise<CredentialBundle> {\n const row = await this.getConnection(connectionId);\n if (!row || row.status !== \"ready\" || !row.credential_cipher) {\n throw new Error(`connection ${connectionId} is not ready`);\n }\n const fields = JSON.parse(\n decrypt(await this.dataKey(row.workspace_id), row.credential_cipher).toString(\"utf8\"),\n ) as Record<string, string>;\n this.masker.addFields(fields, `connection.${row.connector_id}`);\n return { fields, meta: row.credential_meta ?? {} };\n }\n\n async listConnections(workspaceId: string): Promise<\n Array<{ id: string; connectorId: string; authMode: string; scope: string; label: string | null; status: string; endUserId: string | null }>\n > {\n const { rows } = await this.db.query<ConnectionRow>(\n `SELECT * FROM connections WHERE workspace_id=$1 ORDER BY created_at`,\n [workspaceId],\n );\n return rows.map((r) => ({\n id: r.id,\n connectorId: r.connector_id,\n authMode: r.auth_mode,\n scope: r.scope,\n label: r.label,\n status: r.status,\n endUserId: r.end_user_id,\n }));\n }\n\n /** Resolve an automation's `connections.<reqKey>` to a concrete ready Connection \u2014\n * the persisted binding wins; otherwise auto-bind when exactly one candidate exists. */\n async resolveBinding(opts: {\n workspaceId: string;\n projectId: string;\n automationId: string;\n env: string;\n reqKey: string;\n connectorId: string;\n scope: \"workspace\" | \"per_user\";\n endUserId?: string | undefined;\n }): Promise<ConnectionRow | null> {\n if (opts.scope === \"workspace\") {\n const bound = await this.db.query<{ connection_id: string }>(\n `SELECT connection_id FROM requirement_bindings\n WHERE project_id=$1 AND automation_id=$2 AND env=$3 AND req_key=$4`,\n [opts.projectId, opts.automationId, opts.env, opts.reqKey],\n );\n if (bound.rows[0]) {\n const conn = await this.getConnection(bound.rows[0].connection_id);\n if (conn?.status === \"ready\") return conn;\n }\n }\n const endUserFilter = opts.scope === \"per_user\" ? `AND end_user_id = $4` : `AND scope = 'workspace'`;\n const params: unknown[] =\n opts.scope === \"per_user\"\n ? [opts.workspaceId, opts.connectorId, \"ready\", opts.endUserId ?? null]\n : [opts.workspaceId, opts.connectorId, \"ready\"];\n const { rows } = await this.db.query<ConnectionRow>(\n `SELECT * FROM connections WHERE workspace_id=$1 AND connector_id=$2 AND status=$3 ${endUserFilter}\n ORDER BY created_at`,\n params,\n );\n if (rows.length !== 1) return null; // 0 = missing; >1 = ambiguous \u2192 must bind explicitly\n const conn = rows[0]!;\n if (opts.scope === \"workspace\") {\n await this.db.query(\n `INSERT INTO requirement_bindings (project_id, automation_id, env, req_key, connection_id)\n VALUES ($1,$2,$3,$4,$5)\n ON CONFLICT (project_id, automation_id, env, req_key) DO UPDATE SET connection_id = EXCLUDED.connection_id`,\n [opts.projectId, opts.automationId, opts.env, opts.reqKey, conn.id],\n );\n }\n return conn;\n }\n\n // ---- OAuth apps (BYO per workspace, ADR-0005; env fallback for dev) ----\n\n async setOAuthApp(workspaceId: string, provider: string, clientId: string, clientSecret: string): Promise<void> {\n const cipher = encrypt(await this.dataKey(workspaceId), clientSecret);\n await this.db.query(\n `INSERT INTO oauth_apps (workspace_id, provider, client_id, client_secret_cipher)\n VALUES ($1,$2,$3,$4)\n ON CONFLICT (workspace_id, provider) DO UPDATE SET client_id=EXCLUDED.client_id, client_secret_cipher=EXCLUDED.client_secret_cipher`,\n [workspaceId, provider, clientId, cipher],\n );\n this.masker.add(clientSecret, `oauthapp.${provider}`);\n }\n\n async getOAuthApp(\n workspaceId: string,\n provider: string,\n ): Promise<{ clientId: string; clientSecret: string } | null> {\n const { rows } = await this.db.query<{ client_id: string; client_secret_cipher: string }>(\n `SELECT client_id, client_secret_cipher FROM oauth_apps WHERE workspace_id=$1 AND provider=$2`,\n [workspaceId, provider],\n );\n if (rows[0]) {\n const clientSecret = decrypt(await this.dataKey(workspaceId), rows[0].client_secret_cipher).toString(\"utf8\");\n this.masker.add(clientSecret, `oauthapp.${provider}`);\n return { clientId: rows[0].client_id, clientSecret };\n }\n const envKey = provider.toUpperCase().replace(/[^A-Z0-9]/g, \"_\");\n const clientId = process.env[`TESSER_OAUTH_${envKey}_CLIENT_ID`];\n const clientSecret = process.env[`TESSER_OAUTH_${envKey}_CLIENT_SECRET`];\n if (clientId && clientSecret) return { clientId, clientSecret };\n return null;\n }\n\n // ---- token freshness (refresh-once, single-flight per connection) ----\n\n /** Returns true when a refresh happened (caller should re-read the credential). */\n async refreshConnection(connectionId: string, facts: OAuth2ProviderFacts): Promise<boolean> {\n const inFlight = this.refreshing.get(connectionId);\n if (inFlight) return inFlight;\n const p = (async (): Promise<boolean> => {\n const row = await this.getConnection(connectionId);\n if (!row) return false;\n const { fields, meta } = await this.getCredential(connectionId);\n const rt = fields[\"refresh_token\"];\n if (rt === undefined) return false;\n const app = await this.getOAuthApp(row.workspace_id, row.provider ?? row.connector_id);\n if (!app) return false;\n const tokens = await refreshToken({\n facts,\n clientId: app.clientId,\n clientSecret: app.clientSecret,\n refreshToken: rt,\n fetchImpl: this.fetchImpl,\n });\n const nextFields: Record<string, string> = {\n ...fields,\n access_token: tokens.accessToken,\n ...(tokens.refreshToken !== undefined ? { refresh_token: tokens.refreshToken } : {}),\n };\n await this.setConnectionCredential(connectionId, nextFields, {\n ...meta,\n ...(tokens.expiresAt !== undefined ? { expiresAt: tokens.expiresAt } : {}),\n });\n return true;\n })().finally(() => this.refreshing.delete(connectionId));\n this.refreshing.set(connectionId, p);\n return p;\n }\n\n /** Workspace-keyed encryption for values that live outside the secrets table\n * (deploy keys, webhook signing secrets). */\n async encryptValue(workspaceId: string, value: string, maskLabel?: string): Promise<string> {\n if (maskLabel !== undefined) this.masker.add(value, maskLabel);\n return encrypt(await this.dataKey(workspaceId), value);\n }\n\n async decryptValue(workspaceId: string, cipher: string, maskLabel?: string): Promise<string> {\n const value = decrypt(await this.dataKey(workspaceId), cipher).toString(\"utf8\");\n if (maskLabel !== undefined) this.masker.add(value, maskLabel);\n return value;\n }\n\n /** Ensure a fresh access token (60s slack) before injecting. */\n async freshCredential(connectionId: string, facts: OAuth2ProviderFacts | undefined): Promise<CredentialBundle> {\n let bundle = await this.getCredential(connectionId);\n const expiresAt = bundle.meta.expiresAt;\n if (\n facts !== undefined &&\n typeof expiresAt === \"number\" &&\n expiresAt < Date.now() + 60_000 &&\n bundle.fields[\"refresh_token\"] !== undefined\n ) {\n const refreshed = await this.refreshConnection(connectionId, facts);\n if (refreshed) bundle = await this.getCredential(connectionId);\n }\n return bundle;\n }\n}\n", "// Log masking (ADR-0005): every decrypted credential value (\u2265 8 chars \u2014 shorter values\n// would mask common words) is registered here; every string headed to logs passes\n// through mask(). The broker is the only place values are decrypted, so registration\n// is structurally complete.\n\nconst MIN_LENGTH = 8;\n\nexport class Masker {\n private values = new Map<string, string>(); // value \u2192 label\n\n add(value: string, label = \"secret\"): void {\n if (typeof value !== \"string\" || value.length < MIN_LENGTH) return;\n this.values.set(value, label);\n }\n\n addFields(fields: Record<string, string>, prefix: string): void {\n for (const [k, v] of Object.entries(fields)) this.add(v, `${prefix}.${k}`);\n }\n\n mask(text: string): string {\n if (typeof text !== \"string\" || text.length === 0) return text;\n let out = text;\n for (const [value, label] of this.values) {\n if (out.includes(value)) out = out.split(value).join(`[masked:${label}]`);\n }\n return out;\n }\n\n get size(): number {\n return this.values.size;\n }\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", "// 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", "// 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", "// The pre-authed connector HTTP client (ADR-0012). The SDK owns the *mechanics* \u2014\n// URL/base-URL handling, JSON encoding, status\u2192Retryable/Terminal classification,\n// Retry-After, refresh-once on 401 \u2014 while the credential itself enters only through\n// the runtime-supplied `applyAuth` hook at call time (the broker boundary, ADR-0004).\n\nimport { RetryableError, TerminalError } from \"../errors.js\";\n\nexport interface HttpRequestOptions {\n method?: string;\n path?: string;\n query?: Record<string, string | number | boolean | undefined>;\n headers?: Record<string, string>;\n /** JSON-encoded unless `body` is a string / Uint8Array / URLSearchParams / FormData. */\n body?: unknown;\n /** Return the raw Response instead of the parsed body. */\n raw?: boolean;\n timeoutMs?: number;\n}\n\nexport interface ProviderHttpError {\n status: number;\n bodySnippet: string;\n url: string;\n}\n\n/** Classification override, per action (ADR-0012). Return an Error to throw it as-is. */\nexport type ClassifyError = (\n err: ProviderHttpError,\n) => \"retry\" | \"terminal\" | Error | undefined;\n\nexport interface TesserHttpConfig {\n baseUrl?: string;\n fetchImpl?: typeof fetch;\n defaultHeaders?: Record<string, string>;\n /** Inject the credential into the outbound request. Supplied by the runtime, never by authors. */\n applyAuth?: (req: { url: URL; headers: Headers }) => void | Promise<void>;\n /** Broker refresh-once hook: called on 401; return true to retry the call once. */\n onUnauthorized?: () => Promise<boolean>;\n classifyError?: ClassifyError;\n timeoutMs?: number;\n}\n\nexport interface TesserHttp {\n get(path: string, opts?: HttpRequestOptions): Promise<any>;\n delete(path: string, opts?: HttpRequestOptions): Promise<any>;\n post(path: string, body?: unknown, opts?: HttpRequestOptions): Promise<any>;\n put(path: string, body?: unknown, opts?: HttpRequestOptions): Promise<any>;\n patch(path: string, body?: unknown, opts?: HttpRequestOptions): Promise<any>;\n request(opts: HttpRequestOptions & { path: string }): Promise<any>;\n}\n\nfunction parseRetryAfter(value: string | null): number | undefined {\n if (!value) return undefined;\n const secs = Number(value);\n if (Number.isFinite(secs)) return Math.max(0, secs * 1000);\n const date = Date.parse(value);\n if (!Number.isNaN(date)) return Math.max(0, date - Date.now());\n return undefined;\n}\n\nconst RETRYABLE_STATUS = new Set([408, 425, 429, 500, 502, 503, 504]);\n\nexport function classifyStatus(status: number): \"retry\" | \"terminal\" | \"ok\" | \"unauthorized\" {\n if (status >= 200 && status < 300) return \"ok\";\n if (status === 401) return \"unauthorized\";\n if (RETRYABLE_STATUS.has(status) || status >= 500) return \"retry\";\n return \"terminal\";\n}\n\nexport function createHttpClient(config: TesserHttpConfig): TesserHttp {\n const fetchImpl = config.fetchImpl ?? fetch;\n\n function buildUrl(path: string, query?: HttpRequestOptions[\"query\"]): URL {\n let url: URL;\n if (/^https?:\\/\\//.test(path)) {\n url = new URL(path);\n } else {\n if (!config.baseUrl) {\n throw new TerminalError(`http: relative path \"${path}\" but the connector has no baseUrl`);\n }\n const base = config.baseUrl.endsWith(\"/\") ? config.baseUrl : config.baseUrl + \"/\";\n url = new URL(path.startsWith(\"/\") ? path.slice(1) : path, base);\n }\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined) url.searchParams.set(k, String(v));\n }\n }\n return url;\n }\n\n async function exec(opts: HttpRequestOptions & { path: string }, isRetryAfter401 = false): Promise<any> {\n const url = buildUrl(opts.path, opts.query);\n const headers = new Headers(config.defaultHeaders);\n headers.set(\"accept\", headers.get(\"accept\") ?? \"application/json\");\n if (opts.headers) for (const [k, v] of Object.entries(opts.headers)) headers.set(k, v);\n\n type FetchBody = NonNullable<Parameters<typeof fetch>[1]> extends { body?: infer B }\n ? B\n : never;\n let body: FetchBody | undefined;\n if (opts.body !== undefined) {\n if (\n typeof opts.body === \"string\" ||\n opts.body instanceof Uint8Array ||\n opts.body instanceof URLSearchParams ||\n (typeof FormData !== \"undefined\" && opts.body instanceof FormData)\n ) {\n body = opts.body as FetchBody;\n } else {\n body = JSON.stringify(opts.body);\n if (!headers.has(\"content-type\")) headers.set(\"content-type\", \"application/json\");\n }\n }\n\n await config.applyAuth?.({ url, headers });\n\n const timeoutMs = opts.timeoutMs ?? config.timeoutMs ?? 30_000;\n let res: Response;\n try {\n res = await fetchImpl(url, {\n method: opts.method ?? \"GET\",\n headers,\n signal: AbortSignal.timeout(timeoutMs),\n ...(body !== undefined ? { body } : {}),\n });\n } catch (cause) {\n throw new RetryableError(`http: network failure for ${opts.method ?? \"GET\"} ${url.host}${url.pathname}`, {\n cause,\n });\n }\n\n // raw mode: the caller owns status handling entirely (e.g. the generic http connector).\n if (opts.raw) return res;\n\n const kind = classifyStatus(res.status);\n if (kind === \"ok\") {\n const text = await res.text();\n if (text.length === 0) return null;\n const contentType = res.headers.get(\"content-type\") ?? \"\";\n if (contentType.includes(\"json\")) return JSON.parse(text);\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }\n\n if (kind === \"unauthorized\" && !isRetryAfter401 && config.onUnauthorized) {\n const refreshed = await config.onUnauthorized();\n if (refreshed) return exec(opts, true);\n }\n\n const bodySnippet = (await res.text().catch(() => \"\")).slice(0, 600);\n const providerErr: ProviderHttpError = { status: res.status, bodySnippet, url: url.toString() };\n const overridden = config.classifyError?.(providerErr);\n if (overridden instanceof Error) throw overridden;\n const finalKind = overridden ?? (kind === \"unauthorized\" ? \"terminal\" : kind);\n\n const message = `provider responded ${res.status} for ${opts.method ?? \"GET\"} ${url.pathname}${\n bodySnippet ? ` \u2014 ${bodySnippet}` : \"\"\n }`;\n if (finalKind === \"retry\") {\n throw new RetryableError(message, {\n retryAfterMs: parseRetryAfter(res.headers.get(\"retry-after\")),\n });\n }\n throw new TerminalError(message);\n }\n\n return {\n get: (path, opts) => exec({ ...opts, path, method: \"GET\" }),\n delete: (path, opts) => exec({ ...opts, path, method: \"DELETE\" }),\n post: (path, body, opts) => exec({ ...opts, path, body, method: \"POST\" }),\n put: (path, body, opts) => exec({ ...opts, path, body, method: \"PUT\" }),\n patch: (path, body, opts) => exec({ ...opts, path, body, method: \"PATCH\" }),\n request: (opts) => exec(opts),\n };\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", "// Wires the broker into the engine: builds ctx.connections (typed clients whose every\n// call gets the credential injected at call time) and ctx.secrets. The automation never\n// sees a value that isn't masked in logs.\n\nimport { TerminalError, type AutomationDef, type HarnessRunResult, type Logger, type NormalizedModelResponse } from \"@devosurf/tesser-sdk\";\nimport type {\n ActionCtx,\n AnyAction,\n AuthDecl,\n ConnectorInstance,\n OAuth2ProviderFacts,\n ProviderFacts,\n} from \"@devosurf/tesser-sdk/connector\";\nimport {\n buildConnectorClient,\n createHttpClient,\n isRetrySafe,\n runAction,\n type HarnessCallInfo,\n type ModelCallInfo,\n type TesserHttpConfig,\n} from \"@devosurf/tesser-sdk/internal\";\nimport type { Db } from \"../db/db.js\";\nimport type { ActiveStepHooks, EngineDeps, RunRow } from \"../engine/types.js\";\nimport type { Broker, ConnectionRow } from \"./broker.js\";\n\nexport function authDeclFor(spec: ConnectorInstance<any, any>[\"__connector\"], mode: string): AuthDecl {\n const auth = spec.auth as AuthDecl | Record<string, AuthDecl>;\n if (\"kind\" in auth && typeof auth.kind === \"string\") return auth as AuthDecl;\n const decl = (auth as Record<string, AuthDecl>)[mode];\n if (!decl) throw new TerminalError(`connector ${spec.id}: unknown auth mode \"${mode}\"`);\n return decl;\n}\n\nexport function providerFactsOf(spec: ConnectorInstance<any, any>[\"__connector\"]): ProviderFacts | undefined {\n return typeof spec.provider === \"object\" ? spec.provider : undefined;\n}\n\nexport function applyAuthFor(decl: AuthDecl, fields: Record<string, string>): TesserHttpConfig[\"applyAuth\"] {\n switch (decl.kind) {\n case \"oauth2\":\n return ({ headers }) => {\n headers.set(\"authorization\", `Bearer ${fields[\"access_token\"] ?? \"\"}`);\n };\n case \"apiKey\": {\n const value = (decl.prefix ?? \"\") + (fields[\"api_key\"] ?? \"\");\n if (decl.in === \"query\") {\n return ({ url }) => {\n url.searchParams.set(decl.name, fields[\"api_key\"] ?? \"\");\n };\n }\n return ({ headers }) => {\n headers.set(decl.name, value);\n };\n }\n case \"basic\":\n return ({ headers }) => {\n headers.set(\n \"authorization\",\n `Basic ${Buffer.from(`${fields[\"username\"] ?? \"\"}:${fields[\"password\"] ?? \"\"}`).toString(\"base64\")}`,\n );\n };\n case \"custom\":\n return (req) => decl.sign(req, fields);\n }\n}\n\nexport interface BindingDeps {\n db: Db;\n broker: Broker;\n fetchImpl?: typeof fetch;\n}\n\nasync function workspaceOf(db: Db, projectId: string): Promise<string> {\n const { rows } = await db.query<{ workspace_id: string }>(\n `SELECT workspace_id FROM projects WHERE id=$1`,\n [projectId],\n );\n if (!rows[0]) throw new TerminalError(`project ${projectId} not found`);\n return rows[0].workspace_id;\n}\n\nexport function makeEngineBindings(deps: BindingDeps): Pick<EngineDeps, \"buildConnections\" | \"resolveSecrets\" | \"callModel\" | \"callHarness\"> {\n async function connectionFor(run: RunRow, def: AutomationDef<any, any, any, any, any, any, any>, reqKey: string) {\n const connector = ((def.connections ?? {}) as Record<string, ConnectorInstance<any, any>>)[reqKey];\n if (!connector) throw new TerminalError(`connection \"${reqKey}\" is not declared`);\n const workspaceId = await workspaceOf(deps.db, run.project_id);\n const endUserId = (run.trigger[\"endUserId\"] as string | undefined) ?? undefined;\n const conn = await deps.broker.resolveBinding({\n workspaceId,\n projectId: run.project_id,\n automationId: run.automation_id,\n env: run.env,\n reqKey,\n connectorId: connector.id,\n scope: connector.scope ?? \"workspace\",\n endUserId,\n });\n if (!conn) {\n throw new TerminalError(\n `no ready ${connector.id} connection for \"${reqKey}\" \u2014 run \\`tesser connect\\` (deploy should have halted; ADR-0005)`,\n );\n }\n return { workspaceId, connector, conn };\n }\n\n return {\n async buildConnections(run: RunRow, def: AutomationDef<any, any, any, any, any, any, any>, hooks: ActiveStepHooks) {\n const out: Record<string, unknown> = {};\n const entries = Object.entries((def.connections ?? {}) as Record<string, ConnectorInstance<any, any>>);\n if (entries.length === 0) return out;\n const workspaceId = await workspaceOf(deps.db, run.project_id);\n\n for (const [reqKey, connector] of entries) {\n const spec = connector.__connector;\n const facts = providerFactsOf(spec);\n const endUserId = (run.trigger[\"endUserId\"] as string | undefined) ?? undefined;\n\n out[reqKey] = buildConnectorClient(connector, async (path, actionDef, input) => {\n const step = hooks.current();\n if (!step) {\n throw new TerminalError(\n `connector call ${connector.id}.${path.join(\".\")} outside ctx.step \u2014 side effects live inside steps (ADR-0002)`,\n );\n }\n const { conn } = await connectionFor(run, def, reqKey);\n if (!isRetrySafe(actionDef as AnyAction, spec.idempotencyHeader !== undefined)) {\n step.markUnsafeWrite();\n }\n const decl = authDeclFor(spec, conn.auth_mode);\n const bundle = await deps.broker.freshCredential(conn.id, facts?.oauth2);\n\n const actx = makeActionCtx({\n spec,\n decl,\n conn,\n facts,\n fields: bundle.fields,\n broker: deps.broker,\n idempotencyKey: step.idempotencyKey,\n ...(deps.fetchImpl !== undefined ? { fetchImpl: deps.fetchImpl } : {}),\n ...(actionDef.classifyError !== undefined ? { classifyError: actionDef.classifyError } : {}),\n });\n return runAction(actionDef as AnyAction, actx, input, `${connector.id}.${path.join(\".\")}`);\n });\n }\n return out;\n },\n\n async resolveSecrets(run: RunRow, def: AutomationDef<any, any, any, any, any, any, any>) {\n const names = Object.keys((def.secrets ?? {}) as Record<string, unknown>);\n if (names.length === 0) return {};\n const workspaceId = await workspaceOf(deps.db, run.project_id);\n const out: Record<string, string> = {};\n for (const name of names) {\n const value = await deps.broker.getSecretValue(workspaceId, name);\n if (value === null) {\n throw new TerminalError(`secret \"${name}\" is not set \u2014 deploy should have halted (ADR-0005)`);\n }\n out[name] = value;\n }\n return out;\n },\n\n async callModel(\n run: RunRow,\n def: AutomationDef<any, any, any, any, any, any, any>,\n hooks: ActiveStepHooks,\n info: ModelCallInfo,\n ): Promise<NormalizedModelResponse> {\n const step = hooks.current();\n if (!step) {\n throw new TerminalError(`model call ${info.operatorKey}.${info.modelKey} outside ctx.step`);\n }\n const { connector, conn } = await connectionFor(run, def, info.model.connection);\n const spec = connector.__connector;\n if (!spec.modelProvider) {\n throw new TerminalError(`connection \"${info.model.connection}\" (${connector.id}) is not model-capable`);\n }\n const facts = providerFactsOf(spec);\n const decl = authDeclFor(spec, conn.auth_mode);\n const bundle = await deps.broker.freshCredential(conn.id, facts?.oauth2);\n const actx = makeActionCtx({\n spec,\n decl,\n conn,\n facts,\n fields: bundle.fields,\n broker: deps.broker,\n idempotencyKey: step.idempotencyKey,\n ...(deps.fetchImpl !== undefined ? { fetchImpl: deps.fetchImpl } : {}),\n });\n return spec.modelProvider.call(actx, info.request);\n },\n\n async callHarness(\n run: RunRow,\n def: AutomationDef<any, any, any, any, any, any, any>,\n hooks: ActiveStepHooks,\n info: HarnessCallInfo,\n ): Promise<HarnessRunResult<unknown>> {\n const step = hooks.current();\n if (!step) throw new TerminalError(`harness.${info.harnessKey} ran outside ctx.step`);\n const { connector, conn } = await connectionFor(run, def, info.harness.connection);\n const spec = connector.__connector;\n if (!spec.harnessProvider) {\n throw new TerminalError(`connection \"${info.harness.connection}\" (${connector.id}) is not harness-capable`);\n }\n const facts = providerFactsOf(spec);\n const decl = authDeclFor(spec, conn.auth_mode);\n const bundle = await deps.broker.freshCredential(conn.id, facts?.oauth2);\n const actx = makeActionCtx({\n spec,\n decl,\n conn,\n facts,\n fields: bundle.fields,\n broker: deps.broker,\n idempotencyKey: step.idempotencyKey,\n ...(deps.fetchImpl !== undefined ? { fetchImpl: deps.fetchImpl } : {}),\n });\n return spec.harnessProvider.run(actx, info.request, info.harness);\n },\n };\n}\n\n/** Build a pre-authed ActionCtx for one connector call \u2014 also used by the trigger\n * registrar and pollers (ADR-0013 shares the broker boundary). */\nexport function makeActionCtx(opts: {\n spec: ConnectorInstance<any, any>[\"__connector\"];\n decl: AuthDecl;\n conn: ConnectionRow;\n facts: ProviderFacts | undefined;\n fields: Record<string, string>;\n broker: Broker;\n idempotencyKey?: string | undefined;\n fetchImpl?: typeof fetch | undefined;\n classifyError?: AnyAction[\"classifyError\"] | undefined;\n logger?: Logger;\n}): ActionCtx {\n const baseUrl = opts.spec.baseUrl ?? opts.facts?.baseUrl;\n const oauthFacts: OAuth2ProviderFacts | undefined = opts.facts?.oauth2;\n let fields = opts.fields;\n\n const http = createHttpClient({\n ...(baseUrl !== undefined ? { baseUrl } : {}),\n ...(opts.spec.defaultHeaders !== undefined ? { defaultHeaders: opts.spec.defaultHeaders } : {}),\n ...(opts.fetchImpl !== undefined ? { fetchImpl: opts.fetchImpl } : {}),\n ...(opts.classifyError !== undefined ? { classifyError: opts.classifyError } : {}),\n applyAuth: async (req) => {\n const apply = applyAuthFor(opts.decl, fields);\n await apply?.(req);\n },\n ...(opts.decl.kind === \"oauth2\" && oauthFacts !== undefined\n ? {\n onUnauthorized: async () => {\n const refreshed = await opts.broker.refreshConnection(opts.conn.id, oauthFacts);\n if (refreshed) {\n fields = (await opts.broker.getCredential(opts.conn.id)).fields;\n }\n return refreshed;\n },\n }\n : {}),\n });\n\n const silent: Logger = { info() {}, warn() {}, error() {} };\n return {\n http,\n auth: {\n kind: opts.decl.kind,\n ...(opts.conn.auth_mode !== \"default\" ? { mode: opts.conn.auth_mode } : {}),\n fields,\n },\n logger: opts.logger ?? silent,\n ...(opts.idempotencyKey !== undefined ? { idempotencyKey: opts.idempotencyKey } : {}),\n };\n}\n", "// The durable engine (ADR-0002/0003): journal-of-results over plain Postgres. The\n// handler re-executes from the top on every (re)invocation; completed steps return\n// journaled results; everything else is ordinary TypeScript. Suspensions (sleep, signal\n// waits, durable retries) unwind via RunSuspended and a queue job re-invokes later \u2014\n// hibernate-on-wait, zero idle cost.\n//\n// Exactly-once INTERNAL: a step's checkpoint (result + buffered events + fan-out jobs)\n// commits in ONE transaction. External connector calls stay at-least-once with the\n// auto-derived idempotency key (runId + step + occurrence).\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { AutomationDef, Ctx, EventDefinition, Logger, Schema, StepOpts } from \"@devosurf/tesser-sdk\";\nimport { isRetryableError, isTerminalError, TerminalError, RetryableError } from \"@devosurf/tesser-sdk\";\nimport {\n buildHarnesses,\n buildOperators,\n decodeJournal,\n encodeJournal,\n nextRetryDelayMs,\n parseDuration,\n resolveRetryPolicy,\n validateSchema,\n type JsonValue,\n} from \"@devosurf/tesser-sdk/internal\";\nimport { enqueue } from \"../queue/queue.js\";\nimport { RunSuspended } from \"./signals.js\";\nimport type { EngineDeps, RunOutcome, RunRow } from \"./types.js\";\n\ninterface StepRow {\n name: string;\n occurrence: number;\n status: string;\n attempts: number;\n result: JsonValue | null;\n error: { name?: string; message?: string } | null;\n}\n\ninterface ActiveStep {\n name: string;\n occurrence: number;\n idempotencyKey: string;\n unsafeWrite: boolean;\n events: Array<{ name: string; payload: JsonValue }>;\n}\n\nfunction serializeError(err: unknown): JsonValue {\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 ...(e.stack !== undefined ? { stack: e.stack.split(\"\\n\").slice(0, 12).join(\"\\n\") } : {}),\n };\n}\n\nexport async function executeRun(deps: EngineDeps, runId: string): Promise<RunOutcome> {\n const { db } = deps;\n const { rows: runRows } = await db.query<RunRow>(`SELECT * FROM runs WHERE id = $1`, [runId]);\n const run = runRows[0];\n if (!run) return \"skipped\";\n if ([\"completed\", \"failed\", \"cancelled\"].includes(run.status)) return \"skipped\";\n if (!run.version_id) {\n await db.query(`UPDATE runs SET status='failed', error=$2::jsonb, finished_at=now() WHERE id=$1`, [\n runId,\n JSON.stringify({ name: \"TesserError\", message: \"run has no version\" }),\n ]);\n return \"failed\";\n }\n\n const def = await deps.loadAutomation(run.version_id);\n let input = run.input === null ? undefined : decodeJournal(run.input);\n\n // Validate input against the declared schema (def.input, or the trigger's own).\n const inputSchema =\n def.input ??\n (def.trigger as { input?: Schema<unknown> }).input ??\n (def.trigger as { event?: { schema?: Schema<unknown> } }).event?.schema;\n if (inputSchema !== undefined && input !== undefined) {\n try {\n input = await validateSchema(inputSchema, input, `automation \"${def.id}\" input`);\n } catch (err) {\n await db.query(`UPDATE runs SET status='failed', error=$2::jsonb, finished_at=now() WHERE id=$1`, [\n runId,\n JSON.stringify(serializeError(err)),\n ]);\n return \"failed\";\n }\n }\n\n // ---- concurrency gate (first start only; ADR sketch: onConflict queue|drop) ----\n if (run.status === \"queued\" && def.concurrency) {\n const key =\n run.concurrency_key ??\n (typeof def.concurrency.key === \"function\" ? String(def.concurrency.key(input as never)) : \"\");\n const decision = await db.tx(async (c) => {\n await c.query(`UPDATE runs SET concurrency_key = $2 WHERE id = $1`, [runId, key]);\n const { rows } = await c.query<{ n: string }>(\n `SELECT count(*)::text AS n FROM runs\n WHERE project_id = $1 AND automation_id = $2 AND env = $3\n AND concurrency_key = $4 AND id <> $5\n AND status IN ('running','suspended')`,\n [run.project_id, run.automation_id, run.env, key, runId],\n );\n const active = Number(rows[0]?.n ?? 0);\n if (active < def.concurrency!.limit) return \"go\";\n if ((def.concurrency!.onConflict ?? \"queue\") === \"drop\") {\n await c.query(\n `UPDATE runs SET status='cancelled', error=$2::jsonb, finished_at=now() WHERE id=$1`,\n [runId, JSON.stringify({ name: \"ConcurrencyDrop\", message: \"dropped: concurrency limit reached\" })],\n );\n return \"drop\";\n }\n await enqueue(c, {\n kind: \"run\",\n payload: { runId },\n runAtMs: Date.now() + 2000,\n dedupeKey: `run:${runId}`,\n });\n return \"defer\";\n });\n if (decision === \"drop\") return \"skipped\";\n if (decision === \"defer\") return \"deferred\";\n }\n\n const attempt = run.attempt + 1;\n await db.query(\n `UPDATE runs SET status='running', attempt=$2, started_at=COALESCE(started_at, now()),\n waiting_signal=NULL, wake_at=NULL WHERE id=$1`,\n [runId, attempt],\n );\n\n // ---- journal ----\n const { rows: stepRows } = await db.query<StepRow>(\n `SELECT name, occurrence, status, attempts, result, error FROM run_steps WHERE run_id = $1`,\n [runId],\n );\n const journal = new Map<string, StepRow>();\n for (const r of stepRows) journal.set(`${r.name}#${r.occurrence}`, r);\n\n const occurrences = new Map<string, number>();\n const nextOcc = (name: string): number => {\n const n = (occurrences.get(name) ?? 0) + 1;\n occurrences.set(name, n);\n return n;\n };\n\n const undoStack: Array<{ name: string; occurrence: number; undo: () => unknown | Promise<unknown> }> = [];\n const active = new AsyncLocalStorage<ActiveStep>();\n const defaultRetry = resolveRetryPolicy(def.retry);\n\n const log = (level: \"info\" | \"warn\" | \"error\", msg: string, meta?: Record<string, unknown>, step?: string) => {\n void db\n .query(`INSERT INTO run_logs (run_id, step, level, msg, meta) VALUES ($1,$2,$3,$4,$5::jsonb)`, [\n runId,\n step ?? active.getStore()?.name ?? null,\n level,\n deps.mask(msg),\n meta ? deps.mask(JSON.stringify(encodeJournal(meta))) : null,\n ])\n .catch(() => {});\n };\n const logger: Logger = {\n info: (m, meta) => log(\"info\", m, meta),\n warn: (m, meta) => log(\"warn\", m, meta),\n error: (m, meta) => log(\"error\", m, meta),\n };\n\n const hooks = {\n current() {\n const s = active.getStore();\n if (!s) return undefined;\n return {\n name: s.name,\n occurrence: s.occurrence,\n idempotencyKey: s.idempotencyKey,\n markUnsafeWrite: () => {\n s.unsafeWrite = true;\n },\n };\n },\n };\n\n const connections = await deps.buildConnections(run, def, hooks);\n const secrets = await deps.resolveSecrets(run, def);\n\n const suspendForRetry = async (delayMs: number, reason: string): Promise<never> => {\n await db.tx(async (c) => {\n await c.query(`UPDATE runs SET status='suspended', wake_at=$2 WHERE id=$1`, [\n runId,\n new Date(Date.now() + delayMs).toISOString(),\n ]);\n await enqueue(c, {\n kind: \"run\",\n payload: { runId },\n runAtMs: Date.now() + delayMs,\n dedupeKey: `run:${runId}`,\n });\n });\n throw new RunSuspended(reason);\n };\n\n const ctx: Ctx<any, any, any, any> = {\n async step<T>(name: string, fn: () => Promise<T> | T, opts?: StepOpts<T>): Promise<T> {\n if (typeof name !== \"string\" || name.length === 0 || name.startsWith(\"$\")) {\n throw new TerminalError(`ctx.step: invalid step name ${JSON.stringify(name)} (\"$\" prefix is reserved)`);\n }\n if (active.getStore()) {\n throw new TerminalError(`ctx.step(\"${name}\") called inside step \"${active.getStore()!.name}\" \u2014 steps do not nest`);\n }\n const occurrence = nextOcc(name);\n const key = `${name}#${occurrence}`;\n const row = journal.get(key);\n\n if (row?.status === \"completed\") {\n const value = decodeJournal(row.result as JsonValue) as T;\n if (opts?.undo) undoStack.push({ name, occurrence, undo: () => opts.undo!(value) });\n return value;\n }\n if (row?.status === \"failed\") {\n // The step already exhausted its attempts in a prior invocation; re-throwing the\n // recorded error keeps author-level try/catch paths deterministic.\n const msg = row.error?.message ?? \"step failed\";\n throw row.error?.name === \"RetryableError\" ? new RetryableError(msg) : new TerminalError(msg);\n }\n\n const policy = resolveRetryPolicy(opts?.retry, defaultRetry);\n const attempts = (row?.attempts ?? 0) + 1;\n if (row) {\n await db.query(`UPDATE run_steps SET attempts=$3, status='running' WHERE run_id=$1 AND name=$2 AND occurrence=$4`, [\n runId,\n name,\n attempts,\n occurrence,\n ]);\n } else {\n await db.query(\n `INSERT INTO run_steps (run_id, name, occurrence, status, attempts, has_undo)\n VALUES ($1,$2,$3,'running',$4,$5)`,\n [runId, name, occurrence, attempts, opts?.undo !== undefined],\n );\n }\n\n const state: ActiveStep = {\n name,\n occurrence,\n idempotencyKey: `${runId}:${name}:${occurrence}`,\n unsafeWrite: false,\n events: [],\n };\n\n try {\n let p = Promise.resolve(active.run(state, () => fn()));\n const timeoutMs = opts?.timeout !== undefined ? parseDuration(opts.timeout, \"step timeout\") : undefined;\n if (timeoutMs !== undefined) {\n let timer: NodeJS.Timeout;\n p = Promise.race([\n p,\n new Promise<never>((_res, reject) => {\n timer = setTimeout(\n () => reject(new RetryableError(`step \"${name}\" timed out after ${opts?.timeout}`)),\n timeoutMs,\n );\n timer.unref?.();\n }),\n ]).finally(() => clearTimeout(timer));\n }\n const result = await p;\n const encoded = encodeJournal(result);\n\n // THE exactly-once-internal checkpoint: result + outbox events + fan-out jobs.\n await db.tx(async (c) => {\n await c.query(\n `UPDATE run_steps SET status='completed', result=$4::jsonb, finished_at=now()\n WHERE run_id=$1 AND name=$2 AND occurrence=$3`,\n [runId, name, occurrence, JSON.stringify(encoded)],\n );\n for (const evt of state.events) {\n const { rows } = await c.query<{ id: string }>(\n `INSERT INTO events (project_id, env, name, payload, emitted_by_run)\n VALUES ($1,$2,$3,$4::jsonb,$5) RETURNING id`,\n [run.project_id, run.env, evt.name, JSON.stringify(evt.payload), runId],\n );\n await enqueue(c, { kind: \"event-fanout\", payload: { eventId: rows[0]!.id } });\n }\n });\n journal.set(key, { name, occurrence, status: \"completed\", attempts, result: encoded, error: null });\n if (opts?.undo) undoStack.push({ name, occurrence, undo: () => opts.undo!(result) });\n return result;\n } catch (err) {\n if (err instanceof RunSuspended) throw err;\n const serialized = serializeError(err);\n const finalize = async () => {\n await db.query(\n `UPDATE run_steps SET status='failed', error=$4::jsonb, finished_at=now()\n WHERE run_id=$1 AND name=$2 AND occurrence=$3`,\n [runId, name, occurrence, JSON.stringify(serialized)],\n );\n journal.set(key, { name, occurrence, status: \"failed\", attempts, result: null, error: serialized as never });\n };\n\n if (isTerminalError(err)) {\n await finalize();\n throw err;\n }\n if (state.unsafeWrite && opts?.retry === undefined) {\n log(\n \"warn\",\n `step \"${name}\" performed a non-retry-safe write and will not auto-retry (ADR-0012) \u2014 pass StepOpts.retry to opt in`,\n undefined,\n name,\n );\n await finalize();\n throw err;\n }\n const delay = nextRetryDelayMs(policy, attempts, isRetryableError(err) ? err.retryAfterMs : undefined);\n if (delay === null) {\n await finalize();\n throw err;\n }\n await db.query(\n `UPDATE run_steps SET error=$4::jsonb WHERE run_id=$1 AND name=$2 AND occurrence=$3`,\n [runId, name, occurrence, JSON.stringify(serialized)],\n );\n log(\"warn\", `step \"${name}\" attempt ${attempts} failed (${(err as Error).message}) \u2014 retrying in ${delay}ms`, undefined, name);\n return suspendForRetry(delay, `retry step ${name}#${occurrence}`);\n }\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 if (active.getStore()) {\n throw new TerminalError(`ctx.sleep cannot be called inside step \"${active.getStore()!.name}\"`);\n }\n const ms = parseDuration(duration, \"ctx.sleep\");\n const occurrence = nextOcc(\"$sleep\");\n const row = journal.get(`$sleep#${occurrence}`);\n if (row?.status === \"completed\") return;\n\n let wakeAtMs: number;\n if (row) {\n wakeAtMs = Date.parse((decodeJournal(row.result as JsonValue) as { wakeAt: string }).wakeAt);\n } else {\n wakeAtMs = Date.now() + ms;\n await db.query(\n `INSERT INTO run_steps (run_id, name, occurrence, status, attempts, result)\n VALUES ($1,'$sleep',$2,'running',1,$3::jsonb)`,\n [runId, occurrence, JSON.stringify(encodeJournal({ wakeAt: new Date(wakeAtMs).toISOString() }))],\n );\n }\n if (wakeAtMs <= Date.now()) {\n await db.query(\n `UPDATE run_steps SET status='completed', finished_at=now() WHERE run_id=$1 AND name='$sleep' AND occurrence=$2`,\n [runId, occurrence],\n );\n journal.set(`$sleep#${occurrence}`, { name: \"$sleep\", occurrence, status: \"completed\", attempts: 1, result: null, error: null });\n return;\n }\n return suspendForRetry(wakeAtMs - Date.now(), `sleep ${duration}`) as Promise<never>;\n },\n\n async waitForSignal<T>(name: string, opts: { schema: Schema<T>; timeout?: string }): Promise<T | null> {\n if (active.getStore()) {\n throw new TerminalError(`ctx.waitForSignal cannot be called inside step \"${active.getStore()!.name}\"`);\n }\n const stepName = `$signal:${name}`;\n const occurrence = nextOcc(stepName);\n const row = journal.get(`${stepName}#${occurrence}`);\n if (row?.status === \"completed\") {\n const stored = decodeJournal(row.result as JsonValue) as { value?: unknown; timedOut?: boolean };\n return stored.timedOut === true ? null : (stored.value as T);\n }\n\n let deadlineMs: number | undefined;\n if (row) {\n const stored = decodeJournal(row.result as JsonValue) as { deadline?: string };\n deadlineMs = stored.deadline !== undefined ? Date.parse(stored.deadline) : undefined;\n } else if (opts.timeout !== undefined) {\n deadlineMs = Date.now() + parseDuration(opts.timeout, \"waitForSignal timeout\");\n }\n\n // Try to consume a delivered signal (exactly-once: consumption + checkpoint in one tx).\n const consumed = await db.tx(async (c) => {\n const { rows } = await c.query<{ id: string; payload: JsonValue }>(\n `SELECT id, payload FROM signals\n WHERE run_id=$1 AND name=$2 AND NOT consumed\n ORDER BY created_at LIMIT 1 FOR UPDATE SKIP LOCKED`,\n [runId, name],\n );\n const sig = rows[0];\n if (!sig) return undefined;\n await c.query(`UPDATE signals SET consumed=true WHERE id=$1`, [sig.id]);\n const resultJson = JSON.stringify(encodeJournal({ value: decodeJournal(sig.payload ?? null) }));\n if (row) {\n await c.query(\n `UPDATE run_steps SET status='completed', result=$4::jsonb, finished_at=now()\n WHERE run_id=$1 AND name=$2 AND occurrence=$3`,\n [runId, stepName, occurrence, resultJson],\n );\n } else {\n await c.query(\n `INSERT INTO run_steps (run_id, name, occurrence, status, attempts, result, finished_at)\n VALUES ($1,$2,$3,'completed',1,$4::jsonb,now())`,\n [runId, stepName, occurrence, resultJson],\n );\n }\n return sig.payload ?? null;\n });\n if (consumed !== undefined) {\n const value = decodeJournal(consumed);\n journal.set(`${stepName}#${occurrence}`, {\n name: stepName,\n occurrence,\n status: \"completed\",\n attempts: 1,\n result: encodeJournal({ value }),\n error: null,\n });\n return validateSchema(opts.schema, value, `signal \"${name}\" payload`);\n }\n\n if (deadlineMs !== undefined && deadlineMs <= Date.now()) {\n const resultJson = JSON.stringify(encodeJournal({ timedOut: true }));\n await db.query(\n row\n ? `UPDATE run_steps SET status='completed', result=$4::jsonb, finished_at=now() WHERE run_id=$1 AND name=$2 AND occurrence=$3`\n : `INSERT INTO run_steps (run_id, name, occurrence, status, attempts, result, finished_at) VALUES ($1,$2,$3,'completed',1,$4::jsonb,now())`,\n [runId, stepName, occurrence, resultJson],\n );\n journal.set(`${stepName}#${occurrence}`, { name: stepName, occurrence, status: \"completed\", attempts: 1, result: { timedOut: true } as never, error: null });\n return null;\n }\n\n if (!row) {\n await db.query(\n `INSERT INTO run_steps (run_id, name, occurrence, status, attempts, result)\n VALUES ($1,$2,$3,'running',1,$4::jsonb)`,\n [\n runId,\n stepName,\n occurrence,\n JSON.stringify(\n encodeJournal(deadlineMs !== undefined ? { deadline: new Date(deadlineMs).toISOString() } : {}),\n ),\n ],\n );\n }\n await db.tx(async (c) => {\n await c.query(`UPDATE runs SET status='suspended', waiting_signal=$2, wake_at=$3 WHERE id=$1`, [\n runId,\n name,\n deadlineMs !== undefined ? new Date(deadlineMs).toISOString() : null,\n ]);\n if (deadlineMs !== undefined) {\n await enqueue(c, { kind: \"run\", payload: { runId }, runAtMs: deadlineMs, dedupeKey: `run:${runId}` });\n }\n });\n throw new RunSuspended(`waitForSignal ${name}`);\n },\n\n async emit<T>(event: EventDefinition<T>, payload: T): Promise<void> {\n const state = active.getStore();\n if (!state) {\n throw new TerminalError(\n `ctx.emit(\"${event.name}\") outside ctx.step \u2014 emitting is a side effect; wrap it (ADR-0002)`,\n );\n }\n const validated = await validateSchema(event.schema, payload, `event \"${event.name}\" payload`);\n state.events.push({ name: event.name, payload: encodeJournal(validated as unknown) });\n },\n\n ...(run.trigger[\"request\"] !== undefined\n ? {\n request: (() => {\n const r = run.trigger[\"request\"] as { headers: Record<string, string>; query: Record<string, string>; rawBodyB64: string };\n return {\n headers: r.headers ?? {},\n query: r.query ?? {},\n rawBody: new Uint8Array(Buffer.from(r.rawBodyB64 ?? \"\", \"base64\")),\n };\n })(),\n }\n : {}),\n\n logger,\n run: { id: runId, attempt, automationId: run.automation_id },\n };\n\n (ctx as { operators: unknown }).operators = buildOperators(def, ctx, async (info) => {\n if (!deps.callModel) throw new TerminalError(`operator.${info.operatorKey}: no model adapter configured`);\n return deps.callModel(run, def, hooks, info);\n });\n (ctx as { harnesses: unknown }).harnesses = buildHarnesses(def, ctx, async (info) => {\n if (!deps.callHarness) throw new TerminalError(`harness.${info.harnessKey}: no Harness adapter configured`);\n return deps.callHarness(run, def, hooks, info);\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 await db.query(`UPDATE runs SET status='completed', output=$2::jsonb, finished_at=now() WHERE id=$1`, [\n runId,\n JSON.stringify(encodeJournal(output)),\n ]);\n return \"completed\";\n } catch (err) {\n if (err instanceof RunSuspended) return \"suspended\";\n\n // Terminal failure \u2192 undo completed steps in reverse, best-effort + durable bookkeeping.\n for (const item of [...undoStack].reverse()) {\n try {\n await item.undo();\n await db.query(`UPDATE run_steps SET undone=true WHERE run_id=$1 AND name=$2 AND occurrence=$3`, [\n runId,\n item.name,\n item.occurrence,\n ]);\n log(\"info\", `undo: reversed step \"${item.name}\"`, undefined, item.name);\n } catch (undoErr) {\n log(\"error\", `undo for step \"${item.name}\" failed: ${(undoErr as Error).message}`, undefined, item.name);\n }\n }\n await db.query(`UPDATE runs SET status='failed', error=$2::jsonb, finished_at=now() WHERE id=$1`, [\n runId,\n JSON.stringify(serializeError(err)),\n ]);\n log(\"error\", `run failed: ${(err as Error).message}`);\n return \"failed\";\n }\n}\n", "// Postgres-as-queue (ADR-0003): SELECT \u2026 FOR UPDATE SKIP LOCKED claims, leases with\n// heartbeat, durable re-enqueue, dedupe-keyed upserts (one pending wake job per run).\n\nimport type { Db, DbClient } from \"../db/db.js\";\n\nexport interface EnqueueOpts {\n kind: string;\n payload: Record<string, unknown>;\n runAtMs?: number | undefined;\n priority?: number | undefined;\n tag?: string | undefined;\n /** Upsert key: an existing ready job with this key has its run_at moved EARLIER. */\n dedupeKey?: string | undefined;\n maxAttempts?: number | undefined;\n}\n\nexport async function enqueue(client: DbClient, opts: EnqueueOpts): Promise<void> {\n const runAt = opts.runAtMs !== undefined ? new Date(opts.runAtMs).toISOString() : new Date().toISOString();\n if (opts.dedupeKey !== undefined) {\n await client.query(\n `INSERT INTO queue_jobs (kind, payload, run_at, priority, tag, dedupe_key, max_attempts)\n VALUES ($1, $2::jsonb, $3, $4, $5, $6, $7)\n ON CONFLICT (dedupe_key) WHERE dedupe_key IS NOT NULL DO UPDATE\n SET run_at = LEAST(queue_jobs.run_at, EXCLUDED.run_at),\n status = 'ready',\n payload = EXCLUDED.payload`,\n [\n opts.kind,\n JSON.stringify(opts.payload),\n runAt,\n opts.priority ?? 0,\n opts.tag ?? null,\n opts.dedupeKey,\n opts.maxAttempts ?? 10,\n ],\n );\n } else {\n await client.query(\n `INSERT INTO queue_jobs (kind, payload, run_at, priority, tag, max_attempts)\n VALUES ($1, $2::jsonb, $3, $4, $5, $6)`,\n [opts.kind, JSON.stringify(opts.payload), runAt, opts.priority ?? 0, opts.tag ?? null, opts.maxAttempts ?? 10],\n );\n }\n}\n\nexport interface ClaimedJob {\n id: string;\n kind: string;\n payload: Record<string, unknown>;\n attempts: number;\n maxAttempts: number;\n}\n\nconst LEASE_SECONDS = 60;\n\n/** Claim one due job (tag/kind-routed when filters are given). Expired leases are reclaimable. */\nexport async function claim(\n db: Db,\n tags?: string[] | undefined,\n kinds?: string[] | undefined,\n): Promise<ClaimedJob | null> {\n return db.tx(async (c) => {\n const params: unknown[] = [];\n const tagFilter = tags && tags.length > 0 ? `AND (tag IS NULL OR tag = ANY($${params.push(tags)}))` : \"\";\n const kindFilter = kinds && kinds.length > 0 ? `AND kind = ANY($${params.push(kinds)})` : \"\";\n const { rows } = await c.query<{\n id: string;\n kind: string;\n payload: Record<string, unknown>;\n attempts: number;\n max_attempts: number;\n }>(\n `SELECT id, kind, payload, attempts, max_attempts FROM queue_jobs\n WHERE status = 'ready'\n AND run_at <= now()\n AND (lease_until IS NULL OR lease_until < now())\n ${tagFilter}\n ${kindFilter}\n ORDER BY priority DESC, run_at\n FOR UPDATE SKIP LOCKED\n LIMIT 1`,\n params,\n );\n const job = rows[0];\n if (!job) return null;\n // dedupe_key is cleared on claim: a suspension that re-arms the same logical wake\n // must insert a FRESH row, not collide with the job currently being executed.\n await c.query(\n `UPDATE queue_jobs\n SET lease_until = now() + interval '${LEASE_SECONDS} seconds',\n attempts = attempts + 1,\n dedupe_key = NULL\n WHERE id = $1`,\n [job.id],\n );\n return {\n id: job.id,\n kind: job.kind,\n payload: job.payload,\n attempts: job.attempts + 1,\n maxAttempts: job.max_attempts,\n };\n });\n}\n\nexport async function heartbeat(db: Db, jobId: string): Promise<void> {\n await db.query(\n `UPDATE queue_jobs SET lease_until = now() + interval '${LEASE_SECONDS} seconds' WHERE id = $1`,\n [jobId],\n );\n}\n\nexport async function complete(db: Db, jobId: string): Promise<void> {\n await db.query(`DELETE FROM queue_jobs WHERE id = $1`, [jobId]);\n}\n\n/** Release after failure: retry with backoff until attempts exhaust \u2192 dead. */\nexport async function fail(db: Db, job: ClaimedJob, error: string): Promise<void> {\n if (job.attempts >= job.maxAttempts) {\n await db.query(\n `UPDATE queue_jobs SET status = 'dead', lease_until = NULL, last_error = $2 WHERE id = $1`,\n [job.id, error.slice(0, 2000)],\n );\n return;\n }\n const delaySeconds = Math.min(60 * 15, 2 ** job.attempts);\n await db.query(\n `UPDATE queue_jobs\n SET lease_until = NULL, last_error = $2, run_at = now() + ($3 || ' seconds')::interval\n WHERE id = $1`,\n [job.id, error.slice(0, 2000), String(delaySeconds)],\n );\n}\n", "// Control-flow signal: thrown to unwind the handler when a run hibernates (sleep,\n// waitForSignal, durable retry). Zero idle cost (ADR-0002): nothing stays in memory \u2014\n// a queue job (or an arriving Signal) re-invokes the handler, and completed steps\n// replay from the journal.\n//\n// Authors: never catch this. `catch (e)` blocks that swallow unknown errors instead of\n// rethrowing will break suspension \u2014 the same caveat every durable runtime carries.\n\nexport class RunSuspended extends Error {\n constructor(readonly reason: string) {\n super(`tesser: run suspended (${reason}) \u2014 do not catch this`);\n this.name = \"TesserRunSuspended\";\n }\n}\n\nexport function isRunSuspended(err: unknown): err is RunSuspended {\n return err instanceof RunSuspended || (err as Error)?.name === \"TesserRunSuspended\";\n}\n", "// Run lifecycle entry points: create-and-enqueue (one tx), signal delivery (wakes the\n// waiting run), cancel.\n\nimport type { JsonValue } from \"@devosurf/tesser-sdk/internal\";\nimport { encodeJournal } from \"@devosurf/tesser-sdk/internal\";\nimport type { Db, DbClient } from \"../db/db.js\";\nimport { enqueue } from \"../queue/queue.js\";\n\nexport interface CreateRunOpts {\n projectId: string;\n automationId: string;\n versionId: string;\n env?: string;\n trigger: { kind: string; [k: string]: unknown };\n input?: unknown;\n /** Cross-trigger dedup (e.g. webhook delivery id): same key \u2192 one run, ever. */\n dedupeKey?: string;\n}\n\nexport async function createRun(dbOrClient: Db | DbClient, opts: CreateRunOpts): Promise<string | null> {\n const exec = async (c: DbClient): Promise<string | null> => {\n const { rows } = await c.query<{ id: string }>(\n `INSERT INTO runs (project_id, automation_id, version_id, env, status, trigger, input)\n VALUES ($1,$2,$3,$4,'queued',$5::jsonb,$6::jsonb)\n RETURNING id`,\n [\n opts.projectId,\n opts.automationId,\n opts.versionId,\n opts.env ?? \"production\",\n JSON.stringify(opts.trigger),\n opts.input === undefined ? null : JSON.stringify(encodeJournal(opts.input)),\n ],\n );\n const runId = rows[0]!.id;\n await enqueue(c, {\n kind: \"run\",\n payload: { runId },\n dedupeKey: `run:${runId}`,\n ...(opts.dedupeKey !== undefined ? {} : {}),\n });\n return runId;\n };\n if (\"tx\" in dbOrClient) return dbOrClient.tx(exec);\n return exec(dbOrClient);\n}\n\nexport interface SignalDelivery {\n runId: string;\n name: string;\n payload?: unknown;\n}\n\n/** Deliver a Signal: exactly-once input for ONE suspended run. Wakes it immediately\n * when it is waiting on this name. Returns false when the run doesn't exist. */\nexport async function deliverSignal(db: Db, sig: SignalDelivery): Promise<boolean> {\n return db.tx(async (c) => {\n const { rows } = await c.query<{ id: string; status: string; waiting_signal: string | null }>(\n `SELECT id, status, waiting_signal FROM runs WHERE id = $1 FOR UPDATE`,\n [sig.runId],\n );\n const run = rows[0];\n if (!run) return false;\n await c.query(`INSERT INTO signals (run_id, name, payload) VALUES ($1,$2,$3::jsonb)`, [\n sig.runId,\n sig.name,\n sig.payload === undefined ? null : JSON.stringify(encodeJournal(sig.payload)),\n ]);\n if (run.status === \"suspended\" && run.waiting_signal === sig.name) {\n await enqueue(c, { kind: \"run\", payload: { runId: sig.runId }, dedupeKey: `run:${sig.runId}` });\n }\n return true;\n });\n}\n\nexport async function cancelRun(db: Db, runId: string, reason: string): Promise<boolean> {\n const { rowCount } = await db.query(\n `UPDATE runs SET status='cancelled', error=$2::jsonb, finished_at=now()\n WHERE id=$1 AND status IN ('queued','suspended')`,\n [runId, JSON.stringify({ name: \"Cancelled\", message: reason } satisfies Record<string, JsonValue>)],\n );\n return rowCount > 0;\n}\n", "// Event fan-out (ADR-0011): an emitted Project-scoped event creates one independent\n// durable run per subscriber. At-least-once delivery; duplicate fan-out job executions\n// are absorbed by a per-(event, automation) existence check.\n\nimport { decodeJournal, type JsonValue } from \"@devosurf/tesser-sdk/internal\";\nimport type { Db } from \"../db/db.js\";\nimport { createRun } from \"../engine/runs.js\";\n\nexport async function fanoutEvent(db: Db, eventId: string): Promise<string[]> {\n const { rows } = await db.query<{\n id: string;\n project_id: string;\n env: string;\n name: string;\n payload: JsonValue | null;\n }>(`SELECT id, project_id, env, name, payload FROM events WHERE id=$1`, [eventId]);\n const event = rows[0];\n if (!event) return [];\n\n const subs = await db.query<{ automation_id: string }>(\n `SELECT automation_id FROM event_subscriptions WHERE project_id=$1 AND env=$2 AND event_name=$3`,\n [event.project_id, event.env, event.name],\n );\n\n const created: string[] = [];\n for (const sub of subs.rows) {\n const runId = await db.tx(async (c) => {\n const existing = await c.query(\n `SELECT 1 FROM runs WHERE automation_id=$1 AND project_id=$2 AND trigger->>'eventId' = $3`,\n [sub.automation_id, event.project_id, event.id],\n );\n if (existing.rows.length > 0) return null;\n\n const alias = await c.query<{ version_id: string }>(\n `SELECT version_id FROM aliases WHERE project_id=$1 AND automation_id=$2 AND env=$3`,\n [event.project_id, sub.automation_id, event.env],\n );\n const versionId = alias.rows[0]?.version_id;\n if (!versionId) return null;\n\n return createRun(c, {\n projectId: event.project_id,\n automationId: sub.automation_id,\n versionId,\n env: event.env,\n trigger: { kind: \"event\", event: event.name, eventId: event.id },\n // stored payload is journal-encoded; createRun re-encodes, so decode here\n input: event.payload === null ? undefined : decodeJournal(event.payload),\n });\n });\n if (runId) created.push(runId);\n }\n return created;\n}\n\n/** Sync a project+env's event subscriptions from promoted manifests. */\nexport async function syncSubscriptions(\n db: Db,\n projectId: string,\n env: string,\n subs: Array<{ eventName: string; automationId: string }>,\n): Promise<void> {\n await db.tx(async (c) => {\n await c.query(`DELETE FROM event_subscriptions WHERE project_id=$1 AND env=$2`, [projectId, env]);\n for (const s of subs) {\n await c.query(\n `INSERT INTO event_subscriptions (project_id, env, event_name, automation_id)\n VALUES ($1,$2,$3,$4) ON CONFLICT DO NOTHING`,\n [projectId, env, s.eventName, s.automationId],\n );\n }\n });\n}\n", "// Assemble the HTTP surface: /api (control plane), connect pages + OAuth callback,\n// trigger ingress, and a minimal index.\n\nimport { Hono } from \"hono\";\nimport { createApi, type ApiDeps } from \"./api.js\";\nimport { createConnectRoutes, type ConnectDeps } from \"./connect.js\";\nimport { createIngress, type IngressDeps } from \"./ingress.js\";\nimport { readinessStatus, RUNTIME_VERSION, type RuntimeStatusDeps } from \"./status.js\";\n\nexport interface HttpDeps extends ApiDeps, ConnectDeps, IngressDeps, RuntimeStatusDeps {}\n\nexport function createApp(deps: HttpDeps): Hono {\n const app = new Hono();\n const version = deps.version ?? RUNTIME_VERSION;\n app.get(\"/\", (c) =>\n c.json({\n service: \"tesser\",\n docs: \"https://github.com/tesser \u2014 self-hosted automation instance\",\n api: \"/api/health\",\n health: \"/healthz\",\n readiness: \"/readyz\",\n }),\n );\n app.get(\"/healthz\", (c) => c.json({ ok: true, service: \"tesser\", version }));\n app.get(\"/readyz\", async (c) => {\n const status = await readinessStatus(deps);\n return c.json(status, status.ok ? 200 : 503);\n });\n app.route(\"/api\", createApi(deps));\n app.route(\"/\", createConnectRoutes(deps));\n app.route(\"/\", createIngress(deps));\n return app;\n}\n", "// Control-plane API (ADR-0007: the CLI is a thin shell over this). JSON in/out,\n// bearer-token auth, deterministic error shapes: { error: { code, message } }.\n\nimport { Hono } from \"hono\";\nimport type { Db } from \"../db/db.js\";\nimport type { Broker } from \"../broker/broker.js\";\nimport {\n computeMissingRequirements,\n connectLinkStatus,\n getConnectLink,\n mintConnectLink,\n} from \"../broker/connect.js\";\nimport { createRun, deliverSignal, cancelRun } from \"../engine/runs.js\";\nimport { enqueue } from \"../queue/queue.js\";\nimport { mintToken, verifyToken } from \"./tokens.js\";\nimport { runtimeStatus, type RuntimeStatusDeps } from \"./status.js\";\nimport {\n generateDeployKeyPair,\n hashWebhookSetupToken,\n mintWebhookSetupToken,\n mintWebhookSigningSecret,\n} from \"../gitsync/deploy-keys.js\";\n\nexport interface ApiEnv {\n Variables: { workspaceId: string };\n}\n\nexport interface ApiDeps extends RuntimeStatusDeps {\n broker: Broker;\n /** Filled by git-sync (task: reconciler); returns latest deploy state for a project. */\n deployStatus?: (projectId: string, env: string) => Promise<unknown>;\n}\n\nconst err = (code: string, message: string) => ({ error: { code, message } });\n\ntype ProjectBootstrap = {\n deployKeyPublic: string;\n webhookSetupUrl: string;\n};\n\nasync function ensureProjectBootstrap(deps: ApiDeps, workspaceId: string, projectId: string): Promise<ProjectBootstrap> {\n const { rows } = await deps.db.query<{\n deploy_key_public: string | null;\n deploy_key_private_cipher: string | null;\n push_webhook_secret_cipher: string | null;\n }>(\n `SELECT deploy_key_public, deploy_key_private_cipher, push_webhook_secret_cipher FROM projects WHERE id=$1 AND workspace_id=$2`,\n [projectId, workspaceId],\n );\n const project = rows[0];\n if (!project) throw new Error(`project ${projectId} not found`);\n\n let deployKeyPublic = project.deploy_key_public;\n let deployPrivateCipher = project.deploy_key_private_cipher;\n if (!deployKeyPublic || !deployPrivateCipher) {\n const key = generateDeployKeyPair();\n deployKeyPublic = key.publicKey;\n deployPrivateCipher = await deps.broker.encryptValue(workspaceId, key.privateKey, \"deploykey\");\n }\n\n let pushWebhookSecretCipher = project.push_webhook_secret_cipher;\n if (!pushWebhookSecretCipher) {\n pushWebhookSecretCipher = await deps.broker.encryptValue(workspaceId, mintWebhookSigningSecret(), \"project.webhook.signing\");\n }\n\n const setupToken = mintWebhookSetupToken();\n await deps.db.query(\n `UPDATE projects\n SET deploy_key_public=$3,\n deploy_key_private_cipher=$4,\n push_webhook_secret_cipher=$5,\n push_webhook_setup_token_hash=$6\n WHERE id=$1 AND workspace_id=$2`,\n [projectId, workspaceId, deployKeyPublic, deployPrivateCipher, pushWebhookSecretCipher, hashWebhookSetupToken(setupToken)],\n );\n\n return {\n deployKeyPublic,\n webhookSetupUrl: `${deps.baseUrl.replace(/\\/$/, \"\")}/setup/git/${setupToken}`,\n };\n}\n\nexport function createApi(deps: ApiDeps): Hono<ApiEnv> {\n const api = new Hono<ApiEnv>();\n\n api.use(\"*\", async (c, next) => {\n const header = c.req.header(\"authorization\") ?? \"\";\n const token = header.startsWith(\"Bearer \") ? header.slice(7) : \"\";\n const auth = token ? await verifyToken(deps.db, token) : null;\n if (!auth) return c.json(err(\"unauthorized\", \"missing or invalid bearer token\"), 401);\n c.set(\"workspaceId\", auth.workspaceId);\n await next();\n return;\n });\n\n api.get(\"/health\", (c) => c.json({ ok: true }));\n api.get(\"/status\", async (c) => c.json(await runtimeStatus(deps, c.get(\"workspaceId\"))));\n\n // ---- projects ----\n\n api.post(\"/projects\", async (c) => {\n const body = (await c.req.json().catch(() => ({}))) as { name?: string; repoUrl?: string; prodBranch?: string };\n if (!body.name || !/^[a-z][a-z0-9-]{0,63}$/.test(body.name)) {\n return c.json(err(\"invalid\", \"project name must be kebab-case\"), 400);\n }\n const { rows } = await deps.db.query<{ id: string }>(\n `INSERT INTO projects (workspace_id, name, repo_url, prod_branch)\n VALUES ($1,$2,$3,$4)\n ON CONFLICT (workspace_id, name) DO UPDATE SET repo_url = COALESCE(EXCLUDED.repo_url, projects.repo_url)\n RETURNING id`,\n [c.get(\"workspaceId\"), body.name, body.repoUrl ?? null, body.prodBranch ?? \"main\"],\n );\n const projectId = rows[0]!.id;\n await deps.db.query(\n `INSERT INTO repo_state (project_id) VALUES ($1) ON CONFLICT (project_id) DO NOTHING`,\n [projectId],\n );\n const bootstrap = await ensureProjectBootstrap(deps, c.get(\"workspaceId\"), projectId);\n return c.json({ id: projectId, name: body.name, ...bootstrap });\n });\n\n api.get(\"/projects\", async (c) => {\n const { rows } = await deps.db.query(\n `SELECT p.id, p.name, p.repo_url, p.prod_branch, r.last_sha, r.status AS sync_status, r.last_synced_at\n FROM projects p LEFT JOIN repo_state r ON r.project_id = p.id\n WHERE p.workspace_id = $1 ORDER BY p.name`,\n [c.get(\"workspaceId\")],\n );\n return c.json({ projects: rows });\n });\n\n const findProject = async (workspaceId: string, name: string) => {\n const { rows } = await deps.db.query<{ id: string; name: string; repo_url: string | null; prod_branch: string }>(\n `SELECT id, name, repo_url, prod_branch FROM projects WHERE workspace_id=$1 AND name=$2`,\n [workspaceId, name],\n );\n return rows[0] ?? null;\n };\n\n api.post(\"/projects/:name/sync\", async (c) => {\n const project = await findProject(c.get(\"workspaceId\"), c.req.param(\"name\"));\n if (!project) return c.json(err(\"not-found\", \"no such project\"), 404);\n const body = (await c.req.json().catch(() => ({}))) as { ref?: string; localPath?: string };\n await deps.db.tx((t) =>\n enqueue(t, {\n kind: \"reconcile\",\n payload: {\n projectId: project.id,\n ...(body.ref !== undefined ? { ref: body.ref } : {}),\n ...(body.localPath !== undefined ? { localPath: body.localPath } : {}),\n },\n dedupeKey: `reconcile:${project.id}:${body.ref ?? \"default\"}`,\n maxAttempts: 1,\n }),\n );\n return c.json({ queued: true });\n });\n\n api.get(\"/projects/:name/deploys/latest\", async (c) => {\n const project = await findProject(c.get(\"workspaceId\"), c.req.param(\"name\"));\n if (!project) return c.json(err(\"not-found\", \"no such project\"), 404);\n const env = c.req.query(\"env\") ?? \"production\";\n if (deps.deployStatus) {\n return c.json((await deps.deployStatus(project.id, env)) as Record<string, unknown>);\n }\n const { rows } = await deps.db.query(\n `SELECT status, error, last_sha, last_synced_at FROM repo_state WHERE project_id=$1`,\n [project.id],\n );\n return c.json({ repo: rows[0] ?? null });\n });\n\n api.get(\"/projects/:name/automations\", async (c) => {\n const project = await findProject(c.get(\"workspaceId\"), c.req.param(\"name\"));\n if (!project) return c.json(err(\"not-found\", \"no such project\"), 404);\n const { rows } = await deps.db.query(\n `SELECT a.automation_id, a.env, v.version, v.git_sha, v.status, v.created_at, v.manifest\n FROM aliases a JOIN automation_versions v ON v.id = a.version_id\n WHERE a.project_id = $1 ORDER BY a.automation_id, a.env`,\n [project.id],\n );\n return c.json({ automations: rows });\n });\n\n api.post(\"/projects/:name/rollback\", async (c) => {\n const project = await findProject(c.get(\"workspaceId\"), c.req.param(\"name\"));\n if (!project) return c.json(err(\"not-found\", \"no such project\"), 404);\n const body = (await c.req.json().catch(() => ({}))) as { automation?: string; toVersion?: number; env?: string };\n if (!body.automation || typeof body.toVersion !== \"number\") {\n return c.json(err(\"invalid\", \"need { automation, toVersion }\"), 400);\n }\n const env = body.env ?? \"production\";\n const { rows } = await deps.db.query<{ id: string }>(\n `SELECT id FROM automation_versions WHERE project_id=$1 AND automation_id=$2 AND version=$3`,\n [project.id, body.automation, body.toVersion],\n );\n if (!rows[0]) return c.json(err(\"not-found\", \"no such version\"), 404);\n const { rowCount } = await deps.db.query(\n `UPDATE aliases SET version_id=$4, updated_at=now()\n WHERE project_id=$1 AND automation_id=$2 AND env=$3`,\n [project.id, body.automation, env, rows[0].id],\n );\n if (rowCount === 0) return c.json(err(\"not-found\", \"automation has no live alias in this env\"), 404);\n return c.json({ rolledBack: true, automation: body.automation, env, toVersion: body.toVersion });\n });\n\n // ---- runs ----\n\n api.post(\"/runs\", async (c) => {\n const body = (await c.req.json().catch(() => ({}))) as {\n project?: string;\n automation?: string;\n input?: unknown;\n env?: string;\n };\n if (!body.project || !body.automation) return c.json(err(\"invalid\", \"need { project, automation }\"), 400);\n const project = await findProject(c.get(\"workspaceId\"), body.project);\n if (!project) return c.json(err(\"not-found\", \"no such project\"), 404);\n const env = body.env ?? \"production\";\n const { rows } = await deps.db.query<{ version_id: string }>(\n `SELECT version_id FROM aliases WHERE project_id=$1 AND automation_id=$2 AND env=$3`,\n [project.id, body.automation, env],\n );\n if (!rows[0]) return c.json(err(\"not-found\", `automation \"${body.automation}\" has no live version in ${env}`), 404);\n const runId = await createRun(deps.db, {\n projectId: project.id,\n automationId: body.automation,\n versionId: rows[0].version_id,\n env,\n trigger: { kind: \"manual\" },\n ...(body.input !== undefined ? { input: body.input } : {}),\n });\n return c.json({ runId }, 202);\n });\n\n api.get(\"/runs\", async (c) => {\n const requestedLimit = Number(c.req.query(\"limit\") ?? 50);\n const requestedOffset = Number(c.req.query(\"offset\") ?? 0);\n const limit = Number.isFinite(requestedLimit) ? Math.min(Math.max(Math.trunc(requestedLimit), 1), 200) : 50;\n const offset = Number.isFinite(requestedOffset) ? Math.max(Math.trunc(requestedOffset), 0) : 0;\n const params: unknown[] = [c.get(\"workspaceId\")];\n let filter = \"\";\n if (c.req.query(\"project\")) {\n params.push(c.req.query(\"project\"));\n filter += ` AND p.name = $${params.length}`;\n }\n if (c.req.query(\"automation\")) {\n params.push(c.req.query(\"automation\"));\n filter += ` AND r.automation_id = $${params.length}`;\n }\n if (c.req.query(\"status\")) {\n params.push(c.req.query(\"status\"));\n filter += ` AND r.status = $${params.length}`;\n }\n const countParams = [...params];\n const total = Number((await deps.db.query<{ count: string }>(\n `SELECT count(*)::text AS count\n FROM runs r JOIN projects p ON p.id = r.project_id\n WHERE p.workspace_id = $1 ${filter}`,\n countParams,\n )).rows[0]?.count ?? \"0\");\n params.push(limit, offset);\n const { rows } = await deps.db.query(\n `SELECT r.id, p.name AS project, r.automation_id, r.env, r.status, r.attempt,\n r.trigger->>'kind' AS trigger_kind, r.created_at, r.started_at, r.finished_at\n FROM runs r JOIN projects p ON p.id = r.project_id\n WHERE p.workspace_id = $1 ${filter}\n ORDER BY r.created_at DESC LIMIT $${params.length - 1} OFFSET $${params.length}`,\n params,\n );\n return c.json({ runs: rows, total, limit, offset, truncated: offset + rows.length < total });\n });\n\n api.get(\"/runs/:id\", async (c) => {\n const { rows } = await deps.db.query(\n `SELECT r.*, p.name AS project FROM runs r JOIN projects p ON p.id = r.project_id\n WHERE r.id = $1 AND p.workspace_id = $2`,\n [c.req.param(\"id\"), c.get(\"workspaceId\")],\n );\n if (!rows[0]) return c.json(err(\"not-found\", \"no such run\"), 404);\n const steps = await deps.db.query(\n `SELECT name, occurrence, status, attempts, result, error, undone, started_at, finished_at\n FROM run_steps WHERE run_id = $1 ORDER BY started_at, occurrence`,\n [c.req.param(\"id\")],\n );\n const requestedLogLimit = Number(c.req.query(\"logLimit\") ?? 100);\n const requestedLogOffset = Number(c.req.query(\"logOffset\") ?? 0);\n const logLimit = Number.isFinite(requestedLogLimit) ? Math.min(Math.max(Math.trunc(requestedLogLimit), 1), 500) : 100;\n const logOffset = Number.isFinite(requestedLogOffset) ? Math.max(Math.trunc(requestedLogOffset), 0) : 0;\n const logsTotal = Number((await deps.db.query<{ count: string }>(\n `SELECT count(*)::text AS count FROM run_logs WHERE run_id = $1`,\n [c.req.param(\"id\")],\n )).rows[0]?.count ?? \"0\");\n const logs = await deps.db.query(\n `SELECT step, level, msg, meta, created_at FROM run_logs WHERE run_id = $1 ORDER BY id LIMIT $2 OFFSET $3`,\n [c.req.param(\"id\"), logLimit, logOffset],\n );\n return c.json({\n run: rows[0],\n steps: steps.rows,\n logs: logs.rows,\n logsTotal,\n logsLimit: logLimit,\n logsOffset: logOffset,\n logsTruncated: logOffset + logs.rows.length < logsTotal,\n });\n });\n\n api.get(\"/runs/:id/replay\", async (c) => {\n const { rows } = await deps.db.query(\n `SELECT r.id, r.automation_id, r.env, r.trigger, r.input, r.output, r.status, r.error\n FROM runs r JOIN projects p ON p.id = r.project_id\n WHERE r.id = $1 AND p.workspace_id = $2`,\n [c.req.param(\"id\"), c.get(\"workspaceId\")],\n );\n if (!rows[0]) return c.json(err(\"not-found\", \"no such run\"), 404);\n const steps = await deps.db.query(\n `SELECT name, occurrence, status, attempts, result, error FROM run_steps WHERE run_id=$1 ORDER BY started_at, occurrence`,\n [c.req.param(\"id\")],\n );\n return c.json({ replay: { ...rows[0], journal: steps.rows } });\n });\n\n api.post(\"/runs/:id/signals/:name\", async (c) => {\n const body = (await c.req.json().catch(() => ({}))) as { payload?: unknown };\n const ok = await deliverSignal(deps.db, {\n runId: c.req.param(\"id\"),\n name: c.req.param(\"name\"),\n payload: body.payload,\n });\n if (!ok) return c.json(err(\"not-found\", \"no such run\"), 404);\n return c.json({ delivered: true });\n });\n\n api.post(\"/runs/:id/cancel\", async (c) => {\n const ok = await cancelRun(deps.db, c.req.param(\"id\"), \"cancelled via API\");\n return c.json({ cancelled: ok });\n });\n\n // ---- connections & secrets (agent lane: names/status only \u2014 never values) ----\n\n api.get(\"/connections\", async (c) => {\n return c.json({ connections: await deps.broker.listConnections(c.get(\"workspaceId\")) });\n });\n\n api.get(\"/secrets\", async (c) => {\n return c.json({ secrets: await deps.broker.listSecretNames(c.get(\"workspaceId\")) });\n });\n\n // The piped human/CI lane (`tesser secrets set NAME --value-stdin`): value travels\n // request-body \u2192 TLS \u2192 encrypted store; it is never echoed back.\n api.put(\"/secrets/:name\", async (c) => {\n const name = c.req.param(\"name\");\n if (!/^[a-zA-Z][a-zA-Z0-9_-]{0,127}$/.test(name)) return c.json(err(\"invalid\", \"bad secret name\"), 400);\n const body = (await c.req.json().catch(() => ({}))) as { value?: string };\n if (typeof body.value !== \"string\" || body.value.length === 0) {\n return c.json(err(\"invalid\", \"need { value }\"), 400);\n }\n await deps.broker.setSecret(c.get(\"workspaceId\"), name, body.value);\n return c.json({ set: name });\n });\n\n api.delete(\"/secrets/:name\", async (c) => {\n const ok = await deps.broker.deleteSecret(c.get(\"workspaceId\"), c.req.param(\"name\"));\n return c.json({ deleted: ok });\n });\n\n // ---- connect links ----\n\n api.post(\"/connect-links\", async (c) => {\n const body = (await c.req.json().catch(() => ({}))) as {\n project?: string;\n env?: string;\n };\n let projectId: string | undefined;\n let requirements: import(\"../broker/connect.js\").Requirement[] = [];\n if (body.project) {\n const project = await findProject(c.get(\"workspaceId\"), body.project);\n if (!project) return c.json(err(\"not-found\", \"no such project\"), 404);\n projectId = project.id;\n const env = body.env ?? \"production\";\n const versions = await deps.db.query<{ manifest: { connections?: never; secrets?: never; id: string }; automation_id: string }>(\n `SELECT v.manifest, a.automation_id FROM aliases a JOIN automation_versions v ON v.id=a.version_id\n WHERE a.project_id=$1 AND a.env=$2`,\n [project.id, env],\n );\n const staged = await deps.db.query<{ manifest: never; automation_id: string }>(\n `SELECT DISTINCT ON (automation_id) manifest, automation_id FROM automation_versions\n WHERE project_id=$1 AND status='staged' ORDER BY automation_id, version DESC`,\n [project.id],\n );\n const sources = [...versions.rows, ...staged.rows].map((r) => {\n const m = r.manifest as { connections?: Record<string, { connector: string; scope: \"workspace\" | \"per_user\" }>; secrets?: Record<string, { describe?: string }> };\n return { automationId: r.automation_id, connections: m.connections ?? {}, secrets: m.secrets ?? {} };\n });\n const connectorManifests = await collectConnectorManifests(deps.db, project.id);\n requirements = await computeMissingRequirements({\n db: deps.db,\n broker: deps.broker,\n workspaceId: c.get(\"workspaceId\"),\n projectId: project.id,\n env,\n automations: sources,\n connectorManifests,\n });\n }\n if (requirements.length === 0) return c.json({ url: null, requirements: [] });\n const token = await mintConnectLink({\n db: deps.db,\n workspaceId: c.get(\"workspaceId\"),\n projectId,\n requirements,\n });\n return c.json({ url: `${deps.baseUrl}/connect/${token}`, token, requirements });\n });\n\n api.get(\"/connect-links/:token/status\", async (c) => {\n const link = await getConnectLink(deps.db, c.req.param(\"token\"));\n if (!link || link.workspace_id !== c.get(\"workspaceId\")) return c.json(err(\"not-found\", \"no such link\"), 404);\n const status = await connectLinkStatus(deps.db, deps.broker, link);\n return c.json(status);\n });\n\n // ---- tokens ----\n\n api.post(\"/tokens\", async (c) => {\n const body = (await c.req.json().catch(() => ({}))) as { name?: string };\n const token = await mintToken(deps.db, c.get(\"workspaceId\"), body.name ?? \"cli\");\n return c.json({ token });\n });\n\n return api;\n}\n\n/** Connector manifests embedded in this project's built versions (per-project facts). */\nexport async function collectConnectorManifests(\n db: Db,\n projectId: string,\n): Promise<Record<string, import(\"@devosurf/tesser-sdk/internal\").ConnectorManifest>> {\n const { rows } = await db.query<{ manifest: { connectors?: Record<string, never> } }>(\n `SELECT manifest FROM automation_versions WHERE project_id=$1 ORDER BY created_at DESC LIMIT 50`,\n [projectId],\n );\n const out: Record<string, never> = {};\n for (const row of rows) {\n for (const [id, m] of Object.entries(row.manifest?.connectors ?? {})) {\n if (!(id in out)) out[id as never] = m;\n }\n }\n return out;\n}\n", "// The credential handoff (ADR-0005): deploy halts on missing requirements; the server\n// mints a short-lived single-use connect link; a human completes OAuth / pastes values\n// in their browser; the agent only ever polls a status.\n\nimport { randomBytes } from \"node:crypto\";\nimport type { ConnectorManifest } from \"@devosurf/tesser-sdk/internal\";\nimport type { ProviderFacts } from \"@devosurf/tesser-sdk/connector\";\nimport type { Db } from \"../db/db.js\";\nimport type { Broker } from \"./broker.js\";\n\nexport interface ConnectionRequirement {\n type: \"connection\";\n key: string;\n connector: string;\n scope: \"workspace\" | \"per_user\";\n /** Auth modes the human can choose between (from the connector manifest). */\n modes: Array<{\n name: string;\n kind: \"oauth2\" | \"apiKey\" | \"basic\" | \"custom\";\n describe?: string;\n /** Paste-field names for non-OAuth modes. */\n fields: string[];\n scopes?: string[];\n }>;\n provider?: string;\n providerFacts?: ProviderFacts;\n automations: string[];\n}\n\nexport interface SecretRequirement {\n type: \"secret\";\n name: string;\n describe?: string;\n automations: string[];\n}\n\nexport interface ManualWebhookRequirement {\n type: \"webhook-manual\";\n registrationId: string;\n connector: string;\n trigger: string;\n automation: string;\n instructions: string;\n url: string;\n}\n\nexport type Requirement = ConnectionRequirement | SecretRequirement | ManualWebhookRequirement;\n\nexport interface AutomationRequirementSource {\n automationId: string;\n connections: Record<string, { connector: string; scope: \"workspace\" | \"per_user\" }>;\n secrets: Record<string, { describe?: string }>;\n}\n\nfunction fieldsFor(kind: string, declared?: string[]): string[] {\n switch (kind) {\n case \"apiKey\":\n return [\"api_key\"];\n case \"basic\":\n return [\"username\", \"password\"];\n case \"custom\":\n return declared ?? [];\n default:\n return [];\n }\n}\n\n/** Compute what is still missing for a set of automations (deploy-halt gate). */\nexport async function computeMissingRequirements(opts: {\n db: Db;\n broker: Broker;\n workspaceId: string;\n projectId: string;\n env: string;\n automations: AutomationRequirementSource[];\n connectorManifests: Record<string, ConnectorManifest & { providerFacts?: ProviderFacts }>;\n}): Promise<Requirement[]> {\n const connReqs = new Map<string, ConnectionRequirement>();\n const secretReqs = new Map<string, SecretRequirement>();\n\n for (const auto of opts.automations) {\n for (const [key, decl] of Object.entries(auto.connections)) {\n let satisfied = false;\n if (decl.scope === \"per_user\") {\n // Deploy-time validation cannot know every future end user. For per-user\n // requirements, the production gate only proves that this Instance has at\n // least one non-null end-user Connection for the Connector; runtime still\n // resolves the exact endUserId and fails closed for unknown users.\n const { rows } = await opts.db.query(\n `SELECT 1 FROM connections\n WHERE workspace_id=$1 AND connector_id=$2 AND status='ready' AND scope='per_user' AND end_user_id IS NOT NULL\n LIMIT 1`,\n [opts.workspaceId, decl.connector],\n );\n satisfied = rows.length > 0;\n } else {\n const resolved = await opts.broker.resolveBinding({\n workspaceId: opts.workspaceId,\n projectId: opts.projectId,\n automationId: auto.automationId,\n env: opts.env,\n reqKey: key,\n connectorId: decl.connector,\n scope: decl.scope,\n });\n satisfied = resolved !== null;\n }\n if (satisfied) continue;\n const manifest = opts.connectorManifests[decl.connector];\n const id = `${decl.connector}:${decl.scope}`;\n const existing = connReqs.get(id);\n if (existing) {\n if (!existing.automations.includes(auto.automationId)) existing.automations.push(auto.automationId);\n continue;\n }\n const modes = Object.entries(manifest?.auth ?? { default: { kind: \"apiKey\" as const, in: \"header\", name: \"Authorization\" } }).map(\n ([name, decl2]) => ({\n name,\n kind: decl2.kind as ConnectionRequirement[\"modes\"][number][\"kind\"],\n fields: fieldsFor(decl2.kind, (decl2 as { fields?: string[] }).fields),\n ...(\"describe\" in decl2 && decl2.describe !== undefined ? { describe: decl2.describe } : {}),\n ...(decl2.kind === \"oauth2\" && \"scopes\" in decl2 ? { scopes: decl2.scopes } : {}),\n }),\n );\n connReqs.set(id, {\n type: \"connection\",\n key,\n connector: decl.connector,\n scope: decl.scope,\n modes,\n ...(manifest?.provider !== undefined ? { provider: manifest.provider } : {}),\n ...(manifest?.providerFacts !== undefined ? { providerFacts: manifest.providerFacts } : {}),\n automations: [auto.automationId],\n });\n }\n for (const [name, decl] of Object.entries(auto.secrets)) {\n const value = await opts.broker.getSecretValue(opts.workspaceId, name);\n if (value !== null) continue;\n const existing = secretReqs.get(name);\n if (existing) {\n if (!existing.automations.includes(auto.automationId)) existing.automations.push(auto.automationId);\n continue;\n }\n secretReqs.set(name, {\n type: \"secret\",\n name,\n ...(decl.describe !== undefined ? { describe: decl.describe } : {}),\n automations: [auto.automationId],\n });\n }\n }\n return [...connReqs.values(), ...secretReqs.values()];\n}\n\nexport async function mintConnectLink(opts: {\n db: Db;\n workspaceId: string;\n projectId?: string | undefined;\n requirements: Requirement[];\n ttlMs?: number;\n}): Promise<string> {\n const token = `cl_${randomBytes(18).toString(\"hex\")}`;\n await opts.db.query(\n `INSERT INTO connect_links (token, workspace_id, project_id, requirements, expires_at)\n VALUES ($1,$2,$3,$4::jsonb, now() + ($5 || ' milliseconds')::interval)`,\n [token, opts.workspaceId, opts.projectId ?? null, JSON.stringify(opts.requirements), String(opts.ttlMs ?? 24 * 3600 * 1000)],\n );\n return token;\n}\n\nexport interface ConnectLinkRow {\n token: string;\n workspace_id: string;\n project_id: string | null;\n requirements: Requirement[];\n status: string;\n expires_at: string;\n}\n\nexport async function getConnectLink(db: Db, token: string): Promise<ConnectLinkRow | null> {\n const { rows } = await db.query<ConnectLinkRow>(`SELECT * FROM connect_links WHERE token=$1`, [token]);\n const link = rows[0];\n if (!link) return null;\n if (link.status === \"pending\" && new Date(String(link.expires_at)).getTime() < Date.now()) {\n await db.query(`UPDATE connect_links SET status='expired' WHERE token=$1`, [token]);\n link.status = \"expired\";\n }\n return link;\n}\n\n/** Per-requirement satisfaction + link completion. */\nexport async function connectLinkStatus(\n db: Db,\n broker: Broker,\n link: ConnectLinkRow,\n): Promise<{ status: string; requirements: Array<{ requirement: Requirement; satisfied: boolean }> }> {\n const detail: Array<{ requirement: Requirement; satisfied: boolean }> = [];\n for (const req of link.requirements) {\n let satisfied = false;\n if (req.type === \"connection\") {\n const scopeFilter = req.scope === \"per_user\" ? `AND scope='per_user' AND end_user_id IS NOT NULL` : `AND scope='workspace'`;\n const { rows } = await db.query(\n `SELECT 1 FROM connections WHERE workspace_id=$1 AND connector_id=$2 AND status='ready' ${scopeFilter} LIMIT 1`,\n [link.workspace_id, req.connector],\n );\n satisfied = rows.length > 0;\n } else if (req.type === \"secret\") {\n satisfied = (await broker.getSecretValue(link.workspace_id, req.name)) !== null;\n } else {\n const { rows } = await db.query<{ status: string }>(\n `SELECT status FROM webhook_registrations WHERE id=$1`,\n [req.registrationId],\n );\n satisfied = rows[0]?.status === \"registered\";\n }\n detail.push({ requirement: req, satisfied });\n }\n const allSatisfied = detail.every((d) => d.satisfied);\n if (allSatisfied && link.status === \"pending\") {\n await db.query(`UPDATE connect_links SET status='completed', completed_at=now() WHERE token=$1`, [link.token]);\n link.status = \"completed\";\n }\n return { status: link.status, requirements: detail };\n}\n", "// API tokens: sha256-at-rest, shown once at mint. The first boot prints an admin token;\n// further tokens are minted via the API (CLI: `tesser login --token` / TESSER_TOKEN env).\n\nimport { createHash, randomBytes } from \"node:crypto\";\nimport type { Db } from \"../db/db.js\";\n\nexport function hashToken(token: string): string {\n return createHash(\"sha256\").update(token).digest(\"hex\");\n}\n\nexport async function mintToken(db: Db, workspaceId: string, name: string): Promise<string> {\n const token = `tsk_${randomBytes(24).toString(\"hex\")}`;\n await db.query(`INSERT INTO api_tokens (workspace_id, name, token_hash) VALUES ($1,$2,$3)`, [\n workspaceId,\n name,\n hashToken(token),\n ]);\n return token;\n}\n\nexport async function verifyToken(db: Db, token: string): Promise<{ workspaceId: string } | null> {\n if (!token.startsWith(\"tsk_\")) return null;\n const { rows } = await db.query<{ workspace_id: string; id: string }>(\n `SELECT id, workspace_id FROM api_tokens WHERE token_hash = $1`,\n [hashToken(token)],\n );\n if (!rows[0]) return null;\n void db.query(`UPDATE api_tokens SET last_used_at = now() WHERE id = $1`, [rows[0].id]).catch(() => {});\n return { workspaceId: rows[0].workspace_id };\n}\n\nexport async function ensureAdminToken(db: Db, workspaceId: string): Promise<string | null> {\n const { rows } = await db.query(`SELECT 1 FROM api_tokens WHERE workspace_id = $1 LIMIT 1`, [workspaceId]);\n if (rows.length > 0) return null;\n // `tesser dev` hands its spawned instance a known token (process boundary \u2014 the\n // Apache CLI never links this AGPL code).\n const preset = process.env[\"TESSER_BOOTSTRAP_TOKEN\"];\n if (preset && preset.startsWith(\"tsk_\")) {\n await db.query(`INSERT INTO api_tokens (workspace_id, name, token_hash) VALUES ($1,'bootstrap',$2)`, [\n workspaceId,\n hashToken(preset),\n ]);\n return preset;\n }\n return mintToken(db, workspaceId, \"admin (first boot)\");\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Db } from \"../db/db.js\";\nimport { migrations } from \"../db/migrations.js\";\nimport type { ServerConfig } from \"../config.js\";\n\nexport const RUNTIME_VERSION = readRuntimeVersion();\n\nfunction readRuntimeVersion(): string {\n for (const rel of [\"../package.json\", \"../../package.json\"]) {\n try {\n const pkg = JSON.parse(readFileSync(new URL(rel, import.meta.url), \"utf8\")) as { version?: unknown };\n if (typeof pkg.version === \"string\") return pkg.version;\n } catch {\n // Try the next runtime layout: source TS vs bundled dist.\n }\n }\n return \"0.0.0\";\n}\n\nexport interface RuntimeStatusDeps {\n db: Db;\n baseUrl: string;\n dataDir: string;\n roles: ServerConfig[\"roles\"];\n version?: string;\n}\n\nexport interface ReadinessStatus {\n ok: boolean;\n service: \"tesser\";\n version: string;\n checks: {\n database: { ok: boolean; kind: Db[\"kind\"]; reachable: boolean; message?: string };\n migrations: { ok: boolean; current: boolean; applied: string[]; pending: string[]; message?: string };\n dataDir: { ok: boolean; writable: boolean; message?: string };\n };\n}\n\nexport async function readinessStatus(deps: RuntimeStatusDeps): Promise<ReadinessStatus> {\n const database: ReadinessStatus[\"checks\"][\"database\"] = { ok: false, kind: deps.db.kind, reachable: false };\n const migrationsCheck: ReadinessStatus[\"checks\"][\"migrations\"] = {\n ok: false,\n current: false,\n applied: [],\n pending: migrations.map((m) => m.id),\n };\n\n try {\n await deps.db.query(`SELECT 1 AS ok`);\n database.ok = true;\n database.reachable = true;\n } catch {\n database.message = \"database query failed\";\n }\n\n if (database.reachable) {\n try {\n const { rows } = await deps.db.query<{ id: string }>(`SELECT id FROM schema_migrations ORDER BY id`);\n const applied = rows.map((r) => r.id);\n const appliedSet = new Set(applied);\n const pending = migrations.map((m) => m.id).filter((id) => !appliedSet.has(id));\n migrationsCheck.applied = applied;\n migrationsCheck.pending = pending;\n migrationsCheck.current = pending.length === 0;\n migrationsCheck.ok = migrationsCheck.current;\n } catch {\n migrationsCheck.message = \"schema_migrations check failed\";\n }\n }\n\n const dataDir = checkWritableDir(deps.dataDir);\n return {\n ok: database.ok && migrationsCheck.ok && dataDir.ok,\n service: \"tesser\",\n version: deps.version ?? RUNTIME_VERSION,\n checks: { database, migrations: migrationsCheck, dataDir },\n };\n}\n\nexport async function runtimeStatus(deps: RuntimeStatusDeps, workspaceId: string): Promise<Record<string, unknown>> {\n const readiness = await readinessStatus(deps);\n const queue = await queueStatus(deps.db);\n const deployments = await deploymentStatus(deps.db, workspaceId);\n const haltedCredentials = deployments.projects.filter((p) => p.status === \"halted-credentials\");\n const degraded = queue.dead > 0 || (deployments.byStatus[\"failed\"] ?? 0) > 0 || haltedCredentials.length > 0;\n\n return {\n ok: readiness.ok,\n degraded,\n service: \"tesser\",\n version: deps.version ?? RUNTIME_VERSION,\n booted: true,\n baseUrl: deps.baseUrl,\n roles: deps.roles,\n readiness,\n queue,\n deployments,\n haltedCredentials: {\n count: haltedCredentials.length,\n projects: haltedCredentials.map((p) => ({\n name: p.name,\n requirements: p.requirements,\n lastSyncedAt: p.lastSyncedAt,\n })),\n },\n };\n}\n\nfunction checkWritableDir(dataDir: string): { ok: boolean; writable: boolean; message?: string } {\n const probe = join(dataDir, `.tesser-write-probe-${randomUUID()}`);\n try {\n writeFileSync(probe, \"ok\", { flag: \"wx\" });\n rmSync(probe, { force: true });\n return { ok: true, writable: true };\n } catch {\n return { ok: false, writable: false, message: \"data directory is not writable\" };\n }\n}\n\nasync function queueStatus(db: Db): Promise<{ ready: number; leased: number; dead: number }> {\n const { rows } = await db.query<{ ready: string; leased: string; dead: string }>(\n `SELECT\n SUM(CASE WHEN status = 'ready' AND lease_until IS NULL THEN 1 ELSE 0 END)::text AS ready,\n SUM(CASE WHEN status = 'ready' AND lease_until IS NOT NULL THEN 1 ELSE 0 END)::text AS leased,\n SUM(CASE WHEN status = 'dead' THEN 1 ELSE 0 END)::text AS dead\n FROM queue_jobs`,\n );\n const row = rows[0] ?? { ready: \"0\", leased: \"0\", dead: \"0\" };\n return { ready: Number(row.ready), leased: Number(row.leased), dead: Number(row.dead) };\n}\n\nasync function deploymentStatus(\n db: Db,\n workspaceId: string,\n): Promise<{ byStatus: Record<string, number>; projects: Array<{ name: string; status: string; lastSha: string | null; lastSyncedAt: string | null; requirements: number }> }> {\n const { rows } = await db.query<{\n name: string;\n status: string | null;\n last_sha: string | null;\n last_synced_at: string | null;\n report: unknown;\n }>(\n `SELECT p.name, r.status, r.last_sha, r.last_synced_at, r.report\n FROM projects p LEFT JOIN repo_state r ON r.project_id = p.id\n WHERE p.workspace_id = $1\n ORDER BY p.name`,\n [workspaceId],\n );\n const byStatus: Record<string, number> = {};\n const projects = rows.map((row) => {\n const status = row.status ?? \"unlinked\";\n byStatus[status] = (byStatus[status] ?? 0) + 1;\n return {\n name: row.name,\n status,\n lastSha: row.last_sha,\n lastSyncedAt: row.last_synced_at,\n requirements: requirementCount(row.report),\n };\n });\n return { byStatus, projects };\n}\n\nfunction requirementCount(report: unknown): number {\n if (report && typeof report === \"object\" && Array.isArray((report as { requirements?: unknown }).requirements)) {\n return (report as { requirements: unknown[] }).requirements.length;\n }\n return 0;\n}\n", "import { createHash, generateKeyPairSync, randomBytes } from \"node:crypto\";\n\nexport interface DeployKeyPair {\n publicKey: string;\n privateKey: string;\n}\n\ninterface RsaPublicJwk {\n kty?: string;\n n?: string;\n e?: string;\n}\n\nfunction sshWireString(value: string | Buffer): Buffer {\n const bytes = typeof value === \"string\" ? Buffer.from(value, \"utf8\") : value;\n const len = Buffer.alloc(4);\n len.writeUInt32BE(bytes.length, 0);\n return Buffer.concat([len, bytes]);\n}\n\nfunction sshMpint(value: Buffer): Buffer {\n let bytes = value;\n while (bytes.length > 1 && bytes[0] === 0) bytes = bytes.subarray(1);\n if ((bytes[0]! & 0x80) !== 0) bytes = Buffer.concat([Buffer.from([0]), bytes]);\n return sshWireString(bytes);\n}\n\nfunction rsaPublicKeyFromJwk(jwk: RsaPublicJwk): string {\n if (jwk.kty !== \"RSA\" || typeof jwk.n !== \"string\" || typeof jwk.e !== \"string\") {\n throw new Error(\"unexpected rsa public key encoding\");\n }\n const algorithm = \"ssh-rsa\";\n const exponent = Buffer.from(jwk.e, \"base64url\");\n const modulus = Buffer.from(jwk.n, \"base64url\");\n const wire = Buffer.concat([sshWireString(algorithm), sshMpint(exponent), sshMpint(modulus)]).toString(\"base64\");\n return `${algorithm} ${wire}`;\n}\n\nexport function generateDeployKeyPair(): DeployKeyPair {\n // OpenSSH accepts PKCS#1 RSA private keys for `GIT_SSH_COMMAND=ssh -i ...`.\n // Keep generation pure-Node so the server does not need `ssh-keygen` at link time.\n const { publicKey, privateKey } = generateKeyPairSync(\"rsa\", { modulusLength: 3072, publicExponent: 0x10001 });\n return {\n publicKey: rsaPublicKeyFromJwk(publicKey.export({ format: \"jwk\" })),\n privateKey: privateKey.export({ type: \"pkcs1\", format: \"pem\" }).toString(),\n };\n}\n\nexport function mintWebhookSigningSecret(): string {\n return `whsec_${randomBytes(32).toString(\"base64url\")}`;\n}\n\nexport function mintWebhookSetupToken(): string {\n return `wst_${randomBytes(24).toString(\"base64url\")}`;\n}\n\nexport function hashWebhookSetupToken(token: string): string {\n return createHash(\"sha256\").update(token).digest(\"hex\");\n}\n", "// The connect pages (ADR-0005): the human's browser is where values enter the system.\n// Single-use links; OAuth consent and secret paste both land directly in the encrypted\n// store; the agent only polls /api/connect-links/:token/status. Plain HTML forms,\n// rendered by connect-view.ts in the @devosurf/tesser-brand system.\n\nimport { randomBytes } from \"node:crypto\";\nimport { Hono } from \"hono\";\nimport type { Db } from \"../db/db.js\";\nimport type { Broker } from \"../broker/broker.js\";\nimport {\n connectLinkStatus,\n getConnectLink,\n type ConnectionRequirement,\n type ConnectLinkRow,\n} from \"../broker/connect.js\";\nimport { buildAuthorizeUrl, exchangeCode, generatePkce } from \"../broker/oauth.js\";\nimport { hashWebhookSetupToken } from \"../gitsync/deploy-keys.js\";\nimport { esc, linkPage, messagePage, oauthAppPage, shell } from \"./connect-view.js\";\n\nexport interface ConnectDeps {\n db: Db;\n broker: Broker;\n baseUrl: string;\n}\n\nfunction hostOf(baseUrl: string): string {\n try {\n return new URL(baseUrl).host;\n } catch {\n return baseUrl;\n }\n}\n\nasync function renderLink(deps: ConnectDeps, link: ConnectLinkRow, notice?: string): Promise<string> {\n const status = await connectLinkStatus(deps.db, deps.broker, link);\n return linkPage({\n host: hostOf(deps.baseUrl),\n token: link.token,\n requirements: status.requirements,\n completed: status.status === \"completed\",\n notice,\n });\n}\n\nexport function createConnectRoutes(deps: ConnectDeps): Hono {\n const app = new Hono();\n const host = hostOf(deps.baseUrl);\n\n app.get(\"/setup/git/:token\", async (c) => {\n const tokenHash = hashWebhookSetupToken(c.req.param(\"token\"));\n const { rows } = await deps.db.query<{\n id: string;\n name: string;\n workspace_id: string;\n deploy_key_public: string | null;\n push_webhook_secret_cipher: string | null;\n }>(\n `SELECT id, name, workspace_id, deploy_key_public, push_webhook_secret_cipher\n FROM projects WHERE push_webhook_setup_token_hash=$1`,\n [tokenHash],\n );\n const project = rows[0];\n if (!project || !project.push_webhook_secret_cipher || !project.deploy_key_public) {\n return c.html(\n messagePage({\n host,\n title: \"Unknown setup link\",\n chip: { dot: \"danger\", label: \"unknown setup\" },\n headline: \"Unknown setup link.\",\n lead: \"This Project git setup link does not exist. Ask the agent to run <code class=\\\"t-code\\\">tesser link</code> again.\",\n }),\n 404,\n );\n }\n const webhookSecret = await deps.broker.decryptValue(\n project.workspace_id,\n project.push_webhook_secret_cipher,\n \"project.webhook.signing\",\n );\n const webhookUrl = `${deps.baseUrl.replace(/\\/$/, \"\")}/hooks/git/${project.id}/push`;\n return c.html(\n shell({\n title: `Git setup for ${project.name}`,\n host,\n chip: { dot: \"warning\", label: \"human setup\" },\n headline: \"Configure git deploy access.\",\n lead: `Add the deploy key and push webhook below in your git host for Project <code class=\\\"t-code\\\">${esc(project.name)}</code>. The private key and webhook signing secret are stored encrypted by this Instance and never returned by the CLI/API JSON.`,\n body: `<div class=\"t-stack t-gap-top-32\">\n <div class=\"t-card\"><div class=\"t-card-band t-card-band--stacked\">\n <span class=\"t-scopes\">deploy key (public)</span>\n <pre class=\"t-pre\">${esc(project.deploy_key_public)}</pre>\n </div></div>\n <div class=\"t-card\"><div class=\"t-card-band t-card-band--stacked\">\n <span class=\"t-scopes\">push webhook url</span>\n <pre class=\"t-pre\">${esc(webhookUrl)}</pre>\n <span class=\"t-scopes\">signing secret</span>\n <pre class=\"t-pre\">${esc(webhookSecret)}</pre>\n <span class=\"t-scopes\">signature header</span>\n <pre class=\"t-pre\">X-Hub-Signature-256: sha256=&lt;hmac-sha256 body with signing secret&gt;</pre>\n </div></div>\n </div>`,\n }),\n );\n });\n\n app.get(\"/connect/:token\", async (c) => {\n const link = await getConnectLink(deps.db, c.req.param(\"token\"));\n if (!link) {\n return c.html(\n messagePage({\n host,\n title: \"Unknown link\",\n chip: { dot: \"danger\", label: \"unknown link\" },\n headline: \"Unknown link.\",\n lead: \"This connect link does not exist.\",\n }),\n 404,\n );\n }\n if (link.status === \"expired\") {\n return c.html(\n messagePage({\n host,\n title: \"Link expired\",\n chip: { dot: \"warning\", label: \"link expired\" },\n headline: \"Link expired.\",\n lead: `Connect links are single use and short-lived. Ask the agent to mint a new one with <code class=\"t-code\">tesser connect</code>.`,\n }),\n 410,\n );\n }\n const notice = c.req.query(\"done\");\n return c.html(await renderLink(deps, link, notice));\n });\n\n app.post(\"/connect/:token/secret\", async (c) => {\n const link = await getConnectLink(deps.db, c.req.param(\"token\"));\n if (!link || link.status !== \"pending\") return c.text(\"link not active\", 410);\n const form = await c.req.parseBody();\n const name = String(form[\"name\"] ?? \"\");\n const value = String(form[\"value\"] ?? \"\");\n if (!link.requirements.some((r) => r.type === \"secret\" && r.name === name)) {\n return c.text(\"secret not part of this link\", 400);\n }\n if (value.length === 0) return c.text(\"empty value\", 400);\n await deps.broker.setSecret(link.workspace_id, name, value);\n return c.redirect(`/connect/${link.token}?done=secret:${encodeURIComponent(name)}`);\n });\n\n app.post(\"/connect/:token/connection\", async (c) => {\n const link = await getConnectLink(deps.db, c.req.param(\"token\"));\n if (!link || link.status !== \"pending\") return c.text(\"link not active\", 410);\n const form = await c.req.parseBody();\n const connector = String(form[\"connector\"] ?? \"\");\n const modeName = String(form[\"mode\"] ?? \"\");\n const scope = String(form[\"scope\"] ?? \"workspace\");\n const req = link.requirements.find(\n (r): r is ConnectionRequirement => r.type === \"connection\" && r.connector === connector && r.scope === scope,\n );\n const mode = req?.modes.find((m) => m.name === modeName);\n if (!req || !mode || mode.kind === \"oauth2\") return c.text(\"unknown connection requirement/mode\", 400);\n\n const endUserId = req.scope === \"per_user\" ? String(form[\"end_user_id\"] ?? \"\").trim() : \"\";\n if (req.scope === \"per_user\" && endUserId.length === 0) return c.text(\"missing end_user_id\", 400);\n const fields: Record<string, string> = {};\n for (const f of mode.fields) {\n const v = String(form[`field_${f}`] ?? \"\");\n if (v.length === 0) return c.text(`missing field ${f}`, 400);\n fields[f] = v;\n }\n const connectionId = await deps.broker.createConnection({\n workspaceId: link.workspace_id,\n connectorId: connector,\n ...(req.provider !== undefined ? { provider: req.provider } : {}),\n authMode: modeName,\n scope: req.scope,\n ...(req.scope === \"per_user\" ? { endUserId } : {}),\n label: `via connect link`,\n });\n await deps.broker.setConnectionCredential(connectionId, fields);\n return c.redirect(`/connect/${link.token}?done=${encodeURIComponent(connector)}`);\n });\n\n app.get(\"/connect/:token/oauth/start\", async (c) => {\n const link = await getConnectLink(deps.db, c.req.param(\"token\"));\n if (!link || link.status !== \"pending\") return c.text(\"link not active\", 410);\n const connector = c.req.query(\"connector\") ?? \"\";\n const modeName = c.req.query(\"mode\") ?? \"\";\n const scope = c.req.query(\"scope\") ?? \"workspace\";\n const req = link.requirements.find(\n (r): r is ConnectionRequirement => r.type === \"connection\" && r.connector === connector && r.scope === scope,\n );\n const mode = req?.modes.find((m) => m.name === modeName);\n if (!req || !mode || mode.kind !== \"oauth2\" || !req.providerFacts?.oauth2) {\n return c.text(\"unknown oauth requirement\", 400);\n }\n const endUserId = req.scope === \"per_user\" ? (c.req.query(\"end_user_id\") ?? \"\").trim() : \"\";\n if (req.scope === \"per_user\" && endUserId.length === 0) return c.text(\"missing end_user_id\", 400);\n const provider = req.provider ?? req.providerFacts.id;\n const app2 = await deps.broker.getOAuthApp(link.workspace_id, provider);\n if (!app2) {\n // BYO OAuth app (ADR-0005): collect the operator's client id/secret first.\n return c.html(\n oauthAppPage({\n host,\n token: link.token,\n provider,\n connector,\n mode: modeName,\n scope: req.scope,\n ...(endUserId ? { endUserId } : {}),\n callbackUrl: `${deps.baseUrl}/oauth/callback`,\n }),\n );\n }\n\n const connectionId = await deps.broker.createConnection({\n workspaceId: link.workspace_id,\n connectorId: connector,\n provider,\n authMode: modeName,\n scope: req.scope,\n ...(req.scope === \"per_user\" ? { endUserId } : {}),\n label: \"via connect link (oauth)\",\n });\n const state = `st_${randomBytes(16).toString(\"hex\")}`;\n const facts = req.providerFacts.oauth2;\n const pkce = facts.pkce === false ? undefined : generatePkce();\n const redirectUri = `${deps.baseUrl}/oauth/callback`;\n await deps.db.query(\n `INSERT INTO oauth_states (state, connect_token, connection_id, provider, code_verifier, redirect_uri, expires_at)\n VALUES ($1,$2,$3,$4,$5,$6, now() + interval '15 minutes')`,\n [state, link.token, connectionId, provider, pkce?.verifier ?? null, redirectUri],\n );\n const url = buildAuthorizeUrl({\n facts,\n clientId: app2.clientId,\n redirectUri,\n scopes: mode.scopes ?? [],\n state,\n codeChallenge: pkce?.challenge,\n });\n return c.redirect(url);\n });\n\n app.post(\"/connect/:token/oauth/app\", async (c) => {\n const link = await getConnectLink(deps.db, c.req.param(\"token\"));\n if (!link || link.status !== \"pending\") return c.text(\"link not active\", 410);\n const form = await c.req.parseBody();\n const provider = String(form[\"provider\"] ?? \"\");\n const clientId = String(form[\"client_id\"] ?? \"\");\n const clientSecret = String(form[\"client_secret\"] ?? \"\");\n if (!provider || !clientId || !clientSecret) return c.text(\"missing fields\", 400);\n await deps.broker.setOAuthApp(link.workspace_id, provider, clientId, clientSecret);\n const params = new URLSearchParams({\n connector: String(form[\"connector\"]),\n mode: String(form[\"mode\"]),\n scope: String(form[\"scope\"] ?? \"workspace\"),\n });\n const endUserId = String(form[\"end_user_id\"] ?? \"\").trim();\n if (endUserId) params.set(\"end_user_id\", endUserId);\n return c.redirect(`/connect/${link.token}/oauth/start?${params}`);\n });\n\n app.get(\"/oauth/callback\", async (c) => {\n const oauthError = (lead: string, pre?: string): string =>\n messagePage({\n host,\n title: \"OAuth error\",\n chip: { dot: \"danger\", label: \"oauth error\" },\n headline: \"OAuth error.\",\n lead,\n ...(pre !== undefined ? { pre } : {}),\n });\n\n const state = c.req.query(\"state\") ?? \"\";\n const code = c.req.query(\"code\") ?? \"\";\n const { rows } = await deps.db.query<{\n state: string;\n connect_token: string | null;\n connection_id: string;\n provider: string;\n code_verifier: string | null;\n redirect_uri: string;\n expires_at: string;\n }>(`SELECT * FROM oauth_states WHERE state=$1`, [state]);\n const st = rows[0];\n if (!st || new Date(String(st.expires_at)).getTime() < Date.now()) {\n return c.html(oauthError(\"State expired or unknown. Restart from the connect page.\"), 400);\n }\n await deps.db.query(`DELETE FROM oauth_states WHERE state=$1`, [state]); // single-use\n if (!code) return c.html(oauthError(`The provider returned: ${esc(c.req.query(\"error\") ?? \"consent denied\")}.`), 400);\n\n const link = st.connect_token ? await getConnectLink(deps.db, st.connect_token) : null;\n const req = link?.requirements.find(\n (r): r is ConnectionRequirement =>\n r.type === \"connection\" && (r.provider ?? r.providerFacts?.id) === st.provider,\n );\n const facts = req?.providerFacts?.oauth2;\n if (!link || !facts) return c.html(oauthError(\"Connect link no longer valid.\"), 400);\n\n const app2 = await deps.broker.getOAuthApp(link.workspace_id, st.provider);\n if (!app2) return c.html(oauthError(\"OAuth app vanished mid-flow.\"), 400);\n\n try {\n const tokens = await exchangeCode({\n facts,\n clientId: app2.clientId,\n clientSecret: app2.clientSecret,\n code,\n redirectUri: st.redirect_uri,\n codeVerifier: st.code_verifier ?? undefined,\n });\n await deps.broker.setConnectionCredential(\n st.connection_id,\n {\n access_token: tokens.accessToken,\n ...(tokens.refreshToken !== undefined ? { refresh_token: tokens.refreshToken } : {}),\n },\n {\n ...(tokens.expiresAt !== undefined ? { expiresAt: tokens.expiresAt } : {}),\n ...(tokens.scope !== undefined ? { scope: tokens.scope } : {}),\n },\n );\n } catch (err) {\n return c.html(oauthError(\"Token exchange failed.\", (err as Error).message), 502);\n }\n return c.redirect(`/connect/${link.token}?done=${encodeURIComponent(req!.connector)}`);\n });\n\n // Manual webhook registration completion (ADR-0013 manual mode).\n app.post(\"/connect/:token/webhook/:registrationId\", async (c) => {\n const link = await getConnectLink(deps.db, c.req.param(\"token\"));\n if (!link || link.status !== \"pending\") return c.text(\"link not active\", 410);\n const regId = c.req.param(\"registrationId\");\n if (!link.requirements.some((r) => r.type === \"webhook-manual\" && r.registrationId === regId)) {\n return c.text(\"registration not part of this link\", 400);\n }\n const form = await c.req.parseBody();\n const secret = String(form[\"signing_secret\"] ?? \"\");\n if (secret.length === 0) return c.text(\"empty signing secret\", 400);\n const cipher = await deps.broker.encryptValue(link.workspace_id, secret, \"webhook.signing\");\n await deps.db.query(\n `UPDATE webhook_registrations SET signing_secret_cipher=$2, status='registered', updated_at=now() WHERE id=$1`,\n [regId, cipher],\n );\n return c.redirect(`/connect/${link.token}?done=webhook`);\n });\n\n return app;\n}\n", "// Tesser design tokens \u2014 the single source of truth, transcribed from the Paper\n// design system (pages 01-04: The Mark, Color, Typography, Grid & Spacing).\n// tokens.css is generated from this file: `pnpm --filter @devosurf/tesser-brand emit`.\n\n/** Core, neutral, and functional colors. One blue, used on purpose. */\nexport const color = {\n /** The single brand accent. Links, indices, focus, primary action. */\n cobalt: \"#1B45E0\",\n /** Active / pressed cobalt. */\n cobaltPress: \"#1438B0\",\n /** Subtle fills, grid backgrounds. */\n cobaltWash: \"#EEF1FD\",\n /** Primary text, rules, and primary buttons. The structural color. */\n ink: \"#111111\",\n /** The page and every surface. White space is part of the system. */\n paper: \"#FFFFFF\",\n /** Body strong. */\n grey700: \"#444444\",\n /** Muted text. */\n grey500: \"#666666\",\n /** Captions. */\n grey400: \"#8A8A8A\",\n /** Borders. */\n grey200: \"#E6E6E6\",\n /** Dividers: ink at 16%. */\n hairline: \"rgba(17, 17, 17, 0.16)\",\n /** Run status: live, passing. Never a brand accent. */\n positive: \"#1F7A4D\",\n /** Run status: halted, pending. */\n warning: \"#B7791F\",\n /** Run status: failed, rolled back. */\n danger: \"#C0392B\",\n} as const;\n\n/** Inter carries the system; Geist Mono carries code and machine values. */\nexport const font = {\n sans: `\"Inter\", system-ui, -apple-system, \"Segoe UI\", sans-serif`,\n mono: `\"Geist Mono\", ui-monospace, \"SF Mono\", Menlo, Consolas, monospace`,\n} as const;\n\nexport interface TypeStep {\n family: keyof typeof font;\n weight: number;\n /** px */\n size: number;\n /** px */\n line: number;\n /** em */\n tracking: number;\n uppercase?: boolean;\n}\n\n/** The type scale. Scale and weight do the work that color does not. */\nexport const text = {\n /** Hero statements. */\n display: { family: \"sans\", weight: 800, size: 80, line: 80, tracking: -0.04 },\n /** Page titles. */\n h1: { family: \"sans\", weight: 800, size: 58, line: 60, tracking: -0.035 },\n /** Section titles. */\n h2: { family: \"sans\", weight: 700, size: 38, line: 44, tracking: -0.03 },\n /** Card and subsection titles. */\n h3: { family: \"sans\", weight: 700, size: 24, line: 30, tracking: -0.02 },\n /** Lead paragraphs. */\n bodyLg: { family: \"sans\", weight: 400, size: 19, line: 30, tracking: 0 },\n /** Default body. */\n body: { family: \"sans\", weight: 400, size: 17, line: 26, tracking: 0 },\n /** Secondary and captions. */\n bodySm: { family: \"sans\", weight: 400, size: 15, line: 23, tracking: 0 },\n /** Eyebrows and tracked labels. */\n label: { family: \"sans\", weight: 600, size: 12, line: 16, tracking: 0.14, uppercase: true },\n /** Code and machine values. */\n mono: { family: \"mono\", weight: 400, size: 14, line: 22, tracking: 0 },\n} as const satisfies Record<string, TypeStep>;\n\n/** Base unit 4px. Every gap and pad is a multiple. */\nexport const space = [4, 8, 12, 16, 24, 32, 48, 64, 80, 112] as const;\n\n/** Every layout sits on a 12 column grid with a 64px margin. */\nexport const grid = {\n columns: 12,\n /** px, page edge to content */\n margin: 64,\n /** px, space between columns */\n gutter: 24,\n /** px, canvas width */\n max: 1440,\n} as const;\n\n/** Two rules. 1.5px ink separates bands; 1px ink at 16% separates rows. Nothing heavier. */\nexport const rule = {\n strong: `1.5px solid ${color.ink}`,\n hairline: `1px solid ${color.hairline}`,\n} as const;\n\n/** Square by default. The system is built from rules and the grid, not rounded shapes. */\nexport const radius = { none: \"0px\" } as const;\n\nexport const tokens = { color, font, text, space, grid, rule, radius } as const;\n\nconst kebab = (s: string): string => s.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").replace(/([a-z]{2,})([0-9]+)$/, \"$1-$2\").toLowerCase();\n\n/** The :root custom-property block. tokens.css is exactly this string. */\nexport function tokensCss(): string {\n const lines: string[] = [];\n for (const [name, value] of Object.entries(color)) lines.push(` --color-${kebab(name)}: ${value};`);\n for (const [name, value] of Object.entries(font)) lines.push(` --font-${name}: ${value};`);\n for (const [name, step] of Object.entries(text) as Array<[string, TypeStep]>) {\n const n = kebab(name);\n lines.push(\n ` --text-${n}: ${step.weight} ${step.size}px/${step.line}px var(--font-${step.family});`,\n ` --text-${n}-tracking: ${step.tracking}em;`,\n );\n }\n for (const step of space) lines.push(` --space-${step}: ${step}px;`);\n for (const [name, value] of Object.entries(grid)) {\n lines.push(` --grid-${name}: ${typeof value === \"number\" && name !== \"columns\" ? `${value}px` : value};`);\n }\n for (const [name, value] of Object.entries(rule)) lines.push(` --rule-${name}: ${value};`);\n lines.push(` --radius-none: ${radius.none};`);\n return `:root {\\n${lines.join(\"\\n\")}\\n}\\n`;\n}\n", "// The UI primitive layer \u2014 a small set of classes assembled from the tokens\n// (Paper design system page 05: Components). Square corners, ink rules, one blue.\n// ui.css is generated from this file: `pnpm --filter @devosurf/tesser-brand emit`.\n//\n// Class prefix `t-`. Every value is a token reference; the two literals allowed\n// are pure black (the documented hover state) and the 4px progress bar.\n\nexport const uiCss = `/* base ------------------------------------------------------------------ */\n.t-page {\n margin: 0;\n background: var(--color-paper);\n color: var(--color-ink);\n font: var(--text-body-sm);\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.t-main {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: var(--space-64) var(--space-24) var(--space-80);\n}\n.t-col {\n width: 100%;\n max-width: 720px;\n display: flex;\n flex-direction: column;\n}\n:is(.t-page) :focus-visible {\n outline: 2px solid var(--color-cobalt);\n outline-offset: 2px;\n}\n\n/* type ------------------------------------------------------------------ */\n.t-display { font: var(--text-display); letter-spacing: var(--text-display-tracking); margin: 0; }\n.t-h1 { font: var(--text-h1); letter-spacing: var(--text-h1-tracking); margin: 0; }\n.t-h2 { font: var(--text-h2); letter-spacing: var(--text-h2-tracking); margin: 0; }\n.t-h3 { font: var(--text-h3); letter-spacing: var(--text-h3-tracking); margin: 0; }\n.t-body-lg { font: var(--text-body-lg); margin: 0; }\n.t-body { font: var(--text-body); margin: 0; }\n.t-body-sm { font: var(--text-body-sm); margin: 0; }\n.t-label {\n font: var(--text-label);\n letter-spacing: var(--text-label-tracking);\n text-transform: uppercase;\n margin: 0;\n}\n.t-mono { font: var(--text-mono); margin: 0; }\n/* Product page title: h2 scale carrying h1 weight, as set on the connect comp. */\n.t-page-title { font: 800 38px/44px var(--font-sans); letter-spacing: -0.03em; margin: 0; }\n.t-lead { font: var(--text-body); color: var(--color-grey-500); margin: var(--space-16) 0 0; }\n\n/* top bar ----------------------------------------------------------------- */\n.t-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-16);\n padding: var(--space-16) var(--space-32);\n border-bottom: 1px solid var(--color-grey-200);\n background: var(--color-paper);\n}\n.t-bar--strong { border-bottom: var(--rule-strong); }\n.t-brand {\n display: flex;\n align-items: center;\n gap: var(--space-8);\n color: inherit;\n text-decoration: none;\n}\n.t-brand svg { flex-shrink: 0; display: block; }\n.t-wordmark { font: 700 18px/22px var(--font-sans); letter-spacing: -0.02em; }\n.t-bar-meta { display: flex; align-items: center; gap: var(--space-12); }\n.t-host { font: 400 13px/16px var(--font-mono); color: var(--color-grey-400); }\n\n/* chips, dots, status ------------------------------------------------------ */\n.t-chip {\n display: inline-flex;\n align-items: center;\n gap: var(--space-8);\n padding: var(--space-4) var(--space-12);\n border: 1px solid var(--color-grey-200);\n font: 400 12.5px/16px var(--font-mono);\n color: var(--color-grey-700);\n white-space: nowrap;\n}\n.t-dot { width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; background: var(--color-grey-400); }\n.t-dot--positive { background: var(--color-positive); }\n.t-dot--warning { background: var(--color-warning); }\n.t-dot--danger { background: var(--color-danger); }\n.t-status { display: inline-flex; align-items: center; gap: var(--space-8); font: 400 13.5px/18px var(--font-sans); white-space: nowrap; }\n.t-status--pending { color: var(--color-warning); }\n.t-status--ready { color: var(--color-grey-500); }\n.t-status--danger { color: var(--color-danger); }\n\n/* progress ----------------------------------------------------------------- */\n.t-progress { display: flex; flex-direction: column; gap: var(--space-8); }\n.t-progress-meta { display: flex; align-items: center; justify-content: space-between; font: 400 13px/16px var(--font-mono); color: var(--color-ink); }\n.t-progress-meta .is-remaining { color: var(--color-grey-400); }\n.t-progress-track { height: 4px; background: var(--color-grey-200); }\n.t-progress-fill { height: 4px; background: var(--color-cobalt); }\n\n/* cards ---------------------------------------------------------------- */\n.t-stack { display: flex; flex-direction: column; gap: var(--space-16); }\n.t-card { border: 1px solid var(--color-grey-200); background: var(--color-paper); }\n.t-card-head { display: flex; align-items: center; gap: var(--space-16); padding: var(--space-16) var(--space-24); }\n.t-card-band {\n display: flex;\n align-items: center;\n gap: var(--space-16);\n padding: var(--space-12) var(--space-24);\n border-top: 1px solid var(--color-grey-200);\n}\n.t-card-band--stacked { flex-direction: column; align-items: stretch; }\n.t-tile {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n border: 1px solid var(--color-grey-200);\n font: 600 15px/18px var(--font-mono);\n color: var(--color-ink);\n}\n.t-card-id { display: flex; flex-direction: column; gap: 2px; min-width: 0; }\n.t-card-title-row { display: flex; align-items: center; gap: var(--space-8); }\n.t-card-title { font: 600 16px/20px var(--font-sans); }\n.t-card-title--mono { font: 600 15px/18px var(--font-mono); }\n.t-kind { font: 400 13px/16px var(--font-sans); color: var(--color-grey-400); }\n.t-meta { font: 400 13px/16px var(--font-sans); color: var(--color-grey-400); overflow-wrap: anywhere; }\n.t-scopes { font: 400 12.5px/16px var(--font-mono); color: var(--color-grey-400); overflow-wrap: anywhere; }\n\n/* buttons -------------------------------------------------------------- */\n.t-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--space-8);\n border: 0;\n border-radius: var(--radius-none);\n padding: var(--space-12) 20px;\n font: 600 14.5px/18px var(--font-sans);\n cursor: pointer;\n text-decoration: none;\n white-space: nowrap;\n}\n.t-btn svg { flex-shrink: 0; display: block; }\n.t-btn--primary { background: var(--color-ink); color: var(--color-paper); }\n.t-btn--primary:hover { background: #000000; }\n.t-btn--accent { background: var(--color-cobalt); color: var(--color-paper); }\n.t-btn--accent:hover, .t-btn--accent:active { background: var(--color-cobalt-press); }\n.t-btn--secondary { background: transparent; color: var(--color-ink); border: 1px solid var(--color-ink); padding: 11px 19px; }\n.t-btn--secondary:hover { background: var(--color-cobalt-wash); }\n.t-btn:disabled { background: var(--color-grey-200); color: var(--color-grey-400); cursor: not-allowed; }\n.t-link { color: var(--color-cobalt); text-decoration: underline; text-underline-offset: 3px; }\n.t-link:hover { color: var(--color-cobalt-press); }\n\n/* forms ----------------------------------------------------------------- */\n.t-field { display: flex; flex-direction: column; gap: var(--space-4); flex: 1 1 auto; min-width: 0; }\n.t-field-label {\n font: var(--text-label);\n letter-spacing: var(--text-label-tracking);\n text-transform: uppercase;\n color: var(--color-grey-500);\n}\n.t-input {\n width: 100%;\n box-sizing: border-box;\n border: 1px solid var(--color-grey-200);\n border-radius: var(--radius-none);\n background: var(--color-paper);\n padding: var(--space-12) var(--space-16);\n font: 400 14px/18px var(--font-mono);\n color: var(--color-ink);\n}\n.t-input::placeholder { color: var(--color-grey-400); }\n.t-input:focus-visible { outline: 2px solid var(--color-cobalt); outline-offset: -1px; }\n.t-form-row { display: flex; align-items: center; gap: var(--space-12); flex: 1 1 auto; }\n.t-form-col { display: flex; flex-direction: column; align-items: stretch; gap: var(--space-12); flex: 1 1 auto; min-width: 0; }\n.t-form-col .t-btn { align-self: flex-end; }\n\n/* notices, code, footnote ---------------------------------------------- */\n.t-notice {\n display: flex;\n align-items: center;\n gap: var(--space-8);\n padding: var(--space-12) var(--space-16);\n border: 1px solid var(--color-grey-200);\n font: 400 13.5px/18px var(--font-sans);\n color: var(--color-grey-700);\n}\n.t-pre {\n margin: 0;\n padding: var(--space-16);\n background: var(--color-cobalt-wash);\n font: 400 13px/20px var(--font-mono);\n overflow: auto;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n.t-code { font-family: var(--font-mono); font-size: 0.92em; background: var(--color-cobalt-wash); padding: 1px 5px; }\n.t-footnote {\n display: flex;\n align-items: center;\n gap: var(--space-12);\n padding-top: var(--space-24);\n font: 400 13.5px/18px var(--font-sans);\n color: var(--color-grey-400);\n}\n.t-footnote svg { flex-shrink: 0; display: block; }\n\n/* utilities -------------------------------------------------------------- */\n.t-right { margin-left: auto; }\n.t-grow { flex: 1 1 auto; min-width: 0; }\n.t-gap-top-16 { margin-top: var(--space-16); }\n.t-gap-top-24 { margin-top: var(--space-24); }\n.t-gap-top-32 { margin-top: var(--space-32); }\n.t-gap-top-48 { margin-top: var(--space-48); }\n\n/* small screens ----------------------------------------------------------- */\n@media (max-width: 640px) {\n .t-bar { padding: var(--space-12) var(--space-16); }\n .t-host { display: none; }\n .t-main { padding: var(--space-32) var(--space-16) var(--space-48); }\n .t-page-title { font-size: 28px; line-height: 34px; }\n .t-card-head { flex-wrap: wrap; }\n .t-card-band { flex-wrap: wrap; }\n .t-form-row { flex-wrap: wrap; }\n}\n`;\n", "// The mark (Paper design system page 01): a tesseract \u2014 a square nested inside a\n// square, joined at the corners. Cobalt outer, ink inner. It sits upright, flat,\n// always square. Below 20px the connectors drop and only the two squares remain.\n\nimport { color } from \"./tokens.js\";\n\nexport type MarkVariant =\n /** Cobalt outer, ink inner. The primary mark on paper. */\n | \"brand\"\n /** One color, ink. Print, stamps. */\n | \"mono\"\n /** On ink. Cobalt outer, white inner. */\n | \"reversed\"\n /** On cobalt. All white. */\n | \"on-accent\";\n\nexport interface MarkOptions {\n /** Rendered size in px. Minimum 16. */\n size?: number;\n variant?: MarkVariant;\n /** Accessible name. Omitted: the mark is decorative (aria-hidden). */\n title?: string;\n}\n\nconst PALETTE: Record<MarkVariant, { outer: string; inner: string }> = {\n brand: { outer: color.cobalt, inner: color.ink },\n mono: { outer: color.ink, inner: color.ink },\n reversed: { outer: color.cobalt, inner: color.paper },\n \"on-accent\": { outer: color.paper, inner: color.paper },\n};\n\nconst escAttr = (s: string): string =>\n s.replace(/[&<>\"]/g, (ch) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\" })[ch]!);\n\n/** The mark as an inline SVG string. */\nexport function markSvg(options: MarkOptions = {}): string {\n const { size = 22, variant = \"brand\", title } = options;\n const { outer, inner } = PALETTE[variant];\n // Outer square frames the bounding box; inner square is two fifths, centered;\n // four connectors join matching corners. Stroke ~ one fortieth of the width.\n const connectors =\n size >= 20\n ? `<line x1=\"12\" y1=\"12\" x2=\"36\" y2=\"36\" stroke=\"${inner}\" stroke-width=\"5\"/>` +\n `<line x1=\"88\" y1=\"12\" x2=\"64\" y2=\"36\" stroke=\"${inner}\" stroke-width=\"5\"/>` +\n `<line x1=\"12\" y1=\"88\" x2=\"36\" y2=\"64\" stroke=\"${inner}\" stroke-width=\"5\"/>` +\n `<line x1=\"88\" y1=\"88\" x2=\"64\" y2=\"64\" stroke=\"${inner}\" stroke-width=\"5\"/>`\n : \"\";\n const a11y = title ? `role=\"img\" aria-label=\"${escAttr(title)}\"` : `aria-hidden=\"true\"`;\n return (\n `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 100 100\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" ${a11y}>` +\n `<rect x=\"12\" y=\"12\" width=\"76\" height=\"76\" stroke=\"${outer}\" stroke-width=\"6\"/>` +\n `<rect x=\"36\" y=\"36\" width=\"28\" height=\"28\" stroke=\"${inner}\" stroke-width=\"6\"/>` +\n connectors +\n `</svg>`\n );\n}\n", "// @devosurf/tesser-brand \u2014 the Tesser design system as code.\n// Tokens (color, type, grid, spacing), the UI primitive layer, and the mark.\n// Static consumers import tokens.css / ui.css; TypeScript consumers import here.\n\nexport { color, font, text, space, grid, rule, radius, tokens, tokensCss, type TypeStep } from \"./tokens.js\";\nexport { uiCss } from \"./ui.js\";\nexport { markSvg, type MarkOptions, type MarkVariant } from \"./mark.js\";\n\nimport { tokensCss } from \"./tokens.js\";\nimport { uiCss } from \"./ui.js\";\n\n/** The full stylesheet (tokens + primitives) for inlining into a server-rendered page. */\nexport function inlineCss(): string {\n return `${tokensCss()}\\n${uiCss}`;\n}\n", "// Rendering for the connect pages \u2014 pure functions from view data to HTML.\n// Styled by @devosurf/tesser-brand; no styling decisions live in this file beyond\n// composing the t- primitives. The requirement cards are manifest-driven, so a\n// custom connector renders exactly like a built-in one: a monogram tile, the\n// modes its manifest declares, and nothing hardcoded per provider.\n\nimport { inlineCss, markSvg } from \"@devosurf/tesser-brand\";\nimport type { ConnectionRequirement, Requirement } from \"../broker/connect.js\";\n\nexport const esc = (s: unknown): string =>\n String(s ?? \"\").replace(/[&<>\"']/g, (ch) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" })[ch]!);\n\nconst CSS = inlineCss();\n\nconst ARROW = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path d=\"M5 12h14M13 6l6 6-6 6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`;\nconst SHIELD = `<svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path d=\"M12 3l7 3v5c0 4.5-3 7.5-7 9-4-1.5-7-4.5-7-9V6l7-3Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linejoin=\"round\"/><path d=\"M9 12l2 2 4-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`;\n\nexport interface ShellOptions {\n /** Browser tab title; the page headline carries the brand, the tab gets \"\u00B7 tesser\". */\n title: string;\n /** Instance host shown in the top bar. */\n host: string;\n /** Link-state chip in the top bar. */\n chip?: { dot: \"positive\" | \"warning\" | \"danger\"; label: string };\n headline: string;\n /** May contain markup; callers escape interpolations. */\n lead?: string;\n body?: string;\n /** The encrypted-store footnote; on for pages that accept values. */\n securityNote?: boolean;\n}\n\nexport function shell(o: ShellOptions): string {\n const chip = o.chip\n ? `<span class=\"t-chip\"><span class=\"t-dot t-dot--${o.chip.dot}\"></span>${esc(o.chip.label)}</span>`\n : \"\";\n return `<!doctype html><html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n<title>${esc(o.title)} \u00B7 tesser</title>\n<style>${CSS}</style></head><body class=\"t-page\">\n<header class=\"t-bar\">\n <span class=\"t-brand\">${markSvg({ size: 22 })}<span class=\"t-wordmark\">tesser</span></span>\n <span class=\"t-bar-meta\">${chip}<span class=\"t-host\">${esc(o.host)}</span></span>\n</header>\n<main class=\"t-main\"><div class=\"t-col\">\n <h1 class=\"t-page-title\">${esc(o.headline)}</h1>\n ${o.lead ? `<p class=\"t-lead\">${o.lead}</p>` : \"\"}\n ${o.body ?? \"\"}\n ${o.securityNote ? `<p class=\"t-footnote\">${SHIELD}<span>Single use and expiring. Values go to the encrypted store. The agent holds a handle, never the value.</span></p>` : \"\"}\n</div></main>\n</body></html>`;\n}\n\n/* requirement cards ----------------------------------------------------- */\n\nexport interface RequirementView {\n requirement: Requirement;\n satisfied: boolean;\n}\n\n/** Monogram tile glyph: the first character of the thing's own name, any connector. */\nconst glyph = (id: string): string => (id.trim().charAt(0) || \"?\").toUpperCase();\n\nconst status = (satisfied: boolean, pendingLabel: string, readyLabel: string): string =>\n satisfied\n ? `<span class=\"t-status t-status--ready t-right\"><span class=\"t-dot t-dot--positive\"></span>${esc(readyLabel)}</span>`\n : `<span class=\"t-status t-status--pending t-right\"><span class=\"t-dot t-dot--warning\"></span>${esc(pendingLabel)}</span>`;\n\nconst head = (o: { glyph: string; title: string; mono?: boolean; kind: string; meta: string; status: string }): string =>\n `<div class=\"t-card-head\">\n <span class=\"t-tile\" aria-hidden=\"true\">${esc(o.glyph)}</span>\n <span class=\"t-card-id\">\n <span class=\"t-card-title-row\"><span class=\"t-card-title${o.mono ? \" t-card-title--mono\" : \"\"}\">${esc(o.title)}</span><span class=\"t-kind\">${esc(o.kind)}</span></span>\n <span class=\"t-meta\">${esc(o.meta)}</span>\n </span>\n ${o.status}\n </div>`;\n\nconst neededBy = (automations: string[]): string => `Needed by ${automations.join(\", \")}`;\n\nconst fieldInput = (name: string, label: string): string => {\n const type = /key|token|password|secret/i.test(label) ? \"password\" : \"text\";\n return `<label class=\"t-field\"><span class=\"t-field-label\">${esc(label.replace(/_/g, \" \"))}</span><input class=\"t-input\" name=\"${esc(name)}\" type=\"${type}\" required autocomplete=\"off\"></label>`;\n};\n\nfunction endUserInput(req: ConnectionRequirement): string {\n return req.scope === \"per_user\" ? fieldInput(\"end_user_id\", \"end user id\") : \"\";\n}\n\nfunction connectionBands(token: string, req: ConnectionRequirement): string {\n return req.modes\n .map((mode) => {\n if (mode.kind === \"oauth2\") {\n const note = mode.scopes?.length ? `scopes \u00B7 ${mode.scopes.join(\" \u00B7 \")}` : `mode \u00B7 ${mode.name}`;\n return `<form class=\"t-card-band${req.scope === \"per_user\" ? \" t-card-band--stacked\" : \"\"}\" method=\"get\" action=\"/connect/${esc(token)}/oauth/start\">\n <input type=\"hidden\" name=\"connector\" value=\"${esc(req.connector)}\">\n <input type=\"hidden\" name=\"mode\" value=\"${esc(mode.name)}\">\n <input type=\"hidden\" name=\"scope\" value=\"${esc(req.scope)}\">\n <span class=\"t-scopes\">${esc(note)}${req.scope === \"per_user\" ? \" \u00B7 end user required\" : \"\"}</span>\n ${endUserInput(req)}\n <button class=\"t-btn t-btn--accent${req.scope === \"per_user\" ? \"\" : \" t-right\"}\">Connect with OAuth ${ARROW}</button>\n </form>`;\n }\n const hidden = `<input type=\"hidden\" name=\"connector\" value=\"${esc(req.connector)}\">\n <input type=\"hidden\" name=\"mode\" value=\"${esc(mode.name)}\">\n <input type=\"hidden\" name=\"scope\" value=\"${esc(req.scope)}\">`;\n if (mode.fields.length === 0) {\n return `<form class=\"t-card-band${req.scope === \"per_user\" ? \" t-card-band--stacked\" : \"\"}\" method=\"post\" action=\"/connect/${esc(token)}/connection\">\n ${hidden}\n <span class=\"t-scopes\">mode \u00B7 ${esc(mode.name)}${req.scope === \"per_user\" ? \" \u00B7 end user required\" : \"\"}</span>\n ${endUserInput(req)}\n <button class=\"t-btn t-btn--primary${req.scope === \"per_user\" ? \"\" : \" t-right\"}\">Create connection</button>\n </form>`;\n }\n return `<div class=\"t-card-band t-card-band--stacked\">\n <span class=\"t-scopes\">mode \u00B7 ${esc(mode.name)}${mode.describe ? ` \u00B7 ${esc(mode.describe)}` : \"\"}</span>\n <form class=\"t-form-col\" method=\"post\" action=\"/connect/${esc(token)}/connection\">\n ${hidden}\n ${endUserInput(req)}\n ${mode.fields.map((f) => fieldInput(`field_${f}`, f)).join(\"\\n\")}\n <button class=\"t-btn t-btn--primary\">Save credential</button>\n </form>\n </div>`;\n })\n .join(\"\");\n}\n\nexport function requirementCard(token: string, view: RequirementView): string {\n const { requirement: req, satisfied } = view;\n\n if (req.type === \"connection\") {\n const scope = req.scope === \"per_user\" ? \"per user\" : req.scope;\n const top = head({\n glyph: glyph(req.connector),\n title: req.connector,\n kind: \"connection\",\n meta: `${satisfied ? \"Connected \u00B7 \" : \"\"}${neededBy(req.automations)} \u00B7 ${scope}`,\n status: status(satisfied, \"pending\", \"ready\"),\n });\n return `<div class=\"t-card\">${top}${satisfied ? \"\" : connectionBands(token, req)}</div>`;\n }\n\n if (req.type === \"secret\") {\n const top = head({\n glyph: glyph(req.name),\n title: req.name,\n mono: true,\n kind: \"secret\",\n meta: `${req.describe ? `${req.describe} \u00B7 ` : \"\"}${neededBy(req.automations)}`,\n status: status(satisfied, \"pending\", \"set\"),\n });\n const band = satisfied\n ? \"\"\n : `<form class=\"t-card-band\" method=\"post\" action=\"/connect/${esc(token)}/secret\">\n <input type=\"hidden\" name=\"name\" value=\"${esc(req.name)}\">\n <input class=\"t-input t-grow\" name=\"value\" type=\"password\" placeholder=\"value\" required autocomplete=\"off\" aria-label=\"value for ${esc(req.name)}\">\n <button class=\"t-btn t-btn--primary\">Save</button>\n </form>`;\n return `<div class=\"t-card\">${top}${band}</div>`;\n }\n\n const top = head({\n glyph: glyph(req.connector),\n title: `${req.connector}.${req.trigger}`,\n mono: true,\n kind: \"webhook\",\n meta: `Register with the provider \u00B7 needed by ${req.automation}`,\n status: status(satisfied, \"action needed\", \"registered\"),\n });\n const band = satisfied\n ? \"\"\n : `<div class=\"t-card-band t-card-band--stacked\">\n <pre class=\"t-pre\">${esc(req.instructions)}</pre>\n <form class=\"t-form-row\" method=\"post\" action=\"/connect/${esc(token)}/webhook/${esc(req.registrationId)}\">\n <input class=\"t-input t-grow\" name=\"signing_secret\" type=\"password\" placeholder=\"signing secret\" required autocomplete=\"off\" aria-label=\"signing secret\">\n <button class=\"t-btn t-btn--primary\">Save and mark registered</button>\n </form>\n </div>`;\n return `<div class=\"t-card\">${top}${band}</div>`;\n}\n\n/* the link page ---------------------------------------------------------- */\n\nconst COUNT_WORDS = [\"Zero\", \"One\", \"Two\", \"Three\", \"Four\", \"Five\", \"Six\", \"Seven\", \"Eight\", \"Nine\"];\n\nexport function linkHeadline(total: number, done: boolean): string {\n if (done) return \"All set.\";\n const count = COUNT_WORDS[total] ?? String(total);\n return `${count} ${total === 1 ? \"thing\" : \"things\"} to connect.`;\n}\n\n/** Maps the ?done= redirect param to a human notice. */\nexport function noticeLabel(done: string): string {\n if (done.startsWith(\"secret:\")) return `Saved ${done.slice(\"secret:\".length)}.`;\n if (done === \"webhook\") return \"Webhook registered.\";\n return `Connected ${done}.`;\n}\n\nexport function linkPage(o: {\n host: string;\n token: string;\n requirements: RequirementView[];\n completed: boolean;\n notice?: string | undefined;\n}): string {\n const total = o.requirements.length;\n const ready = o.requirements.filter((r) => r.satisfied).length;\n const pending = total - ready;\n const done = o.completed || (total > 0 && pending === 0);\n\n const progress =\n total === 0\n ? \"\"\n : `<div class=\"t-progress t-gap-top-32\">\n <div class=\"t-progress-meta\"><span>${ready} of ${total} ready</span><span class=\"is-remaining\">${pending > 0 ? `${pending} pending` : \"complete\"}</span></div>\n <div class=\"t-progress-track\"><div class=\"t-progress-fill\" style=\"width:${Math.round((ready / total) * 100)}%\"></div></div>\n </div>`;\n\n const notice = o.notice\n ? `<div class=\"t-notice t-gap-top-24\"><span class=\"t-dot t-dot--positive\"></span>${esc(noticeLabel(o.notice))}</div>`\n : \"\";\n\n const cards = total === 0 ? \"\" : `<div class=\"t-stack t-gap-top-32\">${o.requirements.map((r) => requirementCard(o.token, r)).join(\"\\n\")}</div>`;\n\n return shell({\n title: done ? \"All set\" : \"Connect\",\n host: o.host,\n chip: { dot: \"positive\", label: \"single-use link\" },\n headline: linkHeadline(total, done),\n lead: done\n ? \"Everything this deploy needs is in place. You can close this page. The agent picks it up from here.\"\n : \"Your agent halted this deploy until these are in place. The agent takes it from there.\",\n body: `${notice}${progress}${cards}`,\n securityNote: true,\n });\n}\n\n/* secondary pages --------------------------------------------------------- */\n\nexport function oauthAppPage(o: { host: string; token: string; provider: string; connector: string; mode: string; scope: string; endUserId?: string | undefined; callbackUrl: string }): string {\n const top = head({\n glyph: glyph(o.provider),\n title: o.provider,\n kind: \"oauth app\",\n meta: \"Bring your own app: the instance stores the client credentials, encrypted\",\n status: status(false, \"action needed\", \"ready\"),\n });\n const body = `<div class=\"t-card t-gap-top-32\">${top}\n <div class=\"t-card-band t-card-band--stacked\">\n <span class=\"t-scopes\">callback url</span>\n <pre class=\"t-pre\">${esc(o.callbackUrl)}</pre>\n <form class=\"t-form-col\" method=\"post\" action=\"/connect/${esc(o.token)}/oauth/app\">\n <input type=\"hidden\" name=\"provider\" value=\"${esc(o.provider)}\">\n <input type=\"hidden\" name=\"connector\" value=\"${esc(o.connector)}\">\n <input type=\"hidden\" name=\"mode\" value=\"${esc(o.mode)}\">\n <input type=\"hidden\" name=\"scope\" value=\"${esc(o.scope)}\">\n ${o.endUserId ? `<input type=\"hidden\" name=\"end_user_id\" value=\"${esc(o.endUserId)}\">` : \"\"}\n ${fieldInput(\"client_id\", \"client id\")}\n ${fieldInput(\"client_secret\", \"client secret\")}\n <button class=\"t-btn t-btn--accent\">Connect with OAuth ${ARROW}</button>\n </form>\n </div>\n </div>`;\n return shell({\n title: `OAuth app for ${o.provider}`,\n host: o.host,\n chip: { dot: \"warning\", label: \"setup needed\" },\n headline: \"One app to register.\",\n lead: `This instance has no OAuth app for <code class=\"t-code\">${esc(o.provider)}</code> yet. Create one in the provider's developer console with the callback URL below, then continue to consent.`,\n body,\n securityNote: true,\n });\n}\n\nexport function messagePage(o: {\n host: string;\n title: string;\n chip: NonNullable<ShellOptions[\"chip\"]>;\n headline: string;\n lead: string;\n pre?: string;\n}): string {\n return shell({\n title: o.title,\n host: o.host,\n chip: o.chip,\n headline: o.headline,\n lead: o.lead,\n body: o.pre ? `<pre class=\"t-pre t-gap-top-24\">${esc(o.pre)}</pre>` : \"\",\n });\n}\n", "// Inbound trigger ingress. Generic webhooks: stable route per project+automation, latest\n// alias resolved at receive time (ADR-0013 spirit), version-pinned via @v. Connector\n// webhooks land on /ingress/c/:token and are demuxed by the trigger layer. Git pushes\n// land on /hooks/git/\u2026 and enqueue a reconcile.\n\nimport { createHmac, timingSafeEqual } from \"node:crypto\";\nimport { Hono } from \"hono\";\nimport type { Db } from \"../db/db.js\";\nimport type { Broker } from \"../broker/broker.js\";\nimport { createRun } from \"../engine/runs.js\";\nimport { enqueue } from \"../queue/queue.js\";\n\nexport interface IngressDeps {\n db: Db;\n broker: Broker;\n /** Connector-trigger demux (trigger layer); 404 until a registration exists. */\n connectorIngress?: (\n ingressToken: string,\n req: { headers: Record<string, string>; query: Record<string, string>; rawBody: Uint8Array },\n ) => Promise<{ status: number; body: string; contentType?: string }>;\n}\n\nfunction headersToRecord(h: Headers): Record<string, string> {\n const out: Record<string, string> = {};\n h.forEach((v, k) => {\n out[k.toLowerCase()] = v;\n });\n return out;\n}\n\nfunction safeEqualString(a: string, b: string): boolean {\n const ab = Buffer.from(a);\n const bb = Buffer.from(b);\n return ab.length === bb.length && timingSafeEqual(ab, bb);\n}\n\nfunction verifyGitWebhookSignature(headers: Headers, rawBody: Uint8Array, secret: string): boolean {\n const expected = createHmac(\"sha256\", secret).update(rawBody).digest(\"hex\");\n const github = headers.get(\"x-hub-signature-256\");\n if (github?.startsWith(\"sha256=\") && safeEqualString(github.slice(\"sha256=\".length), expected)) return true;\n const tesser = headers.get(\"x-tesser-signature\");\n if (tesser?.startsWith(\"sha256=\") && safeEqualString(tesser.slice(\"sha256=\".length), expected)) return true;\n return false;\n}\n\nexport function createIngress(deps: IngressDeps): Hono {\n const app = new Hono();\n\n // Generic inbound webhook trigger (onWebhook). Public by design: verification is the\n // author's contract via ctx.request + a signing secret (ADR-0010 escape hatch).\n app.post(\"/hooks/:project/:automation{[a-z0-9-]+(@v[0-9]+)?}\", async (c) => {\n const projectName = c.req.param(\"project\");\n const autoParam = c.req.param(\"automation\");\n const pinMatch = /^(?<id>[a-z0-9-]+?)(?:@v(?<v>\\d+))?$/.exec(autoParam);\n const automationId = pinMatch?.groups?.[\"id\"] ?? autoParam;\n const pinned = pinMatch?.groups?.[\"v\"];\n\n const { rows: projects } = await deps.db.query<{ id: string }>(\n `SELECT id FROM projects WHERE name=$1`,\n [projectName],\n );\n const project = projects[0];\n if (!project) return c.json({ error: { code: \"not-found\", message: \"unknown project\" } }, 404);\n\n let versionId: string | undefined;\n let manifest: { trigger?: { kind?: string; respond?: string } } = {};\n if (pinned !== undefined) {\n const { rows } = await deps.db.query<{ id: string; manifest: typeof manifest }>(\n `SELECT id, manifest FROM automation_versions WHERE project_id=$1 AND automation_id=$2 AND version=$3`,\n [project.id, automationId, Number(pinned)],\n );\n versionId = rows[0]?.id;\n manifest = rows[0]?.manifest ?? {};\n } else {\n const { rows } = await deps.db.query<{ version_id: string; manifest: typeof manifest }>(\n `SELECT a.version_id, v.manifest FROM aliases a JOIN automation_versions v ON v.id=a.version_id\n WHERE a.project_id=$1 AND a.automation_id=$2 AND a.env='production'`,\n [project.id, automationId],\n );\n versionId = rows[0]?.version_id;\n manifest = rows[0]?.manifest ?? {};\n }\n if (!versionId) return c.json({ error: { code: \"not-found\", message: \"automation not deployed\" } }, 404);\n if (manifest.trigger?.kind !== undefined && manifest.trigger.kind !== \"webhook\") {\n return c.json({ error: { code: \"wrong-trigger\", message: \"automation is not webhook-triggered\" } }, 404);\n }\n\n const rawBody = new Uint8Array(await c.req.arrayBuffer());\n let input: unknown;\n const text = new TextDecoder().decode(rawBody);\n try {\n input = text.length > 0 ? JSON.parse(text) : undefined;\n } catch {\n input = undefined; // non-JSON bodies stay reachable via ctx.request.rawBody\n }\n const query: Record<string, string> = {};\n for (const [k, v] of new URL(c.req.url).searchParams) query[k] = v;\n\n const runId = await createRun(deps.db, {\n projectId: project.id,\n automationId,\n versionId,\n trigger: {\n kind: \"webhook\",\n request: {\n headers: headersToRecord(c.req.raw.headers),\n query,\n rawBodyB64: Buffer.from(rawBody).toString(\"base64\"),\n },\n },\n ...(input !== undefined ? { input } : {}),\n });\n\n if (manifest.trigger?.respond === \"sync\") {\n const deadline = Date.now() + 30_000;\n while (Date.now() < deadline) {\n const { rows } = await deps.db.query<{ status: string; output: unknown; error: unknown }>(\n `SELECT status, output, error FROM runs WHERE id=$1`,\n [runId!],\n );\n const run = rows[0]!;\n if (run.status === \"completed\") return c.json({ runId, output: run.output });\n if (run.status === \"failed\" || run.status === \"cancelled\") {\n return c.json({ runId, error: run.error }, 502);\n }\n await new Promise((r) => setTimeout(r, 200));\n }\n }\n return c.json({ runId }, 202);\n });\n\n // Connector-trigger ingress (ADR-0013): stable per-registration URL.\n app.post(\"/ingress/c/:token\", async (c) => {\n if (!deps.connectorIngress) {\n return c.json({ error: { code: \"not-ready\", message: \"trigger ingress not configured\" } }, 503);\n }\n const rawBody = new Uint8Array(await c.req.arrayBuffer());\n const query: Record<string, string> = {};\n for (const [k, v] of new URL(c.req.url).searchParams) query[k] = v;\n const result = await deps.connectorIngress(c.req.param(\"token\"), {\n headers: headersToRecord(c.req.raw.headers),\n query,\n rawBody,\n });\n return c.newResponse(result.body, result.status as never, {\n \"content-type\": result.contentType ?? \"application/json\",\n });\n });\n\n // Git push webhook (ADR-0006 default sync path) \u2014 project id in path, HMAC over the\n // raw body with encrypted per-Project signing material. The secret never appears in\n // CLI/API JSON or URL paths.\n const enqueueReconcile = async (projectId: string): Promise<void> => {\n await deps.db.tx((t) =>\n enqueue(t, {\n kind: \"reconcile\",\n payload: { projectId },\n dedupeKey: `reconcile:${projectId}:default`,\n maxAttempts: 1,\n }),\n );\n };\n\n app.post(\"/hooks/git/:projectId/push\", async (c) => {\n const { rows } = await deps.db.query<{\n id: string;\n workspace_id: string;\n push_webhook_secret_cipher: string | null;\n }>(`SELECT id, workspace_id, push_webhook_secret_cipher FROM projects WHERE id=$1`, [c.req.param(\"projectId\")]);\n const project = rows[0];\n if (!project?.push_webhook_secret_cipher) {\n return c.json({ error: { code: \"not-found\", message: \"unknown hook\" } }, 404);\n }\n const rawBody = new Uint8Array(await c.req.arrayBuffer());\n const secret = await deps.broker.decryptValue(\n project.workspace_id,\n project.push_webhook_secret_cipher,\n \"project.webhook.signing\",\n );\n if (!verifyGitWebhookSignature(c.req.raw.headers, rawBody, secret)) {\n return c.json({ error: { code: \"unauthorized\", message: \"invalid hook signature\" } }, 401);\n }\n await enqueueReconcile(project.id);\n return c.json({ queued: true }, 202);\n });\n\n // Legacy v0 bootstrap route. Kept so Instances upgraded from the path-token webhook\n // can keep receiving pushes until the self-host administrator re-runs `tesser link`\n // and moves the git host to the HMAC `/push` route.\n app.post(\"/hooks/git/:projectId/:secret\", async (c) => {\n const { rows } = await deps.db.query<{ id: string; push_webhook_secret: string | null }>(\n `SELECT id, push_webhook_secret FROM projects WHERE id=$1`,\n [c.req.param(\"projectId\")],\n );\n const project = rows[0];\n if (!project?.push_webhook_secret || !safeEqualString(project.push_webhook_secret, c.req.param(\"secret\"))) {\n return c.json({ error: { code: \"not-found\", message: \"unknown hook\" } }, 404);\n }\n await enqueueReconcile(project.id);\n return c.json({ queued: true }, 202);\n });\n\n return app;\n}\n", "// The worker loop: long-poll claim \u2192 dispatch by job kind \u2192 complete/fail. Leases are\n// heartbeat-extended; a crashed worker's jobs are reclaimed on lease expiry (the\n// journal-of-results executor makes re-execution safe).\n\nimport type { Db } from \"../db/db.js\";\nimport { claim, complete, fail, heartbeat, type ClaimedJob } from \"./queue.js\";\n\nexport type JobHandler = (job: ClaimedJob) => Promise<void>;\n\nexport interface WorkerOpts {\n tags?: string[] | undefined;\n /** Job kinds this worker duty is allowed to claim. Omitted means all kinds. */\n kinds?: string[] | undefined;\n pollIntervalMs?: number;\n onError?: (err: unknown, job?: ClaimedJob) => void;\n}\n\nexport class Worker {\n private running = false;\n private loopPromise: Promise<void> | null = null;\n\n constructor(\n private readonly db: Db,\n private readonly handlers: Record<string, JobHandler>,\n private readonly opts: WorkerOpts = {},\n ) {}\n\n start(): void {\n if (this.running) return;\n this.running = true;\n this.loopPromise = this.loop();\n }\n\n async stop(): Promise<void> {\n this.running = false;\n await this.loopPromise;\n }\n\n /** Process every due job right now (test + reconcile-now convenience). */\n async drain(maxJobs = 1000): Promise<number> {\n let n = 0;\n while (n < maxJobs) {\n const job = await claim(this.db, this.opts.tags, this.opts.kinds);\n if (!job) break;\n await this.dispatch(job);\n n++;\n }\n return n;\n }\n\n private async loop(): Promise<void> {\n const pollMs = this.opts.pollIntervalMs ?? 250;\n while (this.running) {\n let job: ClaimedJob | null = null;\n try {\n job = await claim(this.db, this.opts.tags, this.opts.kinds);\n } catch (err) {\n this.opts.onError?.(err);\n }\n if (!job) {\n await new Promise((r) => setTimeout(r, pollMs));\n continue;\n }\n await this.dispatch(job);\n }\n }\n\n private async dispatch(job: ClaimedJob): Promise<void> {\n const handler = this.handlers[job.kind];\n const beat = setInterval(() => {\n void heartbeat(this.db, job.id).catch(() => {});\n }, 20_000);\n beat.unref?.();\n try {\n if (!handler) throw new Error(`no handler for job kind \"${job.kind}\"`);\n await handler(job);\n await complete(this.db, job.id);\n } catch (err) {\n this.opts.onError?.(err, job);\n await fail(this.db, job, (err as Error)?.stack ?? String(err)).catch(() => {});\n } finally {\n clearInterval(beat);\n }\n }\n}\n", "// Cron scheduler: schedules are synced from manifests on promote; a tick fires due ones\n// by creating runs (overlap policy is the automation's own `concurrency` \u2014 the engine\n// gates it). Cron parsing/tz via an internal dependency, never in the public surface.\n\nimport { Cron } from \"croner\";\nimport type { Db } from \"../db/db.js\";\nimport { createRun } from \"../engine/runs.js\";\n\nexport interface ScheduleSpec {\n automationId: string;\n cron: string;\n tz?: string | undefined;\n}\n\nexport function nextFire(cron: string, tz: string | undefined, after = new Date()): Date | null {\n const c = new Cron(cron, { timezone: tz ?? \"UTC\" });\n return c.nextRun(after);\n}\n\n/** Reconcile a project+env's schedules to exactly `specs` (called on promote). */\nexport async function syncSchedules(\n db: Db,\n projectId: string,\n env: string,\n specs: ScheduleSpec[],\n): Promise<void> {\n await db.tx(async (c) => {\n const ids = specs.map((s) => s.automationId);\n if (ids.length === 0) {\n await c.query(`DELETE FROM schedules WHERE project_id=$1 AND env=$2`, [projectId, env]);\n return;\n }\n await c.query(\n `DELETE FROM schedules WHERE project_id=$1 AND env=$2 AND NOT (automation_id = ANY($3))`,\n [projectId, env, ids],\n );\n for (const spec of specs) {\n const fire = nextFire(spec.cron, spec.tz);\n await c.query(\n `INSERT INTO schedules (project_id, automation_id, env, cron, tz, enabled, next_fire)\n VALUES ($1,$2,$3,$4,$5,true,$6)\n ON CONFLICT (project_id, automation_id, env) DO UPDATE\n SET cron = EXCLUDED.cron,\n tz = EXCLUDED.tz,\n enabled = true,\n -- recompute only when the cron/tz changed; otherwise keep the watermark\n next_fire = CASE\n WHEN schedules.cron <> EXCLUDED.cron OR schedules.tz IS DISTINCT FROM EXCLUDED.tz\n THEN EXCLUDED.next_fire\n ELSE schedules.next_fire\n END`,\n [projectId, spec.automationId, env, spec.cron, spec.tz ?? null, fire?.toISOString() ?? null],\n );\n }\n });\n}\n\n/** Fire everything due. Returns created run ids. Safe under concurrent tickers\n * (FOR UPDATE SKIP LOCKED on the schedule rows). */\nexport async function schedulerTick(db: Db, now = new Date()): Promise<string[]> {\n const created: string[] = [];\n // Claim due schedules one at a time \u2014 each fire commits independently.\n for (;;) {\n const fired = await db.tx(async (c) => {\n const { rows } = await c.query<{\n project_id: string;\n automation_id: string;\n env: string;\n cron: string;\n tz: string | null;\n next_fire: string;\n }>(\n `SELECT project_id, automation_id, env, cron, tz, next_fire FROM schedules\n WHERE enabled AND next_fire IS NOT NULL AND next_fire <= $1\n FOR UPDATE SKIP LOCKED LIMIT 1`,\n [now.toISOString()],\n );\n const due = rows[0];\n if (!due) return null;\n\n const next = nextFire(due.cron, due.tz ?? undefined, now);\n await c.query(\n `UPDATE schedules SET next_fire=$4 WHERE project_id=$1 AND automation_id=$2 AND env=$3`,\n [due.project_id, due.automation_id, due.env, next?.toISOString() ?? null],\n );\n\n const alias = await c.query<{ version_id: string }>(\n `SELECT version_id FROM aliases WHERE project_id=$1 AND automation_id=$2 AND env=$3`,\n [due.project_id, due.automation_id, due.env],\n );\n const versionId = alias.rows[0]?.version_id;\n if (!versionId) return \"no-alias\";\n\n const runId = await createRun(c, {\n projectId: due.project_id,\n automationId: due.automation_id,\n versionId,\n env: due.env,\n trigger: { kind: \"schedule\", cron: due.cron, scheduledFor: due.next_fire },\n });\n return runId;\n });\n if (fired === null) break;\n if (typeof fired === \"string\" && fired !== \"no-alias\") created.push(fired);\n }\n return created;\n}\n\nexport function startScheduler(db: Db, opts: { intervalMs?: number; onError?: (e: unknown) => void } = {}): () => void {\n const interval = setInterval(() => {\n schedulerTick(db).catch((e) => opts.onError?.(e));\n }, opts.intervalMs ?? 5_000);\n interval.unref?.();\n return () => clearInterval(interval);\n}\n", "// Dead-work reaper: repairs queue/run states that cannot make progress, while leaving\n// intentionally suspended runs alone (Signal waits, wake times, durable waits).\n\nimport type { Db } from \"../db/db.js\";\n\nexport interface DeadWorkRecoveryOpts {\n now?: Date | undefined;\n /** How old a queued/running run must be before missing run jobs are repaired. */\n leaseGraceMs?: number | undefined;\n}\n\nexport interface DeadWorkRecoveryReport {\n deadRunJobsFailed: number;\n orphanedRunsReenqueued: number;\n}\n\nconst DEFAULT_LEASE_GRACE_MS = 2 * 60 * 1000;\nconst DEFAULT_REAPER_INTERVAL_MS = 30_000;\n\nexport async function recoverDeadWork(db: Db, opts: DeadWorkRecoveryOpts = {}): Promise<DeadWorkRecoveryReport> {\n const now = opts.now ?? new Date();\n const staleBefore = new Date(now.getTime() - (opts.leaseGraceMs ?? DEFAULT_LEASE_GRACE_MS));\n\n const failed = await db.query(\n `WITH dead_run_jobs AS (\n SELECT q.id, q.kind, q.payload->>'runId' AS run_id, q.last_error\n FROM queue_jobs q\n JOIN runs r ON r.id::text = q.payload->>'runId'\n WHERE q.kind = 'run'\n AND q.status = 'dead'\n AND r.status IN ('queued','running')\n )\n UPDATE runs r\n SET status = 'failed',\n error = jsonb_build_object(\n 'name', 'DeadRunJob',\n 'code', 'dead_run_job',\n 'message', 'run job attempts exhausted',\n 'jobId', dead_run_jobs.id::text,\n 'jobKind', dead_run_jobs.kind,\n 'lastError', dead_run_jobs.last_error\n ),\n finished_at = $1\n FROM dead_run_jobs\n WHERE r.id::text = dead_run_jobs.run_id`,\n [now.toISOString()],\n );\n\n const reenqueue = await db.query<{ count: string }>(\n `WITH stale_runs AS (\n SELECT r.id\n FROM runs r\n WHERE r.status IN ('queued','running')\n AND COALESCE(r.started_at, r.created_at) <= $1\n AND NOT EXISTS (\n SELECT 1 FROM queue_jobs q\n WHERE q.kind = 'run'\n AND q.payload->>'runId' = r.id::text\n AND q.status = 'ready'\n )\n AND NOT EXISTS (\n SELECT 1 FROM queue_jobs q\n WHERE q.kind = 'run'\n AND q.payload->>'runId' = r.id::text\n AND q.status = 'dead'\n )\n ), inserted AS (\n INSERT INTO queue_jobs (kind, payload, dedupe_key, run_at)\n SELECT 'run', jsonb_build_object('runId', id::text), 'run:' || id::text, $2\n FROM stale_runs\n ON CONFLICT (dedupe_key) WHERE dedupe_key IS NOT NULL DO UPDATE\n SET run_at = LEAST(queue_jobs.run_at, EXCLUDED.run_at),\n status = 'ready',\n payload = EXCLUDED.payload\n RETURNING 1\n )\n SELECT count(*)::text AS count FROM inserted`,\n [staleBefore.toISOString(), now.toISOString()],\n );\n\n return {\n deadRunJobsFailed: failed.rowCount,\n orphanedRunsReenqueued: Number(reenqueue.rows[0]?.count ?? 0),\n };\n}\n\nexport function startReaper(\n db: Db,\n opts: { intervalMs?: number | undefined; leaseGraceMs?: number | undefined; onError?: (e: unknown) => void } = {},\n): () => void {\n let inFlight = false;\n const tick = () => {\n if (inFlight) return;\n inFlight = true;\n void recoverDeadWork(db, { leaseGraceMs: opts.leaseGraceMs })\n .catch((e) => opts.onError?.(e))\n .finally(() => {\n inFlight = false;\n });\n };\n const interval = setInterval(tick, opts.intervalMs ?? DEFAULT_REAPER_INTERVAL_MS);\n interval.unref?.();\n tick();\n return () => clearInterval(interval);\n}\n", "// Artifact loader: versionId \u2192 the automation def from its immutable bundle. Bundles are\n// content-addressed and immutable, so the cache never invalidates. Test seam included.\n\nimport { pathToFileURL } from \"node:url\";\nimport type { AutomationDef } from \"@devosurf/tesser-sdk\";\nimport type { Db } from \"../db/db.js\";\n\nexport class ArtifactLoader {\n private cache = new Map<string, Promise<AutomationDef<any, any, any, any, any, any, any>>>();\n private injected = new Map<string, AutomationDef<any, any, any, any, any, any, any>>();\n\n constructor(private readonly db: Db) {}\n\n /** Tests (and the reconciler, right after extraction) hand defs over directly. */\n inject(versionId: string, def: AutomationDef<any, any, any, any, any, any, any>): void {\n this.injected.set(versionId, def);\n }\n\n load = async (versionId: string): Promise<AutomationDef<any, any, any, any, any, any, any>> => {\n const injected = this.injected.get(versionId);\n if (injected) return injected;\n let p = this.cache.get(versionId);\n if (!p) {\n p = (async () => {\n const { rows } = await this.db.query<{ bundle_path: string }>(\n `SELECT bundle_path FROM automation_versions WHERE id=$1`,\n [versionId],\n );\n if (!rows[0]) throw new Error(`no automation version ${versionId}`);\n const mod = (await import(pathToFileURL(rows[0].bundle_path).href)) as {\n default?: AutomationDef<any, any, any, any, any, any, any>;\n };\n if (!mod.default) throw new Error(`bundle missing default export: ${rows[0].bundle_path}`);\n return mod.default;\n })();\n this.cache.set(versionId, p);\n p.catch(() => this.cache.delete(versionId));\n }\n return p;\n };\n}\n", "// Connector-webhook ingress demux (ADR-0013): verify by the connector's declared scheme,\n// answer endpoint challenges, identify the event, dedup by delivery id, fan out across\n// every registration sharing the connector+connection (app-level URLs like Slack's serve\n// several triggers), map \u2192 typed payload \u2192 one durable run each.\n\nimport type { InboundWebhookEvent } from \"@devosurf/tesser-sdk/connector\";\nimport { validateSchema, verifyInboundEvent } from \"@devosurf/tesser-sdk/internal\";\nimport { createHash } from \"node:crypto\";\nimport { createRun } from \"../engine/runs.js\";\nimport {\n isWebhookDecl,\n loadTriggerState,\n pruneSeen,\n resolveLiveTrigger,\n saveTriggerState,\n type TriggerLayerDeps,\n} from \"./shared.js\";\n\ninterface IngressResult {\n status: number;\n body: string;\n contentType?: string;\n}\n\nconst json = (status: number, body: unknown): IngressResult => ({ status, body: JSON.stringify(body) });\n\nexport function createConnectorIngress(deps: TriggerLayerDeps) {\n return async function connectorIngress(\n ingressToken: string,\n req: { headers: Record<string, string>; query: Record<string, string>; rawBody: Uint8Array },\n ): Promise<IngressResult> {\n const { rows } = await deps.db.query<{\n id: string;\n project_id: string;\n automation_id: string;\n trigger_id: string;\n connector_id: string;\n connection_id: string;\n env: string;\n status: string;\n signing_secret_cipher: string | null;\n }>(`SELECT * FROM webhook_registrations WHERE ingress_token=$1`, [ingressToken]);\n const reg = rows[0];\n if (!reg || ![\"registered\", \"manual-pending\"].includes(reg.status)) {\n return json(404, { error: \"unknown ingress\" });\n }\n\n const resolved = await resolveLiveTrigger(deps, reg.project_id, reg.automation_id, reg.env).catch(() => null);\n if (!resolved || !isWebhookDecl(resolved.decl)) return json(404, { error: \"trigger not live\" });\n const webhook = resolved.connector.__connector.webhook;\n if (!webhook) return json(500, { error: \"connector has no webhook config\" });\n\n let body: unknown;\n try {\n body = JSON.parse(new TextDecoder().decode(req.rawBody));\n } catch {\n body = undefined;\n }\n const event: InboundWebhookEvent = { headers: req.headers, query: req.query, rawBody: req.rawBody, json: body };\n\n // Endpoint verification handshakes (Slack url_verification) answer BEFORE signature\n // checks \u2014 Slack signs them, but a manual-pending registration has no secret yet.\n const challenge = webhook.challenge?.(event);\n if (challenge !== null && challenge !== undefined) {\n return { status: 200, body: challenge, contentType: \"text/plain\" };\n }\n\n if (reg.status !== \"registered\" || reg.signing_secret_cipher === null) {\n return json(409, { error: \"registration incomplete \u2014 signing secret not configured\" });\n }\n const { rows: wsRows } = await deps.db.query<{ workspace_id: string }>(\n `SELECT workspace_id FROM projects WHERE id=$1`,\n [reg.project_id],\n );\n const secret = await deps.broker.decryptValue(wsRows[0]!.workspace_id, reg.signing_secret_cipher, \"webhook.signing\");\n if (!(await verifyInboundEvent(webhook.verify, event, secret))) {\n return json(401, { error: \"signature verification failed\" });\n }\n\n const identified = webhook.identify(event);\n if (!identified) return json(400, { error: \"unrecognized event\" });\n const deliveryId =\n identified.deliveryId ?? createHash(\"sha256\").update(req.rawBody).digest(\"hex\").slice(0, 24);\n\n // Fan out across all live registrations sharing connector+connection (one app-level\n // URL can serve several triggers) \u2014 the receiving registration's siblings included.\n const { rows: siblings } = await deps.db.query<{\n id: string;\n automation_id: string;\n trigger_id: string;\n connection_id: string;\n status: string;\n }>(\n `SELECT id, automation_id, trigger_id, connection_id, status FROM webhook_registrations\n WHERE project_id=$1 AND env=$2 AND connector_id=$3 AND connection_id=$4 AND status='registered'`,\n [reg.project_id, reg.env, reg.connector_id, reg.connection_id],\n );\n\n let fired = 0;\n for (const sib of siblings) {\n const sibResolved =\n sib.id === reg.id\n ? resolved\n : await resolveLiveTrigger(deps, reg.project_id, sib.automation_id, reg.env).catch(() => null);\n if (!sibResolved || !isWebhookDecl(sibResolved.decl)) continue;\n if (sibResolved.decl.event !== identified.event) continue;\n\n const stateKey = {\n projectId: reg.project_id,\n automationId: sib.automation_id,\n triggerId: sib.trigger_id,\n connectionId: sib.connection_id,\n };\n const state = await loadTriggerState(deps.db, stateKey, \"webhook\");\n const seen = new Map(pruneSeen(state.seen, Date.now()));\n if (seen.has(deliveryId)) continue; // provider redelivery \u2192 drop\n\n const mapped = await sibResolved.decl.map(identified.payload ?? body, sibResolved.params);\n if (mapped === null) {\n seen.set(deliveryId, Date.now());\n await saveTriggerState(deps.db, stateKey, { seen: [...seen.entries()], seeded: true });\n continue;\n }\n const validated = await validateSchema(\n sibResolved.decl.output,\n mapped,\n `${reg.connector_id}.triggers.${sib.trigger_id} payload`,\n );\n await createRun(deps.db, {\n projectId: reg.project_id,\n automationId: sib.automation_id,\n versionId: sibResolved.versionId,\n env: reg.env,\n trigger: {\n kind: \"connector\",\n connector: reg.connector_id,\n trigger: sib.trigger_id,\n strategy: \"webhook\",\n deliveryId,\n event: identified.event,\n connectionId: sib.connection_id,\n ...(sibResolved.connection.end_user_id !== null\n ? { endUserId: sibResolved.connection.end_user_id }\n : {}),\n },\n input: validated,\n });\n seen.set(deliveryId, Date.now());\n await saveTriggerState(deps.db, stateKey, { seen: [...seen.entries()], seeded: true, touch: \"delivery\" });\n fired++;\n }\n return json(202, { ok: true, fired });\n };\n}\n", "// Shared plumbing for the connector-trigger layer (ADR-0013): resolve a live automation\n// version to its def + connector instance + trigger declaration, and manage the\n// version-independent trigger state (windowed seen-set keyed by automation+trigger+connection).\n\nimport { TerminalError, type AutomationDef } from \"@devosurf/tesser-sdk\";\nimport type {\n AnyTriggerDecl,\n ConnectorInstance,\n PollTriggerDecl,\n WebhookTriggerDecl,\n} from \"@devosurf/tesser-sdk/connector\";\nimport { decodeJournal, validateSchema, type JsonValue } from \"@devosurf/tesser-sdk/internal\";\nimport type { Db } from \"../db/db.js\";\nimport type { Broker, ConnectionRow } from \"../broker/broker.js\";\n\nexport interface TriggerLayerDeps {\n db: Db;\n broker: Broker;\n baseUrl: string;\n loadAutomation(versionId: string): Promise<AutomationDef<any, any, any, any, any, any, any>>;\n fetchImpl?: typeof fetch | undefined;\n}\n\nexport interface ConnectorTriggerManifest {\n kind: \"connector\";\n connector: string;\n trigger: string;\n params: JsonValue;\n connection: string;\n every?: string;\n}\n\nexport interface ResolvedTrigger {\n projectId: string;\n workspaceId: string;\n automationId: string;\n env: string;\n versionId: string;\n def: AutomationDef<any, any, any, any, any, any, any>;\n manifest: ConnectorTriggerManifest;\n connector: ConnectorInstance<any, any>;\n decl: AnyTriggerDecl;\n /** Validated trigger params (decl.input). */\n params: unknown;\n connection: ConnectionRow;\n}\n\nexport function isPollDecl(d: AnyTriggerDecl): d is PollTriggerDecl<any, any, any> {\n return d.__trigger === \"poll\";\n}\nexport function isWebhookDecl(d: AnyTriggerDecl): d is WebhookTriggerDecl<any, any> {\n return d.__trigger === \"webhook\";\n}\n\n/** Resolve everything a poll/delivery needs from the CURRENT live alias \u2014 the stable\n * registration outlives versions; the version is resolved at fire time (ADR-0013). */\nexport async function resolveLiveTrigger(\n deps: TriggerLayerDeps,\n projectId: string,\n automationId: string,\n env: string,\n): Promise<ResolvedTrigger | null> {\n const { rows } = await deps.db.query<{\n version_id: string;\n manifest: { trigger?: ConnectorTriggerManifest };\n workspace_id: string;\n }>(\n `SELECT a.version_id, v.manifest, p.workspace_id\n FROM aliases a\n JOIN automation_versions v ON v.id = a.version_id\n JOIN projects p ON p.id = a.project_id\n WHERE a.project_id=$1 AND a.automation_id=$2 AND a.env=$3`,\n [projectId, automationId, env],\n );\n const row = rows[0];\n if (!row || row.manifest.trigger?.kind !== \"connector\") return null;\n const manifest = row.manifest.trigger;\n\n const def = await deps.loadAutomation(row.version_id);\n const connector = (def.connections as Record<string, ConnectorInstance<any, any>> | undefined)?.[\n manifest.connection\n ];\n if (!connector || connector.id !== manifest.connector) {\n throw new TerminalError(\n `automation ${automationId}: trigger connection \"${manifest.connection}\" missing from the loaded bundle`,\n );\n }\n const decl = connector.__connector.triggers?.[manifest.trigger];\n if (!decl) {\n throw new TerminalError(`connector ${manifest.connector} has no trigger \"${manifest.trigger}\"`);\n }\n\n const conn = await deps.broker.resolveBinding({\n workspaceId: row.workspace_id,\n projectId,\n automationId,\n env,\n reqKey: manifest.connection,\n connectorId: manifest.connector,\n scope: connector.scope ?? \"workspace\",\n });\n if (!conn) return null; // connection went away \u2192 trigger dormant until reconnected\n\n const params = await validateSchema(\n decl.input,\n decodeJournal(manifest.params),\n `${manifest.connector}.triggers.${manifest.trigger} params`,\n );\n\n return {\n projectId,\n workspaceId: row.workspace_id,\n automationId,\n env,\n versionId: row.version_id,\n def,\n manifest,\n connector,\n decl,\n params,\n connection: conn,\n };\n}\n\n// ---- windowed seen-set (version-independent dedup, ADR-0013) ----\n\nconst SEEN_WINDOW_MS = 14 * 24 * 3600 * 1000;\nconst SEEN_MAX = 2000;\n\nexport interface TriggerState {\n seen: Array<[string, number]>;\n cursor: JsonValue | null;\n seeded: boolean;\n}\n\nexport async function loadTriggerState(\n db: Db,\n key: { projectId: string; automationId: string; triggerId: string; connectionId: string },\n kind: \"poll\" | \"webhook\",\n): Promise<TriggerState> {\n const { rows } = await db.query<{ seen: Array<[string, number]>; cursor: JsonValue | null; seeded: boolean }>(\n `SELECT seen, cursor, seeded FROM trigger_state\n WHERE project_id=$1 AND automation_id=$2 AND trigger_id=$3 AND connection_id=$4`,\n [key.projectId, key.automationId, key.triggerId, key.connectionId],\n );\n if (rows[0]) return rows[0];\n await db.query(\n `INSERT INTO trigger_state (project_id, automation_id, trigger_id, connection_id, kind)\n VALUES ($1,$2,$3,$4,$5) ON CONFLICT DO NOTHING`,\n [key.projectId, key.automationId, key.triggerId, key.connectionId, kind],\n );\n return { seen: [], cursor: null, seeded: false };\n}\n\nexport function pruneSeen(seen: Array<[string, number]>, nowMs: number): Array<[string, number]> {\n const cutoff = nowMs - SEEN_WINDOW_MS;\n const pruned = seen.filter(([, ts]) => ts >= cutoff);\n return pruned.length > SEEN_MAX ? pruned.slice(pruned.length - SEEN_MAX) : pruned;\n}\n\nexport async function saveTriggerState(\n db: Db,\n key: { projectId: string; automationId: string; triggerId: string; connectionId: string },\n state: { seen?: Array<[string, number]>; cursor?: JsonValue | null; seeded?: boolean; touch?: \"poll\" | \"delivery\" },\n): Promise<void> {\n const sets: string[] = [];\n const params: unknown[] = [key.projectId, key.automationId, key.triggerId, key.connectionId];\n if (state.seen !== undefined) {\n params.push(JSON.stringify(state.seen));\n sets.push(`seen = $${params.length}::jsonb`);\n }\n if (state.cursor !== undefined) {\n params.push(state.cursor === null ? null : JSON.stringify(state.cursor));\n sets.push(`cursor = $${params.length}::jsonb`);\n }\n if (state.seeded !== undefined) {\n params.push(state.seeded);\n sets.push(`seeded = $${params.length}`);\n }\n if (state.touch === \"poll\") sets.push(`last_poll_at = now()`);\n if (state.touch === \"delivery\") sets.push(`last_delivery_at = now()`);\n if (sets.length === 0) return;\n await db.query(\n `UPDATE trigger_state SET ${sets.join(\", \")}\n WHERE project_id=$1 AND automation_id=$2 AND trigger_id=$3 AND connection_id=$4`,\n params,\n );\n}\n", "// Poll-strategy connector triggers (ADR-0013): the runtime owns the loop \u2014 windowed\n// seen-set dedup by the author's dedupeKey, seed-without-firing on first activation,\n// one independent durable run per new item (oldest-first), opt-in cursor mode,\n// self-rescheduling with the author's `every` clamped to the connector floor + stagger.\n\nimport { encodeJournal, parseDuration, validateSchema, type JsonValue } from \"@devosurf/tesser-sdk/internal\";\nimport type { Db, DbClient } from \"../db/db.js\";\nimport { createRun } from \"../engine/runs.js\";\nimport { enqueue } from \"../queue/queue.js\";\nimport { authDeclFor, makeActionCtx, providerFactsOf } from \"../broker/connections.js\";\nimport {\n isPollDecl,\n loadTriggerState,\n pruneSeen,\n resolveLiveTrigger,\n saveTriggerState,\n type TriggerLayerDeps,\n} from \"./shared.js\";\n\nexport interface PollJobPayload {\n projectId: string;\n automationId: string;\n env: string;\n}\n\nexport function pollDedupeKey(p: PollJobPayload): string {\n return `trigger-poll:${p.projectId}:${p.automationId}:${p.env}`;\n}\n\nexport function pollIntervalMs(decl: { interval?: { default: string; floor?: string } }, every?: string): number {\n const defaultMs = parseDuration(decl.interval?.default ?? \"2m\", \"trigger interval\");\n const floorMs = parseDuration(decl.interval?.floor ?? \"30s\", \"trigger interval floor\");\n if (every === undefined) return Math.max(defaultMs, floorMs);\n return Math.max(parseDuration(every, \"trigger `every`\"), floorMs);\n}\n\nexport async function schedulePoll(\n client: DbClient,\n payload: PollJobPayload,\n delayMs: number,\n stagger = true,\n): Promise<void> {\n // Stagger \u00B110% so many triggers on one cadence don't thundering-herd a provider.\n const jitter = stagger ? delayMs * (Math.random() * 0.2 - 0.1) : 0;\n await enqueue(client, {\n kind: \"trigger-poll\",\n payload: payload as never,\n runAtMs: Date.now() + Math.max(1000, delayMs + jitter),\n dedupeKey: pollDedupeKey(payload),\n maxAttempts: 5,\n });\n}\n\n/** Execute one poll for one (automation, trigger, connection); reschedules itself. */\nexport async function runPoll(deps: TriggerLayerDeps, payload: PollJobPayload): Promise<{ fired: number } | null> {\n const resolved = await resolveLiveTrigger(deps, payload.projectId, payload.automationId, payload.env);\n if (!resolved) return null; // undeployed / connection missing \u2192 stop rescheduling\n const { decl, manifest } = resolved;\n if (!isPollDecl(decl)) return null;\n\n const reschedule = async (db: Db) => {\n await db.tx((c) => schedulePoll(c, payload, pollIntervalMs(decl, manifest.every)));\n };\n\n const stateKey = {\n projectId: payload.projectId,\n automationId: payload.automationId,\n triggerId: manifest.trigger,\n connectionId: resolved.connection.id,\n };\n\n try {\n const bundle = await deps.broker.freshCredential(\n resolved.connection.id,\n providerFactsOf(resolved.connector.__connector)?.oauth2,\n );\n const actx = makeActionCtx({\n spec: resolved.connector.__connector,\n decl: authDeclFor(resolved.connector.__connector, resolved.connection.auth_mode),\n conn: resolved.connection,\n facts: providerFactsOf(resolved.connector.__connector),\n fields: bundle.fields,\n broker: deps.broker,\n fetchImpl: deps.fetchImpl,\n });\n\n const state = await loadTriggerState(deps.db, stateKey, \"poll\");\n const polled = await decl.poll(actx, resolved.params, state.cursor ?? undefined);\n const items: unknown[] = Array.isArray(polled) ? polled : polled.items;\n const nextCursor = Array.isArray(polled) ? undefined : polled.nextCursor;\n\n const now = Date.now();\n const seen = new Map(pruneSeen(state.seen, now));\n let fired = 0;\n\n if (!state.seeded) {\n // First activation: seed without firing \u2014 turning a trigger on never floods (ADR-0013).\n for (const item of items) seen.set(decl.dedupeKey(item), now);\n } else {\n const fresh = items.filter((item) => !seen.has(decl.dedupeKey(item)));\n // Fire oldest-first regardless of the provider's natural order.\n const ordered = (decl.order ?? \"newest-first\") === \"newest-first\" ? [...fresh].reverse() : fresh;\n for (const item of ordered) {\n const key = decl.dedupeKey(item);\n const mapped = decl.map ? await decl.map(item, resolved.params) : item;\n const validated = await validateSchema(\n decl.output,\n mapped,\n `${manifest.connector}.triggers.${manifest.trigger} payload`,\n );\n await createRun(deps.db, {\n projectId: payload.projectId,\n automationId: payload.automationId,\n versionId: resolved.versionId,\n env: payload.env,\n trigger: {\n kind: \"connector\",\n connector: manifest.connector,\n trigger: manifest.trigger,\n strategy: \"poll\",\n itemKey: key,\n connectionId: resolved.connection.id,\n ...(resolved.connection.end_user_id !== null ? { endUserId: resolved.connection.end_user_id } : {}),\n },\n input: validated,\n });\n seen.set(key, now);\n fired++;\n }\n }\n\n await saveTriggerState(deps.db, stateKey, {\n seen: [...seen.entries()],\n ...(nextCursor !== undefined ? { cursor: encodeJournal(nextCursor) as JsonValue } : {}),\n seeded: true,\n touch: \"poll\",\n });\n return { fired };\n } finally {\n await reschedule(deps.db);\n }\n}\n\n/** Activate polling for every live connector-poll trigger of a project+env (on promote). */\nexport async function activatePolls(\n deps: TriggerLayerDeps,\n projectId: string,\n env: string,\n): Promise<number> {\n if (env !== \"production\") return 0; // preview is trigger-inert (ADR-0013)\n const { rows } = await deps.db.query<{ automation_id: string; manifest: { trigger?: { kind?: string } } }>(\n `SELECT a.automation_id, v.manifest FROM aliases a JOIN automation_versions v ON v.id=a.version_id\n WHERE a.project_id=$1 AND a.env=$2`,\n [projectId, env],\n );\n let activated = 0;\n for (const row of rows) {\n if (row.manifest.trigger?.kind !== \"connector\") continue;\n const resolved = await resolveLiveTrigger(deps, projectId, row.automation_id, env).catch(() => null);\n if (!resolved || !isPollDecl(resolved.decl)) continue;\n await deps.db.tx((c) =>\n schedulePoll(c, { projectId, automationId: row.automation_id, env }, 1500, false),\n );\n activated++;\n }\n return activated;\n}\n", "// The reconciler (ADR-0006): git \u2192 instance, one-way. Clone/fetch the commit, content-\n// hash-diff each automation directory, build only the changed ones into immutable staged\n// versions, halt on missing credentials (connect link), gate on tests (auto smoke), and\n// only on green swap aliases \u2014 red leaves production untouched. Then wire schedules,\n// event subscriptions, webhook registrations, and polls. Undeployed automations are\n// unaliased and their provider hooks destroyed.\n\nimport { execFile } from \"node:child_process\";\nimport { mkdirSync, existsSync, rmSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { smokeTest } from \"@devosurf/tesser-testing\";\nimport type { Db } from \"../db/db.js\";\nimport type { Broker } from \"../broker/broker.js\";\nimport {\n computeMissingRequirements,\n mintConnectLink,\n type AutomationRequirementSource,\n type Requirement,\n} from \"../broker/connect.js\";\nimport { syncSchedules, type ScheduleSpec } from \"../scheduler/cron.js\";\nimport { syncSubscriptions } from \"../events/fanout.js\";\nimport { ensureRegistrations } from \"../triggers/registrar.js\";\nimport { activatePolls } from \"../triggers/poll.js\";\nimport type { TriggerLayerDeps } from \"../triggers/shared.js\";\nimport type { ArtifactLoader } from \"../registry/loader.js\";\nimport { buildAutomationBundle, discoverAutomations, extractBundle } from \"./build.js\";\n\nconst exec = promisify(execFile);\n\nexport interface ReconcilerDeps {\n db: Db;\n broker: Broker;\n loader: ArtifactLoader;\n dataDir: string;\n baseUrl: string;\n triggerDeps: TriggerLayerDeps;\n /** Run colocated project tests as the deploy gate (in addition to auto smoke). */\n runProjectTests?: boolean;\n}\n\nexport interface DeployReport {\n sha: string;\n ref: string;\n env: string;\n built: string[];\n unchanged: string[];\n failed: Array<{ automation: string; stage: \"build\" | \"test\"; reason: string }>;\n removed: string[];\n connectUrl?: string;\n requirements?: Requirement[];\n manual?: Array<{ automation: string; trigger: string }>;\n}\n\nasync function git(args: string[], cwd?: string, env?: Record<string, string>): Promise<string> {\n const { stdout } = await exec(\"git\", args, {\n ...(cwd !== undefined ? { cwd } : {}),\n env: { ...process.env, GIT_TERMINAL_PROMPT: \"0\", ...env },\n maxBuffer: 16 * 1024 * 1024,\n });\n return stdout.trim();\n}\n\nasync function syncWorkdir(opts: {\n dataDir: string;\n projectId: string;\n repoUrl: string;\n ref: string;\n sshKeyPath?: string | undefined;\n}): Promise<{ dir: string; sha: string }> {\n const dir = join(opts.dataDir, \"repos\", opts.projectId);\n const env: Record<string, string> = {};\n if (opts.sshKeyPath !== undefined) {\n env[\"GIT_SSH_COMMAND\"] = `ssh -i ${opts.sshKeyPath} -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new`;\n }\n const localRepoPath = localPathForGitSafeDirectory(opts.repoUrl);\n if (localRepoPath !== undefined) {\n const gitConfigDir = join(opts.dataDir, \"git-config\");\n mkdirSync(gitConfigDir, { recursive: true, mode: 0o700 });\n const gitConfigPath = join(gitConfigDir, `${opts.projectId}.gitconfig`);\n writeFileSync(gitConfigPath, `[safe]\\n\\tdirectory = ${localRepoPath}\\n`, { mode: 0o600 });\n env[\"GIT_CONFIG_GLOBAL\"] = gitConfigPath;\n }\n if (!existsSync(join(dir, \".git\"))) {\n rmSync(dir, { recursive: true, force: true });\n mkdirSync(dir, { recursive: true });\n await git([\"clone\", \"--no-single-branch\", opts.repoUrl, dir], undefined, env);\n } else {\n await git([\"fetch\", \"origin\", \"--prune\"], dir, env);\n }\n await git([\"checkout\", \"--force\", opts.ref], dir, env).catch(async () => {\n await git([\"checkout\", \"--force\", `origin/${opts.ref}`], dir, env);\n });\n // fast-forward to remote when the ref is a branch\n await git([\"reset\", \"--hard\", `origin/${opts.ref}`], dir, env).catch(() => {});\n const sha = await git([\"rev-parse\", \"HEAD\"], dir);\n return { dir, sha };\n}\n\nfunction localPathForGitSafeDirectory(repoUrl: string): string | undefined {\n if (repoUrl.startsWith(\"/\")) return repoUrl;\n if (repoUrl.startsWith(\"file://\")) {\n try {\n return new URL(repoUrl).pathname;\n } catch {\n return undefined;\n }\n }\n return undefined;\n}\n\nasync function installDeps(dir: string): Promise<void> {\n // Install only when a lockfile pins the dependency graph (reproducible builds,\n // ADR-0006). Lockfile-less trees resolve from their surroundings (dev/dogfood lane).\n const runner = existsSync(join(dir, \"pnpm-lock.yaml\"))\n ? [\"pnpm\", [\"install\", \"--ignore-scripts\", \"--prefer-offline\", \"--frozen-lockfile\"]]\n : existsSync(join(dir, \"package-lock.json\"))\n ? [\"npm\", [\"ci\", \"--ignore-scripts\", \"--no-audit\", \"--no-fund\"]]\n : null;\n if (!runner) return;\n await exec(runner[0] as string, runner[1] as string[], {\n cwd: dir,\n env: { ...process.env, CI: \"1\" },\n maxBuffer: 32 * 1024 * 1024,\n });\n}\n\nexport async function reconcileProject(\n deps: ReconcilerDeps,\n projectId: string,\n opts: { ref?: string | undefined; localPath?: string | undefined } = {},\n): Promise<DeployReport> {\n const { rows: projects } = await deps.db.query<{\n id: string;\n workspace_id: string;\n name: string;\n repo_url: string | null;\n prod_branch: string;\n deploy_key_private_cipher: string | null;\n }>(`SELECT * FROM projects WHERE id=$1`, [projectId]);\n const project = projects[0];\n if (!project) throw new Error(`no project ${projectId}`);\n\n await deps.db.query(\n `INSERT INTO repo_state (project_id, status) VALUES ($1,'syncing')\n ON CONFLICT (project_id) DO UPDATE SET status='syncing', error=NULL`,\n [projectId],\n );\n\n const finish = async (status: string, report: DeployReport): Promise<DeployReport> => {\n await deps.db.query(\n `UPDATE repo_state SET status=$2, report=$3::jsonb, last_sha=$4, branch=$5, last_synced_at=now() WHERE project_id=$1`,\n [projectId, status, JSON.stringify(report), report.sha, report.ref],\n );\n return report;\n };\n\n const ref = opts.ref ?? project.prod_branch;\n const env = ref === project.prod_branch ? \"production\" : `preview:${ref}`;\n const report: DeployReport = { sha: \"\", ref, env, built: [], unchanged: [], failed: [], removed: [] };\n\n try {\n // ---- 1. working copy at the requested ref ----\n let workdir: string;\n if (opts.localPath !== undefined) {\n workdir = opts.localPath; // tesser dev / tests: build straight from a local tree\n report.sha = await git([\"rev-parse\", \"HEAD\"], workdir).catch(() => \"local\");\n } else {\n const repoUrl = project.repo_url;\n if (!repoUrl) throw new Error(\"project has no repo_url and no localPath was given\");\n let sshKeyPath: string | undefined;\n if (project.deploy_key_private_cipher) {\n const key = await deps.broker.decryptValue(project.workspace_id, project.deploy_key_private_cipher, \"deploykey\");\n const keyDir = join(deps.dataDir, \"keys\");\n mkdirSync(keyDir, { recursive: true, mode: 0o700 });\n sshKeyPath = join(keyDir, `${projectId}.key`);\n writeFileSync(sshKeyPath, key + \"\\n\", { mode: 0o600 });\n }\n const synced = await syncWorkdir({ dataDir: deps.dataDir, projectId, repoUrl, ref, sshKeyPath });\n workdir = synced.dir;\n report.sha = synced.sha;\n }\n\n await installDeps(workdir);\n\n // ---- 2. discover + diff + build changed only ----\n const discovered = discoverAutomations(workdir);\n const sources: AutomationRequirementSource[] = [];\n const schedules: ScheduleSpec[] = [];\n const subscriptions: Array<{ eventName: string; automationId: string }> = [];\n const promote: Array<{ automationId: string; versionId: string }> = [];\n const connectorManifests: Record<string, never> = {};\n\n for (const auto of discovered) {\n const { rows: latest } = await deps.db.query<{\n id: string;\n version: number;\n content_hash: string;\n status: string;\n manifest: never;\n }>(\n `SELECT id, version, content_hash, status, manifest FROM automation_versions\n WHERE project_id=$1 AND automation_id=$2 ORDER BY version DESC LIMIT 1`,\n [projectId, auto.automationId],\n );\n\n let versionId: string;\n let manifest: import(\"./build.js\").ExtractedBundle[\"manifest\"];\n\n if (latest[0] && latest[0].content_hash === auto.contentHash && latest[0].status !== \"failed\") {\n versionId = latest[0].id;\n manifest = latest[0].manifest;\n report.unchanged.push(auto.automationId);\n } else {\n const version = (latest[0]?.version ?? 0) + 1;\n const bundlePath = join(\n deps.dataDir,\n \"artifacts\",\n projectId,\n auto.automationId,\n `v${version}`,\n \"bundle.mjs\",\n );\n try {\n await buildAutomationBundle(auto.entry, bundlePath);\n } catch (err) {\n report.failed.push({ automation: auto.automationId, stage: \"build\", reason: String(err).slice(0, 2000) });\n continue;\n }\n let extracted: import(\"./build.js\").ExtractedBundle;\n try {\n extracted = await extractBundle(bundlePath);\n if (extracted.manifest.id !== auto.automationId) {\n throw new Error(\n `automation id \"${extracted.manifest.id}\" must match its directory \"automations/${auto.automationId}\"`,\n );\n }\n } catch (err) {\n report.failed.push({ automation: auto.automationId, stage: \"build\", reason: String(err).slice(0, 2000) });\n continue;\n }\n manifest = extracted.manifest;\n\n // ---- 3. test gate (ADR-0008): auto smoke against the REAL bundle ----\n const smoke = await smokeTest(extracted.def);\n const { rows: inserted } = await deps.db.query<{ id: string }>(\n `INSERT INTO automation_versions\n (project_id, automation_id, version, content_hash, bundle_path, manifest, git_sha, branch, status, test_report)\n VALUES ($1,$2,$3,$4,$5,$6::jsonb,$7,$8,$9,$10::jsonb)\n RETURNING id`,\n [\n projectId,\n auto.automationId,\n version,\n auto.contentHash,\n bundlePath,\n JSON.stringify(manifest),\n report.sha,\n ref,\n smoke.passed ? \"staged\" : \"failed\",\n JSON.stringify({\n smoke: { passed: smoke.passed, ...(smoke.reason !== undefined ? { reason: smoke.reason } : {}) },\n }),\n ],\n );\n versionId = inserted[0]!.id;\n deps.loader.inject(versionId, extracted.def);\n if (!smoke.passed) {\n report.failed.push({\n automation: auto.automationId,\n stage: \"test\",\n reason: smoke.reason ?? \"smoke test failed\",\n });\n continue; // red never promotes (ADR-0006)\n }\n report.built.push(auto.automationId);\n }\n\n Object.assign(connectorManifests, manifest.connectors ?? {});\n sources.push({\n automationId: auto.automationId,\n connections: (manifest.connections ?? {}) as never,\n secrets: (manifest.secrets ?? {}) as never,\n });\n if (manifest.trigger.kind === \"schedule\") {\n schedules.push({\n automationId: auto.automationId,\n cron: manifest.trigger.cron,\n tz: (manifest.trigger as { tz?: string }).tz,\n });\n }\n if (manifest.trigger.kind === \"event\") {\n subscriptions.push({ eventName: (manifest.trigger as { event: string }).event, automationId: auto.automationId });\n }\n promote.push({ automationId: auto.automationId, versionId });\n }\n\n // ---- 4. credential gate: halt BEFORE promotion (ADR-0005) ----\n const missing = await computeMissingRequirements({\n db: deps.db,\n broker: deps.broker,\n workspaceId: project.workspace_id,\n projectId,\n env,\n automations: sources,\n connectorManifests: connectorManifests as never,\n });\n if (missing.length > 0) {\n const token = await mintConnectLink({\n db: deps.db,\n workspaceId: project.workspace_id,\n projectId,\n requirements: missing,\n });\n report.connectUrl = `${deps.baseUrl}/connect/${token}`;\n report.requirements = missing;\n return finish(\"halted-credentials\", report);\n }\n\n // ---- 5. promote green versions: alias swap, instant + atomic per automation ----\n for (const p of promote) {\n await deps.db.tx(async (c) => {\n await c.query(\n `INSERT INTO aliases (project_id, automation_id, env, version_id) VALUES ($1,$2,$3,$4)\n ON CONFLICT (project_id, automation_id, env)\n DO UPDATE SET version_id=EXCLUDED.version_id, updated_at=now()`,\n [projectId, p.automationId, env, p.versionId],\n );\n await c.query(\n `UPDATE automation_versions SET status='superseded'\n WHERE project_id=$1 AND automation_id=$2 AND id <> $3 AND status='live'`,\n [projectId, p.automationId, p.versionId],\n );\n await c.query(`UPDATE automation_versions SET status='live' WHERE id=$1`, [p.versionId]);\n });\n }\n\n // ---- 6. undeployed automations: unalias + teardown ----\n const liveIds = new Set(discovered.map((d) => d.automationId));\n const { rows: aliased } = await deps.db.query<{ automation_id: string }>(\n `SELECT automation_id FROM aliases WHERE project_id=$1 AND env=$2`,\n [projectId, env],\n );\n for (const row of aliased) {\n if (!liveIds.has(row.automation_id)) {\n await deps.db.query(`DELETE FROM aliases WHERE project_id=$1 AND automation_id=$2 AND env=$3`, [\n projectId,\n row.automation_id,\n env,\n ]);\n report.removed.push(row.automation_id);\n }\n }\n\n // ---- 7. wire triggers (production only; previews are trigger-inert, ADR-0013) ----\n if (env === \"production\") {\n await syncSchedules(deps.db, projectId, env, schedules);\n await syncSubscriptions(deps.db, projectId, env, subscriptions);\n const regs = await ensureRegistrations(deps.triggerDeps, projectId, env);\n const manualReqs = regs.flatMap((r) => (r.manualRequirement !== undefined ? [r.manualRequirement] : []));\n report.manual = regs\n .filter((r) => r.status === \"manual-pending\")\n .map((r) => ({ automation: r.automationId, trigger: r.trigger }));\n await activatePolls(deps.triggerDeps, projectId, env);\n if (manualReqs.length > 0) {\n const token = await mintConnectLink({\n db: deps.db,\n workspaceId: project.workspace_id,\n projectId,\n requirements: manualReqs,\n });\n report.connectUrl = `${deps.baseUrl}/connect/${token}`;\n report.requirements = manualReqs;\n return finish(\"halted-credentials\", report);\n }\n }\n\n await gcArtifacts(deps.db, projectId);\n return finish(report.failed.length > 0 ? \"failed\" : \"synced\", report);\n } catch (err) {\n report.failed.push({ automation: \"*\", stage: \"build\", reason: String(err).slice(0, 2000) });\n await deps.db.query(\n `UPDATE repo_state SET status='failed', error=$2, report=$3::jsonb, last_synced_at=now() WHERE project_id=$1`,\n [projectId, String(err).slice(0, 2000), JSON.stringify(report)],\n );\n return report;\n }\n}\n\n/** Keep the last 10 versions per automation, plus aliased or active-run versions. */\nexport async function gcArtifacts(db: Db, projectId: string): Promise<void> {\n await db.query(\n `UPDATE automation_versions v SET status='superseded'\n WHERE v.project_id=$1 AND v.status='staged'\n AND v.created_at < now() - interval '1 day'`,\n [projectId],\n );\n // row GC only; artifact files are cheap and removed with the data dir\n await db.query(\n `DELETE FROM automation_versions v\n WHERE v.project_id=$1\n AND NOT EXISTS (\n SELECT 1 FROM aliases a\n WHERE a.project_id=$1 AND a.version_id=v.id\n )\n AND NOT EXISTS (\n SELECT 1 FROM runs r\n WHERE r.project_id=$1\n AND r.version_id=v.id\n AND r.status IN ('queued','running','suspended')\n )\n AND v.version < COALESCE((\n SELECT max(v2.version) - 9 FROM automation_versions v2\n WHERE v2.project_id=v.project_id AND v2.automation_id=v.automation_id\n ), 0)`,\n [projectId],\n );\n}\n\nexport async function deployStatus(db: Db, projectId: string, env: string): Promise<unknown> {\n const { rows: state } = await db.query(`SELECT status, error, report, last_sha, branch, last_synced_at FROM repo_state WHERE project_id=$1`, [projectId]);\n const { rows: versions } = await db.query(\n `SELECT a.automation_id, a.env, v.version, v.status, v.test_report\n FROM aliases a JOIN automation_versions v ON v.id=a.version_id\n WHERE a.project_id=$1 AND a.env=$2`,\n [projectId, env],\n );\n return { repo: state[0] ?? null, live: versions };\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", "// Webhook-strategy registration lifecycle (ADR-0013): auto mode rides the brokered token\n// to create/destroy provider hooks pointing at our stable ingress URL; manual mode\n// surfaces a connect-page step. Config-hash decides re-registration; undeploy\n// unregisters (no orphaned hooks).\n\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { decodeJournal, stableStringify } from \"@devosurf/tesser-sdk/internal\";\nimport type { Db } from \"../db/db.js\";\nimport { authDeclFor, makeActionCtx, providerFactsOf } from \"../broker/connections.js\";\nimport type { ManualWebhookRequirement } from \"../broker/connect.js\";\nimport {\n isWebhookDecl,\n resolveLiveTrigger,\n type TriggerLayerDeps,\n} from \"./shared.js\";\n\nfunction configHash(manifest: { connector: string; trigger: string; params: unknown }, connectionId: string): string {\n return createHash(\"sha256\")\n .update(stableStringify({\n connector: manifest.connector,\n trigger: manifest.trigger,\n params: manifest.params,\n connection: connectionId,\n } as never))\n .digest(\"hex\")\n .slice(0, 24);\n}\n\nexport interface RegistrationOutcome {\n automationId: string;\n trigger: string;\n status: \"registered\" | \"manual-pending\" | \"failed\" | \"unchanged\";\n manualRequirement?: ManualWebhookRequirement;\n error?: string;\n}\n\n/** Bring one automation's webhook trigger to its registered state. */\nexport async function ensureRegistration(\n deps: TriggerLayerDeps,\n projectId: string,\n automationId: string,\n env: string,\n): Promise<RegistrationOutcome | null> {\n if (env !== \"production\") return null; // preview is trigger-inert (ADR-0013)\n const resolved = await resolveLiveTrigger(deps, projectId, automationId, env);\n if (!resolved || !isWebhookDecl(resolved.decl)) return null;\n const { decl, manifest, connection } = resolved;\n const hash = configHash(manifest, connection.id);\n\n const { rows } = await deps.db.query<{\n id: string;\n config_hash: string;\n status: string;\n ingress_token: string;\n external_id: string | null;\n state: unknown;\n signing_secret_cipher: string | null;\n }>(\n `SELECT id, config_hash, status, ingress_token, external_id, state, signing_secret_cipher\n FROM webhook_registrations\n WHERE project_id=$1 AND automation_id=$2 AND trigger_id=$3 AND connection_id=$4 AND env=$5`,\n [projectId, automationId, manifest.trigger, connection.id, env],\n );\n const existing = rows[0];\n\n if (existing && existing.config_hash === hash && [\"registered\", \"manual-pending\"].includes(existing.status)) {\n if (existing.status === \"registered\") {\n return { automationId, trigger: manifest.trigger, status: \"unchanged\" };\n }\n // still waiting on the human \u2014 re-surface the same requirement\n return {\n automationId,\n trigger: manifest.trigger,\n status: \"manual-pending\",\n manualRequirement: manualRequirementFor(deps, existing.id, existing.ingress_token, resolved, decl),\n };\n }\n\n // Config changed \u2192 tear down the old provider hook first (auto mode only).\n if (existing && existing.config_hash !== hash) {\n await destroyRegistration(deps, projectId, automationId, env, existing.id).catch(() => {});\n }\n\n const ingressToken = existing?.config_hash === hash ? existing.ingress_token : `wt_${randomBytes(16).toString(\"hex\")}`;\n const url = `${deps.baseUrl}/ingress/c/${ingressToken}`;\n\n if (decl.register.mode === \"manual\") {\n const { rows: created } = await deps.db.query<{ id: string }>(\n `INSERT INTO webhook_registrations\n (project_id, automation_id, trigger_id, connector_id, connection_id, env, config_hash, ingress_token, status)\n VALUES ($1,$2,$3,$4,$5,$6,$7,$8,'manual-pending')\n ON CONFLICT (project_id, automation_id, trigger_id, connection_id, env)\n DO UPDATE SET config_hash=EXCLUDED.config_hash, status='manual-pending', updated_at=now()\n RETURNING id`,\n [projectId, automationId, manifest.trigger, manifest.connector, connection.id, env, hash, ingressToken],\n );\n return {\n automationId,\n trigger: manifest.trigger,\n status: \"manual-pending\",\n manualRequirement: manualRequirementFor(deps, created[0]!.id, ingressToken, resolved, decl),\n };\n }\n\n // auto mode: we generate the signing secret and call the provider's hook API.\n const secret = randomBytes(24).toString(\"hex\");\n try {\n const bundle = await deps.broker.freshCredential(\n connection.id,\n providerFactsOf(resolved.connector.__connector)?.oauth2,\n );\n const actx = makeActionCtx({\n spec: resolved.connector.__connector,\n decl: authDeclFor(resolved.connector.__connector, connection.auth_mode),\n conn: connection,\n facts: providerFactsOf(resolved.connector.__connector),\n fields: bundle.fields,\n broker: deps.broker,\n fetchImpl: deps.fetchImpl,\n });\n const result = await decl.register.create(actx, { url, secret }, resolved.params);\n const cipher = await deps.broker.encryptValue(resolved.workspaceId, secret, \"webhook.signing\");\n await deps.db.query(\n `INSERT INTO webhook_registrations\n (project_id, automation_id, trigger_id, connector_id, connection_id, env, config_hash, ingress_token,\n signing_secret_cipher, external_id, state, status)\n VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11::jsonb,'registered')\n ON CONFLICT (project_id, automation_id, trigger_id, connection_id, env)\n DO UPDATE SET config_hash=EXCLUDED.config_hash, ingress_token=EXCLUDED.ingress_token,\n signing_secret_cipher=EXCLUDED.signing_secret_cipher, external_id=EXCLUDED.external_id,\n state=EXCLUDED.state, status='registered', error=NULL, updated_at=now()`,\n [\n projectId,\n automationId,\n manifest.trigger,\n manifest.connector,\n connection.id,\n env,\n hash,\n ingressToken,\n cipher,\n result && typeof result === \"object\" && \"externalId\" in result ? ((result as { externalId?: string }).externalId ?? null) : null,\n result && typeof result === \"object\" && \"state\" in result ? JSON.stringify((result as { state?: unknown }).state ?? null) : null,\n ],\n );\n return { automationId, trigger: manifest.trigger, status: \"registered\" };\n } catch (err) {\n await deps.db.query(\n `INSERT INTO webhook_registrations\n (project_id, automation_id, trigger_id, connector_id, connection_id, env, config_hash, ingress_token, status, error)\n VALUES ($1,$2,$3,$4,$5,$6,$7,$8,'failed',$9)\n ON CONFLICT (project_id, automation_id, trigger_id, connection_id, env)\n DO UPDATE SET status='failed', error=EXCLUDED.error, updated_at=now()`,\n [projectId, automationId, manifest.trigger, manifest.connector, connection.id, env, hash, ingressToken, String(err).slice(0, 1000)],\n );\n return { automationId, trigger: manifest.trigger, status: \"failed\", error: String(err) };\n }\n}\n\nfunction manualRequirementFor(\n deps: TriggerLayerDeps,\n registrationId: string,\n ingressToken: string,\n resolved: NonNullable<Awaited<ReturnType<typeof resolveLiveTrigger>>>,\n decl: import(\"@devosurf/tesser-sdk/connector\").WebhookTriggerDecl<any, any>,\n): ManualWebhookRequirement {\n const url = `${deps.baseUrl}/ingress/c/${ingressToken}`;\n const instructions =\n decl.register.mode === \"manual\"\n ? decl.register.instructions({ url, secret: \"(paste your provider's signing secret below)\" }, resolved.params)\n : \"\";\n return {\n type: \"webhook-manual\",\n registrationId,\n connector: resolved.manifest.connector,\n trigger: resolved.manifest.trigger,\n automation: resolved.automationId,\n instructions,\n url,\n };\n}\n\n/** Undeploy / config-change teardown: destroy the provider hook, mark removed, GC state. */\nexport async function destroyRegistration(\n deps: TriggerLayerDeps,\n projectId: string,\n automationId: string,\n env: string,\n registrationId: string,\n): Promise<void> {\n const { rows } = await deps.db.query<{\n id: string;\n trigger_id: string;\n connector_id: string;\n connection_id: string | null;\n external_id: string | null;\n state: unknown;\n status: string;\n }>(`SELECT id, trigger_id, connector_id, connection_id, external_id, state, status FROM webhook_registrations WHERE id=$1`, [\n registrationId,\n ]);\n const reg = rows[0];\n if (!reg) return;\n\n if (reg.status === \"registered\" && reg.connection_id) {\n const resolved = await resolveLiveTrigger(deps, projectId, automationId, env).catch(() => null);\n if (resolved && isWebhookDecl(resolved.decl) && resolved.decl.register.mode === \"auto\" && resolved.decl.register.destroy) {\n try {\n const bundle = await deps.broker.freshCredential(\n resolved.connection.id,\n providerFactsOf(resolved.connector.__connector)?.oauth2,\n );\n const actx = makeActionCtx({\n spec: resolved.connector.__connector,\n decl: authDeclFor(resolved.connector.__connector, resolved.connection.auth_mode),\n conn: resolved.connection,\n facts: providerFactsOf(resolved.connector.__connector),\n fields: bundle.fields,\n broker: deps.broker,\n fetchImpl: deps.fetchImpl,\n });\n await resolved.decl.register.destroy(\n actx,\n { ...(reg.external_id !== null ? { externalId: reg.external_id } : {}), state: decodeJournal(reg.state as never) },\n resolved.params,\n );\n } catch {\n // best-effort: the provider hook may already be gone\n }\n }\n }\n await deps.db.query(`UPDATE webhook_registrations SET status='removed', updated_at=now() WHERE id=$1`, [reg.id]);\n if (reg.connection_id) {\n await deps.db.query(\n `DELETE FROM trigger_state WHERE project_id=$1 AND automation_id=$2 AND trigger_id=$3 AND connection_id=$4`,\n [projectId, automationId, reg.trigger_id, reg.connection_id],\n );\n }\n}\n\n/** Reconcile all webhook registrations for a project+env after promote. Returns the\n * manual steps that still need a human (they join the connect link). */\nexport async function ensureRegistrations(\n deps: TriggerLayerDeps,\n projectId: string,\n env: string,\n): Promise<RegistrationOutcome[]> {\n if (env !== \"production\") return [];\n const { rows } = await deps.db.query<{ automation_id: string; manifest: { trigger?: { kind?: string } } }>(\n `SELECT a.automation_id, v.manifest FROM aliases a JOIN automation_versions v ON v.id=a.version_id\n WHERE a.project_id=$1 AND a.env=$2`,\n [projectId, env],\n );\n const outcomes: RegistrationOutcome[] = [];\n const liveAutomationIds = new Set<string>();\n for (const row of rows) {\n liveAutomationIds.add(row.automation_id);\n if (row.manifest.trigger?.kind !== \"connector\") continue;\n const outcome = await ensureRegistration(deps, projectId, row.automation_id, env);\n if (outcome) outcomes.push(outcome);\n }\n // Undeployed automations: tear down their registrations.\n const stale = await deps.db.query<{ id: string; automation_id: string }>(\n `SELECT id, automation_id FROM webhook_registrations\n WHERE project_id=$1 AND env=$2 AND status IN ('registered','manual-pending','failed')`,\n [projectId, env],\n );\n for (const reg of stale.rows) {\n if (!liveAutomationIds.has(reg.automation_id)) {\n await destroyRegistration(deps, projectId, reg.automation_id, env, reg.id);\n }\n }\n return outcomes;\n}\n", "// Server-side build (ADR-0006): bundle each changed automation into a self-contained\n// immutable artifact (SDK + connectors + deps compiled in) and statically extract its\n// manifest \u2014 module evaluation only, the handler never runs (ADR-0010).\n\nimport { createHash } from \"node:crypto\";\nimport { mkdirSync, readdirSync, readFileSync, statSync, existsSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { build } from \"esbuild\";\nimport type { AutomationDef } from \"@devosurf/tesser-sdk\";\nimport type { ConnectorInstance } from \"@devosurf/tesser-sdk/connector\";\nimport {\n extractAutomationManifest,\n extractConnectorManifest,\n type AutomationManifest,\n type ConnectorManifest,\n} from \"@devosurf/tesser-sdk/internal\";\n\nexport interface DiscoveredAutomation {\n automationId: string;\n dir: string;\n entry: string;\n contentHash: string;\n}\n\nconst LOCKFILES = [\"pnpm-lock.yaml\", \"package-lock.json\", \"yarn.lock\", \"package.json\", \"tesser.json\"];\n\nexport function discoverAutomations(repoDir: string): DiscoveredAutomation[] {\n const root = join(repoDir, \"automations\");\n if (!existsSync(root)) return [];\n const lockHash = createHash(\"sha256\");\n for (const f of LOCKFILES) {\n const p = join(repoDir, f);\n if (existsSync(p)) lockHash.update(f).update(readFileSync(p));\n }\n const lock = lockHash.digest(\"hex\");\n\n const out: DiscoveredAutomation[] = [];\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 out.push({ automationId: name, dir, entry, contentHash: hashDir(dir, lock) });\n }\n return out;\n}\n\nfunction hashDir(dir: string, seed: string): string {\n const h = createHash(\"sha256\").update(seed);\n const walk = (d: string) => {\n for (const entry of readdirSync(d).sort()) {\n if (entry === \"node_modules\" || entry.startsWith(\".\")) continue;\n const p = join(d, entry);\n const st = statSync(p);\n if (st.isDirectory()) walk(p);\n else h.update(relative(dir, p)).update(readFileSync(p));\n }\n };\n walk(dir);\n return h.digest(\"hex\").slice(0, 24);\n}\n\nexport async function buildAutomationBundle(entry: string, outFile: string): Promise<void> {\n mkdirSync(join(outFile, \"..\"), { recursive: true });\n await build({\n entryPoints: [entry],\n outfile: outFile,\n bundle: true,\n platform: \"node\",\n format: \"esm\",\n target: \"node20\",\n sourcemap: \"inline\",\n // Self-contained: everything (sdk, connectors, zod) is compiled in; only node\n // builtins stay external. The artifact runs with no node_modules next to it.\n packages: \"bundle\",\n logLevel: \"silent\",\n });\n}\n\nexport interface ExtractedBundle {\n manifest: AutomationManifest & { connectors: Record<string, ConnectorManifest> };\n def: AutomationDef<any, any, any, any, any, any, any>;\n}\n\n/** Import the built artifact and statically extract its manifest (module evaluation\n * only; `run` is never called). The cache-busting query keeps re-extraction honest. */\nexport async function extractBundle(bundlePath: string): Promise<ExtractedBundle> {\n const mod = (await import(`${pathToFileURL(bundlePath).href}?t=${Date.now()}`)) as {\n default?: AutomationDef<any, any, any, any, any, any, any>;\n };\n const def = mod.default;\n if (!def || typeof def !== \"object\" || typeof def.run !== \"function\") {\n throw new Error(`bundle has no default export from defineAutomation: ${bundlePath}`);\n }\n const manifest = extractAutomationManifest(def);\n const connectors: Record<string, ConnectorManifest> = {};\n for (const conn of Object.values((def.connections ?? {}) as Record<string, ConnectorInstance<any, any>>)) {\n connectors[conn.id] = extractConnectorManifest(conn);\n }\n return { manifest: { ...manifest, connectors }, def };\n}\n", "// tesser-server entrypoint.\n\nimport { createTesserServer } from \"./server.js\";\n\nconst server = await createTesserServer();\nawait server.start();\n\nconsole.error(`[tesser] instance up on ${server.config.baseUrl} (db: ${server.db.kind})`);\nconsole.error(\n `[tesser] roles: ${Object.entries(server.config.roles)\n .filter(([, on]) => on)\n .map(([r]) => r)\n .join(\", \")}`,\n);\nif (server.adminToken) {\n console.error(`[tesser] FIRST BOOT \u2014 admin API token (store it now, it is not shown again):`);\n console.error(`[tesser] ${server.adminToken}`);\n}\n\nconst shutdown = async (signal: string) => {\n console.error(`[tesser] ${signal} \u2014 draining`);\n await server.stop();\n process.exit(0);\n};\nprocess.on(\"SIGINT\", () => void shutdown(\"SIGINT\"));\nprocess.on(\"SIGTERM\", () => void shutdown(\"SIGTERM\"));\n"],
5
+ "mappings": ";AAGA,SAAS,aAA8B;;;ACAvC,SAAS,WAAW,cAAc,eAAe,YAAY,cAAc;AAC3E,SAAS,YAAY;AACrB,SAAS,mBAAmB;AAgBrB,SAAS,WAAW,MAAyB,QAAQ,KAAmB;AAC7E,QAAM,OAAO,OAAO,IAAI,MAAM,KAAK,IAAI,aAAa,KAAK,IAAI;AAC7D,QAAM,OAA4B,IAAI,UAAU,MAAM,eAAe,eAAe;AACpF,QAAM,aAAa,SAAS;AAC5B,QAAM,UAAU,IAAI,iBAAiB,KAAK,KAAK,QAAQ,IAAI,GAAG,SAAS;AACvE,QAAM,cAAc,IAAI,cAAc,KAAK,IAAI,qBAAqB;AACpE,QAAM,UAAU,IAAI,iBAAiB,MAAM,aAAa,SAAY,oBAAoB,IAAI;AAC5F,QAAM,WAAW,IAAI,cAAc;AAEnC,MAAI,YAAY;AACd,UAAM,UAAU;AAAA,MACd,GAAI,cAAc,CAAC,IAAI,CAAC,cAAc;AAAA,MACtC,GAAI,UAAU,CAAC,IAAI,CAAC,iBAAiB;AAAA,MACrC,GAAI,IAAI,mBAAmB,IAAI,CAAC,IAAI,CAAC,mBAAmB;AAAA,MACxD,GAAI,WAAW,CAAC,IAAI,CAAC,cAAc;AAAA,IACrC;AACA,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM,IAAI,MAAM,kDAAkD,QAAQ,KAAK,IAAI,CAAC,EAAE;AAAA,IACxF;AAAA,EACF;AAEA,QAAM,oBAAoB,gBAAgB,SAAU,EAAE,YAAY,gBAAgB,IAAI,iCAAiC,MAAM,OAAO,CAAC;AACrI,wBAAsB,OAAO;AAE7B,MAAI;AACJ,QAAM,UAAU,IAAI,mBAAmB;AACvC,MAAI,SAAS;AACX,gBAAY,OAAO,KAAK,SAAS,QAAQ;AACzC,QAAI,UAAU,WAAW,IAAI;AAC3B,YAAM,IAAI,MAAM,oDAAoD;AAAA,IACtE;AAAA,EACF,OAAO;AAGL,UAAM,UAAU,KAAK,SAAS,YAAY;AAC1C,QAAI,WAAW,OAAO,GAAG;AACvB,kBAAY,OAAO,KAAK,aAAa,SAAS,MAAM,EAAE,KAAK,GAAG,QAAQ;AAAA,IACxE,OAAO;AACL,kBAAY,YAAY,EAAE;AAC1B,oBAAc,SAAS,UAAU,SAAS,QAAQ,IAAI,MAAM,EAAE,MAAM,IAAM,CAAC;AAC3E,cAAQ;AAAA,QACN,kDAAkD,OAAO;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,WAAW,YAAY,iCAAiC;AAExE,SAAO;AAAA,IACL;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,MACL,KAAK,QAAQ,IAAI,KAAK;AAAA,MACtB,QAAQ,QAAQ,IAAI,QAAQ;AAAA,MAC5B,WAAW,QAAQ,IAAI,WAAW;AAAA,MAClC,YAAY,QAAQ,IAAI,YAAY;AAAA,IACtC;AAAA,IACA,YAAY,IAAI,oBAAoB,GAAG,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,OAAO,OAAO;AAAA,IACzF,gBAAgB,OAAO,IAAI,sBAAsB,KAAK,GAAG;AAAA,IACzD,KAAK;AAAA,EACP;AACF;AAEA,SAAS,gBAAgB,OAAe,MAAgE;AACtG,MAAI;AACJ,MAAI;AACF,aAAS,IAAI,IAAI,KAAK;AAAA,EACxB,QAAQ;AACN,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AACA,MAAI,OAAO,aAAa,OAAO,OAAO,UAAU,OAAO,MAAM;AAC3D,UAAM,IAAI,MAAM,gFAAgF;AAAA,EAClG;AACA,MAAI,KAAK,cAAc,CAAC,KAAK,kBAAkB,YAAY,OAAO,QAAQ,GAAG;AAC3E,UAAM,IAAI,MAAM,0EAA0E;AAAA,EAC5F;AACA,SAAO,OAAO;AAChB;AAEA,SAAS,YAAY,UAA2B;AAC9C,QAAM,OAAO,SAAS,YAAY;AAClC,SAAO,SAAS,eAAe,SAAS,eAAe,SAAS,SAAS,SAAS;AACpF;AAEA,SAAS,WAAW,OAA4B;AAC9C,QAAM,UAAU,oBAAI,IAAI,CAAC,OAAO,UAAU,aAAa,YAAY,CAAC;AACpE,QAAM,QAAQ,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,OAAO;AACxE,QAAM,UAAU,MAAM,OAAO,CAAC,SAAS,CAAC,QAAQ,IAAI,IAAI,CAAC;AACzD,MAAI,QAAQ,SAAS,EAAG,OAAM,IAAI,MAAM,0CAA0C,QAAQ,KAAK,IAAI,CAAC,EAAE;AACtG,MAAI,MAAM,WAAW,EAAG,OAAM,IAAI,MAAM,6CAA6C;AACrF,SAAO,IAAI,IAAI,KAAK;AACtB;AAEA,SAAS,sBAAsB,SAAuB;AACpD,MAAI;AACF,cAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AACtC,UAAM,QAAQ,KAAK,SAAS,uBAAuB,YAAY,CAAC,EAAE,SAAS,KAAK,CAAC,EAAE;AACnF,kBAAc,OAAO,MAAM,EAAE,MAAM,KAAK,CAAC;AACzC,WAAO,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA,EAC/B,SAASA,MAAK;AACZ,UAAM,UAAUA,gBAAe,QAAQA,KAAI,UAAU,OAAOA,IAAG;AAC/D,UAAM,IAAI,MAAM,oEAAoE,OAAO,EAAE;AAAA,EAC/F;AACF;;;ACrGA,eAAsB,SAAS,QAA+B;AAC5D,MAAI,OAAO,aAAa;AACtB,UAAM,EAAE,SAAS,GAAG,IAAI,MAAM,OAAO,IAAI;AACzC,UAAM,OAAO,IAAI,GAAG,KAAK,EAAE,kBAAkB,OAAO,aAAa,KAAK,GAAG,CAAC;AAE1E,UAAM,YAAY,CAAI,QAAiC;AACrD,YAAM,IAAK,MAAM,QAAQ,GAAG,IAAI,IAAI,IAAI,SAAS,CAAC,IAAI;AAItD,YAAM,OAAO,GAAG,QAAQ,CAAC;AACzB,aAAO,EAAE,MAAM,UAAU,GAAG,YAAY,KAAK,OAAO;AAAA,IACtD;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM,MAAMC,OAAM,QAAQ;AACxB,eAAO,UAAU,MAAM,KAAK,MAAMA,OAAM,MAAiB,CAAC;AAAA,MAC5D;AAAA,MACA,MAAM,GAAG,IAAI;AACX,cAAM,SAAS,MAAM,KAAK,QAAQ;AAClC,YAAI;AACF,gBAAM,OAAO,MAAM,OAAO;AAC1B,gBAAM,SAAS,MAAM,GAAG;AAAA,YACtB,MAAM,MAAMA,OAAM,QAAQ;AACxB,qBAAO,UAAU,MAAM,OAAO,MAAMA,OAAM,MAAiB,CAAC;AAAA,YAC9D;AAAA,UACF,CAAC;AACD,gBAAM,OAAO,MAAM,QAAQ;AAC3B,iBAAO;AAAA,QACT,SAASC,MAAK;AACZ,gBAAM,OAAO,MAAM,UAAU,EAAE,MAAM,MAAM;AAAA,UAAC,CAAC;AAC7C,gBAAMA;AAAA,QACR,UAAE;AACA,iBAAO,QAAQ;AAAA,QACjB;AAAA,MACF;AAAA,MACA,MAAM,QAAQ;AACZ,cAAM,KAAK,IAAI;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,EAAE,OAAO,IAAI,MAAM,OAAO,sBAAsB;AACtD,MAAI;AACJ,MAAI,OAAO,WAAW,OAAO,YAAY,aAAa;AACpD,UAAM,EAAE,WAAAC,WAAU,IAAI,MAAM,OAAO,SAAS;AAC5C,IAAAA,WAAU,OAAO,SAAS,EAAE,WAAW,KAAK,CAAC;AAC7C,aAAS,IAAI,OAAO,OAAO,OAAO;AAAA,EACpC,OAAO;AACL,aAAS,IAAI,OAAO;AAAA,EACtB;AACA,QAAM,OAAO;AAIb,MAAI,QAA0B,QAAQ,QAAQ;AAC9C,QAAM,YAAY,CAAI,OAAqC;AACzD,UAAM,OAAO,MAAM,KAAK,IAAI,EAAE;AAC9B,YAAQ,KAAK,MAAM,MAAM;AAAA,IAAC,CAAC;AAC3B,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAMF,OAAM,QAAQ;AACxB,YAAM,MAAM,MAAM,UAAU,MAAM,OAAO,MAAMA,OAAM,MAAiB,CAAC;AACvE,aAAO,EAAE,MAAM,IAAI,MAAiB,UAAW,IAAkC,gBAAgB,IAAI,KAAK,OAAO;AAAA,IACnH;AAAA,IACA,MAAM,GAAG,IAAI;AACX,aAAO;AAAA,QAAU,MACf,OAAO,YAAY,OAAO,MAAM;AAC9B,iBAAO,GAAG;AAAA,YACR,MAAM,MAAMA,OAAM,QAAQ;AACxB,oBAAM,MAAM,MAAM,EAAE,MAAMA,OAAM,MAAiB;AACjD,qBAAO;AAAA,gBACL,MAAM,IAAI;AAAA,gBACV,UAAW,IAAkC,gBAAgB,IAAI,KAAK;AAAA,cACxE;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,MAAM,QAAQ;AACZ,YAAM,OAAO,MAAM;AAAA,IACrB;AAAA,EACF;AACF;;;ACzGO,IAAM,aAA0B;AAAA,EACrC;AAAA,IACE,IAAI;AAAA,IACJ;AAAA;AAAA,MAAe;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;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;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;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,EAkRjB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ;AAAA;AAAA,MAAe;AAAA;AAAA;AAAA;AAAA;AAAA,EAIjB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ;AAAA;AAAA,MAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKjB;AACF;;;AC1SA,eAAsB,QAAQ,IAA2B;AACvD,QAAM,GAAG;AAAA,IACP;AAAA;AAAA;AAAA;AAAA,EAIF;AACA,QAAM,EAAE,KAAK,IAAI,MAAM,GAAG,MAAsB,kCAAkC;AAClF,QAAM,UAAU,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAC7C,QAAM,MAAgB,CAAC;AACvB,aAAW,KAAK,YAAY;AAC1B,QAAI,QAAQ,IAAI,EAAE,EAAE,EAAG;AACvB,UAAM,GAAG,GAAG,OAAO,MAAM;AAGvB,iBAAW,aAAa,gBAAgB,EAAE,GAAG,GAAG;AAC9C,cAAM,EAAE,MAAM,SAAS;AAAA,MACzB;AACA,YAAM,EAAE,MAAM,kDAAkD,CAAC,EAAE,EAAE,CAAC;AAAA,IACxE,CAAC;AACD,QAAI,KAAK,EAAE,EAAE;AAAA,EACf;AACA,SAAO;AACT;AAGA,SAAS,gBAAgB,KAAuB;AAC9C,SAAO,IACJ,MAAM,cAAc,EACpB,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC,EAAE,WAAW,IAAI,CAAC;AACtD;;;AC/BA,SAAS,gBAAgB,kBAAkB,eAAAG,oBAAmB;AAE9D,IAAM,UAAU;AAET,SAAS,QAAQ,KAAa,WAAoC;AACvE,MAAI,IAAI,WAAW,GAAI,OAAM,IAAI,MAAM,iCAAiC;AACxE,QAAM,KAAKA,aAAY,EAAE;AACzB,QAAM,SAAS,eAAe,eAAe,KAAK,EAAE;AACpD,QAAM,OAAO,OAAO,OAAO,CAAC,OAAO,OAAO,SAAS,GAAG,OAAO,MAAM,CAAC,CAAC;AACrE,QAAM,MAAM,OAAO,WAAW;AAC9B,SAAO,CAAC,SAAS,GAAG,SAAS,QAAQ,GAAG,IAAI,SAAS,QAAQ,GAAG,KAAK,SAAS,QAAQ,CAAC,EAAE,KAAK,GAAG;AACnG;AAEO,SAAS,QAAQ,KAAa,SAAyB;AAC5D,QAAM,CAAC,SAAS,OAAO,QAAQ,OAAO,IAAI,QAAQ,MAAM,GAAG;AAC3D,MAAI,YAAY,WAAW,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS;AACxD,UAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD;AACA,QAAM,WAAW,iBAAiB,eAAe,KAAK,OAAO,KAAK,OAAO,QAAQ,CAAC;AAClF,WAAS,WAAW,OAAO,KAAK,QAAQ,QAAQ,CAAC;AACjD,SAAO,OAAO,OAAO,CAAC,SAAS,OAAO,OAAO,KAAK,SAAS,QAAQ,CAAC,GAAG,SAAS,MAAM,CAAC,CAAC;AAC1F;AAEO,SAAS,kBAA0B;AACxC,SAAOA,aAAY,EAAE;AACvB;AAEO,SAAS,YAAY,WAAmB,SAAyB;AACtE,SAAO,QAAQ,WAAW,OAAO;AACnC;AAEO,SAAS,cAAc,WAAmB,SAAyB;AACxE,QAAM,MAAM,QAAQ,WAAW,OAAO;AACtC,MAAI,IAAI,WAAW,GAAI,OAAM,IAAI,MAAM,qCAAqC;AAC5E,SAAO;AACT;;;ACnCA,SAAS,YAAY,eAAAC,oBAAmB;AAajC,IAAM,aAAN,cAAyB,MAAM;AAAA,EACpC,YACE,SACS,kBACT;AACA,UAAM,OAAO;AAFJ;AAGT,SAAK,OAAO;AAAA,EACd;AAAA,EAJW;AAKb;AAEA,SAAS,OAAO,KAAqB;AACnC,SAAO,IAAI,SAAS,QAAQ,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,EAAE;AACzF;AAEO,SAAS,eAAwD;AACtE,QAAM,WAAW,OAAOA,aAAY,EAAE,CAAC;AACvC,QAAM,YAAY,OAAO,WAAW,QAAQ,EAAE,OAAO,QAAQ,EAAE,OAAO,CAAC;AACvE,SAAO,EAAE,UAAU,UAAU;AAC/B;AAEO,SAAS,kBAAkB,MAOvB;AACT,QAAM,MAAM,IAAI,IAAI,KAAK,MAAM,YAAY;AAC3C,MAAI,aAAa,IAAI,aAAa,KAAK,QAAQ;AAC/C,MAAI,aAAa,IAAI,gBAAgB,KAAK,WAAW;AACrD,MAAI,aAAa,IAAI,iBAAiB,MAAM;AAC5C,MAAI,aAAa,IAAI,SAAS,KAAK,KAAK;AACxC,MAAI,KAAK,OAAO,SAAS,GAAG;AAC1B,QAAI,aAAa,IAAI,SAAS,KAAK,OAAO,KAAK,KAAK,MAAM,kBAAkB,GAAG,CAAC;AAAA,EAClF;AACA,MAAI,KAAK,kBAAkB,QAAW;AACpC,QAAI,aAAa,IAAI,kBAAkB,KAAK,aAAa;AACzD,QAAI,aAAa,IAAI,yBAAyB,MAAM;AAAA,EACtD;AACA,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,MAAM,wBAAwB,CAAC,CAAC,GAAG;AAC1E,QAAI,aAAa,IAAI,GAAG,CAAC;AAAA,EAC3B;AACA,SAAO,IAAI,SAAS;AACtB;AAEA,eAAe,aACb,OACA,UACA,cACA,QACA,WACmB;AACnB,QAAM,OAAO,IAAI,gBAAgB,MAAM;AACvC,QAAM,UAAU,IAAI,QAAQ;AAAA,IAC1B,gBAAgB;AAAA;AAAA,IAEhB,QAAQ;AAAA,EACV,CAAC;AACD,OAAK,MAAM,cAAc,YAAY,SAAS;AAC5C,YAAQ,IAAI,iBAAiB,SAAS,OAAO,KAAK,GAAG,QAAQ,IAAI,gBAAgB,EAAE,EAAE,EAAE,SAAS,QAAQ,CAAC,EAAE;AAAA,EAC7G,OAAO;AACL,SAAK,IAAI,aAAa,QAAQ;AAC9B,QAAI,iBAAiB,OAAW,MAAK,IAAI,iBAAiB,YAAY;AAAA,EACxE;AACA,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,MAAM,oBAAoB,CAAC,CAAC,EAAG,MAAK,IAAI,GAAG,CAAC;AAEhF,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,UAAU,MAAM,UAAU,EAAE,QAAQ,QAAQ,SAAS,KAAK,CAAC;AAAA,EACzE,SAAS,OAAO;AACd,UAAM,IAAI,WAAW,+BAA+B,OAAO,KAAK,CAAC,EAAE;AAAA,EACrE;AACA,QAAMC,QAAO,MAAM,IAAI,KAAK;AAC5B,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAMA,KAAI;AAAA,EAC1B,QAAQ;AACN,aAAS,OAAO,YAAY,IAAI,gBAAgBA,KAAI,CAAC;AAAA,EACvD;AACA,MAAI,CAAC,IAAI,MAAM,OAAO,OAAO,MAAM,UAAa,OAAO,OAAO,cAAc,MAAM,UAAU;AAC1F,UAAM,IAAI;AAAA,MACR,kBAAkB,IAAI,MAAM,KAAK,OAAO,OAAO,OAAO,KAAKA,MAAK,MAAM,GAAG,GAAG,CAAC,CAAC;AAAA,MAC9E;AAAA,IACF;AAAA,EACF;AACA,QAAM,YAAY,OAAO,OAAO,YAAY,CAAC;AAC7C,SAAO;AAAA,IACL,aAAa,OAAO,cAAc;AAAA,IAClC,GAAI,OAAO,OAAO,eAAe,MAAM,WAAW,EAAE,cAAc,OAAO,eAAe,EAAE,IAAI,CAAC;AAAA,IAC/F,GAAI,OAAO,SAAS,SAAS,KAAK,YAAY,IAAI,EAAE,WAAW,KAAK,IAAI,IAAI,YAAY,IAAK,IAAI,CAAC;AAAA,IAClG,GAAI,OAAO,OAAO,YAAY,MAAM,WAAW,EAAE,WAAW,OAAO,YAAY,EAAE,IAAI,CAAC;AAAA,IACtF,GAAI,OAAO,OAAO,OAAO,MAAM,WAAW,EAAE,OAAO,OAAO,OAAO,EAAE,IAAI,CAAC;AAAA,IACxE,KAAK;AAAA,EACP;AACF;AAEA,eAAsB,aAAa,MAQb;AACpB,SAAO;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AAAA,MACE,YAAY;AAAA,MACZ,MAAM,KAAK;AAAA,MACX,cAAc,KAAK;AAAA,MACnB,GAAI,KAAK,iBAAiB,SAAY,EAAE,eAAe,KAAK,aAAa,IAAI,CAAC;AAAA,IAChF;AAAA,IACA,KAAK,aAAa;AAAA,EACpB;AACF;AAEA,eAAsB,aAAa,MAMb;AACpB,SAAO;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,EAAE,YAAY,iBAAiB,eAAe,KAAK,aAAa;AAAA,IAChE,KAAK,aAAa;AAAA,EACpB;AACF;;;ACzHO,IAAM,SAAN,MAAa;AAAA,EAIlB,YACmB,IACA,WACR,QACQ,YAA0B,OAC3C;AAJiB;AACA;AACR;AACQ;AAAA,EAChB;AAAA,EAJgB;AAAA,EACA;AAAA,EACR;AAAA,EACQ;AAAA,EAPX,WAAW,oBAAI,IAAoB;AAAA,EACnC,aAAa,oBAAI,IAA8B;AAAA;AAAA,EAWvD,MAAM,yBAA0C;AAC9C,UAAM,WAAW,MAAM,KAAK,GAAG;AAAA,MAC7B;AAAA,IACF;AACA,QAAI,SAAS,KAAK,CAAC,EAAG,QAAO,SAAS,KAAK,CAAC,EAAE;AAC9C,UAAM,UAAU,YAAY,KAAK,WAAW,gBAAgB,CAAC;AAC7D,UAAM,UAAU,MAAM,KAAK,GAAG;AAAA,MAC5B;AAAA,MACA,CAAC,OAAO;AAAA,IACV;AACA,WAAO,QAAQ,KAAK,CAAC,EAAG;AAAA,EAC1B;AAAA,EAEA,MAAc,QAAQ,aAAsC;AAC1D,UAAM,SAAS,KAAK,SAAS,IAAI,WAAW;AAC5C,QAAI,OAAQ,QAAO;AACnB,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,MAC7B;AAAA,MACA,CAAC,WAAW;AAAA,IACd;AACA,QAAI,CAAC,KAAK,CAAC,EAAG,OAAM,IAAI,MAAM,aAAa,WAAW,YAAY;AAClE,UAAM,MAAM,cAAc,KAAK,WAAW,KAAK,CAAC,EAAE,eAAe;AACjE,SAAK,SAAS,IAAI,aAAa,GAAG;AAClC,WAAO;AAAA,EACT;AAAA;AAAA,EAIA,MAAM,UAAU,aAAqB,MAAc,OAA8B;AAC/E,UAAM,SAAS,QAAQ,MAAM,KAAK,QAAQ,WAAW,GAAG,KAAK;AAC7D,UAAM,KAAK,GAAG;AAAA,MACZ;AAAA;AAAA,MAEA,CAAC,aAAa,MAAM,MAAM;AAAA,IAC5B;AACA,SAAK,OAAO,IAAI,OAAO,UAAU,IAAI,EAAE;AAAA,EACzC;AAAA,EAEA,MAAM,eAAe,aAAqB,MAAsC;AAC9E,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,MAC7B;AAAA,MACA,CAAC,aAAa,IAAI;AAAA,IACpB;AACA,QAAI,CAAC,KAAK,CAAC,EAAG,QAAO;AACrB,UAAM,QAAQ,QAAQ,MAAM,KAAK,QAAQ,WAAW,GAAG,KAAK,CAAC,EAAE,YAAY,EAAE,SAAS,MAAM;AAC5F,SAAK,OAAO,IAAI,OAAO,UAAU,IAAI,EAAE;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,gBAAgB,aAA0E;AAC9F,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,MAC7B;AAAA,MACA,CAAC,WAAW;AAAA,IACd;AACA,WAAO,KAAK,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,OAAO,EAAE,UAAU,EAAE,EAAE;AAAA,EAC5E;AAAA,EAEA,MAAM,aAAa,aAAqB,MAAgC;AACtE,UAAM,EAAE,SAAS,IAAI,MAAM,KAAK,GAAG,MAAM,yDAAyD;AAAA,MAChG;AAAA,MACA;AAAA,IACF,CAAC;AACD,WAAO,WAAW;AAAA,EACpB;AAAA;AAAA,EAIA,MAAM,iBAAiB,MAQH;AAClB,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,MAC7B;AAAA;AAAA,MAEA;AAAA,QACE,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK,YAAY;AAAA,QACjB,KAAK,YAAY;AAAA,QACjB,KAAK,SAAS;AAAA,QACd,KAAK,aAAa;AAAA,QAClB,KAAK,SAAS;AAAA,MAChB;AAAA,IACF;AACA,WAAO,KAAK,CAAC,EAAG;AAAA,EAClB;AAAA,EAEA,MAAM,wBACJ,cACA,QACA,OAAyC,CAAC,GAC3B;AACf,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,MAC7B;AAAA,MACA,CAAC,YAAY;AAAA,IACf;AACA,QAAI,CAAC,KAAK,CAAC,EAAG,OAAM,IAAI,MAAM,cAAc,YAAY,YAAY;AACpE,UAAM,SAAS,QAAQ,MAAM,KAAK,QAAQ,KAAK,CAAC,EAAE,YAAY,GAAG,KAAK,UAAU,MAAM,CAAC;AACvF,UAAM,KAAK,GAAG;AAAA,MACZ;AAAA;AAAA,MAEA,CAAC,cAAc,QAAQ,KAAK,UAAU,IAAI,CAAC;AAAA,IAC7C;AACA,SAAK,OAAO,UAAU,QAAQ,cAAc,KAAK,CAAC,EAAE,YAAY,EAAE;AAAA,EACpE;AAAA,EAEA,MAAM,cAAc,cAAqD;AACvE,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG,MAAqB,yCAAyC,CAAC,YAAY,CAAC;AAC3G,WAAO,KAAK,CAAC,KAAK;AAAA,EACpB;AAAA,EAEA,MAAM,cAAc,cAAiD;AACnE,UAAM,MAAM,MAAM,KAAK,cAAc,YAAY;AACjD,QAAI,CAAC,OAAO,IAAI,WAAW,WAAW,CAAC,IAAI,mBAAmB;AAC5D,YAAM,IAAI,MAAM,cAAc,YAAY,eAAe;AAAA,IAC3D;AACA,UAAM,SAAS,KAAK;AAAA,MAClB,QAAQ,MAAM,KAAK,QAAQ,IAAI,YAAY,GAAG,IAAI,iBAAiB,EAAE,SAAS,MAAM;AAAA,IACtF;AACA,SAAK,OAAO,UAAU,QAAQ,cAAc,IAAI,YAAY,EAAE;AAC9D,WAAO,EAAE,QAAQ,MAAM,IAAI,mBAAmB,CAAC,EAAE;AAAA,EACnD;AAAA,EAEA,MAAM,gBAAgB,aAEpB;AACA,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,MAC7B;AAAA,MACA,CAAC,WAAW;AAAA,IACd;AACA,WAAO,KAAK,IAAI,CAAC,OAAO;AAAA,MACtB,IAAI,EAAE;AAAA,MACN,aAAa,EAAE;AAAA,MACf,UAAU,EAAE;AAAA,MACZ,OAAO,EAAE;AAAA,MACT,OAAO,EAAE;AAAA,MACT,QAAQ,EAAE;AAAA,MACV,WAAW,EAAE;AAAA,IACf,EAAE;AAAA,EACJ;AAAA;AAAA;AAAA,EAIA,MAAM,eAAe,MASa;AAChC,QAAI,KAAK,UAAU,aAAa;AAC9B,YAAM,QAAQ,MAAM,KAAK,GAAG;AAAA,QAC1B;AAAA;AAAA,QAEA,CAAC,KAAK,WAAW,KAAK,cAAc,KAAK,KAAK,KAAK,MAAM;AAAA,MAC3D;AACA,UAAI,MAAM,KAAK,CAAC,GAAG;AACjB,cAAMC,QAAO,MAAM,KAAK,cAAc,MAAM,KAAK,CAAC,EAAE,aAAa;AACjE,YAAIA,OAAM,WAAW,QAAS,QAAOA;AAAA,MACvC;AAAA,IACF;AACA,UAAM,gBAAgB,KAAK,UAAU,aAAa,yBAAyB;AAC3E,UAAM,SACJ,KAAK,UAAU,aACX,CAAC,KAAK,aAAa,KAAK,aAAa,SAAS,KAAK,aAAa,IAAI,IACpE,CAAC,KAAK,aAAa,KAAK,aAAa,OAAO;AAClD,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,MAC7B,qFAAqF,aAAa;AAAA;AAAA,MAElG;AAAA,IACF;AACA,QAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,UAAM,OAAO,KAAK,CAAC;AACnB,QAAI,KAAK,UAAU,aAAa;AAC9B,YAAM,KAAK,GAAG;AAAA,QACZ;AAAA;AAAA;AAAA,QAGA,CAAC,KAAK,WAAW,KAAK,cAAc,KAAK,KAAK,KAAK,QAAQ,KAAK,EAAE;AAAA,MACpE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAIA,MAAM,YAAY,aAAqB,UAAkB,UAAkB,cAAqC;AAC9G,UAAM,SAAS,QAAQ,MAAM,KAAK,QAAQ,WAAW,GAAG,YAAY;AACpE,UAAM,KAAK,GAAG;AAAA,MACZ;AAAA;AAAA;AAAA,MAGA,CAAC,aAAa,UAAU,UAAU,MAAM;AAAA,IAC1C;AACA,SAAK,OAAO,IAAI,cAAc,YAAY,QAAQ,EAAE;AAAA,EACtD;AAAA,EAEA,MAAM,YACJ,aACA,UAC4D;AAC5D,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,MAC7B;AAAA,MACA,CAAC,aAAa,QAAQ;AAAA,IACxB;AACA,QAAI,KAAK,CAAC,GAAG;AACX,YAAMC,gBAAe,QAAQ,MAAM,KAAK,QAAQ,WAAW,GAAG,KAAK,CAAC,EAAE,oBAAoB,EAAE,SAAS,MAAM;AAC3G,WAAK,OAAO,IAAIA,eAAc,YAAY,QAAQ,EAAE;AACpD,aAAO,EAAE,UAAU,KAAK,CAAC,EAAE,WAAW,cAAAA,cAAa;AAAA,IACrD;AACA,UAAM,SAAS,SAAS,YAAY,EAAE,QAAQ,cAAc,GAAG;AAC/D,UAAM,WAAW,QAAQ,IAAI,gBAAgB,MAAM,YAAY;AAC/D,UAAM,eAAe,QAAQ,IAAI,gBAAgB,MAAM,gBAAgB;AACvE,QAAI,YAAY,aAAc,QAAO,EAAE,UAAU,aAAa;AAC9D,WAAO;AAAA,EACT;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,cAAsB,OAA8C;AAC1F,UAAM,WAAW,KAAK,WAAW,IAAI,YAAY;AACjD,QAAI,SAAU,QAAO;AACrB,UAAM,KAAK,YAA8B;AACvC,YAAM,MAAM,MAAM,KAAK,cAAc,YAAY;AACjD,UAAI,CAAC,IAAK,QAAO;AACjB,YAAM,EAAE,QAAQ,KAAK,IAAI,MAAM,KAAK,cAAc,YAAY;AAC9D,YAAM,KAAK,OAAO,eAAe;AACjC,UAAI,OAAO,OAAW,QAAO;AAC7B,YAAM,MAAM,MAAM,KAAK,YAAY,IAAI,cAAc,IAAI,YAAY,IAAI,YAAY;AACrF,UAAI,CAAC,IAAK,QAAO;AACjB,YAAMC,UAAS,MAAM,aAAa;AAAA,QAChC;AAAA,QACA,UAAU,IAAI;AAAA,QACd,cAAc,IAAI;AAAA,QAClB,cAAc;AAAA,QACd,WAAW,KAAK;AAAA,MAClB,CAAC;AACD,YAAM,aAAqC;AAAA,QACzC,GAAG;AAAA,QACH,cAAcA,QAAO;AAAA,QACrB,GAAIA,QAAO,iBAAiB,SAAY,EAAE,eAAeA,QAAO,aAAa,IAAI,CAAC;AAAA,MACpF;AACA,YAAM,KAAK,wBAAwB,cAAc,YAAY;AAAA,QAC3D,GAAG;AAAA,QACH,GAAIA,QAAO,cAAc,SAAY,EAAE,WAAWA,QAAO,UAAU,IAAI,CAAC;AAAA,MAC1E,CAAC;AACD,aAAO;AAAA,IACT,GAAG,EAAE,QAAQ,MAAM,KAAK,WAAW,OAAO,YAAY,CAAC;AACvD,SAAK,WAAW,IAAI,cAAc,CAAC;AACnC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA,EAIA,MAAM,aAAa,aAAqB,OAAe,WAAqC;AAC1F,QAAI,cAAc,OAAW,MAAK,OAAO,IAAI,OAAO,SAAS;AAC7D,WAAO,QAAQ,MAAM,KAAK,QAAQ,WAAW,GAAG,KAAK;AAAA,EACvD;AAAA,EAEA,MAAM,aAAa,aAAqB,QAAgB,WAAqC;AAC3F,UAAM,QAAQ,QAAQ,MAAM,KAAK,QAAQ,WAAW,GAAG,MAAM,EAAE,SAAS,MAAM;AAC9E,QAAI,cAAc,OAAW,MAAK,OAAO,IAAI,OAAO,SAAS;AAC7D,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,gBAAgB,cAAsB,OAAmE;AAC7G,QAAI,SAAS,MAAM,KAAK,cAAc,YAAY;AAClD,UAAM,YAAY,OAAO,KAAK;AAC9B,QACE,UAAU,UACV,OAAO,cAAc,YACrB,YAAY,KAAK,IAAI,IAAI,OACzB,OAAO,OAAO,eAAe,MAAM,QACnC;AACA,YAAM,YAAY,MAAM,KAAK,kBAAkB,cAAc,KAAK;AAClE,UAAI,UAAW,UAAS,MAAM,KAAK,cAAc,YAAY;AAAA,IAC/D;AACA,WAAO;AAAA,EACT;AACF;;;ACtUA,IAAM,aAAa;AAEZ,IAAM,SAAN,MAAa;AAAA,EACV,SAAS,oBAAI,IAAoB;AAAA;AAAA,EAEzC,IAAI,OAAe,QAAQ,UAAgB;AACzC,QAAI,OAAO,UAAU,YAAY,MAAM,SAAS,WAAY;AAC5D,SAAK,OAAO,IAAI,OAAO,KAAK;AAAA,EAC9B;AAAA,EAEA,UAAU,QAAgC,QAAsB;AAC9D,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,MAAM,EAAG,MAAK,IAAI,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;AAAA,EAC3E;AAAA,EAEA,KAAKC,OAAsB;AACzB,QAAI,OAAOA,UAAS,YAAYA,MAAK,WAAW,EAAG,QAAOA;AAC1D,QAAI,MAAMA;AACV,eAAW,CAAC,OAAO,KAAK,KAAK,KAAK,QAAQ;AACxC,UAAI,IAAI,SAAS,KAAK,EAAG,OAAM,IAAI,MAAM,KAAK,EAAE,KAAK,WAAW,KAAK,GAAG;AAAA,IAC1E;AACA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,OAAe;AACjB,WAAO,KAAK,OAAO;AAAA,EACrB;AACF;;;AC5BA,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,iBAAiBC,MAAqC;AACpE,SACEA,gBAAe,kBACd,OAAOA,SAAQ,YAAYA,SAAQ,QAAQ,aAAaA;AAE7D;AAEO,SAAS,gBAAgBA,MAAoC;AAClE,SACEA,gBAAe,iBACd,OAAOA,SAAQ,YAAYA,SAAQ,QAAQ,YAAYA;AAE5D;;;AC/BO,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,cAAcC,OAA0B;AACtD,MAAIA,UAAS,QAAQ,OAAOA,UAAS,SAAU,QAAOA;AACtD,MAAI,MAAM,QAAQA,KAAI,EAAG,QAAOA,MAAK,IAAI,aAAa;AACtD,QAAM,MAAOA,MAAmC,IAAI;AACpD,MAAI,QAAQ,QAAW;AACrB,UAAM,MAA+B,CAAC;AACtC,eAAW,OAAO,OAAO,KAAKA,KAAI,EAAG,KAAI,GAAG,IAAI,cAAeA,MAAe,GAAG,CAAC;AAClF,WAAO;AAAA,EACT;AACA,QAAM,IAAKA,MAAmC,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;AAGO,SAAS,gBAAgBA,OAAyB;AACvD,MAAIA,UAAS,QAAQ,OAAOA,UAAS,SAAU,QAAO,KAAK,UAAUA,KAAI;AACzE,MAAI,MAAM,QAAQA,KAAI,EAAG,QAAO,IAAIA,MAAK,IAAI,eAAe,EAAE,KAAK,GAAG,CAAC;AACvE,QAAM,OAAO,OAAO,KAAKA,KAAI,EAAE,KAAK;AACpC,SAAO,IAAI,KAAK,IAAI,CAAC,MAAM,GAAG,KAAK,UAAU,CAAC,CAAC,IAAI,gBAAiBA,MAAe,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC;AACrG;;;ACnIA,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;;;ACUO,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;;;ACxCA,SAAS,gBAAgB,OAA0C;AACjE,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,OAAO,OAAO,KAAK;AACzB,MAAI,OAAO,SAAS,IAAI,EAAG,QAAO,KAAK,IAAI,GAAG,OAAO,GAAI;AACzD,QAAM,OAAO,KAAK,MAAM,KAAK;AAC7B,MAAI,CAAC,OAAO,MAAM,IAAI,EAAG,QAAO,KAAK,IAAI,GAAG,OAAO,KAAK,IAAI,CAAC;AAC7D,SAAO;AACT;AAEA,IAAM,mBAAmB,oBAAI,IAAI,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC;AAE7D,SAAS,eAAeC,SAA8D;AAC3F,MAAIA,WAAU,OAAOA,UAAS,IAAK,QAAO;AAC1C,MAAIA,YAAW,IAAK,QAAO;AAC3B,MAAI,iBAAiB,IAAIA,OAAM,KAAKA,WAAU,IAAK,QAAO;AAC1D,SAAO;AACT;AAEO,SAAS,iBAAiB,QAAsC;AACrE,QAAM,YAAY,OAAO,aAAa;AAEtC,WAAS,SAAS,MAAc,OAA0C;AACxE,QAAI;AACJ,QAAI,eAAe,KAAK,IAAI,GAAG;AAC7B,YAAM,IAAI,IAAI,IAAI;AAAA,IACpB,OAAO;AACL,UAAI,CAAC,OAAO,SAAS;AACnB,cAAM,IAAI,cAAc,wBAAwB,IAAI,oCAAoC;AAAA,MAC1F;AACA,YAAM,OAAO,OAAO,QAAQ,SAAS,GAAG,IAAI,OAAO,UAAU,OAAO,UAAU;AAC9E,YAAM,IAAI,IAAI,KAAK,WAAW,GAAG,IAAI,KAAK,MAAM,CAAC,IAAI,MAAM,IAAI;AAAA,IACjE;AACA,QAAI,OAAO;AACT,iBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1C,YAAI,MAAM,OAAW,KAAI,aAAa,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,MACxD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,iBAAeC,MAAK,MAA6C,kBAAkB,OAAqB;AACtG,UAAM,MAAM,SAAS,KAAK,MAAM,KAAK,KAAK;AAC1C,UAAM,UAAU,IAAI,QAAQ,OAAO,cAAc;AACjD,YAAQ,IAAI,UAAU,QAAQ,IAAI,QAAQ,KAAK,kBAAkB;AACjE,QAAI,KAAK,QAAS,YAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,OAAO,EAAG,SAAQ,IAAI,GAAG,CAAC;AAKrF,QAAI;AACJ,QAAI,KAAK,SAAS,QAAW;AAC3B,UACE,OAAO,KAAK,SAAS,YACrB,KAAK,gBAAgB,cACrB,KAAK,gBAAgB,mBACpB,OAAO,aAAa,eAAe,KAAK,gBAAgB,UACzD;AACA,eAAO,KAAK;AAAA,MACd,OAAO;AACL,eAAO,KAAK,UAAU,KAAK,IAAI;AAC/B,YAAI,CAAC,QAAQ,IAAI,cAAc,EAAG,SAAQ,IAAI,gBAAgB,kBAAkB;AAAA,MAClF;AAAA,IACF;AAEA,UAAM,OAAO,YAAY,EAAE,KAAK,QAAQ,CAAC;AAEzC,UAAM,YAAY,KAAK,aAAa,OAAO,aAAa;AACxD,QAAI;AACJ,QAAI;AACF,YAAM,MAAM,UAAU,KAAK;AAAA,QACzB,QAAQ,KAAK,UAAU;AAAA,QACvB;AAAA,QACA,QAAQ,YAAY,QAAQ,SAAS;AAAA,QACrC,GAAI,SAAS,SAAY,EAAE,KAAK,IAAI,CAAC;AAAA,MACvC,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,IAAI,eAAe,6BAA6B,KAAK,UAAU,KAAK,IAAI,IAAI,IAAI,GAAG,IAAI,QAAQ,IAAI;AAAA,QACvG;AAAA,MACF,CAAC;AAAA,IACH;AAGA,QAAI,KAAK,IAAK,QAAO;AAErB,UAAM,OAAO,eAAe,IAAI,MAAM;AACtC,QAAI,SAAS,MAAM;AACjB,YAAMC,QAAO,MAAM,IAAI,KAAK;AAC5B,UAAIA,MAAK,WAAW,EAAG,QAAO;AAC9B,YAAM,cAAc,IAAI,QAAQ,IAAI,cAAc,KAAK;AACvD,UAAI,YAAY,SAAS,MAAM,EAAG,QAAO,KAAK,MAAMA,KAAI;AACxD,UAAI;AACF,eAAO,KAAK,MAAMA,KAAI;AAAA,MACxB,QAAQ;AACN,eAAOA;AAAA,MACT;AAAA,IACF;AAEA,QAAI,SAAS,kBAAkB,CAAC,mBAAmB,OAAO,gBAAgB;AACxE,YAAM,YAAY,MAAM,OAAO,eAAe;AAC9C,UAAI,UAAW,QAAOD,MAAK,MAAM,IAAI;AAAA,IACvC;AAEA,UAAM,eAAe,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE,GAAG,MAAM,GAAG,GAAG;AACnE,UAAM,cAAiC,EAAE,QAAQ,IAAI,QAAQ,aAAa,KAAK,IAAI,SAAS,EAAE;AAC9F,UAAM,aAAa,OAAO,gBAAgB,WAAW;AACrD,QAAI,sBAAsB,MAAO,OAAM;AACvC,UAAM,YAAY,eAAe,SAAS,iBAAiB,aAAa;AAExE,UAAM,UAAU,sBAAsB,IAAI,MAAM,QAAQ,KAAK,UAAU,KAAK,IAAI,IAAI,QAAQ,GAC1F,cAAc,WAAM,WAAW,KAAK,EACtC;AACA,QAAI,cAAc,SAAS;AACzB,YAAM,IAAI,eAAe,SAAS;AAAA,QAChC,cAAc,gBAAgB,IAAI,QAAQ,IAAI,aAAa,CAAC;AAAA,MAC9D,CAAC;AAAA,IACH;AACA,UAAM,IAAI,cAAc,OAAO;AAAA,EACjC;AAEA,SAAO;AAAA,IACL,KAAK,CAAC,MAAM,SAASA,MAAK,EAAE,GAAG,MAAM,MAAM,QAAQ,MAAM,CAAC;AAAA,IAC1D,QAAQ,CAAC,MAAM,SAASA,MAAK,EAAE,GAAG,MAAM,MAAM,QAAQ,SAAS,CAAC;AAAA,IAChE,MAAM,CAAC,MAAM,MAAM,SAASA,MAAK,EAAE,GAAG,MAAM,MAAM,MAAM,QAAQ,OAAO,CAAC;AAAA,IACxE,KAAK,CAAC,MAAM,MAAM,SAASA,MAAK,EAAE,GAAG,MAAM,MAAM,MAAM,QAAQ,MAAM,CAAC;AAAA,IACtE,OAAO,CAAC,MAAM,MAAM,SAASA,MAAK,EAAE,GAAG,MAAM,MAAM,MAAM,QAAQ,QAAQ,CAAC;AAAA,IAC1E,SAAS,CAAC,SAASA,MAAK,IAAI;AAAA,EAC9B;AACF;;;AC/KA,SAAS,YAAY,uBAAuB;AAG5C,IAAM,qBAAqB,IAAI,KAAK;AAEpC,SAAS,UAAU,GAAW,GAAoB;AAChD,QAAM,KAAK,OAAO,KAAK,CAAC;AACxB,QAAM,KAAK,OAAO,KAAK,CAAC;AACxB,MAAI,GAAG,WAAW,GAAG,OAAQ,QAAO;AACpC,SAAO,gBAAgB,IAAI,EAAE;AAC/B;AAEA,SAAS,OAAO,KAA0B,MAAkC;AAC1E,SAAO,IAAI,QAAQ,KAAK,YAAY,CAAC;AACvC;AAEA,eAAsB,mBACpB,QACA,KACAE,SACA,QAAQ,KAAK,IAAI,GACC;AAClB,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO;AAAA,IACT,KAAK,cAAc;AACjB,YAAM,WAAW,OAAO,KAAK,OAAO,MAAM;AAC1C,UAAI,CAAC,SAAU,QAAO;AACtB,YAAM,SAAS,WAAW,UAAUA,OAAM,EAAE,OAAO,IAAI,OAAO,EAAE,OAAO,OAAO,QAAQ;AACtF,YAAM,YAAY,OAAO,UAAU,MAAM;AACzC,aAAO,UAAU,UAAU,QAAQ;AAAA,IACrC;AAAA,IACA,KAAK,gBAAgB;AACnB,YAAM,KAAK,OAAO,KAAK,2BAA2B;AAClD,YAAM,WAAW,OAAO,KAAK,mBAAmB;AAChD,UAAI,CAAC,MAAM,CAAC,SAAU,QAAO;AAC7B,YAAM,MAAM,KAAK,IAAI,QAAQ,OAAO,EAAE,IAAI,GAAI;AAC9C,UAAI,CAAC,OAAO,SAAS,GAAG,KAAK,MAAM,mBAAoB,QAAO;AAC9D,YAAM,OAAO,MAAM,EAAE,IAAI,OAAO,KAAK,IAAI,OAAO,EAAE,SAAS,MAAM,CAAC;AAClE,YAAM,WAAW,QAAQ,WAAW,UAAUA,OAAM,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK;AAC/E,aAAO,UAAU,UAAU,QAAQ;AAAA,IACrC;AAAA,IACA,KAAK;AACH,aAAO,OAAO,OAAO,KAAKA,OAAM;AAAA,EACpC;AACF;;;AClCO,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;AAiTO,SAAS,YAAY,OAAuE;AACjG,SACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAQ,MAA2B,OAAO,YAC1C,OAAQ,MAAoC,gBAAgB;AAEhE;;;AC9fO,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;AAGA,eAAsB,UACpB,KACA,KACA,UACA,MACkB;AAClB,QAAM,QAAQ,MAAM,eAAe,IAAI,OAAO,YAAY,CAAC,GAAG,GAAG,IAAI,QAAQ;AAC7E,QAAM,SAAS,MAAM,IAAI,IAAI,KAAK,KAAK;AACvC,SAAO,eAAe,IAAI,QAAQ,QAAQ,GAAG,IAAI,SAAS;AAC5D;AAIO,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,QAAM,UAAyC,CAAC;AAChD,QAAM,YAAa,IAAI,WAAW,CAAC;AACnC,aAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,SAAS,GAAG;AAClD,YAAQ,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,SAASC,MAAK;AACZ,cAAM,IAAI,cAAc,IAAI,IAAI,sCAAuCA,KAAc,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;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;AAiCO,SAAS,yBACd,WACmB;AACnB,MAAI,CAAC,YAAY,SAAS,EAAG,OAAM,IAAI,UAAU,2CAA2C;AAC5F,QAAM,OAAO,UAAU;AAEvB,QAAM,UAAW,UAAU,KAAK,OAAO,EAAE,SAAS,KAAK,KAAK,IAAI,KAAK;AAIrE,QAAM,OAAkC,CAAC;AACzC,aAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACH,aAAK,IAAI,IAAI;AAAA,UACX,MAAM;AAAA,UACN,QAAQ,CAAC,GAAG,KAAK,MAAM;AAAA,UACvB,MAAM,KAAK;AAAA,UACX,GAAI,KAAK,aAAa,SAAY,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,UACjE,GAAI,KAAK,aAAa,SAAY,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,QACnE;AACA;AAAA,MACF,KAAK;AACH,aAAK,IAAI,IAAI;AAAA,UACX,MAAM;AAAA,UACN,IAAI,KAAK;AAAA,UACT,MAAM,KAAK;AAAA,UACX,GAAI,KAAK,WAAW,SAAY,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,UAC3D,GAAI,KAAK,aAAa,SAAY,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,QACnE;AACA;AAAA,MACF,KAAK;AACH,aAAK,IAAI,IAAI,EAAE,MAAM,SAAS,GAAI,KAAK,aAAa,SAAY,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC,EAAG;AAClG;AAAA,MACF,KAAK;AACH,aAAK,IAAI,IAAI;AAAA,UACX,MAAM;AAAA,UACN,QAAQ,CAAC,GAAI,KAAK,UAAU,CAAC,CAAE;AAAA,UAC/B,GAAI,KAAK,aAAa,SAAY,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,QACnE;AACA;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,UAAwC,CAAC;AAC/C,QAAM,UAAU,KAAK,sBAAsB;AAC3C,GAAC,SAAS,KAAK,MAAmB,MAAgB;AAChD,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,YAAM,IAAI,CAAC,GAAG,MAAM,GAAG;AACvB,UAAI,SAAS,KAAK,GAAG;AACnB,cAAM,IAAI;AACV,gBAAQ,KAAK;AAAA,UACX,MAAM,EAAE,KAAK,GAAG;AAAA,UAChB,QAAQ,EAAE;AAAA,UACV,WAAW,YAAY,GAAG,OAAO;AAAA,UACjC,GAAI,EAAE,aAAa,SAAY,EAAE,UAAU,EAAE,SAAS,IAAI,CAAC;AAAA,QAC7D,CAAC;AAAA,MACH,OAAO;AACL,aAAK,OAAsB,CAAC;AAAA,MAC9B;AAAA,IACF;AAAA,EACF,GAAG,KAAK,WAAW,CAAC,GAAG,CAAC,CAAC;AAEzB,QAAM,WAA0C,CAAC;AACjD,aAAW,CAAC,IAAI,IAAI,KAAK,OAAO,QAAQ,KAAK,YAAY,CAAC,CAAC,GAAG;AAC5D,QAAI,KAAK,cAAc,WAAW;AAChC,eAAS,KAAK;AAAA,QACZ;AAAA,QACA,UAAU;AAAA,QACV,cAAc,KAAK,SAAS;AAAA,QAC5B,OAAO,KAAK;AAAA,QACZ,GAAI,KAAK,aAAa,SAAY,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,MACnE,CAAC;AAAA,IACH,OAAO;AACL,eAAS,KAAK;AAAA,QACZ;AAAA,QACA,UAAU;AAAA,QACV,GAAI,KAAK,UAAU,YAAY,SAAY,EAAE,iBAAiB,KAAK,SAAS,QAAQ,IAAI,CAAC;AAAA,QACzF,GAAI,KAAK,UAAU,UAAU,SAAY,EAAE,eAAe,KAAK,SAAS,MAAM,IAAI,CAAC;AAAA,QACnF,GAAI,KAAK,aAAa,SAAY,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,MACnE,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT;AAAA,IACA;AAAA,IACA,GAAI,KAAK,kBAAkB,SACvB;AAAA,MACE,eAAe;AAAA,QACb,GAAI,KAAK,cAAc,YAAY,SAAY,EAAE,SAAS,KAAK,cAAc,QAAQ,IAAI,CAAC;AAAA,MAC5F;AAAA,IACF,IACA,CAAC;AAAA,IACL,GAAI,KAAK,oBAAoB,SAAY,EAAE,iBAAiB,EAAE,SAAS,KAAK,gBAAgB,QAAQ,EAAE,IAAI,CAAC;AAAA,IAC3G;AAAA,IACA,GAAI,KAAK,aAAa,SAAY,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,IACjE,GAAI,OAAO,KAAK,aAAa,WACzB,EAAE,UAAU,KAAK,SAAS,IAC1B,KAAK,aAAa,SAChB,EAAE,UAAU,KAAK,SAAS,IAAI,eAAe,KAAK,SAAS,IAC3D,CAAC;AAAA,IACP,GAAI,KAAK,YAAY,SAAY,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,IAC9D,GAAI,KAAK,sBAAsB,SAAY,EAAE,mBAAmB,KAAK,kBAAkB,IAAI,CAAC;AAAA,IAC5F,GAAI,KAAK,YAAY,SAAY,EAAE,eAAe,KAAK,QAAQ,OAAO,KAAK,IAAI,CAAC;AAAA,EAClF;AACF;;;ACtWA,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,QAAIC;AACJ,UAAM,SAAS;AACf,QAAI,OAAO,OAAO,iBAAiB,WAAY,CAAAA,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,CAAAA,QAAO,QAAQ,QAAQ,EAAE,iBAAiB,MAAM,CAAC;AAAA,IAChE;AACA,QAAIA,UAAS,OAAW,QAAO;AAC/B,WAAO,cAAc,cAAcA,KAAiB,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;;;ACnBO,SAAS,YAAY,MAAkD,MAAwB;AACpG,QAAM,OAAO,KAAK;AAClB,MAAI,UAAU,QAAQ,OAAO,KAAK,SAAS,SAAU,QAAO;AAC5D,QAAM,OAAQ,KAAkC,IAAI;AACpD,MAAI,CAAC,KAAM,OAAM,IAAI,cAAc,aAAa,KAAK,EAAE,wBAAwB,IAAI,GAAG;AACtF,SAAO;AACT;AAEO,SAAS,gBAAgB,MAA6E;AAC3G,SAAO,OAAO,KAAK,aAAa,WAAW,KAAK,WAAW;AAC7D;AAEO,SAAS,aAAa,MAAgB,QAA+D;AAC1G,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,CAAC,EAAE,QAAQ,MAAM;AACtB,gBAAQ,IAAI,iBAAiB,UAAU,OAAO,cAAc,KAAK,EAAE,EAAE;AAAA,MACvE;AAAA,IACF,KAAK,UAAU;AACb,YAAM,SAAS,KAAK,UAAU,OAAO,OAAO,SAAS,KAAK;AAC1D,UAAI,KAAK,OAAO,SAAS;AACvB,eAAO,CAAC,EAAE,IAAI,MAAM;AAClB,cAAI,aAAa,IAAI,KAAK,MAAM,OAAO,SAAS,KAAK,EAAE;AAAA,QACzD;AAAA,MACF;AACA,aAAO,CAAC,EAAE,QAAQ,MAAM;AACtB,gBAAQ,IAAI,KAAK,MAAM,KAAK;AAAA,MAC9B;AAAA,IACF;AAAA,IACA,KAAK;AACH,aAAO,CAAC,EAAE,QAAQ,MAAM;AACtB,gBAAQ;AAAA,UACN;AAAA,UACA,SAAS,OAAO,KAAK,GAAG,OAAO,UAAU,KAAK,EAAE,IAAI,OAAO,UAAU,KAAK,EAAE,EAAE,EAAE,SAAS,QAAQ,CAAC;AAAA,QACpG;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO,CAAC,QAAQ,KAAK,KAAK,KAAK,MAAM;AAAA,EACzC;AACF;AAQA,eAAe,YAAY,IAAQ,WAAoC;AACrE,QAAM,EAAE,KAAK,IAAI,MAAM,GAAG;AAAA,IACxB;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AACA,MAAI,CAAC,KAAK,CAAC,EAAG,OAAM,IAAI,cAAc,WAAW,SAAS,YAAY;AACtE,SAAO,KAAK,CAAC,EAAE;AACjB;AAEO,SAAS,mBAAmB,MAA0G;AAC3I,iBAAe,cAAc,KAAa,KAAuD,QAAgB;AAC/G,UAAM,aAAc,IAAI,eAAe,CAAC,GAAmD,MAAM;AACjG,QAAI,CAAC,UAAW,OAAM,IAAI,cAAc,eAAe,MAAM,mBAAmB;AAChF,UAAM,cAAc,MAAM,YAAY,KAAK,IAAI,IAAI,UAAU;AAC7D,UAAM,YAAa,IAAI,QAAQ,WAAW,KAA4B;AACtE,UAAM,OAAO,MAAM,KAAK,OAAO,eAAe;AAAA,MAC5C;AAAA,MACA,WAAW,IAAI;AAAA,MACf,cAAc,IAAI;AAAA,MAClB,KAAK,IAAI;AAAA,MACT;AAAA,MACA,aAAa,UAAU;AAAA,MACvB,OAAO,UAAU,SAAS;AAAA,MAC1B;AAAA,IACF,CAAC;AACD,QAAI,CAAC,MAAM;AACT,YAAM,IAAI;AAAA,QACR,YAAY,UAAU,EAAE,oBAAoB,MAAM;AAAA,MACpD;AAAA,IACF;AACA,WAAO,EAAE,aAAa,WAAW,KAAK;AAAA,EACxC;AAEA,SAAO;AAAA,IACL,MAAM,iBAAiB,KAAa,KAAuD,OAAwB;AACjH,YAAM,MAA+B,CAAC;AACtC,YAAM,UAAU,OAAO,QAAS,IAAI,eAAe,CAAC,CAAiD;AACrG,UAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,YAAM,cAAc,MAAM,YAAY,KAAK,IAAI,IAAI,UAAU;AAE7D,iBAAW,CAAC,QAAQ,SAAS,KAAK,SAAS;AACzC,cAAM,OAAO,UAAU;AACvB,cAAM,QAAQ,gBAAgB,IAAI;AAClC,cAAM,YAAa,IAAI,QAAQ,WAAW,KAA4B;AAEtE,YAAI,MAAM,IAAI,qBAAqB,WAAW,OAAO,MAAM,WAAW,UAAU;AAC9E,gBAAM,OAAO,MAAM,QAAQ;AAC3B,cAAI,CAAC,MAAM;AACT,kBAAM,IAAI;AAAA,cACR,kBAAkB,UAAU,EAAE,IAAI,KAAK,KAAK,GAAG,CAAC;AAAA,YAClD;AAAA,UACF;AACA,gBAAM,EAAE,KAAK,IAAI,MAAM,cAAc,KAAK,KAAK,MAAM;AACrD,cAAI,CAAC,YAAY,WAAwB,KAAK,sBAAsB,MAAS,GAAG;AAC9E,iBAAK,gBAAgB;AAAA,UACvB;AACA,gBAAM,OAAO,YAAY,MAAM,KAAK,SAAS;AAC7C,gBAAM,SAAS,MAAM,KAAK,OAAO,gBAAgB,KAAK,IAAI,OAAO,MAAM;AAEvE,gBAAM,OAAO,cAAc;AAAA,YACzB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,QAAQ,OAAO;AAAA,YACf,QAAQ,KAAK;AAAA,YACb,gBAAgB,KAAK;AAAA,YACrB,GAAI,KAAK,cAAc,SAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,YACpE,GAAI,UAAU,kBAAkB,SAAY,EAAE,eAAe,UAAU,cAAc,IAAI,CAAC;AAAA,UAC5F,CAAC;AACD,iBAAO,UAAU,WAAwB,MAAM,OAAO,GAAG,UAAU,EAAE,IAAI,KAAK,KAAK,GAAG,CAAC,EAAE;AAAA,QAC3F,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT;AAAA,IAEA,MAAM,eAAe,KAAa,KAAuD;AACvF,YAAM,QAAQ,OAAO,KAAM,IAAI,WAAW,CAAC,CAA6B;AACxE,UAAI,MAAM,WAAW,EAAG,QAAO,CAAC;AAChC,YAAM,cAAc,MAAM,YAAY,KAAK,IAAI,IAAI,UAAU;AAC7D,YAAM,MAA8B,CAAC;AACrC,iBAAW,QAAQ,OAAO;AACxB,cAAM,QAAQ,MAAM,KAAK,OAAO,eAAe,aAAa,IAAI;AAChE,YAAI,UAAU,MAAM;AAClB,gBAAM,IAAI,cAAc,WAAW,IAAI,0DAAqD;AAAA,QAC9F;AACA,YAAI,IAAI,IAAI;AAAA,MACd;AACA,aAAO;AAAA,IACT;AAAA,IAEA,MAAM,UACJ,KACA,KACA,OACA,MACkC;AAClC,YAAM,OAAO,MAAM,QAAQ;AAC3B,UAAI,CAAC,MAAM;AACT,cAAM,IAAI,cAAc,cAAc,KAAK,WAAW,IAAI,KAAK,QAAQ,mBAAmB;AAAA,MAC5F;AACA,YAAM,EAAE,WAAW,KAAK,IAAI,MAAM,cAAc,KAAK,KAAK,KAAK,MAAM,UAAU;AAC/E,YAAM,OAAO,UAAU;AACvB,UAAI,CAAC,KAAK,eAAe;AACvB,cAAM,IAAI,cAAc,eAAe,KAAK,MAAM,UAAU,MAAM,UAAU,EAAE,wBAAwB;AAAA,MACxG;AACA,YAAM,QAAQ,gBAAgB,IAAI;AAClC,YAAM,OAAO,YAAY,MAAM,KAAK,SAAS;AAC7C,YAAM,SAAS,MAAM,KAAK,OAAO,gBAAgB,KAAK,IAAI,OAAO,MAAM;AACvE,YAAM,OAAO,cAAc;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,OAAO;AAAA,QACf,QAAQ,KAAK;AAAA,QACb,gBAAgB,KAAK;AAAA,QACrB,GAAI,KAAK,cAAc,SAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,MACtE,CAAC;AACD,aAAO,KAAK,cAAc,KAAK,MAAM,KAAK,OAAO;AAAA,IACnD;AAAA,IAEA,MAAM,YACJ,KACA,KACA,OACA,MACoC;AACpC,YAAM,OAAO,MAAM,QAAQ;AAC3B,UAAI,CAAC,KAAM,OAAM,IAAI,cAAc,WAAW,KAAK,UAAU,uBAAuB;AACpF,YAAM,EAAE,WAAW,KAAK,IAAI,MAAM,cAAc,KAAK,KAAK,KAAK,QAAQ,UAAU;AACjF,YAAM,OAAO,UAAU;AACvB,UAAI,CAAC,KAAK,iBAAiB;AACzB,cAAM,IAAI,cAAc,eAAe,KAAK,QAAQ,UAAU,MAAM,UAAU,EAAE,0BAA0B;AAAA,MAC5G;AACA,YAAM,QAAQ,gBAAgB,IAAI;AAClC,YAAM,OAAO,YAAY,MAAM,KAAK,SAAS;AAC7C,YAAM,SAAS,MAAM,KAAK,OAAO,gBAAgB,KAAK,IAAI,OAAO,MAAM;AACvE,YAAM,OAAO,cAAc;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,OAAO;AAAA,QACf,QAAQ,KAAK;AAAA,QACb,gBAAgB,KAAK;AAAA,QACrB,GAAI,KAAK,cAAc,SAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,MACtE,CAAC;AACD,aAAO,KAAK,gBAAgB,IAAI,MAAM,KAAK,SAAS,KAAK,OAAO;AAAA,IAClE;AAAA,EACF;AACF;AAIO,SAAS,cAAc,MAWhB;AACZ,QAAM,UAAU,KAAK,KAAK,WAAW,KAAK,OAAO;AACjD,QAAM,aAA8C,KAAK,OAAO;AAChE,MAAI,SAAS,KAAK;AAElB,QAAM,OAAO,iBAAiB;AAAA,IAC5B,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC3C,GAAI,KAAK,KAAK,mBAAmB,SAAY,EAAE,gBAAgB,KAAK,KAAK,eAAe,IAAI,CAAC;AAAA,IAC7F,GAAI,KAAK,cAAc,SAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,IACpE,GAAI,KAAK,kBAAkB,SAAY,EAAE,eAAe,KAAK,cAAc,IAAI,CAAC;AAAA,IAChF,WAAW,OAAO,QAAQ;AACxB,YAAM,QAAQ,aAAa,KAAK,MAAM,MAAM;AAC5C,YAAM,QAAQ,GAAG;AAAA,IACnB;AAAA,IACA,GAAI,KAAK,KAAK,SAAS,YAAY,eAAe,SAC9C;AAAA,MACE,gBAAgB,YAAY;AAC1B,cAAM,YAAY,MAAM,KAAK,OAAO,kBAAkB,KAAK,KAAK,IAAI,UAAU;AAC9E,YAAI,WAAW;AACb,oBAAU,MAAM,KAAK,OAAO,cAAc,KAAK,KAAK,EAAE,GAAG;AAAA,QAC3D;AACA,eAAO;AAAA,MACT;AAAA,IACF,IACA,CAAC;AAAA,EACP,CAAC;AAED,QAAM,SAAiB,EAAE,OAAO;AAAA,EAAC,GAAG,OAAO;AAAA,EAAC,GAAG,QAAQ;AAAA,EAAC,EAAE;AAC1D,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,MACJ,MAAM,KAAK,KAAK;AAAA,MAChB,GAAI,KAAK,KAAK,cAAc,YAAY,EAAE,MAAM,KAAK,KAAK,UAAU,IAAI,CAAC;AAAA,MACzE;AAAA,IACF;AAAA,IACA,QAAQ,KAAK,UAAU;AAAA,IACvB,GAAI,KAAK,mBAAmB,SAAY,EAAE,gBAAgB,KAAK,eAAe,IAAI,CAAC;AAAA,EACrF;AACF;;;AC3QA,SAAS,yBAAyB;;;ACMlC,eAAsB,QAAQ,QAAkB,MAAkC;AAChF,QAAM,QAAQ,KAAK,YAAY,SAAY,IAAI,KAAK,KAAK,OAAO,EAAE,YAAY,KAAI,oBAAI,KAAK,GAAE,YAAY;AACzG,MAAI,KAAK,cAAc,QAAW;AAChC,UAAM,OAAO;AAAA,MACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA;AAAA,QACE,KAAK;AAAA,QACL,KAAK,UAAU,KAAK,OAAO;AAAA,QAC3B;AAAA,QACA,KAAK,YAAY;AAAA,QACjB,KAAK,OAAO;AAAA,QACZ,KAAK;AAAA,QACL,KAAK,eAAe;AAAA,MACtB;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM,OAAO;AAAA,MACX;AAAA;AAAA,MAEA,CAAC,KAAK,MAAM,KAAK,UAAU,KAAK,OAAO,GAAG,OAAO,KAAK,YAAY,GAAG,KAAK,OAAO,MAAM,KAAK,eAAe,EAAE;AAAA,IAC/G;AAAA,EACF;AACF;AAUA,IAAM,gBAAgB;AAGtB,eAAsB,MACpB,IACA,MACA,OAC4B;AAC5B,SAAO,GAAG,GAAG,OAAO,MAAM;AACxB,UAAM,SAAoB,CAAC;AAC3B,UAAM,YAAY,QAAQ,KAAK,SAAS,IAAI,kCAAkC,OAAO,KAAK,IAAI,CAAC,OAAO;AACtG,UAAM,aAAa,SAAS,MAAM,SAAS,IAAI,mBAAmB,OAAO,KAAK,KAAK,CAAC,MAAM;AAC1F,UAAM,EAAE,KAAK,IAAI,MAAM,EAAE;AAAA,MAOvB;AAAA;AAAA;AAAA;AAAA,WAIK,SAAS;AAAA,WACT,UAAU;AAAA;AAAA;AAAA;AAAA,MAIf;AAAA,IACF;AACA,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,CAAC,IAAK,QAAO;AAGjB,UAAM,EAAE;AAAA,MACN;AAAA,6CACuC,aAAa;AAAA;AAAA;AAAA;AAAA,MAIpD,CAAC,IAAI,EAAE;AAAA,IACT;AACA,WAAO;AAAA,MACL,IAAI,IAAI;AAAA,MACR,MAAM,IAAI;AAAA,MACV,SAAS,IAAI;AAAA,MACb,UAAU,IAAI,WAAW;AAAA,MACzB,aAAa,IAAI;AAAA,IACnB;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,UAAU,IAAQ,OAA8B;AACpE,QAAM,GAAG;AAAA,IACP,yDAAyD,aAAa;AAAA,IACtE,CAAC,KAAK;AAAA,EACR;AACF;AAEA,eAAsB,SAAS,IAAQ,OAA8B;AACnE,QAAM,GAAG,MAAM,wCAAwC,CAAC,KAAK,CAAC;AAChE;AAGA,eAAsB,KAAK,IAAQ,KAAiB,OAA8B;AAChF,MAAI,IAAI,YAAY,IAAI,aAAa;AACnC,UAAM,GAAG;AAAA,MACP;AAAA,MACA,CAAC,IAAI,IAAI,MAAM,MAAM,GAAG,GAAI,CAAC;AAAA,IAC/B;AACA;AAAA,EACF;AACA,QAAM,eAAe,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,QAAQ;AACxD,QAAM,GAAG;AAAA,IACP;AAAA;AAAA;AAAA,IAGA,CAAC,IAAI,IAAI,MAAM,MAAM,GAAG,GAAI,GAAG,OAAO,YAAY,CAAC;AAAA,EACrD;AACF;;;AC5HO,IAAM,eAAN,cAA2B,MAAM;AAAA,EACtC,YAAqB,QAAgB;AACnC,UAAM,0BAA0B,MAAM,4BAAuB;AAD1C;AAEnB,SAAK,OAAO;AAAA,EACd;AAAA,EAHqB;AAIvB;;;AFgCA,SAAS,eAAeC,MAAyB;AAC/C,QAAM,IAAIA,gBAAe,QAAQA,OAAM,IAAI,MAAM,OAAOA,IAAG,CAAC;AAC5D,SAAO;AAAA,IACL,MAAM,EAAE;AAAA,IACR,SAAS,EAAE;AAAA,IACX,WAAW,iBAAiBA,IAAG;AAAA,IAC/B,UAAU,gBAAgBA,IAAG;AAAA,IAC7B,GAAI,EAAE,UAAU,SAAY,EAAE,OAAO,EAAE,MAAM,MAAM,IAAI,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,EAAE,IAAI,CAAC;AAAA,EACxF;AACF;AAEA,eAAsB,WAAW,MAAkB,OAAoC;AACrF,QAAM,EAAE,GAAG,IAAI;AACf,QAAM,EAAE,MAAM,QAAQ,IAAI,MAAM,GAAG,MAAc,oCAAoC,CAAC,KAAK,CAAC;AAC5F,QAAM,MAAM,QAAQ,CAAC;AACrB,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,CAAC,aAAa,UAAU,WAAW,EAAE,SAAS,IAAI,MAAM,EAAG,QAAO;AACtE,MAAI,CAAC,IAAI,YAAY;AACnB,UAAM,GAAG,MAAM,mFAAmF;AAAA,MAChG;AAAA,MACA,KAAK,UAAU,EAAE,MAAM,eAAe,SAAS,qBAAqB,CAAC;AAAA,IACvE,CAAC;AACD,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,MAAM,KAAK,eAAe,IAAI,UAAU;AACpD,MAAI,QAAQ,IAAI,UAAU,OAAO,SAAY,cAAc,IAAI,KAAK;AAGpE,QAAM,cACJ,IAAI,SACH,IAAI,QAAwC,SAC5C,IAAI,QAAqD,OAAO;AACnE,MAAI,gBAAgB,UAAa,UAAU,QAAW;AACpD,QAAI;AACF,cAAQ,MAAM,eAAe,aAAa,OAAO,eAAe,IAAI,EAAE,SAAS;AAAA,IACjF,SAASA,MAAK;AACZ,YAAM,GAAG,MAAM,mFAAmF;AAAA,QAChG;AAAA,QACA,KAAK,UAAU,eAAeA,IAAG,CAAC;AAAA,MACpC,CAAC;AACD,aAAO;AAAA,IACT;AAAA,EACF;AAGA,MAAI,IAAI,WAAW,YAAY,IAAI,aAAa;AAC9C,UAAM,MACJ,IAAI,oBACH,OAAO,IAAI,YAAY,QAAQ,aAAa,OAAO,IAAI,YAAY,IAAI,KAAc,CAAC,IAAI;AAC7F,UAAM,WAAW,MAAM,GAAG,GAAG,OAAO,MAAM;AACxC,YAAM,EAAE,MAAM,sDAAsD,CAAC,OAAO,GAAG,CAAC;AAChF,YAAM,EAAE,KAAK,IAAI,MAAM,EAAE;AAAA,QACvB;AAAA;AAAA;AAAA;AAAA,QAIA,CAAC,IAAI,YAAY,IAAI,eAAe,IAAI,KAAK,KAAK,KAAK;AAAA,MACzD;AACA,YAAMC,UAAS,OAAO,KAAK,CAAC,GAAG,KAAK,CAAC;AACrC,UAAIA,UAAS,IAAI,YAAa,MAAO,QAAO;AAC5C,WAAK,IAAI,YAAa,cAAc,aAAa,QAAQ;AACvD,cAAM,EAAE;AAAA,UACN;AAAA,UACA,CAAC,OAAO,KAAK,UAAU,EAAE,MAAM,mBAAmB,SAAS,qCAAqC,CAAC,CAAC;AAAA,QACpG;AACA,eAAO;AAAA,MACT;AACA,YAAM,QAAQ,GAAG;AAAA,QACf,MAAM;AAAA,QACN,SAAS,EAAE,MAAM;AAAA,QACjB,SAAS,KAAK,IAAI,IAAI;AAAA,QACtB,WAAW,OAAO,KAAK;AAAA,MACzB,CAAC;AACD,aAAO;AAAA,IACT,CAAC;AACD,QAAI,aAAa,OAAQ,QAAO;AAChC,QAAI,aAAa,QAAS,QAAO;AAAA,EACnC;AAEA,QAAM,UAAU,IAAI,UAAU;AAC9B,QAAM,GAAG;AAAA,IACP;AAAA;AAAA,IAEA,CAAC,OAAO,OAAO;AAAA,EACjB;AAGA,QAAM,EAAE,MAAM,SAAS,IAAI,MAAM,GAAG;AAAA,IAClC;AAAA,IACA,CAAC,KAAK;AAAA,EACR;AACA,QAAM,UAAU,oBAAI,IAAqB;AACzC,aAAW,KAAK,SAAU,SAAQ,IAAI,GAAG,EAAE,IAAI,IAAI,EAAE,UAAU,IAAI,CAAC;AAEpE,QAAM,cAAc,oBAAI,IAAoB;AAC5C,QAAM,UAAU,CAAC,SAAyB;AACxC,UAAM,KAAK,YAAY,IAAI,IAAI,KAAK,KAAK;AACzC,gBAAY,IAAI,MAAM,CAAC;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,YAAiG,CAAC;AACxG,QAAM,SAAS,IAAI,kBAA8B;AACjD,QAAM,eAAe,mBAAmB,IAAI,KAAK;AAEjD,QAAM,MAAM,CAAC,OAAkC,KAAa,MAAgC,SAAkB;AAC5G,SAAK,GACF,MAAM,wFAAwF;AAAA,MAC7F;AAAA,MACA,QAAQ,OAAO,SAAS,GAAG,QAAQ;AAAA,MACnC;AAAA,MACA,KAAK,KAAK,GAAG;AAAA,MACb,OAAO,KAAK,KAAK,KAAK,UAAU,cAAc,IAAI,CAAC,CAAC,IAAI;AAAA,IAC1D,CAAC,EACA,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACnB;AACA,QAAM,SAAiB;AAAA,IACrB,MAAM,CAAC,GAAG,SAAS,IAAI,QAAQ,GAAG,IAAI;AAAA,IACtC,MAAM,CAAC,GAAG,SAAS,IAAI,QAAQ,GAAG,IAAI;AAAA,IACtC,OAAO,CAAC,GAAG,SAAS,IAAI,SAAS,GAAG,IAAI;AAAA,EAC1C;AAEA,QAAM,QAAQ;AAAA,IACZ,UAAU;AACR,YAAM,IAAI,OAAO,SAAS;AAC1B,UAAI,CAAC,EAAG,QAAO;AACf,aAAO;AAAA,QACL,MAAM,EAAE;AAAA,QACR,YAAY,EAAE;AAAA,QACd,gBAAgB,EAAE;AAAA,QAClB,iBAAiB,MAAM;AACrB,YAAE,cAAc;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,MAAM,KAAK,iBAAiB,KAAK,KAAK,KAAK;AAC/D,QAAM,UAAU,MAAM,KAAK,eAAe,KAAK,GAAG;AAElD,QAAM,kBAAkB,OAAO,SAAiB,WAAmC;AACjF,UAAM,GAAG,GAAG,OAAO,MAAM;AACvB,YAAM,EAAE,MAAM,8DAA8D;AAAA,QAC1E;AAAA,QACA,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,EAAE,YAAY;AAAA,MAC7C,CAAC;AACD,YAAM,QAAQ,GAAG;AAAA,QACf,MAAM;AAAA,QACN,SAAS,EAAE,MAAM;AAAA,QACjB,SAAS,KAAK,IAAI,IAAI;AAAA,QACtB,WAAW,OAAO,KAAK;AAAA,MACzB,CAAC;AAAA,IACH,CAAC;AACD,UAAM,IAAI,aAAa,MAAM;AAAA,EAC/B;AAEA,QAAM,MAA+B;AAAA,IACnC,MAAM,KAAQ,MAAc,IAA0B,MAAgC;AACpF,UAAI,OAAO,SAAS,YAAY,KAAK,WAAW,KAAK,KAAK,WAAW,GAAG,GAAG;AACzE,cAAM,IAAI,cAAc,+BAA+B,KAAK,UAAU,IAAI,CAAC,2BAA2B;AAAA,MACxG;AACA,UAAI,OAAO,SAAS,GAAG;AACrB,cAAM,IAAI,cAAc,aAAa,IAAI,0BAA0B,OAAO,SAAS,EAAG,IAAI,4BAAuB;AAAA,MACnH;AACA,YAAM,aAAa,QAAQ,IAAI;AAC/B,YAAM,MAAM,GAAG,IAAI,IAAI,UAAU;AACjC,YAAM,MAAM,QAAQ,IAAI,GAAG;AAE3B,UAAI,KAAK,WAAW,aAAa;AAC/B,cAAM,QAAQ,cAAc,IAAI,MAAmB;AACnD,YAAI,MAAM,KAAM,WAAU,KAAK,EAAE,MAAM,YAAY,MAAM,MAAM,KAAK,KAAM,KAAK,EAAE,CAAC;AAClF,eAAO;AAAA,MACT;AACA,UAAI,KAAK,WAAW,UAAU;AAG5B,cAAM,MAAM,IAAI,OAAO,WAAW;AAClC,cAAM,IAAI,OAAO,SAAS,mBAAmB,IAAI,eAAe,GAAG,IAAI,IAAI,cAAc,GAAG;AAAA,MAC9F;AAEA,YAAM,SAAS,mBAAmB,MAAM,OAAO,YAAY;AAC3D,YAAM,YAAY,KAAK,YAAY,KAAK;AACxC,UAAI,KAAK;AACP,cAAM,GAAG,MAAM,oGAAoG;AAAA,UACjH;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH,OAAO;AACL,cAAM,GAAG;AAAA,UACP;AAAA;AAAA,UAEA,CAAC,OAAO,MAAM,YAAY,UAAU,MAAM,SAAS,MAAS;AAAA,QAC9D;AAAA,MACF;AAEA,YAAM,QAAoB;AAAA,QACxB;AAAA,QACA;AAAA,QACA,gBAAgB,GAAG,KAAK,IAAI,IAAI,IAAI,UAAU;AAAA,QAC9C,aAAa;AAAA,QACb,QAAQ,CAAC;AAAA,MACX;AAEA,UAAI;AACF,YAAI,IAAI,QAAQ,QAAQ,OAAO,IAAI,OAAO,MAAM,GAAG,CAAC,CAAC;AACrD,cAAM,YAAY,MAAM,YAAY,SAAY,cAAc,KAAK,SAAS,cAAc,IAAI;AAC9F,YAAI,cAAc,QAAW;AAC3B,cAAI;AACJ,cAAI,QAAQ,KAAK;AAAA,YACf;AAAA,YACA,IAAI,QAAe,CAAC,MAAM,WAAW;AACnC,sBAAQ;AAAA,gBACN,MAAM,OAAO,IAAI,eAAe,SAAS,IAAI,qBAAqB,MAAM,OAAO,EAAE,CAAC;AAAA,gBAClF;AAAA,cACF;AACA,oBAAM,QAAQ;AAAA,YAChB,CAAC;AAAA,UACH,CAAC,EAAE,QAAQ,MAAM,aAAa,KAAK,CAAC;AAAA,QACtC;AACA,cAAM,SAAS,MAAM;AACrB,cAAM,UAAU,cAAc,MAAM;AAGpC,cAAM,GAAG,GAAG,OAAO,MAAM;AACvB,gBAAM,EAAE;AAAA,YACN;AAAA;AAAA,YAEA,CAAC,OAAO,MAAM,YAAY,KAAK,UAAU,OAAO,CAAC;AAAA,UACnD;AACA,qBAAW,OAAO,MAAM,QAAQ;AAC9B,kBAAM,EAAE,KAAK,IAAI,MAAM,EAAE;AAAA,cACvB;AAAA;AAAA,cAEA,CAAC,IAAI,YAAY,IAAI,KAAK,IAAI,MAAM,KAAK,UAAU,IAAI,OAAO,GAAG,KAAK;AAAA,YACxE;AACA,kBAAM,QAAQ,GAAG,EAAE,MAAM,gBAAgB,SAAS,EAAE,SAAS,KAAK,CAAC,EAAG,GAAG,EAAE,CAAC;AAAA,UAC9E;AAAA,QACF,CAAC;AACD,gBAAQ,IAAI,KAAK,EAAE,MAAM,YAAY,QAAQ,aAAa,UAAU,QAAQ,SAAS,OAAO,KAAK,CAAC;AAClG,YAAI,MAAM,KAAM,WAAU,KAAK,EAAE,MAAM,YAAY,MAAM,MAAM,KAAK,KAAM,MAAM,EAAE,CAAC;AACnF,eAAO;AAAA,MACT,SAASD,MAAK;AACZ,YAAIA,gBAAe,aAAc,OAAMA;AACvC,cAAM,aAAa,eAAeA,IAAG;AACrC,cAAM,WAAW,YAAY;AAC3B,gBAAM,GAAG;AAAA,YACP;AAAA;AAAA,YAEA,CAAC,OAAO,MAAM,YAAY,KAAK,UAAU,UAAU,CAAC;AAAA,UACtD;AACA,kBAAQ,IAAI,KAAK,EAAE,MAAM,YAAY,QAAQ,UAAU,UAAU,QAAQ,MAAM,OAAO,WAAoB,CAAC;AAAA,QAC7G;AAEA,YAAI,gBAAgBA,IAAG,GAAG;AACxB,gBAAM,SAAS;AACf,gBAAMA;AAAA,QACR;AACA,YAAI,MAAM,eAAe,MAAM,UAAU,QAAW;AAClD;AAAA,YACE;AAAA,YACA,SAAS,IAAI;AAAA,YACb;AAAA,YACA;AAAA,UACF;AACA,gBAAM,SAAS;AACf,gBAAMA;AAAA,QACR;AACA,cAAM,QAAQ,iBAAiB,QAAQ,UAAU,iBAAiBA,IAAG,IAAIA,KAAI,eAAe,MAAS;AACrG,YAAI,UAAU,MAAM;AAClB,gBAAM,SAAS;AACf,gBAAMA;AAAA,QACR;AACA,cAAM,GAAG;AAAA,UACP;AAAA,UACA,CAAC,OAAO,MAAM,YAAY,KAAK,UAAU,UAAU,CAAC;AAAA,QACtD;AACA,YAAI,QAAQ,SAAS,IAAI,aAAa,QAAQ,YAAaA,KAAc,OAAO,wBAAmB,KAAK,MAAM,QAAW,IAAI;AAC7H,eAAO,gBAAgB,OAAO,cAAc,IAAI,IAAI,UAAU,EAAE;AAAA,MAClE;AAAA,IACF;AAAA,IAEA;AAAA,IACA;AAAA,IACA,WAAW,CAAC;AAAA,IACZ,WAAW,CAAC;AAAA,IAEZ,MAAM,MAAM,UAAiC;AAC3C,UAAI,OAAO,SAAS,GAAG;AACrB,cAAM,IAAI,cAAc,2CAA2C,OAAO,SAAS,EAAG,IAAI,GAAG;AAAA,MAC/F;AACA,YAAM,KAAK,cAAc,UAAU,WAAW;AAC9C,YAAM,aAAa,QAAQ,QAAQ;AACnC,YAAM,MAAM,QAAQ,IAAI,UAAU,UAAU,EAAE;AAC9C,UAAI,KAAK,WAAW,YAAa;AAEjC,UAAI;AACJ,UAAI,KAAK;AACP,mBAAW,KAAK,MAAO,cAAc,IAAI,MAAmB,EAAyB,MAAM;AAAA,MAC7F,OAAO;AACL,mBAAW,KAAK,IAAI,IAAI;AACxB,cAAM,GAAG;AAAA,UACP;AAAA;AAAA,UAEA,CAAC,OAAO,YAAY,KAAK,UAAU,cAAc,EAAE,QAAQ,IAAI,KAAK,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;AAAA,QACjG;AAAA,MACF;AACA,UAAI,YAAY,KAAK,IAAI,GAAG;AAC1B,cAAM,GAAG;AAAA,UACP;AAAA,UACA,CAAC,OAAO,UAAU;AAAA,QACpB;AACA,gBAAQ,IAAI,UAAU,UAAU,IAAI,EAAE,MAAM,UAAU,YAAY,QAAQ,aAAa,UAAU,GAAG,QAAQ,MAAM,OAAO,KAAK,CAAC;AAC/H;AAAA,MACF;AACA,aAAO,gBAAgB,WAAW,KAAK,IAAI,GAAG,SAAS,QAAQ,EAAE;AAAA,IACnE;AAAA,IAEA,MAAM,cAAiB,MAAc,MAAkE;AACrG,UAAI,OAAO,SAAS,GAAG;AACrB,cAAM,IAAI,cAAc,mDAAmD,OAAO,SAAS,EAAG,IAAI,GAAG;AAAA,MACvG;AACA,YAAM,WAAW,WAAW,IAAI;AAChC,YAAM,aAAa,QAAQ,QAAQ;AACnC,YAAM,MAAM,QAAQ,IAAI,GAAG,QAAQ,IAAI,UAAU,EAAE;AACnD,UAAI,KAAK,WAAW,aAAa;AAC/B,cAAM,SAAS,cAAc,IAAI,MAAmB;AACpD,eAAO,OAAO,aAAa,OAAO,OAAQ,OAAO;AAAA,MACnD;AAEA,UAAI;AACJ,UAAI,KAAK;AACP,cAAM,SAAS,cAAc,IAAI,MAAmB;AACpD,qBAAa,OAAO,aAAa,SAAY,KAAK,MAAM,OAAO,QAAQ,IAAI;AAAA,MAC7E,WAAW,KAAK,YAAY,QAAW;AACrC,qBAAa,KAAK,IAAI,IAAI,cAAc,KAAK,SAAS,uBAAuB;AAAA,MAC/E;AAGA,YAAM,WAAW,MAAM,GAAG,GAAG,OAAO,MAAM;AACxC,cAAM,EAAE,KAAK,IAAI,MAAM,EAAE;AAAA,UACvB;AAAA;AAAA;AAAA,UAGA,CAAC,OAAO,IAAI;AAAA,QACd;AACA,cAAM,MAAM,KAAK,CAAC;AAClB,YAAI,CAAC,IAAK,QAAO;AACjB,cAAM,EAAE,MAAM,gDAAgD,CAAC,IAAI,EAAE,CAAC;AACtE,cAAM,aAAa,KAAK,UAAU,cAAc,EAAE,OAAO,cAAc,IAAI,WAAW,IAAI,EAAE,CAAC,CAAC;AAC9F,YAAI,KAAK;AACP,gBAAM,EAAE;AAAA,YACN;AAAA;AAAA,YAEA,CAAC,OAAO,UAAU,YAAY,UAAU;AAAA,UAC1C;AAAA,QACF,OAAO;AACL,gBAAM,EAAE;AAAA,YACN;AAAA;AAAA,YAEA,CAAC,OAAO,UAAU,YAAY,UAAU;AAAA,UAC1C;AAAA,QACF;AACA,eAAO,IAAI,WAAW;AAAA,MACxB,CAAC;AACD,UAAI,aAAa,QAAW;AAC1B,cAAM,QAAQ,cAAc,QAAQ;AACpC,gBAAQ,IAAI,GAAG,QAAQ,IAAI,UAAU,IAAI;AAAA,UACvC,MAAM;AAAA,UACN;AAAA,UACA,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,QAAQ,cAAc,EAAE,MAAM,CAAC;AAAA,UAC/B,OAAO;AAAA,QACT,CAAC;AACD,eAAO,eAAe,KAAK,QAAQ,OAAO,WAAW,IAAI,WAAW;AAAA,MACtE;AAEA,UAAI,eAAe,UAAa,cAAc,KAAK,IAAI,GAAG;AACxD,cAAM,aAAa,KAAK,UAAU,cAAc,EAAE,UAAU,KAAK,CAAC,CAAC;AACnE,cAAM,GAAG;AAAA,UACP,MACI,+HACA;AAAA,UACJ,CAAC,OAAO,UAAU,YAAY,UAAU;AAAA,QAC1C;AACA,gBAAQ,IAAI,GAAG,QAAQ,IAAI,UAAU,IAAI,EAAE,MAAM,UAAU,YAAY,QAAQ,aAAa,UAAU,GAAG,QAAQ,EAAE,UAAU,KAAK,GAAY,OAAO,KAAK,CAAC;AAC3J,eAAO;AAAA,MACT;AAEA,UAAI,CAAC,KAAK;AACR,cAAM,GAAG;AAAA,UACP;AAAA;AAAA,UAEA;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA,KAAK;AAAA,cACH,cAAc,eAAe,SAAY,EAAE,UAAU,IAAI,KAAK,UAAU,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;AAAA,YAChG;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,YAAM,GAAG,GAAG,OAAO,MAAM;AACvB,cAAM,EAAE,MAAM,iFAAiF;AAAA,UAC7F;AAAA,UACA;AAAA,UACA,eAAe,SAAY,IAAI,KAAK,UAAU,EAAE,YAAY,IAAI;AAAA,QAClE,CAAC;AACD,YAAI,eAAe,QAAW;AAC5B,gBAAM,QAAQ,GAAG,EAAE,MAAM,OAAO,SAAS,EAAE,MAAM,GAAG,SAAS,YAAY,WAAW,OAAO,KAAK,GAAG,CAAC;AAAA,QACtG;AAAA,MACF,CAAC;AACD,YAAM,IAAI,aAAa,iBAAiB,IAAI,EAAE;AAAA,IAChD;AAAA,IAEA,MAAM,KAAQ,OAA2B,SAA2B;AAClE,YAAM,QAAQ,OAAO,SAAS;AAC9B,UAAI,CAAC,OAAO;AACV,cAAM,IAAI;AAAA,UACR,aAAa,MAAM,IAAI;AAAA,QACzB;AAAA,MACF;AACA,YAAM,YAAY,MAAM,eAAe,MAAM,QAAQ,SAAS,UAAU,MAAM,IAAI,WAAW;AAC7F,YAAM,OAAO,KAAK,EAAE,MAAM,MAAM,MAAM,SAAS,cAAc,SAAoB,EAAE,CAAC;AAAA,IACtF;AAAA,IAEA,GAAI,IAAI,QAAQ,SAAS,MAAM,SAC3B;AAAA,MACE,UAAU,MAAM;AACd,cAAM,IAAI,IAAI,QAAQ,SAAS;AAC/B,eAAO;AAAA,UACL,SAAS,EAAE,WAAW,CAAC;AAAA,UACvB,OAAO,EAAE,SAAS,CAAC;AAAA,UACnB,SAAS,IAAI,WAAW,OAAO,KAAK,EAAE,cAAc,IAAI,QAAQ,CAAC;AAAA,QACnE;AAAA,MACF,GAAG;AAAA,IACL,IACA,CAAC;AAAA,IAEL;AAAA,IACA,KAAK,EAAE,IAAI,OAAO,SAAS,cAAc,IAAI,cAAc;AAAA,EAC7D;AAEA,EAAC,IAA+B,YAAY,eAAe,KAAK,KAAK,OAAO,SAAS;AACnF,QAAI,CAAC,KAAK,UAAW,OAAM,IAAI,cAAc,YAAY,KAAK,WAAW,+BAA+B;AACxG,WAAO,KAAK,UAAU,KAAK,KAAK,OAAO,IAAI;AAAA,EAC7C,CAAC;AACD,EAAC,IAA+B,YAAY,eAAe,KAAK,KAAK,OAAO,SAAS;AACnF,QAAI,CAAC,KAAK,YAAa,OAAM,IAAI,cAAc,WAAW,KAAK,UAAU,iCAAiC;AAC1G,WAAO,KAAK,YAAY,KAAK,KAAK,OAAO,IAAI;AAAA,EAC/C,CAAC;AAED,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,UAAM,GAAG,MAAM,uFAAuF;AAAA,MACpG;AAAA,MACA,KAAK,UAAU,cAAc,MAAM,CAAC;AAAA,IACtC,CAAC;AACD,WAAO;AAAA,EACT,SAASA,MAAK;AACZ,QAAIA,gBAAe,aAAc,QAAO;AAGxC,eAAW,QAAQ,CAAC,GAAG,SAAS,EAAE,QAAQ,GAAG;AAC3C,UAAI;AACF,cAAM,KAAK,KAAK;AAChB,cAAM,GAAG,MAAM,kFAAkF;AAAA,UAC/F;AAAA,UACA,KAAK;AAAA,UACL,KAAK;AAAA,QACP,CAAC;AACD,YAAI,QAAQ,wBAAwB,KAAK,IAAI,KAAK,QAAW,KAAK,IAAI;AAAA,MACxE,SAAS,SAAS;AAChB,YAAI,SAAS,kBAAkB,KAAK,IAAI,aAAc,QAAkB,OAAO,IAAI,QAAW,KAAK,IAAI;AAAA,MACzG;AAAA,IACF;AACA,UAAM,GAAG,MAAM,mFAAmF;AAAA,MAChG;AAAA,MACA,KAAK,UAAU,eAAeA,IAAG,CAAC;AAAA,IACpC,CAAC;AACD,QAAI,SAAS,eAAgBA,KAAc,OAAO,EAAE;AACpD,WAAO;AAAA,EACT;AACF;;;AGpgBA,eAAsB,UAAU,YAA2B,MAA6C;AACtG,QAAME,QAAO,OAAO,MAAwC;AAC1D,UAAM,EAAE,KAAK,IAAI,MAAM,EAAE;AAAA,MACvB;AAAA;AAAA;AAAA,MAGA;AAAA,QACE,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK,OAAO;AAAA,QACZ,KAAK,UAAU,KAAK,OAAO;AAAA,QAC3B,KAAK,UAAU,SAAY,OAAO,KAAK,UAAU,cAAc,KAAK,KAAK,CAAC;AAAA,MAC5E;AAAA,IACF;AACA,UAAM,QAAQ,KAAK,CAAC,EAAG;AACvB,UAAM,QAAQ,GAAG;AAAA,MACf,MAAM;AAAA,MACN,SAAS,EAAE,MAAM;AAAA,MACjB,WAAW,OAAO,KAAK;AAAA,MACvB,GAAI,KAAK,cAAc,SAAY,CAAC,IAAI,CAAC;AAAA,IAC3C,CAAC;AACD,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,WAAY,QAAO,WAAW,GAAGA,KAAI;AACjD,SAAOA,MAAK,UAAU;AACxB;AAUA,eAAsB,cAAc,IAAQ,KAAuC;AACjF,SAAO,GAAG,GAAG,OAAO,MAAM;AACxB,UAAM,EAAE,KAAK,IAAI,MAAM,EAAE;AAAA,MACvB;AAAA,MACA,CAAC,IAAI,KAAK;AAAA,IACZ;AACA,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,EAAE,MAAM,wEAAwE;AAAA,MACpF,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI,YAAY,SAAY,OAAO,KAAK,UAAU,cAAc,IAAI,OAAO,CAAC;AAAA,IAC9E,CAAC;AACD,QAAI,IAAI,WAAW,eAAe,IAAI,mBAAmB,IAAI,MAAM;AACjE,YAAM,QAAQ,GAAG,EAAE,MAAM,OAAO,SAAS,EAAE,OAAO,IAAI,MAAM,GAAG,WAAW,OAAO,IAAI,KAAK,GAAG,CAAC;AAAA,IAChG;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,eAAsB,UAAU,IAAQ,OAAe,QAAkC;AACvF,QAAM,EAAE,SAAS,IAAI,MAAM,GAAG;AAAA,IAC5B;AAAA;AAAA,IAEA,CAAC,OAAO,KAAK,UAAU,EAAE,MAAM,aAAa,SAAS,OAAO,CAAqC,CAAC;AAAA,EACpG;AACA,SAAO,WAAW;AACpB;;;AC1EA,eAAsB,YAAY,IAAQ,SAAoC;AAC5E,QAAM,EAAE,KAAK,IAAI,MAAM,GAAG,MAMvB,qEAAqE,CAAC,OAAO,CAAC;AACjF,QAAM,QAAQ,KAAK,CAAC;AACpB,MAAI,CAAC,MAAO,QAAO,CAAC;AAEpB,QAAM,OAAO,MAAM,GAAG;AAAA,IACpB;AAAA,IACA,CAAC,MAAM,YAAY,MAAM,KAAK,MAAM,IAAI;AAAA,EAC1C;AAEA,QAAM,UAAoB,CAAC;AAC3B,aAAW,OAAO,KAAK,MAAM;AAC3B,UAAM,QAAQ,MAAM,GAAG,GAAG,OAAO,MAAM;AACrC,YAAM,WAAW,MAAM,EAAE;AAAA,QACvB;AAAA,QACA,CAAC,IAAI,eAAe,MAAM,YAAY,MAAM,EAAE;AAAA,MAChD;AACA,UAAI,SAAS,KAAK,SAAS,EAAG,QAAO;AAErC,YAAM,QAAQ,MAAM,EAAE;AAAA,QACpB;AAAA,QACA,CAAC,MAAM,YAAY,IAAI,eAAe,MAAM,GAAG;AAAA,MACjD;AACA,YAAM,YAAY,MAAM,KAAK,CAAC,GAAG;AACjC,UAAI,CAAC,UAAW,QAAO;AAEvB,aAAO,UAAU,GAAG;AAAA,QAClB,WAAW,MAAM;AAAA,QACjB,cAAc,IAAI;AAAA,QAClB;AAAA,QACA,KAAK,MAAM;AAAA,QACX,SAAS,EAAE,MAAM,SAAS,OAAO,MAAM,MAAM,SAAS,MAAM,GAAG;AAAA;AAAA,QAE/D,OAAO,MAAM,YAAY,OAAO,SAAY,cAAc,MAAM,OAAO;AAAA,MACzE,CAAC;AAAA,IACH,CAAC;AACD,QAAI,MAAO,SAAQ,KAAK,KAAK;AAAA,EAC/B;AACA,SAAO;AACT;AAGA,eAAsB,kBACpB,IACA,WACA,KACA,MACe;AACf,QAAM,GAAG,GAAG,OAAO,MAAM;AACvB,UAAM,EAAE,MAAM,kEAAkE,CAAC,WAAW,GAAG,CAAC;AAChG,eAAW,KAAK,MAAM;AACpB,YAAM,EAAE;AAAA,QACN;AAAA;AAAA,QAEA,CAAC,WAAW,KAAK,EAAE,WAAW,EAAE,YAAY;AAAA,MAC9C;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;ACrEA,SAAS,QAAAC,aAAY;;;ACArB,SAAS,YAAY;;;ACCrB,SAAS,eAAAC,oBAAmB;AAkD5B,SAAS,UAAU,MAAc,UAA+B;AAC9D,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,CAAC,SAAS;AAAA,IACnB,KAAK;AACH,aAAO,CAAC,YAAY,UAAU;AAAA,IAChC,KAAK;AACH,aAAO,YAAY,CAAC;AAAA,IACtB;AACE,aAAO,CAAC;AAAA,EACZ;AACF;AAGA,eAAsB,2BAA2B,MAQtB;AACzB,QAAM,WAAW,oBAAI,IAAmC;AACxD,QAAM,aAAa,oBAAI,IAA+B;AAEtD,aAAW,QAAQ,KAAK,aAAa;AACnC,eAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,WAAW,GAAG;AAC1D,UAAI,YAAY;AAChB,UAAI,KAAK,UAAU,YAAY;AAK7B,cAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,UAC7B;AAAA;AAAA;AAAA,UAGA,CAAC,KAAK,aAAa,KAAK,SAAS;AAAA,QACnC;AACA,oBAAY,KAAK,SAAS;AAAA,MAC5B,OAAO;AACL,cAAM,WAAW,MAAM,KAAK,OAAO,eAAe;AAAA,UAChD,aAAa,KAAK;AAAA,UAClB,WAAW,KAAK;AAAA,UAChB,cAAc,KAAK;AAAA,UACnB,KAAK,KAAK;AAAA,UACV,QAAQ;AAAA,UACR,aAAa,KAAK;AAAA,UAClB,OAAO,KAAK;AAAA,QACd,CAAC;AACD,oBAAY,aAAa;AAAA,MAC3B;AACA,UAAI,UAAW;AACf,YAAM,WAAW,KAAK,mBAAmB,KAAK,SAAS;AACvD,YAAM,KAAK,GAAG,KAAK,SAAS,IAAI,KAAK,KAAK;AAC1C,YAAM,WAAW,SAAS,IAAI,EAAE;AAChC,UAAI,UAAU;AACZ,YAAI,CAAC,SAAS,YAAY,SAAS,KAAK,YAAY,EAAG,UAAS,YAAY,KAAK,KAAK,YAAY;AAClG;AAAA,MACF;AACA,YAAM,QAAQ,OAAO,QAAQ,UAAU,QAAQ,EAAE,SAAS,EAAE,MAAM,UAAmB,IAAI,UAAU,MAAM,gBAAgB,EAAE,CAAC,EAAE;AAAA,QAC5H,CAAC,CAAC,MAAM,KAAK,OAAO;AAAA,UAClB;AAAA,UACA,MAAM,MAAM;AAAA,UACZ,QAAQ,UAAU,MAAM,MAAO,MAAgC,MAAM;AAAA,UACrE,GAAI,cAAc,SAAS,MAAM,aAAa,SAAY,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,UAC1F,GAAI,MAAM,SAAS,YAAY,YAAY,QAAQ,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;AAAA,QACjF;AAAA,MACF;AACA,eAAS,IAAI,IAAI;AAAA,QACf,MAAM;AAAA,QACN;AAAA,QACA,WAAW,KAAK;AAAA,QAChB,OAAO,KAAK;AAAA,QACZ;AAAA,QACA,GAAI,UAAU,aAAa,SAAY,EAAE,UAAU,SAAS,SAAS,IAAI,CAAC;AAAA,QAC1E,GAAI,UAAU,kBAAkB,SAAY,EAAE,eAAe,SAAS,cAAc,IAAI,CAAC;AAAA,QACzF,aAAa,CAAC,KAAK,YAAY;AAAA,MACjC,CAAC;AAAA,IACH;AACA,eAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,KAAK,OAAO,GAAG;AACvD,YAAM,QAAQ,MAAM,KAAK,OAAO,eAAe,KAAK,aAAa,IAAI;AACrE,UAAI,UAAU,KAAM;AACpB,YAAM,WAAW,WAAW,IAAI,IAAI;AACpC,UAAI,UAAU;AACZ,YAAI,CAAC,SAAS,YAAY,SAAS,KAAK,YAAY,EAAG,UAAS,YAAY,KAAK,KAAK,YAAY;AAClG;AAAA,MACF;AACA,iBAAW,IAAI,MAAM;AAAA,QACnB,MAAM;AAAA,QACN;AAAA,QACA,GAAI,KAAK,aAAa,SAAY,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,QACjE,aAAa,CAAC,KAAK,YAAY;AAAA,MACjC,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO,CAAC,GAAG,SAAS,OAAO,GAAG,GAAG,WAAW,OAAO,CAAC;AACtD;AAEA,eAAsB,gBAAgB,MAMlB;AAClB,QAAM,QAAQ,MAAMA,aAAY,EAAE,EAAE,SAAS,KAAK,CAAC;AACnD,QAAM,KAAK,GAAG;AAAA,IACZ;AAAA;AAAA,IAEA,CAAC,OAAO,KAAK,aAAa,KAAK,aAAa,MAAM,KAAK,UAAU,KAAK,YAAY,GAAG,OAAO,KAAK,SAAS,KAAK,OAAO,GAAI,CAAC;AAAA,EAC7H;AACA,SAAO;AACT;AAWA,eAAsB,eAAe,IAAQ,OAA+C;AAC1F,QAAM,EAAE,KAAK,IAAI,MAAM,GAAG,MAAsB,8CAA8C,CAAC,KAAK,CAAC;AACrG,QAAM,OAAO,KAAK,CAAC;AACnB,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,KAAK,WAAW,aAAa,IAAI,KAAK,OAAO,KAAK,UAAU,CAAC,EAAE,QAAQ,IAAI,KAAK,IAAI,GAAG;AACzF,UAAM,GAAG,MAAM,4DAA4D,CAAC,KAAK,CAAC;AAClF,SAAK,SAAS;AAAA,EAChB;AACA,SAAO;AACT;AAGA,eAAsB,kBACpB,IACA,QACA,MACoG;AACpG,QAAM,SAAkE,CAAC;AACzE,aAAW,OAAO,KAAK,cAAc;AACnC,QAAI,YAAY;AAChB,QAAI,IAAI,SAAS,cAAc;AAC7B,YAAM,cAAc,IAAI,UAAU,aAAa,qDAAqD;AACpG,YAAM,EAAE,KAAK,IAAI,MAAM,GAAG;AAAA,QACxB,0FAA0F,WAAW;AAAA,QACrG,CAAC,KAAK,cAAc,IAAI,SAAS;AAAA,MACnC;AACA,kBAAY,KAAK,SAAS;AAAA,IAC5B,WAAW,IAAI,SAAS,UAAU;AAChC,kBAAa,MAAM,OAAO,eAAe,KAAK,cAAc,IAAI,IAAI,MAAO;AAAA,IAC7E,OAAO;AACL,YAAM,EAAE,KAAK,IAAI,MAAM,GAAG;AAAA,QACxB;AAAA,QACA,CAAC,IAAI,cAAc;AAAA,MACrB;AACA,kBAAY,KAAK,CAAC,GAAG,WAAW;AAAA,IAClC;AACA,WAAO,KAAK,EAAE,aAAa,KAAK,UAAU,CAAC;AAAA,EAC7C;AACA,QAAM,eAAe,OAAO,MAAM,CAAC,MAAM,EAAE,SAAS;AACpD,MAAI,gBAAgB,KAAK,WAAW,WAAW;AAC7C,UAAM,GAAG,MAAM,kFAAkF,CAAC,KAAK,KAAK,CAAC;AAC7G,SAAK,SAAS;AAAA,EAChB;AACA,SAAO,EAAE,QAAQ,KAAK,QAAQ,cAAc,OAAO;AACrD;;;AC5NA,SAAS,cAAAC,aAAY,eAAAC,oBAAmB;AAGjC,SAAS,UAAU,OAAuB;AAC/C,SAAOD,YAAW,QAAQ,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK;AACxD;AAEA,eAAsB,UAAU,IAAQ,aAAqB,MAA+B;AAC1F,QAAM,QAAQ,OAAOC,aAAY,EAAE,EAAE,SAAS,KAAK,CAAC;AACpD,QAAM,GAAG,MAAM,6EAA6E;AAAA,IAC1F;AAAA,IACA;AAAA,IACA,UAAU,KAAK;AAAA,EACjB,CAAC;AACD,SAAO;AACT;AAEA,eAAsB,YAAY,IAAQ,OAAwD;AAChG,MAAI,CAAC,MAAM,WAAW,MAAM,EAAG,QAAO;AACtC,QAAM,EAAE,KAAK,IAAI,MAAM,GAAG;AAAA,IACxB;AAAA,IACA,CAAC,UAAU,KAAK,CAAC;AAAA,EACnB;AACA,MAAI,CAAC,KAAK,CAAC,EAAG,QAAO;AACrB,OAAK,GAAG,MAAM,4DAA4D,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AACtG,SAAO,EAAE,aAAa,KAAK,CAAC,EAAE,aAAa;AAC7C;AAEA,eAAsB,iBAAiB,IAAQ,aAA6C;AAC1F,QAAM,EAAE,KAAK,IAAI,MAAM,GAAG,MAAM,4DAA4D,CAAC,WAAW,CAAC;AACzG,MAAI,KAAK,SAAS,EAAG,QAAO;AAG5B,QAAM,SAAS,QAAQ,IAAI,wBAAwB;AACnD,MAAI,UAAU,OAAO,WAAW,MAAM,GAAG;AACvC,UAAM,GAAG,MAAM,sFAAsF;AAAA,MACnG;AAAA,MACA,UAAU,MAAM;AAAA,IAClB,CAAC;AACD,WAAO;AAAA,EACT;AACA,SAAO,UAAU,IAAI,aAAa,oBAAoB;AACxD;;;AC7CA,SAAS,kBAAkB;AAC3B,SAAS,gBAAAC,eAAc,UAAAC,SAAQ,iBAAAC,sBAAqB;AACpD,SAAS,QAAAC,aAAY;AAKd,IAAM,kBAAkB,mBAAmB;AAElD,SAAS,qBAA6B;AACpC,aAAW,OAAO,CAAC,mBAAmB,oBAAoB,GAAG;AAC3D,QAAI;AACF,YAAM,MAAM,KAAK,MAAMC,cAAa,IAAI,IAAI,KAAK,YAAY,GAAG,GAAG,MAAM,CAAC;AAC1E,UAAI,OAAO,IAAI,YAAY,SAAU,QAAO,IAAI;AAAA,IAClD,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAqBA,eAAsB,gBAAgB,MAAmD;AACvF,QAAM,WAAkD,EAAE,IAAI,OAAO,MAAM,KAAK,GAAG,MAAM,WAAW,MAAM;AAC1G,QAAM,kBAA2D;AAAA,IAC/D,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SAAS,CAAC;AAAA,IACV,SAAS,WAAW,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,EACrC;AAEA,MAAI;AACF,UAAM,KAAK,GAAG,MAAM,gBAAgB;AACpC,aAAS,KAAK;AACd,aAAS,YAAY;AAAA,EACvB,QAAQ;AACN,aAAS,UAAU;AAAA,EACrB;AAEA,MAAI,SAAS,WAAW;AACtB,QAAI;AACF,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG,MAAsB,8CAA8C;AACnG,YAAM,UAAU,KAAK,IAAI,CAAC,MAAM,EAAE,EAAE;AACpC,YAAM,aAAa,IAAI,IAAI,OAAO;AAClC,YAAM,UAAU,WAAW,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;AAC9E,sBAAgB,UAAU;AAC1B,sBAAgB,UAAU;AAC1B,sBAAgB,UAAU,QAAQ,WAAW;AAC7C,sBAAgB,KAAK,gBAAgB;AAAA,IACvC,QAAQ;AACN,sBAAgB,UAAU;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,UAAU,iBAAiB,KAAK,OAAO;AAC7C,SAAO;AAAA,IACL,IAAI,SAAS,MAAM,gBAAgB,MAAM,QAAQ;AAAA,IACjD,SAAS;AAAA,IACT,SAAS,KAAK,WAAW;AAAA,IACzB,QAAQ,EAAE,UAAU,YAAY,iBAAiB,QAAQ;AAAA,EAC3D;AACF;AAEA,eAAsB,cAAc,MAAyB,aAAuD;AAClH,QAAM,YAAY,MAAM,gBAAgB,IAAI;AAC5C,QAAM,QAAQ,MAAM,YAAY,KAAK,EAAE;AACvC,QAAM,cAAc,MAAM,iBAAiB,KAAK,IAAI,WAAW;AAC/D,QAAM,oBAAoB,YAAY,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,oBAAoB;AAC9F,QAAM,WAAW,MAAM,OAAO,MAAM,YAAY,SAAS,QAAQ,KAAK,KAAK,KAAK,kBAAkB,SAAS;AAE3G,SAAO;AAAA,IACL,IAAI,UAAU;AAAA,IACd;AAAA,IACA,SAAS;AAAA,IACT,SAAS,KAAK,WAAW;AAAA,IACzB,QAAQ;AAAA,IACR,SAAS,KAAK;AAAA,IACd,OAAO,KAAK;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB;AAAA,MACjB,OAAO,kBAAkB;AAAA,MACzB,UAAU,kBAAkB,IAAI,CAAC,OAAO;AAAA,QACtC,MAAM,EAAE;AAAA,QACR,cAAc,EAAE;AAAA,QAChB,cAAc,EAAE;AAAA,MAClB,EAAE;AAAA,IACJ;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,SAAuE;AAC/F,QAAM,QAAQC,MAAK,SAAS,uBAAuB,WAAW,CAAC,EAAE;AACjE,MAAI;AACF,IAAAC,eAAc,OAAO,MAAM,EAAE,MAAM,KAAK,CAAC;AACzC,IAAAC,QAAO,OAAO,EAAE,OAAO,KAAK,CAAC;AAC7B,WAAO,EAAE,IAAI,MAAM,UAAU,KAAK;AAAA,EACpC,QAAQ;AACN,WAAO,EAAE,IAAI,OAAO,UAAU,OAAO,SAAS,iCAAiC;AAAA,EACjF;AACF;AAEA,eAAe,YAAY,IAAkE;AAC3F,QAAM,EAAE,KAAK,IAAI,MAAM,GAAG;AAAA,IACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AACA,QAAM,MAAM,KAAK,CAAC,KAAK,EAAE,OAAO,KAAK,QAAQ,KAAK,MAAM,IAAI;AAC5D,SAAO,EAAE,OAAO,OAAO,IAAI,KAAK,GAAG,QAAQ,OAAO,IAAI,MAAM,GAAG,MAAM,OAAO,IAAI,IAAI,EAAE;AACxF;AAEA,eAAe,iBACb,IACA,aAC6K;AAC7K,QAAM,EAAE,KAAK,IAAI,MAAM,GAAG;AAAA,IAOxB;AAAA;AAAA;AAAA;AAAA,IAIA,CAAC,WAAW;AAAA,EACd;AACA,QAAM,WAAmC,CAAC;AAC1C,QAAM,WAAW,KAAK,IAAI,CAAC,QAAQ;AACjC,UAAMC,UAAS,IAAI,UAAU;AAC7B,aAASA,OAAM,KAAK,SAASA,OAAM,KAAK,KAAK;AAC7C,WAAO;AAAA,MACL,MAAM,IAAI;AAAA,MACV,QAAAA;AAAA,MACA,SAAS,IAAI;AAAA,MACb,cAAc,IAAI;AAAA,MAClB,cAAc,iBAAiB,IAAI,MAAM;AAAA,IAC3C;AAAA,EACF,CAAC;AACD,SAAO,EAAE,UAAU,SAAS;AAC9B;AAEA,SAAS,iBAAiB,QAAyB;AACjD,MAAI,UAAU,OAAO,WAAW,YAAY,MAAM,QAAS,OAAsC,YAAY,GAAG;AAC9G,WAAQ,OAAuC,aAAa;AAAA,EAC9D;AACA,SAAO;AACT;;;AC1KA,SAAS,cAAAC,aAAY,qBAAqB,eAAAC,oBAAmB;AAa7D,SAAS,cAAc,OAAgC;AACrD,QAAM,QAAQ,OAAO,UAAU,WAAW,OAAO,KAAK,OAAO,MAAM,IAAI;AACvE,QAAM,MAAM,OAAO,MAAM,CAAC;AAC1B,MAAI,cAAc,MAAM,QAAQ,CAAC;AACjC,SAAO,OAAO,OAAO,CAAC,KAAK,KAAK,CAAC;AACnC;AAEA,SAAS,SAAS,OAAuB;AACvC,MAAI,QAAQ;AACZ,SAAO,MAAM,SAAS,KAAK,MAAM,CAAC,MAAM,EAAG,SAAQ,MAAM,SAAS,CAAC;AACnE,OAAK,MAAM,CAAC,IAAK,SAAU,EAAG,SAAQ,OAAO,OAAO,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AAC7E,SAAO,cAAc,KAAK;AAC5B;AAEA,SAAS,oBAAoB,KAA2B;AACtD,MAAI,IAAI,QAAQ,SAAS,OAAO,IAAI,MAAM,YAAY,OAAO,IAAI,MAAM,UAAU;AAC/E,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AACA,QAAM,YAAY;AAClB,QAAM,WAAW,OAAO,KAAK,IAAI,GAAG,WAAW;AAC/C,QAAM,UAAU,OAAO,KAAK,IAAI,GAAG,WAAW;AAC9C,QAAM,OAAO,OAAO,OAAO,CAAC,cAAc,SAAS,GAAG,SAAS,QAAQ,GAAG,SAAS,OAAO,CAAC,CAAC,EAAE,SAAS,QAAQ;AAC/G,SAAO,GAAG,SAAS,IAAI,IAAI;AAC7B;AAEO,SAAS,wBAAuC;AAGrD,QAAM,EAAE,WAAW,WAAW,IAAI,oBAAoB,OAAO,EAAE,eAAe,MAAM,gBAAgB,MAAQ,CAAC;AAC7G,SAAO;AAAA,IACL,WAAW,oBAAoB,UAAU,OAAO,EAAE,QAAQ,MAAM,CAAC,CAAC;AAAA,IAClE,YAAY,WAAW,OAAO,EAAE,MAAM,SAAS,QAAQ,MAAM,CAAC,EAAE,SAAS;AAAA,EAC3E;AACF;AAEO,SAAS,2BAAmC;AACjD,SAAO,SAASA,aAAY,EAAE,EAAE,SAAS,WAAW,CAAC;AACvD;AAEO,SAAS,wBAAgC;AAC9C,SAAO,OAAOA,aAAY,EAAE,EAAE,SAAS,WAAW,CAAC;AACrD;AAEO,SAAS,sBAAsB,OAAuB;AAC3D,SAAOD,YAAW,QAAQ,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK;AACxD;;;AJzBA,IAAM,MAAM,CAAC,MAAc,aAAqB,EAAE,OAAO,EAAE,MAAM,QAAQ,EAAE;AAO3E,eAAe,uBAAuB,MAAe,aAAqB,WAA8C;AACtH,QAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,IAK7B;AAAA,IACA,CAAC,WAAW,WAAW;AAAA,EACzB;AACA,QAAM,UAAU,KAAK,CAAC;AACtB,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,WAAW,SAAS,YAAY;AAE9D,MAAI,kBAAkB,QAAQ;AAC9B,MAAI,sBAAsB,QAAQ;AAClC,MAAI,CAAC,mBAAmB,CAAC,qBAAqB;AAC5C,UAAM,MAAM,sBAAsB;AAClC,sBAAkB,IAAI;AACtB,0BAAsB,MAAM,KAAK,OAAO,aAAa,aAAa,IAAI,YAAY,WAAW;AAAA,EAC/F;AAEA,MAAI,0BAA0B,QAAQ;AACtC,MAAI,CAAC,yBAAyB;AAC5B,8BAA0B,MAAM,KAAK,OAAO,aAAa,aAAa,yBAAyB,GAAG,yBAAyB;AAAA,EAC7H;AAEA,QAAM,aAAa,sBAAsB;AACzC,QAAM,KAAK,GAAG;AAAA,IACZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,CAAC,WAAW,aAAa,iBAAiB,qBAAqB,yBAAyB,sBAAsB,UAAU,CAAC;AAAA,EAC3H;AAEA,SAAO;AAAA,IACL;AAAA,IACA,iBAAiB,GAAG,KAAK,QAAQ,QAAQ,OAAO,EAAE,CAAC,cAAc,UAAU;AAAA,EAC7E;AACF;AAEO,SAAS,UAAU,MAA6B;AACrD,QAAM,MAAM,IAAI,KAAa;AAE7B,MAAI,IAAI,KAAK,OAAO,GAAG,SAAS;AAC9B,UAAME,UAAS,EAAE,IAAI,OAAO,eAAe,KAAK;AAChD,UAAM,QAAQA,QAAO,WAAW,SAAS,IAAIA,QAAO,MAAM,CAAC,IAAI;AAC/D,UAAM,OAAO,QAAQ,MAAM,YAAY,KAAK,IAAI,KAAK,IAAI;AACzD,QAAI,CAAC,KAAM,QAAO,EAAE,KAAK,IAAI,gBAAgB,iCAAiC,GAAG,GAAG;AACpF,MAAE,IAAI,eAAe,KAAK,WAAW;AACrC,UAAM,KAAK;AACX;AAAA,EACF,CAAC;AAED,MAAI,IAAI,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,CAAC;AAC9C,MAAI,IAAI,WAAW,OAAO,MAAM,EAAE,KAAK,MAAM,cAAc,MAAM,EAAE,IAAI,aAAa,CAAC,CAAC,CAAC;AAIvF,MAAI,KAAK,aAAa,OAAO,MAAM;AACjC,UAAM,OAAQ,MAAM,EAAE,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACjD,QAAI,CAAC,KAAK,QAAQ,CAAC,yBAAyB,KAAK,KAAK,IAAI,GAAG;AAC3D,aAAO,EAAE,KAAK,IAAI,WAAW,iCAAiC,GAAG,GAAG;AAAA,IACtE;AACA,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,MAC7B;AAAA;AAAA;AAAA;AAAA,MAIA,CAAC,EAAE,IAAI,aAAa,GAAG,KAAK,MAAM,KAAK,WAAW,MAAM,KAAK,cAAc,MAAM;AAAA,IACnF;AACA,UAAM,YAAY,KAAK,CAAC,EAAG;AAC3B,UAAM,KAAK,GAAG;AAAA,MACZ;AAAA,MACA,CAAC,SAAS;AAAA,IACZ;AACA,UAAM,YAAY,MAAM,uBAAuB,MAAM,EAAE,IAAI,aAAa,GAAG,SAAS;AACpF,WAAO,EAAE,KAAK,EAAE,IAAI,WAAW,MAAM,KAAK,MAAM,GAAG,UAAU,CAAC;AAAA,EAChE,CAAC;AAED,MAAI,IAAI,aAAa,OAAO,MAAM;AAChC,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,MAC7B;AAAA;AAAA;AAAA,MAGA,CAAC,EAAE,IAAI,aAAa,CAAC;AAAA,IACvB;AACA,WAAO,EAAE,KAAK,EAAE,UAAU,KAAK,CAAC;AAAA,EAClC,CAAC;AAED,QAAM,cAAc,OAAO,aAAqB,SAAiB;AAC/D,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,MAC7B;AAAA,MACA,CAAC,aAAa,IAAI;AAAA,IACpB;AACA,WAAO,KAAK,CAAC,KAAK;AAAA,EACpB;AAEA,MAAI,KAAK,wBAAwB,OAAO,MAAM;AAC5C,UAAM,UAAU,MAAM,YAAY,EAAE,IAAI,aAAa,GAAG,EAAE,IAAI,MAAM,MAAM,CAAC;AAC3E,QAAI,CAAC,QAAS,QAAO,EAAE,KAAK,IAAI,aAAa,iBAAiB,GAAG,GAAG;AACpE,UAAM,OAAQ,MAAM,EAAE,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACjD,UAAM,KAAK,GAAG;AAAA,MAAG,CAAC,MAChB,QAAQ,GAAG;AAAA,QACT,MAAM;AAAA,QACN,SAAS;AAAA,UACP,WAAW,QAAQ;AAAA,UACnB,GAAI,KAAK,QAAQ,SAAY,EAAE,KAAK,KAAK,IAAI,IAAI,CAAC;AAAA,UAClD,GAAI,KAAK,cAAc,SAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,QACtE;AAAA,QACA,WAAW,aAAa,QAAQ,EAAE,IAAI,KAAK,OAAO,SAAS;AAAA,QAC3D,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,WAAO,EAAE,KAAK,EAAE,QAAQ,KAAK,CAAC;AAAA,EAChC,CAAC;AAED,MAAI,IAAI,kCAAkC,OAAO,MAAM;AACrD,UAAM,UAAU,MAAM,YAAY,EAAE,IAAI,aAAa,GAAG,EAAE,IAAI,MAAM,MAAM,CAAC;AAC3E,QAAI,CAAC,QAAS,QAAO,EAAE,KAAK,IAAI,aAAa,iBAAiB,GAAG,GAAG;AACpE,UAAM,MAAM,EAAE,IAAI,MAAM,KAAK,KAAK;AAClC,QAAI,KAAK,cAAc;AACrB,aAAO,EAAE,KAAM,MAAM,KAAK,aAAa,QAAQ,IAAI,GAAG,CAA6B;AAAA,IACrF;AACA,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,MAC7B;AAAA,MACA,CAAC,QAAQ,EAAE;AAAA,IACb;AACA,WAAO,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC,KAAK,KAAK,CAAC;AAAA,EACzC,CAAC;AAED,MAAI,IAAI,+BAA+B,OAAO,MAAM;AAClD,UAAM,UAAU,MAAM,YAAY,EAAE,IAAI,aAAa,GAAG,EAAE,IAAI,MAAM,MAAM,CAAC;AAC3E,QAAI,CAAC,QAAS,QAAO,EAAE,KAAK,IAAI,aAAa,iBAAiB,GAAG,GAAG;AACpE,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,MAC7B;AAAA;AAAA;AAAA,MAGA,CAAC,QAAQ,EAAE;AAAA,IACb;AACA,WAAO,EAAE,KAAK,EAAE,aAAa,KAAK,CAAC;AAAA,EACrC,CAAC;AAED,MAAI,KAAK,4BAA4B,OAAO,MAAM;AAChD,UAAM,UAAU,MAAM,YAAY,EAAE,IAAI,aAAa,GAAG,EAAE,IAAI,MAAM,MAAM,CAAC;AAC3E,QAAI,CAAC,QAAS,QAAO,EAAE,KAAK,IAAI,aAAa,iBAAiB,GAAG,GAAG;AACpE,UAAM,OAAQ,MAAM,EAAE,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACjD,QAAI,CAAC,KAAK,cAAc,OAAO,KAAK,cAAc,UAAU;AAC1D,aAAO,EAAE,KAAK,IAAI,WAAW,gCAAgC,GAAG,GAAG;AAAA,IACrE;AACA,UAAM,MAAM,KAAK,OAAO;AACxB,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,MAC7B;AAAA,MACA,CAAC,QAAQ,IAAI,KAAK,YAAY,KAAK,SAAS;AAAA,IAC9C;AACA,QAAI,CAAC,KAAK,CAAC,EAAG,QAAO,EAAE,KAAK,IAAI,aAAa,iBAAiB,GAAG,GAAG;AACpE,UAAM,EAAE,SAAS,IAAI,MAAM,KAAK,GAAG;AAAA,MACjC;AAAA;AAAA,MAEA,CAAC,QAAQ,IAAI,KAAK,YAAY,KAAK,KAAK,CAAC,EAAE,EAAE;AAAA,IAC/C;AACA,QAAI,aAAa,EAAG,QAAO,EAAE,KAAK,IAAI,aAAa,0CAA0C,GAAG,GAAG;AACnG,WAAO,EAAE,KAAK,EAAE,YAAY,MAAM,YAAY,KAAK,YAAY,KAAK,WAAW,KAAK,UAAU,CAAC;AAAA,EACjG,CAAC;AAID,MAAI,KAAK,SAAS,OAAO,MAAM;AAC7B,UAAM,OAAQ,MAAM,EAAE,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAMjD,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,WAAY,QAAO,EAAE,KAAK,IAAI,WAAW,8BAA8B,GAAG,GAAG;AACxG,UAAM,UAAU,MAAM,YAAY,EAAE,IAAI,aAAa,GAAG,KAAK,OAAO;AACpE,QAAI,CAAC,QAAS,QAAO,EAAE,KAAK,IAAI,aAAa,iBAAiB,GAAG,GAAG;AACpE,UAAM,MAAM,KAAK,OAAO;AACxB,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,MAC7B;AAAA,MACA,CAAC,QAAQ,IAAI,KAAK,YAAY,GAAG;AAAA,IACnC;AACA,QAAI,CAAC,KAAK,CAAC,EAAG,QAAO,EAAE,KAAK,IAAI,aAAa,eAAe,KAAK,UAAU,4BAA4B,GAAG,EAAE,GAAG,GAAG;AAClH,UAAM,QAAQ,MAAM,UAAU,KAAK,IAAI;AAAA,MACrC,WAAW,QAAQ;AAAA,MACnB,cAAc,KAAK;AAAA,MACnB,WAAW,KAAK,CAAC,EAAE;AAAA,MACnB;AAAA,MACA,SAAS,EAAE,MAAM,SAAS;AAAA,MAC1B,GAAI,KAAK,UAAU,SAAY,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,IAC1D,CAAC;AACD,WAAO,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG;AAAA,EAC9B,CAAC;AAED,MAAI,IAAI,SAAS,OAAO,MAAM;AAC5B,UAAM,iBAAiB,OAAO,EAAE,IAAI,MAAM,OAAO,KAAK,EAAE;AACxD,UAAM,kBAAkB,OAAO,EAAE,IAAI,MAAM,QAAQ,KAAK,CAAC;AACzD,UAAM,QAAQ,OAAO,SAAS,cAAc,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,MAAM,cAAc,GAAG,CAAC,GAAG,GAAG,IAAI;AACzG,UAAM,SAAS,OAAO,SAAS,eAAe,IAAI,KAAK,IAAI,KAAK,MAAM,eAAe,GAAG,CAAC,IAAI;AAC7F,UAAM,SAAoB,CAAC,EAAE,IAAI,aAAa,CAAC;AAC/C,QAAI,SAAS;AACb,QAAI,EAAE,IAAI,MAAM,SAAS,GAAG;AAC1B,aAAO,KAAK,EAAE,IAAI,MAAM,SAAS,CAAC;AAClC,gBAAU,kBAAkB,OAAO,MAAM;AAAA,IAC3C;AACA,QAAI,EAAE,IAAI,MAAM,YAAY,GAAG;AAC7B,aAAO,KAAK,EAAE,IAAI,MAAM,YAAY,CAAC;AACrC,gBAAU,2BAA2B,OAAO,MAAM;AAAA,IACpD;AACA,QAAI,EAAE,IAAI,MAAM,QAAQ,GAAG;AACzB,aAAO,KAAK,EAAE,IAAI,MAAM,QAAQ,CAAC;AACjC,gBAAU,oBAAoB,OAAO,MAAM;AAAA,IAC7C;AACA,UAAM,cAAc,CAAC,GAAG,MAAM;AAC9B,UAAM,QAAQ,QAAQ,MAAM,KAAK,GAAG;AAAA,MAClC;AAAA;AAAA,mCAE6B,MAAM;AAAA,MACnC;AAAA,IACF,GAAG,KAAK,CAAC,GAAG,SAAS,GAAG;AACxB,WAAO,KAAK,OAAO,MAAM;AACzB,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,MAC7B;AAAA;AAAA;AAAA,mCAG6B,MAAM;AAAA,2CACE,OAAO,SAAS,CAAC,YAAY,OAAO,MAAM;AAAA,MAC/E;AAAA,IACF;AACA,WAAO,EAAE,KAAK,EAAE,MAAM,MAAM,OAAO,OAAO,QAAQ,WAAW,SAAS,KAAK,SAAS,MAAM,CAAC;AAAA,EAC7F,CAAC;AAED,MAAI,IAAI,aAAa,OAAO,MAAM;AAChC,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,MAC7B;AAAA;AAAA,MAEA,CAAC,EAAE,IAAI,MAAM,IAAI,GAAG,EAAE,IAAI,aAAa,CAAC;AAAA,IAC1C;AACA,QAAI,CAAC,KAAK,CAAC,EAAG,QAAO,EAAE,KAAK,IAAI,aAAa,aAAa,GAAG,GAAG;AAChE,UAAM,QAAQ,MAAM,KAAK,GAAG;AAAA,MAC1B;AAAA;AAAA,MAEA,CAAC,EAAE,IAAI,MAAM,IAAI,CAAC;AAAA,IACpB;AACA,UAAM,oBAAoB,OAAO,EAAE,IAAI,MAAM,UAAU,KAAK,GAAG;AAC/D,UAAM,qBAAqB,OAAO,EAAE,IAAI,MAAM,WAAW,KAAK,CAAC;AAC/D,UAAM,WAAW,OAAO,SAAS,iBAAiB,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,MAAM,iBAAiB,GAAG,CAAC,GAAG,GAAG,IAAI;AAClH,UAAM,YAAY,OAAO,SAAS,kBAAkB,IAAI,KAAK,IAAI,KAAK,MAAM,kBAAkB,GAAG,CAAC,IAAI;AACtG,UAAM,YAAY,QAAQ,MAAM,KAAK,GAAG;AAAA,MACtC;AAAA,MACA,CAAC,EAAE,IAAI,MAAM,IAAI,CAAC;AAAA,IACpB,GAAG,KAAK,CAAC,GAAG,SAAS,GAAG;AACxB,UAAM,OAAO,MAAM,KAAK,GAAG;AAAA,MACzB;AAAA,MACA,CAAC,EAAE,IAAI,MAAM,IAAI,GAAG,UAAU,SAAS;AAAA,IACzC;AACA,WAAO,EAAE,KAAK;AAAA,MACZ,KAAK,KAAK,CAAC;AAAA,MACX,OAAO,MAAM;AAAA,MACb,MAAM,KAAK;AAAA,MACX;AAAA,MACA,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,eAAe,YAAY,KAAK,KAAK,SAAS;AAAA,IAChD,CAAC;AAAA,EACH,CAAC;AAED,MAAI,IAAI,oBAAoB,OAAO,MAAM;AACvC,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,MAC7B;AAAA;AAAA;AAAA,MAGA,CAAC,EAAE,IAAI,MAAM,IAAI,GAAG,EAAE,IAAI,aAAa,CAAC;AAAA,IAC1C;AACA,QAAI,CAAC,KAAK,CAAC,EAAG,QAAO,EAAE,KAAK,IAAI,aAAa,aAAa,GAAG,GAAG;AAChE,UAAM,QAAQ,MAAM,KAAK,GAAG;AAAA,MAC1B;AAAA,MACA,CAAC,EAAE,IAAI,MAAM,IAAI,CAAC;AAAA,IACpB;AACA,WAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,GAAG,SAAS,MAAM,KAAK,EAAE,CAAC;AAAA,EAC/D,CAAC;AAED,MAAI,KAAK,2BAA2B,OAAO,MAAM;AAC/C,UAAM,OAAQ,MAAM,EAAE,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACjD,UAAM,KAAK,MAAM,cAAc,KAAK,IAAI;AAAA,MACtC,OAAO,EAAE,IAAI,MAAM,IAAI;AAAA,MACvB,MAAM,EAAE,IAAI,MAAM,MAAM;AAAA,MACxB,SAAS,KAAK;AAAA,IAChB,CAAC;AACD,QAAI,CAAC,GAAI,QAAO,EAAE,KAAK,IAAI,aAAa,aAAa,GAAG,GAAG;AAC3D,WAAO,EAAE,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACnC,CAAC;AAED,MAAI,KAAK,oBAAoB,OAAO,MAAM;AACxC,UAAM,KAAK,MAAM,UAAU,KAAK,IAAI,EAAE,IAAI,MAAM,IAAI,GAAG,mBAAmB;AAC1E,WAAO,EAAE,KAAK,EAAE,WAAW,GAAG,CAAC;AAAA,EACjC,CAAC;AAID,MAAI,IAAI,gBAAgB,OAAO,MAAM;AACnC,WAAO,EAAE,KAAK,EAAE,aAAa,MAAM,KAAK,OAAO,gBAAgB,EAAE,IAAI,aAAa,CAAC,EAAE,CAAC;AAAA,EACxF,CAAC;AAED,MAAI,IAAI,YAAY,OAAO,MAAM;AAC/B,WAAO,EAAE,KAAK,EAAE,SAAS,MAAM,KAAK,OAAO,gBAAgB,EAAE,IAAI,aAAa,CAAC,EAAE,CAAC;AAAA,EACpF,CAAC;AAID,MAAI,IAAI,kBAAkB,OAAO,MAAM;AACrC,UAAM,OAAO,EAAE,IAAI,MAAM,MAAM;AAC/B,QAAI,CAAC,iCAAiC,KAAK,IAAI,EAAG,QAAO,EAAE,KAAK,IAAI,WAAW,iBAAiB,GAAG,GAAG;AACtG,UAAM,OAAQ,MAAM,EAAE,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACjD,QAAI,OAAO,KAAK,UAAU,YAAY,KAAK,MAAM,WAAW,GAAG;AAC7D,aAAO,EAAE,KAAK,IAAI,WAAW,gBAAgB,GAAG,GAAG;AAAA,IACrD;AACA,UAAM,KAAK,OAAO,UAAU,EAAE,IAAI,aAAa,GAAG,MAAM,KAAK,KAAK;AAClE,WAAO,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC;AAAA,EAC7B,CAAC;AAED,MAAI,OAAO,kBAAkB,OAAO,MAAM;AACxC,UAAM,KAAK,MAAM,KAAK,OAAO,aAAa,EAAE,IAAI,aAAa,GAAG,EAAE,IAAI,MAAM,MAAM,CAAC;AACnF,WAAO,EAAE,KAAK,EAAE,SAAS,GAAG,CAAC;AAAA,EAC/B,CAAC;AAID,MAAI,KAAK,kBAAkB,OAAO,MAAM;AACtC,UAAM,OAAQ,MAAM,EAAE,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAIjD,QAAI;AACJ,QAAI,eAA6D,CAAC;AAClE,QAAI,KAAK,SAAS;AAChB,YAAM,UAAU,MAAM,YAAY,EAAE,IAAI,aAAa,GAAG,KAAK,OAAO;AACpE,UAAI,CAAC,QAAS,QAAO,EAAE,KAAK,IAAI,aAAa,iBAAiB,GAAG,GAAG;AACpE,kBAAY,QAAQ;AACpB,YAAM,MAAM,KAAK,OAAO;AACxB,YAAM,WAAW,MAAM,KAAK,GAAG;AAAA,QAC7B;AAAA;AAAA,QAEA,CAAC,QAAQ,IAAI,GAAG;AAAA,MAClB;AACA,YAAM,SAAS,MAAM,KAAK,GAAG;AAAA,QAC3B;AAAA;AAAA,QAEA,CAAC,QAAQ,EAAE;AAAA,MACb;AACA,YAAM,UAAU,CAAC,GAAG,SAAS,MAAM,GAAG,OAAO,IAAI,EAAE,IAAI,CAAC,MAAM;AAC5D,cAAM,IAAI,EAAE;AACZ,eAAO,EAAE,cAAc,EAAE,eAAe,aAAa,EAAE,eAAe,CAAC,GAAG,SAAS,EAAE,WAAW,CAAC,EAAE;AAAA,MACrG,CAAC;AACD,YAAM,qBAAqB,MAAM,0BAA0B,KAAK,IAAI,QAAQ,EAAE;AAC9E,qBAAe,MAAM,2BAA2B;AAAA,QAC9C,IAAI,KAAK;AAAA,QACT,QAAQ,KAAK;AAAA,QACb,aAAa,EAAE,IAAI,aAAa;AAAA,QAChC,WAAW,QAAQ;AAAA,QACnB;AAAA,QACA,aAAa;AAAA,QACb;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,aAAa,WAAW,EAAG,QAAO,EAAE,KAAK,EAAE,KAAK,MAAM,cAAc,CAAC,EAAE,CAAC;AAC5E,UAAM,QAAQ,MAAM,gBAAgB;AAAA,MAClC,IAAI,KAAK;AAAA,MACT,aAAa,EAAE,IAAI,aAAa;AAAA,MAChC;AAAA,MACA;AAAA,IACF,CAAC;AACD,WAAO,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,OAAO,YAAY,KAAK,IAAI,OAAO,aAAa,CAAC;AAAA,EAChF,CAAC;AAED,MAAI,IAAI,gCAAgC,OAAO,MAAM;AACnD,UAAM,OAAO,MAAM,eAAe,KAAK,IAAI,EAAE,IAAI,MAAM,OAAO,CAAC;AAC/D,QAAI,CAAC,QAAQ,KAAK,iBAAiB,EAAE,IAAI,aAAa,EAAG,QAAO,EAAE,KAAK,IAAI,aAAa,cAAc,GAAG,GAAG;AAC5G,UAAMC,UAAS,MAAM,kBAAkB,KAAK,IAAI,KAAK,QAAQ,IAAI;AACjE,WAAO,EAAE,KAAKA,OAAM;AAAA,EACtB,CAAC;AAID,MAAI,KAAK,WAAW,OAAO,MAAM;AAC/B,UAAM,OAAQ,MAAM,EAAE,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACjD,UAAM,QAAQ,MAAM,UAAU,KAAK,IAAI,EAAE,IAAI,aAAa,GAAG,KAAK,QAAQ,KAAK;AAC/E,WAAO,EAAE,KAAK,EAAE,MAAM,CAAC;AAAA,EACzB,CAAC;AAED,SAAO;AACT;AAGA,eAAsB,0BACpB,IACA,WACoF;AACpF,QAAM,EAAE,KAAK,IAAI,MAAM,GAAG;AAAA,IACxB;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AACA,QAAM,MAA6B,CAAC;AACpC,aAAW,OAAO,MAAM;AACtB,eAAW,CAAC,IAAI,CAAC,KAAK,OAAO,QAAQ,IAAI,UAAU,cAAc,CAAC,CAAC,GAAG;AACpE,UAAI,EAAE,MAAM,KAAM,KAAI,EAAW,IAAI;AAAA,IACvC;AAAA,EACF;AACA,SAAO;AACT;;;AK7bA,SAAS,eAAAC,oBAAmB;AAC5B,SAAS,QAAAC,aAAY;;;ACDd,IAAM,QAAQ;AAAA;AAAA,EAEnB,QAAQ;AAAA;AAAA,EAER,aAAa;AAAA;AAAA,EAEb,YAAY;AAAA;AAAA,EAEZ,KAAK;AAAA;AAAA,EAEL,OAAO;AAAA;AAAA,EAEP,SAAS;AAAA;AAAA,EAET,SAAS;AAAA;AAAA,EAET,SAAS;AAAA;AAAA,EAET,SAAS;AAAA;AAAA,EAET,UAAU;AAAA;AAAA,EAEV,UAAU;AAAA;AAAA,EAEV,SAAS;AAAA;AAAA,EAET,QAAQ;AACV;AAGO,IAAM,OAAO;AAAA,EAClB,MAAM;AAAA,EACN,MAAM;AACR;AAeO,IAAM,OAAO;AAAA;AAAA,EAElB,SAAS,EAAE,QAAQ,QAAQ,QAAQ,KAAK,MAAM,IAAI,MAAM,IAAI,UAAU,MAAM;AAAA;AAAA,EAE5E,IAAI,EAAE,QAAQ,QAAQ,QAAQ,KAAK,MAAM,IAAI,MAAM,IAAI,UAAU,OAAO;AAAA;AAAA,EAExE,IAAI,EAAE,QAAQ,QAAQ,QAAQ,KAAK,MAAM,IAAI,MAAM,IAAI,UAAU,MAAM;AAAA;AAAA,EAEvE,IAAI,EAAE,QAAQ,QAAQ,QAAQ,KAAK,MAAM,IAAI,MAAM,IAAI,UAAU,MAAM;AAAA;AAAA,EAEvE,QAAQ,EAAE,QAAQ,QAAQ,QAAQ,KAAK,MAAM,IAAI,MAAM,IAAI,UAAU,EAAE;AAAA;AAAA,EAEvE,MAAM,EAAE,QAAQ,QAAQ,QAAQ,KAAK,MAAM,IAAI,MAAM,IAAI,UAAU,EAAE;AAAA;AAAA,EAErE,QAAQ,EAAE,QAAQ,QAAQ,QAAQ,KAAK,MAAM,IAAI,MAAM,IAAI,UAAU,EAAE;AAAA;AAAA,EAEvE,OAAO,EAAE,QAAQ,QAAQ,QAAQ,KAAK,MAAM,IAAI,MAAM,IAAI,UAAU,MAAM,WAAW,KAAK;AAAA;AAAA,EAE1F,MAAM,EAAE,QAAQ,QAAQ,QAAQ,KAAK,MAAM,IAAI,MAAM,IAAI,UAAU,EAAE;AACvE;AAGO,IAAM,QAAQ,CAAC,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG;AAGpD,IAAM,OAAO;AAAA,EAClB,SAAS;AAAA;AAAA,EAET,QAAQ;AAAA;AAAA,EAER,QAAQ;AAAA;AAAA,EAER,KAAK;AACP;AAGO,IAAM,OAAO;AAAA,EAClB,QAAQ,eAAe,MAAM,GAAG;AAAA,EAChC,UAAU,aAAa,MAAM,QAAQ;AACvC;AAGO,IAAM,SAAS,EAAE,MAAM,MAAM;AAIpC,IAAM,QAAQ,CAAC,MAAsB,EAAE,QAAQ,sBAAsB,OAAO,EAAE,QAAQ,wBAAwB,OAAO,EAAE,YAAY;AAG5H,SAAS,YAAoB;AAClC,QAAM,QAAkB,CAAC;AACzB,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,KAAK,EAAG,OAAM,KAAK,aAAa,MAAM,IAAI,CAAC,KAAK,KAAK,GAAG;AACnG,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,IAAI,EAAG,OAAM,KAAK,YAAY,IAAI,KAAK,KAAK,GAAG;AAC1F,aAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,IAAI,GAAgC;AAC5E,UAAM,IAAI,MAAM,IAAI;AACpB,UAAM;AAAA,MACJ,YAAY,CAAC,KAAK,KAAK,MAAM,IAAI,KAAK,IAAI,MAAM,KAAK,IAAI,iBAAiB,KAAK,MAAM;AAAA,MACrF,YAAY,CAAC,cAAc,KAAK,QAAQ;AAAA,IAC1C;AAAA,EACF;AACA,aAAW,QAAQ,MAAO,OAAM,KAAK,aAAa,IAAI,KAAK,IAAI,KAAK;AACpE,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAChD,UAAM,KAAK,YAAY,IAAI,KAAK,OAAO,UAAU,YAAY,SAAS,YAAY,GAAG,KAAK,OAAO,KAAK,GAAG;AAAA,EAC3G;AACA,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,IAAI,EAAG,OAAM,KAAK,YAAY,IAAI,KAAK,KAAK,GAAG;AAC1F,QAAM,KAAK,oBAAoB,OAAO,IAAI,GAAG;AAC7C,SAAO;AAAA,EAAY,MAAM,KAAK,IAAI,CAAC;AAAA;AAAA;AACrC;;;ACjHO,IAAM,QAAQ;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;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;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;;;ACiBrB,IAAM,UAAiE;AAAA,EACrE,OAAO,EAAE,OAAO,MAAM,QAAQ,OAAO,MAAM,IAAI;AAAA,EAC/C,MAAM,EAAE,OAAO,MAAM,KAAK,OAAO,MAAM,IAAI;AAAA,EAC3C,UAAU,EAAE,OAAO,MAAM,QAAQ,OAAO,MAAM,MAAM;AAAA,EACpD,aAAa,EAAE,OAAO,MAAM,OAAO,OAAO,MAAM,MAAM;AACxD;AAEA,IAAM,UAAU,CAAC,MACf,EAAE,QAAQ,WAAW,CAAC,QAAQ,EAAE,KAAK,SAAS,KAAK,QAAQ,KAAK,QAAQ,KAAK,SAAS,GAAG,EAAE,CAAE;AAGxF,SAAS,QAAQ,UAAuB,CAAC,GAAW;AACzD,QAAM,EAAE,OAAO,IAAI,UAAU,SAAS,MAAM,IAAI;AAChD,QAAM,EAAE,OAAO,MAAM,IAAI,QAAQ,OAAO;AAGxC,QAAM,aACJ,QAAQ,KACJ,iDAAiD,KAAK,qEACL,KAAK,qEACL,KAAK,qEACL,KAAK,yBACtD;AACN,QAAM,OAAO,QAAQ,0BAA0B,QAAQ,KAAK,CAAC,MAAM;AACnE,SACE,eAAe,IAAI,aAAa,IAAI,0EAA0E,IAAI,uDAC5D,KAAK,0EACL,KAAK,yBAC3D,aACA;AAEJ;;;AC3CO,SAAS,YAAoB;AAClC,SAAO,GAAG,UAAU,CAAC;AAAA,EAAK,KAAK;AACjC;;;ACLO,IAAM,MAAM,CAAC,MAClB,OAAO,KAAK,EAAE,EAAE,QAAQ,YAAY,CAAC,QAAQ,EAAE,KAAK,SAAS,KAAK,QAAQ,KAAK,QAAQ,KAAK,UAAU,KAAK,QAAQ,GAAG,EAAE,CAAE;AAE5H,IAAM,MAAM,UAAU;AAEtB,IAAM,QAAQ;AACd,IAAM,SAAS;AAiBR,SAAS,MAAM,GAAyB;AAC7C,QAAM,OAAO,EAAE,OACX,kDAAkD,EAAE,KAAK,GAAG,YAAY,IAAI,EAAE,KAAK,KAAK,CAAC,YACzF;AACJ,SAAO;AAAA,SACA,IAAI,EAAE,KAAK,CAAC;AAAA,SACZ,GAAG;AAAA;AAAA,0BAEc,QAAQ,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,6BAClB,IAAI,wBAAwB,IAAI,EAAE,IAAI,CAAC;AAAA;AAAA;AAAA,6BAGvC,IAAI,EAAE,QAAQ,CAAC;AAAA,IACxC,EAAE,OAAO,qBAAqB,EAAE,IAAI,SAAS,EAAE;AAAA,IAC/C,EAAE,QAAQ,EAAE;AAAA,IACZ,EAAE,eAAe,yBAAyB,MAAM,2HAA2H,EAAE;AAAA;AAAA;AAGjL;AAUA,IAAM,QAAQ,CAAC,QAAwB,GAAG,KAAK,EAAE,OAAO,CAAC,KAAK,KAAK,YAAY;AAE/E,IAAM,SAAS,CAAC,WAAoB,cAAsB,eACxD,YACI,6FAA6F,IAAI,UAAU,CAAC,YAC5G,8FAA8F,IAAI,YAAY,CAAC;AAErH,IAAM,OAAO,CAAC,MACZ;AAAA,8CAC4C,IAAI,EAAE,KAAK,CAAC;AAAA;AAAA,gEAEM,EAAE,OAAO,wBAAwB,EAAE,KAAK,IAAI,EAAE,KAAK,CAAC,+BAA+B,IAAI,EAAE,IAAI,CAAC;AAAA,6BACjI,IAAI,EAAE,IAAI,CAAC;AAAA;AAAA,MAElC,EAAE,MAAM;AAAA;AAGd,IAAM,WAAW,CAAC,gBAAkC,aAAa,YAAY,KAAK,IAAI,CAAC;AAEvF,IAAM,aAAa,CAAC,MAAc,UAA0B;AAC1D,QAAM,OAAO,6BAA6B,KAAK,KAAK,IAAI,aAAa;AACrE,SAAO,sDAAsD,IAAI,MAAM,QAAQ,MAAM,GAAG,CAAC,CAAC,uCAAuC,IAAI,IAAI,CAAC,WAAW,IAAI;AAC3J;AAEA,SAAS,aAAa,KAAoC;AACxD,SAAO,IAAI,UAAU,aAAa,WAAW,eAAe,aAAa,IAAI;AAC/E;AAEA,SAAS,gBAAgB,OAAe,KAAoC;AAC1E,SAAO,IAAI,MACR,IAAI,CAAC,SAAS;AACb,QAAI,KAAK,SAAS,UAAU;AAC1B,YAAM,OAAO,KAAK,QAAQ,SAAS,eAAY,KAAK,OAAO,KAAK,QAAK,CAAC,KAAK,aAAU,KAAK,IAAI;AAC9F,aAAO,2BAA2B,IAAI,UAAU,aAAa,0BAA0B,EAAE,mCAAmC,IAAI,KAAK,CAAC;AAAA,yDACrF,IAAI,IAAI,SAAS,CAAC;AAAA,oDACvB,IAAI,KAAK,IAAI,CAAC;AAAA,qDACb,IAAI,IAAI,KAAK,CAAC;AAAA,mCAChC,IAAI,IAAI,CAAC,GAAG,IAAI,UAAU,aAAa,4BAAyB,EAAE;AAAA,YACzF,aAAa,GAAG,CAAC;AAAA,8CACiB,IAAI,UAAU,aAAa,KAAK,UAAU,wBAAwB,KAAK;AAAA;AAAA,IAE/G;AACA,UAAM,SAAS,gDAAgD,IAAI,IAAI,SAAS,CAAC;AAAA,kDACrC,IAAI,KAAK,IAAI,CAAC;AAAA,mDACb,IAAI,IAAI,KAAK,CAAC;AAC3D,QAAI,KAAK,OAAO,WAAW,GAAG;AAC5B,aAAO,2BAA2B,IAAI,UAAU,aAAa,0BAA0B,EAAE,oCAAoC,IAAI,KAAK,CAAC;AAAA,YACnI,MAAM;AAAA,6CACwB,IAAI,KAAK,IAAI,CAAC,GAAG,IAAI,UAAU,aAAa,4BAAyB,EAAE;AAAA,YACrG,aAAa,GAAG,CAAC;AAAA,+CACkB,IAAI,UAAU,aAAa,KAAK,UAAU;AAAA;AAAA,IAEnF;AACA,WAAO;AAAA,2CAC2B,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,WAAW,SAAM,IAAI,KAAK,QAAQ,CAAC,KAAK,EAAE;AAAA,kEACtC,IAAI,KAAK,CAAC;AAAA,YAChE,MAAM;AAAA,YACN,aAAa,GAAG,CAAC;AAAA,YACjB,KAAK,OAAO,IAAI,CAAC,MAAM,WAAW,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,EAItE,CAAC,EACA,KAAK,EAAE;AACZ;AAEO,SAAS,gBAAgB,OAAe,MAA+B;AAC5E,QAAM,EAAE,aAAa,KAAK,UAAU,IAAI;AAExC,MAAI,IAAI,SAAS,cAAc;AAC7B,UAAM,QAAQ,IAAI,UAAU,aAAa,aAAa,IAAI;AAC1D,UAAMC,OAAM,KAAK;AAAA,MACf,OAAO,MAAM,IAAI,SAAS;AAAA,MAC1B,OAAO,IAAI;AAAA,MACX,MAAM;AAAA,MACN,MAAM,GAAG,YAAY,oBAAiB,EAAE,GAAG,SAAS,IAAI,WAAW,CAAC,SAAM,KAAK;AAAA,MAC/E,QAAQ,OAAO,WAAW,WAAW,OAAO;AAAA,IAC9C,CAAC;AACD,WAAO,uBAAuBA,IAAG,GAAG,YAAY,KAAK,gBAAgB,OAAO,GAAG,CAAC;AAAA,EAClF;AAEA,MAAI,IAAI,SAAS,UAAU;AACzB,UAAMA,OAAM,KAAK;AAAA,MACf,OAAO,MAAM,IAAI,IAAI;AAAA,MACrB,OAAO,IAAI;AAAA,MACX,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM,GAAG,IAAI,WAAW,GAAG,IAAI,QAAQ,WAAQ,EAAE,GAAG,SAAS,IAAI,WAAW,CAAC;AAAA,MAC7E,QAAQ,OAAO,WAAW,WAAW,KAAK;AAAA,IAC5C,CAAC;AACD,UAAMC,QAAO,YACT,KACA,4DAA4D,IAAI,KAAK,CAAC;AAAA,oDAC1B,IAAI,IAAI,IAAI,CAAC;AAAA,6IAC4E,IAAI,IAAI,IAAI,CAAC;AAAA;AAAA;AAGtJ,WAAO,uBAAuBD,IAAG,GAAGC,KAAI;AAAA,EAC1C;AAEA,QAAM,MAAM,KAAK;AAAA,IACf,OAAO,MAAM,IAAI,SAAS;AAAA,IAC1B,OAAO,GAAG,IAAI,SAAS,IAAI,IAAI,OAAO;AAAA,IACtC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM,6CAA0C,IAAI,UAAU;AAAA,IAC9D,QAAQ,OAAO,WAAW,iBAAiB,YAAY;AAAA,EACzD,CAAC;AACD,QAAM,OAAO,YACT,KACA;AAAA,6BACuB,IAAI,IAAI,YAAY,CAAC;AAAA,kEACgB,IAAI,KAAK,CAAC,YAAY,IAAI,IAAI,cAAc,CAAC;AAAA;AAAA;AAAA;AAAA;AAK7G,SAAO,uBAAuB,GAAG,GAAG,IAAI;AAC1C;AAIA,IAAM,cAAc,CAAC,QAAQ,OAAO,OAAO,SAAS,QAAQ,QAAQ,OAAO,SAAS,SAAS,MAAM;AAE5F,SAAS,aAAa,OAAe,MAAuB;AACjE,MAAI,KAAM,QAAO;AACjB,QAAM,QAAQ,YAAY,KAAK,KAAK,OAAO,KAAK;AAChD,SAAO,GAAG,KAAK,IAAI,UAAU,IAAI,UAAU,QAAQ;AACrD;AAGO,SAAS,YAAY,MAAsB;AAChD,MAAI,KAAK,WAAW,SAAS,EAAG,QAAO,SAAS,KAAK,MAAM,UAAU,MAAM,CAAC;AAC5E,MAAI,SAAS,UAAW,QAAO;AAC/B,SAAO,aAAa,IAAI;AAC1B;AAEO,SAAS,SAAS,GAMd;AACT,QAAM,QAAQ,EAAE,aAAa;AAC7B,QAAM,QAAQ,EAAE,aAAa,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE;AACxD,QAAM,UAAU,QAAQ;AACxB,QAAM,OAAO,EAAE,aAAc,QAAQ,KAAK,YAAY;AAEtD,QAAM,WACJ,UAAU,IACN,KACA;AAAA,+CACuC,KAAK,OAAO,KAAK,2CAA2C,UAAU,IAAI,GAAG,OAAO,aAAa,UAAU;AAAA,oFACtE,KAAK,MAAO,QAAQ,QAAS,GAAG,CAAC;AAAA;AAGnH,QAAM,SAAS,EAAE,SACb,iFAAiF,IAAI,YAAY,EAAE,MAAM,CAAC,CAAC,WAC3G;AAEJ,QAAM,QAAQ,UAAU,IAAI,KAAK,qCAAqC,EAAE,aAAa,IAAI,CAAC,MAAM,gBAAgB,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAEvI,SAAO,MAAM;AAAA,IACX,OAAO,OAAO,YAAY;AAAA,IAC1B,MAAM,EAAE;AAAA,IACR,MAAM,EAAE,KAAK,YAAY,OAAO,kBAAkB;AAAA,IAClD,UAAU,aAAa,OAAO,IAAI;AAAA,IAClC,MAAM,OACF,wGACA;AAAA,IACJ,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK;AAAA,IAClC,cAAc;AAAA,EAChB,CAAC;AACH;AAIO,SAAS,aAAa,GAAmK;AAC9L,QAAM,MAAM,KAAK;AAAA,IACf,OAAO,MAAM,EAAE,QAAQ;AAAA,IACvB,OAAO,EAAE;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ,OAAO,OAAO,iBAAiB,OAAO;AAAA,EAChD,CAAC;AACD,QAAM,OAAO,oCAAoC,GAAG;AAAA;AAAA;AAAA,2BAG3B,IAAI,EAAE,WAAW,CAAC;AAAA,gEACmB,IAAI,EAAE,KAAK,CAAC;AAAA,sDACtB,IAAI,EAAE,QAAQ,CAAC;AAAA,uDACd,IAAI,EAAE,SAAS,CAAC;AAAA,kDACrB,IAAI,EAAE,IAAI,CAAC;AAAA,mDACV,IAAI,EAAE,KAAK,CAAC;AAAA,UACrD,EAAE,YAAY,kDAAkD,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE;AAAA,UACzF,WAAW,aAAa,WAAW,CAAC;AAAA,UACpC,WAAW,iBAAiB,eAAe,CAAC;AAAA,iEACW,KAAK;AAAA;AAAA;AAAA;AAIpE,SAAO,MAAM;AAAA,IACX,OAAO,iBAAiB,EAAE,QAAQ;AAAA,IAClC,MAAM,EAAE;AAAA,IACR,MAAM,EAAE,KAAK,WAAW,OAAO,eAAe;AAAA,IAC9C,UAAU;AAAA,IACV,MAAM,2DAA2D,IAAI,EAAE,QAAQ,CAAC;AAAA,IAChF;AAAA,IACA,cAAc;AAAA,EAChB,CAAC;AACH;AAEO,SAAS,YAAY,GAOjB;AACT,SAAO,MAAM;AAAA,IACX,OAAO,EAAE;AAAA,IACT,MAAM,EAAE;AAAA,IACR,MAAM,EAAE;AAAA,IACR,UAAU,EAAE;AAAA,IACZ,MAAM,EAAE;AAAA,IACR,MAAM,EAAE,MAAM,mCAAmC,IAAI,EAAE,GAAG,CAAC,WAAW;AAAA,EACxE,CAAC;AACH;;;ALxQA,SAAS,OAAO,SAAyB;AACvC,MAAI;AACF,WAAO,IAAI,IAAI,OAAO,EAAE;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,WAAW,MAAmB,MAAsB,QAAkC;AACnG,QAAMC,UAAS,MAAM,kBAAkB,KAAK,IAAI,KAAK,QAAQ,IAAI;AACjE,SAAO,SAAS;AAAA,IACd,MAAM,OAAO,KAAK,OAAO;AAAA,IACzB,OAAO,KAAK;AAAA,IACZ,cAAcA,QAAO;AAAA,IACrB,WAAWA,QAAO,WAAW;AAAA,IAC7B;AAAA,EACF,CAAC;AACH;AAEO,SAAS,oBAAoB,MAAyB;AAC3D,QAAM,MAAM,IAAIC,MAAK;AACrB,QAAM,OAAO,OAAO,KAAK,OAAO;AAEhC,MAAI,IAAI,qBAAqB,OAAO,MAAM;AACxC,UAAM,YAAY,sBAAsB,EAAE,IAAI,MAAM,OAAO,CAAC;AAC5D,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,MAO7B;AAAA;AAAA,MAEA,CAAC,SAAS;AAAA,IACZ;AACA,UAAM,UAAU,KAAK,CAAC;AACtB,QAAI,CAAC,WAAW,CAAC,QAAQ,8BAA8B,CAAC,QAAQ,mBAAmB;AACjF,aAAO,EAAE;AAAA,QACP,YAAY;AAAA,UACV;AAAA,UACA,OAAO;AAAA,UACP,MAAM,EAAE,KAAK,UAAU,OAAO,gBAAgB;AAAA,UAC9C,UAAU;AAAA,UACV,MAAM;AAAA,QACR,CAAC;AAAA,QACD;AAAA,MACF;AAAA,IACF;AACA,UAAM,gBAAgB,MAAM,KAAK,OAAO;AAAA,MACtC,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,IACF;AACA,UAAM,aAAa,GAAG,KAAK,QAAQ,QAAQ,OAAO,EAAE,CAAC,cAAc,QAAQ,EAAE;AAC7E,WAAO,EAAE;AAAA,MACP,MAAM;AAAA,QACJ,OAAO,iBAAiB,QAAQ,IAAI;AAAA,QACpC;AAAA,QACA,MAAM,EAAE,KAAK,WAAW,OAAO,cAAc;AAAA,QAC7C,UAAU;AAAA,QACV,MAAM,+FAAiG,IAAI,QAAQ,IAAI,CAAC;AAAA,QACxH,MAAM;AAAA;AAAA;AAAA,iCAGmB,IAAI,QAAQ,iBAAiB,CAAC;AAAA;AAAA;AAAA;AAAA,iCAI9B,IAAI,UAAU,CAAC;AAAA;AAAA,iCAEf,IAAI,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,MAK7C,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,MAAI,IAAI,mBAAmB,OAAO,MAAM;AACtC,UAAM,OAAO,MAAM,eAAe,KAAK,IAAI,EAAE,IAAI,MAAM,OAAO,CAAC;AAC/D,QAAI,CAAC,MAAM;AACT,aAAO,EAAE;AAAA,QACP,YAAY;AAAA,UACV;AAAA,UACA,OAAO;AAAA,UACP,MAAM,EAAE,KAAK,UAAU,OAAO,eAAe;AAAA,UAC7C,UAAU;AAAA,UACV,MAAM;AAAA,QACR,CAAC;AAAA,QACD;AAAA,MACF;AAAA,IACF;AACA,QAAI,KAAK,WAAW,WAAW;AAC7B,aAAO,EAAE;AAAA,QACP,YAAY;AAAA,UACV;AAAA,UACA,OAAO;AAAA,UACP,MAAM,EAAE,KAAK,WAAW,OAAO,eAAe;AAAA,UAC9C,UAAU;AAAA,UACV,MAAM;AAAA,QACR,CAAC;AAAA,QACD;AAAA,MACF;AAAA,IACF;AACA,UAAM,SAAS,EAAE,IAAI,MAAM,MAAM;AACjC,WAAO,EAAE,KAAK,MAAM,WAAW,MAAM,MAAM,MAAM,CAAC;AAAA,EACpD,CAAC;AAED,MAAI,KAAK,0BAA0B,OAAO,MAAM;AAC9C,UAAM,OAAO,MAAM,eAAe,KAAK,IAAI,EAAE,IAAI,MAAM,OAAO,CAAC;AAC/D,QAAI,CAAC,QAAQ,KAAK,WAAW,UAAW,QAAO,EAAE,KAAK,mBAAmB,GAAG;AAC5E,UAAM,OAAO,MAAM,EAAE,IAAI,UAAU;AACnC,UAAM,OAAO,OAAO,KAAK,MAAM,KAAK,EAAE;AACtC,UAAM,QAAQ,OAAO,KAAK,OAAO,KAAK,EAAE;AACxC,QAAI,CAAC,KAAK,aAAa,KAAK,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,SAAS,IAAI,GAAG;AAC1E,aAAO,EAAE,KAAK,gCAAgC,GAAG;AAAA,IACnD;AACA,QAAI,MAAM,WAAW,EAAG,QAAO,EAAE,KAAK,eAAe,GAAG;AACxD,UAAM,KAAK,OAAO,UAAU,KAAK,cAAc,MAAM,KAAK;AAC1D,WAAO,EAAE,SAAS,YAAY,KAAK,KAAK,gBAAgB,mBAAmB,IAAI,CAAC,EAAE;AAAA,EACpF,CAAC;AAED,MAAI,KAAK,8BAA8B,OAAO,MAAM;AAClD,UAAM,OAAO,MAAM,eAAe,KAAK,IAAI,EAAE,IAAI,MAAM,OAAO,CAAC;AAC/D,QAAI,CAAC,QAAQ,KAAK,WAAW,UAAW,QAAO,EAAE,KAAK,mBAAmB,GAAG;AAC5E,UAAM,OAAO,MAAM,EAAE,IAAI,UAAU;AACnC,UAAM,YAAY,OAAO,KAAK,WAAW,KAAK,EAAE;AAChD,UAAM,WAAW,OAAO,KAAK,MAAM,KAAK,EAAE;AAC1C,UAAM,QAAQ,OAAO,KAAK,OAAO,KAAK,WAAW;AACjD,UAAM,MAAM,KAAK,aAAa;AAAA,MAC5B,CAAC,MAAkC,EAAE,SAAS,gBAAgB,EAAE,cAAc,aAAa,EAAE,UAAU;AAAA,IACzG;AACA,UAAM,OAAO,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ;AACvD,QAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,SAAU,QAAO,EAAE,KAAK,uCAAuC,GAAG;AAErG,UAAM,YAAY,IAAI,UAAU,aAAa,OAAO,KAAK,aAAa,KAAK,EAAE,EAAE,KAAK,IAAI;AACxF,QAAI,IAAI,UAAU,cAAc,UAAU,WAAW,EAAG,QAAO,EAAE,KAAK,uBAAuB,GAAG;AAChG,UAAM,SAAiC,CAAC;AACxC,eAAW,KAAK,KAAK,QAAQ;AAC3B,YAAM,IAAI,OAAO,KAAK,SAAS,CAAC,EAAE,KAAK,EAAE;AACzC,UAAI,EAAE,WAAW,EAAG,QAAO,EAAE,KAAK,iBAAiB,CAAC,IAAI,GAAG;AAC3D,aAAO,CAAC,IAAI;AAAA,IACd;AACA,UAAM,eAAe,MAAM,KAAK,OAAO,iBAAiB;AAAA,MACtD,aAAa,KAAK;AAAA,MAClB,aAAa;AAAA,MACb,GAAI,IAAI,aAAa,SAAY,EAAE,UAAU,IAAI,SAAS,IAAI,CAAC;AAAA,MAC/D,UAAU;AAAA,MACV,OAAO,IAAI;AAAA,MACX,GAAI,IAAI,UAAU,aAAa,EAAE,UAAU,IAAI,CAAC;AAAA,MAChD,OAAO;AAAA,IACT,CAAC;AACD,UAAM,KAAK,OAAO,wBAAwB,cAAc,MAAM;AAC9D,WAAO,EAAE,SAAS,YAAY,KAAK,KAAK,SAAS,mBAAmB,SAAS,CAAC,EAAE;AAAA,EAClF,CAAC;AAED,MAAI,IAAI,+BAA+B,OAAO,MAAM;AAClD,UAAM,OAAO,MAAM,eAAe,KAAK,IAAI,EAAE,IAAI,MAAM,OAAO,CAAC;AAC/D,QAAI,CAAC,QAAQ,KAAK,WAAW,UAAW,QAAO,EAAE,KAAK,mBAAmB,GAAG;AAC5E,UAAM,YAAY,EAAE,IAAI,MAAM,WAAW,KAAK;AAC9C,UAAM,WAAW,EAAE,IAAI,MAAM,MAAM,KAAK;AACxC,UAAM,QAAQ,EAAE,IAAI,MAAM,OAAO,KAAK;AACtC,UAAM,MAAM,KAAK,aAAa;AAAA,MAC5B,CAAC,MAAkC,EAAE,SAAS,gBAAgB,EAAE,cAAc,aAAa,EAAE,UAAU;AAAA,IACzG;AACA,UAAM,OAAO,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ;AACvD,QAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,YAAY,CAAC,IAAI,eAAe,QAAQ;AACzE,aAAO,EAAE,KAAK,6BAA6B,GAAG;AAAA,IAChD;AACA,UAAM,YAAY,IAAI,UAAU,cAAc,EAAE,IAAI,MAAM,aAAa,KAAK,IAAI,KAAK,IAAI;AACzF,QAAI,IAAI,UAAU,cAAc,UAAU,WAAW,EAAG,QAAO,EAAE,KAAK,uBAAuB,GAAG;AAChG,UAAM,WAAW,IAAI,YAAY,IAAI,cAAc;AACnD,UAAM,OAAO,MAAM,KAAK,OAAO,YAAY,KAAK,cAAc,QAAQ;AACtE,QAAI,CAAC,MAAM;AAET,aAAO,EAAE;AAAA,QACP,aAAa;AAAA,UACX;AAAA,UACA,OAAO,KAAK;AAAA,UACZ;AAAA,UACA;AAAA,UACA,MAAM;AAAA,UACN,OAAO,IAAI;AAAA,UACX,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,UACjC,aAAa,GAAG,KAAK,OAAO;AAAA,QAC9B,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,eAAe,MAAM,KAAK,OAAO,iBAAiB;AAAA,MACtD,aAAa,KAAK;AAAA,MAClB,aAAa;AAAA,MACb;AAAA,MACA,UAAU;AAAA,MACV,OAAO,IAAI;AAAA,MACX,GAAI,IAAI,UAAU,aAAa,EAAE,UAAU,IAAI,CAAC;AAAA,MAChD,OAAO;AAAA,IACT,CAAC;AACD,UAAM,QAAQ,MAAMC,aAAY,EAAE,EAAE,SAAS,KAAK,CAAC;AACnD,UAAM,QAAQ,IAAI,cAAc;AAChC,UAAM,OAAO,MAAM,SAAS,QAAQ,SAAY,aAAa;AAC7D,UAAM,cAAc,GAAG,KAAK,OAAO;AACnC,UAAM,KAAK,GAAG;AAAA,MACZ;AAAA;AAAA,MAEA,CAAC,OAAO,KAAK,OAAO,cAAc,UAAU,MAAM,YAAY,MAAM,WAAW;AAAA,IACjF;AACA,UAAM,MAAM,kBAAkB;AAAA,MAC5B;AAAA,MACA,UAAU,KAAK;AAAA,MACf;AAAA,MACA,QAAQ,KAAK,UAAU,CAAC;AAAA,MACxB;AAAA,MACA,eAAe,MAAM;AAAA,IACvB,CAAC;AACD,WAAO,EAAE,SAAS,GAAG;AAAA,EACvB,CAAC;AAED,MAAI,KAAK,6BAA6B,OAAO,MAAM;AACjD,UAAM,OAAO,MAAM,eAAe,KAAK,IAAI,EAAE,IAAI,MAAM,OAAO,CAAC;AAC/D,QAAI,CAAC,QAAQ,KAAK,WAAW,UAAW,QAAO,EAAE,KAAK,mBAAmB,GAAG;AAC5E,UAAM,OAAO,MAAM,EAAE,IAAI,UAAU;AACnC,UAAM,WAAW,OAAO,KAAK,UAAU,KAAK,EAAE;AAC9C,UAAM,WAAW,OAAO,KAAK,WAAW,KAAK,EAAE;AAC/C,UAAM,eAAe,OAAO,KAAK,eAAe,KAAK,EAAE;AACvD,QAAI,CAAC,YAAY,CAAC,YAAY,CAAC,aAAc,QAAO,EAAE,KAAK,kBAAkB,GAAG;AAChF,UAAM,KAAK,OAAO,YAAY,KAAK,cAAc,UAAU,UAAU,YAAY;AACjF,UAAM,SAAS,IAAI,gBAAgB;AAAA,MACjC,WAAW,OAAO,KAAK,WAAW,CAAC;AAAA,MACnC,MAAM,OAAO,KAAK,MAAM,CAAC;AAAA,MACzB,OAAO,OAAO,KAAK,OAAO,KAAK,WAAW;AAAA,IAC5C,CAAC;AACD,UAAM,YAAY,OAAO,KAAK,aAAa,KAAK,EAAE,EAAE,KAAK;AACzD,QAAI,UAAW,QAAO,IAAI,eAAe,SAAS;AAClD,WAAO,EAAE,SAAS,YAAY,KAAK,KAAK,gBAAgB,MAAM,EAAE;AAAA,EAClE,CAAC;AAED,MAAI,IAAI,mBAAmB,OAAO,MAAM;AACtC,UAAM,aAAa,CAAC,MAAc,QAChC,YAAY;AAAA,MACV;AAAA,MACA,OAAO;AAAA,MACP,MAAM,EAAE,KAAK,UAAU,OAAO,cAAc;AAAA,MAC5C,UAAU;AAAA,MACV;AAAA,MACA,GAAI,QAAQ,SAAY,EAAE,IAAI,IAAI,CAAC;AAAA,IACrC,CAAC;AAEH,UAAM,QAAQ,EAAE,IAAI,MAAM,OAAO,KAAK;AACtC,UAAM,OAAO,EAAE,IAAI,MAAM,MAAM,KAAK;AACpC,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG,MAQ5B,6CAA6C,CAAC,KAAK,CAAC;AACvD,UAAM,KAAK,KAAK,CAAC;AACjB,QAAI,CAAC,MAAM,IAAI,KAAK,OAAO,GAAG,UAAU,CAAC,EAAE,QAAQ,IAAI,KAAK,IAAI,GAAG;AACjE,aAAO,EAAE,KAAK,WAAW,0DAA0D,GAAG,GAAG;AAAA,IAC3F;AACA,UAAM,KAAK,GAAG,MAAM,2CAA2C,CAAC,KAAK,CAAC;AACtE,QAAI,CAAC,KAAM,QAAO,EAAE,KAAK,WAAW,0BAA0B,IAAI,EAAE,IAAI,MAAM,OAAO,KAAK,gBAAgB,CAAC,GAAG,GAAG,GAAG;AAEpH,UAAM,OAAO,GAAG,gBAAgB,MAAM,eAAe,KAAK,IAAI,GAAG,aAAa,IAAI;AAClF,UAAM,MAAM,MAAM,aAAa;AAAA,MAC7B,CAAC,MACC,EAAE,SAAS,iBAAiB,EAAE,YAAY,EAAE,eAAe,QAAQ,GAAG;AAAA,IAC1E;AACA,UAAM,QAAQ,KAAK,eAAe;AAClC,QAAI,CAAC,QAAQ,CAAC,MAAO,QAAO,EAAE,KAAK,WAAW,+BAA+B,GAAG,GAAG;AAEnF,UAAM,OAAO,MAAM,KAAK,OAAO,YAAY,KAAK,cAAc,GAAG,QAAQ;AACzE,QAAI,CAAC,KAAM,QAAO,EAAE,KAAK,WAAW,8BAA8B,GAAG,GAAG;AAExE,QAAI;AACF,YAAMC,UAAS,MAAM,aAAa;AAAA,QAChC;AAAA,QACA,UAAU,KAAK;AAAA,QACf,cAAc,KAAK;AAAA,QACnB;AAAA,QACA,aAAa,GAAG;AAAA,QAChB,cAAc,GAAG,iBAAiB;AAAA,MACpC,CAAC;AACD,YAAM,KAAK,OAAO;AAAA,QAChB,GAAG;AAAA,QACH;AAAA,UACE,cAAcA,QAAO;AAAA,UACrB,GAAIA,QAAO,iBAAiB,SAAY,EAAE,eAAeA,QAAO,aAAa,IAAI,CAAC;AAAA,QACpF;AAAA,QACA;AAAA,UACE,GAAIA,QAAO,cAAc,SAAY,EAAE,WAAWA,QAAO,UAAU,IAAI,CAAC;AAAA,UACxE,GAAIA,QAAO,UAAU,SAAY,EAAE,OAAOA,QAAO,MAAM,IAAI,CAAC;AAAA,QAC9D;AAAA,MACF;AAAA,IACF,SAASC,MAAK;AACZ,aAAO,EAAE,KAAK,WAAW,0BAA2BA,KAAc,OAAO,GAAG,GAAG;AAAA,IACjF;AACA,WAAO,EAAE,SAAS,YAAY,KAAK,KAAK,SAAS,mBAAmB,IAAK,SAAS,CAAC,EAAE;AAAA,EACvF,CAAC;AAGD,MAAI,KAAK,2CAA2C,OAAO,MAAM;AAC/D,UAAM,OAAO,MAAM,eAAe,KAAK,IAAI,EAAE,IAAI,MAAM,OAAO,CAAC;AAC/D,QAAI,CAAC,QAAQ,KAAK,WAAW,UAAW,QAAO,EAAE,KAAK,mBAAmB,GAAG;AAC5E,UAAM,QAAQ,EAAE,IAAI,MAAM,gBAAgB;AAC1C,QAAI,CAAC,KAAK,aAAa,KAAK,CAAC,MAAM,EAAE,SAAS,oBAAoB,EAAE,mBAAmB,KAAK,GAAG;AAC7F,aAAO,EAAE,KAAK,sCAAsC,GAAG;AAAA,IACzD;AACA,UAAM,OAAO,MAAM,EAAE,IAAI,UAAU;AACnC,UAAMC,UAAS,OAAO,KAAK,gBAAgB,KAAK,EAAE;AAClD,QAAIA,QAAO,WAAW,EAAG,QAAO,EAAE,KAAK,wBAAwB,GAAG;AAClE,UAAM,SAAS,MAAM,KAAK,OAAO,aAAa,KAAK,cAAcA,SAAQ,iBAAiB;AAC1F,UAAM,KAAK,GAAG;AAAA,MACZ;AAAA,MACA,CAAC,OAAO,MAAM;AAAA,IAChB;AACA,WAAO,EAAE,SAAS,YAAY,KAAK,KAAK,eAAe;AAAA,EACzD,CAAC;AAED,SAAO;AACT;;;AMzVA,SAAS,cAAAC,aAAY,mBAAAC,wBAAuB;AAC5C,SAAS,QAAAC,aAAY;AAgBrB,SAAS,gBAAgB,GAAoC;AAC3D,QAAM,MAA8B,CAAC;AACrC,IAAE,QAAQ,CAAC,GAAG,MAAM;AAClB,QAAI,EAAE,YAAY,CAAC,IAAI;AAAA,EACzB,CAAC;AACD,SAAO;AACT;AAEA,SAAS,gBAAgB,GAAW,GAAoB;AACtD,QAAM,KAAK,OAAO,KAAK,CAAC;AACxB,QAAM,KAAK,OAAO,KAAK,CAAC;AACxB,SAAO,GAAG,WAAW,GAAG,UAAUC,iBAAgB,IAAI,EAAE;AAC1D;AAEA,SAAS,0BAA0B,SAAkB,SAAqBC,SAAyB;AACjG,QAAM,WAAWC,YAAW,UAAUD,OAAM,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AAC1E,QAAM,SAAS,QAAQ,IAAI,qBAAqB;AAChD,MAAI,QAAQ,WAAW,SAAS,KAAK,gBAAgB,OAAO,MAAM,UAAU,MAAM,GAAG,QAAQ,EAAG,QAAO;AACvG,QAAM,SAAS,QAAQ,IAAI,oBAAoB;AAC/C,MAAI,QAAQ,WAAW,SAAS,KAAK,gBAAgB,OAAO,MAAM,UAAU,MAAM,GAAG,QAAQ,EAAG,QAAO;AACvG,SAAO;AACT;AAEO,SAAS,cAAc,MAAyB;AACrD,QAAM,MAAM,IAAIE,MAAK;AAIrB,MAAI,KAAK,sDAAsD,OAAO,MAAM;AAC1E,UAAM,cAAc,EAAE,IAAI,MAAM,SAAS;AACzC,UAAM,YAAY,EAAE,IAAI,MAAM,YAAY;AAC1C,UAAM,WAAW,uCAAuC,KAAK,SAAS;AACtE,UAAM,eAAe,UAAU,SAAS,IAAI,KAAK;AACjD,UAAM,SAAS,UAAU,SAAS,GAAG;AAErC,UAAM,EAAE,MAAM,SAAS,IAAI,MAAM,KAAK,GAAG;AAAA,MACvC;AAAA,MACA,CAAC,WAAW;AAAA,IACd;AACA,UAAM,UAAU,SAAS,CAAC;AAC1B,QAAI,CAAC,QAAS,QAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,SAAS,kBAAkB,EAAE,GAAG,GAAG;AAE7F,QAAI;AACJ,QAAI,WAA8D,CAAC;AACnE,QAAI,WAAW,QAAW;AACxB,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,QAC7B;AAAA,QACA,CAAC,QAAQ,IAAI,cAAc,OAAO,MAAM,CAAC;AAAA,MAC3C;AACA,kBAAY,KAAK,CAAC,GAAG;AACrB,iBAAW,KAAK,CAAC,GAAG,YAAY,CAAC;AAAA,IACnC,OAAO;AACL,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,QAC7B;AAAA;AAAA,QAEA,CAAC,QAAQ,IAAI,YAAY;AAAA,MAC3B;AACA,kBAAY,KAAK,CAAC,GAAG;AACrB,iBAAW,KAAK,CAAC,GAAG,YAAY,CAAC;AAAA,IACnC;AACA,QAAI,CAAC,UAAW,QAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,SAAS,0BAA0B,EAAE,GAAG,GAAG;AACvG,QAAI,SAAS,SAAS,SAAS,UAAa,SAAS,QAAQ,SAAS,WAAW;AAC/E,aAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,SAAS,sCAAsC,EAAE,GAAG,GAAG;AAAA,IACzG;AAEA,UAAM,UAAU,IAAI,WAAW,MAAM,EAAE,IAAI,YAAY,CAAC;AACxD,QAAI;AACJ,UAAMC,QAAO,IAAI,YAAY,EAAE,OAAO,OAAO;AAC7C,QAAI;AACF,cAAQA,MAAK,SAAS,IAAI,KAAK,MAAMA,KAAI,IAAI;AAAA,IAC/C,QAAQ;AACN,cAAQ;AAAA,IACV;AACA,UAAM,QAAgC,CAAC;AACvC,eAAW,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,EAAE,IAAI,GAAG,EAAE,aAAc,OAAM,CAAC,IAAI;AAEjE,UAAM,QAAQ,MAAM,UAAU,KAAK,IAAI;AAAA,MACrC,WAAW,QAAQ;AAAA,MACnB;AAAA,MACA;AAAA,MACA,SAAS;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,UACP,SAAS,gBAAgB,EAAE,IAAI,IAAI,OAAO;AAAA,UAC1C;AAAA,UACA,YAAY,OAAO,KAAK,OAAO,EAAE,SAAS,QAAQ;AAAA,QACpD;AAAA,MACF;AAAA,MACA,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC;AAAA,IACzC,CAAC;AAED,QAAI,SAAS,SAAS,YAAY,QAAQ;AACxC,YAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,aAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,cAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,UAC7B;AAAA,UACA,CAAC,KAAM;AAAA,QACT;AACA,cAAM,MAAM,KAAK,CAAC;AAClB,YAAI,IAAI,WAAW,YAAa,QAAO,EAAE,KAAK,EAAE,OAAO,QAAQ,IAAI,OAAO,CAAC;AAC3E,YAAI,IAAI,WAAW,YAAY,IAAI,WAAW,aAAa;AACzD,iBAAO,EAAE,KAAK,EAAE,OAAO,OAAO,IAAI,MAAM,GAAG,GAAG;AAAA,QAChD;AACA,cAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAAA,MAC7C;AAAA,IACF;AACA,WAAO,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG;AAAA,EAC9B,CAAC;AAGD,MAAI,KAAK,qBAAqB,OAAO,MAAM;AACzC,QAAI,CAAC,KAAK,kBAAkB;AAC1B,aAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,SAAS,iCAAiC,EAAE,GAAG,GAAG;AAAA,IAChG;AACA,UAAM,UAAU,IAAI,WAAW,MAAM,EAAE,IAAI,YAAY,CAAC;AACxD,UAAM,QAAgC,CAAC;AACvC,eAAW,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,EAAE,IAAI,GAAG,EAAE,aAAc,OAAM,CAAC,IAAI;AACjE,UAAM,SAAS,MAAM,KAAK,iBAAiB,EAAE,IAAI,MAAM,OAAO,GAAG;AAAA,MAC/D,SAAS,gBAAgB,EAAE,IAAI,IAAI,OAAO;AAAA,MAC1C;AAAA,MACA;AAAA,IACF,CAAC;AACD,WAAO,EAAE,YAAY,OAAO,MAAM,OAAO,QAAiB;AAAA,MACxD,gBAAgB,OAAO,eAAe;AAAA,IACxC,CAAC;AAAA,EACH,CAAC;AAKD,QAAM,mBAAmB,OAAO,cAAqC;AACnE,UAAM,KAAK,GAAG;AAAA,MAAG,CAAC,MAChB,QAAQ,GAAG;AAAA,QACT,MAAM;AAAA,QACN,SAAS,EAAE,UAAU;AAAA,QACrB,WAAW,aAAa,SAAS;AAAA,QACjC,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,KAAK,8BAA8B,OAAO,MAAM;AAClD,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG,MAI5B,iFAAiF,CAAC,EAAE,IAAI,MAAM,WAAW,CAAC,CAAC;AAC9G,UAAM,UAAU,KAAK,CAAC;AACtB,QAAI,CAAC,SAAS,4BAA4B;AACxC,aAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,SAAS,eAAe,EAAE,GAAG,GAAG;AAAA,IAC9E;AACA,UAAM,UAAU,IAAI,WAAW,MAAM,EAAE,IAAI,YAAY,CAAC;AACxD,UAAMH,UAAS,MAAM,KAAK,OAAO;AAAA,MAC/B,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,IACF;AACA,QAAI,CAAC,0BAA0B,EAAE,IAAI,IAAI,SAAS,SAASA,OAAM,GAAG;AAClE,aAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,SAAS,yBAAyB,EAAE,GAAG,GAAG;AAAA,IAC3F;AACA,UAAM,iBAAiB,QAAQ,EAAE;AACjC,WAAO,EAAE,KAAK,EAAE,QAAQ,KAAK,GAAG,GAAG;AAAA,EACrC,CAAC;AAKD,MAAI,KAAK,iCAAiC,OAAO,MAAM;AACrD,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,MAC7B;AAAA,MACA,CAAC,EAAE,IAAI,MAAM,WAAW,CAAC;AAAA,IAC3B;AACA,UAAM,UAAU,KAAK,CAAC;AACtB,QAAI,CAAC,SAAS,uBAAuB,CAAC,gBAAgB,QAAQ,qBAAqB,EAAE,IAAI,MAAM,QAAQ,CAAC,GAAG;AACzG,aAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,SAAS,eAAe,EAAE,GAAG,GAAG;AAAA,IAC9E;AACA,UAAM,iBAAiB,QAAQ,EAAE;AACjC,WAAO,EAAE,KAAK,EAAE,QAAQ,KAAK,GAAG,GAAG;AAAA,EACrC,CAAC;AAED,SAAO;AACT;;;AZhMO,SAAS,UAAU,MAAsB;AAC9C,QAAM,MAAM,IAAII,MAAK;AACrB,QAAM,UAAU,KAAK,WAAW;AAChC,MAAI;AAAA,IAAI;AAAA,IAAK,CAAC,MACZ,EAAE,KAAK;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,MACN,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AACA,MAAI,IAAI,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,MAAM,SAAS,UAAU,QAAQ,CAAC,CAAC;AAC3E,MAAI,IAAI,WAAW,OAAO,MAAM;AAC9B,UAAMC,UAAS,MAAM,gBAAgB,IAAI;AACzC,WAAO,EAAE,KAAKA,SAAQA,QAAO,KAAK,MAAM,GAAG;AAAA,EAC7C,CAAC;AACD,MAAI,MAAM,QAAQ,UAAU,IAAI,CAAC;AACjC,MAAI,MAAM,KAAK,oBAAoB,IAAI,CAAC;AACxC,MAAI,MAAM,KAAK,cAAc,IAAI,CAAC;AAClC,SAAO;AACT;;;AafO,IAAM,SAAN,MAAa;AAAA,EAIlB,YACmB,IACA,UACA,OAAmB,CAAC,GACrC;AAHiB;AACA;AACA;AAAA,EAChB;AAAA,EAHgB;AAAA,EACA;AAAA,EACA;AAAA,EANX,UAAU;AAAA,EACV,cAAoC;AAAA,EAQ5C,QAAc;AACZ,QAAI,KAAK,QAAS;AAClB,SAAK,UAAU;AACf,SAAK,cAAc,KAAK,KAAK;AAAA,EAC/B;AAAA,EAEA,MAAM,OAAsB;AAC1B,SAAK,UAAU;AACf,UAAM,KAAK;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,MAAM,UAAU,KAAuB;AAC3C,QAAI,IAAI;AACR,WAAO,IAAI,SAAS;AAClB,YAAM,MAAM,MAAM,MAAM,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,KAAK,KAAK;AAChE,UAAI,CAAC,IAAK;AACV,YAAM,KAAK,SAAS,GAAG;AACvB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,OAAsB;AAClC,UAAM,SAAS,KAAK,KAAK,kBAAkB;AAC3C,WAAO,KAAK,SAAS;AACnB,UAAI,MAAyB;AAC7B,UAAI;AACF,cAAM,MAAM,MAAM,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,KAAK,KAAK;AAAA,MAC5D,SAASC,MAAK;AACZ,aAAK,KAAK,UAAUA,IAAG;AAAA,MACzB;AACA,UAAI,CAAC,KAAK;AACR,cAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC;AAC9C;AAAA,MACF;AACA,YAAM,KAAK,SAAS,GAAG;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAc,SAAS,KAAgC;AACrD,UAAM,UAAU,KAAK,SAAS,IAAI,IAAI;AACtC,UAAM,OAAO,YAAY,MAAM;AAC7B,WAAK,UAAU,KAAK,IAAI,IAAI,EAAE,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IAChD,GAAG,GAAM;AACT,SAAK,QAAQ;AACb,QAAI;AACF,UAAI,CAAC,QAAS,OAAM,IAAI,MAAM,4BAA4B,IAAI,IAAI,GAAG;AACrE,YAAM,QAAQ,GAAG;AACjB,YAAM,SAAS,KAAK,IAAI,IAAI,EAAE;AAAA,IAChC,SAASA,MAAK;AACZ,WAAK,KAAK,UAAUA,MAAK,GAAG;AAC5B,YAAM,KAAK,KAAK,IAAI,KAAMA,MAAe,SAAS,OAAOA,IAAG,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IAC/E,UAAE;AACA,oBAAc,IAAI;AAAA,IACpB;AAAA,EACF;AACF;;;AChFA,SAAS,YAAY;AAUd,SAAS,SAAS,MAAc,IAAwB,QAAQ,oBAAI,KAAK,GAAgB;AAC9F,QAAM,IAAI,IAAI,KAAK,MAAM,EAAE,UAAU,MAAM,MAAM,CAAC;AAClD,SAAO,EAAE,QAAQ,KAAK;AACxB;AAGA,eAAsB,cACpB,IACA,WACA,KACA,OACe;AACf,QAAM,GAAG,GAAG,OAAO,MAAM;AACvB,UAAM,MAAM,MAAM,IAAI,CAAC,MAAM,EAAE,YAAY;AAC3C,QAAI,IAAI,WAAW,GAAG;AACpB,YAAM,EAAE,MAAM,wDAAwD,CAAC,WAAW,GAAG,CAAC;AACtF;AAAA,IACF;AACA,UAAM,EAAE;AAAA,MACN;AAAA,MACA,CAAC,WAAW,KAAK,GAAG;AAAA,IACtB;AACA,eAAW,QAAQ,OAAO;AACxB,YAAM,OAAO,SAAS,KAAK,MAAM,KAAK,EAAE;AACxC,YAAM,EAAE;AAAA,QACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAYA,CAAC,WAAW,KAAK,cAAc,KAAK,KAAK,MAAM,KAAK,MAAM,MAAM,MAAM,YAAY,KAAK,IAAI;AAAA,MAC7F;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAIA,eAAsB,cAAc,IAAQ,MAAM,oBAAI,KAAK,GAAsB;AAC/E,QAAM,UAAoB,CAAC;AAE3B,aAAS;AACP,UAAM,QAAQ,MAAM,GAAG,GAAG,OAAO,MAAM;AACrC,YAAM,EAAE,KAAK,IAAI,MAAM,EAAE;AAAA,QAQvB;AAAA;AAAA;AAAA,QAGA,CAAC,IAAI,YAAY,CAAC;AAAA,MACpB;AACA,YAAM,MAAM,KAAK,CAAC;AAClB,UAAI,CAAC,IAAK,QAAO;AAEjB,YAAM,OAAO,SAAS,IAAI,MAAM,IAAI,MAAM,QAAW,GAAG;AACxD,YAAM,EAAE;AAAA,QACN;AAAA,QACA,CAAC,IAAI,YAAY,IAAI,eAAe,IAAI,KAAK,MAAM,YAAY,KAAK,IAAI;AAAA,MAC1E;AAEA,YAAM,QAAQ,MAAM,EAAE;AAAA,QACpB;AAAA,QACA,CAAC,IAAI,YAAY,IAAI,eAAe,IAAI,GAAG;AAAA,MAC7C;AACA,YAAM,YAAY,MAAM,KAAK,CAAC,GAAG;AACjC,UAAI,CAAC,UAAW,QAAO;AAEvB,YAAM,QAAQ,MAAM,UAAU,GAAG;AAAA,QAC/B,WAAW,IAAI;AAAA,QACf,cAAc,IAAI;AAAA,QAClB;AAAA,QACA,KAAK,IAAI;AAAA,QACT,SAAS,EAAE,MAAM,YAAY,MAAM,IAAI,MAAM,cAAc,IAAI,UAAU;AAAA,MAC3E,CAAC;AACD,aAAO;AAAA,IACT,CAAC;AACD,QAAI,UAAU,KAAM;AACpB,QAAI,OAAO,UAAU,YAAY,UAAU,WAAY,SAAQ,KAAK,KAAK;AAAA,EAC3E;AACA,SAAO;AACT;AAEO,SAAS,eAAe,IAAQ,OAAgE,CAAC,GAAe;AACrH,QAAM,WAAW,YAAY,MAAM;AACjC,kBAAc,EAAE,EAAE,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;AAAA,EAClD,GAAG,KAAK,cAAc,GAAK;AAC3B,WAAS,QAAQ;AACjB,SAAO,MAAM,cAAc,QAAQ;AACrC;;;AClGA,IAAM,yBAAyB,IAAI,KAAK;AACxC,IAAM,6BAA6B;AAEnC,eAAsB,gBAAgB,IAAQ,OAA6B,CAAC,GAAoC;AAC9G,QAAM,MAAM,KAAK,OAAO,oBAAI,KAAK;AACjC,QAAM,cAAc,IAAI,KAAK,IAAI,QAAQ,KAAK,KAAK,gBAAgB,uBAAuB;AAE1F,QAAM,SAAS,MAAM,GAAG;AAAA,IACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAqBA,CAAC,IAAI,YAAY,CAAC;AAAA,EACpB;AAEA,QAAM,YAAY,MAAM,GAAG;AAAA,IACzB;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,IA4BA,CAAC,YAAY,YAAY,GAAG,IAAI,YAAY,CAAC;AAAA,EAC/C;AAEA,SAAO;AAAA,IACL,mBAAmB,OAAO;AAAA,IAC1B,wBAAwB,OAAO,UAAU,KAAK,CAAC,GAAG,SAAS,CAAC;AAAA,EAC9D;AACF;AAEO,SAAS,YACd,IACA,OAA+G,CAAC,GACpG;AACZ,MAAI,WAAW;AACf,QAAM,OAAO,MAAM;AACjB,QAAI,SAAU;AACd,eAAW;AACX,SAAK,gBAAgB,IAAI,EAAE,cAAc,KAAK,aAAa,CAAC,EACzD,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,EAC9B,QAAQ,MAAM;AACb,iBAAW;AAAA,IACb,CAAC;AAAA,EACL;AACA,QAAM,WAAW,YAAY,MAAM,KAAK,cAAc,0BAA0B;AAChF,WAAS,QAAQ;AACjB,OAAK;AACL,SAAO,MAAM,cAAc,QAAQ;AACrC;;;ACrGA,SAAS,qBAAqB;AAIvB,IAAM,iBAAN,MAAqB;AAAA,EAI1B,YAA6B,IAAQ;AAAR;AAAA,EAAS;AAAA,EAAT;AAAA,EAHrB,QAAQ,oBAAI,IAAuE;AAAA,EACnF,WAAW,oBAAI,IAA8D;AAAA;AAAA,EAKrF,OAAO,WAAmB,KAA6D;AACrF,SAAK,SAAS,IAAI,WAAW,GAAG;AAAA,EAClC;AAAA,EAEA,OAAO,OAAO,cAAiF;AAC7F,UAAM,WAAW,KAAK,SAAS,IAAI,SAAS;AAC5C,QAAI,SAAU,QAAO;AACrB,QAAI,IAAI,KAAK,MAAM,IAAI,SAAS;AAChC,QAAI,CAAC,GAAG;AACN,WAAK,YAAY;AACf,cAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,UAC7B;AAAA,UACA,CAAC,SAAS;AAAA,QACZ;AACA,YAAI,CAAC,KAAK,CAAC,EAAG,OAAM,IAAI,MAAM,yBAAyB,SAAS,EAAE;AAClE,cAAM,MAAO,MAAM,OAAO,cAAc,KAAK,CAAC,EAAE,WAAW,EAAE;AAG7D,YAAI,CAAC,IAAI,QAAS,OAAM,IAAI,MAAM,kCAAkC,KAAK,CAAC,EAAE,WAAW,EAAE;AACzF,eAAO,IAAI;AAAA,MACb,GAAG;AACH,WAAK,MAAM,IAAI,WAAW,CAAC;AAC3B,QAAE,MAAM,MAAM,KAAK,MAAM,OAAO,SAAS,CAAC;AAAA,IAC5C;AACA,WAAO;AAAA,EACT;AACF;;;ACjCA,SAAS,cAAAC,mBAAkB;;;ACwCpB,SAAS,WAAW,GAAwD;AACjF,SAAO,EAAE,cAAc;AACzB;AACO,SAAS,cAAc,GAAsD;AAClF,SAAO,EAAE,cAAc;AACzB;AAIA,eAAsB,mBACpB,MACA,WACA,cACA,KACiC;AACjC,QAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,IAK7B;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,CAAC,WAAW,cAAc,GAAG;AAAA,EAC/B;AACA,QAAM,MAAM,KAAK,CAAC;AAClB,MAAI,CAAC,OAAO,IAAI,SAAS,SAAS,SAAS,YAAa,QAAO;AAC/D,QAAM,WAAW,IAAI,SAAS;AAE9B,QAAM,MAAM,MAAM,KAAK,eAAe,IAAI,UAAU;AACpD,QAAM,YAAa,IAAI,cACrB,SAAS,UACX;AACA,MAAI,CAAC,aAAa,UAAU,OAAO,SAAS,WAAW;AACrD,UAAM,IAAI;AAAA,MACR,cAAc,YAAY,yBAAyB,SAAS,UAAU;AAAA,IACxE;AAAA,EACF;AACA,QAAM,OAAO,UAAU,YAAY,WAAW,SAAS,OAAO;AAC9D,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,cAAc,aAAa,SAAS,SAAS,oBAAoB,SAAS,OAAO,GAAG;AAAA,EAChG;AAEA,QAAM,OAAO,MAAM,KAAK,OAAO,eAAe;AAAA,IAC5C,aAAa,IAAI;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,SAAS;AAAA,IACjB,aAAa,SAAS;AAAA,IACtB,OAAO,UAAU,SAAS;AAAA,EAC5B,CAAC;AACD,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,SAAS,MAAM;AAAA,IACnB,KAAK;AAAA,IACL,cAAc,SAAS,MAAM;AAAA,IAC7B,GAAG,SAAS,SAAS,aAAa,SAAS,OAAO;AAAA,EACpD;AAEA,SAAO;AAAA,IACL;AAAA,IACA,aAAa,IAAI;AAAA,IACjB;AAAA,IACA;AAAA,IACA,WAAW,IAAI;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,EACd;AACF;AAIA,IAAM,iBAAiB,KAAK,KAAK,OAAO;AACxC,IAAM,WAAW;AAQjB,eAAsB,iBACpB,IACA,KACA,MACuB;AACvB,QAAM,EAAE,KAAK,IAAI,MAAM,GAAG;AAAA,IACxB;AAAA;AAAA,IAEA,CAAC,IAAI,WAAW,IAAI,cAAc,IAAI,WAAW,IAAI,YAAY;AAAA,EACnE;AACA,MAAI,KAAK,CAAC,EAAG,QAAO,KAAK,CAAC;AAC1B,QAAM,GAAG;AAAA,IACP;AAAA;AAAA,IAEA,CAAC,IAAI,WAAW,IAAI,cAAc,IAAI,WAAW,IAAI,cAAc,IAAI;AAAA,EACzE;AACA,SAAO,EAAE,MAAM,CAAC,GAAG,QAAQ,MAAM,QAAQ,MAAM;AACjD;AAEO,SAAS,UAAU,MAA+B,OAAwC;AAC/F,QAAM,SAAS,QAAQ;AACvB,QAAM,SAAS,KAAK,OAAO,CAAC,CAAC,EAAE,EAAE,MAAM,MAAM,MAAM;AACnD,SAAO,OAAO,SAAS,WAAW,OAAO,MAAM,OAAO,SAAS,QAAQ,IAAI;AAC7E;AAEA,eAAsB,iBACpB,IACA,KACA,OACe;AACf,QAAM,OAAiB,CAAC;AACxB,QAAM,SAAoB,CAAC,IAAI,WAAW,IAAI,cAAc,IAAI,WAAW,IAAI,YAAY;AAC3F,MAAI,MAAM,SAAS,QAAW;AAC5B,WAAO,KAAK,KAAK,UAAU,MAAM,IAAI,CAAC;AACtC,SAAK,KAAK,WAAW,OAAO,MAAM,SAAS;AAAA,EAC7C;AACA,MAAI,MAAM,WAAW,QAAW;AAC9B,WAAO,KAAK,MAAM,WAAW,OAAO,OAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AACvE,SAAK,KAAK,aAAa,OAAO,MAAM,SAAS;AAAA,EAC/C;AACA,MAAI,MAAM,WAAW,QAAW;AAC9B,WAAO,KAAK,MAAM,MAAM;AACxB,SAAK,KAAK,aAAa,OAAO,MAAM,EAAE;AAAA,EACxC;AACA,MAAI,MAAM,UAAU,OAAQ,MAAK,KAAK,sBAAsB;AAC5D,MAAI,MAAM,UAAU,WAAY,MAAK,KAAK,0BAA0B;AACpE,MAAI,KAAK,WAAW,EAAG;AACvB,QAAM,GAAG;AAAA,IACP,4BAA4B,KAAK,KAAK,IAAI,CAAC;AAAA;AAAA,IAE3C;AAAA,EACF;AACF;;;ADnKA,IAAM,OAAO,CAACC,SAAgB,UAAkC,EAAE,QAAAA,SAAQ,MAAM,KAAK,UAAU,IAAI,EAAE;AAE9F,SAAS,uBAAuB,MAAwB;AAC7D,SAAO,eAAe,iBACpB,cACA,KACwB;AACxB,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG,MAU5B,8DAA8D,CAAC,YAAY,CAAC;AAC/E,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,CAAC,OAAO,CAAC,CAAC,cAAc,gBAAgB,EAAE,SAAS,IAAI,MAAM,GAAG;AAClE,aAAO,KAAK,KAAK,EAAE,OAAO,kBAAkB,CAAC;AAAA,IAC/C;AAEA,UAAM,WAAW,MAAM,mBAAmB,MAAM,IAAI,YAAY,IAAI,eAAe,IAAI,GAAG,EAAE,MAAM,MAAM,IAAI;AAC5G,QAAI,CAAC,YAAY,CAAC,cAAc,SAAS,IAAI,EAAG,QAAO,KAAK,KAAK,EAAE,OAAO,mBAAmB,CAAC;AAC9F,UAAM,UAAU,SAAS,UAAU,YAAY;AAC/C,QAAI,CAAC,QAAS,QAAO,KAAK,KAAK,EAAE,OAAO,kCAAkC,CAAC;AAE3E,QAAI;AACJ,QAAI;AACF,aAAO,KAAK,MAAM,IAAI,YAAY,EAAE,OAAO,IAAI,OAAO,CAAC;AAAA,IACzD,QAAQ;AACN,aAAO;AAAA,IACT;AACA,UAAM,QAA6B,EAAE,SAAS,IAAI,SAAS,OAAO,IAAI,OAAO,SAAS,IAAI,SAAS,MAAM,KAAK;AAI9G,UAAM,YAAY,QAAQ,YAAY,KAAK;AAC3C,QAAI,cAAc,QAAQ,cAAc,QAAW;AACjD,aAAO,EAAE,QAAQ,KAAK,MAAM,WAAW,aAAa,aAAa;AAAA,IACnE;AAEA,QAAI,IAAI,WAAW,gBAAgB,IAAI,0BAA0B,MAAM;AACrE,aAAO,KAAK,KAAK,EAAE,OAAO,+DAA0D,CAAC;AAAA,IACvF;AACA,UAAM,EAAE,MAAM,OAAO,IAAI,MAAM,KAAK,GAAG;AAAA,MACrC;AAAA,MACA,CAAC,IAAI,UAAU;AAAA,IACjB;AACA,UAAMC,UAAS,MAAM,KAAK,OAAO,aAAa,OAAO,CAAC,EAAG,cAAc,IAAI,uBAAuB,iBAAiB;AACnH,QAAI,CAAE,MAAM,mBAAmB,QAAQ,QAAQ,OAAOA,OAAM,GAAI;AAC9D,aAAO,KAAK,KAAK,EAAE,OAAO,gCAAgC,CAAC;AAAA,IAC7D;AAEA,UAAM,aAAa,QAAQ,SAAS,KAAK;AACzC,QAAI,CAAC,WAAY,QAAO,KAAK,KAAK,EAAE,OAAO,qBAAqB,CAAC;AACjE,UAAM,aACJ,WAAW,cAAcC,YAAW,QAAQ,EAAE,OAAO,IAAI,OAAO,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AAI7F,UAAM,EAAE,MAAM,SAAS,IAAI,MAAM,KAAK,GAAG;AAAA,MAOvC;AAAA;AAAA,MAEA,CAAC,IAAI,YAAY,IAAI,KAAK,IAAI,cAAc,IAAI,aAAa;AAAA,IAC/D;AAEA,QAAI,QAAQ;AACZ,eAAW,OAAO,UAAU;AAC1B,YAAM,cACJ,IAAI,OAAO,IAAI,KACX,WACA,MAAM,mBAAmB,MAAM,IAAI,YAAY,IAAI,eAAe,IAAI,GAAG,EAAE,MAAM,MAAM,IAAI;AACjG,UAAI,CAAC,eAAe,CAAC,cAAc,YAAY,IAAI,EAAG;AACtD,UAAI,YAAY,KAAK,UAAU,WAAW,MAAO;AAEjD,YAAM,WAAW;AAAA,QACf,WAAW,IAAI;AAAA,QACf,cAAc,IAAI;AAAA,QAClB,WAAW,IAAI;AAAA,QACf,cAAc,IAAI;AAAA,MACpB;AACA,YAAM,QAAQ,MAAM,iBAAiB,KAAK,IAAI,UAAU,SAAS;AACjE,YAAM,OAAO,IAAI,IAAI,UAAU,MAAM,MAAM,KAAK,IAAI,CAAC,CAAC;AACtD,UAAI,KAAK,IAAI,UAAU,EAAG;AAE1B,YAAM,SAAS,MAAM,YAAY,KAAK,IAAI,WAAW,WAAW,MAAM,YAAY,MAAM;AACxF,UAAI,WAAW,MAAM;AACnB,aAAK,IAAI,YAAY,KAAK,IAAI,CAAC;AAC/B,cAAM,iBAAiB,KAAK,IAAI,UAAU,EAAE,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG,QAAQ,KAAK,CAAC;AACrF;AAAA,MACF;AACA,YAAM,YAAY,MAAM;AAAA,QACtB,YAAY,KAAK;AAAA,QACjB;AAAA,QACA,GAAG,IAAI,YAAY,aAAa,IAAI,UAAU;AAAA,MAChD;AACA,YAAM,UAAU,KAAK,IAAI;AAAA,QACvB,WAAW,IAAI;AAAA,QACf,cAAc,IAAI;AAAA,QAClB,WAAW,YAAY;AAAA,QACvB,KAAK,IAAI;AAAA,QACT,SAAS;AAAA,UACP,MAAM;AAAA,UACN,WAAW,IAAI;AAAA,UACf,SAAS,IAAI;AAAA,UACb,UAAU;AAAA,UACV;AAAA,UACA,OAAO,WAAW;AAAA,UAClB,cAAc,IAAI;AAAA,UAClB,GAAI,YAAY,WAAW,gBAAgB,OACvC,EAAE,WAAW,YAAY,WAAW,YAAY,IAChD,CAAC;AAAA,QACP;AAAA,QACA,OAAO;AAAA,MACT,CAAC;AACD,WAAK,IAAI,YAAY,KAAK,IAAI,CAAC;AAC/B,YAAM,iBAAiB,KAAK,IAAI,UAAU,EAAE,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG,QAAQ,MAAM,OAAO,WAAW,CAAC;AACxG;AAAA,IACF;AACA,WAAO,KAAK,KAAK,EAAE,IAAI,MAAM,MAAM,CAAC;AAAA,EACtC;AACF;;;AEhIO,SAAS,cAAc,GAA2B;AACvD,SAAO,gBAAgB,EAAE,SAAS,IAAI,EAAE,YAAY,IAAI,EAAE,GAAG;AAC/D;AAEO,SAAS,eAAe,MAA0D,OAAwB;AAC/G,QAAM,YAAY,cAAc,KAAK,UAAU,WAAW,MAAM,kBAAkB;AAClF,QAAM,UAAU,cAAc,KAAK,UAAU,SAAS,OAAO,wBAAwB;AACrF,MAAI,UAAU,OAAW,QAAO,KAAK,IAAI,WAAW,OAAO;AAC3D,SAAO,KAAK,IAAI,cAAc,OAAO,iBAAiB,GAAG,OAAO;AAClE;AAEA,eAAsB,aACpB,QACA,SACA,SACA,UAAU,MACK;AAEf,QAAM,SAAS,UAAU,WAAW,KAAK,OAAO,IAAI,MAAM,OAAO;AACjE,QAAM,QAAQ,QAAQ;AAAA,IACpB,MAAM;AAAA,IACN;AAAA,IACA,SAAS,KAAK,IAAI,IAAI,KAAK,IAAI,KAAM,UAAU,MAAM;AAAA,IACrD,WAAW,cAAc,OAAO;AAAA,IAChC,aAAa;AAAA,EACf,CAAC;AACH;AAGA,eAAsB,QAAQ,MAAwB,SAA4D;AAChH,QAAM,WAAW,MAAM,mBAAmB,MAAM,QAAQ,WAAW,QAAQ,cAAc,QAAQ,GAAG;AACpG,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,EAAE,MAAM,SAAS,IAAI;AAC3B,MAAI,CAAC,WAAW,IAAI,EAAG,QAAO;AAE9B,QAAM,aAAa,OAAO,OAAW;AACnC,UAAM,GAAG,GAAG,CAAC,MAAM,aAAa,GAAG,SAAS,eAAe,MAAM,SAAS,KAAK,CAAC,CAAC;AAAA,EACnF;AAEA,QAAM,WAAW;AAAA,IACf,WAAW,QAAQ;AAAA,IACnB,cAAc,QAAQ;AAAA,IACtB,WAAW,SAAS;AAAA,IACpB,cAAc,SAAS,WAAW;AAAA,EACpC;AAEA,MAAI;AACF,UAAM,SAAS,MAAM,KAAK,OAAO;AAAA,MAC/B,SAAS,WAAW;AAAA,MACpB,gBAAgB,SAAS,UAAU,WAAW,GAAG;AAAA,IACnD;AACA,UAAM,OAAO,cAAc;AAAA,MACzB,MAAM,SAAS,UAAU;AAAA,MACzB,MAAM,YAAY,SAAS,UAAU,aAAa,SAAS,WAAW,SAAS;AAAA,MAC/E,MAAM,SAAS;AAAA,MACf,OAAO,gBAAgB,SAAS,UAAU,WAAW;AAAA,MACrD,QAAQ,OAAO;AAAA,MACf,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,IAClB,CAAC;AAED,UAAM,QAAQ,MAAM,iBAAiB,KAAK,IAAI,UAAU,MAAM;AAC9D,UAAM,SAAS,MAAM,KAAK,KAAK,MAAM,SAAS,QAAQ,MAAM,UAAU,MAAS;AAC/E,UAAM,QAAmB,MAAM,QAAQ,MAAM,IAAI,SAAS,OAAO;AACjE,UAAM,aAAa,MAAM,QAAQ,MAAM,IAAI,SAAY,OAAO;AAE9D,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,OAAO,IAAI,IAAI,UAAU,MAAM,MAAM,GAAG,CAAC;AAC/C,QAAI,QAAQ;AAEZ,QAAI,CAAC,MAAM,QAAQ;AAEjB,iBAAW,QAAQ,MAAO,MAAK,IAAI,KAAK,UAAU,IAAI,GAAG,GAAG;AAAA,IAC9D,OAAO;AACL,YAAM,QAAQ,MAAM,OAAO,CAAC,SAAS,CAAC,KAAK,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC;AAEpE,YAAM,WAAW,KAAK,SAAS,oBAAoB,iBAAiB,CAAC,GAAG,KAAK,EAAE,QAAQ,IAAI;AAC3F,iBAAW,QAAQ,SAAS;AAC1B,cAAM,MAAM,KAAK,UAAU,IAAI;AAC/B,cAAM,SAAS,KAAK,MAAM,MAAM,KAAK,IAAI,MAAM,SAAS,MAAM,IAAI;AAClE,cAAM,YAAY,MAAM;AAAA,UACtB,KAAK;AAAA,UACL;AAAA,UACA,GAAG,SAAS,SAAS,aAAa,SAAS,OAAO;AAAA,QACpD;AACA,cAAM,UAAU,KAAK,IAAI;AAAA,UACvB,WAAW,QAAQ;AAAA,UACnB,cAAc,QAAQ;AAAA,UACtB,WAAW,SAAS;AAAA,UACpB,KAAK,QAAQ;AAAA,UACb,SAAS;AAAA,YACP,MAAM;AAAA,YACN,WAAW,SAAS;AAAA,YACpB,SAAS,SAAS;AAAA,YAClB,UAAU;AAAA,YACV,SAAS;AAAA,YACT,cAAc,SAAS,WAAW;AAAA,YAClC,GAAI,SAAS,WAAW,gBAAgB,OAAO,EAAE,WAAW,SAAS,WAAW,YAAY,IAAI,CAAC;AAAA,UACnG;AAAA,UACA,OAAO;AAAA,QACT,CAAC;AACD,aAAK,IAAI,KAAK,GAAG;AACjB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,iBAAiB,KAAK,IAAI,UAAU;AAAA,MACxC,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC;AAAA,MACxB,GAAI,eAAe,SAAY,EAAE,QAAQ,cAAc,UAAU,EAAe,IAAI,CAAC;AAAA,MACrF,QAAQ;AAAA,MACR,OAAO;AAAA,IACT,CAAC;AACD,WAAO,EAAE,MAAM;AAAA,EACjB,UAAE;AACA,UAAM,WAAW,KAAK,EAAE;AAAA,EAC1B;AACF;AAGA,eAAsB,cACpB,MACA,WACA,KACiB;AACjB,MAAI,QAAQ,aAAc,QAAO;AACjC,QAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,IAC7B;AAAA;AAAA,IAEA,CAAC,WAAW,GAAG;AAAA,EACjB;AACA,MAAI,YAAY;AAChB,aAAW,OAAO,MAAM;AACtB,QAAI,IAAI,SAAS,SAAS,SAAS,YAAa;AAChD,UAAM,WAAW,MAAM,mBAAmB,MAAM,WAAW,IAAI,eAAe,GAAG,EAAE,MAAM,MAAM,IAAI;AACnG,QAAI,CAAC,YAAY,CAAC,WAAW,SAAS,IAAI,EAAG;AAC7C,UAAM,KAAK,GAAG;AAAA,MAAG,CAAC,MAChB,aAAa,GAAG,EAAE,WAAW,cAAc,IAAI,eAAe,IAAI,GAAG,MAAM,KAAK;AAAA,IAClF;AACA;AAAA,EACF;AACA,SAAO;AACT;;;AC/JA,SAAS,gBAAgB;AACzB,SAAS,aAAAC,YAAW,cAAAC,aAAY,UAAAC,SAAQ,iBAAAC,sBAAqB;AAC7D,SAAS,QAAAC,aAAY;AACrB,SAAS,iBAAiB;;;ACL1B,SAAS,qBAAAC,0BAAyB;;;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,SAASC,gBAAeC,MAA+B;AACrD,QAAM,IAAIA,gBAAe,QAAQA,OAAM,IAAI,MAAM,OAAOA,IAAG,CAAC;AAC5D,SAAO;AAAA,IACL,MAAM,EAAE;AAAA,IACR,SAAS,EAAE;AAAA,IACX,WAAW,iBAAiBA,IAAG;AAAA,IAC/B,UAAU,gBAAgBA,IAAG;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,IAAIC,mBAA8B;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,SAASF,MAAK;AACZ,cAAM,SAAS,EAAE,MAAM,CAACE,MAAK,GAAG,MAAM,KAAK,MAAM,QAAQ,UAAU,OAAO,OAAOF,IAAG,EAAE;AACtF,mBAAW,OAAO,KAAK,IAAI,GAAG,MAAM;AACpC,mBAAW,OAAO,QAAQ,GAAG,MAAM;AACnC,uBAAe,KAAK,EAAE,MAAM,KAAK,MAAM,QAAQ,UAAU,OAAAE,OAAM,CAAC;AAChE,cAAMF;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAGA,QAAM,cAAc,OAAO,KAAM,IAAI,WAAW,CAAC,CAA6B;AAC9E,QAAM,UAAkC,CAAC;AACzC,aAAW,QAAQ,aAAa;AAC9B,YAAQ,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,SAASA,MAAK;AACZ,sBAAYA;AACZ,gBAAM,QAAQD,gBAAeC,IAAG;AAChC,cAAI,gBAAgBA,IAAG,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,iBAAiBA,IAAG,IAAIA,KAAI,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;AAAA,IACA,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,CACbG,SACA,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,QAAAA;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,MACPA,YAAW,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,SAASH,MAAK;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,GAAGD,gBAAeC,IAAG;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,SAASI,MAAK;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,MAAOA,KAAc,MAAM,SAAUA,KAAc,SAAS,WAAW,OAAO,UAAU,KAAK;AAAA,QACtG,SAAS,OAAO;AAAA,UACd,YAAY,IAAI;AAAA,UAChB,QAAQ;AAAA,UACR,OAAO,EAAE,MAAOA,KAAc,MAAM,SAAUA,KAAc,SAAS,WAAW,OAAO,UAAU,KAAK;AAAA,UACtG,OAAO,CAAC;AAAA,UACR,gBAAgB,CAAC;AAAA,QACnB;AAAA,MACF;AAAA,MACA,QAASA,KAAc;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,eAAe;AACxB,SAAS,cAAAC,mBAAkB;;;ACF3B,SAAS,cAAAC,aAAY,eAAAC,oBAAmB;AAWxC,SAAS,WAAW,UAAmE,cAA8B;AACnH,SAAOC,YAAW,QAAQ,EACvB,OAAO,gBAAgB;AAAA,IACtB,WAAW,SAAS;AAAA,IACpB,SAAS,SAAS;AAAA,IAClB,QAAQ,SAAS;AAAA,IACjB,YAAY;AAAA,EACd,CAAU,CAAC,EACV,OAAO,KAAK,EACZ,MAAM,GAAG,EAAE;AAChB;AAWA,eAAsB,mBACpB,MACA,WACA,cACA,KACqC;AACrC,MAAI,QAAQ,aAAc,QAAO;AACjC,QAAM,WAAW,MAAM,mBAAmB,MAAM,WAAW,cAAc,GAAG;AAC5E,MAAI,CAAC,YAAY,CAAC,cAAc,SAAS,IAAI,EAAG,QAAO;AACvD,QAAM,EAAE,MAAM,UAAU,WAAW,IAAI;AACvC,QAAM,OAAO,WAAW,UAAU,WAAW,EAAE;AAE/C,QAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,IAS7B;AAAA;AAAA;AAAA,IAGA,CAAC,WAAW,cAAc,SAAS,SAAS,WAAW,IAAI,GAAG;AAAA,EAChE;AACA,QAAM,WAAW,KAAK,CAAC;AAEvB,MAAI,YAAY,SAAS,gBAAgB,QAAQ,CAAC,cAAc,gBAAgB,EAAE,SAAS,SAAS,MAAM,GAAG;AAC3G,QAAI,SAAS,WAAW,cAAc;AACpC,aAAO,EAAE,cAAc,SAAS,SAAS,SAAS,QAAQ,YAAY;AAAA,IACxE;AAEA,WAAO;AAAA,MACL;AAAA,MACA,SAAS,SAAS;AAAA,MAClB,QAAQ;AAAA,MACR,mBAAmB,qBAAqB,MAAM,SAAS,IAAI,SAAS,eAAe,UAAU,IAAI;AAAA,IACnG;AAAA,EACF;AAGA,MAAI,YAAY,SAAS,gBAAgB,MAAM;AAC7C,UAAM,oBAAoB,MAAM,WAAW,cAAc,KAAK,SAAS,EAAE,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC3F;AAEA,QAAM,eAAe,UAAU,gBAAgB,OAAO,SAAS,gBAAgB,MAAMC,aAAY,EAAE,EAAE,SAAS,KAAK,CAAC;AACpH,QAAM,MAAM,GAAG,KAAK,OAAO,cAAc,YAAY;AAErD,MAAI,KAAK,SAAS,SAAS,UAAU;AACnC,UAAM,EAAE,MAAM,QAAQ,IAAI,MAAM,KAAK,GAAG;AAAA,MACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,CAAC,WAAW,cAAc,SAAS,SAAS,SAAS,WAAW,WAAW,IAAI,KAAK,MAAM,YAAY;AAAA,IACxG;AACA,WAAO;AAAA,MACL;AAAA,MACA,SAAS,SAAS;AAAA,MAClB,QAAQ;AAAA,MACR,mBAAmB,qBAAqB,MAAM,QAAQ,CAAC,EAAG,IAAI,cAAc,UAAU,IAAI;AAAA,IAC5F;AAAA,EACF;AAGA,QAAMC,UAASD,aAAY,EAAE,EAAE,SAAS,KAAK;AAC7C,MAAI;AACF,UAAM,SAAS,MAAM,KAAK,OAAO;AAAA,MAC/B,WAAW;AAAA,MACX,gBAAgB,SAAS,UAAU,WAAW,GAAG;AAAA,IACnD;AACA,UAAM,OAAO,cAAc;AAAA,MACzB,MAAM,SAAS,UAAU;AAAA,MACzB,MAAM,YAAY,SAAS,UAAU,aAAa,WAAW,SAAS;AAAA,MACtE,MAAM;AAAA,MACN,OAAO,gBAAgB,SAAS,UAAU,WAAW;AAAA,MACrD,QAAQ,OAAO;AAAA,MACf,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,IAClB,CAAC;AACD,UAAM,SAAS,MAAM,KAAK,SAAS,OAAO,MAAM,EAAE,KAAK,QAAAC,QAAO,GAAG,SAAS,MAAM;AAChF,UAAM,SAAS,MAAM,KAAK,OAAO,aAAa,SAAS,aAAaA,SAAQ,iBAAiB;AAC7F,UAAM,KAAK,GAAG;AAAA,MACZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA;AAAA,QACE;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,SAAS;AAAA,QACT,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,OAAO,WAAW,YAAY,gBAAgB,SAAW,OAAmC,cAAc,OAAQ;AAAA,QAC5H,UAAU,OAAO,WAAW,YAAY,WAAW,SAAS,KAAK,UAAW,OAA+B,SAAS,IAAI,IAAI;AAAA,MAC9H;AAAA,IACF;AACA,WAAO,EAAE,cAAc,SAAS,SAAS,SAAS,QAAQ,aAAa;AAAA,EACzE,SAASC,MAAK;AACZ,UAAM,KAAK,GAAG;AAAA,MACZ;AAAA;AAAA;AAAA;AAAA;AAAA,MAKA,CAAC,WAAW,cAAc,SAAS,SAAS,SAAS,WAAW,WAAW,IAAI,KAAK,MAAM,cAAc,OAAOA,IAAG,EAAE,MAAM,GAAG,GAAI,CAAC;AAAA,IACpI;AACA,WAAO,EAAE,cAAc,SAAS,SAAS,SAAS,QAAQ,UAAU,OAAO,OAAOA,IAAG,EAAE;AAAA,EACzF;AACF;AAEA,SAAS,qBACP,MACA,gBACA,cACA,UACA,MAC0B;AAC1B,QAAM,MAAM,GAAG,KAAK,OAAO,cAAc,YAAY;AACrD,QAAM,eACJ,KAAK,SAAS,SAAS,WACnB,KAAK,SAAS,aAAa,EAAE,KAAK,QAAQ,+CAA+C,GAAG,SAAS,MAAM,IAC3G;AACN,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,WAAW,SAAS,SAAS;AAAA,IAC7B,SAAS,SAAS,SAAS;AAAA,IAC3B,YAAY,SAAS;AAAA,IACrB;AAAA,IACA;AAAA,EACF;AACF;AAGA,eAAsB,oBACpB,MACA,WACA,cACA,KACA,gBACe;AACf,QAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG,MAQ5B,yHAAyH;AAAA,IAC1H;AAAA,EACF,CAAC;AACD,QAAM,MAAM,KAAK,CAAC;AAClB,MAAI,CAAC,IAAK;AAEV,MAAI,IAAI,WAAW,gBAAgB,IAAI,eAAe;AACpD,UAAM,WAAW,MAAM,mBAAmB,MAAM,WAAW,cAAc,GAAG,EAAE,MAAM,MAAM,IAAI;AAC9F,QAAI,YAAY,cAAc,SAAS,IAAI,KAAK,SAAS,KAAK,SAAS,SAAS,UAAU,SAAS,KAAK,SAAS,SAAS;AACxH,UAAI;AACF,cAAM,SAAS,MAAM,KAAK,OAAO;AAAA,UAC/B,SAAS,WAAW;AAAA,UACpB,gBAAgB,SAAS,UAAU,WAAW,GAAG;AAAA,QACnD;AACA,cAAM,OAAO,cAAc;AAAA,UACzB,MAAM,SAAS,UAAU;AAAA,UACzB,MAAM,YAAY,SAAS,UAAU,aAAa,SAAS,WAAW,SAAS;AAAA,UAC/E,MAAM,SAAS;AAAA,UACf,OAAO,gBAAgB,SAAS,UAAU,WAAW;AAAA,UACrD,QAAQ,OAAO;AAAA,UACf,QAAQ,KAAK;AAAA,UACb,WAAW,KAAK;AAAA,QAClB,CAAC;AACD,cAAM,SAAS,KAAK,SAAS;AAAA,UAC3B;AAAA,UACA,EAAE,GAAI,IAAI,gBAAgB,OAAO,EAAE,YAAY,IAAI,YAAY,IAAI,CAAC,GAAI,OAAO,cAAc,IAAI,KAAc,EAAE;AAAA,UACjH,SAAS;AAAA,QACX;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,QAAM,KAAK,GAAG,MAAM,mFAAmF,CAAC,IAAI,EAAE,CAAC;AAC/G,MAAI,IAAI,eAAe;AACrB,UAAM,KAAK,GAAG;AAAA,MACZ;AAAA,MACA,CAAC,WAAW,cAAc,IAAI,YAAY,IAAI,aAAa;AAAA,IAC7D;AAAA,EACF;AACF;AAIA,eAAsB,oBACpB,MACA,WACA,KACgC;AAChC,MAAI,QAAQ,aAAc,QAAO,CAAC;AAClC,QAAM,EAAE,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,IAC7B;AAAA;AAAA,IAEA,CAAC,WAAW,GAAG;AAAA,EACjB;AACA,QAAM,WAAkC,CAAC;AACzC,QAAM,oBAAoB,oBAAI,IAAY;AAC1C,aAAW,OAAO,MAAM;AACtB,sBAAkB,IAAI,IAAI,aAAa;AACvC,QAAI,IAAI,SAAS,SAAS,SAAS,YAAa;AAChD,UAAM,UAAU,MAAM,mBAAmB,MAAM,WAAW,IAAI,eAAe,GAAG;AAChF,QAAI,QAAS,UAAS,KAAK,OAAO;AAAA,EACpC;AAEA,QAAM,QAAQ,MAAM,KAAK,GAAG;AAAA,IAC1B;AAAA;AAAA,IAEA,CAAC,WAAW,GAAG;AAAA,EACjB;AACA,aAAW,OAAO,MAAM,MAAM;AAC5B,QAAI,CAAC,kBAAkB,IAAI,IAAI,aAAa,GAAG;AAC7C,YAAM,oBAAoB,MAAM,WAAW,IAAI,eAAe,KAAK,IAAI,EAAE;AAAA,IAC3E;AAAA,EACF;AACA,SAAO;AACT;;;AC7QA,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,aAAAC,YAAW,aAAa,gBAAAC,eAAc,UAAU,cAAAC,mBAAkB;AAC3E,SAAS,QAAAC,OAAM,gBAAgB;AAC/B,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,aAAa;AAiBtB,IAAM,YAAY,CAAC,kBAAkB,qBAAqB,aAAa,gBAAgB,aAAa;AAE7F,SAAS,oBAAoB,SAAyC;AAC3E,QAAM,OAAOC,MAAK,SAAS,aAAa;AACxC,MAAI,CAACC,YAAW,IAAI,EAAG,QAAO,CAAC;AAC/B,QAAM,WAAWC,YAAW,QAAQ;AACpC,aAAW,KAAK,WAAW;AACzB,UAAM,IAAIF,MAAK,SAAS,CAAC;AACzB,QAAIC,YAAW,CAAC,EAAG,UAAS,OAAO,CAAC,EAAE,OAAOE,cAAa,CAAC,CAAC;AAAA,EAC9D;AACA,QAAM,OAAO,SAAS,OAAO,KAAK;AAElC,QAAM,MAA8B,CAAC;AACrC,aAAW,QAAQ,YAAY,IAAI,EAAE,KAAK,GAAG;AAC3C,UAAM,MAAMH,MAAK,MAAM,IAAI;AAC3B,QAAI,CAAC,SAAS,GAAG,EAAE,YAAY,EAAG;AAClC,UAAM,QAAQA,MAAK,KAAK,UAAU;AAClC,QAAI,CAACC,YAAW,KAAK,EAAG;AACxB,QAAI,KAAK,EAAE,cAAc,MAAM,KAAK,OAAO,aAAa,QAAQ,KAAK,IAAI,EAAE,CAAC;AAAA,EAC9E;AACA,SAAO;AACT;AAEA,SAAS,QAAQ,KAAa,MAAsB;AAClD,QAAM,IAAIC,YAAW,QAAQ,EAAE,OAAO,IAAI;AAC1C,QAAM,OAAO,CAAC,MAAc;AAC1B,eAAW,SAAS,YAAY,CAAC,EAAE,KAAK,GAAG;AACzC,UAAI,UAAU,kBAAkB,MAAM,WAAW,GAAG,EAAG;AACvD,YAAM,IAAIF,MAAK,GAAG,KAAK;AACvB,YAAM,KAAK,SAAS,CAAC;AACrB,UAAI,GAAG,YAAY,EAAG,MAAK,CAAC;AAAA,UACvB,GAAE,OAAO,SAAS,KAAK,CAAC,CAAC,EAAE,OAAOG,cAAa,CAAC,CAAC;AAAA,IACxD;AAAA,EACF;AACA,OAAK,GAAG;AACR,SAAO,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AACpC;AAEA,eAAsB,sBAAsB,OAAe,SAAgC;AACzF,EAAAC,WAAUJ,MAAK,SAAS,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAClD,QAAM,MAAM;AAAA,IACV,aAAa,CAAC,KAAK;AAAA,IACnB,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,WAAW;AAAA;AAAA;AAAA,IAGX,UAAU;AAAA,IACV,UAAU;AAAA,EACZ,CAAC;AACH;AASA,eAAsB,cAAc,YAA8C;AAChF,QAAM,MAAO,MAAM,OAAO,GAAGK,eAAc,UAAU,EAAE,IAAI,MAAM,KAAK,IAAI,CAAC;AAG3E,QAAM,MAAM,IAAI;AAChB,MAAI,CAAC,OAAO,OAAO,QAAQ,YAAY,OAAO,IAAI,QAAQ,YAAY;AACpE,UAAM,IAAI,MAAM,uDAAuD,UAAU,EAAE;AAAA,EACrF;AACA,QAAM,WAAW,0BAA0B,GAAG;AAC9C,QAAM,aAAgD,CAAC;AACvD,aAAW,QAAQ,OAAO,OAAQ,IAAI,eAAe,CAAC,CAAiD,GAAG;AACxG,eAAW,KAAK,EAAE,IAAI,yBAAyB,IAAI;AAAA,EACrD;AACA,SAAO,EAAE,UAAU,EAAE,GAAG,UAAU,WAAW,GAAG,IAAI;AACtD;;;APzEA,IAAM,OAAO,UAAU,QAAQ;AA0B/B,eAAe,IAAI,MAAgB,KAAc,KAA+C;AAC9F,QAAM,EAAE,OAAO,IAAI,MAAM,KAAK,OAAO,MAAM;AAAA,IACzC,GAAI,QAAQ,SAAY,EAAE,IAAI,IAAI,CAAC;AAAA,IACnC,KAAK,EAAE,GAAG,QAAQ,KAAK,qBAAqB,KAAK,GAAG,IAAI;AAAA,IACxD,WAAW,KAAK,OAAO;AAAA,EACzB,CAAC;AACD,SAAO,OAAO,KAAK;AACrB;AAEA,eAAe,YAAY,MAMe;AACxC,QAAM,MAAMC,MAAK,KAAK,SAAS,SAAS,KAAK,SAAS;AACtD,QAAM,MAA8B,CAAC;AACrC,MAAI,KAAK,eAAe,QAAW;AACjC,QAAI,iBAAiB,IAAI,UAAU,KAAK,UAAU;AAAA,EACpD;AACA,QAAM,gBAAgB,6BAA6B,KAAK,OAAO;AAC/D,MAAI,kBAAkB,QAAW;AAC/B,UAAM,eAAeA,MAAK,KAAK,SAAS,YAAY;AACpD,IAAAC,WAAU,cAAc,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AACxD,UAAM,gBAAgBD,MAAK,cAAc,GAAG,KAAK,SAAS,YAAY;AACtE,IAAAE,eAAc,eAAe;AAAA,eAAyB,aAAa;AAAA,GAAM,EAAE,MAAM,IAAM,CAAC;AACxF,QAAI,mBAAmB,IAAI;AAAA,EAC7B;AACA,MAAI,CAACC,YAAWH,MAAK,KAAK,MAAM,CAAC,GAAG;AAClC,IAAAI,QAAO,KAAK,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAC5C,IAAAH,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAClC,UAAM,IAAI,CAAC,SAAS,sBAAsB,KAAK,SAAS,GAAG,GAAG,QAAW,GAAG;AAAA,EAC9E,OAAO;AACL,UAAM,IAAI,CAAC,SAAS,UAAU,SAAS,GAAG,KAAK,GAAG;AAAA,EACpD;AACA,QAAM,IAAI,CAAC,YAAY,WAAW,KAAK,GAAG,GAAG,KAAK,GAAG,EAAE,MAAM,YAAY;AACvE,UAAM,IAAI,CAAC,YAAY,WAAW,UAAU,KAAK,GAAG,EAAE,GAAG,KAAK,GAAG;AAAA,EACnE,CAAC;AAED,QAAM,IAAI,CAAC,SAAS,UAAU,UAAU,KAAK,GAAG,EAAE,GAAG,KAAK,GAAG,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AAC7E,QAAM,MAAM,MAAM,IAAI,CAAC,aAAa,MAAM,GAAG,GAAG;AAChD,SAAO,EAAE,KAAK,IAAI;AACpB;AAEA,SAAS,6BAA6B,SAAqC;AACzE,MAAI,QAAQ,WAAW,GAAG,EAAG,QAAO;AACpC,MAAI,QAAQ,WAAW,SAAS,GAAG;AACjC,QAAI;AACF,aAAO,IAAI,IAAI,OAAO,EAAE;AAAA,IAC1B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,YAAY,KAA4B;AAGrD,QAAM,SAASE,YAAWH,MAAK,KAAK,gBAAgB,CAAC,IACjD,CAAC,QAAQ,CAAC,WAAW,oBAAoB,oBAAoB,mBAAmB,CAAC,IACjFG,YAAWH,MAAK,KAAK,mBAAmB,CAAC,IACvC,CAAC,OAAO,CAAC,MAAM,oBAAoB,cAAc,WAAW,CAAC,IAC7D;AACN,MAAI,CAAC,OAAQ;AACb,QAAM,KAAK,OAAO,CAAC,GAAa,OAAO,CAAC,GAAe;AAAA,IACrD,KAAK;AAAA,IACL,KAAK,EAAE,GAAG,QAAQ,KAAK,IAAI,IAAI;AAAA,IAC/B,WAAW,KAAK,OAAO;AAAA,EACzB,CAAC;AACH;AAEA,eAAsB,iBACpB,MACA,WACA,OAAqE,CAAC,GAC/C;AACvB,QAAM,EAAE,MAAM,SAAS,IAAI,MAAM,KAAK,GAAG,MAOtC,sCAAsC,CAAC,SAAS,CAAC;AACpD,QAAM,UAAU,SAAS,CAAC;AAC1B,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,cAAc,SAAS,EAAE;AAEvD,QAAM,KAAK,GAAG;AAAA,IACZ;AAAA;AAAA,IAEA,CAAC,SAAS;AAAA,EACZ;AAEA,QAAM,SAAS,OAAOK,SAAgBC,YAAgD;AACpF,UAAM,KAAK,GAAG;AAAA,MACZ;AAAA,MACA,CAAC,WAAWD,SAAQ,KAAK,UAAUC,OAAM,GAAGA,QAAO,KAAKA,QAAO,GAAG;AAAA,IACpE;AACA,WAAOA;AAAA,EACT;AAEA,QAAM,MAAM,KAAK,OAAO,QAAQ;AAChC,QAAM,MAAM,QAAQ,QAAQ,cAAc,eAAe,WAAW,GAAG;AACvE,QAAM,SAAuB,EAAE,KAAK,IAAI,KAAK,KAAK,OAAO,CAAC,GAAG,WAAW,CAAC,GAAG,QAAQ,CAAC,GAAG,SAAS,CAAC,EAAE;AAEpG,MAAI;AAEF,QAAI;AACJ,QAAI,KAAK,cAAc,QAAW;AAChC,gBAAU,KAAK;AACf,aAAO,MAAM,MAAM,IAAI,CAAC,aAAa,MAAM,GAAG,OAAO,EAAE,MAAM,MAAM,OAAO;AAAA,IAC5E,OAAO;AACL,YAAM,UAAU,QAAQ;AACxB,UAAI,CAAC,QAAS,OAAM,IAAI,MAAM,oDAAoD;AAClF,UAAI;AACJ,UAAI,QAAQ,2BAA2B;AACrC,cAAM,MAAM,MAAM,KAAK,OAAO,aAAa,QAAQ,cAAc,QAAQ,2BAA2B,WAAW;AAC/G,cAAM,SAASN,MAAK,KAAK,SAAS,MAAM;AACxC,QAAAC,WAAU,QAAQ,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AAClD,qBAAaD,MAAK,QAAQ,GAAG,SAAS,MAAM;AAC5C,QAAAE,eAAc,YAAY,MAAM,MAAM,EAAE,MAAM,IAAM,CAAC;AAAA,MACvD;AACA,YAAM,SAAS,MAAM,YAAY,EAAE,SAAS,KAAK,SAAS,WAAW,SAAS,KAAK,WAAW,CAAC;AAC/F,gBAAU,OAAO;AACjB,aAAO,MAAM,OAAO;AAAA,IACtB;AAEA,UAAM,YAAY,OAAO;AAGzB,UAAM,aAAa,oBAAoB,OAAO;AAC9C,UAAM,UAAyC,CAAC;AAChD,UAAM,YAA4B,CAAC;AACnC,UAAM,gBAAoE,CAAC;AAC3E,UAAM,UAA8D,CAAC;AACrE,UAAM,qBAA4C,CAAC;AAEnD,eAAW,QAAQ,YAAY;AAC7B,YAAM,EAAE,MAAM,OAAO,IAAI,MAAM,KAAK,GAAG;AAAA,QAOrC;AAAA;AAAA,QAEA,CAAC,WAAW,KAAK,YAAY;AAAA,MAC/B;AAEA,UAAI;AACJ,UAAI;AAEJ,UAAI,OAAO,CAAC,KAAK,OAAO,CAAC,EAAE,iBAAiB,KAAK,eAAe,OAAO,CAAC,EAAE,WAAW,UAAU;AAC7F,oBAAY,OAAO,CAAC,EAAE;AACtB,mBAAW,OAAO,CAAC,EAAE;AACrB,eAAO,UAAU,KAAK,KAAK,YAAY;AAAA,MACzC,OAAO;AACL,cAAM,WAAW,OAAO,CAAC,GAAG,WAAW,KAAK;AAC5C,cAAM,aAAaF;AAAA,UACjB,KAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA,KAAK;AAAA,UACL,IAAI,OAAO;AAAA,UACX;AAAA,QACF;AACA,YAAI;AACF,gBAAM,sBAAsB,KAAK,OAAO,UAAU;AAAA,QACpD,SAASO,MAAK;AACZ,iBAAO,OAAO,KAAK,EAAE,YAAY,KAAK,cAAc,OAAO,SAAS,QAAQ,OAAOA,IAAG,EAAE,MAAM,GAAG,GAAI,EAAE,CAAC;AACxG;AAAA,QACF;AACA,YAAI;AACJ,YAAI;AACF,sBAAY,MAAM,cAAc,UAAU;AAC1C,cAAI,UAAU,SAAS,OAAO,KAAK,cAAc;AAC/C,kBAAM,IAAI;AAAA,cACR,kBAAkB,UAAU,SAAS,EAAE,2CAA2C,KAAK,YAAY;AAAA,YACrG;AAAA,UACF;AAAA,QACF,SAASA,MAAK;AACZ,iBAAO,OAAO,KAAK,EAAE,YAAY,KAAK,cAAc,OAAO,SAAS,QAAQ,OAAOA,IAAG,EAAE,MAAM,GAAG,GAAI,EAAE,CAAC;AACxG;AAAA,QACF;AACA,mBAAW,UAAU;AAGrB,cAAM,QAAQ,MAAM,UAAU,UAAU,GAAG;AAC3C,cAAM,EAAE,MAAM,SAAS,IAAI,MAAM,KAAK,GAAG;AAAA,UACvC;AAAA;AAAA;AAAA;AAAA,UAIA;AAAA,YACE;AAAA,YACA,KAAK;AAAA,YACL;AAAA,YACA,KAAK;AAAA,YACL;AAAA,YACA,KAAK,UAAU,QAAQ;AAAA,YACvB,OAAO;AAAA,YACP;AAAA,YACA,MAAM,SAAS,WAAW;AAAA,YAC1B,KAAK,UAAU;AAAA,cACb,OAAO,EAAE,QAAQ,MAAM,QAAQ,GAAI,MAAM,WAAW,SAAY,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC,EAAG;AAAA,YACjG,CAAC;AAAA,UACH;AAAA,QACF;AACA,oBAAY,SAAS,CAAC,EAAG;AACzB,aAAK,OAAO,OAAO,WAAW,UAAU,GAAG;AAC3C,YAAI,CAAC,MAAM,QAAQ;AACjB,iBAAO,OAAO,KAAK;AAAA,YACjB,YAAY,KAAK;AAAA,YACjB,OAAO;AAAA,YACP,QAAQ,MAAM,UAAU;AAAA,UAC1B,CAAC;AACD;AAAA,QACF;AACA,eAAO,MAAM,KAAK,KAAK,YAAY;AAAA,MACrC;AAEA,aAAO,OAAO,oBAAoB,SAAS,cAAc,CAAC,CAAC;AAC3D,cAAQ,KAAK;AAAA,QACX,cAAc,KAAK;AAAA,QACnB,aAAc,SAAS,eAAe,CAAC;AAAA,QACvC,SAAU,SAAS,WAAW,CAAC;AAAA,MACjC,CAAC;AACD,UAAI,SAAS,QAAQ,SAAS,YAAY;AACxC,kBAAU,KAAK;AAAA,UACb,cAAc,KAAK;AAAA,UACnB,MAAM,SAAS,QAAQ;AAAA,UACvB,IAAK,SAAS,QAA4B;AAAA,QAC5C,CAAC;AAAA,MACH;AACA,UAAI,SAAS,QAAQ,SAAS,SAAS;AACrC,sBAAc,KAAK,EAAE,WAAY,SAAS,QAA8B,OAAO,cAAc,KAAK,aAAa,CAAC;AAAA,MAClH;AACA,cAAQ,KAAK,EAAE,cAAc,KAAK,cAAc,UAAU,CAAC;AAAA,IAC7D;AAGA,UAAM,UAAU,MAAM,2BAA2B;AAAA,MAC/C,IAAI,KAAK;AAAA,MACT,QAAQ,KAAK;AAAA,MACb,aAAa,QAAQ;AAAA,MACrB;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb;AAAA,IACF,CAAC;AACD,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM,QAAQ,MAAM,gBAAgB;AAAA,QAClC,IAAI,KAAK;AAAA,QACT,aAAa,QAAQ;AAAA,QACrB;AAAA,QACA,cAAc;AAAA,MAChB,CAAC;AACD,aAAO,aAAa,GAAG,KAAK,OAAO,YAAY,KAAK;AACpD,aAAO,eAAe;AACtB,aAAO,OAAO,sBAAsB,MAAM;AAAA,IAC5C;AAGA,eAAW,KAAK,SAAS;AACvB,YAAM,KAAK,GAAG,GAAG,OAAO,MAAM;AAC5B,cAAM,EAAE;AAAA,UACN;AAAA;AAAA;AAAA,UAGA,CAAC,WAAW,EAAE,cAAc,KAAK,EAAE,SAAS;AAAA,QAC9C;AACA,cAAM,EAAE;AAAA,UACN;AAAA;AAAA,UAEA,CAAC,WAAW,EAAE,cAAc,EAAE,SAAS;AAAA,QACzC;AACA,cAAM,EAAE,MAAM,4DAA4D,CAAC,EAAE,SAAS,CAAC;AAAA,MACzF,CAAC;AAAA,IACH;AAGA,UAAM,UAAU,IAAI,IAAI,WAAW,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC;AAC7D,UAAM,EAAE,MAAM,QAAQ,IAAI,MAAM,KAAK,GAAG;AAAA,MACtC;AAAA,MACA,CAAC,WAAW,GAAG;AAAA,IACjB;AACA,eAAW,OAAO,SAAS;AACzB,UAAI,CAAC,QAAQ,IAAI,IAAI,aAAa,GAAG;AACnC,cAAM,KAAK,GAAG,MAAM,2EAA2E;AAAA,UAC7F;AAAA,UACA,IAAI;AAAA,UACJ;AAAA,QACF,CAAC;AACD,eAAO,QAAQ,KAAK,IAAI,aAAa;AAAA,MACvC;AAAA,IACF;AAGA,QAAI,QAAQ,cAAc;AACxB,YAAM,cAAc,KAAK,IAAI,WAAW,KAAK,SAAS;AACtD,YAAM,kBAAkB,KAAK,IAAI,WAAW,KAAK,aAAa;AAC9D,YAAM,OAAO,MAAM,oBAAoB,KAAK,aAAa,WAAW,GAAG;AACvE,YAAM,aAAa,KAAK,QAAQ,CAAC,MAAO,EAAE,sBAAsB,SAAY,CAAC,EAAE,iBAAiB,IAAI,CAAC,CAAE;AACvG,aAAO,SAAS,KACb,OAAO,CAAC,MAAM,EAAE,WAAW,gBAAgB,EAC3C,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,cAAc,SAAS,EAAE,QAAQ,EAAE;AAClE,YAAM,cAAc,KAAK,aAAa,WAAW,GAAG;AACpD,UAAI,WAAW,SAAS,GAAG;AACzB,cAAM,QAAQ,MAAM,gBAAgB;AAAA,UAClC,IAAI,KAAK;AAAA,UACT,aAAa,QAAQ;AAAA,UACrB;AAAA,UACA,cAAc;AAAA,QAChB,CAAC;AACD,eAAO,aAAa,GAAG,KAAK,OAAO,YAAY,KAAK;AACpD,eAAO,eAAe;AACtB,eAAO,OAAO,sBAAsB,MAAM;AAAA,MAC5C;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,IAAI,SAAS;AACpC,WAAO,OAAO,OAAO,OAAO,SAAS,IAAI,WAAW,UAAU,MAAM;AAAA,EACtE,SAASA,MAAK;AACZ,WAAO,OAAO,KAAK,EAAE,YAAY,KAAK,OAAO,SAAS,QAAQ,OAAOA,IAAG,EAAE,MAAM,GAAG,GAAI,EAAE,CAAC;AAC1F,UAAM,KAAK,GAAG;AAAA,MACZ;AAAA,MACA,CAAC,WAAW,OAAOA,IAAG,EAAE,MAAM,GAAG,GAAI,GAAG,KAAK,UAAU,MAAM,CAAC;AAAA,IAChE;AACA,WAAO;AAAA,EACT;AACF;AAGA,eAAsB,YAAY,IAAQ,WAAkC;AAC1E,QAAM,GAAG;AAAA,IACP;AAAA;AAAA;AAAA,IAGA,CAAC,SAAS;AAAA,EACZ;AAEA,QAAM,GAAG;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAgBA,CAAC,SAAS;AAAA,EACZ;AACF;AAEA,eAAsB,aAAa,IAAQ,WAAmB,KAA+B;AAC3F,QAAM,EAAE,MAAM,MAAM,IAAI,MAAM,GAAG,MAAM,sGAAsG,CAAC,SAAS,CAAC;AACxJ,QAAM,EAAE,MAAM,SAAS,IAAI,MAAM,GAAG;AAAA,IAClC;AAAA;AAAA;AAAA,IAGA,CAAC,WAAW,GAAG;AAAA,EACjB;AACA,SAAO,EAAE,MAAM,MAAM,CAAC,KAAK,MAAM,MAAM,SAAS;AAClD;;;A/ChYA,eAAsB,mBACpB,YAAmC,CAAC,GACb;AACvB,QAAM,SAAS,EAAE,GAAG,WAAW,GAAG,GAAG,UAAU;AAC/C,QAAM,KAAK,MAAM,SAAS;AAAA,IACxB,aAAa,OAAO;AAAA,IACpB,SAAS,OAAO,cAAc,SAAY,GAAG,OAAO,OAAO;AAAA,EAC7D,CAAC;AACD,QAAM,QAAQ,EAAE;AAEhB,QAAM,SAAS,IAAI,OAAO;AAC1B,QAAM,SAAS,IAAI,OAAO,IAAI,OAAO,WAAW,MAAM;AACtD,QAAM,cAAc,MAAM,OAAO,uBAAuB;AACxD,QAAM,aAAa,MAAM,iBAAiB,IAAI,WAAW;AAEzD,QAAM,SAAS,IAAI,eAAe,EAAE;AACpC,QAAM,WAAW,mBAAmB,EAAE,IAAI,OAAO,CAAC;AAClD,QAAM,aAAyB;AAAA,IAC7B;AAAA,IACA,gBAAgB,OAAO;AAAA,IACvB,kBAAkB,SAAS;AAAA,IAC3B,gBAAgB,SAAS;AAAA,IACzB,GAAI,SAAS,cAAc,SAAY,EAAE,WAAW,SAAS,UAAU,IAAI,CAAC;AAAA,IAC5E,GAAI,SAAS,gBAAgB,SAAY,EAAE,aAAa,SAAS,YAAY,IAAI,CAAC;AAAA,IAClF,MAAM,CAAC,MAAM,OAAO,KAAK,CAAC;AAAA,EAC5B;AACA,QAAM,cAAgC;AAAA,IACpC;AAAA,IACA;AAAA,IACA,SAAS,OAAO;AAAA,IAChB,gBAAgB,OAAO;AAAA,EACzB;AACA,QAAM,iBAAiC;AAAA,IACrC;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,OAAO;AAAA,IAChB,SAAS,OAAO;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,iBAAiB;AAAA,IACrB,KAAK,OAAO,QAAoB;AAC9B,YAAM,WAAW,YAAa,IAAI,QAA8B,KAAK;AAAA,IACvE;AAAA,IACA,gBAAgB,OAAO,QAAoB;AACzC,YAAM,YAAY,IAAK,IAAI,QAAgC,OAAO;AAAA,IACpE;AAAA,IACA,gBAAgB,OAAO,QAAoB;AACzC,YAAM,QAAQ,aAAa,IAAI,OAAkC;AAAA,IACnE;AAAA,IACA,WAAW,OAAO,QAAoB;AACpC,YAAM,IAAI,IAAI;AACd,YAAM,iBAAiB,gBAAgB,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,WAAW,EAAE,UAAU,CAAC;AAAA,IAC5F;AAAA,EACF;AACA,QAAM,cAAc;AAAA,IAClB,GAAI,OAAO,MAAM,SAAU,CAAC,OAAO,gBAAgB,cAAc,IAAc,CAAC;AAAA,IAChF,GAAI,OAAO,MAAM,aAAc,CAAC,WAAW,IAAc,CAAC;AAAA,EAC5D;AACA,QAAM,SAAS,IAAI;AAAA,IACjB;AAAA,IACA,OAAO,YAAY,YAAY,IAAI,CAAC,SAAS,CAAC,MAAM,eAAe,IAAI,CAAC,CAAC,CAAC;AAAA,IAC1E;AAAA,MACE,MAAM,OAAO;AAAA,MACb,OAAO;AAAA,MACP,gBAAgB,OAAO;AAAA,MACvB,SAAS,CAAC,MAAM,QAAQ,MAAM,YAAY,CAAC;AAAA,IAC7C;AAAA,EACF;AAEA,QAAM,MAAM,UAAU;AAAA,IACpB;AAAA,IACA;AAAA,IACA,SAAS,OAAO;AAAA,IAChB,SAAS,OAAO;AAAA,IAChB,OAAO,OAAO;AAAA,IACd,kBAAkB,uBAAuB,WAAW;AAAA,IACpD,cAAc,CAAC,WAAW,QAAQ,aAAa,IAAI,WAAW,GAAG;AAAA,EACnE,CAAC;AAED,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,QAAMC,UAAuB;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAI,eAAe,OAAO,EAAE,WAAW,IAAI,CAAC;AAAA,IAC5C,MAAM,QAAQ;AACZ,UAAI,OAAO,MAAM,KAAK;AACpB,qBAAa,MAAM,EAAE,OAAO,IAAI,OAAO,MAAM,OAAO,MAAM,UAAU,UAAU,CAAC;AAC/E,QAAAA,QAAO,aAAa;AAAA,MACtB;AACA,UAAI,OAAO,MAAM,UAAU,OAAO,MAAM,WAAY,QAAO,MAAM;AACjE,UAAI,OAAO,MAAM,WAAW;AAC1B,wBAAgB,eAAe,IAAI,EAAE,SAAS,CAAC,MAAM,QAAQ,MAAM,eAAe,CAAC,EAAE,CAAC;AACtF,qBAAa,YAAY,IAAI,EAAE,SAAS,CAAC,MAAM,QAAQ,MAAM,YAAY,CAAC,EAAE,CAAC;AAAA,MAC/E;AAAA,IACF;AAAA,IACA,MAAM,OAAO;AACX,sBAAgB;AAChB,mBAAa;AACb,YAAM,OAAO,KAAK;AAClB,UAAI,WAAY,OAAM,IAAI,QAAc,CAAC,MAAM,WAAY,MAAM,MAAM,EAAE,CAAC,CAAC;AAC3E,YAAM,GAAG,MAAM;AAAA,IACjB;AAAA,EACF;AACA,SAAOA;AACT;;;AuD7JA,IAAM,SAAS,MAAM,mBAAmB;AACxC,MAAM,OAAO,MAAM;AAEnB,QAAQ,MAAM,2BAA2B,OAAO,OAAO,OAAO,SAAS,OAAO,GAAG,IAAI,GAAG;AACxF,QAAQ;AAAA,EACN,mBAAmB,OAAO,QAAQ,OAAO,OAAO,KAAK,EAClD,OAAO,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,EACrB,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,EACd,KAAK,IAAI,CAAC;AACf;AACA,IAAI,OAAO,YAAY;AACrB,UAAQ,MAAM,mFAA8E;AAC5F,UAAQ,MAAM,cAAc,OAAO,UAAU,EAAE;AACjD;AAEA,IAAM,WAAW,OAAO,WAAmB;AACzC,UAAQ,MAAM,YAAY,MAAM,kBAAa;AAC7C,QAAM,OAAO,KAAK;AAClB,UAAQ,KAAK,CAAC;AAChB;AACA,QAAQ,GAAG,UAAU,MAAM,KAAK,SAAS,QAAQ,CAAC;AAClD,QAAQ,GAAG,WAAW,MAAM,KAAK,SAAS,SAAS,CAAC;",
6
6
  "names": ["err", "text", "err", "mkdirSync", "randomBytes", "randomBytes", "text", "conn", "clientSecret", "tokens", "text", "err", "json", "status", "exec", "text", "secret", "err", "model", "json", "toSerializable", "err", "active", "exec", "Hono", "randomBytes", "createHash", "randomBytes", "readFileSync", "rmSync", "writeFileSync", "join", "readFileSync", "join", "writeFileSync", "rmSync", "status", "createHash", "randomBytes", "header", "status", "randomBytes", "Hono", "top", "band", "status", "Hono", "randomBytes", "tokens", "err", "secret", "createHmac", "timingSafeEqual", "Hono", "timingSafeEqual", "secret", "createHmac", "Hono", "text", "Hono", "status", "err", "createHash", "status", "secret", "createHash", "mkdirSync", "existsSync", "rmSync", "writeFileSync", "join", "AsyncLocalStorage", "serializeError", "err", "AsyncLocalStorage", "input", "status", "err", "mkdirSync", "readFileSync", "writeFileSync", "createHash", "createHash", "randomBytes", "createHash", "randomBytes", "secret", "err", "createHash", "mkdirSync", "readFileSync", "existsSync", "join", "pathToFileURL", "join", "existsSync", "createHash", "readFileSync", "mkdirSync", "pathToFileURL", "join", "mkdirSync", "writeFileSync", "existsSync", "rmSync", "status", "report", "err", "server"]
7
7
  }