workplane 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +127 -34
- package/dist/cli.js +430 -1
- package/dist/cli.js.map +1 -1
- package/dist/node.js.map +1 -1
- package/dist/server.js +174 -92
- package/dist/server.js.map +1 -1
- package/package.json +5 -6
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../core/src/env.ts","../../core/src/config.ts","../../core/src/auth.ts","../../core/src/http-client.ts","../../cli/src/index.ts"],"sourcesContent":["import { config as dotenvConfig } from \"dotenv\";\n\nlet envLoaded = false;\n\nexport function loadLocalEnv(): void {\n if (envLoaded) {\n return;\n }\n\n dotenvConfig({ path: \".env\" });\n dotenvConfig({ path: \".env.local\", override: true });\n\n envLoaded = true;\n}\n\n","import { z } from \"zod\";\nimport { loadLocalEnv } from \"./env.js\";\n\nloadLocalEnv();\n\nconst serverEnvSchema = z.object({\n DATABASE_URL: z.string().min(1),\n WORKPLANE_SERVER_PORT: z\n .string()\n .optional()\n .default(\"8787\")\n .transform((value) => Number.parseInt(value, 10)),\n WORKPLANE_NODE_TOKEN: z.string().optional(),\n WORKPLANE_OPERATOR_TOKEN: z.string().optional(),\n WORKPLANE_ENV_ALLOWLIST: z.string().optional(),\n});\n\nconst nodeEnvSchema = z.object({\n WORKPLANE_SERVER_URL: z.string().url().optional().default(\"http://localhost:8787\"),\n WORKPLANE_NODE_NAME: z.string().optional().default(\"local-node-1\"),\n WORKPLANE_NODE_ID: z.string().optional(),\n WORKPLANE_NODE_CAPABILITIES: z\n .string()\n .optional()\n .default(\"shell,git,node,typescript,aider,ollama,codex,claude-code\"),\n WORKPLANE_NODE_TOKEN: z.string().optional(),\n WORKPLANE_POLL_INTERVAL_MS: z\n .string()\n .optional()\n .default(\"3000\")\n .transform((value) => Number.parseInt(value, 10)),\n WORKPLANE_ENV_ALLOWLIST: z.string().optional(),\n});\n\nexport interface ServerConfig {\n databaseUrl: string;\n port: number;\n nodeToken?: string;\n operatorToken?: string;\n envAllowlist: string[];\n}\n\nexport interface NodeConfig {\n serverUrl: string;\n nodeName: string;\n nodeId?: string;\n nodeCapabilities: string[];\n nodeToken?: string;\n pollIntervalMs: number;\n envAllowlist: string[];\n}\n\nexport function loadServerConfig(env: NodeJS.ProcessEnv = process.env): ServerConfig {\n const parsed = serverEnvSchema.parse(env);\n\n return {\n databaseUrl: parsed.DATABASE_URL,\n port: parsed.WORKPLANE_SERVER_PORT,\n nodeToken: parsed.WORKPLANE_NODE_TOKEN,\n operatorToken: parsed.WORKPLANE_OPERATOR_TOKEN,\n envAllowlist: parseCsv(parsed.WORKPLANE_ENV_ALLOWLIST ?? \"\"),\n };\n}\n\nexport function loadNodeConfig(env: NodeJS.ProcessEnv = process.env): NodeConfig {\n const parsed = nodeEnvSchema.parse(env);\n\n return {\n serverUrl: parsed.WORKPLANE_SERVER_URL,\n nodeName: parsed.WORKPLANE_NODE_NAME,\n nodeId: parsed.WORKPLANE_NODE_ID,\n nodeCapabilities: parseCsv(parsed.WORKPLANE_NODE_CAPABILITIES),\n nodeToken: parsed.WORKPLANE_NODE_TOKEN,\n pollIntervalMs: parsed.WORKPLANE_POLL_INTERVAL_MS,\n envAllowlist: parseCsv(parsed.WORKPLANE_ENV_ALLOWLIST ?? \"\"),\n };\n}\n\nexport function parseCsv(value: string): string[] {\n return value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n","import type { IncomingMessage } from \"node:http\";\n\nexport function parseBearerToken(authorizationHeader: string | undefined): string | undefined {\n if (!authorizationHeader) {\n return undefined;\n }\n const match = /^Bearer\\s+(.+)$/i.exec(authorizationHeader.trim());\n return match?.[1];\n}\n\nexport function isAuthorizedBearer(provided: string | undefined, expected: string | undefined): boolean {\n if (!expected) {\n return true;\n }\n if (!provided) {\n return false;\n }\n return provided === expected;\n}\n\nexport function getRequestBearer(req: IncomingMessage): string | undefined {\n const header = req.headers.authorization;\n const value = Array.isArray(header) ? header[0] : header;\n return parseBearerToken(value);\n}\n\nexport function authHeaders(token: string | undefined): Record<string, string> {\n if (!token) {\n return {};\n }\n return { authorization: `Bearer ${token}` };\n}\n","import { authHeaders } from \"./auth.js\";\n\nexport interface WorkplaneHttpOptions {\n method?: string;\n body?: unknown;\n nodeToken?: string;\n operatorToken?: string;\n}\n\nexport function buildWorkplaneHeaders(options: WorkplaneHttpOptions = {}): Record<string, string> {\n const token = options.nodeToken ?? options.operatorToken;\n return {\n \"content-type\": \"application/json\",\n ...authHeaders(token),\n };\n}\n\nexport async function workplaneFetch<T>(\n serverUrl: string,\n path: string,\n options: WorkplaneHttpOptions = {},\n): Promise<T> {\n const response = await fetch(`${serverUrl}${path}`, {\n method: options.method ?? \"GET\",\n headers: buildWorkplaneHeaders(options),\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`${response.status} ${response.statusText} from ${path}: ${text}`);\n }\n\n return (await response.json()) as T;\n}\n","import { loadLocalEnv } from \"../../core/src/env.js\";\nimport { parseCsv } from \"../../core/src/config.js\";\nimport { workplaneFetch } from \"../../core/src/http-client.js\";\n\nloadLocalEnv();\n\nconst serverUrl = process.env.WORKPLANE_SERVER_URL ?? \"http://localhost:8787\";\nconst operatorToken = process.env.WORKPLANE_OPERATOR_TOKEN;\n\nasync function httpJson<T>(\n path: string,\n options?: { method?: string; body?: Record<string, unknown>; operator?: boolean },\n): Promise<T> {\n return workplaneFetch<T>(serverUrl, path, {\n method: options?.method,\n body: options?.body,\n operatorToken: options?.operator ? operatorToken : undefined,\n });\n}\n\ninterface RunListResponse {\n runs: Array<{ id: string }>;\n}\n\nfunction valueArg(args: string[], flag: string): string | undefined {\n const index = args.indexOf(flag);\n if (index === -1) {\n return undefined;\n }\n return args[index + 1];\n}\n\nfunction printJson(payload: unknown): void {\n process.stdout.write(`${JSON.stringify(payload, null, 2)}\\n`);\n}\n\nasync function resolveRunIdFromTaskId(taskId: string): Promise<string> {\n const runs = await httpJson<RunListResponse>(`/runs?taskId=${encodeURIComponent(taskId)}`);\n const runId = runs.runs[0]?.id;\n if (!runId) {\n throw new Error(`no runs found for task ${taskId}`);\n }\n return runId;\n}\n\nasync function showLogsById(id: string): Promise<void> {\n const runId = id.startsWith(\"task_\") ? await resolveRunIdFromTaskId(id) : id;\n const logs = await httpJson(`/runs/${runId}/logs`);\n printJson(logs);\n}\n\nfunction usage(): void {\n process.stdout.write(\n [\n \"workplane CLI\",\n \"\",\n \"Env: WORKPLANE_SERVER_URL, WORKPLANE_OPERATOR_TOKEN (for task submit/retry/cancel)\",\n \"\",\n \"Commands:\",\n \" server start / node start # use pnpm dev:server / dev:node\",\n \" task submit shell --command <cmd> [--repo <url>] [--branch <b>] [--cwd <path>]\",\n \" task submit aider --prompt <text> --repo <url> [--model <m>] [--test-command <cmd>]\",\n \" task submit inference --model <m> --prompt <text> [--requires ollama]\",\n \" task submit harness --harness <codex|claude-code> --repo <url> --prompt <text> [--interactive]\",\n \" tasks [--status <status>]\",\n \" task show|logs|retry|cancel <taskId>\",\n \" runs [--task-id <id>] [--status <status>]\",\n \" run show <runId>\",\n \" run input <runId> --stdin <text>\",\n \" run input <runId> --signal <SIGTERM|SIGKILL|SIGINT>\",\n \" run input <runId> --resize <COLSxROWS>\",\n \" logs <runId|taskId>\",\n \" artifacts <runId>\",\n ].join(\"\\n\"),\n );\n}\n\nasync function submitShell(args: string[]): Promise<void> {\n const command = valueArg(args, \"--command\");\n if (!command) {\n throw new Error(\"--command is required\");\n }\n\n const requires = parseCsv(valueArg(args, \"--requires\") ?? \"shell\");\n const repo = valueArg(args, \"--repo\");\n const branch = valueArg(args, \"--branch\");\n const cwd = valueArg(args, \"--cwd\");\n const task = await httpJson(\"/tasks\", {\n method: \"POST\",\n operator: true,\n body: {\n kind: \"shell.exec\",\n adapter: \"shell\",\n requires,\n payload: { command, repo, branch, cwd },\n },\n });\n\n printJson(task);\n}\n\nasync function submitAider(args: string[]): Promise<void> {\n const prompt = valueArg(args, \"--prompt\");\n if (!prompt) {\n throw new Error(\"--prompt is required\");\n }\n\n const model = valueArg(args, \"--model\");\n const repo = valueArg(args, \"--repo\");\n if (!repo) {\n throw new Error(\"--repo is required\");\n }\n const branch = valueArg(args, \"--branch\");\n const testCommand = valueArg(args, \"--test-command\");\n const requires = parseCsv(valueArg(args, \"--requires\") ?? \"git,aider\");\n const task = await httpJson(\"/tasks\", {\n method: \"POST\",\n operator: true,\n body: {\n kind: \"agent.run\",\n adapter: \"aider\",\n requires,\n payload: { prompt, model, repo, branch, testCommand },\n },\n });\n\n printJson(task);\n}\n\nasync function submitInference(args: string[]): Promise<void> {\n const model = valueArg(args, \"--model\");\n const prompt = valueArg(args, \"--prompt\");\n if (!model || !prompt) {\n throw new Error(\"--model and --prompt are required\");\n }\n\n const adapter = valueArg(args, \"--adapter\") ?? \"ollama\";\n const requires = parseCsv(valueArg(args, \"--requires\") ?? adapter);\n const inputFile = valueArg(args, \"--input-file\");\n\n const task = await httpJson(\"/tasks\", {\n method: \"POST\",\n operator: true,\n body: {\n kind: \"inference.batch\",\n adapter,\n requires,\n payload: { model, prompt, inputFile },\n },\n });\n\n printJson(task);\n}\n\nasync function submitHarness(args: string[]): Promise<void> {\n const harness = valueArg(args, \"--harness\");\n const prompt = valueArg(args, \"--prompt\");\n const repo = valueArg(args, \"--repo\");\n if (!harness || !prompt || !repo) {\n throw new Error(\"--harness, --prompt, and --repo are required\");\n }\n\n if (harness !== \"codex\" && harness !== \"claude-code\") {\n throw new Error(\"--harness must be codex or claude-code\");\n }\n\n const model = valueArg(args, \"--model\");\n const branch = valueArg(args, \"--branch\");\n const testCommand = valueArg(args, \"--test-command\");\n const interactive = args.includes(\"--interactive\") || undefined;\n const requires = parseCsv(valueArg(args, \"--requires\") ?? `${harness},git`);\n\n const task = await httpJson(\"/tasks\", {\n method: \"POST\",\n operator: true,\n body: {\n kind: \"agent.run\",\n adapter: harness,\n requires,\n payload: { prompt, repo, model, branch, testCommand, interactive },\n },\n });\n\n printJson(task);\n}\n\nasync function main(): Promise<void> {\n const [command, subcommand, ...rest] = process.argv.slice(2);\n\n if (!command) {\n usage();\n return;\n }\n\n if (command === \"server\" && subcommand === \"start\") {\n process.stdout.write(\"Use: pnpm dev:server\\n\");\n return;\n }\n\n if (command === \"node\" && subcommand === \"start\") {\n process.stdout.write(\"Use: pnpm dev:node\\n\");\n return;\n }\n\n if (command === \"task\" && subcommand === \"submit\") {\n const adapter = rest[0];\n const adapterArgs = rest.slice(1);\n if (adapter === \"shell\") {\n await submitShell(adapterArgs);\n return;\n }\n if (adapter === \"aider\") {\n await submitAider(adapterArgs);\n return;\n }\n if (adapter === \"inference\") {\n await submitInference(adapterArgs);\n return;\n }\n if (adapter === \"harness\") {\n await submitHarness(adapterArgs);\n return;\n }\n throw new Error(`unsupported adapter submit: ${adapter}`);\n }\n\n if (command === \"tasks\") {\n const status = valueArg([subcommand, ...rest].filter(Boolean) as string[], \"--status\");\n const tasks = await httpJson(status ? `/tasks?status=${encodeURIComponent(status)}` : \"/tasks\");\n printJson(tasks);\n return;\n }\n\n if (command === \"task\" && subcommand === \"show\") {\n const taskId = rest[0];\n if (!taskId) {\n throw new Error(\"task id is required\");\n }\n const task = await httpJson(`/tasks/${taskId}`);\n printJson(task);\n return;\n }\n\n if (command === \"task\" && subcommand === \"retry\") {\n const taskId = rest[0];\n if (!taskId) {\n throw new Error(\"task id is required\");\n }\n const task = await httpJson(`/tasks/${taskId}/retry`, { method: \"POST\", operator: true });\n printJson(task);\n return;\n }\n\n if (command === \"task\" && subcommand === \"logs\") {\n const taskId = rest[0];\n if (!taskId) {\n throw new Error(\"task id is required\");\n }\n await showLogsById(taskId);\n return;\n }\n\n if (command === \"task\" && subcommand === \"cancel\") {\n const taskId = rest[0];\n if (!taskId) {\n throw new Error(\"task id is required\");\n }\n const task = await httpJson(`/tasks/${taskId}/cancel`, { method: \"POST\", operator: true });\n printJson(task);\n return;\n }\n\n if (command === \"runs\") {\n const taskId = valueArg(rest, \"--task-id\");\n const status = valueArg(rest, \"--status\");\n const query = new URLSearchParams();\n if (taskId) {\n query.set(\"taskId\", taskId);\n }\n if (status) {\n query.set(\"status\", status);\n }\n const runs = await httpJson(query.size > 0 ? `/runs?${query.toString()}` : \"/runs\");\n printJson(runs);\n return;\n }\n\n if (command === \"run\" && subcommand === \"input\") {\n const runId = rest[0];\n if (!runId) {\n throw new Error(\"run id is required\");\n }\n const inputArgs = rest.slice(1);\n const stdinData = valueArg(inputArgs, \"--stdin\");\n const signal = valueArg(inputArgs, \"--signal\");\n const resize = valueArg(inputArgs, \"--resize\");\n\n let body: Record<string, unknown>;\n if (stdinData !== undefined) {\n body = { kind: \"stdin\", payload: { data: stdinData } };\n } else if (signal !== undefined) {\n if (signal !== \"SIGTERM\" && signal !== \"SIGKILL\" && signal !== \"SIGINT\") {\n throw new Error(\"--signal must be SIGTERM, SIGKILL, or SIGINT\");\n }\n body = { kind: \"signal\", payload: { signal } };\n } else if (resize !== undefined) {\n const match = /^(\\d+)x(\\d+)$/.exec(resize);\n if (!match) {\n throw new Error(\"--resize must be in COLSxROWS format, e.g. 220x50\");\n }\n body = { kind: \"resize\", payload: { cols: Number(match[1]), rows: Number(match[2]) } };\n } else {\n throw new Error(\"one of --stdin, --signal, or --resize is required\");\n }\n\n const result = await httpJson(`/runs/${runId}/input`, { method: \"POST\", operator: true, body });\n printJson(result);\n return;\n }\n\n if (command === \"run\" && subcommand === \"show\") {\n const runId = rest[0];\n if (!runId) {\n throw new Error(\"run id is required\");\n }\n const run = await httpJson(`/runs/${runId}`);\n printJson(run);\n return;\n }\n\n if (command === \"logs\") {\n const id = subcommand;\n if (!id) {\n throw new Error(\"run id or task id is required\");\n }\n await showLogsById(id);\n return;\n }\n\n if (command === \"artifacts\") {\n const runId = subcommand;\n if (!runId) {\n throw new Error(\"run id is required\");\n }\n const artifacts = await httpJson(`/runs/${runId}/artifacts`);\n printJson(artifacts);\n return;\n }\n\n usage();\n}\n\nmain().catch((error) => {\n process.stderr.write(`${String(error)}\\n`);\n process.exit(1);\n});\n"],"mappings":"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","names":["serverUrl"]}
|
|
1
|
+
{"version":3,"sources":["../../workplans/src/providers/anthropic.ts","../../workplans/src/providers/openai.ts","../../workplans/src/providers/ollama.ts","../../workplans/src/providers/shell.ts","../../workplans/src/providers/file.ts","../../core/src/env.ts","../../core/src/config.ts","../../core/src/auth.ts","../../core/src/http-client.ts","../../agent-skills/src/skills/code-review.ts","../../agent-skills/src/skills/summarize-file.ts","../../agent-skills/src/skills/index.ts","../../workplans/src/template.ts","../../workplans/src/runner.ts","../../workplans/src/sinks/stdout.ts","../../workplans/src/context.ts","../../cli/src/index.ts"],"sourcesContent":["import Anthropic from \"@anthropic-ai/sdk\";\n\nexport interface AnthropicStepOptions {\n model: string;\n prompt: string;\n apiKey?: string;\n}\n\nexport async function runAnthropicStep(opts: AnthropicStepOptions): Promise<string> {\n const client = new Anthropic({ apiKey: opts.apiKey ?? process.env.ANTHROPIC_API_KEY });\n const message = await client.messages.create({\n model: opts.model,\n max_tokens: 4096,\n messages: [{ role: \"user\", content: opts.prompt }],\n });\n const block = message.content[0];\n return block.type === \"text\" ? block.text : \"\";\n}\n","import OpenAI from \"openai\";\n\nexport interface OpenAIStepOptions {\n model: string;\n prompt: string;\n apiKey?: string;\n}\n\nexport async function runOpenAIStep(opts: OpenAIStepOptions): Promise<string> {\n const client = new OpenAI({ apiKey: opts.apiKey ?? process.env.OPENAI_API_KEY });\n const completion = await client.chat.completions.create({\n model: opts.model,\n messages: [{ role: \"user\", content: opts.prompt }],\n });\n return completion.choices[0]?.message.content ?? \"\";\n}\n","import { Ollama } from \"ollama\";\n\nexport interface OllamaStepOptions {\n model: string;\n prompt: string;\n host?: string;\n}\n\nexport async function runOllamaStep(opts: OllamaStepOptions): Promise<string> {\n const host = opts.host ?? process.env.OLLAMA_HOST ?? \"http://localhost:11434\";\n const client = new Ollama({ host });\n const response = await client.generate({ model: opts.model, prompt: opts.prompt });\n return response.response;\n}\n","import { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst execAsync = promisify(exec);\n\nexport interface ShellStepOptions {\n command: string;\n cwd?: string;\n}\n\nexport async function runShellStep(opts: ShellStepOptions): Promise<string> {\n const { stdout } = await execAsync(opts.command, {\n cwd: opts.cwd,\n maxBuffer: 10 * 1024 * 1024,\n });\n return stdout;\n}\n","import { readFile } from \"node:fs/promises\";\n\nexport interface FileStepOptions {\n path: string;\n encoding?: BufferEncoding;\n}\n\nexport async function runFileStep(opts: FileStepOptions): Promise<string> {\n return readFile(opts.path, opts.encoding ?? \"utf8\");\n}\n","import { config as dotenvConfig } from \"dotenv\";\n\nlet envLoaded = false;\n\nexport function loadLocalEnv(): void {\n if (envLoaded) {\n return;\n }\n\n dotenvConfig({ path: \".env\" });\n dotenvConfig({ path: \".env.local\", override: true });\n\n envLoaded = true;\n}\n\n","import { z } from \"zod\";\nimport { loadLocalEnv } from \"./env.js\";\n\nloadLocalEnv();\n\nconst serverEnvSchema = z.object({\n DATABASE_URL: z.string().min(1),\n WORKPLANE_SERVER_PORT: z\n .string()\n .optional()\n .default(\"8787\")\n .transform((value) => Number.parseInt(value, 10)),\n WORKPLANE_NODE_TOKEN: z.string().optional(),\n WORKPLANE_OPERATOR_TOKEN: z.string().optional(),\n WORKPLANE_ENV_ALLOWLIST: z.string().optional(),\n});\n\nconst nodeEnvSchema = z.object({\n WORKPLANE_SERVER_URL: z.string().url().optional().default(\"http://localhost:8787\"),\n WORKPLANE_NODE_NAME: z.string().optional().default(\"local-node-1\"),\n WORKPLANE_NODE_ID: z.string().optional(),\n WORKPLANE_NODE_CAPABILITIES: z\n .string()\n .optional()\n .default(\"shell,git,node,typescript,aider,ollama,codex,claude-code\"),\n WORKPLANE_NODE_TOKEN: z.string().optional(),\n WORKPLANE_POLL_INTERVAL_MS: z\n .string()\n .optional()\n .default(\"3000\")\n .transform((value) => Number.parseInt(value, 10)),\n WORKPLANE_ENV_ALLOWLIST: z.string().optional(),\n});\n\nexport interface ServerConfig {\n databaseUrl: string;\n port: number;\n nodeToken?: string;\n operatorToken?: string;\n envAllowlist: string[];\n}\n\nexport interface NodeConfig {\n serverUrl: string;\n nodeName: string;\n nodeId?: string;\n nodeCapabilities: string[];\n nodeToken?: string;\n pollIntervalMs: number;\n envAllowlist: string[];\n}\n\nexport function loadServerConfig(env: NodeJS.ProcessEnv = process.env): ServerConfig {\n const parsed = serverEnvSchema.parse(env);\n\n return {\n databaseUrl: parsed.DATABASE_URL,\n port: parsed.WORKPLANE_SERVER_PORT,\n nodeToken: parsed.WORKPLANE_NODE_TOKEN,\n operatorToken: parsed.WORKPLANE_OPERATOR_TOKEN,\n envAllowlist: parseCsv(parsed.WORKPLANE_ENV_ALLOWLIST ?? \"\"),\n };\n}\n\nexport function loadNodeConfig(env: NodeJS.ProcessEnv = process.env): NodeConfig {\n const parsed = nodeEnvSchema.parse(env);\n\n return {\n serverUrl: parsed.WORKPLANE_SERVER_URL,\n nodeName: parsed.WORKPLANE_NODE_NAME,\n nodeId: parsed.WORKPLANE_NODE_ID,\n nodeCapabilities: parseCsv(parsed.WORKPLANE_NODE_CAPABILITIES),\n nodeToken: parsed.WORKPLANE_NODE_TOKEN,\n pollIntervalMs: parsed.WORKPLANE_POLL_INTERVAL_MS,\n envAllowlist: parseCsv(parsed.WORKPLANE_ENV_ALLOWLIST ?? \"\"),\n };\n}\n\nexport function parseCsv(value: string): string[] {\n return value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n","import type { IncomingMessage } from \"node:http\";\n\nexport function parseBearerToken(authorizationHeader: string | undefined): string | undefined {\n if (!authorizationHeader) {\n return undefined;\n }\n const match = /^Bearer\\s+(.+)$/i.exec(authorizationHeader.trim());\n return match?.[1];\n}\n\nexport function isAuthorizedBearer(provided: string | undefined, expected: string | undefined): boolean {\n if (!expected) {\n return true;\n }\n if (!provided) {\n return false;\n }\n return provided === expected;\n}\n\nexport function getRequestBearer(req: IncomingMessage): string | undefined {\n const header = req.headers.authorization;\n const value = Array.isArray(header) ? header[0] : header;\n return parseBearerToken(value);\n}\n\nexport function authHeaders(token: string | undefined): Record<string, string> {\n if (!token) {\n return {};\n }\n return { authorization: `Bearer ${token}` };\n}\n","import { authHeaders } from \"./auth.js\";\n\nexport interface WorkplaneHttpOptions {\n method?: string;\n body?: unknown;\n nodeToken?: string;\n operatorToken?: string;\n}\n\nexport function buildWorkplaneHeaders(options: WorkplaneHttpOptions = {}): Record<string, string> {\n const token = options.nodeToken ?? options.operatorToken;\n return {\n \"content-type\": \"application/json\",\n ...authHeaders(token),\n };\n}\n\nexport async function workplaneFetch<T>(\n serverUrl: string,\n path: string,\n options: WorkplaneHttpOptions = {},\n): Promise<T> {\n const response = await fetch(`${serverUrl}${path}`, {\n method: options.method ?? \"GET\",\n headers: buildWorkplaneHeaders(options),\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`${response.status} ${response.statusText} from ${path}: ${text}`);\n }\n\n return (await response.json()) as T;\n}\n","import type { Workplan } from \"@workplane/workplans\";\n\nexport interface CodeReviewOptions {\n repoPath?: string;\n model?: string;\n branch?: string;\n}\n\nexport function codeReviewPlan(opts: CodeReviewOptions = {}): Workplan {\n const { repoPath = \".\", model = \"claude-haiku-4-5-20251001\", branch } = opts;\n const diffCmd = branch ? `git diff ${branch}..HEAD` : \"git diff HEAD~1\";\n\n return {\n id: \"code-review\",\n name: \"Code Review\",\n steps: [\n {\n id: \"diff\",\n name: \"Git Diff\",\n adapter: \"shell\",\n provider: \"shell\",\n payload: { command: diffCmd, cwd: repoPath },\n output: { dest: \"next\" },\n },\n {\n id: \"summarize\",\n name: \"Summarize\",\n adapter: \"ollama\",\n provider: \"ollama\",\n model: \"llama3\",\n payload: { prompt: \"Summarize these code changes concisely:\\n{{prevOutput}}\" },\n output: { dest: \"next\" },\n },\n {\n id: \"critique\",\n name: \"Critique\",\n adapter: \"anthropic\",\n provider: \"anthropic\",\n model,\n payload: { prompt: \"Review this summary for correctness, security issues, and code quality:\\n{{prevOutput}}\" },\n },\n ],\n };\n}\n","import type { Workplan } from \"@workplane/workplans\";\n\nexport interface SummarizeFileOptions {\n filePath: string;\n provider?: string;\n model?: string;\n}\n\nexport function summarizeFilePlan(opts: SummarizeFileOptions): Workplan {\n const { filePath, provider = \"ollama\", model = \"llama3\" } = opts;\n\n return {\n id: \"summarize-file\",\n name: \"Summarize File\",\n steps: [\n {\n id: \"read\",\n name: \"Read File\",\n adapter: \"file\",\n provider: \"file\",\n payload: { path: filePath },\n output: { dest: \"next\" },\n },\n {\n id: \"summarize\",\n name: \"Summarize\",\n adapter: provider,\n provider,\n model,\n payload: { prompt: \"Summarize the following file content concisely:\\n{{prevOutput}}\" },\n },\n ],\n };\n}\n","import type { SkillEntry } from \"../types.js\";\nimport { codeReviewPlan } from \"./code-review.js\";\nimport { summarizeFilePlan } from \"./summarize-file.js\";\n\nexport class SkillRegistry {\n private readonly skills = new Map<string, SkillEntry>();\n\n register(entry: SkillEntry): void {\n this.skills.set(entry.name, entry);\n }\n\n get(name: string): SkillEntry | undefined {\n return this.skills.get(name);\n }\n\n list(): SkillEntry[] {\n return Array.from(this.skills.values());\n }\n}\n\nexport function createDefaultRegistry(): SkillRegistry {\n const registry = new SkillRegistry();\n\n registry.register({\n name: \"code-review\",\n description: \"Git diff → local summarize (ollama) → frontier critique (anthropic)\",\n buildPlan: (opts) =>\n codeReviewPlan({\n repoPath: typeof opts.repo === \"string\" ? opts.repo : undefined,\n model: typeof opts.model === \"string\" ? opts.model : undefined,\n branch: typeof opts.branch === \"string\" ? opts.branch : undefined,\n }),\n });\n\n registry.register({\n name: \"summarize-file\",\n description: \"Read file → summarize with configurable provider (default: ollama)\",\n buildPlan: (opts) => {\n const filePath = typeof opts.file === \"string\" ? opts.file : \"\";\n if (!filePath) throw new Error(\"--file is required for summarize-file\");\n return summarizeFilePlan({\n filePath,\n provider: typeof opts.provider === \"string\" ? opts.provider : undefined,\n model: typeof opts.model === \"string\" ? opts.model : undefined,\n });\n },\n });\n\n return registry;\n}\n\nexport function listSkills(registry: SkillRegistry): void {\n for (const skill of registry.list()) {\n process.stdout.write(` ${skill.name.padEnd(20)} ${skill.description}\\n`);\n }\n}\n","export function applyTemplate(payload: Record<string, unknown>, prevOutput: string): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(payload).map(([k, v]) => [\n k,\n typeof v === \"string\" ? v.replaceAll(\"{{prevOutput}}\", prevOutput) : v,\n ]),\n );\n}\n","import type { Workplan, WorkplanResult, WorkplanRunner, WorkplanRunContext, StepResult, WorkplanStep } from \"./types.js\";\nimport { applyTemplate } from \"./template.js\";\n\nconst INLINE_PROVIDERS = new Set([\"anthropic\", \"openai\", \"ollama\", \"shell\", \"file\"]);\n\nasync function runInlineStep(step: WorkplanStep, prompt: string): Promise<string> {\n const provider = step.provider!;\n if (provider === \"anthropic\") {\n const { runAnthropicStep } = await import(\"./providers/anthropic.js\");\n return runAnthropicStep({ model: step.model ?? \"claude-haiku-4-5-20251001\", prompt });\n }\n if (provider === \"openai\") {\n const { runOpenAIStep } = await import(\"./providers/openai.js\");\n return runOpenAIStep({ model: step.model ?? \"gpt-4o-mini\", prompt });\n }\n if (provider === \"ollama\") {\n const { runOllamaStep } = await import(\"./providers/ollama.js\");\n return runOllamaStep({ model: step.model ?? \"llama3\", prompt });\n }\n if (provider === \"shell\") {\n const { runShellStep } = await import(\"./providers/shell.js\");\n return runShellStep({\n command: String(step.payload.command ?? \"\"),\n cwd: typeof step.payload.cwd === \"string\" ? step.payload.cwd : undefined,\n });\n }\n if (provider === \"file\") {\n const { runFileStep } = await import(\"./providers/file.js\");\n return runFileStep({ path: String(step.payload.path ?? \"\") });\n }\n throw new Error(`unknown inline provider: ${provider}`);\n}\n\nexport class SequentialWorkplanRunner implements WorkplanRunner {\n async run(plan: Workplan, ctx: WorkplanRunContext): Promise<WorkplanResult> {\n const results: StepResult[] = [];\n let prevOutput = \"\";\n let planSucceeded = true;\n\n for (const step of plan.steps) {\n const payload = prevOutput ? applyTemplate(step.payload, prevOutput) : step.payload;\n const prompt = typeof payload.prompt === \"string\" ? payload.prompt : \"\";\n const start = Date.now();\n let output = \"\";\n let exitCode = 0;\n\n try {\n if (step.provider && INLINE_PROVIDERS.has(step.provider)) {\n output = await runInlineStep({ ...step, payload }, prompt);\n } else {\n const node = await ctx.resolveNode(step.requires ?? [], step.provider);\n const result = await node.execute({ ...step, payload });\n output = result.output;\n exitCode = result.exitCode;\n }\n } catch (err) {\n exitCode = 1;\n output = err instanceof Error ? err.message : String(err);\n planSucceeded = false;\n\n const stepResult: StepResult = {\n stepId: step.id,\n output,\n exitCode,\n durationMs: Date.now() - start,\n };\n results.push(stepResult);\n ctx.emitResult(step.id, step.name, output);\n\n if (!step.continueOnError) {\n return {\n planId: plan.id,\n status: \"step_failed\",\n steps: results,\n succeeded: false,\n };\n }\n prevOutput = \"\";\n continue;\n }\n\n const dest = step.output?.dest ?? \"stdout\";\n const stepResult: StepResult = {\n stepId: step.id,\n output,\n exitCode,\n durationMs: Date.now() - start,\n };\n results.push(stepResult);\n\n if (dest === \"stdout\" || dest === \"artifact\") {\n ctx.emitResult(step.id, step.name, output);\n prevOutput = \"\";\n } else if (dest === \"next\") {\n prevOutput = output;\n }\n }\n\n return {\n planId: plan.id,\n status: planSucceeded ? \"completed\" : \"failed\",\n steps: results,\n succeeded: planSucceeded,\n };\n }\n}\n","export function printStepResult(stepName: string, output: string): void {\n process.stdout.write(`=== step: ${stepName} ===\\n${output}\\n\\n`);\n}\n","import type { NodeHandle, WorkplanRunContext, WorkplanStep, StepResult } from \"./types.js\";\nimport { printStepResult } from \"./sinks/stdout.js\";\n\nexport interface LocalWorkplanContextOptions {\n serverUrl?: string;\n nodeToken?: string;\n}\n\nclass WorkplaneNodeHandle implements NodeHandle {\n constructor(\n private readonly serverUrl: string,\n private readonly nodeToken: string,\n ) {}\n\n async execute(step: WorkplanStep): Promise<StepResult> {\n const start = Date.now();\n const taskRes = await fetch(`${this.serverUrl}/tasks`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${this.nodeToken}`,\n },\n body: JSON.stringify({\n kind: \"workplan.step\",\n adapter: step.adapter,\n payload: step.payload,\n requires: step.requires ?? [],\n }),\n });\n\n if (!taskRes.ok) {\n throw new Error(`failed to submit step ${step.id}: ${taskRes.status}`);\n }\n\n const task = (await taskRes.json()) as { id: string };\n const output = await this.pollUntilDone(task.id);\n return { stepId: step.id, output, exitCode: 0, durationMs: Date.now() - start };\n }\n\n private async pollUntilDone(taskId: string): Promise<string> {\n const terminalStatuses = new Set([\"succeeded\", \"failed\", \"cancelled\"]);\n for (;;) {\n await new Promise((r) => setTimeout(r, 1000));\n const res = await fetch(`${this.serverUrl}/tasks/${taskId}`, {\n headers: { authorization: `Bearer ${this.nodeToken}` },\n });\n const task = (await res.json()) as { status: string; payload?: Record<string, unknown> };\n if (terminalStatuses.has(task.status)) {\n if (task.status !== \"succeeded\") {\n throw new Error(`step task ${taskId} ended with status: ${task.status}`);\n }\n return typeof task.payload?.output === \"string\" ? task.payload.output : \"\";\n }\n }\n }\n}\n\nexport class LocalWorkplanContext implements WorkplanRunContext {\n private readonly serverUrl: string;\n private readonly nodeToken: string;\n\n constructor(opts: LocalWorkplanContextOptions = {}) {\n this.serverUrl = opts.serverUrl ?? process.env.WORKPLANE_SERVER_URL ?? \"http://localhost:8787\";\n this.nodeToken = opts.nodeToken ?? process.env.WORKPLANE_NODE_TOKEN ?? \"\";\n }\n\n async resolveNode(_requires: string[], _provider?: string): Promise<NodeHandle> {\n return new WorkplaneNodeHandle(this.serverUrl, this.nodeToken);\n }\n\n emitResult(_stepId: string, stepName: string, output: string): void {\n printStepResult(stepName, output);\n }\n}\n","import { loadLocalEnv } from \"../../core/src/env.js\";\nimport { parseCsv } from \"../../core/src/config.js\";\nimport { workplaneFetch } from \"../../core/src/http-client.js\";\nimport { createDefaultRegistry, listSkills } from \"../../agent-skills/src/skills/index.js\";\nimport { SequentialWorkplanRunner } from \"../../workplans/src/runner.js\";\nimport { LocalWorkplanContext } from \"../../workplans/src/context.js\";\n\nloadLocalEnv();\n\nconst serverUrl = process.env.WORKPLANE_SERVER_URL ?? \"http://localhost:8787\";\nconst operatorToken = process.env.WORKPLANE_OPERATOR_TOKEN;\n\nasync function httpJson<T>(\n path: string,\n options?: { method?: string; body?: Record<string, unknown>; operator?: boolean },\n): Promise<T> {\n return workplaneFetch<T>(serverUrl, path, {\n method: options?.method,\n body: options?.body,\n operatorToken: options?.operator ? operatorToken : undefined,\n });\n}\n\ninterface RunListResponse {\n runs: Array<{ id: string }>;\n}\n\nfunction valueArg(args: string[], flag: string): string | undefined {\n const index = args.indexOf(flag);\n if (index === -1) {\n return undefined;\n }\n return args[index + 1];\n}\n\nfunction printJson(payload: unknown): void {\n process.stdout.write(`${JSON.stringify(payload, null, 2)}\\n`);\n}\n\nasync function resolveRunIdFromTaskId(taskId: string): Promise<string> {\n const runs = await httpJson<RunListResponse>(`/runs?taskId=${encodeURIComponent(taskId)}`);\n const runId = runs.runs[0]?.id;\n if (!runId) {\n throw new Error(`no runs found for task ${taskId}`);\n }\n return runId;\n}\n\nasync function showLogsById(id: string): Promise<void> {\n const runId = id.startsWith(\"task_\") ? await resolveRunIdFromTaskId(id) : id;\n const logs = await httpJson(`/runs/${runId}/logs`);\n printJson(logs);\n}\n\nfunction usage(): void {\n process.stdout.write(\n [\n \"workplane CLI\",\n \"\",\n \"Env: WORKPLANE_SERVER_URL, WORKPLANE_OPERATOR_TOKEN (for task submit/retry/cancel)\",\n \"\",\n \"Commands:\",\n \" server start / node start # use pnpm dev:server / dev:node\",\n \" task submit shell --command <cmd> [--repo <url>] [--branch <b>] [--cwd <path>]\",\n \" task submit aider --prompt <text> --repo <url> [--model <m>] [--test-command <cmd>]\",\n \" task submit inference --model <m> --prompt <text> [--requires ollama]\",\n \" task submit harness --harness <codex|claude-code> --repo <url> --prompt <text> [--interactive]\",\n \" tasks [--status <status>]\",\n \" task show|logs|retry|cancel <taskId>\",\n \" runs [--task-id <id>] [--status <status>]\",\n \" run show <runId>\",\n \" run input <runId> --stdin <text>\",\n \" run input <runId> --signal <SIGTERM|SIGKILL|SIGINT>\",\n \" run input <runId> --resize <COLSxROWS>\",\n \" logs <runId|taskId>\",\n \" artifacts <runId>\",\n \" skill list\",\n \" skill run <name> [--key value ...]\",\n ].join(\"\\n\"),\n );\n}\n\nasync function submitShell(args: string[]): Promise<void> {\n const command = valueArg(args, \"--command\");\n if (!command) {\n throw new Error(\"--command is required\");\n }\n\n const requires = parseCsv(valueArg(args, \"--requires\") ?? \"shell\");\n const repo = valueArg(args, \"--repo\");\n const branch = valueArg(args, \"--branch\");\n const cwd = valueArg(args, \"--cwd\");\n const task = await httpJson(\"/tasks\", {\n method: \"POST\",\n operator: true,\n body: {\n kind: \"shell.exec\",\n adapter: \"shell\",\n requires,\n payload: { command, repo, branch, cwd },\n },\n });\n\n printJson(task);\n}\n\nasync function submitAider(args: string[]): Promise<void> {\n const prompt = valueArg(args, \"--prompt\");\n if (!prompt) {\n throw new Error(\"--prompt is required\");\n }\n\n const model = valueArg(args, \"--model\");\n const repo = valueArg(args, \"--repo\");\n if (!repo) {\n throw new Error(\"--repo is required\");\n }\n const branch = valueArg(args, \"--branch\");\n const testCommand = valueArg(args, \"--test-command\");\n const requires = parseCsv(valueArg(args, \"--requires\") ?? \"git,aider\");\n const task = await httpJson(\"/tasks\", {\n method: \"POST\",\n operator: true,\n body: {\n kind: \"agent.run\",\n adapter: \"aider\",\n requires,\n payload: { prompt, model, repo, branch, testCommand },\n },\n });\n\n printJson(task);\n}\n\nasync function submitInference(args: string[]): Promise<void> {\n const model = valueArg(args, \"--model\");\n const prompt = valueArg(args, \"--prompt\");\n if (!model || !prompt) {\n throw new Error(\"--model and --prompt are required\");\n }\n\n const adapter = valueArg(args, \"--adapter\") ?? \"ollama\";\n const requires = parseCsv(valueArg(args, \"--requires\") ?? adapter);\n const inputFile = valueArg(args, \"--input-file\");\n\n const task = await httpJson(\"/tasks\", {\n method: \"POST\",\n operator: true,\n body: {\n kind: \"inference.batch\",\n adapter,\n requires,\n payload: { model, prompt, inputFile },\n },\n });\n\n printJson(task);\n}\n\nasync function submitHarness(args: string[]): Promise<void> {\n const harness = valueArg(args, \"--harness\");\n const prompt = valueArg(args, \"--prompt\");\n const repo = valueArg(args, \"--repo\");\n if (!harness || !prompt || !repo) {\n throw new Error(\"--harness, --prompt, and --repo are required\");\n }\n\n if (harness !== \"codex\" && harness !== \"claude-code\") {\n throw new Error(\"--harness must be codex or claude-code\");\n }\n\n const model = valueArg(args, \"--model\");\n const branch = valueArg(args, \"--branch\");\n const testCommand = valueArg(args, \"--test-command\");\n const interactive = args.includes(\"--interactive\") || undefined;\n const requires = parseCsv(valueArg(args, \"--requires\") ?? `${harness},git`);\n\n const task = await httpJson(\"/tasks\", {\n method: \"POST\",\n operator: true,\n body: {\n kind: \"agent.run\",\n adapter: harness,\n requires,\n payload: { prompt, repo, model, branch, testCommand, interactive },\n },\n });\n\n printJson(task);\n}\n\nasync function main(): Promise<void> {\n const [command, subcommand, ...rest] = process.argv.slice(2);\n\n if (!command) {\n usage();\n return;\n }\n\n if (command === \"server\" && subcommand === \"start\") {\n process.stdout.write(\"Use: pnpm dev:server\\n\");\n return;\n }\n\n if (command === \"node\" && subcommand === \"start\") {\n process.stdout.write(\"Use: pnpm dev:node\\n\");\n return;\n }\n\n if (command === \"task\" && subcommand === \"submit\") {\n const adapter = rest[0];\n const adapterArgs = rest.slice(1);\n if (adapter === \"shell\") {\n await submitShell(adapterArgs);\n return;\n }\n if (adapter === \"aider\") {\n await submitAider(adapterArgs);\n return;\n }\n if (adapter === \"inference\") {\n await submitInference(adapterArgs);\n return;\n }\n if (adapter === \"harness\") {\n await submitHarness(adapterArgs);\n return;\n }\n throw new Error(`unsupported adapter submit: ${adapter}`);\n }\n\n if (command === \"tasks\") {\n const status = valueArg([subcommand, ...rest].filter(Boolean) as string[], \"--status\");\n const tasks = await httpJson(status ? `/tasks?status=${encodeURIComponent(status)}` : \"/tasks\");\n printJson(tasks);\n return;\n }\n\n if (command === \"task\" && subcommand === \"show\") {\n const taskId = rest[0];\n if (!taskId) {\n throw new Error(\"task id is required\");\n }\n const task = await httpJson(`/tasks/${taskId}`);\n printJson(task);\n return;\n }\n\n if (command === \"task\" && subcommand === \"retry\") {\n const taskId = rest[0];\n if (!taskId) {\n throw new Error(\"task id is required\");\n }\n const task = await httpJson(`/tasks/${taskId}/retry`, { method: \"POST\", operator: true });\n printJson(task);\n return;\n }\n\n if (command === \"task\" && subcommand === \"logs\") {\n const taskId = rest[0];\n if (!taskId) {\n throw new Error(\"task id is required\");\n }\n await showLogsById(taskId);\n return;\n }\n\n if (command === \"task\" && subcommand === \"cancel\") {\n const taskId = rest[0];\n if (!taskId) {\n throw new Error(\"task id is required\");\n }\n const task = await httpJson(`/tasks/${taskId}/cancel`, { method: \"POST\", operator: true });\n printJson(task);\n return;\n }\n\n if (command === \"runs\") {\n const taskId = valueArg(rest, \"--task-id\");\n const status = valueArg(rest, \"--status\");\n const query = new URLSearchParams();\n if (taskId) {\n query.set(\"taskId\", taskId);\n }\n if (status) {\n query.set(\"status\", status);\n }\n const runs = await httpJson(query.size > 0 ? `/runs?${query.toString()}` : \"/runs\");\n printJson(runs);\n return;\n }\n\n if (command === \"run\" && subcommand === \"input\") {\n const runId = rest[0];\n if (!runId) {\n throw new Error(\"run id is required\");\n }\n const inputArgs = rest.slice(1);\n const stdinData = valueArg(inputArgs, \"--stdin\");\n const signal = valueArg(inputArgs, \"--signal\");\n const resize = valueArg(inputArgs, \"--resize\");\n\n let body: Record<string, unknown>;\n if (stdinData !== undefined) {\n body = { kind: \"stdin\", payload: { data: stdinData } };\n } else if (signal !== undefined) {\n if (signal !== \"SIGTERM\" && signal !== \"SIGKILL\" && signal !== \"SIGINT\") {\n throw new Error(\"--signal must be SIGTERM, SIGKILL, or SIGINT\");\n }\n body = { kind: \"signal\", payload: { signal } };\n } else if (resize !== undefined) {\n const match = /^(\\d+)x(\\d+)$/.exec(resize);\n if (!match) {\n throw new Error(\"--resize must be in COLSxROWS format, e.g. 220x50\");\n }\n body = { kind: \"resize\", payload: { cols: Number(match[1]), rows: Number(match[2]) } };\n } else {\n throw new Error(\"one of --stdin, --signal, or --resize is required\");\n }\n\n const result = await httpJson(`/runs/${runId}/input`, { method: \"POST\", operator: true, body });\n printJson(result);\n return;\n }\n\n if (command === \"run\" && subcommand === \"show\") {\n const runId = rest[0];\n if (!runId) {\n throw new Error(\"run id is required\");\n }\n const run = await httpJson(`/runs/${runId}`);\n printJson(run);\n return;\n }\n\n if (command === \"logs\") {\n const id = subcommand;\n if (!id) {\n throw new Error(\"run id or task id is required\");\n }\n await showLogsById(id);\n return;\n }\n\n if (command === \"artifacts\") {\n const runId = subcommand;\n if (!runId) {\n throw new Error(\"run id is required\");\n }\n const artifacts = await httpJson(`/runs/${runId}/artifacts`);\n printJson(artifacts);\n return;\n }\n\n if (command === \"skill\" && subcommand === \"list\") {\n const registry = createDefaultRegistry();\n process.stdout.write(\"Available skills:\\n\");\n listSkills(registry);\n return;\n }\n\n if (command === \"skill\" && subcommand === \"run\") {\n const skillName = rest[0];\n if (!skillName) {\n throw new Error(\"skill name is required\");\n }\n const registry = createDefaultRegistry();\n const skill = registry.get(skillName);\n if (!skill) {\n throw new Error(`unknown skill: ${skillName}. Run 'workplane skill list' to see available skills.`);\n }\n\n const optArgs = rest.slice(1);\n const options: Record<string, unknown> = {};\n for (let i = 0; i < optArgs.length - 1; i++) {\n if (optArgs[i].startsWith(\"--\")) {\n options[optArgs[i].slice(2)] = optArgs[i + 1];\n i++;\n }\n }\n\n const plan = skill.buildPlan(options);\n const runner = new SequentialWorkplanRunner();\n const ctx = new LocalWorkplanContext();\n const result = await runner.run(plan, ctx);\n\n if (!result.succeeded) {\n process.stderr.write(`skill '${skillName}' failed at step '${result.steps.at(-1)?.stepId ?? \"unknown\"}'\\n`);\n process.exit(1);\n }\n return;\n }\n\n usage();\n}\n\nmain().catch((error) => {\n process.stderr.write(`${String(error)}\\n`);\n process.exit(1);\n});\n"],"mappings":"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","names":["serverUrl","runAnthropicStep","runOpenAIStep","runOllamaStep","runShellStep","runFileStep","stepResult","serverUrl"]}
|
package/dist/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../node/src/index.ts","../../core/src/config.ts","../../core/src/env.ts","../../core/src/auth.ts","../../core/src/http-client.ts","../../core/src/git.ts","../../adapter-sdk/src/index.ts","../../node/src/pty-exec.ts","../../node/src/env.ts","../../adapter-shell/src/index.ts","../../adapter-aider/src/index.ts","../../adapter-ollama/src/index.ts","../../adapter-harness/src/index.ts","../../adapter-codex/src/index.ts","../../adapter-claude-code/src/index.ts"],"sourcesContent":["import { mkdir, writeFile } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { loadNodeConfig, loadServerConfig } from \"../../core/src/config.js\";\nimport { workplaneFetch } from \"../../core/src/http-client.js\";\nimport { defaultTaskBranchName, repoPath } from \"../../core/src/git.js\";\nimport { createCancellableExec, ensureWorkspacePath, type WorkAdapter, type WorkContext } from \"../../adapter-sdk/src/index.js\";\nimport { createPtyExec } from \"./pty-exec.js\";\nimport { shellAdapter } from \"../../adapter-shell/src/index.js\";\nimport { aiderAdapter } from \"../../adapter-aider/src/index.js\";\nimport { ollamaAdapter } from \"../../adapter-ollama/src/index.js\";\nimport { codexAdapter } from \"../../adapter-codex/src/index.js\";\nimport { claudeCodeAdapter } from \"../../adapter-claude-code/src/index.js\";\nimport type { ArtifactInput, RunInputEvent, RunStatus, TaskRecord } from \"../../types/src/index.js\";\n\ninterface Assignment {\n task: TaskRecord;\n run: {\n id: string;\n taskId: string;\n };\n}\n\nconst REPO_ADAPTERS = new Set([\"aider\", \"codex\", \"claude-code\"]);\n\nconst adapters = new Map<string, WorkAdapter<unknown>>([\n [\"shell\", shellAdapter as WorkAdapter<unknown>],\n [\"aider\", aiderAdapter as WorkAdapter<unknown>],\n [\"ollama\", ollamaAdapter as WorkAdapter<unknown>],\n [\"codex\", codexAdapter as WorkAdapter<unknown>],\n [\"claude-code\", claudeCodeAdapter as WorkAdapter<unknown>],\n]);\n\nfunction nowStamp(): string {\n return new Date().toISOString().replace(/[:.]/g, \"-\");\n}\n\nfunction workspaceRoot(): string {\n return resolve(process.env.WORKPLANE_WORKSPACE_ROOT ?? \".workplane/workspaces\");\n}\n\nfunction shouldMirrorNodeLogs(): boolean {\n const value = process.env.WORKPLANE_NODE_LOG_MIRROR;\n if (!value) {\n return false;\n }\n return value === \"1\" || value.toLowerCase() === \"true\" || value.toLowerCase() === \"yes\";\n}\n\nfunction stringPayloadValue(payload: Record<string, unknown>, key: string): string | undefined {\n const value = payload[key];\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction nodeHttpOptions(config: ReturnType<typeof loadNodeConfig>) {\n return { nodeToken: config.nodeToken };\n}\n\nasync function updateStatus(\n config: ReturnType<typeof loadNodeConfig>,\n runId: string,\n status: RunStatus,\n error?: string,\n): Promise<void> {\n await workplaneFetch(config.serverUrl, `/runs/${runId}/status`, {\n method: \"POST\",\n body: { status, error },\n ...nodeHttpOptions(config),\n });\n}\n\nasync function appendLogs(\n config: ReturnType<typeof loadNodeConfig>,\n runId: string,\n logs: Array<{ stream: \"stdout\" | \"stderr\" | \"system\"; message: string; stepName?: string }>,\n): Promise<void> {\n await workplaneFetch(config.serverUrl, `/runs/${runId}/logs`, {\n method: \"POST\",\n body: { logs },\n ...nodeHttpOptions(config),\n });\n}\n\nasync function emitArtifact(\n config: ReturnType<typeof loadNodeConfig>,\n runId: string,\n artifact: ArtifactInput,\n): Promise<void> {\n await workplaneFetch(config.serverUrl, `/runs/${runId}/artifacts`, {\n method: \"POST\",\n body: artifact,\n ...nodeHttpOptions(config),\n });\n}\n\nasync function pollInputEvents(\n config: ReturnType<typeof loadNodeConfig>,\n runId: string,\n afterSequence: number,\n): Promise<RunInputEvent[]> {\n const result = await workplaneFetch<{ events: RunInputEvent[] }>(\n config.serverUrl,\n `/runs/${runId}/input?afterSequence=${afterSequence}`,\n nodeHttpOptions(config),\n );\n return result.events;\n}\n\nasync function markDelivered(\n config: ReturnType<typeof loadNodeConfig>,\n runId: string,\n sequence: number,\n): Promise<void> {\n await workplaneFetch(config.serverUrl, `/runs/${runId}/input/${sequence}/delivered`, {\n method: \"POST\",\n ...nodeHttpOptions(config),\n });\n}\n\nasync function isCancelled(config: ReturnType<typeof loadNodeConfig>, runId: string): Promise<boolean> {\n const run = await workplaneFetch<{ status: string; taskId: string }>(config.serverUrl, `/runs/${runId}`, nodeHttpOptions(config));\n if (run.status === \"cancelled\") {\n return true;\n }\n const task = await workplaneFetch<{ status: string }>(\n config.serverUrl,\n `/tasks/${run.taskId}`,\n nodeHttpOptions(config),\n );\n return task.status === \"cancelled\";\n}\n\nasync function checkoutRepoIfPresent(context: WorkContext, payload: Record<string, unknown>): Promise<boolean> {\n const repo = stringPayloadValue(payload, \"repo\");\n if (!repo) {\n return false;\n }\n\n await context.log(\"system\", `cloning repository ${repo}`, \"checkout-repo\");\n const cloneResult = await context.exec(\"git\", [\"clone\", repo, \"repo\"], {\n cwd: context.workspacePath,\n });\n if (cloneResult.exitCode !== 0) {\n throw new Error(`git clone failed with exit code ${cloneResult.exitCode}`);\n }\n\n const branch = stringPayloadValue(payload, \"branch\");\n if (branch) {\n await context.log(\"system\", `checking out branch ${branch}`, \"checkout-repo\");\n const checkoutResult = await context.exec(\"git\", [\"checkout\", branch], {\n cwd: repoPath(context.workspacePath),\n });\n if (checkoutResult.exitCode !== 0) {\n throw new Error(`git checkout failed with exit code ${checkoutResult.exitCode}`);\n }\n }\n\n await context.emitArtifact({\n type: \"workspace.repo\",\n name: \"repo-checkout\",\n path: repoPath(context.workspacePath),\n metadata: { repo, branch: branch ?? null },\n });\n return true;\n}\n\nasync function executeAssignment(config: ReturnType<typeof loadNodeConfig>, assignment: Assignment): Promise<void> {\n const runId = assignment.run.id;\n const task = assignment.task;\n const adapter = adapters.get(task.adapter);\n if (!adapter) {\n await updateStatus(config, runId, \"failed\", `adapter not registered: ${task.adapter}`);\n return;\n }\n\n const runWorkspace = join(workspaceRoot(), `${runId}_${nowStamp()}`);\n const mirrorLogs = shouldMirrorNodeLogs();\n await mkdir(runWorkspace, { recursive: true });\n await ensureWorkspacePath(runWorkspace, \"logs\");\n await ensureWorkspacePath(runWorkspace, \"artifacts\");\n await ensureWorkspacePath(runWorkspace, \"tmp\");\n await writeFile(\n join(runWorkspace, \"metadata.json\"),\n JSON.stringify({ runId, taskId: task.id, adapter: task.adapter, createdAt: new Date().toISOString() }, null, 2),\n \"utf8\",\n );\n\n await updateStatus(config, runId, \"running\");\n\n const serverEnvAllowlist =\n config.envAllowlist.length > 0\n ? config.envAllowlist\n : loadServerConfig().envAllowlist.length > 0\n ? loadServerConfig().envAllowlist\n : undefined;\n\n const logFn = async (stream: \"stdout\" | \"stderr\" | \"system\", message: string, stepName?: string): Promise<void> => {\n if (mirrorLogs) {\n const prefix = `[run:${runId}] [${stream}]${stepName ? ` [${stepName}]` : \"\"} `;\n if (stream === \"stderr\") {\n process.stderr.write(`${prefix}${message}`);\n } else {\n process.stdout.write(`${prefix}${message}`);\n }\n }\n await appendLogs(config, runId, [{ stream, message, stepName }]);\n };\n\n const isInteractive = task.payload.interactive === true;\n const usePty = adapter.terminalMode === \"pty\" && isInteractive;\n\n const stubContext: WorkContext = {\n runId,\n taskId: task.id,\n workspacePath: runWorkspace,\n log: logFn,\n exec: async () => ({ exitCode: 1, stdout: \"\", stderr: \"not initialized\" }),\n ensureWorkspace: async (...segments: string[]) => ensureWorkspacePath(runWorkspace, ...segments),\n emitArtifact: async () => {},\n envAllowlist: serverEnvAllowlist,\n };\n\n const handle = usePty\n ? createPtyExec(stubContext)\n : createCancellableExec(stubContext);\n\n const { exec, kill, writeStdin } = handle;\n const ptyResize = \"ptyResize\" in handle ? handle.ptyResize : undefined;\n\n const context: WorkContext = {\n runId,\n taskId: task.id,\n workspacePath: runWorkspace,\n envAllowlist: serverEnvAllowlist,\n log: logFn,\n exec,\n ensureWorkspace: async (...segments: string[]) => ensureWorkspacePath(runWorkspace, ...segments),\n emitArtifact: async (input) => {\n await emitArtifact(config, runId, input);\n },\n writeStdin: adapter.interactive && isInteractive ? writeStdin : undefined,\n ptyResize: adapter.interactive && isInteractive ? ptyResize : undefined,\n };\n\n const cancelInterval = setInterval(() => {\n void isCancelled(config, runId).then((cancelled) => {\n if (cancelled) {\n kill();\n }\n });\n }, 2000);\n\n let lastInputSequence = 0;\n let inputInterval: ReturnType<typeof setInterval> | undefined;\n\n if (adapter.interactive && isInteractive) {\n inputInterval = setInterval(() => {\n void pollInputEvents(config, runId, lastInputSequence)\n .then(async (events) => {\n for (const event of events) {\n if (event.kind === \"stdin\") {\n writeStdin(String(event.payload.data ?? \"\"));\n } else if (event.kind === \"signal\") {\n kill(String(event.payload.signal ?? \"SIGTERM\") as NodeJS.Signals);\n } else if (event.kind === \"resize\" && ptyResize) {\n const rows = Number(event.payload.rows ?? 50);\n const cols = Number(event.payload.cols ?? 220);\n ptyResize(rows, cols);\n }\n await markDelivered(config, runId, event.sequence);\n lastInputSequence = Math.max(lastInputSequence, event.sequence);\n }\n })\n .catch((err: unknown) => {\n process.stderr.write(`input poll error [run:${runId}]: ${String(err)}\\n`);\n });\n }, 500);\n }\n\n try {\n await context.log(\"system\", `starting adapter ${adapter.name}`, \"run-adapter\");\n const hasRepo = await checkoutRepoIfPresent(context, task.payload);\n if (REPO_ADAPTERS.has(adapter.name) && !hasRepo) {\n throw new Error(`${adapter.name} adapter requires payload.repo`);\n }\n\n const adapterPayload = { ...task.payload };\n if (adapter.name === \"shell\" && hasRepo && typeof adapterPayload.cwd !== \"string\") {\n adapterPayload.cwd = \"repo\";\n }\n\n if (REPO_ADAPTERS.has(adapter.name) && adapter.name !== \"aider\" && !stringPayloadValue(adapterPayload, \"taskBranch\")) {\n adapterPayload.taskBranch = defaultTaskBranchName(runId);\n }\n\n await adapter.run(context, adapterPayload);\n\n if (await isCancelled(config, runId)) {\n await context.log(\"system\", \"run cancelled\", \"run-adapter\");\n await updateStatus(config, runId, \"cancelled\", \"task cancelled\");\n return;\n }\n\n await context.log(\"system\", \"adapter execution finished\", \"run-adapter\");\n await updateStatus(config, runId, \"succeeded\");\n } catch (error) {\n if (await isCancelled(config, runId)) {\n await updateStatus(config, runId, \"cancelled\", \"task cancelled\");\n return;\n }\n const message = error instanceof Error ? error.message : String(error);\n await context.log(\"stderr\", message, \"run-adapter\");\n await updateStatus(config, runId, \"failed\", message);\n } finally {\n clearInterval(cancelInterval);\n if (inputInterval !== undefined) {\n clearInterval(inputInterval);\n }\n kill();\n }\n}\n\nasync function main(): Promise<void> {\n const config = loadNodeConfig();\n const register = await workplaneFetch<{ id: string }>(config.serverUrl, \"/nodes/register\", {\n method: \"POST\",\n body: {\n name: config.nodeName,\n capabilities: config.nodeCapabilities,\n nodeId: config.nodeId,\n },\n ...nodeHttpOptions(config),\n });\n const nodeId = register.id;\n process.stdout.write(`node registered: ${nodeId}\\n`);\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n try {\n const poll = await workplaneFetch<{ assignment: Assignment | null }>(\n config.serverUrl,\n `/nodes/${nodeId}/poll`,\n {\n method: \"POST\",\n body: {\n capabilities: config.nodeCapabilities,\n },\n ...nodeHttpOptions(config),\n },\n );\n\n if (poll.assignment) {\n await executeAssignment(config, poll.assignment);\n }\n } catch (error) {\n process.stderr.write(`poll error: ${String(error)}\\n`);\n }\n\n await new Promise((resolvePromise) => setTimeout(resolvePromise, config.pollIntervalMs));\n }\n}\n\nmain().catch((error) => {\n process.stderr.write(`${String(error)}\\n`);\n process.exit(1);\n});\n","import { z } from \"zod\";\nimport { loadLocalEnv } from \"./env.js\";\n\nloadLocalEnv();\n\nconst serverEnvSchema = z.object({\n DATABASE_URL: z.string().min(1),\n WORKPLANE_SERVER_PORT: z\n .string()\n .optional()\n .default(\"8787\")\n .transform((value) => Number.parseInt(value, 10)),\n WORKPLANE_NODE_TOKEN: z.string().optional(),\n WORKPLANE_OPERATOR_TOKEN: z.string().optional(),\n WORKPLANE_ENV_ALLOWLIST: z.string().optional(),\n});\n\nconst nodeEnvSchema = z.object({\n WORKPLANE_SERVER_URL: z.string().url().optional().default(\"http://localhost:8787\"),\n WORKPLANE_NODE_NAME: z.string().optional().default(\"local-node-1\"),\n WORKPLANE_NODE_ID: z.string().optional(),\n WORKPLANE_NODE_CAPABILITIES: z\n .string()\n .optional()\n .default(\"shell,git,node,typescript,aider,ollama,codex,claude-code\"),\n WORKPLANE_NODE_TOKEN: z.string().optional(),\n WORKPLANE_POLL_INTERVAL_MS: z\n .string()\n .optional()\n .default(\"3000\")\n .transform((value) => Number.parseInt(value, 10)),\n WORKPLANE_ENV_ALLOWLIST: z.string().optional(),\n});\n\nexport interface ServerConfig {\n databaseUrl: string;\n port: number;\n nodeToken?: string;\n operatorToken?: string;\n envAllowlist: string[];\n}\n\nexport interface NodeConfig {\n serverUrl: string;\n nodeName: string;\n nodeId?: string;\n nodeCapabilities: string[];\n nodeToken?: string;\n pollIntervalMs: number;\n envAllowlist: string[];\n}\n\nexport function loadServerConfig(env: NodeJS.ProcessEnv = process.env): ServerConfig {\n const parsed = serverEnvSchema.parse(env);\n\n return {\n databaseUrl: parsed.DATABASE_URL,\n port: parsed.WORKPLANE_SERVER_PORT,\n nodeToken: parsed.WORKPLANE_NODE_TOKEN,\n operatorToken: parsed.WORKPLANE_OPERATOR_TOKEN,\n envAllowlist: parseCsv(parsed.WORKPLANE_ENV_ALLOWLIST ?? \"\"),\n };\n}\n\nexport function loadNodeConfig(env: NodeJS.ProcessEnv = process.env): NodeConfig {\n const parsed = nodeEnvSchema.parse(env);\n\n return {\n serverUrl: parsed.WORKPLANE_SERVER_URL,\n nodeName: parsed.WORKPLANE_NODE_NAME,\n nodeId: parsed.WORKPLANE_NODE_ID,\n nodeCapabilities: parseCsv(parsed.WORKPLANE_NODE_CAPABILITIES),\n nodeToken: parsed.WORKPLANE_NODE_TOKEN,\n pollIntervalMs: parsed.WORKPLANE_POLL_INTERVAL_MS,\n envAllowlist: parseCsv(parsed.WORKPLANE_ENV_ALLOWLIST ?? \"\"),\n };\n}\n\nexport function parseCsv(value: string): string[] {\n return value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n","import { config as dotenvConfig } from \"dotenv\";\n\nlet envLoaded = false;\n\nexport function loadLocalEnv(): void {\n if (envLoaded) {\n return;\n }\n\n dotenvConfig({ path: \".env\" });\n dotenvConfig({ path: \".env.local\", override: true });\n\n envLoaded = true;\n}\n\n","import type { IncomingMessage } from \"node:http\";\n\nexport function parseBearerToken(authorizationHeader: string | undefined): string | undefined {\n if (!authorizationHeader) {\n return undefined;\n }\n const match = /^Bearer\\s+(.+)$/i.exec(authorizationHeader.trim());\n return match?.[1];\n}\n\nexport function isAuthorizedBearer(provided: string | undefined, expected: string | undefined): boolean {\n if (!expected) {\n return true;\n }\n if (!provided) {\n return false;\n }\n return provided === expected;\n}\n\nexport function getRequestBearer(req: IncomingMessage): string | undefined {\n const header = req.headers.authorization;\n const value = Array.isArray(header) ? header[0] : header;\n return parseBearerToken(value);\n}\n\nexport function authHeaders(token: string | undefined): Record<string, string> {\n if (!token) {\n return {};\n }\n return { authorization: `Bearer ${token}` };\n}\n","import { authHeaders } from \"./auth.js\";\n\nexport interface WorkplaneHttpOptions {\n method?: string;\n body?: unknown;\n nodeToken?: string;\n operatorToken?: string;\n}\n\nexport function buildWorkplaneHeaders(options: WorkplaneHttpOptions = {}): Record<string, string> {\n const token = options.nodeToken ?? options.operatorToken;\n return {\n \"content-type\": \"application/json\",\n ...authHeaders(token),\n };\n}\n\nexport async function workplaneFetch<T>(\n serverUrl: string,\n path: string,\n options: WorkplaneHttpOptions = {},\n): Promise<T> {\n const response = await fetch(`${serverUrl}${path}`, {\n method: options.method ?? \"GET\",\n headers: buildWorkplaneHeaders(options),\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`${response.status} ${response.statusText} from ${path}: ${text}`);\n }\n\n return (await response.json()) as T;\n}\n","import { join } from \"node:path\";\n\nexport interface GitExecContext {\n workspacePath: string;\n runId: string;\n log: (stream: \"stdout\" | \"stderr\" | \"system\", message: string, stepName?: string) => Promise<void>;\n exec: (\n command: string,\n args?: string[],\n options?: { cwd?: string },\n ) => Promise<{ exitCode: number; stdout: string; stderr: string }>;\n ensureWorkspace: (...segments: string[]) => Promise<string>;\n emitArtifact: (input: {\n type: string;\n name: string;\n path: string;\n metadata?: Record<string, unknown>;\n }) => Promise<void>;\n}\n\nexport function repoPath(workspacePath: string): string {\n return join(workspacePath, \"repo\");\n}\n\nexport async function createTaskBranch(context: GitExecContext, branchName: string): Promise<void> {\n const cwd = repoPath(context.workspacePath);\n await context.log(\"system\", `creating branch ${branchName}`, \"git-branch\");\n const checkout = await context.exec(\"git\", [\"checkout\", \"-b\", branchName], { cwd });\n if (checkout.exitCode !== 0) {\n throw new Error(`git checkout -b failed with exit code ${checkout.exitCode}`);\n }\n}\n\nexport function defaultTaskBranchName(runId: string): string {\n return `workplane/${runId}`;\n}\n\nexport async function captureGitDiff(\n context: GitExecContext,\n adapterName: string,\n artifactName = \"changes.diff\",\n): Promise<string> {\n const cwd = repoPath(context.workspacePath);\n const diffResult = await context.exec(\"git\", [\"diff\"], { cwd });\n const artifactsPath = await context.ensureWorkspace(\"artifacts\");\n const diffPath = join(artifactsPath, artifactName);\n const { writeFile } = await import(\"node:fs/promises\");\n await writeFile(diffPath, diffResult.stdout, \"utf8\");\n await context.emitArtifact({\n type: \"diff\",\n name: artifactName,\n path: diffPath,\n metadata: { adapter: adapterName },\n });\n return diffPath;\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport { mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport interface ExecResult {\n exitCode: number;\n stdout: string;\n stderr: string;\n}\n\nexport interface ExecOptions {\n cwd?: string;\n env?: Record<string, string>;\n signal?: AbortSignal;\n}\n\nexport interface ArtifactInput {\n type: string;\n name: string;\n path: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface WorkContext {\n runId: string;\n taskId: string;\n workspacePath: string;\n log: (stream: \"stdout\" | \"stderr\" | \"system\", message: string, stepName?: string) => Promise<void>;\n exec: (command: string, args?: string[], options?: ExecOptions) => Promise<ExecResult>;\n ensureWorkspace: (...segments: string[]) => Promise<string>;\n emitArtifact: (input: ArtifactInput) => Promise<void>;\n envAllowlist?: string[];\n writeStdin?: (data: string) => void;\n ptyResize?: (rows: number, cols: number) => void;\n}\n\nexport interface WorkAdapter<TPayload = Record<string, unknown>> {\n name: string;\n kind: string;\n interactive?: boolean;\n terminalMode?: \"stdio\" | \"pty\";\n run: (context: WorkContext, payload: TPayload) => Promise<void>;\n}\n\nfunction pickEnv(allowlist: string[] | undefined): Record<string, string> {\n if (!allowlist || allowlist.length === 0) {\n return { ...process.env } as Record<string, string>;\n }\n const picked: Record<string, string> = {};\n for (const key of allowlist) {\n const value = process.env[key];\n if (value !== undefined) {\n picked[key] = value;\n }\n }\n picked.PATH = process.env.PATH ?? \"\";\n picked.HOME = process.env.HOME ?? \"\";\n return picked;\n}\n\nexport function createExec(context: WorkContext): WorkContext[\"exec\"] {\n return async (command: string, args: string[] = [], options: ExecOptions = {}) =>\n new Promise<ExecResult>((resolve) => {\n let childError: Error | undefined;\n const child = spawn(command, args, {\n cwd: options.cwd ?? context.workspacePath,\n env: {\n ...pickEnv(context.envAllowlist),\n ...(options.env ?? {}),\n },\n signal: options.signal,\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout.on(\"data\", (chunk) => {\n const text = chunk.toString();\n stdout += text;\n void context.log(\"stdout\", text);\n });\n\n child.stderr.on(\"data\", (chunk) => {\n const text = chunk.toString();\n stderr += text;\n void context.log(\"stderr\", text);\n });\n\n child.on(\"error\", (error) => {\n childError = error;\n });\n\n child.on(\"close\", (exitCode, signal) => {\n if (signal === \"SIGTERM\" || signal === \"SIGKILL\") {\n resolve({\n exitCode: exitCode ?? 1,\n stdout,\n stderr: `${stderr}\\nprocess terminated (${signal})`.trim(),\n });\n return;\n }\n resolve({\n exitCode: exitCode ?? 1,\n stdout,\n stderr: childError ? `${stderr}\\n${childError.message}`.trim() : stderr,\n });\n });\n });\n}\n\nexport function createCancellableExec(context: WorkContext): {\n exec: WorkContext[\"exec\"];\n kill: (signal?: NodeJS.Signals) => void;\n writeStdin: (data: string) => void;\n} {\n let activeChild: ChildProcess | undefined;\n\n const exec: WorkContext[\"exec\"] = async (command, args = [], options = {}) =>\n new Promise<ExecResult>((resolve) => {\n let childError: Error | undefined;\n const child = spawn(command, args, {\n cwd: options.cwd ?? context.workspacePath,\n env: {\n ...pickEnv(context.envAllowlist),\n ...(options.env ?? {}),\n },\n signal: options.signal,\n });\n activeChild = child;\n\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout.on(\"data\", (chunk) => {\n const text = chunk.toString();\n stdout += text;\n void context.log(\"stdout\", text);\n });\n\n child.stderr.on(\"data\", (chunk) => {\n const text = chunk.toString();\n stderr += text;\n void context.log(\"stderr\", text);\n });\n\n child.on(\"error\", (error) => {\n childError = error;\n });\n\n child.on(\"close\", (exitCode, signal) => {\n if (activeChild === child) {\n activeChild = undefined;\n }\n if (signal === \"SIGTERM\" || signal === \"SIGKILL\") {\n resolve({\n exitCode: exitCode ?? 1,\n stdout,\n stderr: `${stderr}\\nprocess terminated (${signal})`.trim(),\n });\n return;\n }\n resolve({\n exitCode: exitCode ?? 1,\n stdout,\n stderr: childError ? `${stderr}\\n${childError.message}`.trim() : stderr,\n });\n });\n });\n\n const kill = (signal: NodeJS.Signals = \"SIGTERM\"): void => {\n if (!activeChild || activeChild.killed) return;\n activeChild.kill(signal);\n if (signal === \"SIGTERM\") {\n const escalation = setTimeout(() => {\n if (activeChild && !activeChild.killed) {\n activeChild.kill(\"SIGKILL\");\n }\n }, 5000);\n escalation.unref();\n }\n };\n\n const writeStdin = (data: string): void => {\n if (activeChild && !activeChild.killed && activeChild.stdin && !activeChild.stdin.destroyed) {\n activeChild.stdin.write(data);\n }\n };\n\n return { exec, kill, writeStdin };\n}\n\nexport async function ensureWorkspacePath(workspacePath: string, ...segments: string[]): Promise<string> {\n const fullPath = join(workspacePath, ...segments);\n await mkdir(fullPath, { recursive: true });\n return fullPath;\n}\n","import * as pty from \"node-pty\";\nimport type { WorkContext } from \"../../adapter-sdk/src/index.js\";\nimport { pickNodeEnv } from \"./env.js\";\n\n// Covers CSI (colors, cursor), OSC (window title), and simple ESC sequences.\nconst ANSI_RE = /\\x1b(?:[@-Z\\\\-_]|\\[[0-9;?]*[ -/]*[@-~]|\\][^\\x07\\x1b]*(?:\\x07|\\x1b\\\\))/g;\n\nfunction stripAnsi(text: string): string {\n return text.replace(ANSI_RE, \"\");\n}\n\nexport function createPtyExec(context: WorkContext): {\n exec: WorkContext[\"exec\"];\n kill: (signal?: NodeJS.Signals) => void;\n writeStdin: (data: string) => void;\n ptyResize: (rows: number, cols: number) => void;\n} {\n let activePty: pty.IPty | undefined;\n let killTimer: ReturnType<typeof setTimeout> | undefined;\n\n const exec: WorkContext[\"exec\"] = async (command, args = [], options = {}) =>\n new Promise((resolve) => {\n const env = {\n ...pickNodeEnv(context.envAllowlist),\n ...(options.env ?? {}),\n TERM: \"xterm-256color\",\n };\n\n const terminal = pty.spawn(command, args, {\n cwd: options.cwd ?? context.workspacePath,\n env,\n cols: 220,\n rows: 50,\n });\n activePty = terminal;\n\n let output = \"\";\n\n terminal.onData((chunk) => {\n const stripped = stripAnsi(chunk);\n output += stripped;\n void context.log(\"stdout\", stripped);\n });\n\n terminal.onExit(({ exitCode, signal: exitSignal }) => {\n activePty = undefined;\n if (killTimer !== undefined) {\n clearTimeout(killTimer);\n killTimer = undefined;\n }\n const terminated = exitSignal !== undefined && exitSignal !== 0;\n resolve({\n exitCode: terminated ? 1 : (exitCode ?? 0),\n stdout: output,\n stderr: terminated ? `process terminated (signal ${exitSignal})` : \"\",\n });\n });\n });\n\n const kill = (signal: NodeJS.Signals = \"SIGTERM\"): void => {\n if (!activePty) return;\n activePty.kill(signal);\n if (signal === \"SIGTERM\" && killTimer === undefined) {\n killTimer = setTimeout(() => {\n if (activePty) {\n activePty.kill(\"SIGKILL\");\n activePty = undefined;\n }\n killTimer = undefined;\n }, 5000);\n }\n };\n\n const writeStdin = (data: string): void => {\n if (activePty) {\n activePty.write(data);\n }\n };\n\n const ptyResize = (rows: number, cols: number): void => {\n if (activePty) {\n activePty.resize(cols, rows);\n }\n };\n\n return { exec, kill, writeStdin, ptyResize };\n}\n","export function pickNodeEnv(allowlist: string[] | undefined): Record<string, string> {\n if (!allowlist || allowlist.length === 0) {\n return { ...process.env } as Record<string, string>;\n }\n const picked: Record<string, string> = {};\n for (const key of allowlist) {\n const value = process.env[key];\n if (value !== undefined) {\n picked[key] = value;\n }\n }\n picked.PATH = process.env.PATH ?? \"\";\n picked.HOME = process.env.HOME ?? \"\";\n return picked;\n}\n","import type { WorkAdapter } from \"../../adapter-sdk/src/index.js\";\nimport { join } from \"node:path\";\nimport { writeFile } from \"node:fs/promises\";\n\ninterface ShellPayload {\n command: string;\n args?: string[];\n cwd?: string;\n}\n\nexport const shellAdapter: WorkAdapter<ShellPayload> = {\n name: \"shell\",\n kind: \"shell.exec\",\n async run(context, payload) {\n const renderedCommand = payload.args && payload.args.length > 0 ? `${payload.command} ${payload.args.join(\" \")}` : payload.command;\n const commandCwd = payload.cwd\n ? payload.cwd.startsWith(\"/\")\n ? payload.cwd\n : join(context.workspacePath, payload.cwd)\n : context.workspacePath;\n const result = await context.exec(\"/bin/sh\", [\"-lc\", renderedCommand], { cwd: commandCwd });\n const artifactsDir = await context.ensureWorkspace(\"artifacts\");\n const resultPath = join(artifactsDir, \"shell-result.json\");\n await writeFile(\n resultPath,\n JSON.stringify(\n {\n command: renderedCommand,\n cwd: commandCwd,\n exitCode: result.exitCode,\n },\n null,\n 2,\n ),\n \"utf8\",\n );\n await context.emitArtifact({\n type: \"shell.result\",\n name: \"shell-result.json\",\n path: resultPath,\n metadata: { exitCode: result.exitCode },\n });\n if (result.exitCode !== 0) {\n throw new Error(`shell command failed with exit code ${result.exitCode}`);\n }\n },\n};\n","import {\n captureGitDiff,\n createTaskBranch,\n defaultTaskBranchName,\n repoPath,\n type GitExecContext,\n} from \"../../core/src/git.js\";\nimport type { WorkAdapter } from \"../../adapter-sdk/src/index.js\";\n\ninterface AiderPayload {\n prompt: string;\n model?: string;\n testCommand?: string;\n}\n\nexport const aiderAdapter: WorkAdapter<AiderPayload> = {\n name: \"aider\",\n kind: \"agent.run\",\n async run(context, payload) {\n const cwd = repoPath(context.workspacePath);\n await createTaskBranch(context as GitExecContext, defaultTaskBranchName(context.runId));\n\n const args = [\"--yes\", \"--message\", payload.prompt];\n if (payload.model) {\n args.unshift(\"--model\", payload.model);\n }\n\n const result = await context.exec(\"aider\", args, { cwd });\n if (result.exitCode !== 0) {\n throw new Error(`aider failed with exit code ${result.exitCode}`);\n }\n\n await captureGitDiff(context as GitExecContext, \"aider\");\n\n if (payload.testCommand) {\n await context.log(\"system\", `running test command: ${payload.testCommand}`, \"run-tests\");\n const testResult = await context.exec(\"/bin/sh\", [\"-lc\", payload.testCommand], { cwd });\n if (testResult.exitCode !== 0) {\n throw new Error(`test command failed with exit code ${testResult.exitCode}`);\n }\n }\n },\n};\n","import { writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { WorkAdapter } from \"../../adapter-sdk/src/index.js\";\n\nexport interface OllamaPayload {\n model: string;\n prompt: string;\n inputFile?: string;\n}\n\nexport const ollamaAdapter: WorkAdapter<OllamaPayload> = {\n name: \"ollama\",\n kind: \"inference.batch\",\n async run(context, payload) {\n const args = [\"run\", payload.model, payload.prompt];\n const result = await context.exec(\"ollama\", args, { cwd: context.workspacePath });\n if (result.exitCode !== 0) {\n throw new Error(`ollama failed with exit code ${result.exitCode}`);\n }\n\n const artifactsPath = await context.ensureWorkspace(\"artifacts\");\n const outputPath = join(artifactsPath, \"inference-output.txt\");\n const output = `${result.stdout}${result.stderr}`.trim();\n await writeFile(outputPath, output, \"utf8\");\n await context.emitArtifact({\n type: \"inference.output\",\n name: \"inference-output.txt\",\n path: outputPath,\n metadata: { model: payload.model, adapter: \"ollama\" },\n });\n\n if (payload.inputFile) {\n await context.log(\"system\", `inputFile ${payload.inputFile} noted (batch file expansion not implemented)`, \"inference\");\n }\n },\n};\n","import { join } from \"node:path\";\nimport {\n captureGitDiff,\n createTaskBranch,\n defaultTaskBranchName,\n repoPath,\n type GitExecContext,\n} from \"../../core/src/git.js\";\nimport type { WorkAdapter } from \"../../adapter-sdk/src/index.js\";\n\nexport interface HarnessPayload {\n prompt: string;\n model?: string;\n testCommand?: string;\n branch?: string;\n taskBranch?: string;\n extraArgs?: string[];\n interactive?: boolean;\n}\n\nexport interface HarnessAdapterOptions {\n name: string;\n kind: string;\n binary: string | (() => string);\n interactive?: boolean;\n terminalMode?: \"stdio\" | \"pty\";\n defaultArgs?: string[];\n buildArgs?: (payload: HarnessPayload) => string[];\n buildInteractiveArgs?: (payload: HarnessPayload) => string[];\n}\n\nfunction resolveBinary(binary: string | (() => string)): string {\n return typeof binary === \"function\" ? binary() : binary;\n}\n\nexport function createHarnessAdapter(options: HarnessAdapterOptions): WorkAdapter<HarnessPayload> {\n return {\n name: options.name,\n kind: options.kind,\n interactive: options.interactive,\n terminalMode: options.terminalMode,\n async run(context, payload) {\n const cwd = repoPath(context.workspacePath);\n const branchName = payload.taskBranch ?? defaultTaskBranchName(context.runId);\n await createTaskBranch(context as GitExecContext, branchName);\n\n const binary = resolveBinary(options.binary);\n\n if (payload.interactive && options.buildInteractiveArgs) {\n const interactiveArgs = options.buildInteractiveArgs(payload);\n const execPromise = context.exec(binary, interactiveArgs, { cwd });\n await new Promise<void>((resolve) => setTimeout(resolve, 300));\n context.writeStdin?.(payload.prompt + \"\\n\");\n const result = await execPromise;\n if (result.exitCode !== 0) {\n throw new Error(`${binary} failed with exit code ${result.exitCode}`);\n }\n await captureGitDiff(context as GitExecContext, options.name);\n return;\n }\n\n const extra = payload.extraArgs ?? options.defaultArgs ?? [];\n const promptArgs = options.buildArgs ? options.buildArgs(payload) : [...extra, payload.prompt];\n const result = await context.exec(binary, promptArgs, { cwd });\n if (result.exitCode !== 0) {\n throw new Error(`${binary} failed with exit code ${result.exitCode}`);\n }\n\n await captureGitDiff(context as GitExecContext, options.name);\n\n if (payload.testCommand) {\n await context.log(\"system\", `running test command: ${payload.testCommand}`, \"run-tests\");\n const testResult = await context.exec(\"/bin/sh\", [\"-lc\", payload.testCommand], { cwd });\n const testArtifactPath = join(await context.ensureWorkspace(\"artifacts\"), \"test-output.txt\");\n const { writeFile } = await import(\"node:fs/promises\");\n await writeFile(testArtifactPath, `${testResult.stdout}\\n${testResult.stderr}`, \"utf8\");\n await context.emitArtifact({\n type: \"test.output\",\n name: \"test-output.txt\",\n path: testArtifactPath,\n metadata: { exitCode: testResult.exitCode },\n });\n if (testResult.exitCode !== 0) {\n throw new Error(`test command failed with exit code ${testResult.exitCode}`);\n }\n }\n },\n };\n}\n\nexport { captureGitDiff, createTaskBranch, defaultTaskBranchName, repoPath };\n","import { createHarnessAdapter } from \"../../adapter-harness/src/index.js\";\n\nexport const codexAdapter = createHarnessAdapter({\n name: \"codex\",\n kind: \"agent.run\",\n interactive: true,\n terminalMode: \"stdio\",\n binary: () => process.env.WORKPLANE_CODEX_BIN ?? \"codex\",\n buildArgs: (payload) => {\n const args = [...(payload.extraArgs ?? [\"--approval-mode\", \"full-auto\"])];\n if (payload.model) {\n args.push(\"--model\", payload.model);\n }\n args.push(payload.prompt);\n return args;\n },\n buildInteractiveArgs: (payload) => {\n const args: string[] = [...(payload.extraArgs ?? [])];\n if (payload.model) {\n args.push(\"--model\", payload.model);\n }\n return args;\n },\n});\n","import { createHarnessAdapter } from \"../../adapter-harness/src/index.js\";\n\nexport const claudeCodeAdapter = createHarnessAdapter({\n name: \"claude-code\",\n kind: \"agent.run\",\n interactive: true,\n terminalMode: \"pty\",\n binary: () => process.env.WORKPLANE_CLAUDE_CODE_BIN ?? \"claude\",\n buildArgs: (payload) => {\n const args = [\"-p\", payload.prompt, \"--output-format\", \"text\"];\n if (payload.model) {\n args.push(\"--model\", payload.model);\n }\n return [...args, ...(payload.extraArgs ?? [])];\n },\n buildInteractiveArgs: (payload) => {\n const args: string[] = [];\n if (payload.model) {\n args.push(\"--model\", payload.model);\n }\n return [...args, ...(payload.extraArgs ?? [])];\n },\n});\n"],"mappings":";;;AAAA,SAAS,SAAAA,QAAO,aAAAC,kBAAiB;AACjC,SAAS,QAAAC,OAAM,eAAe;;;ACD9B,SAAS,SAAS;;;ACAlB,SAAS,UAAU,oBAAoB;AAEvC,IAAI,YAAY;AAET,SAAS,eAAqB;AACnC,MAAI,WAAW;AACb;AAAA,EACF;AAEA,eAAa,EAAE,MAAM,OAAO,CAAC;AAC7B,eAAa,EAAE,MAAM,cAAc,UAAU,KAAK,CAAC;AAEnD,cAAY;AACd;;;ADVA,aAAa;AAEb,IAAM,kBAAkB,EAAE,OAAO;AAAA,EAC/B,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC9B,uBAAuB,EACpB,OAAO,EACP,SAAS,EACT,QAAQ,MAAM,EACd,UAAU,CAAC,UAAU,OAAO,SAAS,OAAO,EAAE,CAAC;AAAA,EAClD,sBAAsB,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1C,0BAA0B,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9C,yBAAyB,EAAE,OAAO,EAAE,SAAS;AAC/C,CAAC;AAED,IAAM,gBAAgB,EAAE,OAAO;AAAA,EAC7B,sBAAsB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,uBAAuB;AAAA,EACjF,qBAAqB,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,cAAc;AAAA,EACjE,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,EACvC,6BAA6B,EAC1B,OAAO,EACP,SAAS,EACT,QAAQ,0DAA0D;AAAA,EACrE,sBAAsB,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1C,4BAA4B,EACzB,OAAO,EACP,SAAS,EACT,QAAQ,MAAM,EACd,UAAU,CAAC,UAAU,OAAO,SAAS,OAAO,EAAE,CAAC;AAAA,EAClD,yBAAyB,EAAE,OAAO,EAAE,SAAS;AAC/C,CAAC;AAoBM,SAAS,iBAAiB,MAAyB,QAAQ,KAAmB;AACnF,QAAM,SAAS,gBAAgB,MAAM,GAAG;AAExC,SAAO;AAAA,IACL,aAAa,OAAO;AAAA,IACpB,MAAM,OAAO;AAAA,IACb,WAAW,OAAO;AAAA,IAClB,eAAe,OAAO;AAAA,IACtB,cAAc,SAAS,OAAO,2BAA2B,EAAE;AAAA,EAC7D;AACF;AAEO,SAAS,eAAe,MAAyB,QAAQ,KAAiB;AAC/E,QAAM,SAAS,cAAc,MAAM,GAAG;AAEtC,SAAO;AAAA,IACL,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO;AAAA,IACjB,QAAQ,OAAO;AAAA,IACf,kBAAkB,SAAS,OAAO,2BAA2B;AAAA,IAC7D,WAAW,OAAO;AAAA,IAClB,gBAAgB,OAAO;AAAA,IACvB,cAAc,SAAS,OAAO,2BAA2B,EAAE;AAAA,EAC7D;AACF;AAEO,SAAS,SAAS,OAAyB;AAChD,SAAO,MACJ,MAAM,GAAG,EACT,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,OAAO,OAAO;AACnB;;;AEzDO,SAAS,YAAY,OAAmD;AAC7E,MAAI,CAAC,OAAO;AACV,WAAO,CAAC;AAAA,EACV;AACA,SAAO,EAAE,eAAe,UAAU,KAAK,GAAG;AAC5C;;;ACtBO,SAAS,sBAAsB,UAAgC,CAAC,GAA2B;AAChG,QAAM,QAAQ,QAAQ,aAAa,QAAQ;AAC3C,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,GAAG,YAAY,KAAK;AAAA,EACtB;AACF;AAEA,eAAsB,eACpB,WACA,MACA,UAAgC,CAAC,GACrB;AACZ,QAAM,WAAW,MAAM,MAAM,GAAG,SAAS,GAAG,IAAI,IAAI;AAAA,IAClD,QAAQ,QAAQ,UAAU;AAAA,IAC1B,SAAS,sBAAsB,OAAO;AAAA,IACtC,MAAM,QAAQ,OAAO,KAAK,UAAU,QAAQ,IAAI,IAAI;AAAA,EACtD,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,UAAM,IAAI,MAAM,GAAG,SAAS,MAAM,IAAI,SAAS,UAAU,SAAS,IAAI,KAAK,IAAI,EAAE;AAAA,EACnF;AAEA,SAAQ,MAAM,SAAS,KAAK;AAC9B;;;AClCA,SAAS,YAAY;AAoBd,SAAS,SAAS,eAA+B;AACtD,SAAO,KAAK,eAAe,MAAM;AACnC;AAEA,eAAsB,iBAAiB,SAAyB,YAAmC;AACjG,QAAM,MAAM,SAAS,QAAQ,aAAa;AAC1C,QAAM,QAAQ,IAAI,UAAU,mBAAmB,UAAU,IAAI,YAAY;AACzE,QAAM,WAAW,MAAM,QAAQ,KAAK,OAAO,CAAC,YAAY,MAAM,UAAU,GAAG,EAAE,IAAI,CAAC;AAClF,MAAI,SAAS,aAAa,GAAG;AAC3B,UAAM,IAAI,MAAM,yCAAyC,SAAS,QAAQ,EAAE;AAAA,EAC9E;AACF;AAEO,SAAS,sBAAsB,OAAuB;AAC3D,SAAO,aAAa,KAAK;AAC3B;AAEA,eAAsB,eACpB,SACA,aACA,eAAe,gBACE;AACjB,QAAM,MAAM,SAAS,QAAQ,aAAa;AAC1C,QAAM,aAAa,MAAM,QAAQ,KAAK,OAAO,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC;AAC9D,QAAM,gBAAgB,MAAM,QAAQ,gBAAgB,WAAW;AAC/D,QAAM,WAAW,KAAK,eAAe,YAAY;AACjD,QAAM,EAAE,WAAAC,WAAU,IAAI,MAAM,OAAO,aAAkB;AACrD,QAAMA,WAAU,UAAU,WAAW,QAAQ,MAAM;AACnD,QAAM,QAAQ,aAAa;AAAA,IACzB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU,EAAE,SAAS,YAAY;AAAA,EACnC,CAAC;AACD,SAAO;AACT;;;ACvDA,SAAS,aAAgC;AACzC,SAAS,aAAa;AACtB,SAAS,QAAAC,aAAY;AA0CrB,SAAS,QAAQ,WAAyD;AACxE,MAAI,CAAC,aAAa,UAAU,WAAW,GAAG;AACxC,WAAO,EAAE,GAAG,QAAQ,IAAI;AAAA,EAC1B;AACA,QAAM,SAAiC,CAAC;AACxC,aAAW,OAAO,WAAW;AAC3B,UAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,QAAI,UAAU,QAAW;AACvB,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AACA,SAAO,OAAO,QAAQ,IAAI,QAAQ;AAClC,SAAO,OAAO,QAAQ,IAAI,QAAQ;AAClC,SAAO;AACT;AAoDO,SAAS,sBAAsB,SAIpC;AACA,MAAI;AAEJ,QAAM,OAA4B,OAAO,SAAS,OAAO,CAAC,GAAG,UAAU,CAAC,MACtE,IAAI,QAAoB,CAACC,aAAY;AACnC,QAAI;AACJ,UAAM,QAAQ,MAAM,SAAS,MAAM;AAAA,MACjC,KAAK,QAAQ,OAAO,QAAQ;AAAA,MAC5B,KAAK;AAAA,QACH,GAAG,QAAQ,QAAQ,YAAY;AAAA,QAC/B,GAAI,QAAQ,OAAO,CAAC;AAAA,MACtB;AAAA,MACA,QAAQ,QAAQ;AAAA,IAClB,CAAC;AACD,kBAAc;AAEd,QAAI,SAAS;AACb,QAAI,SAAS;AAEb,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAU;AACjC,YAAM,OAAO,MAAM,SAAS;AAC5B,gBAAU;AACV,WAAK,QAAQ,IAAI,UAAU,IAAI;AAAA,IACjC,CAAC;AAED,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAU;AACjC,YAAM,OAAO,MAAM,SAAS;AAC5B,gBAAU;AACV,WAAK,QAAQ,IAAI,UAAU,IAAI;AAAA,IACjC,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,UAAU;AAC3B,mBAAa;AAAA,IACf,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,UAAU,WAAW;AACtC,UAAI,gBAAgB,OAAO;AACzB,sBAAc;AAAA,MAChB;AACA,UAAI,WAAW,aAAa,WAAW,WAAW;AAChD,QAAAA,SAAQ;AAAA,UACN,UAAU,YAAY;AAAA,UACtB;AAAA,UACA,QAAQ,GAAG,MAAM;AAAA,sBAAyB,MAAM,IAAI,KAAK;AAAA,QAC3D,CAAC;AACD;AAAA,MACF;AACA,MAAAA,SAAQ;AAAA,QACN,UAAU,YAAY;AAAA,QACtB;AAAA,QACA,QAAQ,aAAa,GAAG,MAAM;AAAA,EAAK,WAAW,OAAO,GAAG,KAAK,IAAI;AAAA,MACnE,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AAEH,QAAM,OAAO,CAAC,SAAyB,cAAoB;AACzD,QAAI,CAAC,eAAe,YAAY,OAAQ;AACxC,gBAAY,KAAK,MAAM;AACvB,QAAI,WAAW,WAAW;AACxB,YAAM,aAAa,WAAW,MAAM;AAClC,YAAI,eAAe,CAAC,YAAY,QAAQ;AACtC,sBAAY,KAAK,SAAS;AAAA,QAC5B;AAAA,MACF,GAAG,GAAI;AACP,iBAAW,MAAM;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,aAAa,CAAC,SAAuB;AACzC,QAAI,eAAe,CAAC,YAAY,UAAU,YAAY,SAAS,CAAC,YAAY,MAAM,WAAW;AAC3F,kBAAY,MAAM,MAAM,IAAI;AAAA,IAC9B;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,MAAM,WAAW;AAClC;AAEA,eAAsB,oBAAoB,kBAA0B,UAAqC;AACvG,QAAM,WAAWC,MAAK,eAAe,GAAG,QAAQ;AAChD,QAAM,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AACzC,SAAO;AACT;;;ACnMA,YAAY,SAAS;;;ACAd,SAAS,YAAY,WAAyD;AACnF,MAAI,CAAC,aAAa,UAAU,WAAW,GAAG;AACxC,WAAO,EAAE,GAAG,QAAQ,IAAI;AAAA,EAC1B;AACA,QAAM,SAAiC,CAAC;AACxC,aAAW,OAAO,WAAW;AAC3B,UAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,QAAI,UAAU,QAAW;AACvB,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AACA,SAAO,OAAO,QAAQ,IAAI,QAAQ;AAClC,SAAO,OAAO,QAAQ,IAAI,QAAQ;AAClC,SAAO;AACT;;;ADTA,IAAM,UAAU;AAEhB,SAAS,UAAU,MAAsB;AACvC,SAAO,KAAK,QAAQ,SAAS,EAAE;AACjC;AAEO,SAAS,cAAc,SAK5B;AACA,MAAI;AACJ,MAAI;AAEJ,QAAM,OAA4B,OAAO,SAAS,OAAO,CAAC,GAAG,UAAU,CAAC,MACtE,IAAI,QAAQ,CAACC,aAAY;AACvB,UAAM,MAAM;AAAA,MACV,GAAG,YAAY,QAAQ,YAAY;AAAA,MACnC,GAAI,QAAQ,OAAO,CAAC;AAAA,MACpB,MAAM;AAAA,IACR;AAEA,UAAM,WAAe,UAAM,SAAS,MAAM;AAAA,MACxC,KAAK,QAAQ,OAAO,QAAQ;AAAA,MAC5B;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,IACR,CAAC;AACD,gBAAY;AAEZ,QAAI,SAAS;AAEb,aAAS,OAAO,CAAC,UAAU;AACzB,YAAM,WAAW,UAAU,KAAK;AAChC,gBAAU;AACV,WAAK,QAAQ,IAAI,UAAU,QAAQ;AAAA,IACrC,CAAC;AAED,aAAS,OAAO,CAAC,EAAE,UAAU,QAAQ,WAAW,MAAM;AACpD,kBAAY;AACZ,UAAI,cAAc,QAAW;AAC3B,qBAAa,SAAS;AACtB,oBAAY;AAAA,MACd;AACA,YAAM,aAAa,eAAe,UAAa,eAAe;AAC9D,MAAAA,SAAQ;AAAA,QACN,UAAU,aAAa,IAAK,YAAY;AAAA,QACxC,QAAQ;AAAA,QACR,QAAQ,aAAa,8BAA8B,UAAU,MAAM;AAAA,MACrE,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AAEH,QAAM,OAAO,CAAC,SAAyB,cAAoB;AACzD,QAAI,CAAC,UAAW;AAChB,cAAU,KAAK,MAAM;AACrB,QAAI,WAAW,aAAa,cAAc,QAAW;AACnD,kBAAY,WAAW,MAAM;AAC3B,YAAI,WAAW;AACb,oBAAU,KAAK,SAAS;AACxB,sBAAY;AAAA,QACd;AACA,oBAAY;AAAA,MACd,GAAG,GAAI;AAAA,IACT;AAAA,EACF;AAEA,QAAM,aAAa,CAAC,SAAuB;AACzC,QAAI,WAAW;AACb,gBAAU,MAAM,IAAI;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,YAAY,CAAC,MAAc,SAAuB;AACtD,QAAI,WAAW;AACb,gBAAU,OAAO,MAAM,IAAI;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,MAAM,YAAY,UAAU;AAC7C;;;AErFA,SAAS,QAAAC,aAAY;AACrB,SAAS,iBAAiB;AAQnB,IAAM,eAA0C;AAAA,EACrD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM,IAAI,SAAS,SAAS;AAC1B,UAAM,kBAAkB,QAAQ,QAAQ,QAAQ,KAAK,SAAS,IAAI,GAAG,QAAQ,OAAO,IAAI,QAAQ,KAAK,KAAK,GAAG,CAAC,KAAK,QAAQ;AAC3H,UAAM,aAAa,QAAQ,MACvB,QAAQ,IAAI,WAAW,GAAG,IACxB,QAAQ,MACRA,MAAK,QAAQ,eAAe,QAAQ,GAAG,IACzC,QAAQ;AACZ,UAAM,SAAS,MAAM,QAAQ,KAAK,WAAW,CAAC,OAAO,eAAe,GAAG,EAAE,KAAK,WAAW,CAAC;AAC1F,UAAM,eAAe,MAAM,QAAQ,gBAAgB,WAAW;AAC9D,UAAM,aAAaA,MAAK,cAAc,mBAAmB;AACzD,UAAM;AAAA,MACJ;AAAA,MACA,KAAK;AAAA,QACH;AAAA,UACE,SAAS;AAAA,UACT,KAAK;AAAA,UACL,UAAU,OAAO;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,IACF;AACA,UAAM,QAAQ,aAAa;AAAA,MACzB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU,EAAE,UAAU,OAAO,SAAS;AAAA,IACxC,CAAC;AACD,QAAI,OAAO,aAAa,GAAG;AACzB,YAAM,IAAI,MAAM,uCAAuC,OAAO,QAAQ,EAAE;AAAA,IAC1E;AAAA,EACF;AACF;;;AC/BO,IAAM,eAA0C;AAAA,EACrD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM,IAAI,SAAS,SAAS;AAC1B,UAAM,MAAM,SAAS,QAAQ,aAAa;AAC1C,UAAM,iBAAiB,SAA2B,sBAAsB,QAAQ,KAAK,CAAC;AAEtF,UAAM,OAAO,CAAC,SAAS,aAAa,QAAQ,MAAM;AAClD,QAAI,QAAQ,OAAO;AACjB,WAAK,QAAQ,WAAW,QAAQ,KAAK;AAAA,IACvC;AAEA,UAAM,SAAS,MAAM,QAAQ,KAAK,SAAS,MAAM,EAAE,IAAI,CAAC;AACxD,QAAI,OAAO,aAAa,GAAG;AACzB,YAAM,IAAI,MAAM,+BAA+B,OAAO,QAAQ,EAAE;AAAA,IAClE;AAEA,UAAM,eAAe,SAA2B,OAAO;AAEvD,QAAI,QAAQ,aAAa;AACvB,YAAM,QAAQ,IAAI,UAAU,yBAAyB,QAAQ,WAAW,IAAI,WAAW;AACvF,YAAM,aAAa,MAAM,QAAQ,KAAK,WAAW,CAAC,OAAO,QAAQ,WAAW,GAAG,EAAE,IAAI,CAAC;AACtF,UAAI,WAAW,aAAa,GAAG;AAC7B,cAAM,IAAI,MAAM,sCAAsC,WAAW,QAAQ,EAAE;AAAA,MAC7E;AAAA,IACF;AAAA,EACF;AACF;;;AC1CA,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,QAAAC,aAAY;AASd,IAAM,gBAA4C;AAAA,EACvD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM,IAAI,SAAS,SAAS;AAC1B,UAAM,OAAO,CAAC,OAAO,QAAQ,OAAO,QAAQ,MAAM;AAClD,UAAM,SAAS,MAAM,QAAQ,KAAK,UAAU,MAAM,EAAE,KAAK,QAAQ,cAAc,CAAC;AAChF,QAAI,OAAO,aAAa,GAAG;AACzB,YAAM,IAAI,MAAM,gCAAgC,OAAO,QAAQ,EAAE;AAAA,IACnE;AAEA,UAAM,gBAAgB,MAAM,QAAQ,gBAAgB,WAAW;AAC/D,UAAM,aAAaA,MAAK,eAAe,sBAAsB;AAC7D,UAAM,SAAS,GAAG,OAAO,MAAM,GAAG,OAAO,MAAM,GAAG,KAAK;AACvD,UAAMD,WAAU,YAAY,QAAQ,MAAM;AAC1C,UAAM,QAAQ,aAAa;AAAA,MACzB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU,EAAE,OAAO,QAAQ,OAAO,SAAS,SAAS;AAAA,IACtD,CAAC;AAED,QAAI,QAAQ,WAAW;AACrB,YAAM,QAAQ,IAAI,UAAU,aAAa,QAAQ,SAAS,iDAAiD,WAAW;AAAA,IACxH;AAAA,EACF;AACF;;;ACnCA,SAAS,QAAAE,aAAY;AA+BrB,SAAS,cAAc,QAAyC;AAC9D,SAAO,OAAO,WAAW,aAAa,OAAO,IAAI;AACnD;AAEO,SAAS,qBAAqB,SAA6D;AAChG,SAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd,MAAM,QAAQ;AAAA,IACd,aAAa,QAAQ;AAAA,IACrB,cAAc,QAAQ;AAAA,IACtB,MAAM,IAAI,SAAS,SAAS;AAC1B,YAAM,MAAM,SAAS,QAAQ,aAAa;AAC1C,YAAM,aAAa,QAAQ,cAAc,sBAAsB,QAAQ,KAAK;AAC5E,YAAM,iBAAiB,SAA2B,UAAU;AAE5D,YAAM,SAAS,cAAc,QAAQ,MAAM;AAE3C,UAAI,QAAQ,eAAe,QAAQ,sBAAsB;AACvD,cAAM,kBAAkB,QAAQ,qBAAqB,OAAO;AAC5D,cAAM,cAAc,QAAQ,KAAK,QAAQ,iBAAiB,EAAE,IAAI,CAAC;AACjE,cAAM,IAAI,QAAc,CAACC,aAAY,WAAWA,UAAS,GAAG,CAAC;AAC7D,gBAAQ,aAAa,QAAQ,SAAS,IAAI;AAC1C,cAAMC,UAAS,MAAM;AACrB,YAAIA,QAAO,aAAa,GAAG;AACzB,gBAAM,IAAI,MAAM,GAAG,MAAM,0BAA0BA,QAAO,QAAQ,EAAE;AAAA,QACtE;AACA,cAAM,eAAe,SAA2B,QAAQ,IAAI;AAC5D;AAAA,MACF;AAEA,YAAM,QAAQ,QAAQ,aAAa,QAAQ,eAAe,CAAC;AAC3D,YAAM,aAAa,QAAQ,YAAY,QAAQ,UAAU,OAAO,IAAI,CAAC,GAAG,OAAO,QAAQ,MAAM;AAC7F,YAAM,SAAS,MAAM,QAAQ,KAAK,QAAQ,YAAY,EAAE,IAAI,CAAC;AAC7D,UAAI,OAAO,aAAa,GAAG;AACzB,cAAM,IAAI,MAAM,GAAG,MAAM,0BAA0B,OAAO,QAAQ,EAAE;AAAA,MACtE;AAEA,YAAM,eAAe,SAA2B,QAAQ,IAAI;AAE5D,UAAI,QAAQ,aAAa;AACvB,cAAM,QAAQ,IAAI,UAAU,yBAAyB,QAAQ,WAAW,IAAI,WAAW;AACvF,cAAM,aAAa,MAAM,QAAQ,KAAK,WAAW,CAAC,OAAO,QAAQ,WAAW,GAAG,EAAE,IAAI,CAAC;AACtF,cAAM,mBAAmBC,MAAK,MAAM,QAAQ,gBAAgB,WAAW,GAAG,iBAAiB;AAC3F,cAAM,EAAE,WAAAC,WAAU,IAAI,MAAM,OAAO,aAAkB;AACrD,cAAMA,WAAU,kBAAkB,GAAG,WAAW,MAAM;AAAA,EAAK,WAAW,MAAM,IAAI,MAAM;AACtF,cAAM,QAAQ,aAAa;AAAA,UACzB,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,UAAU,EAAE,UAAU,WAAW,SAAS;AAAA,QAC5C,CAAC;AACD,YAAI,WAAW,aAAa,GAAG;AAC7B,gBAAM,IAAI,MAAM,sCAAsC,WAAW,QAAQ,EAAE;AAAA,QAC7E;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACtFO,IAAM,eAAe,qBAAqB;AAAA,EAC/C,MAAM;AAAA,EACN,MAAM;AAAA,EACN,aAAa;AAAA,EACb,cAAc;AAAA,EACd,QAAQ,MAAM,QAAQ,IAAI,uBAAuB;AAAA,EACjD,WAAW,CAAC,YAAY;AACtB,UAAM,OAAO,CAAC,GAAI,QAAQ,aAAa,CAAC,mBAAmB,WAAW,CAAE;AACxE,QAAI,QAAQ,OAAO;AACjB,WAAK,KAAK,WAAW,QAAQ,KAAK;AAAA,IACpC;AACA,SAAK,KAAK,QAAQ,MAAM;AACxB,WAAO;AAAA,EACT;AAAA,EACA,sBAAsB,CAAC,YAAY;AACjC,UAAM,OAAiB,CAAC,GAAI,QAAQ,aAAa,CAAC,CAAE;AACpD,QAAI,QAAQ,OAAO;AACjB,WAAK,KAAK,WAAW,QAAQ,KAAK;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AACF,CAAC;;;ACrBM,IAAM,oBAAoB,qBAAqB;AAAA,EACpD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,aAAa;AAAA,EACb,cAAc;AAAA,EACd,QAAQ,MAAM,QAAQ,IAAI,6BAA6B;AAAA,EACvD,WAAW,CAAC,YAAY;AACtB,UAAM,OAAO,CAAC,MAAM,QAAQ,QAAQ,mBAAmB,MAAM;AAC7D,QAAI,QAAQ,OAAO;AACjB,WAAK,KAAK,WAAW,QAAQ,KAAK;AAAA,IACpC;AACA,WAAO,CAAC,GAAG,MAAM,GAAI,QAAQ,aAAa,CAAC,CAAE;AAAA,EAC/C;AAAA,EACA,sBAAsB,CAAC,YAAY;AACjC,UAAM,OAAiB,CAAC;AACxB,QAAI,QAAQ,OAAO;AACjB,WAAK,KAAK,WAAW,QAAQ,KAAK;AAAA,IACpC;AACA,WAAO,CAAC,GAAG,MAAM,GAAI,QAAQ,aAAa,CAAC,CAAE;AAAA,EAC/C;AACF,CAAC;;;AdAD,IAAM,gBAAgB,oBAAI,IAAI,CAAC,SAAS,SAAS,aAAa,CAAC;AAE/D,IAAM,WAAW,oBAAI,IAAkC;AAAA,EACrD,CAAC,SAAS,YAAoC;AAAA,EAC9C,CAAC,SAAS,YAAoC;AAAA,EAC9C,CAAC,UAAU,aAAqC;AAAA,EAChD,CAAC,SAAS,YAAoC;AAAA,EAC9C,CAAC,eAAe,iBAAyC;AAC3D,CAAC;AAED,SAAS,WAAmB;AAC1B,UAAO,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AACtD;AAEA,SAAS,gBAAwB;AAC/B,SAAO,QAAQ,QAAQ,IAAI,4BAA4B,uBAAuB;AAChF;AAEA,SAAS,uBAAgC;AACvC,QAAM,QAAQ,QAAQ,IAAI;AAC1B,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,SAAO,UAAU,OAAO,MAAM,YAAY,MAAM,UAAU,MAAM,YAAY,MAAM;AACpF;AAEA,SAAS,mBAAmB,SAAkC,KAAiC;AAC7F,QAAM,QAAQ,QAAQ,GAAG;AACzB,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,UAAU,MAAM,KAAK;AAC3B,SAAO,QAAQ,SAAS,IAAI,UAAU;AACxC;AAEA,SAAS,gBAAgB,QAA2C;AAClE,SAAO,EAAE,WAAW,OAAO,UAAU;AACvC;AAEA,eAAe,aACb,QACA,OACA,QACA,OACe;AACf,QAAM,eAAe,OAAO,WAAW,SAAS,KAAK,WAAW;AAAA,IAC9D,QAAQ;AAAA,IACR,MAAM,EAAE,QAAQ,MAAM;AAAA,IACtB,GAAG,gBAAgB,MAAM;AAAA,EAC3B,CAAC;AACH;AAEA,eAAe,WACb,QACA,OACA,MACe;AACf,QAAM,eAAe,OAAO,WAAW,SAAS,KAAK,SAAS;AAAA,IAC5D,QAAQ;AAAA,IACR,MAAM,EAAE,KAAK;AAAA,IACb,GAAG,gBAAgB,MAAM;AAAA,EAC3B,CAAC;AACH;AAEA,eAAe,aACb,QACA,OACA,UACe;AACf,QAAM,eAAe,OAAO,WAAW,SAAS,KAAK,cAAc;AAAA,IACjE,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,GAAG,gBAAgB,MAAM;AAAA,EAC3B,CAAC;AACH;AAEA,eAAe,gBACb,QACA,OACA,eAC0B;AAC1B,QAAM,SAAS,MAAM;AAAA,IACnB,OAAO;AAAA,IACP,SAAS,KAAK,wBAAwB,aAAa;AAAA,IACnD,gBAAgB,MAAM;AAAA,EACxB;AACA,SAAO,OAAO;AAChB;AAEA,eAAe,cACb,QACA,OACA,UACe;AACf,QAAM,eAAe,OAAO,WAAW,SAAS,KAAK,UAAU,QAAQ,cAAc;AAAA,IACnF,QAAQ;AAAA,IACR,GAAG,gBAAgB,MAAM;AAAA,EAC3B,CAAC;AACH;AAEA,eAAe,YAAY,QAA2C,OAAiC;AACrG,QAAM,MAAM,MAAM,eAAmD,OAAO,WAAW,SAAS,KAAK,IAAI,gBAAgB,MAAM,CAAC;AAChI,MAAI,IAAI,WAAW,aAAa;AAC9B,WAAO;AAAA,EACT;AACA,QAAM,OAAO,MAAM;AAAA,IACjB,OAAO;AAAA,IACP,UAAU,IAAI,MAAM;AAAA,IACpB,gBAAgB,MAAM;AAAA,EACxB;AACA,SAAO,KAAK,WAAW;AACzB;AAEA,eAAe,sBAAsB,SAAsB,SAAoD;AAC7G,QAAM,OAAO,mBAAmB,SAAS,MAAM;AAC/C,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,IAAI,UAAU,sBAAsB,IAAI,IAAI,eAAe;AACzE,QAAM,cAAc,MAAM,QAAQ,KAAK,OAAO,CAAC,SAAS,MAAM,MAAM,GAAG;AAAA,IACrE,KAAK,QAAQ;AAAA,EACf,CAAC;AACD,MAAI,YAAY,aAAa,GAAG;AAC9B,UAAM,IAAI,MAAM,mCAAmC,YAAY,QAAQ,EAAE;AAAA,EAC3E;AAEA,QAAM,SAAS,mBAAmB,SAAS,QAAQ;AACnD,MAAI,QAAQ;AACV,UAAM,QAAQ,IAAI,UAAU,uBAAuB,MAAM,IAAI,eAAe;AAC5E,UAAM,iBAAiB,MAAM,QAAQ,KAAK,OAAO,CAAC,YAAY,MAAM,GAAG;AAAA,MACrE,KAAK,SAAS,QAAQ,aAAa;AAAA,IACrC,CAAC;AACD,QAAI,eAAe,aAAa,GAAG;AACjC,YAAM,IAAI,MAAM,sCAAsC,eAAe,QAAQ,EAAE;AAAA,IACjF;AAAA,EACF;AAEA,QAAM,QAAQ,aAAa;AAAA,IACzB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM,SAAS,QAAQ,aAAa;AAAA,IACpC,UAAU,EAAE,MAAM,QAAQ,UAAU,KAAK;AAAA,EAC3C,CAAC;AACD,SAAO;AACT;AAEA,eAAe,kBAAkB,QAA2C,YAAuC;AACjH,QAAM,QAAQ,WAAW,IAAI;AAC7B,QAAM,OAAO,WAAW;AACxB,QAAM,UAAU,SAAS,IAAI,KAAK,OAAO;AACzC,MAAI,CAAC,SAAS;AACZ,UAAM,aAAa,QAAQ,OAAO,UAAU,2BAA2B,KAAK,OAAO,EAAE;AACrF;AAAA,EACF;AAEA,QAAM,eAAeC,MAAK,cAAc,GAAG,GAAG,KAAK,IAAI,SAAS,CAAC,EAAE;AACnE,QAAM,aAAa,qBAAqB;AACxC,QAAMC,OAAM,cAAc,EAAE,WAAW,KAAK,CAAC;AAC7C,QAAM,oBAAoB,cAAc,MAAM;AAC9C,QAAM,oBAAoB,cAAc,WAAW;AACnD,QAAM,oBAAoB,cAAc,KAAK;AAC7C,QAAMC;AAAA,IACJF,MAAK,cAAc,eAAe;AAAA,IAClC,KAAK,UAAU,EAAE,OAAO,QAAQ,KAAK,IAAI,SAAS,KAAK,SAAS,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE,GAAG,MAAM,CAAC;AAAA,IAC9G;AAAA,EACF;AAEA,QAAM,aAAa,QAAQ,OAAO,SAAS;AAE3C,QAAM,qBACJ,OAAO,aAAa,SAAS,IACzB,OAAO,eACP,iBAAiB,EAAE,aAAa,SAAS,IACvC,iBAAiB,EAAE,eACnB;AAER,QAAM,QAAQ,OAAO,QAAwC,SAAiB,aAAqC;AACjH,QAAI,YAAY;AACd,YAAM,SAAS,QAAQ,KAAK,MAAM,MAAM,IAAI,WAAW,KAAK,QAAQ,MAAM,EAAE;AAC5E,UAAI,WAAW,UAAU;AACvB,gBAAQ,OAAO,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE;AAAA,MAC5C,OAAO;AACL,gBAAQ,OAAO,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE;AAAA,MAC5C;AAAA,IACF;AACA,UAAM,WAAW,QAAQ,OAAO,CAAC,EAAE,QAAQ,SAAS,SAAS,CAAC,CAAC;AAAA,EACjE;AAEA,QAAM,gBAAgB,KAAK,QAAQ,gBAAgB;AACnD,QAAM,SAAS,QAAQ,iBAAiB,SAAS;AAEjD,QAAM,cAA2B;AAAA,IAC/B;AAAA,IACA,QAAQ,KAAK;AAAA,IACb,eAAe;AAAA,IACf,KAAK;AAAA,IACL,MAAM,aAAa,EAAE,UAAU,GAAG,QAAQ,IAAI,QAAQ,kBAAkB;AAAA,IACxE,iBAAiB,UAAU,aAAuB,oBAAoB,cAAc,GAAG,QAAQ;AAAA,IAC/F,cAAc,YAAY;AAAA,IAAC;AAAA,IAC3B,cAAc;AAAA,EAChB;AAEA,QAAM,SAAS,SACX,cAAc,WAAW,IACzB,sBAAsB,WAAW;AAErC,QAAM,EAAE,MAAM,MAAM,WAAW,IAAI;AACnC,QAAM,YAAY,eAAe,SAAS,OAAO,YAAY;AAE7D,QAAM,UAAuB;AAAA,IAC3B;AAAA,IACA,QAAQ,KAAK;AAAA,IACb,eAAe;AAAA,IACf,cAAc;AAAA,IACd,KAAK;AAAA,IACL;AAAA,IACA,iBAAiB,UAAU,aAAuB,oBAAoB,cAAc,GAAG,QAAQ;AAAA,IAC/F,cAAc,OAAO,UAAU;AAC7B,YAAM,aAAa,QAAQ,OAAO,KAAK;AAAA,IACzC;AAAA,IACA,YAAY,QAAQ,eAAe,gBAAgB,aAAa;AAAA,IAChE,WAAW,QAAQ,eAAe,gBAAgB,YAAY;AAAA,EAChE;AAEA,QAAM,iBAAiB,YAAY,MAAM;AACvC,SAAK,YAAY,QAAQ,KAAK,EAAE,KAAK,CAAC,cAAc;AAClD,UAAI,WAAW;AACb,aAAK;AAAA,MACP;AAAA,IACF,CAAC;AAAA,EACH,GAAG,GAAI;AAEP,MAAI,oBAAoB;AACxB,MAAI;AAEJ,MAAI,QAAQ,eAAe,eAAe;AACxC,oBAAgB,YAAY,MAAM;AAChC,WAAK,gBAAgB,QAAQ,OAAO,iBAAiB,EAClD,KAAK,OAAO,WAAW;AACtB,mBAAW,SAAS,QAAQ;AAC1B,cAAI,MAAM,SAAS,SAAS;AAC1B,uBAAW,OAAO,MAAM,QAAQ,QAAQ,EAAE,CAAC;AAAA,UAC7C,WAAW,MAAM,SAAS,UAAU;AAClC,iBAAK,OAAO,MAAM,QAAQ,UAAU,SAAS,CAAmB;AAAA,UAClE,WAAW,MAAM,SAAS,YAAY,WAAW;AAC/C,kBAAM,OAAO,OAAO,MAAM,QAAQ,QAAQ,EAAE;AAC5C,kBAAM,OAAO,OAAO,MAAM,QAAQ,QAAQ,GAAG;AAC7C,sBAAU,MAAM,IAAI;AAAA,UACtB;AACA,gBAAM,cAAc,QAAQ,OAAO,MAAM,QAAQ;AACjD,8BAAoB,KAAK,IAAI,mBAAmB,MAAM,QAAQ;AAAA,QAChE;AAAA,MACF,CAAC,EACA,MAAM,CAAC,QAAiB;AACvB,gBAAQ,OAAO,MAAM,yBAAyB,KAAK,MAAM,OAAO,GAAG,CAAC;AAAA,CAAI;AAAA,MAC1E,CAAC;AAAA,IACL,GAAG,GAAG;AAAA,EACR;AAEA,MAAI;AACF,UAAM,QAAQ,IAAI,UAAU,oBAAoB,QAAQ,IAAI,IAAI,aAAa;AAC7E,UAAM,UAAU,MAAM,sBAAsB,SAAS,KAAK,OAAO;AACjE,QAAI,cAAc,IAAI,QAAQ,IAAI,KAAK,CAAC,SAAS;AAC/C,YAAM,IAAI,MAAM,GAAG,QAAQ,IAAI,gCAAgC;AAAA,IACjE;AAEA,UAAM,iBAAiB,EAAE,GAAG,KAAK,QAAQ;AACzC,QAAI,QAAQ,SAAS,WAAW,WAAW,OAAO,eAAe,QAAQ,UAAU;AACjF,qBAAe,MAAM;AAAA,IACvB;AAEA,QAAI,cAAc,IAAI,QAAQ,IAAI,KAAK,QAAQ,SAAS,WAAW,CAAC,mBAAmB,gBAAgB,YAAY,GAAG;AACpH,qBAAe,aAAa,sBAAsB,KAAK;AAAA,IACzD;AAEA,UAAM,QAAQ,IAAI,SAAS,cAAc;AAEzC,QAAI,MAAM,YAAY,QAAQ,KAAK,GAAG;AACpC,YAAM,QAAQ,IAAI,UAAU,iBAAiB,aAAa;AAC1D,YAAM,aAAa,QAAQ,OAAO,aAAa,gBAAgB;AAC/D;AAAA,IACF;AAEA,UAAM,QAAQ,IAAI,UAAU,8BAA8B,aAAa;AACvE,UAAM,aAAa,QAAQ,OAAO,WAAW;AAAA,EAC/C,SAAS,OAAO;AACd,QAAI,MAAM,YAAY,QAAQ,KAAK,GAAG;AACpC,YAAM,aAAa,QAAQ,OAAO,aAAa,gBAAgB;AAC/D;AAAA,IACF;AACA,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UAAM,QAAQ,IAAI,UAAU,SAAS,aAAa;AAClD,UAAM,aAAa,QAAQ,OAAO,UAAU,OAAO;AAAA,EACrD,UAAE;AACA,kBAAc,cAAc;AAC5B,QAAI,kBAAkB,QAAW;AAC/B,oBAAc,aAAa;AAAA,IAC7B;AACA,SAAK;AAAA,EACP;AACF;AAEA,eAAe,OAAsB;AACnC,QAAM,SAAS,eAAe;AAC9B,QAAM,WAAW,MAAM,eAA+B,OAAO,WAAW,mBAAmB;AAAA,IACzF,QAAQ;AAAA,IACR,MAAM;AAAA,MACJ,MAAM,OAAO;AAAA,MACb,cAAc,OAAO;AAAA,MACrB,QAAQ,OAAO;AAAA,IACjB;AAAA,IACA,GAAG,gBAAgB,MAAM;AAAA,EAC3B,CAAC;AACD,QAAM,SAAS,SAAS;AACxB,UAAQ,OAAO,MAAM,oBAAoB,MAAM;AAAA,CAAI;AAGnD,SAAO,MAAM;AACX,QAAI;AACF,YAAM,OAAO,MAAM;AAAA,QACjB,OAAO;AAAA,QACP,UAAU,MAAM;AAAA,QAChB;AAAA,UACE,QAAQ;AAAA,UACR,MAAM;AAAA,YACJ,cAAc,OAAO;AAAA,UACvB;AAAA,UACA,GAAG,gBAAgB,MAAM;AAAA,QAC3B;AAAA,MACF;AAEA,UAAI,KAAK,YAAY;AACnB,cAAM,kBAAkB,QAAQ,KAAK,UAAU;AAAA,MACjD;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,OAAO,MAAM,eAAe,OAAO,KAAK,CAAC;AAAA,CAAI;AAAA,IACvD;AAEA,UAAM,IAAI,QAAQ,CAAC,mBAAmB,WAAW,gBAAgB,OAAO,cAAc,CAAC;AAAA,EACzF;AACF;AAEA,KAAK,EAAE,MAAM,CAAC,UAAU;AACtB,UAAQ,OAAO,MAAM,GAAG,OAAO,KAAK,CAAC;AAAA,CAAI;AACzC,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["mkdir","writeFile","join","writeFile","join","resolve","join","resolve","join","writeFile","join","join","resolve","result","join","writeFile","join","mkdir","writeFile"]}
|
|
1
|
+
{"version":3,"sources":["../../node/src/index.ts","../../core/src/config.ts","../../core/src/env.ts","../../core/src/auth.ts","../../core/src/http-client.ts","../../core/src/git.ts","../../adapter-sdk/src/index.ts","../../node/src/pty-exec.ts","../../node/src/env.ts","../../adapter-shell/src/index.ts","../../adapter-aider/src/index.ts","../../adapter-ollama/src/index.ts","../../adapter-harness/src/index.ts","../../adapter-codex/src/index.ts","../../adapter-claude-code/src/index.ts"],"sourcesContent":["import { mkdir, writeFile } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { loadNodeConfig, loadServerConfig } from \"../../core/src/config.js\";\nimport { workplaneFetch } from \"../../core/src/http-client.js\";\nimport { defaultTaskBranchName, repoPath } from \"../../core/src/git.js\";\nimport { createCancellableExec, ensureWorkspacePath, type WorkAdapter, type WorkContext } from \"../../adapter-sdk/src/index.js\";\nimport { createPtyExec } from \"./pty-exec.js\";\nimport { shellAdapter } from \"../../adapter-shell/src/index.js\";\nimport { aiderAdapter } from \"../../adapter-aider/src/index.js\";\nimport { ollamaAdapter } from \"../../adapter-ollama/src/index.js\";\nimport { codexAdapter } from \"../../adapter-codex/src/index.js\";\nimport { claudeCodeAdapter } from \"../../adapter-claude-code/src/index.js\";\nimport type { ArtifactInput, RunInputEvent, RunStatus, TaskRecord } from \"../../types/src/index.js\";\n\ninterface Assignment {\n task: TaskRecord;\n run: {\n id: string;\n taskId: string;\n };\n}\n\nconst REPO_ADAPTERS = new Set([\"aider\", \"codex\", \"claude-code\"]);\n\nconst adapters = new Map<string, WorkAdapter<unknown>>([\n [\"shell\", shellAdapter as WorkAdapter<unknown>],\n [\"aider\", aiderAdapter as WorkAdapter<unknown>],\n [\"ollama\", ollamaAdapter as WorkAdapter<unknown>],\n [\"codex\", codexAdapter as WorkAdapter<unknown>],\n [\"claude-code\", claudeCodeAdapter as WorkAdapter<unknown>],\n]);\n\nfunction nowStamp(): string {\n return new Date().toISOString().replace(/[:.]/g, \"-\");\n}\n\nfunction workspaceRoot(): string {\n return resolve(process.env.WORKPLANE_WORKSPACE_ROOT ?? \".workplane/workspaces\");\n}\n\nfunction shouldMirrorNodeLogs(): boolean {\n const value = process.env.WORKPLANE_NODE_LOG_MIRROR;\n if (!value) {\n return false;\n }\n return value === \"1\" || value.toLowerCase() === \"true\" || value.toLowerCase() === \"yes\";\n}\n\nfunction stringPayloadValue(payload: Record<string, unknown>, key: string): string | undefined {\n const value = payload[key];\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction nodeHttpOptions(config: ReturnType<typeof loadNodeConfig>) {\n return { nodeToken: config.nodeToken };\n}\n\nasync function updateStatus(\n config: ReturnType<typeof loadNodeConfig>,\n runId: string,\n status: RunStatus,\n error?: string,\n): Promise<void> {\n await workplaneFetch(config.serverUrl, `/runs/${runId}/status`, {\n method: \"POST\",\n body: { status, error },\n ...nodeHttpOptions(config),\n });\n}\n\nasync function appendLogs(\n config: ReturnType<typeof loadNodeConfig>,\n runId: string,\n logs: Array<{ stream: \"stdout\" | \"stderr\" | \"system\"; message: string; stepName?: string }>,\n): Promise<void> {\n await workplaneFetch(config.serverUrl, `/runs/${runId}/logs`, {\n method: \"POST\",\n body: { logs },\n ...nodeHttpOptions(config),\n });\n}\n\nasync function emitArtifact(\n config: ReturnType<typeof loadNodeConfig>,\n runId: string,\n artifact: ArtifactInput,\n): Promise<void> {\n await workplaneFetch(config.serverUrl, `/runs/${runId}/artifacts`, {\n method: \"POST\",\n body: artifact,\n ...nodeHttpOptions(config),\n });\n}\n\nasync function pollInputEvents(\n config: ReturnType<typeof loadNodeConfig>,\n runId: string,\n afterSequence: number,\n): Promise<RunInputEvent[]> {\n const result = await workplaneFetch<{ events: RunInputEvent[] }>(\n config.serverUrl,\n `/runs/${runId}/input?afterSequence=${afterSequence}`,\n nodeHttpOptions(config),\n );\n return result.events;\n}\n\nasync function markDelivered(\n config: ReturnType<typeof loadNodeConfig>,\n runId: string,\n sequence: number,\n): Promise<void> {\n await workplaneFetch(config.serverUrl, `/runs/${runId}/input/${sequence}/delivered`, {\n method: \"POST\",\n ...nodeHttpOptions(config),\n });\n}\n\nasync function isCancelled(config: ReturnType<typeof loadNodeConfig>, runId: string): Promise<boolean> {\n const run = await workplaneFetch<{ status: string; taskId: string }>(config.serverUrl, `/runs/${runId}`, nodeHttpOptions(config));\n if (run.status === \"cancelled\") {\n return true;\n }\n const task = await workplaneFetch<{ status: string }>(\n config.serverUrl,\n `/tasks/${run.taskId}`,\n nodeHttpOptions(config),\n );\n return task.status === \"cancelled\";\n}\n\nasync function checkoutRepoIfPresent(context: WorkContext, payload: Record<string, unknown>): Promise<boolean> {\n const repo = stringPayloadValue(payload, \"repo\");\n if (!repo) {\n return false;\n }\n\n await context.log(\"system\", `cloning repository ${repo}`, \"checkout-repo\");\n const cloneResult = await context.exec(\"git\", [\"clone\", repo, \"repo\"], {\n cwd: context.workspacePath,\n });\n if (cloneResult.exitCode !== 0) {\n throw new Error(`git clone failed with exit code ${cloneResult.exitCode}`);\n }\n\n const branch = stringPayloadValue(payload, \"branch\");\n if (branch) {\n await context.log(\"system\", `checking out branch ${branch}`, \"checkout-repo\");\n const checkoutResult = await context.exec(\"git\", [\"checkout\", branch], {\n cwd: repoPath(context.workspacePath),\n });\n if (checkoutResult.exitCode !== 0) {\n throw new Error(`git checkout failed with exit code ${checkoutResult.exitCode}`);\n }\n }\n\n await context.emitArtifact({\n type: \"workspace.repo\",\n name: \"repo-checkout\",\n path: repoPath(context.workspacePath),\n metadata: { repo, branch: branch ?? null },\n });\n return true;\n}\n\nasync function executeAssignment(config: ReturnType<typeof loadNodeConfig>, assignment: Assignment): Promise<void> {\n const runId = assignment.run.id;\n const task = assignment.task;\n const adapter = adapters.get(task.adapter);\n if (!adapter) {\n await updateStatus(config, runId, \"failed\", `adapter not registered: ${task.adapter}`);\n return;\n }\n\n const runWorkspace = join(workspaceRoot(), `${runId}_${nowStamp()}`);\n const mirrorLogs = shouldMirrorNodeLogs();\n await mkdir(runWorkspace, { recursive: true });\n await ensureWorkspacePath(runWorkspace, \"logs\");\n await ensureWorkspacePath(runWorkspace, \"artifacts\");\n await ensureWorkspacePath(runWorkspace, \"tmp\");\n await writeFile(\n join(runWorkspace, \"metadata.json\"),\n JSON.stringify({ runId, taskId: task.id, adapter: task.adapter, createdAt: new Date().toISOString() }, null, 2),\n \"utf8\",\n );\n\n await updateStatus(config, runId, \"running\");\n\n const serverEnvAllowlist =\n config.envAllowlist.length > 0\n ? config.envAllowlist\n : loadServerConfig().envAllowlist.length > 0\n ? loadServerConfig().envAllowlist\n : undefined;\n\n const logFn = async (stream: \"stdout\" | \"stderr\" | \"system\", message: string, stepName?: string): Promise<void> => {\n if (mirrorLogs) {\n const prefix = `[run:${runId}] [${stream}]${stepName ? ` [${stepName}]` : \"\"} `;\n if (stream === \"stderr\") {\n process.stderr.write(`${prefix}${message}`);\n } else {\n process.stdout.write(`${prefix}${message}`);\n }\n }\n await appendLogs(config, runId, [{ stream, message, stepName }]);\n };\n\n const isInteractive = task.payload.interactive === true;\n const usePty = adapter.terminalMode === \"pty\" && isInteractive;\n\n const stubContext: WorkContext = {\n runId,\n taskId: task.id,\n workspacePath: runWorkspace,\n log: logFn,\n exec: async () => ({ exitCode: 1, stdout: \"\", stderr: \"not initialized\" }),\n ensureWorkspace: async (...segments: string[]) => ensureWorkspacePath(runWorkspace, ...segments),\n emitArtifact: async () => {},\n envAllowlist: serverEnvAllowlist,\n };\n\n const handle = usePty\n ? createPtyExec(stubContext)\n : createCancellableExec(stubContext);\n\n const { exec, kill, writeStdin } = handle;\n const ptyResize = \"ptyResize\" in handle ? handle.ptyResize : undefined;\n\n const context: WorkContext = {\n runId,\n taskId: task.id,\n workspacePath: runWorkspace,\n envAllowlist: serverEnvAllowlist,\n log: logFn,\n exec,\n ensureWorkspace: async (...segments: string[]) => ensureWorkspacePath(runWorkspace, ...segments),\n emitArtifact: async (input) => {\n await emitArtifact(config, runId, input);\n },\n writeStdin: adapter.interactive && isInteractive ? writeStdin : undefined,\n ptyResize: adapter.interactive && isInteractive ? ptyResize : undefined,\n };\n\n const cancelInterval = setInterval(() => {\n void isCancelled(config, runId).then((cancelled) => {\n if (cancelled) {\n kill();\n }\n });\n }, 2000);\n\n let lastInputSequence = 0;\n let inputInterval: ReturnType<typeof setInterval> | undefined;\n\n if (adapter.interactive && isInteractive) {\n inputInterval = setInterval(() => {\n void pollInputEvents(config, runId, lastInputSequence)\n .then(async (events) => {\n for (const event of events) {\n if (event.kind === \"stdin\") {\n writeStdin(String(event.payload.data ?? \"\"));\n } else if (event.kind === \"signal\") {\n kill(String(event.payload.signal ?? \"SIGTERM\") as NodeJS.Signals);\n } else if (event.kind === \"resize\" && ptyResize) {\n const rows = Number(event.payload.rows ?? 50);\n const cols = Number(event.payload.cols ?? 220);\n ptyResize(rows, cols);\n }\n await markDelivered(config, runId, event.sequence);\n lastInputSequence = Math.max(lastInputSequence, event.sequence);\n }\n })\n .catch((err: unknown) => {\n process.stderr.write(`input poll error [run:${runId}]: ${String(err)}\\n`);\n });\n }, 500);\n }\n\n try {\n await context.log(\"system\", `starting adapter ${adapter.name}`, \"run-adapter\");\n const hasRepo = await checkoutRepoIfPresent(context, task.payload);\n if (REPO_ADAPTERS.has(adapter.name) && !hasRepo) {\n throw new Error(`${adapter.name} adapter requires payload.repo`);\n }\n\n const adapterPayload = { ...task.payload };\n if (adapter.name === \"shell\" && hasRepo && typeof adapterPayload.cwd !== \"string\") {\n adapterPayload.cwd = \"repo\";\n }\n\n if (REPO_ADAPTERS.has(adapter.name) && adapter.name !== \"aider\" && !stringPayloadValue(adapterPayload, \"taskBranch\")) {\n adapterPayload.taskBranch = defaultTaskBranchName(runId);\n }\n\n await adapter.run(context, adapterPayload);\n\n if (await isCancelled(config, runId)) {\n await context.log(\"system\", \"run cancelled\", \"run-adapter\");\n await updateStatus(config, runId, \"cancelled\", \"task cancelled\");\n return;\n }\n\n await context.log(\"system\", \"adapter execution finished\", \"run-adapter\");\n await updateStatus(config, runId, \"succeeded\");\n } catch (error) {\n if (await isCancelled(config, runId)) {\n await updateStatus(config, runId, \"cancelled\", \"task cancelled\");\n return;\n }\n const message = error instanceof Error ? error.message : String(error);\n await context.log(\"stderr\", message, \"run-adapter\");\n await updateStatus(config, runId, \"failed\", message);\n } finally {\n clearInterval(cancelInterval);\n if (inputInterval !== undefined) {\n clearInterval(inputInterval);\n }\n kill();\n }\n}\n\nasync function main(): Promise<void> {\n const config = loadNodeConfig();\n const register = await workplaneFetch<{ id: string }>(config.serverUrl, \"/nodes/register\", {\n method: \"POST\",\n body: {\n name: config.nodeName,\n capabilities: config.nodeCapabilities,\n nodeId: config.nodeId,\n },\n ...nodeHttpOptions(config),\n });\n const nodeId = register.id;\n process.stdout.write(`node registered: ${nodeId}\\n`);\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n try {\n const poll = await workplaneFetch<{ assignment: Assignment | null }>(\n config.serverUrl,\n `/nodes/${nodeId}/poll`,\n {\n method: \"POST\",\n body: {\n capabilities: config.nodeCapabilities,\n },\n ...nodeHttpOptions(config),\n },\n );\n\n if (poll.assignment) {\n await executeAssignment(config, poll.assignment);\n }\n } catch (error) {\n process.stderr.write(`poll error: ${String(error)}\\n`);\n }\n\n await new Promise((resolvePromise) => setTimeout(resolvePromise, config.pollIntervalMs));\n }\n}\n\nmain().catch((error) => {\n process.stderr.write(`${String(error)}\\n`);\n process.exit(1);\n});\n","import { z } from \"zod\";\nimport { loadLocalEnv } from \"./env.js\";\n\nloadLocalEnv();\n\nconst serverEnvSchema = z.object({\n DATABASE_URL: z.string().min(1),\n WORKPLANE_SERVER_PORT: z\n .string()\n .optional()\n .default(\"8787\")\n .transform((value) => Number.parseInt(value, 10)),\n WORKPLANE_NODE_TOKEN: z.string().optional(),\n WORKPLANE_OPERATOR_TOKEN: z.string().optional(),\n WORKPLANE_ENV_ALLOWLIST: z.string().optional(),\n});\n\nconst nodeEnvSchema = z.object({\n WORKPLANE_SERVER_URL: z.string().url().optional().default(\"http://localhost:8787\"),\n WORKPLANE_NODE_NAME: z.string().optional().default(\"local-node-1\"),\n WORKPLANE_NODE_ID: z.string().optional(),\n WORKPLANE_NODE_CAPABILITIES: z\n .string()\n .optional()\n .default(\"shell,git,node,typescript,aider,ollama,codex,claude-code\"),\n WORKPLANE_NODE_TOKEN: z.string().optional(),\n WORKPLANE_POLL_INTERVAL_MS: z\n .string()\n .optional()\n .default(\"3000\")\n .transform((value) => Number.parseInt(value, 10)),\n WORKPLANE_ENV_ALLOWLIST: z.string().optional(),\n});\n\nexport interface ServerConfig {\n databaseUrl: string;\n port: number;\n nodeToken?: string;\n operatorToken?: string;\n envAllowlist: string[];\n}\n\nexport interface NodeConfig {\n serverUrl: string;\n nodeName: string;\n nodeId?: string;\n nodeCapabilities: string[];\n nodeToken?: string;\n pollIntervalMs: number;\n envAllowlist: string[];\n}\n\nexport function loadServerConfig(env: NodeJS.ProcessEnv = process.env): ServerConfig {\n const parsed = serverEnvSchema.parse(env);\n\n return {\n databaseUrl: parsed.DATABASE_URL,\n port: parsed.WORKPLANE_SERVER_PORT,\n nodeToken: parsed.WORKPLANE_NODE_TOKEN,\n operatorToken: parsed.WORKPLANE_OPERATOR_TOKEN,\n envAllowlist: parseCsv(parsed.WORKPLANE_ENV_ALLOWLIST ?? \"\"),\n };\n}\n\nexport function loadNodeConfig(env: NodeJS.ProcessEnv = process.env): NodeConfig {\n const parsed = nodeEnvSchema.parse(env);\n\n return {\n serverUrl: parsed.WORKPLANE_SERVER_URL,\n nodeName: parsed.WORKPLANE_NODE_NAME,\n nodeId: parsed.WORKPLANE_NODE_ID,\n nodeCapabilities: parseCsv(parsed.WORKPLANE_NODE_CAPABILITIES),\n nodeToken: parsed.WORKPLANE_NODE_TOKEN,\n pollIntervalMs: parsed.WORKPLANE_POLL_INTERVAL_MS,\n envAllowlist: parseCsv(parsed.WORKPLANE_ENV_ALLOWLIST ?? \"\"),\n };\n}\n\nexport function parseCsv(value: string): string[] {\n return value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n","import { config as dotenvConfig } from \"dotenv\";\n\nlet envLoaded = false;\n\nexport function loadLocalEnv(): void {\n if (envLoaded) {\n return;\n }\n\n dotenvConfig({ path: \".env\" });\n dotenvConfig({ path: \".env.local\", override: true });\n\n envLoaded = true;\n}\n\n","import type { IncomingMessage } from \"node:http\";\n\nexport function parseBearerToken(authorizationHeader: string | undefined): string | undefined {\n if (!authorizationHeader) {\n return undefined;\n }\n const match = /^Bearer\\s+(.+)$/i.exec(authorizationHeader.trim());\n return match?.[1];\n}\n\nexport function isAuthorizedBearer(provided: string | undefined, expected: string | undefined): boolean {\n if (!expected) {\n return true;\n }\n if (!provided) {\n return false;\n }\n return provided === expected;\n}\n\nexport function getRequestBearer(req: IncomingMessage): string | undefined {\n const header = req.headers.authorization;\n const value = Array.isArray(header) ? header[0] : header;\n return parseBearerToken(value);\n}\n\nexport function authHeaders(token: string | undefined): Record<string, string> {\n if (!token) {\n return {};\n }\n return { authorization: `Bearer ${token}` };\n}\n","import { authHeaders } from \"./auth.js\";\n\nexport interface WorkplaneHttpOptions {\n method?: string;\n body?: unknown;\n nodeToken?: string;\n operatorToken?: string;\n}\n\nexport function buildWorkplaneHeaders(options: WorkplaneHttpOptions = {}): Record<string, string> {\n const token = options.nodeToken ?? options.operatorToken;\n return {\n \"content-type\": \"application/json\",\n ...authHeaders(token),\n };\n}\n\nexport async function workplaneFetch<T>(\n serverUrl: string,\n path: string,\n options: WorkplaneHttpOptions = {},\n): Promise<T> {\n const response = await fetch(`${serverUrl}${path}`, {\n method: options.method ?? \"GET\",\n headers: buildWorkplaneHeaders(options),\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`${response.status} ${response.statusText} from ${path}: ${text}`);\n }\n\n return (await response.json()) as T;\n}\n","import { join } from \"node:path\";\n\nexport interface GitExecContext {\n workspacePath: string;\n runId: string;\n log: (stream: \"stdout\" | \"stderr\" | \"system\", message: string, stepName?: string) => Promise<void>;\n exec: (\n command: string,\n args?: string[],\n options?: { cwd?: string },\n ) => Promise<{ exitCode: number; stdout: string; stderr: string }>;\n ensureWorkspace: (...segments: string[]) => Promise<string>;\n emitArtifact: (input: {\n type: string;\n name: string;\n path: string;\n metadata?: Record<string, unknown>;\n }) => Promise<void>;\n}\n\nexport function repoPath(workspacePath: string): string {\n return join(workspacePath, \"repo\");\n}\n\nexport async function createTaskBranch(context: GitExecContext, branchName: string): Promise<void> {\n const cwd = repoPath(context.workspacePath);\n await context.log(\"system\", `creating branch ${branchName}`, \"git-branch\");\n const checkout = await context.exec(\"git\", [\"checkout\", \"-b\", branchName], { cwd });\n if (checkout.exitCode !== 0) {\n throw new Error(`git checkout -b failed with exit code ${checkout.exitCode}`);\n }\n}\n\nexport function defaultTaskBranchName(runId: string): string {\n return `workplane/${runId}`;\n}\n\nexport async function captureGitDiff(\n context: GitExecContext,\n adapterName: string,\n artifactName = \"changes.diff\",\n): Promise<string> {\n const cwd = repoPath(context.workspacePath);\n const diffResult = await context.exec(\"git\", [\"diff\"], { cwd });\n const artifactsPath = await context.ensureWorkspace(\"artifacts\");\n const diffPath = join(artifactsPath, artifactName);\n const { writeFile } = await import(\"node:fs/promises\");\n await writeFile(diffPath, diffResult.stdout, \"utf8\");\n await context.emitArtifact({\n type: \"diff\",\n name: artifactName,\n path: diffPath,\n metadata: { adapter: adapterName },\n });\n return diffPath;\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport { mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport interface ExecResult {\n exitCode: number;\n stdout: string;\n stderr: string;\n}\n\nexport interface ExecOptions {\n cwd?: string;\n env?: Record<string, string>;\n signal?: AbortSignal;\n}\n\nexport interface ArtifactInput {\n type: string;\n name: string;\n path: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface WorkContext {\n runId: string;\n taskId: string;\n workspacePath: string;\n log: (stream: \"stdout\" | \"stderr\" | \"system\", message: string, stepName?: string) => Promise<void>;\n exec: (command: string, args?: string[], options?: ExecOptions) => Promise<ExecResult>;\n ensureWorkspace: (...segments: string[]) => Promise<string>;\n emitArtifact: (input: ArtifactInput) => Promise<void>;\n envAllowlist?: string[];\n writeStdin?: (data: string) => void;\n ptyResize?: (rows: number, cols: number) => void;\n}\n\nexport interface WorkAdapter<TPayload = Record<string, unknown>> {\n name: string;\n kind: string;\n interactive?: boolean;\n terminalMode?: \"stdio\" | \"pty\";\n run: (context: WorkContext, payload: TPayload) => Promise<void>;\n}\n\nfunction pickEnv(allowlist: string[] | undefined): Record<string, string> {\n if (!allowlist || allowlist.length === 0) {\n return { ...process.env } as Record<string, string>;\n }\n const picked: Record<string, string> = {};\n for (const key of allowlist) {\n const value = process.env[key];\n if (value !== undefined) {\n picked[key] = value;\n }\n }\n picked.PATH = process.env.PATH ?? \"\";\n picked.HOME = process.env.HOME ?? \"\";\n return picked;\n}\n\nexport function createExec(context: WorkContext): WorkContext[\"exec\"] {\n return async (command: string, args: string[] = [], options: ExecOptions = {}) =>\n new Promise<ExecResult>((resolve) => {\n let childError: Error | undefined;\n const child = spawn(command, args, {\n cwd: options.cwd ?? context.workspacePath,\n env: {\n ...pickEnv(context.envAllowlist),\n ...(options.env ?? {}),\n },\n signal: options.signal,\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout.on(\"data\", (chunk) => {\n const text = chunk.toString();\n stdout += text;\n void context.log(\"stdout\", text);\n });\n\n child.stderr.on(\"data\", (chunk) => {\n const text = chunk.toString();\n stderr += text;\n void context.log(\"stderr\", text);\n });\n\n child.on(\"error\", (error) => {\n childError = error;\n });\n\n child.on(\"close\", (exitCode, signal) => {\n if (signal === \"SIGTERM\" || signal === \"SIGKILL\") {\n resolve({\n exitCode: exitCode ?? 1,\n stdout,\n stderr: `${stderr}\\nprocess terminated (${signal})`.trim(),\n });\n return;\n }\n resolve({\n exitCode: exitCode ?? 1,\n stdout,\n stderr: childError ? `${stderr}\\n${childError.message}`.trim() : stderr,\n });\n });\n });\n}\n\nexport function createCancellableExec(context: WorkContext): {\n exec: WorkContext[\"exec\"];\n kill: (signal?: NodeJS.Signals) => void;\n writeStdin: (data: string) => void;\n} {\n let activeChild: ChildProcess | undefined;\n\n const exec: WorkContext[\"exec\"] = async (command, args = [], options = {}) =>\n new Promise<ExecResult>((resolve) => {\n let childError: Error | undefined;\n const child = spawn(command, args, {\n cwd: options.cwd ?? context.workspacePath,\n env: {\n ...pickEnv(context.envAllowlist),\n ...(options.env ?? {}),\n },\n signal: options.signal,\n });\n activeChild = child;\n\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout.on(\"data\", (chunk) => {\n const text = chunk.toString();\n stdout += text;\n void context.log(\"stdout\", text);\n });\n\n child.stderr.on(\"data\", (chunk) => {\n const text = chunk.toString();\n stderr += text;\n void context.log(\"stderr\", text);\n });\n\n child.on(\"error\", (error) => {\n childError = error;\n });\n\n child.on(\"close\", (exitCode, signal) => {\n if (activeChild === child) {\n activeChild = undefined;\n }\n if (signal === \"SIGTERM\" || signal === \"SIGKILL\") {\n resolve({\n exitCode: exitCode ?? 1,\n stdout,\n stderr: `${stderr}\\nprocess terminated (${signal})`.trim(),\n });\n return;\n }\n resolve({\n exitCode: exitCode ?? 1,\n stdout,\n stderr: childError ? `${stderr}\\n${childError.message}`.trim() : stderr,\n });\n });\n });\n\n const kill = (signal: NodeJS.Signals = \"SIGTERM\"): void => {\n if (!activeChild || activeChild.killed) return;\n activeChild.kill(signal);\n if (signal === \"SIGTERM\") {\n const escalation = setTimeout(() => {\n if (activeChild && !activeChild.killed) {\n activeChild.kill(\"SIGKILL\");\n }\n }, 5000);\n escalation.unref();\n }\n };\n\n const writeStdin = (data: string): void => {\n if (activeChild && !activeChild.killed && activeChild.stdin && !activeChild.stdin.destroyed) {\n activeChild.stdin.write(data);\n }\n };\n\n return { exec, kill, writeStdin };\n}\n\nexport async function ensureWorkspacePath(workspacePath: string, ...segments: string[]): Promise<string> {\n const fullPath = join(workspacePath, ...segments);\n await mkdir(fullPath, { recursive: true });\n return fullPath;\n}\n","import * as pty from \"node-pty\";\nimport type { WorkContext } from \"../../adapter-sdk/src/index.js\";\nimport { pickNodeEnv } from \"./env.js\";\n\n// Covers CSI (colors, cursor), OSC (window title), and simple ESC sequences.\nconst ANSI_RE = /\\x1b(?:[@-Z\\\\-_]|\\[[0-9;?]*[ -/]*[@-~]|\\][^\\x07\\x1b]*(?:\\x07|\\x1b\\\\))/g;\n\nfunction stripAnsi(text: string): string {\n return text.replace(ANSI_RE, \"\");\n}\n\nexport function createPtyExec(context: WorkContext): {\n exec: WorkContext[\"exec\"];\n kill: (signal?: NodeJS.Signals) => void;\n writeStdin: (data: string) => void;\n ptyResize: (rows: number, cols: number) => void;\n} {\n let activePty: pty.IPty | undefined;\n let killTimer: ReturnType<typeof setTimeout> | undefined;\n\n const exec: WorkContext[\"exec\"] = async (command, args = [], options = {}) =>\n new Promise((resolve) => {\n const env = {\n ...pickNodeEnv(context.envAllowlist),\n ...(options.env ?? {}),\n TERM: \"xterm-256color\",\n };\n\n const terminal = pty.spawn(command, args, {\n cwd: options.cwd ?? context.workspacePath,\n env,\n cols: 220,\n rows: 50,\n });\n activePty = terminal;\n\n let output = \"\";\n\n terminal.onData((chunk) => {\n const stripped = stripAnsi(chunk);\n output += stripped;\n void context.log(\"stdout\", stripped);\n });\n\n terminal.onExit(({ exitCode, signal: exitSignal }) => {\n activePty = undefined;\n if (killTimer !== undefined) {\n clearTimeout(killTimer);\n killTimer = undefined;\n }\n const terminated = exitSignal !== undefined && exitSignal !== 0;\n resolve({\n exitCode: terminated ? 1 : (exitCode ?? 0),\n stdout: output,\n stderr: terminated ? `process terminated (signal ${exitSignal})` : \"\",\n });\n });\n });\n\n const kill = (signal: NodeJS.Signals = \"SIGTERM\"): void => {\n if (!activePty) return;\n activePty.kill(signal);\n if (signal === \"SIGTERM\" && killTimer === undefined) {\n killTimer = setTimeout(() => {\n if (activePty) {\n activePty.kill(\"SIGKILL\");\n activePty = undefined;\n }\n killTimer = undefined;\n }, 5000);\n }\n };\n\n const writeStdin = (data: string): void => {\n if (activePty) {\n activePty.write(data);\n }\n };\n\n const ptyResize = (rows: number, cols: number): void => {\n if (activePty) {\n activePty.resize(cols, rows);\n }\n };\n\n return { exec, kill, writeStdin, ptyResize };\n}\n","export function pickNodeEnv(allowlist: string[] | undefined): Record<string, string> {\n if (!allowlist || allowlist.length === 0) {\n return { ...process.env } as Record<string, string>;\n }\n const picked: Record<string, string> = {};\n for (const key of allowlist) {\n const value = process.env[key];\n if (value !== undefined) {\n picked[key] = value;\n }\n }\n picked.PATH = process.env.PATH ?? \"\";\n picked.HOME = process.env.HOME ?? \"\";\n return picked;\n}\n","import type { WorkAdapter } from \"@workplane/adapter-sdk\";\nimport { join } from \"node:path\";\nimport { writeFile } from \"node:fs/promises\";\n\ninterface ShellPayload {\n command: string;\n args?: string[];\n cwd?: string;\n}\n\nexport const shellAdapter: WorkAdapter<ShellPayload> = {\n name: \"shell\",\n kind: \"shell.exec\",\n async run(context, payload) {\n const renderedCommand = payload.args && payload.args.length > 0 ? `${payload.command} ${payload.args.join(\" \")}` : payload.command;\n const commandCwd = payload.cwd\n ? payload.cwd.startsWith(\"/\")\n ? payload.cwd\n : join(context.workspacePath, payload.cwd)\n : context.workspacePath;\n const result = await context.exec(\"/bin/sh\", [\"-lc\", renderedCommand], { cwd: commandCwd });\n const artifactsDir = await context.ensureWorkspace(\"artifacts\");\n const resultPath = join(artifactsDir, \"shell-result.json\");\n await writeFile(\n resultPath,\n JSON.stringify(\n {\n command: renderedCommand,\n cwd: commandCwd,\n exitCode: result.exitCode,\n },\n null,\n 2,\n ),\n \"utf8\",\n );\n await context.emitArtifact({\n type: \"shell.result\",\n name: \"shell-result.json\",\n path: resultPath,\n metadata: { exitCode: result.exitCode },\n });\n if (result.exitCode !== 0) {\n throw new Error(`shell command failed with exit code ${result.exitCode}`);\n }\n },\n};\n","import {\n captureGitDiff,\n createTaskBranch,\n defaultTaskBranchName,\n repoPath,\n type GitExecContext,\n} from \"@workplane/core\";\nimport type { WorkAdapter } from \"@workplane/adapter-sdk\";\n\ninterface AiderPayload {\n prompt: string;\n model?: string;\n testCommand?: string;\n}\n\nexport const aiderAdapter: WorkAdapter<AiderPayload> = {\n name: \"aider\",\n kind: \"agent.run\",\n async run(context, payload) {\n const cwd = repoPath(context.workspacePath);\n await createTaskBranch(context as GitExecContext, defaultTaskBranchName(context.runId));\n\n const args = [\"--yes\", \"--message\", payload.prompt];\n if (payload.model) {\n args.unshift(\"--model\", payload.model);\n }\n\n const result = await context.exec(\"aider\", args, { cwd });\n if (result.exitCode !== 0) {\n throw new Error(`aider failed with exit code ${result.exitCode}`);\n }\n\n await captureGitDiff(context as GitExecContext, \"aider\");\n\n if (payload.testCommand) {\n await context.log(\"system\", `running test command: ${payload.testCommand}`, \"run-tests\");\n const testResult = await context.exec(\"/bin/sh\", [\"-lc\", payload.testCommand], { cwd });\n if (testResult.exitCode !== 0) {\n throw new Error(`test command failed with exit code ${testResult.exitCode}`);\n }\n }\n },\n};\n","import { writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { WorkAdapter } from \"@workplane/adapter-sdk\";\n\nexport interface OllamaPayload {\n model: string;\n prompt: string;\n inputFile?: string;\n}\n\nexport const ollamaAdapter: WorkAdapter<OllamaPayload> = {\n name: \"ollama\",\n kind: \"inference.batch\",\n async run(context, payload) {\n const args = [\"run\", payload.model, payload.prompt];\n const result = await context.exec(\"ollama\", args, { cwd: context.workspacePath });\n if (result.exitCode !== 0) {\n throw new Error(`ollama failed with exit code ${result.exitCode}`);\n }\n\n const artifactsPath = await context.ensureWorkspace(\"artifacts\");\n const outputPath = join(artifactsPath, \"inference-output.txt\");\n const output = `${result.stdout}${result.stderr}`.trim();\n await writeFile(outputPath, output, \"utf8\");\n await context.emitArtifact({\n type: \"inference.output\",\n name: \"inference-output.txt\",\n path: outputPath,\n metadata: { model: payload.model, adapter: \"ollama\" },\n });\n\n if (payload.inputFile) {\n await context.log(\"system\", `inputFile ${payload.inputFile} noted (batch file expansion not implemented)`, \"inference\");\n }\n },\n};\n","import { join } from \"node:path\";\nimport {\n captureGitDiff,\n createTaskBranch,\n defaultTaskBranchName,\n repoPath,\n type GitExecContext,\n} from \"@workplane/core\";\nimport type { WorkAdapter } from \"@workplane/adapter-sdk\";\n\nexport interface HarnessPayload {\n prompt: string;\n model?: string;\n testCommand?: string;\n branch?: string;\n taskBranch?: string;\n extraArgs?: string[];\n interactive?: boolean;\n}\n\nexport interface HarnessAdapterOptions {\n name: string;\n kind: string;\n binary: string | (() => string);\n interactive?: boolean;\n terminalMode?: \"stdio\" | \"pty\";\n defaultArgs?: string[];\n buildArgs?: (payload: HarnessPayload) => string[];\n buildInteractiveArgs?: (payload: HarnessPayload) => string[];\n}\n\nfunction resolveBinary(binary: string | (() => string)): string {\n return typeof binary === \"function\" ? binary() : binary;\n}\n\nexport function createHarnessAdapter(options: HarnessAdapterOptions): WorkAdapter<HarnessPayload> {\n return {\n name: options.name,\n kind: options.kind,\n interactive: options.interactive,\n terminalMode: options.terminalMode,\n async run(context, payload) {\n const cwd = repoPath(context.workspacePath);\n const branchName = payload.taskBranch ?? defaultTaskBranchName(context.runId);\n await createTaskBranch(context as GitExecContext, branchName);\n\n const binary = resolveBinary(options.binary);\n\n if (payload.interactive && options.buildInteractiveArgs) {\n const interactiveArgs = options.buildInteractiveArgs(payload);\n const execPromise = context.exec(binary, interactiveArgs, { cwd });\n await new Promise<void>((resolve) => setTimeout(resolve, 300));\n context.writeStdin?.(payload.prompt + \"\\n\");\n const result = await execPromise;\n if (result.exitCode !== 0) {\n throw new Error(`${binary} failed with exit code ${result.exitCode}`);\n }\n await captureGitDiff(context as GitExecContext, options.name);\n return;\n }\n\n const extra = payload.extraArgs ?? options.defaultArgs ?? [];\n const promptArgs = options.buildArgs ? options.buildArgs(payload) : [...extra, payload.prompt];\n const result = await context.exec(binary, promptArgs, { cwd });\n if (result.exitCode !== 0) {\n throw new Error(`${binary} failed with exit code ${result.exitCode}`);\n }\n\n await captureGitDiff(context as GitExecContext, options.name);\n\n if (payload.testCommand) {\n await context.log(\"system\", `running test command: ${payload.testCommand}`, \"run-tests\");\n const testResult = await context.exec(\"/bin/sh\", [\"-lc\", payload.testCommand], { cwd });\n const testArtifactPath = join(await context.ensureWorkspace(\"artifacts\"), \"test-output.txt\");\n const { writeFile } = await import(\"node:fs/promises\");\n await writeFile(testArtifactPath, `${testResult.stdout}\\n${testResult.stderr}`, \"utf8\");\n await context.emitArtifact({\n type: \"test.output\",\n name: \"test-output.txt\",\n path: testArtifactPath,\n metadata: { exitCode: testResult.exitCode },\n });\n if (testResult.exitCode !== 0) {\n throw new Error(`test command failed with exit code ${testResult.exitCode}`);\n }\n }\n },\n };\n}\n\nexport { captureGitDiff, createTaskBranch, defaultTaskBranchName, repoPath };\n","import { createHarnessAdapter } from \"@workplane/adapter-harness\";\n\nexport const codexAdapter = createHarnessAdapter({\n name: \"codex\",\n kind: \"agent.run\",\n interactive: true,\n terminalMode: \"stdio\",\n binary: () => process.env.WORKPLANE_CODEX_BIN ?? \"codex\",\n buildArgs: (payload) => {\n const args = [...(payload.extraArgs ?? [\"--approval-mode\", \"full-auto\"])];\n if (payload.model) {\n args.push(\"--model\", payload.model);\n }\n args.push(payload.prompt);\n return args;\n },\n buildInteractiveArgs: (payload) => {\n const args: string[] = [...(payload.extraArgs ?? [])];\n if (payload.model) {\n args.push(\"--model\", payload.model);\n }\n return args;\n },\n});\n","import { createHarnessAdapter } from \"@workplane/adapter-harness\";\n\nexport const claudeCodeAdapter = createHarnessAdapter({\n name: \"claude-code\",\n kind: \"agent.run\",\n interactive: true,\n terminalMode: \"pty\",\n binary: () => process.env.WORKPLANE_CLAUDE_CODE_BIN ?? \"claude\",\n buildArgs: (payload) => {\n const args = [\"-p\", payload.prompt, \"--output-format\", \"text\"];\n if (payload.model) {\n args.push(\"--model\", payload.model);\n }\n return [...args, ...(payload.extraArgs ?? [])];\n },\n buildInteractiveArgs: (payload) => {\n const args: string[] = [];\n if (payload.model) {\n args.push(\"--model\", payload.model);\n }\n return [...args, ...(payload.extraArgs ?? [])];\n },\n});\n"],"mappings":"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","names":["mkdir","writeFile","join","writeFile","join","resolve","join","resolve","join","writeFile","join","join","resolve","result","join","writeFile","join","mkdir","writeFile"]}
|