workplane 0.3.1 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/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 \"@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"]}
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().optional().default(\"sqlite://~/.workplane/workplane.db\"),\n WORKPLANE_SERVER_PORT: z\n .string()\n .optional()\n .default(\"8787\")\n .transform((value) => Number.parseInt(value, 10)),\n WORKPLANE_NODE_TOKEN: z.string().optional(),\n WORKPLANE_OPERATOR_TOKEN: z.string().optional(),\n WORKPLANE_ENV_ALLOWLIST: z.string().optional(),\n});\n\nconst nodeEnvSchema = z.object({\n WORKPLANE_SERVER_URL: z.string().url().optional().default(\"http://localhost:8787\"),\n WORKPLANE_NODE_NAME: z.string().optional().default(\"local-node-1\"),\n WORKPLANE_NODE_ID: z.string().optional(),\n WORKPLANE_NODE_CAPABILITIES: z\n .string()\n .optional()\n .default(\"shell,git,node,typescript,aider,ollama,codex,claude-code\"),\n WORKPLANE_NODE_TOKEN: z.string().optional(),\n WORKPLANE_POLL_INTERVAL_MS: z\n .string()\n .optional()\n .default(\"3000\")\n .transform((value) => Number.parseInt(value, 10)),\n WORKPLANE_ENV_ALLOWLIST: z.string().optional(),\n});\n\nexport interface ServerConfig {\n databaseUrl: string;\n port: number;\n nodeToken?: string;\n operatorToken?: string;\n envAllowlist: string[];\n}\n\nexport interface NodeConfig {\n serverUrl: string;\n nodeName: string;\n nodeId?: string;\n nodeCapabilities: string[];\n nodeToken?: string;\n pollIntervalMs: number;\n envAllowlist: string[];\n}\n\nexport function loadServerConfig(env: NodeJS.ProcessEnv = process.env): ServerConfig {\n const parsed = serverEnvSchema.parse(env);\n\n return {\n databaseUrl: parsed.DATABASE_URL,\n port: parsed.WORKPLANE_SERVER_PORT,\n nodeToken: parsed.WORKPLANE_NODE_TOKEN,\n operatorToken: parsed.WORKPLANE_OPERATOR_TOKEN,\n envAllowlist: parseCsv(parsed.WORKPLANE_ENV_ALLOWLIST ?? \"\"),\n };\n}\n\nexport function loadNodeConfig(env: NodeJS.ProcessEnv = process.env): NodeConfig {\n const parsed = nodeEnvSchema.parse(env);\n\n return {\n serverUrl: parsed.WORKPLANE_SERVER_URL,\n nodeName: parsed.WORKPLANE_NODE_NAME,\n nodeId: parsed.WORKPLANE_NODE_ID,\n nodeCapabilities: parseCsv(parsed.WORKPLANE_NODE_CAPABILITIES),\n nodeToken: parsed.WORKPLANE_NODE_TOKEN,\n pollIntervalMs: parsed.WORKPLANE_POLL_INTERVAL_MS,\n envAllowlist: parseCsv(parsed.WORKPLANE_ENV_ALLOWLIST ?? \"\"),\n };\n}\n\nexport function parseCsv(value: string): string[] {\n return value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n","import { config as dotenvConfig } from \"dotenv\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nlet envLoaded = false;\n\n// Load order (highest priority first, all with override:false so shell env vars win):\n// 1. .env.local — project-local overrides (gitignored)\n// 2. ~/.workplane/.env — user global config written by workplane-setup\n// 3. .env — project defaults (committed)\nexport function loadLocalEnv(): void {\n if (envLoaded) {\n return;\n }\n\n dotenvConfig({ path: \".env.local\" });\n dotenvConfig({ path: join(homedir(), \".workplane\", \".env\") });\n dotenvConfig({ path: \".env\" });\n\n envLoaded = true;\n}\n","import 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","join","writeFile","join","resolve","join","resolve","join","writeFile","join","join","resolve","result","join","writeFile","join","mkdir","writeFile"]}
@@ -0,0 +1,74 @@
1
+ CREATE TABLE IF NOT EXISTS tasks (
2
+ id TEXT PRIMARY KEY,
3
+ kind TEXT NOT NULL,
4
+ adapter TEXT NOT NULL,
5
+ payload TEXT NOT NULL DEFAULT '{}',
6
+ requires TEXT NOT NULL DEFAULT '[]',
7
+ status TEXT NOT NULL,
8
+ created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
9
+ updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
10
+ );
11
+
12
+ CREATE INDEX IF NOT EXISTS idx_tasks_status_created_at ON tasks (status, created_at);
13
+
14
+ CREATE TABLE IF NOT EXISTS nodes (
15
+ id TEXT PRIMARY KEY,
16
+ name TEXT NOT NULL,
17
+ capabilities TEXT NOT NULL DEFAULT '[]',
18
+ status TEXT NOT NULL DEFAULT 'online',
19
+ last_heartbeat_at TEXT,
20
+ created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
21
+ updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
22
+ );
23
+
24
+ CREATE TABLE IF NOT EXISTS runs (
25
+ id TEXT PRIMARY KEY,
26
+ task_id TEXT NOT NULL REFERENCES tasks(id),
27
+ node_id TEXT NOT NULL REFERENCES nodes(id),
28
+ attempt INTEGER NOT NULL,
29
+ status TEXT NOT NULL,
30
+ started_at TEXT,
31
+ ended_at TEXT,
32
+ error TEXT,
33
+ created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
34
+ updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
35
+ );
36
+
37
+ CREATE INDEX IF NOT EXISTS idx_runs_task_id ON runs (task_id);
38
+ CREATE INDEX IF NOT EXISTS idx_runs_node_id ON runs (node_id);
39
+
40
+ CREATE TABLE IF NOT EXISTS run_logs (
41
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
42
+ run_id TEXT NOT NULL REFERENCES runs(id),
43
+ step_name TEXT,
44
+ stream TEXT NOT NULL,
45
+ message TEXT NOT NULL,
46
+ timestamp TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
47
+ );
48
+
49
+ CREATE INDEX IF NOT EXISTS idx_run_logs_run_id_timestamp ON run_logs (run_id, timestamp);
50
+
51
+ CREATE TABLE IF NOT EXISTS artifacts (
52
+ id TEXT PRIMARY KEY,
53
+ run_id TEXT NOT NULL REFERENCES runs(id),
54
+ type TEXT NOT NULL,
55
+ name TEXT NOT NULL,
56
+ path TEXT NOT NULL,
57
+ metadata TEXT,
58
+ created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
59
+ );
60
+
61
+ CREATE INDEX IF NOT EXISTS idx_artifacts_run_id ON artifacts (run_id);
62
+
63
+ CREATE TABLE IF NOT EXISTS run_input_events (
64
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
65
+ run_id TEXT NOT NULL REFERENCES runs(id),
66
+ sequence INTEGER NOT NULL,
67
+ kind TEXT NOT NULL,
68
+ payload TEXT NOT NULL DEFAULT '{}',
69
+ created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
70
+ delivered_at TEXT
71
+ );
72
+
73
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_run_input_events_run_sequence ON run_input_events (run_id, sequence);
74
+ CREATE INDEX IF NOT EXISTS idx_run_input_events_undelivered ON run_input_events (run_id, sequence) WHERE delivered_at IS NULL;