@kynver-app/runtime 0.1.13 → 0.1.17

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/cli.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/cli.ts", "../src/config.ts", "../src/util.ts", "../src/callback-headers.ts", "../src/callbacks.ts", "../src/disk-gate.ts", "../src/resource-gate.ts", "../src/run-store.ts", "../src/paths.ts", "../src/heartbeat.ts", "../src/stream.ts", "../src/git.ts", "../src/status.ts", "../src/supervisor.ts", "../src/prompt.ts", "../src/providers/claude.ts", "../src/providers/cursor.ts", "../src/providers/registry.ts", "../src/dispatch.ts", "../src/sweep.ts", "../src/worktree.ts", "../src/validate.ts", "../src/worker-ops.ts", "../src/pipeline-tick.ts", "../src/finalize.ts", "../src/plan-progress-daemon-sync.ts", "../src/plan-progress-sync.ts", "../src/workspace-runtime-config.ts", "../src/daemon.ts", "../src/plan-progress.ts"],
4
- "sourcesContent": ["#!/usr/bin/env node\r\nimport { mkdirSync, realpathSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { fileURLToPath } from \"node:url\";\r\nimport { parseArgs, runLogin, runSetup, mintRunnerCredential } from \"./config.js\";\r\nimport { dispatchRun } from \"./dispatch.js\";\r\nimport { getPaths } from \"./run-store.js\";\r\nimport { startWorker } from \"./supervisor.js\";\r\nimport { sweepRun } from \"./sweep.js\";\r\nimport { createRun, listRuns } from \"./worktree.js\";\r\nimport { completeWorker, runStatus, stopWorker, tailWorker, workerStatus } from \"./worker-ops.js\";\r\nimport { runDaemon } from \"./daemon.js\";\r\nimport { emitPlanProgress, verifyPlan } from \"./plan-progress.js\";\r\n\r\nfunction isHelpFlag(arg: string): boolean {\r\n return arg === \"help\" || arg === \"--help\" || arg === \"-h\";\r\n}\r\n\r\nfunction unknownCommand(scope?: string, action?: string): never {\r\n const cmd = [scope, action].filter(Boolean).join(\" \");\r\n console.error(`unknown command: ${cmd || \"(none)\"}`);\r\n usage(1);\r\n}\r\n\r\nexport function usage(code = 0): never {\r\n const out = code === 0 ? console.log : console.error;\r\n out(\r\n [\r\n \"Usage:\",\r\n \" kynver login --api-key KEY\",\r\n \" kynver runner credential [--agent-os-id ID] [--base-url URL]\",\r\n \" kynver setup [--api-base-url URL] [--agent-os-id ID] [--agent-os-slug SLUG] [--repo PATH] [--max-workers N] [--provider claude|cursor]\",\r\n \" kynver daemon --run RUN_ID --agent-os-id AOS_ID [--execute] [--interval-ms MS]\",\r\n \" kynver run create --repo /path/repo [--name name] [--base origin/main]\",\r\n \" kynver run list\",\r\n \" kynver run status --run RUN_ID\",\r\n \" kynver run dispatch --run RUN_ID --agent-os-id AOS_ID [--base-url URL] [--secret SECRET] [--execute] [--lane any|implementation|review|landing] [--max-starts 1] [--lease-ms MS] [--owned path[,path]] [--model claude-opus-4-7] [--disk-path /]\",\r\n \" kynver run sweep --run RUN_ID --agent-os-id AOS_ID [--base-url URL] [--secret SECRET] [--grace-ms MS]\",\r\n \" kynver worker start --run RUN_ID --name worker --task \\\"...\\\" [--owned path[,path]] [--model MODEL] [--provider claude|cursor] [--agent-os-id AOS_ID] [--task-id TASK_ID]\",\r\n \" kynver worker status --run RUN_ID --name worker\",\r\n \" kynver worker tail --run RUN_ID --name worker [--lines 40] [--raw]\",\r\n \" kynver worker stop --run RUN_ID --name worker\",\r\n \" kynver worker complete --run RUN_ID --name worker [--agent-os-id AOS_ID] [--task-id TASK_ID] [--base-url URL] [--secret SECRET]\",\r\n \" kynver plan progress --plan PLAN_ID --row ROW_KEY --role ROLE --status STATUS [--task TASK_ID] [--note NOTE] [--evidence type:value] [--agent-os-id AOS_ID]\",\r\n \" kynver plan verify --plan PLAN_ID [--worktree PATH] [--task TASK_ID] [--human-override]\",\r\n ].join(\"\\n\"),\r\n );\r\n process.exit(code);\r\n}\r\n\r\nexport async function main(argv = process.argv.slice(2)): Promise<void> {\r\n if (argv.length === 0 || isHelpFlag(argv[0]!)) return usage(0);\r\n\r\n const scope = argv.shift();\r\n let action: string | undefined;\r\n let rest: string[];\r\n\r\n if (scope === \"run\" || scope === \"worker\" || scope === \"plan\" || scope === \"runner\") {\r\n action = argv.shift();\r\n rest = argv;\r\n } else {\r\n rest = argv;\r\n }\r\n\r\n if ((action && isHelpFlag(action)) || rest.some(isHelpFlag)) return usage(0);\r\n\r\n const args = parseArgs(rest);\r\n const { runsDir, worktreesDir } = getPaths();\r\n mkdirSync(runsDir, { recursive: true });\r\n mkdirSync(worktreesDir, { recursive: true });\r\n\r\n if (scope === \"login\") return void (await runLogin(args));\r\n if (scope === \"runner\" && action === \"credential\") return void (await mintRunnerCredential(args));\r\n if (scope === \"setup\") return void (await runSetup(args));\r\n if (scope === \"daemon\") return void (await runDaemon(args));\r\n if (scope === \"plan\" && action === \"progress\") return void (await emitPlanProgress(args));\r\n if (scope === \"plan\" && action === \"verify\") return void (await verifyPlan(args));\r\n\r\n if (scope === \"run\" && action === \"create\") return createRun(args);\r\n if (scope === \"run\" && action === \"list\") return listRuns();\r\n if (scope === \"run\" && action === \"status\") return runStatus(args);\r\n if (scope === \"run\" && action === \"dispatch\") return void (await dispatchRun(args));\r\n if (scope === \"run\" && action === \"sweep\") return void (await sweepRun(args));\r\n if (scope === \"worker\" && action === \"start\") return startWorker(args);\r\n if (scope === \"worker\" && action === \"status\") return workerStatus(args);\r\n if (scope === \"worker\" && action === \"tail\") return tailWorker(args);\r\n if (scope === \"worker\" && action === \"stop\") return stopWorker(args);\r\n if (scope === \"worker\" && action === \"complete\") return void (await completeWorker(args));\r\n\r\n unknownCommand(scope, action);\r\n}\r\n\r\nconst isCliEntry =\r\n process.argv[1] &&\r\n realpathSync.native(process.argv[1]) === realpathSync.native(fileURLToPath(import.meta.url));\r\n\r\nif (isCliEntry) {\r\n void main().catch((error) => {\r\n console.error(error);\r\n process.exit(1);\r\n });\r\n}\r\n", "import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport { trimTrailingSlash } from \"./util.js\";\r\n\r\nexport interface KynverUserConfig {\r\n apiBaseUrl?: string;\r\n agentOsSlug?: string;\r\n agentOsId?: string;\r\n defaultRepo?: string;\r\n workerProvider?: string;\r\n harnessRoot?: string;\r\n /** Max concurrent workers on this machine. Omit to auto-size from RAM. */\r\n maxConcurrentWorkers?: number;\r\n /** @internal Advanced tuning \u2014 not required for setup. */\r\n perWorkerMemBytes?: number;\r\n /** @internal Advanced tuning \u2014 not required for setup. */\r\n memReserveBytes?: number;\r\n /** @internal Advanced tuning \u2014 not required for setup. */\r\n memUtilization?: number;\r\n}\r\n\r\nconst CONFIG_DIR = path.join(homedir(), \".kynver\");\r\nconst CONFIG_FILE = path.join(CONFIG_DIR, \"config.json\");\r\nconst CREDENTIALS_FILE = path.join(CONFIG_DIR, \"credentials\");\r\n\r\ninterface KynverCredentialsFile {\r\n apiKey?: string;\r\n /** Scoped `krc1.*` runner token for AgentOS by-id callbacks. */\r\n runnerToken?: string;\r\n runnerTokenAgentOsId?: string;\r\n}\r\n\r\nexport function loadUserConfig(): KynverUserConfig {\r\n if (!existsSync(CONFIG_FILE)) return {};\r\n try {\r\n return JSON.parse(readFileSync(CONFIG_FILE, \"utf8\")) as KynverUserConfig;\r\n } catch {\r\n return {};\r\n }\r\n}\r\n\r\nexport function saveUserConfig(config: KynverUserConfig): void {\r\n mkdirSync(CONFIG_DIR, { recursive: true });\r\n writeFileSync(CONFIG_FILE, `${JSON.stringify(config, null, 2)}\\n`, { mode: 0o600 });\r\n}\r\n\r\nfunction loadCredentialsFile(): KynverCredentialsFile {\r\n if (!existsSync(CREDENTIALS_FILE)) return {};\r\n try {\r\n return JSON.parse(readFileSync(CREDENTIALS_FILE, \"utf8\")) as KynverCredentialsFile;\r\n } catch {\r\n return {};\r\n }\r\n}\r\n\r\nfunction saveCredentialsFile(parsed: KynverCredentialsFile): void {\r\n mkdirSync(CONFIG_DIR, { recursive: true });\r\n writeFileSync(CREDENTIALS_FILE, `${JSON.stringify(parsed, null, 2)}\\n`, { mode: 0o600 });\r\n}\r\n\r\nexport function loadApiKey(): string | undefined {\r\n if (process.env.KYNVER_API_KEY) return process.env.KYNVER_API_KEY;\r\n return loadCredentialsFile().apiKey;\r\n}\r\n\r\nexport function saveApiKey(apiKey: string): void {\r\n saveCredentialsFile({ ...loadCredentialsFile(), apiKey });\r\n}\r\n\r\nexport function loadRunnerToken(agentOsId?: string): string | undefined {\r\n const envToken = process.env.KYNVER_RUNNER_TOKEN?.trim();\r\n if (envToken) return envToken;\r\n\r\n const creds = loadCredentialsFile();\r\n if (!creds.runnerToken) return undefined;\r\n if (agentOsId && creds.runnerTokenAgentOsId && creds.runnerTokenAgentOsId !== agentOsId) {\r\n return undefined;\r\n }\r\n return creds.runnerToken;\r\n}\r\n\r\nexport function saveRunnerToken(agentOsId: string, token: string): void {\r\n saveCredentialsFile({\r\n ...loadCredentialsFile(),\r\n runnerToken: token,\r\n runnerTokenAgentOsId: agentOsId,\r\n });\r\n}\r\n\r\nexport function resolveBaseUrl(argsBaseUrl?: string): string {\r\n const baseUrl = resolveConfiguredBaseUrl(argsBaseUrl);\r\n if (!baseUrl) failConfig(\"requires --base-url, KYNVER_API_URL, OPENCLAW_CRON_FIRE_BASE_URL, or ~/.kynver/config.json apiBaseUrl\");\r\n return baseUrl;\r\n}\r\n\r\nfunction resolveConfiguredBaseUrl(argsBaseUrl?: string): string | undefined {\r\n const baseUrl =\r\n argsBaseUrl ||\r\n process.env.KYNVER_API_URL ||\r\n process.env.OPENCLAW_CRON_FIRE_BASE_URL ||\r\n loadUserConfig().apiBaseUrl;\r\n return baseUrl ? trimTrailingSlash(String(baseUrl)) : undefined;\r\n}\r\n\r\nfunction resolveConfiguredCallbackSecret(argsSecret?: string, agentOsId?: string): string | undefined {\r\n const scoped =\r\n argsSecret ||\r\n loadRunnerToken(agentOsId) ||\r\n loadRunnerToken(loadUserConfig().agentOsId);\r\n if (scoped) return String(scoped);\r\n\r\n const globalSecret = process.env.KYNVER_RUNTIME_SECRET || process.env.OPENCLAW_CRON_SECRET;\r\n if (globalSecret) {\r\n console.warn(\r\n \"[kynver] using deployment-level callback secret; run `kynver runner credential --agent-os-id <id>` for a scoped token\",\r\n );\r\n return String(globalSecret);\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nexport function resolveCallbackSecret(argsSecret?: string, agentOsId?: string): string {\r\n const configured = resolveConfiguredCallbackSecret(argsSecret, agentOsId);\r\n if (configured) return configured;\r\n\r\n failConfig(\r\n \"requires --secret, KYNVER_RUNNER_TOKEN, a scoped runner token (`kynver runner credential`), ~/.kynver/credentials runnerToken, KYNVER_API_KEY with an API base URL to mint one, or (legacy) KYNVER_RUNTIME_SECRET / OPENCLAW_CRON_SECRET\",\r\n );\r\n}\r\n\r\nexport async function resolveCallbackSecretWithMint(\r\n argsSecret?: string,\r\n agentOsId?: string,\r\n opts?: { baseUrl?: string },\r\n): Promise<string> {\r\n const configured = resolveConfiguredCallbackSecret(argsSecret, agentOsId);\r\n if (configured) return configured;\r\n\r\n const apiKey = loadApiKey();\r\n const baseUrl = resolveConfiguredBaseUrl(opts?.baseUrl);\r\n if (apiKey && agentOsId && baseUrl) {\r\n try {\r\n const token = await fetchRunnerCredential(agentOsId, { baseUrl, apiKey });\r\n saveRunnerToken(agentOsId, token);\r\n return token;\r\n } catch (error) {\r\n failConfig(`runner credential mint failed: ${(error as Error).message}`);\r\n }\r\n }\r\n\r\n failConfig(\r\n \"requires --secret, KYNVER_RUNNER_TOKEN, a scoped runner token (`kynver runner credential`), ~/.kynver/credentials runnerToken, KYNVER_API_KEY with an API base URL to mint one, or (legacy) KYNVER_RUNTIME_SECRET / OPENCLAW_CRON_SECRET\",\r\n );\r\n}\r\n\r\nexport async function fetchRunnerCredential(\r\n agentOsId: string,\r\n opts?: { baseUrl?: string; apiKey?: string },\r\n): Promise<string> {\r\n const apiKey = opts?.apiKey || loadApiKey();\r\n if (!apiKey) throw new Error(\"API key required \u2014 run `kynver login` first\");\r\n\r\n const base = resolveBaseUrl(opts?.baseUrl);\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/runner-credentials`;\r\n const res = await fetch(url, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${apiKey}`,\r\n },\r\n body: JSON.stringify({}),\r\n });\r\n\r\n const text = await res.text();\r\n let parsed: { token?: string; error?: string } | null = null;\r\n try {\r\n parsed = JSON.parse(text) as { token?: string; error?: string };\r\n } catch {\r\n parsed = null;\r\n }\r\n if (!res.ok || !parsed?.token) {\r\n throw new Error(\r\n `runner credential mint failed (${res.status}): ${parsed?.error ?? text.slice(0, 200)}`,\r\n );\r\n }\r\n return parsed.token;\r\n}\r\n\r\nexport async function mintRunnerCredential(args: Record<string, string | boolean>): Promise<void> {\r\n const agentOsId =\r\n (args.agentOsId ? String(args.agentOsId) : loadUserConfig().agentOsId) || \"\";\r\n if (!agentOsId) failConfig(\"runner credential requires --agent-os-id or agentOsId in ~/.kynver/config.json\");\r\n\r\n try {\r\n const token = await fetchRunnerCredential(agentOsId, {\r\n baseUrl: args.baseUrl ? String(args.baseUrl) : undefined,\r\n });\r\n saveRunnerToken(agentOsId, token);\r\n console.log(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n agentOsId,\r\n credentialsPath: CREDENTIALS_FILE,\r\n tokenPrefix: `${token.slice(0, 12)}\u2026`,\r\n note: \"Scoped runner token saved; callbacks use X-Kynver-Runner-Token.\",\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n } catch (err) {\r\n console.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction failConfig(message: string): never {\r\n console.error(message);\r\n process.exit(1);\r\n}\r\n\r\nexport function parseArgs(argv: string[]): Record<string, string | boolean> {\r\n const args: Record<string, string | boolean> = {};\r\n for (let i = 0; i < argv.length; i++) {\r\n const item = argv[i];\r\n if (!item.startsWith(\"--\")) continue;\r\n const key = item.slice(2).replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\r\n const next = argv[i + 1];\r\n if (!next || next.startsWith(\"--\")) args[key] = true;\r\n else {\r\n args[key] = next;\r\n i++;\r\n }\r\n }\r\n return args;\r\n}\r\n\r\nexport async function runSetup(args: Record<string, string | boolean>): Promise<void> {\r\n const existing = loadUserConfig();\r\n const maxWorkersRaw =\r\n typeof args.maxWorkers === \"string\"\r\n ? args.maxWorkers\r\n : typeof args.maxConcurrentWorkers === \"string\"\r\n ? args.maxConcurrentWorkers\r\n : undefined;\r\n const config: KynverUserConfig = {\r\n ...existing,\r\n ...(typeof args.apiBaseUrl === \"string\" ? { apiBaseUrl: args.apiBaseUrl } : {}),\r\n ...(typeof args.agentOsSlug === \"string\" ? { agentOsSlug: args.agentOsSlug } : {}),\r\n ...(typeof args.agentOsId === \"string\" ? { agentOsId: args.agentOsId } : {}),\r\n ...(typeof args.repo === \"string\" ? { defaultRepo: args.repo } : {}),\r\n ...(typeof args.harnessRoot === \"string\" ? { harnessRoot: args.harnessRoot } : {}),\r\n ...(maxWorkersRaw ? { maxConcurrentWorkers: Math.max(1, Math.floor(Number(maxWorkersRaw))) } : {}),\r\n workerProvider: typeof args.provider === \"string\" ? args.provider : existing.workerProvider || \"claude\",\r\n };\r\n saveUserConfig(config);\r\n\r\n let runnerCredentialNote: string | undefined;\r\n const apiKey = loadApiKey();\r\n const agentOsId = config.agentOsId;\r\n if (apiKey && agentOsId) {\r\n try {\r\n const token = await fetchRunnerCredential(agentOsId, {\r\n baseUrl: typeof args.apiBaseUrl === \"string\" ? args.apiBaseUrl : config.apiBaseUrl,\r\n apiKey,\r\n });\r\n saveRunnerToken(agentOsId, token);\r\n runnerCredentialNote = \"Scoped runner token minted and saved to ~/.kynver/credentials.\";\r\n } catch {\r\n runnerCredentialNote =\r\n \"Runner token not minted (server offline or master secret unset). Run `kynver runner credential` after deploy.\";\r\n }\r\n }\r\n\r\n console.log(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n configPath: CONFIG_FILE,\r\n config,\r\n note:\r\n runnerCredentialNote ??\r\n \"Set worker limit once with --max-workers N (or omit to auto-size from RAM). Run `kynver login` + `kynver runner credential` for scoped callbacks.\",\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n}\r\n\r\nexport async function runLogin(args: Record<string, string | boolean>): Promise<void> {\r\n const apiKey = typeof args.apiKey === \"string\" ? args.apiKey : process.env.KYNVER_API_KEY;\r\n if (!apiKey) failConfig(\"kynver login requires --api-key or KYNVER_API_KEY\");\r\n saveApiKey(apiKey);\r\n console.log(JSON.stringify({ ok: true, credentialsPath: CREDENTIALS_FILE }, null, 2));\r\n}\r\n", "import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\n\r\nexport function fail(message: string): never {\r\n console.error(message);\r\n process.exit(1);\r\n}\r\n\r\nexport function required(value: string | undefined, name: string): string {\r\n if (!value) fail(`missing ${name}`);\r\n return value;\r\n}\r\n\r\nexport function safeJson(line: string): unknown {\r\n try {\r\n return JSON.parse(line);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function readJson<T>(file: string, fallback?: T): T {\r\n try {\r\n return JSON.parse(readFileSync(file, \"utf8\")) as T;\r\n } catch (error) {\r\n if (arguments.length > 1) return fallback as T;\r\n fail(`failed to read ${file}: ${(error as Error).message}`);\r\n }\r\n}\r\n\r\nexport function writeJson(file: string, value: unknown): void {\r\n mkdirSync(path.dirname(file), { recursive: true });\r\n writeFileSync(file, `${JSON.stringify(value, null, 2)}\\n`);\r\n}\r\n\r\nexport function safeSlug(value: string | undefined): string {\r\n return (\r\n String(value || \"\")\r\n .toLowerCase()\r\n .replace(/[^a-z0-9._-]+/g, \"-\")\r\n .replace(/^-+|-+$/g, \"\") || \"worker\"\r\n );\r\n}\r\n\r\nexport function timestampSlug(name: string): string {\r\n return safeSlug(`${new Date().toISOString().replace(/[-:]/g, \"\").replace(/\\..+/, \"Z\")}-${name}`);\r\n}\r\n\r\nexport function splitCsv(value: string | undefined): string[] {\r\n return value ? String(value).split(\",\").map((item) => item.trim()).filter(Boolean) : [];\r\n}\r\n\r\nexport function trimTrailingSlash(url: string): string {\r\n return String(url).replace(/\\/+$/, \"\");\r\n}\r\n\r\nexport function oneLine(value: string): string {\r\n return String(value || \"\")\r\n .replace(/\\s+/g, \" \")\r\n .trim();\r\n}\r\n\r\nexport function fileSize(file: string): number {\r\n try {\r\n return statSync(file).size;\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\nexport function fileMtime(file: string): string | null {\r\n try {\r\n return statSync(file).mtime.toISOString();\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function tailFile(file: string, lines: number): string {\r\n if (!existsSync(file)) return \"\";\r\n const data = readFileSync(file, \"utf8\");\r\n return data.split(\"\\n\").slice(-lines).join(\"\\n\");\r\n}\r\n\r\nexport function readMaybeFile(file: string | undefined): string {\r\n return file ? readFileSync(path.resolve(file), \"utf8\") : \"\";\r\n}\r\n\r\nexport function listRunIds(runsDir: string): string[] {\r\n if (!existsSync(runsDir)) return [];\r\n return readdirSync(runsDir, { withFileTypes: true })\r\n .filter((entry) => entry.isDirectory())\r\n .map((entry) => entry.name);\r\n}\r\n\r\nexport function sleepMs(ms: number): void {\r\n Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);\r\n}\r\n\r\nexport function isPidAlive(pid: number | undefined): boolean {\r\n if (!pid) return false;\r\n try {\r\n process.kill(pid, 0);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function killWorkerProcess(pid: number, signal: NodeJS.Signals): void {\r\n try {\r\n process.kill(-pid, signal);\r\n } catch {\r\n process.kill(pid, signal);\r\n }\r\n}\r\n\r\nexport function latestIso(values: Array<string | null | undefined>): string | null {\r\n let best: string | null = null;\r\n let bestMs = -Infinity;\r\n for (const value of values) {\r\n if (!value) continue;\r\n const ms = Date.parse(value);\r\n if (Number.isFinite(ms) && ms > bestMs) {\r\n bestMs = ms;\r\n best = value;\r\n }\r\n }\r\n return best;\r\n}\r\n\r\nexport function secsAgo(ms: number): number {\r\n return Math.max(0, Math.round((Date.now() - ms) / 1000));\r\n}\r\n", "/** Build callback auth headers for AgentOS by-id harness routes. */\r\nexport function buildHarnessCallbackHeaders(secret: string): Record<string, string> {\r\n const trimmed = String(secret).trim();\r\n if (trimmed.startsWith(\"krc1.\")) {\r\n return {\r\n \"Content-Type\": \"application/json\",\r\n \"X-Kynver-Runner-Token\": trimmed,\r\n };\r\n }\r\n return {\r\n \"Content-Type\": \"application/json\",\r\n \"X-OpenClaw-Cron-Secret\": trimmed,\r\n \"X-Kynver-Runtime-Secret\": trimmed,\r\n };\r\n}\r\n", "import { buildHarnessCallbackHeaders } from \"./callback-headers.js\";\r\n\r\nexport interface DispatchNextDiskGateShape {\r\n ok: boolean;\r\n path: string;\r\n freeBytes: number;\r\n totalBytes: number;\r\n usedPercent: number;\r\n warnBelowBytes: number;\r\n criticalBelowBytes: number;\r\n maxUsedPercent: number;\r\n hardMaxUsedPercent: number;\r\n reason: string | null;\r\n}\r\n\r\nexport interface DispatchNextResourceGateShape {\r\n ok: boolean;\r\n totalMemBytes: number;\r\n freeMemBytes: number;\r\n memReserveBytes: number;\r\n perWorkerMemBytes: number;\r\n configuredMaxWorkers: number | null;\r\n capacityWorkers: number;\r\n maxConcurrentWorkers: number;\r\n activeWorkers: number;\r\n slotsAvailable: number;\r\n reason: string | null;\r\n}\r\n\r\nexport interface PostJsonResult {\r\n ok: boolean;\r\n status: number;\r\n response: unknown;\r\n}\r\n\r\nexport async function postJson(url: string, secret: string, body: unknown): Promise<PostJsonResult> {\r\n const res = await fetch(url, {\r\n method: \"POST\",\r\n headers: buildHarnessCallbackHeaders(secret),\r\n body: JSON.stringify(body),\r\n });\r\n let response: unknown = null;\r\n try {\r\n response = await res.json();\r\n } catch {\r\n response = null;\r\n }\r\n return { ok: res.ok, status: res.status, response };\r\n}\r\n\r\nexport async function getJson(url: string, secret: string): Promise<PostJsonResult> {\r\n const res = await fetch(url, {\r\n method: \"GET\",\r\n headers: buildHarnessCallbackHeaders(secret),\r\n });\r\n let response: unknown = null;\r\n try {\r\n response = await res.json();\r\n } catch {\r\n response = null;\r\n }\r\n return { ok: res.ok, status: res.status, response };\r\n}\r\n", "import { statfsSync } from \"node:fs\";\r\nimport type { DispatchNextDiskGateShape } from \"./callbacks.js\";\r\n\r\nconst DEFAULT_WARN_FREE_BYTES = 30 * 1024 * 1024 * 1024;\r\nconst DEFAULT_CRITICAL_FREE_BYTES = 15 * 1024 * 1024 * 1024;\r\nconst DEFAULT_MAX_USED_PERCENT = 80;\r\nconst DEFAULT_HARD_MAX_USED_PERCENT = 90;\r\n\r\nexport interface ObserveDiskGateInput {\r\n diskPath?: string;\r\n diskFreeWarnBytes?: number;\r\n diskFreeCriticalBytes?: number;\r\n diskMaxUsedPercent?: number;\r\n diskHardMaxUsedPercent?: number;\r\n}\r\n\r\nexport function observeRunnerDiskGate(input: ObserveDiskGateInput = {}): DispatchNextDiskGateShape {\r\n const path = input.diskPath?.trim() || \"/\";\r\n const warnBelowBytes = input.diskFreeWarnBytes ?? DEFAULT_WARN_FREE_BYTES;\r\n const criticalBelowBytes = input.diskFreeCriticalBytes ?? DEFAULT_CRITICAL_FREE_BYTES;\r\n const maxUsedPercent = input.diskMaxUsedPercent ?? DEFAULT_MAX_USED_PERCENT;\r\n const hardMaxUsedPercent = input.diskHardMaxUsedPercent ?? DEFAULT_HARD_MAX_USED_PERCENT;\r\n\r\n const stats = statfsSync(path);\r\n const freeBytes = Number(stats.bavail) * Number(stats.bsize);\r\n const totalBytes = Number(stats.blocks) * Number(stats.bsize);\r\n const usedPercent = totalBytes > 0 ? ((totalBytes - freeBytes) / totalBytes) * 100 : 100;\r\n const lowFree = freeBytes < warnBelowBytes;\r\n const criticalFree = freeBytes < criticalBelowBytes;\r\n const highUse = usedPercent > maxUsedPercent;\r\n const hardHighUse = usedPercent > hardMaxUsedPercent;\r\n const ok = !lowFree && !criticalFree && !highUse && !hardHighUse;\r\n\r\n let reason: string | null = null;\r\n if (!ok) {\r\n reason = [\r\n criticalFree ? `free space below critical ${criticalBelowBytes} bytes` : null,\r\n lowFree ? `free space below warning ${warnBelowBytes} bytes` : null,\r\n hardHighUse ? `used percent above hard cap ${hardMaxUsedPercent}%` : null,\r\n highUse ? `used percent above cap ${maxUsedPercent}%` : null,\r\n ]\r\n .filter(Boolean)\r\n .join(\"; \");\r\n }\r\n\r\n return {\r\n ok,\r\n path,\r\n freeBytes,\r\n totalBytes,\r\n usedPercent,\r\n warnBelowBytes,\r\n criticalBelowBytes,\r\n maxUsedPercent,\r\n hardMaxUsedPercent,\r\n reason,\r\n };\r\n}\r\n", "import { readFileSync } from \"node:fs\";\r\nimport os from \"node:os\";\r\nimport path from \"node:path\";\r\nimport { loadUserConfig, type KynverUserConfig } from \"./config.js\";\r\nimport { listRunRecords, loadRun, runDirectory, type HarnessRunRecord } from \"./run-store.js\";\r\nimport { computeWorkerStatus } from \"./status.js\";\r\nimport { readJson, safeSlug } from \"./util.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\n\r\n/** Default RAM budget per worker (~500 MiB, dogfood measured). Internal \u2014 not a setup knob. */\r\nexport const DEFAULT_PER_WORKER_MEM_BYTES = 500 * 1024 * 1024;\r\n\r\n/** Keep headroom for OS / IDE. Internal \u2014 not a setup knob. */\r\nexport const DEFAULT_MEM_RESERVE_BYTES = 4 * 1024 * 1024 * 1024;\r\n\r\n/** Fraction of total RAM used when auto-sizing worker cap. Internal. */\r\nexport const DEFAULT_MEM_UTILIZATION = 0.85;\r\n\r\n/** Auto cap when the user has not set maxConcurrentWorkers (safety on huge hosts). */\r\nexport const AUTO_MAX_WORKERS_CEILING = 64;\r\n\r\nexport interface RunnerResourceGateShape {\r\n ok: boolean;\r\n totalMemBytes: number;\r\n freeMemBytes: number;\r\n memReserveBytes: number;\r\n perWorkerMemBytes: number;\r\n configuredMaxWorkers: number | null;\r\n autoCap: number;\r\n capacityWorkers: number;\r\n maxConcurrentWorkers: number;\r\n activeWorkers: number;\r\n slotsAvailable: number;\r\n reason: string | null;\r\n}\r\n\r\nexport interface ObserveResourceGateInput {\r\n runId: string;\r\n config?: KynverUserConfig;\r\n /** Command Center / workspace override \u2014 wins over local config when set. */\r\n configuredMaxWorkersOverride?: number | null;\r\n /** Override active worker count (tests). */\r\n activeWorkers?: number;\r\n totalMemBytes?: number;\r\n freeMemBytes?: number;\r\n}\r\n\r\nfunction positiveInt(value: unknown, fallback: number): number {\r\n const n = Number(value);\r\n if (!Number.isFinite(n) || n <= 0) return fallback;\r\n return Math.floor(n);\r\n}\r\n\r\nfunction resolveResourceConfig(\r\n config: KynverUserConfig = loadUserConfig(),\r\n configuredMaxWorkersOverride?: number | null,\r\n) {\r\n const perWorkerMemBytes = positiveInt(config.perWorkerMemBytes, DEFAULT_PER_WORKER_MEM_BYTES);\r\n const memReserveBytes = positiveInt(config.memReserveBytes, DEFAULT_MEM_RESERVE_BYTES);\r\n const memUtilization = Math.min(\r\n 1,\r\n Math.max(0.1, Number(config.memUtilization) > 0 ? Number(config.memUtilization) : DEFAULT_MEM_UTILIZATION),\r\n );\r\n const envCap = process.env.KYNVER_MAX_WORKERS ? positiveInt(process.env.KYNVER_MAX_WORKERS, 0) || null : null;\r\n const configuredMaxWorkers =\r\n configuredMaxWorkersOverride !== undefined\r\n ? configuredMaxWorkersOverride\r\n : envCap ??\r\n (config.maxConcurrentWorkers !== undefined && config.maxConcurrentWorkers !== null\r\n ? positiveInt(config.maxConcurrentWorkers, 0) || null\r\n : null);\r\n return { perWorkerMemBytes, memReserveBytes, memUtilization, configuredMaxWorkers };\r\n}\r\n\r\n/** How many workers this host could run from RAM alone (before a user cap). */\r\nexport function computeAutoMaxWorkers(\r\n totalMemBytes: number,\r\n opts: { perWorkerMemBytes?: number; memReserveBytes?: number; memUtilization?: number } = {},\r\n): number {\r\n const perWorkerMemBytes = opts.perWorkerMemBytes ?? DEFAULT_PER_WORKER_MEM_BYTES;\r\n const memReserveBytes = opts.memReserveBytes ?? DEFAULT_MEM_RESERVE_BYTES;\r\n const memUtilization = opts.memUtilization ?? DEFAULT_MEM_UTILIZATION;\r\n const budgetBytes = Math.max(0, Math.floor(totalMemBytes * memUtilization) - memReserveBytes);\r\n const raw = Math.max(1, Math.floor(budgetBytes / perWorkerMemBytes));\r\n return Math.min(raw, AUTO_MAX_WORKERS_CEILING);\r\n}\r\n\r\n/** Truly-usable memory. On Linux, os.freemem() reports MemFree, which excludes\r\n * reclaimable page cache and badly understates real headroom on a busy box \u2014\r\n * that made the free-RAM gate throttle dispatch far below the configured cap.\r\n * Prefer /proc/meminfo MemAvailable; fall back to os.freemem() elsewhere. */\r\nfunction readAvailableMemBytes(): number {\r\n if (process.platform === \"linux\") {\r\n try {\r\n const meminfo = readFileSync(\"/proc/meminfo\", \"utf8\");\r\n const match = meminfo.match(/^MemAvailable:\\s+(\\d+)\\s*kB/m);\r\n if (match) return Number(match[1]) * 1024;\r\n } catch {\r\n // fall through to os.freemem()\r\n }\r\n }\r\n return os.freemem();\r\n}\r\n\r\n/** Count alive, still-executing workers in a single run record. */\r\nfunction countActiveWorkersForRun(run: HarnessRunRecord): number {\r\n let active = 0;\r\n for (const name of Object.keys(run.workers || {})) {\r\n const worker = readJson<HarnessWorkerRecord | undefined>(\r\n path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n if (!worker) continue;\r\n const status = computeWorkerStatus(worker);\r\n if (status.alive && !status.finalResult && status.attention.state !== \"done\") {\r\n active++;\r\n }\r\n }\r\n return active;\r\n}\r\n\r\n/** Count active workers in ONE run (kept for callers/tests scoped to a run). */\r\nexport function countActiveWorkers(runId: string): number {\r\n return countActiveWorkersForRun(loadRun(runId));\r\n}\r\n\r\n/**\r\n * Count active workers across EVERY run on disk. The harness creates a new run\r\n * per task, so a per-run count let concurrent runs each believe the machine was\r\n * idle \u2014 the configured cap was never a real global ceiling (the \"spawns 4 or\r\n * infinity, never N\" bug). This machine-wide count is what the gate must use.\r\n */\r\nexport function countActiveWorkersGlobal(): number {\r\n let active = 0;\r\n for (const run of listRunRecords()) active += countActiveWorkersForRun(run);\r\n return active;\r\n}\r\n\r\n/**\r\n * Compute how many workers this host can run and how many dispatch slots remain.\r\n * Uses total RAM for steady-state capacity and free RAM as a hard safety gate.\r\n */\r\nexport function observeRunnerResourceGate(input: ObserveResourceGateInput): RunnerResourceGateShape {\r\n const { perWorkerMemBytes, memReserveBytes, memUtilization, configuredMaxWorkers } = resolveResourceConfig(\r\n input.config,\r\n input.configuredMaxWorkersOverride,\r\n );\r\n\r\n const totalMemBytes = input.totalMemBytes ?? os.totalmem();\r\n const freeMemBytes = input.freeMemBytes ?? readAvailableMemBytes();\r\n // Active count is GLOBAL across all runs (see countActiveWorkersGlobal), so the\r\n // cap is a true machine-wide ceiling rather than per-run.\r\n const activeWorkers = input.activeWorkers ?? countActiveWorkersGlobal();\r\n\r\n const budgetBytes = Math.max(0, Math.floor(totalMemBytes * memUtilization) - memReserveBytes);\r\n const capacityFromTotal = Math.max(0, Math.floor(budgetBytes / perWorkerMemBytes));\r\n const capacityFromFree = Math.max(0, Math.floor(Math.max(0, freeMemBytes - memReserveBytes) / perWorkerMemBytes));\r\n\r\n const autoCap = computeAutoMaxWorkers(totalMemBytes, { perWorkerMemBytes, memReserveBytes, memUtilization });\r\n const targetCap = configuredMaxWorkers ?? autoCap;\r\n const maxConcurrentWorkers = Math.max(0, Math.min(targetCap, capacityFromTotal));\r\n const slotsByCapacity = Math.max(0, maxConcurrentWorkers - activeWorkers);\r\n // capacityFromFree is ADDITIONAL headroom: free/available RAM already excludes\r\n // memory held by running workers, so we must NOT subtract activeWorkers again.\r\n // Doing so (the old `capacityFromFree - activeWorkers`) double-counted active\r\n // workers and collapsed dispatch to a handful of slots under load.\r\n const slotsByFreeMem = capacityFromFree;\r\n const slotsAvailable = Math.min(slotsByCapacity, slotsByFreeMem);\r\n\r\n let reason: string | null = null;\r\n if (slotsAvailable <= 0) {\r\n if (activeWorkers >= maxConcurrentWorkers) {\r\n reason = `at worker limit (${activeWorkers}/${maxConcurrentWorkers} running)`;\r\n } else if (capacityFromFree <= 0) {\r\n reason = \"insufficient free memory \u2014 waiting for workers to finish\";\r\n } else {\r\n reason = \"no worker slots available\";\r\n }\r\n }\r\n\r\n return {\r\n ok: slotsAvailable > 0,\r\n totalMemBytes,\r\n freeMemBytes,\r\n memReserveBytes,\r\n perWorkerMemBytes,\r\n configuredMaxWorkers,\r\n autoCap,\r\n capacityWorkers: capacityFromTotal,\r\n maxConcurrentWorkers,\r\n activeWorkers,\r\n slotsAvailable,\r\n reason,\r\n };\r\n}\r\n", "import { existsSync, readdirSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { getHarnessPaths, runDir as runDirPath } from \"./paths.js\";\r\nimport { readJson, safeSlug, writeJson } from \"./util.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\n\r\nexport interface HarnessRunRecord {\r\n id: string;\r\n name: string;\r\n repo: string;\r\n base: string;\r\n baseCommit: string;\r\n status: string;\r\n createdAt: string;\r\n workers: Record<string, { workerDir: string; statusPath: string }>;\r\n}\r\n\r\nexport function getPaths() {\r\n return getHarnessPaths();\r\n}\r\n\r\nexport function loadRun(id: string): HarnessRunRecord {\r\n const { runsDir } = getPaths();\r\n return readJson<HarnessRunRecord>(path.join(runDirPath(runsDir, safeSlug(id)), \"run.json\"));\r\n}\r\n\r\n/**\r\n * Load every run record on disk. Used for global, cross-run accounting (the\r\n * resource gate must see workers from ALL runs, and stale-run finalization\r\n * iterates the whole set). Unreadable/partial run dirs are skipped.\r\n */\r\nexport function listRunRecords(): HarnessRunRecord[] {\r\n const { runsDir } = getPaths();\r\n if (!existsSync(runsDir)) return [];\r\n const runs: HarnessRunRecord[] = [];\r\n for (const entry of readdirSync(runsDir, { withFileTypes: true })) {\r\n if (!entry.isDirectory()) continue;\r\n const run = readJson<HarnessRunRecord | undefined>(\r\n path.join(runsDir, entry.name, \"run.json\"),\r\n undefined,\r\n );\r\n if (run?.id) runs.push(run);\r\n }\r\n return runs;\r\n}\r\n\r\nexport function loadWorker(runId: string, name: string): HarnessWorkerRecord {\r\n const { runsDir } = getPaths();\r\n return readJson<HarnessWorkerRecord>(\r\n path.join(runDirPath(runsDir, safeSlug(runId)), \"workers\", safeSlug(name), \"worker.json\"),\r\n );\r\n}\r\n\r\nexport function saveRun(run: HarnessRunRecord): void {\r\n const { runsDir } = getPaths();\r\n writeJson(path.join(runDirPath(runsDir, run.id), \"run.json\"), run);\r\n}\r\n\r\nexport function saveWorker(runId: string, worker: HarnessWorkerRecord): void {\r\n const { runsDir } = getPaths();\r\n writeJson(path.join(runDirPath(runsDir, runId), \"workers\", worker.name, \"worker.json\"), worker);\r\n}\r\n\r\nexport function runDirectory(id: string): string {\r\n const { runsDir } = getPaths();\r\n return runDirPath(runsDir, safeSlug(id));\r\n}\r\n", "import { existsSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport { safeSlug } from \"./util.js\";\r\n\r\nconst LEGACY_ROOT = path.join(homedir(), \".openclaw\", \"harness\");\r\n\r\nexport function resolveHarnessRoot(): string {\r\n const env = process.env.KYNVER_HARNESS_ROOT || process.env.OPUS_HARNESS_ROOT;\r\n if (env) return path.resolve(env);\r\n const kynverRoot = path.join(homedir(), \".kynver\", \"harness\");\r\n if (existsSync(kynverRoot)) return kynverRoot;\r\n if (existsSync(LEGACY_ROOT)) return LEGACY_ROOT;\r\n return kynverRoot;\r\n}\r\n\r\nexport function getHarnessPaths() {\r\n const harnessRoot = resolveHarnessRoot();\r\n return {\r\n harnessRoot,\r\n runsDir: path.join(harnessRoot, \"runs\"),\r\n worktreesDir: path.join(harnessRoot, \"worktrees\"),\r\n };\r\n}\r\n\r\nexport function runDir(runsDir: string, id: string): string {\r\n return path.join(runsDir, safeSlug(id));\r\n}\r\n", "import { existsSync, readFileSync } from \"node:fs\";\r\nimport { safeJson } from \"./util.js\";\r\n\r\nexport interface ParsedHeartbeat {\r\n heartbeatCount: number;\r\n lastHeartbeatAt: string | null;\r\n lastHeartbeatPhase: string | null;\r\n lastHeartbeatSummary: string | null;\r\n heartbeatBlocker: string | null;\r\n}\r\n\r\nexport function parseHeartbeat(file: string): ParsedHeartbeat {\r\n const result: ParsedHeartbeat = {\r\n heartbeatCount: 0,\r\n lastHeartbeatAt: null,\r\n lastHeartbeatPhase: null,\r\n lastHeartbeatSummary: null,\r\n heartbeatBlocker: null,\r\n };\r\n if (!existsSync(file)) return result;\r\n const lines = readFileSync(file, \"utf8\").split(\"\\n\").filter(Boolean);\r\n for (const line of lines) {\r\n const entry = safeJson(line);\r\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) continue;\r\n const row = entry as Record<string, unknown>;\r\n result.heartbeatCount++;\r\n if (row.ts) result.lastHeartbeatAt = String(row.ts);\r\n if (row.phase !== undefined && row.phase !== null) result.lastHeartbeatPhase = String(row.phase);\r\n if (row.summary !== undefined && row.summary !== null) result.lastHeartbeatSummary = String(row.summary);\r\n result.heartbeatBlocker = row.blocker ? String(row.blocker) : null;\r\n }\r\n return result;\r\n}\r\n", "import { existsSync, readFileSync } from \"node:fs\";\r\nimport { oneLine, safeJson } from \"./util.js\";\r\n\r\nexport interface ParsedStream {\r\n firstEventAt: string | null;\r\n lastEventAt: string | null;\r\n currentTool: string | null;\r\n finalResult: unknown;\r\n error: string | null;\r\n}\r\n\r\nexport function parseClaudeStream(file: string): ParsedStream {\r\n const result: ParsedStream = {\r\n firstEventAt: null,\r\n lastEventAt: null,\r\n currentTool: null,\r\n finalResult: null,\r\n error: null,\r\n };\r\n if (!existsSync(file)) return result;\r\n const lines = readFileSync(file, \"utf8\").split(\"\\n\").filter(Boolean);\r\n for (const line of lines) {\r\n const event = safeJson(line) as Record<string, unknown> | null;\r\n if (!event) continue;\r\n const tsMs = event.timestamp_ms as number | undefined;\r\n const ts = (event.timestamp || event.ts || (tsMs ? new Date(tsMs).toISOString() : undefined)) as\r\n | string\r\n | undefined;\r\n if (ts) {\r\n result.firstEventAt ||= ts;\r\n result.lastEventAt = ts;\r\n }\r\n if (\r\n event.type === \"stream_event\" &&\r\n event.event &&\r\n typeof event.event === \"object\" &&\r\n (event.event as Record<string, unknown>).type === \"content_block_start\"\r\n ) {\r\n const block = (event.event as Record<string, unknown>).content_block as Record<string, unknown> | undefined;\r\n if (block?.type === \"tool_use\") result.currentTool = String(block.name || \"tool\");\r\n }\r\n if (event.type === \"assistant\" && event.message && typeof event.message === \"object\") {\r\n const content = (event.message as Record<string, unknown>).content;\r\n if (Array.isArray(content)) {\r\n const tool = content.find((item) => item?.type === \"tool_use\") as Record<string, unknown> | undefined;\r\n if (tool) result.currentTool = String(tool.name || result.currentTool);\r\n }\r\n }\r\n if (event.type === \"result\") {\r\n result.finalResult = event.result || event.subtype || event.terminal_reason || \"completed\";\r\n if (event.is_error) result.error = String(event.result || event.api_error_status || \"Claude result error\");\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nexport function summarizeEvent(event: Record<string, unknown>): string | undefined {\r\n if (event.type === \"system\" && event.subtype) {\r\n return `[system:${event.subtype}] ${String(event.status || event.cwd || \"\")}`.trim();\r\n }\r\n if (event.type === \"stream_event\" && event.event && typeof event.event === \"object\") {\r\n const type = (event.event as Record<string, unknown>).type;\r\n if (type === \"content_block_start\") {\r\n const block = (event.event as Record<string, unknown>).content_block as Record<string, unknown> | undefined;\r\n if (block?.type === \"tool_use\") return `[tool:start] ${block.name}`;\r\n }\r\n if (type === \"content_block_delta\") {\r\n const delta = (event.event as Record<string, unknown>).delta as Record<string, unknown> | undefined;\r\n if (delta?.partial_json) return `[tool:input] ${delta.partial_json}`;\r\n }\r\n if (type === \"message_stop\") return \"[message:stop]\";\r\n return type ? `[stream:${type}]` : undefined;\r\n }\r\n if (event.type === \"assistant\" && event.message && typeof event.message === \"object\") {\r\n const content = (event.message as Record<string, unknown>).content;\r\n if (Array.isArray(content)) {\r\n const text = content.find((item) => item?.type === \"text\") as Record<string, unknown> | undefined;\r\n if (text) return `[assistant] ${oneLine(String(text.text || \"\"))}`;\r\n const tool = content.find((item) => item?.type === \"tool_use\") as Record<string, unknown> | undefined;\r\n if (tool) return `[tool] ${tool.name} ${JSON.stringify(tool.input || {})}`;\r\n }\r\n }\r\n if (event.type === \"user\" && event.tool_use_result) {\r\n const result = event.tool_use_result as Record<string, unknown>;\r\n return `[tool:result] stdout=${JSON.stringify(result.stdout || \"\")} stderr=${JSON.stringify(result.stderr || \"\")}`;\r\n }\r\n if (event.type === \"result\") {\r\n return `[result] ${event.subtype || \"\"} ${oneLine(String(event.result || \"\"))}`.trim();\r\n }\r\n return undefined;\r\n}\r\n", "import { spawnSync } from \"node:child_process\";\r\nimport { fail } from \"./util.js\";\r\n\r\nexport interface GitOptions {\r\n allowFailure?: boolean;\r\n throwError?: boolean;\r\n}\r\n\r\nexport function git(cwd: string, args: string[], options: GitOptions = {}): string {\r\n const res = spawnSync(\"git\", args, { cwd, encoding: \"utf8\" });\r\n if (res.status !== 0 && !options.allowFailure) {\r\n const message = `git ${args.join(\" \")} failed: ${res.stderr || res.stdout}`;\r\n if (options.throwError) throw new Error(message);\r\n fail(message);\r\n }\r\n return res.stdout || \"\";\r\n}\r\n\r\nexport function ensureGitRepo(repo: string): void {\r\n git(repo, [\"rev-parse\", \"--show-toplevel\"]);\r\n}\r\n\r\nexport function gitStatusShort(worktreePath: string): string[] {\r\n return git(worktreePath, [\"status\", \"--short\"], { allowFailure: true })\r\n .split(\"\\n\")\r\n .map((line) => line.trim())\r\n .filter(Boolean);\r\n}\r\n\r\nexport interface GitCaptureResult {\r\n status: number | null;\r\n stdout: string;\r\n stderr: string;\r\n error: string | null;\r\n}\r\n\r\nexport function gitCapture(cwd: string, args: string[]): GitCaptureResult {\r\n try {\r\n const res = spawnSync(\"git\", args, { cwd, encoding: \"utf8\" });\r\n return {\r\n status: res.status,\r\n stdout: res.stdout || \"\",\r\n stderr: res.stderr || \"\",\r\n error: res.error ? res.error.message : null,\r\n };\r\n } catch (error) {\r\n return {\r\n status: null,\r\n stdout: \"\",\r\n stderr: \"\",\r\n error: (error as Error).message,\r\n };\r\n }\r\n}\r\n\r\nexport function gitIsAncestor(\r\n cwd: string,\r\n ancestor: string,\r\n descendant: string,\r\n): { isAncestor: boolean | null; error: string | null } {\r\n const res = gitCapture(cwd, [\"merge-base\", \"--is-ancestor\", ancestor, descendant]);\r\n if (res.status === 0) return { isAncestor: true, error: null };\r\n if (res.status === 1) return { isAncestor: false, error: null };\r\n return { isAncestor: null, error: res.error || res.stderr || res.stdout || `git exited ${res.status}` };\r\n}\r\n\r\nexport type GitAncestryRelation = \"synced\" | \"merged\" | \"ahead\" | \"diverged\" | \"unknown\";\r\n\r\nexport interface GitAncestry {\r\n checked: boolean;\r\n base: string;\r\n head: string | null;\r\n baseHead: string | null;\r\n baseIsAncestorOfHead: boolean | null;\r\n headIsAncestorOfBase: boolean | null;\r\n relation: GitAncestryRelation;\r\n error?: string;\r\n}\r\n\r\nexport function computeGitAncestry(worktreePath: string, base = \"origin/main\"): GitAncestry {\r\n if (!worktreePath) {\r\n return unknownAncestry(base, \"missing worktree path\");\r\n }\r\n\r\n const head = gitCapture(worktreePath, [\"rev-parse\", \"HEAD\"]);\r\n if (head.status !== 0) return unknownAncestry(base, head.error || head.stderr || head.stdout || \"failed to resolve HEAD\");\r\n\r\n const baseHead = gitCapture(worktreePath, [\"rev-parse\", base]);\r\n if (baseHead.status !== 0) {\r\n return unknownAncestry(base, baseHead.error || baseHead.stderr || baseHead.stdout || `failed to resolve ${base}`, head.stdout.trim());\r\n }\r\n\r\n const headSha = head.stdout.trim();\r\n const baseSha = baseHead.stdout.trim();\r\n if (headSha === baseSha) {\r\n return {\r\n checked: true,\r\n base,\r\n head: headSha,\r\n baseHead: baseSha,\r\n baseIsAncestorOfHead: true,\r\n headIsAncestorOfBase: true,\r\n relation: \"synced\",\r\n };\r\n }\r\n\r\n const baseIsAncestorOfHead = gitIsAncestor(worktreePath, baseSha, headSha);\r\n const headIsAncestorOfBase = gitIsAncestor(worktreePath, headSha, baseSha);\r\n const error = baseIsAncestorOfHead.error || headIsAncestorOfBase.error || undefined;\r\n if (baseIsAncestorOfHead.isAncestor == null || headIsAncestorOfBase.isAncestor == null) {\r\n return {\r\n checked: false,\r\n base,\r\n head: headSha,\r\n baseHead: baseSha,\r\n baseIsAncestorOfHead: baseIsAncestorOfHead.isAncestor,\r\n headIsAncestorOfBase: headIsAncestorOfBase.isAncestor,\r\n relation: \"unknown\",\r\n ...(error ? { error } : {}),\r\n };\r\n }\r\n\r\n const relation: GitAncestryRelation = baseIsAncestorOfHead.isAncestor\r\n ? \"ahead\"\r\n : headIsAncestorOfBase.isAncestor\r\n ? \"merged\"\r\n : \"diverged\";\r\n\r\n return {\r\n checked: true,\r\n base,\r\n head: headSha,\r\n baseHead: baseSha,\r\n baseIsAncestorOfHead: baseIsAncestorOfHead.isAncestor,\r\n headIsAncestorOfBase: headIsAncestorOfBase.isAncestor,\r\n relation,\r\n ...(error ? { error } : {}),\r\n };\r\n}\r\n\r\nfunction unknownAncestry(base: string, error: string, head: string | null = null): GitAncestry {\r\n return {\r\n checked: false,\r\n base,\r\n head,\r\n baseHead: null,\r\n baseIsAncestorOfHead: null,\r\n headIsAncestorOfBase: null,\r\n relation: \"unknown\",\r\n error,\r\n };\r\n}\r\n\r\nexport function scrubClaudeEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\r\n const next = { ...env };\r\n delete next.ANTHROPIC_API_KEY;\r\n return next;\r\n}\r\n", "import { parseHeartbeat } from \"./heartbeat.js\";\r\nimport { parseClaudeStream } from \"./stream.js\";\r\nimport { computeGitAncestry, type GitAncestry, gitStatusShort } from \"./git.js\";\r\nimport {\r\n fileMtime,\r\n fileSize,\r\n isPidAlive,\r\n latestIso,\r\n secsAgo,\r\n tailFile,\r\n} from \"./util.js\";\r\n\r\nexport const NO_START_MS = 180_000;\r\nexport const STALE_MS = 600_000;\r\n\r\nexport interface WorkerAttention {\r\n state: \"done\" | \"needs_attention\" | \"blocked\" | \"stale\" | \"ok\";\r\n reason: string;\r\n}\r\n\r\nexport interface HarnessWorkerRecord {\r\n name: string;\r\n runId: string;\r\n status: string;\r\n pid?: number;\r\n model?: string;\r\n branch: string;\r\n worktreePath: string;\r\n workerDir: string;\r\n stdoutPath: string;\r\n stderrPath: string;\r\n heartbeatPath: string;\r\n ownedPaths?: string[];\r\n agentOsId?: string;\r\n taskId?: string;\r\n planId?: string;\r\n leaseOwner?: string;\r\n dispatched?: boolean;\r\n startedAt?: string;\r\n /** Last heartbeat blocker text successfully synced to plan-progress-sync (dedupe). */\r\n lastSyncedHeartbeatBlocker?: string;\r\n}\r\n\r\nexport interface RawHarnessWorkerStatus {\r\n runId: string;\r\n worker: string;\r\n pid?: number;\r\n alive: boolean;\r\n status: string;\r\n attention: WorkerAttention;\r\n branch: string;\r\n worktreePath: string;\r\n ownedPaths?: string[];\r\n stdoutBytes: number;\r\n stderrBytes: number;\r\n heartbeatBytes: number;\r\n firstEventAt: string | null;\r\n lastEventAt: string | null;\r\n lastActivityAt: string | null;\r\n currentTool: string | null;\r\n heartbeatCount: number;\r\n lastHeartbeatAt: string | null;\r\n lastHeartbeatPhase: string | null;\r\n lastHeartbeatSummary: string | null;\r\n heartbeatBlocker: string | null;\r\n finalResult: unknown;\r\n error?: string;\r\n changedFiles: string[];\r\n gitAncestry: GitAncestry;\r\n}\r\n\r\nexport interface WorkerStatusOptions {\r\n base?: string;\r\n}\r\n\r\nexport function computeAttention(input: {\r\n alive: boolean;\r\n finalResult: unknown;\r\n firstEventAt: string | null;\r\n stdoutBytes: number;\r\n heartbeatBytes: number;\r\n lastActivityAt: string | null;\r\n heartbeatBlocker: string | null;\r\n startedAt?: string;\r\n}): WorkerAttention {\r\n const now = Date.now();\r\n if (input.finalResult) return { state: \"done\", reason: \"final result recorded\" };\r\n if (!input.alive) return { state: \"needs_attention\", reason: \"process exited without a final result\" };\r\n if (input.heartbeatBlocker) {\r\n return { state: \"blocked\", reason: `worker heartbeat reported blocker: ${input.heartbeatBlocker}` };\r\n }\r\n const startMs = input.startedAt ? Date.parse(input.startedAt) : NaN;\r\n if (\r\n !input.firstEventAt &&\r\n input.stdoutBytes === 0 &&\r\n input.heartbeatBytes === 0 &&\r\n Number.isFinite(startMs) &&\r\n now - startMs > NO_START_MS\r\n ) {\r\n return { state: \"needs_attention\", reason: `no first stream event ${secsAgo(startMs)}s after start` };\r\n }\r\n const actMs = input.lastActivityAt ? Date.parse(input.lastActivityAt) : NaN;\r\n if (Number.isFinite(actMs) && now - actMs > STALE_MS) {\r\n return { state: \"stale\", reason: `no log/event/heartbeat activity for ${secsAgo(actMs)}s` };\r\n }\r\n return { state: \"ok\", reason: \"recent activity\" };\r\n}\r\n\r\nexport function computeWorkerStatus(worker: HarnessWorkerRecord, options: WorkerStatusOptions = {}): RawHarnessWorkerStatus {\r\n const parsed = parseClaudeStream(worker.stdoutPath);\r\n const heartbeat = parseHeartbeat(worker.heartbeatPath);\r\n const alive = isPidAlive(worker.pid);\r\n const stdoutBytes = fileSize(worker.stdoutPath);\r\n const stderrBytes = fileSize(worker.stderrPath);\r\n const heartbeatBytes = fileSize(worker.heartbeatPath);\r\n const changedFiles = gitStatusShort(worker.worktreePath);\r\n const gitAncestry = computeGitAncestry(worker.worktreePath, options.base);\r\n const lastActivityAt = latestIso([\r\n parsed.lastEventAt,\r\n heartbeat.lastHeartbeatAt,\r\n fileMtime(worker.stdoutPath),\r\n fileMtime(worker.stderrPath),\r\n fileMtime(worker.heartbeatPath),\r\n ]);\r\n const attention = computeAttention({\r\n alive,\r\n finalResult: parsed.finalResult,\r\n firstEventAt: parsed.firstEventAt,\r\n stdoutBytes,\r\n heartbeatBytes,\r\n lastActivityAt,\r\n heartbeatBlocker: heartbeat.heartbeatBlocker,\r\n startedAt: worker.startedAt,\r\n });\r\n return {\r\n runId: worker.runId,\r\n worker: worker.name,\r\n pid: worker.pid,\r\n alive,\r\n status: parsed.finalResult ? \"done\" : alive ? \"running\" : \"exited\",\r\n attention,\r\n branch: worker.branch,\r\n worktreePath: worker.worktreePath,\r\n ownedPaths: worker.ownedPaths,\r\n stdoutBytes,\r\n stderrBytes,\r\n heartbeatBytes,\r\n firstEventAt: parsed.firstEventAt,\r\n lastEventAt: parsed.lastEventAt,\r\n lastActivityAt,\r\n currentTool: parsed.currentTool,\r\n heartbeatCount: heartbeat.heartbeatCount,\r\n lastHeartbeatAt: heartbeat.lastHeartbeatAt,\r\n lastHeartbeatPhase: heartbeat.lastHeartbeatPhase,\r\n lastHeartbeatSummary: heartbeat.lastHeartbeatSummary,\r\n heartbeatBlocker: heartbeat.heartbeatBlocker,\r\n finalResult: parsed.finalResult,\r\n error:\r\n parsed.error ||\r\n (!alive && !parsed.finalResult ? tailFile(worker.stderrPath, 10).trim() || undefined : undefined),\r\n changedFiles,\r\n gitAncestry,\r\n };\r\n}\r\n\r\nexport function isFinishedWorkerStatus(status: RawHarnessWorkerStatus): boolean {\r\n if (status.finalResult) return true;\r\n if (status.alive === false) return true;\r\n if (status.status === \"exited\" || status.status === \"done\") return true;\r\n return false;\r\n}\r\n\r\nexport function deriveRunStatus(fallback: string, workers: Array<{ attention?: string; status?: string }>): string {\r\n if (workers.length === 0) return fallback;\r\n if (workers.some((w) => w.attention === \"needs_attention\" || w.attention === \"stale\" || w.attention === \"blocked\")) {\r\n return \"needs_attention\";\r\n }\r\n if (workers.every((w) => w.status === \"done\")) return \"done\";\r\n if (workers.some((w) => w.status === \"running\")) return \"running\";\r\n return fallback;\r\n}\r\n", "import { existsSync, mkdirSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { git } from \"./git.js\";\r\nimport { getPaths } from \"./run-store.js\";\r\nimport { loadRun, runDirectory, saveRun, saveWorker } from \"./run-store.js\";\r\nimport { buildPrompt } from \"./prompt.js\";\r\nimport { readMaybeFile, safeSlug } from \"./util.js\";\r\nimport { resolveWorkerProvider } from \"./providers/registry.js\";\r\nimport type { HarnessRunRecord } from \"./run-store.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\n\r\nexport interface SpawnWorkerOptions {\r\n name: string;\r\n task: string;\r\n ownedPaths?: string[];\r\n model?: string;\r\n branch?: string;\r\n agentOsId?: string;\r\n taskId?: string;\r\n planId?: string;\r\n leaseOwner?: string;\r\n dispatched?: boolean;\r\n provider?: string;\r\n}\r\n\r\nexport function spawnWorkerProcess(run: HarnessRunRecord, opts: SpawnWorkerOptions): HarnessWorkerRecord {\r\n // Guard against missing/sentinel names. A missing --name used to reach here as\r\n // the literal string \"undefined\" (String(undefined)) \u2014 truthy, so the old\r\n // `if (!opts.name)` check passed and every unnamed worker collided on the key\r\n // \"undefined\", corrupting run.workers and the active-worker count.\r\n const rawName = typeof opts.name === \"string\" ? opts.name.trim() : \"\";\r\n if (!rawName || rawName === \"undefined\" || rawName === \"null\") {\r\n throw new Error(`worker name is required and must be a real identifier (got: ${JSON.stringify(opts.name)})`);\r\n }\r\n const name = safeSlug(rawName);\r\n if (run.workers?.[name]) throw new Error(`worker already exists in run ${run.id}: ${name}`);\r\n if (!opts.task) throw new Error(`missing task text for worker ${name}`);\r\n\r\n const { worktreesDir } = getPaths();\r\n const workerDir = path.join(runDirectory(run.id), \"workers\", name);\r\n mkdirSync(workerDir, { recursive: true });\r\n const worktreePath = path.join(worktreesDir, run.id, name);\r\n const branch = opts.branch || `agent/${run.id}/${name}`;\r\n if (existsSync(worktreePath)) throw new Error(`worktree path already exists: ${worktreePath}`);\r\n\r\n git(run.repo, [\"fetch\", \"origin\", \"--prune\"], { allowFailure: true });\r\n git(run.repo, [\"worktree\", \"add\", \"-b\", branch, worktreePath, run.baseCommit], { throwError: true });\r\n\r\n const stdoutPath = path.join(workerDir, \"stdout.jsonl\");\r\n const stderrPath = path.join(workerDir, \"stderr.log\");\r\n const heartbeatPath = path.join(workerDir, \"heartbeat.jsonl\");\r\n const prompt = buildPrompt({\r\n task: opts.task,\r\n ownedPaths: opts.ownedPaths || [],\r\n worktreePath,\r\n heartbeatPath,\r\n });\r\n\r\n const provider = resolveWorkerProvider(opts.provider);\r\n let started;\r\n try {\r\n started = provider.start({\r\n name,\r\n task: opts.task,\r\n ownedPaths: opts.ownedPaths,\r\n model: opts.model,\r\n branch,\r\n worktreePath,\r\n workerDir,\r\n stdoutPath,\r\n stderrPath,\r\n heartbeatPath,\r\n prompt,\r\n });\r\n } catch (error) {\r\n git(run.repo, [\"worktree\", \"remove\", \"--force\", worktreePath], { allowFailure: true });\r\n git(run.repo, [\"branch\", \"-D\", branch], { allowFailure: true });\r\n throw error;\r\n }\r\n\r\n const model = started.model || opts.model || \"claude-opus-4-7\";\r\n const worker: HarnessWorkerRecord = {\r\n name,\r\n runId: run.id,\r\n status: \"running\",\r\n pid: started.pid,\r\n model,\r\n branch,\r\n worktreePath,\r\n workerDir,\r\n stdoutPath,\r\n stderrPath,\r\n heartbeatPath,\r\n ownedPaths: opts.ownedPaths,\r\n ...(opts.agentOsId ? { agentOsId: String(opts.agentOsId) } : {}),\r\n ...(opts.taskId ? { taskId: String(opts.taskId) } : {}),\r\n ...(opts.planId ? { planId: String(opts.planId) } : {}),\r\n ...(opts.leaseOwner ? { leaseOwner: String(opts.leaseOwner) } : {}),\r\n ...(opts.dispatched ? { dispatched: true } : {}),\r\n startedAt: new Date().toISOString(),\r\n };\r\n\r\n saveWorker(run.id, worker);\r\n run.workers = { ...(run.workers || {}), [name]: { workerDir, statusPath: path.join(workerDir, \"worker.json\") } };\r\n run.status = \"running\";\r\n saveRun(run);\r\n return worker;\r\n}\r\n\r\nexport function startWorker(args: Record<string, string | boolean>): void {\r\n const run = loadRun(String(args.run));\r\n const name = typeof args.name === \"string\" ? args.name.trim() : \"\";\r\n if (!name) {\r\n console.error(\"worker start failed: --name is required\");\r\n process.exit(1);\r\n }\r\n const task = args.task ? String(args.task) : readMaybeFile(args.taskFile ? String(args.taskFile) : undefined);\r\n if (!task) {\r\n console.error(\"missing --task or --task-file\");\r\n process.exit(1);\r\n }\r\n try {\r\n const worker = spawnWorkerProcess(run, {\r\n name,\r\n task,\r\n ownedPaths: args.owned ? String(args.owned).split(\",\").map((s) => s.trim()).filter(Boolean) : [],\r\n model: args.model ? String(args.model) : undefined,\r\n branch: args.branch ? String(args.branch) : undefined,\r\n agentOsId: args.agentOsId ? String(args.agentOsId) : undefined,\r\n taskId: args.taskId ? String(args.taskId) : undefined,\r\n provider: args.provider ? String(args.provider) : undefined,\r\n });\r\n console.log(\r\n JSON.stringify(\r\n {\r\n runId: run.id,\r\n worker: worker.name,\r\n pid: worker.pid,\r\n branch: worker.branch,\r\n worktreePath: worker.worktreePath,\r\n workerDir: worker.workerDir,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n } catch (error) {\r\n console.error(`worker start failed: ${(error as Error).message}`);\r\n process.exit(1);\r\n }\r\n}\r\n", "export function buildPrompt(input: {\r\n task: string;\r\n ownedPaths: string[];\r\n worktreePath: string;\r\n heartbeatPath: string;\r\n planId?: string;\r\n taskId?: string;\r\n}): string {\r\n const ownership = input.ownedPaths.length\r\n ? `Owned paths: ${input.ownedPaths.join(\", \")}. Do not edit outside these paths without stopping and reporting why.`\r\n : \"Owned paths: unrestricted for this worker, but keep edits tightly scoped.\";\r\n const progressLines = [\r\n \"Structured plan progress (required when planId is set):\",\r\n \"- Harness checkpoints only: `kynver plan progress --plan <planId> --row <rowKey> --role implementer --status running|partial|blocked` (the by-id harness route rejects `done` and confirm events).\",\r\n \"- When a slice is finished, emit `partial` with evidence (`--evidence pr:<url>`, `--evidence path:<file>`, or `--evidence command:<cmd>`). Do not propose or confirm row `done` from the worker CLI.\",\r\n \"- Propose/confirm row `done` is MCP/session only: chat agents use `agent_os_plan_progress_event_append` on the slug route (implementer proposes with `proposed: true`; report_reviewer/deep_reviewer confirm with `proposed: false`).\",\r\n \"- When blocked on operator/Ghost/runtime review, create a linked review task (MCP `agent_os_plan_review_task_create` or API) and pass `--review-task <taskId>`.\",\r\n \"- Before the completion report: mark completion-report rows partial with evidence; do not skip report review.\",\r\n \"- After implementation: wait for report_reviewer then deep_reviewer confirmation (via MCP/session agents) before follow-up rows close.\",\r\n input.planId\r\n ? `Active planId: ${input.planId}${input.taskId ? ` \u00B7 taskId: ${input.taskId}` : \"\"}`\r\n : \"No planId on this worker \u2014 still emit progress when you touch plan-scoped work.\",\r\n ];\r\n return [\r\n \"You are running under the Kynver AgentOS runtime.\",\r\n \"Immediately state your plan before editing.\",\r\n ownership,\r\n `Worktree: ${input.worktreePath}`,\r\n `Progress heartbeat file: ${input.heartbeatPath}`,\r\n \"After each major step, append one JSON line to the heartbeat file with fields: ts, phase, summary, changedFiles, blocker.\",\r\n \"Final response must include files changed, verification commands, and unresolved risks.\",\r\n \"\",\r\n ...progressLines,\r\n \"\",\r\n \"Task:\",\r\n input.task,\r\n ].join(\"\\n\");\r\n}\r\n", "import { closeSync, openSync } from \"node:fs\";\r\nimport { spawn } from \"node:child_process\";\r\nimport { scrubClaudeEnv } from \"../git.js\";\r\nimport type { WorkerProvider, WorkerProviderStartOptions } from \"./types.js\";\r\n\r\nexport const claudeProvider: WorkerProvider = {\r\n name: \"claude\",\r\n start(opts) {\r\n const model = opts.model || \"claude-opus-4-7\";\r\n const stdoutFd = openSync(opts.stdoutPath, \"a\");\r\n const stderrFd = openSync(opts.stderrPath, \"a\");\r\n const child = spawn(\r\n \"claude\",\r\n [\r\n \"--model\",\r\n model,\r\n \"-p\",\r\n \"--verbose\",\r\n \"--permission-mode\",\r\n \"bypassPermissions\",\r\n \"--output-format\",\r\n \"stream-json\",\r\n \"--include-partial-messages\",\r\n opts.prompt,\r\n ],\r\n {\r\n cwd: opts.worktreePath,\r\n detached: true,\r\n stdio: [\"ignore\", stdoutFd, stderrFd],\r\n env: scrubClaudeEnv(process.env),\r\n },\r\n );\r\n closeSync(stdoutFd);\r\n closeSync(stderrFd);\r\n\r\n if (!child.pid) {\r\n throw new Error(\"failed to spawn claude worker process (is the `claude` CLI on PATH?)\");\r\n }\r\n child.unref();\r\n return { pid: child.pid, model };\r\n },\r\n};\r\n", "import { closeSync, existsSync, openSync, readdirSync } from \"node:fs\";\r\nimport { spawn } from \"node:child_process\";\r\nimport path from \"node:path\";\r\nimport type { WorkerProvider, WorkerProviderStartOptions } from \"./types.js\";\r\n\r\nconst DEFAULT_CURSOR_MODEL = \"composer-2.5\";\r\n\r\ninterface CursorSpawnTarget {\r\n executable: string;\r\n prefixArgs: string[];\r\n shell: boolean;\r\n detached: boolean;\r\n}\r\n\r\nfunction latestVersionDir(versionsRoot: string): string | null {\r\n if (!existsSync(versionsRoot)) return null;\r\n const versions = readdirSync(versionsRoot, { withFileTypes: true })\r\n .filter((entry) => entry.isDirectory() && /^\\d{4}\\.\\d/.test(entry.name))\r\n .map((entry) => entry.name)\r\n .sort((a, b) => b.localeCompare(a));\r\n return versions[0] ? path.join(versionsRoot, versions[0]) : null;\r\n}\r\n\r\nfunction resolveBundledCursor(versionDir: string): CursorSpawnTarget | null {\r\n const nodeExe = path.join(versionDir, \"node.exe\");\r\n const indexJs = path.join(versionDir, \"index.js\");\r\n if (!existsSync(nodeExe) || !existsSync(indexJs)) return null;\r\n return { executable: nodeExe, prefixArgs: [indexJs], shell: false, detached: true };\r\n}\r\n\r\nfunction resolveWindowsCursorSpawn(agentBin: string): CursorSpawnTarget | null {\r\n const agentRoot = path.dirname(agentBin);\r\n const direct = resolveBundledCursor(agentRoot);\r\n if (direct) return direct;\r\n const versionDir = latestVersionDir(path.join(agentRoot, \"versions\"));\r\n return versionDir ? resolveBundledCursor(versionDir) : null;\r\n}\r\n\r\nexport function resolveCursorSpawn(agentBin: string): CursorSpawnTarget {\r\n if (process.platform === \"win32\" && /\\.(cmd|bat)$/i.test(agentBin)) {\r\n const bundled = resolveWindowsCursorSpawn(agentBin);\r\n if (bundled) return bundled;\r\n // shell + detached loses fd stdio on Windows; keep the worker attached instead.\r\n return { executable: agentBin, prefixArgs: [], shell: true, detached: false };\r\n }\r\n return { executable: agentBin, prefixArgs: [], shell: false, detached: true };\r\n}\r\n\r\nfunction resolveAgentBin(): string {\r\n const configured =\r\n process.env.KYNVER_CURSOR_AGENT_BIN?.trim() ||\r\n process.env.CURSOR_AGENT_BIN?.trim();\r\n if (configured) return configured;\r\n\r\n if (process.platform === \"win32\") {\r\n const localAgent = path.join(process.env.LOCALAPPDATA || \"\", \"cursor-agent\", \"agent.cmd\");\r\n if (existsSync(localAgent)) return localAgent;\r\n }\r\n\r\n return \"agent\";\r\n}\r\n\r\nexport const cursorProvider: WorkerProvider = {\r\n name: \"cursor\",\r\n start(opts) {\r\n const model = opts.model || DEFAULT_CURSOR_MODEL;\r\n const stdoutFd = openSync(opts.stdoutPath, \"a\");\r\n const stderrFd = openSync(opts.stderrPath, \"a\");\r\n const agentBin = resolveAgentBin();\r\n const spawnTarget = resolveCursorSpawn(agentBin);\r\n const child = spawn(\r\n spawnTarget.executable,\r\n [\r\n ...spawnTarget.prefixArgs,\r\n \"-p\",\r\n \"--force\",\r\n \"--trust\",\r\n \"--workspace\",\r\n opts.worktreePath,\r\n \"--output-format\",\r\n \"stream-json\",\r\n \"--stream-partial-output\",\r\n \"--model\",\r\n model,\r\n opts.prompt,\r\n ],\r\n {\r\n cwd: opts.worktreePath,\r\n detached: spawnTarget.detached,\r\n shell: spawnTarget.shell,\r\n stdio: [\"ignore\", stdoutFd, stderrFd],\r\n env: {\r\n ...process.env,\r\n ...(spawnTarget.prefixArgs.length > 0 ? { CURSOR_INVOKED_AS: path.basename(agentBin) } : {}),\r\n },\r\n },\r\n );\r\n closeSync(stdoutFd);\r\n closeSync(stderrFd);\r\n\r\n if (!child.pid) {\r\n throw new Error(\r\n `failed to spawn Cursor agent worker (is \\`${agentBin}\\` on PATH? run \\`agent login\\` or set CURSOR_API_KEY)`,\r\n );\r\n }\r\n child.unref();\r\n return { pid: child.pid, model };\r\n },\r\n};\r\n", "import { loadUserConfig } from \"../config.js\";\r\nimport { claudeProvider } from \"./claude.js\";\r\nimport { cursorProvider } from \"./cursor.js\";\r\nimport type { WorkerProvider } from \"./types.js\";\r\n\r\nconst BUILTIN: Record<string, WorkerProvider> = {\r\n claude: claudeProvider,\r\n cursor: cursorProvider,\r\n};\r\n\r\nlet overrideProvider: WorkerProvider | null = null;\r\n\r\n/** Test hook \u2014 inject a stub provider without spawning Claude. */\r\nexport function setWorkerProviderForTests(provider: WorkerProvider | null): void {\r\n overrideProvider = provider;\r\n}\r\n\r\nexport function resolveWorkerProvider(name?: string): WorkerProvider {\r\n if (overrideProvider) return overrideProvider;\r\n const configured = (name || loadUserConfig().workerProvider || \"claude\").trim();\r\n const provider = BUILTIN[configured];\r\n if (!provider) {\r\n throw new Error(`unknown worker provider \"${configured}\" \u2014 supported: ${Object.keys(BUILTIN).join(\", \")}`);\r\n }\r\n return provider;\r\n}\r\n", "import path from \"node:path\";\r\nimport { resolveBaseUrl, resolveCallbackSecretWithMint } from \"./config.js\";\r\nimport { postJson } from \"./callbacks.js\";\r\nimport { observeRunnerDiskGate } from \"./disk-gate.js\";\r\nimport { observeRunnerResourceGate } from \"./resource-gate.js\";\r\nimport { loadRun } from \"./run-store.js\";\r\nimport { runDirectory } from \"./run-store.js\";\r\nimport { spawnWorkerProcess } from \"./supervisor.js\";\r\nimport { required, safeSlug } from \"./util.js\";\r\n\r\nexport const DEFAULT_DISPATCH_LEASE_MS = 60 * 60 * 1000;\r\n\r\nexport function buildDispatchTaskText(task: Record<string, unknown>, agentOsId: string): string {\r\n return [\r\n `[AgentOS task ${task.id}] ${task.title}`,\r\n \"\",\r\n task.description ? String(task.description) : \"(no description on the board task)\",\r\n \"\",\r\n `Board linkage: agentOsId=${agentOsId}, taskId=${task.id}, attempt=${task.attempt}, executor=${task.executor}${\r\n task.executorRef ? `, executorRef=${task.executorRef}` : \"\"\r\n }.`,\r\n \"This worker was dispatched from the AgentOS board. The harness reports your completion back to the board when you finish.\",\r\n ].join(\"\\n\");\r\n}\r\n\r\nexport async function dispatchRun(args: Record<string, string | boolean>): Promise<Record<string, unknown> | void> {\r\n const pipeline = args.pipeline === true || args.pipeline === \"true\";\r\n try {\r\n const run = loadRun(String(required(String(args.run || \"\"), \"--run\")));\r\n const agentOsId = String(required(String(args.agentOsId || \"\"), \"--agent-os-id\"));\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : undefined, agentOsId, { baseUrl: base });\r\n const execute = args.execute === true || args.execute === \"true\";\r\n const dryRun = !execute;\r\n const leaseOwner = `openclaw-harness:${run.id}`;\r\n\r\n const runnerDiskGate = args.diskPath\r\n ? observeRunnerDiskGate({ diskPath: String(args.diskPath) })\r\n : observeRunnerDiskGate({ diskPath: run.repo });\r\n const runnerResourceGate = observeRunnerResourceGate({ runId: run.id });\r\n const requestedStarts = Number(args.maxStarts) > 0 ? Math.floor(Number(args.maxStarts)) : 1;\r\n const cappedStarts = dryRun\r\n ? requestedStarts\r\n : Math.min(requestedStarts, runnerResourceGate.slotsAvailable);\r\n\r\n const dispatchUrl = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/tasks/dispatch-next`;\r\n const body: Record<string, unknown> = {\r\n agentOsId,\r\n dryRun,\r\n maxStarts: cappedStarts,\r\n leaseOwner,\r\n leaseDurationMs:\r\n Number(args.leaseMs) > 0 ? Math.floor(Number(args.leaseMs)) : DEFAULT_DISPATCH_LEASE_MS,\r\n runnerDiskGate,\r\n runnerResourceGate,\r\n ...(args.lane ? { lane: String(args.lane) } : {}),\r\n ...(args.diskPath ? { diskPath: String(args.diskPath) } : {}),\r\n };\r\n\r\n const dispatch = await postJson(dispatchUrl, secret, body);\r\n const responseBody = dispatch.response as { ok?: boolean; result?: Record<string, unknown> } | null;\r\n if (!dispatch.ok || !responseBody?.result) {\r\n const failure = {\r\n runId: run.id,\r\n agentOsId,\r\n action: \"dispatch\",\r\n httpStatus: dispatch.status,\r\n response: dispatch.response,\r\n };\r\n if (pipeline) return { ok: false, ...failure };\r\n console.log(JSON.stringify(failure, null, 2));\r\n process.exit(1);\r\n }\r\n\r\n const result = responseBody.result;\r\n if (dryRun) {\r\n const summary = {\r\n runId: run.id,\r\n agentOsId,\r\n dryRun: true,\r\n wouldStart: (result.started as Array<{ task: Record<string, unknown>; reason: string }>).map((d) => ({\r\n taskId: d.task.id,\r\n title: d.task.title,\r\n reason: d.reason,\r\n })),\r\n skipped: (result.skipped as Array<{ task: Record<string, unknown>; skipReason: string; reason: string }>).map(\r\n (d) => ({ taskId: d.task.id, skipReason: d.skipReason, reason: d.reason }),\r\n ),\r\n diskGate: result.diskGate,\r\n resourceGate: result.resourceGate,\r\n inspected: result.inspected,\r\n };\r\n if (pipeline) return { ok: true, ...summary };\r\n console.log(JSON.stringify(summary, null, 2));\r\n return;\r\n }\r\n\r\n if (!dryRun && cappedStarts <= 0) {\r\n const summary = {\r\n runId: run.id,\r\n agentOsId,\r\n dryRun: false,\r\n skipped: true,\r\n reason: runnerResourceGate.reason ?? \"no resource slots\",\r\n resourceGate: runnerResourceGate,\r\n };\r\n if (pipeline) return { ok: true, ...summary };\r\n console.log(JSON.stringify(summary, null, 2));\r\n return;\r\n }\r\n\r\n const outcomes: Array<Record<string, unknown>> = [];\r\n for (const decision of result.started as Array<{ task: Record<string, unknown> }>) {\r\n const task = decision.task;\r\n const name = safeSlug(`t-${task.id}-a${task.attempt}`);\r\n try {\r\n const planId = task.planId ? String(task.planId) : undefined;\r\n const worker = spawnWorkerProcess(run, {\r\n name,\r\n task: buildDispatchTaskText(task, agentOsId),\r\n ownedPaths: args.owned ? String(args.owned).split(\",\").map((s) => s.trim()).filter(Boolean) : [],\r\n model: args.model ? String(args.model) : undefined,\r\n agentOsId,\r\n taskId: String(task.id),\r\n planId,\r\n leaseOwner,\r\n dispatched: true,\r\n });\r\n outcomes.push({\r\n taskId: task.id,\r\n started: true,\r\n worker: worker.name,\r\n pid: worker.pid,\r\n branch: worker.branch,\r\n });\r\n } catch (error) {\r\n const releaseUrl = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/tasks/${encodeURIComponent(String(task.id))}/release`;\r\n let release;\r\n try {\r\n release = await postJson(releaseUrl, secret, { agentOsId, leaseOwner });\r\n } catch (relErr) {\r\n release = { ok: false, error: (relErr as Error).message };\r\n }\r\n outcomes.push({\r\n taskId: task.id,\r\n started: false,\r\n error: (error as Error).message,\r\n released: release.ok === true || (release.response as Record<string, unknown>)?.ok === true,\r\n releaseResponse: release.response ?? release,\r\n });\r\n }\r\n }\r\n\r\n const summary = {\r\n runId: run.id,\r\n agentOsId,\r\n dryRun: false,\r\n leaseOwner,\r\n startedCount: outcomes.filter((o) => o.started).length,\r\n outcomes,\r\n skipped: (result.skipped as Array<{ task: Record<string, unknown>; skipReason: string }>).map((d) => ({\r\n taskId: d.task.id,\r\n skipReason: d.skipReason,\r\n })),\r\n diskGate: result.diskGate,\r\n resourceGate: result.resourceGate,\r\n };\r\n if (pipeline) {\r\n return { ok: !outcomes.some((o) => !o.started), ...summary };\r\n }\r\n console.log(JSON.stringify(summary, null, 2));\r\n if (outcomes.some((o) => !o.started)) process.exit(1);\r\n } catch (error) {\r\n if (pipeline) return { ok: false, error: (error as Error).message };\r\n console.error(`run dispatch failed: ${(error as Error).message}`);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport { runDirectory };\r\n", "import path from \"node:path\";\r\nimport { resolveBaseUrl, resolveCallbackSecretWithMint } from \"./config.js\";\r\nimport { postJson } from \"./callbacks.js\";\r\nimport { loadRun, runDirectory } from \"./run-store.js\";\r\nimport { computeWorkerStatus } from \"./status.js\";\r\nimport { required, readJson, safeSlug } from \"./util.js\";\r\n\r\nexport async function sweepRun(args: Record<string, string | boolean>): Promise<Record<string, unknown> | void> {\r\n const pipeline = args.pipeline === true || args.pipeline === \"true\";\r\n try {\r\n const run = loadRun(String(required(String(args.run || \"\"), \"--run\")));\r\n const agentOsId = String(required(String(args.agentOsId || \"\"), \"--agent-os-id\"));\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : undefined, agentOsId, { baseUrl: base });\r\n const leaseOwner = `openclaw-harness:${run.id}`;\r\n\r\n const releasedLocalOrphans: Array<Record<string, unknown>> = [];\r\n for (const name of Object.keys(run.workers || {})) {\r\n const worker = readJson<Record<string, unknown>>(\r\n path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n if (!worker || !worker.dispatched || !worker.taskId) continue;\r\n const status = computeWorkerStatus(worker as never);\r\n if (status.alive) continue;\r\n if (status.finalResult) continue;\r\n\r\n const releaseUrl = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/tasks/${encodeURIComponent(String(worker.taskId))}/release`;\r\n let release;\r\n try {\r\n release = await postJson(releaseUrl, secret, { agentOsId, leaseOwner });\r\n } catch (relErr) {\r\n release = { ok: false, error: (relErr as Error).message };\r\n }\r\n releasedLocalOrphans.push({\r\n worker: name,\r\n taskId: worker.taskId,\r\n pid: worker.pid,\r\n released: release.ok === true || (release.response as Record<string, unknown>)?.ok === true,\r\n response: release.response ?? release,\r\n });\r\n }\r\n\r\n const reapUrl = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/tasks/reap`;\r\n let reap;\r\n try {\r\n reap = await postJson(reapUrl, secret, {\r\n agentOsId,\r\n ...(Number(args.graceMs) >= 0 && args.graceMs !== undefined && args.graceMs !== true\r\n ? { graceMs: Math.floor(Number(args.graceMs)) }\r\n : {}),\r\n });\r\n } catch (reapErr) {\r\n reap = { ok: false, error: (reapErr as Error).message };\r\n }\r\n\r\n const summary = { runId: run.id, agentOsId, leaseOwner, releasedLocalOrphans, reap: reap.response ?? reap };\r\n if (pipeline) return { ok: true, ...summary };\r\n console.log(JSON.stringify(summary, null, 2));\r\n } catch (error) {\r\n if (pipeline) return { ok: false, error: (error as Error).message };\r\n console.error(`run sweep failed: ${(error as Error).message}`);\r\n process.exit(1);\r\n }\r\n}\r\n", "import { existsSync, mkdirSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { ensureGitRepo, git } from \"./git.js\";\r\nimport { getPaths } from \"./run-store.js\";\r\nimport { loadRun, runDirectory, saveRun } from \"./run-store.js\";\r\nimport { listRunIds, readJson, required, safeSlug, timestampSlug, writeJson } from \"./util.js\";\r\nimport { validateRepo, validateRunId } from \"./validate.js\";\r\n\r\nexport function createRun(args: Record<string, string | boolean>): void {\r\n const repo = validateRepo(required(String(args.repo || \"\"), \"--repo\"));\r\n ensureGitRepo(repo);\r\n const id = args.id ? validateRunId(String(args.id)) : timestampSlug(String(args.name || \"run\"));\r\n const dir = runDirectory(id);\r\n if (existsSync(dir)) failExists(`run already exists: ${id}`);\r\n mkdirSync(dir, { recursive: true });\r\n const base = String(args.base || \"origin/main\");\r\n const baseCommit = git(repo, [\"rev-parse\", base]).trim();\r\n const run = {\r\n id,\r\n name: String(args.name || id),\r\n repo,\r\n base,\r\n baseCommit,\r\n status: \"created\",\r\n createdAt: new Date().toISOString(),\r\n workers: {},\r\n };\r\n writeJson(path.join(dir, \"run.json\"), run);\r\n console.log(JSON.stringify({ runId: id, runDir: dir, repo, base, baseCommit }, null, 2));\r\n}\r\n\r\nexport function listRuns(): void {\r\n const { runsDir } = getPaths();\r\n const rows = listRunIds(runsDir)\r\n .map((id) => readJson<Record<string, unknown>>(path.join(runDirectory(id), \"run.json\"), undefined))\r\n .filter(Boolean)\r\n .map((run) => ({\r\n id: run!.id,\r\n name: run!.name,\r\n status: run!.status,\r\n repo: run!.repo,\r\n createdAt: run!.createdAt,\r\n }));\r\n console.log(JSON.stringify(rows, null, 2));\r\n}\r\n\r\nfunction failExists(message: string): never {\r\n console.error(message);\r\n process.exit(1);\r\n}\r\n\r\nexport { loadRun, saveRun, runDirectory };\r\n", "import path from \"node:path\";\r\n\r\nconst RUN_ID_RE = /^[a-z0-9][a-z0-9._-]{0,127}$/i;\r\nconst WORKER_NAME_RE = /^[a-z0-9][a-z0-9._-]{0,63}$/i;\r\n\r\nexport function validateRunId(runId: string): string {\r\n const trimmed = runId.trim();\r\n if (!RUN_ID_RE.test(trimmed)) throw new Error(`invalid run id: ${runId}`);\r\n return trimmed;\r\n}\r\n\r\nexport function validateWorkerName(name: string): string {\r\n const trimmed = name.trim();\r\n if (!WORKER_NAME_RE.test(trimmed)) throw new Error(`invalid worker name: ${name}`);\r\n return trimmed;\r\n}\r\n\r\nexport function validateRepo(repo: string): string {\r\n const resolved = path.resolve(repo);\r\n if (resolved.includes(\"..\")) throw new Error(\"repo path must not contain .. segments\");\r\n return resolved;\r\n}\r\n\r\nexport function validateOwnedPaths(repoRoot: string, ownedPaths: string[]): string[] {\r\n return ownedPaths.map((owned) => {\r\n const resolved = path.resolve(repoRoot, owned);\r\n const rel = path.relative(repoRoot, resolved);\r\n if (rel.startsWith(\"..\") || path.isAbsolute(rel)) {\r\n throw new Error(`owned path escapes repo: ${owned}`);\r\n }\r\n return resolved;\r\n });\r\n}\r\n\r\nexport function validateTailLines(lines: number): number {\r\n if (!Number.isFinite(lines) || lines <= 0 || lines > 500) return 40;\r\n return Math.floor(lines);\r\n}\r\n", "import path from \"node:path\";\r\nimport { resolveBaseUrl, resolveCallbackSecretWithMint } from \"./config.js\";\r\nimport { buildHarnessCallbackHeaders } from \"./callback-headers.js\";\r\nimport { loadRun, loadWorker, runDirectory } from \"./run-store.js\";\r\nimport { computeWorkerStatus, deriveRunStatus, isFinishedWorkerStatus } from \"./status.js\";\r\nimport { summarizeEvent } from \"./stream.js\";\r\nimport {\r\n isPidAlive,\r\n killWorkerProcess,\r\n readJson,\r\n required,\r\n safeJson,\r\n safeSlug,\r\n sleepMs,\r\n tailFile,\r\n writeJson,\r\n} from \"./util.js\";\r\n\r\nexport async function tryCompleteWorker(\r\n args: Record<string, string | boolean>,\r\n): Promise<{ ok: boolean; skipped?: boolean; reason?: string; httpStatus?: number; response?: unknown }> {\r\n const worker = loadWorker(String(args.run), String(args.name));\r\n const status = computeWorkerStatus(worker);\r\n const agentOsId = (args.agentOsId ? String(args.agentOsId) : worker.agentOsId) || \"\";\r\n const taskId = (args.taskId ? String(args.taskId) : worker.taskId) || null;\r\n if (!agentOsId) {\r\n return { ok: false, reason: \"missing agentOsId\" };\r\n }\r\n if (!isFinishedWorkerStatus(status)) {\r\n return { ok: true, skipped: true, reason: \"worker-not-finished\" };\r\n }\r\n\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : undefined, agentOsId, { baseUrl: base });\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/harness/completion`;\r\n const body = {\r\n source: \"openclaw-harness\",\r\n agentOsId,\r\n runId: worker.runId,\r\n workerName: worker.name,\r\n taskId,\r\n startedAt: worker.startedAt,\r\n finishedAt: status.lastActivityAt || new Date().toISOString(),\r\n status,\r\n };\r\n\r\n const res = await fetch(url, {\r\n method: \"POST\",\r\n headers: buildHarnessCallbackHeaders(secret),\r\n body: JSON.stringify(body),\r\n });\r\n let parsed: unknown = null;\r\n try {\r\n parsed = await res.json();\r\n } catch {\r\n parsed = null;\r\n }\r\n return { ok: res.ok, httpStatus: res.status, response: parsed };\r\n}\r\n\r\nexport async function completeWorker(args: Record<string, string | boolean>): Promise<void> {\r\n try {\r\n const worker = loadWorker(String(args.run), String(args.name));\r\n const status = computeWorkerStatus(worker);\r\n const agentOsId = (args.agentOsId ? String(args.agentOsId) : worker.agentOsId) || \"\";\r\n const taskId = (args.taskId ? String(args.taskId) : worker.taskId) || null;\r\n if (!agentOsId) {\r\n console.error(\"worker complete requires --agent-os-id (or an agentOsId persisted at worker start)\");\r\n process.exit(1);\r\n }\r\n if (!isFinishedWorkerStatus(status)) {\r\n console.log(\r\n JSON.stringify(\r\n {\r\n worker: worker.name,\r\n runId: worker.runId,\r\n status: \"skipped\",\r\n reason: \"worker-not-finished\",\r\n workerStatus: status.status,\r\n alive: status.alive,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n return;\r\n }\r\n\r\n const result = await tryCompleteWorker(args);\r\n console.log(\r\n JSON.stringify(\r\n {\r\n worker: worker.name,\r\n runId: worker.runId,\r\n agentOsId,\r\n taskId,\r\n httpStatus: result.httpStatus,\r\n response: result.response,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n if (!result.ok) process.exit(1);\r\n } catch (error) {\r\n console.error(`worker complete failed: ${(error as Error).message}`);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport function workerStatus(args: Record<string, string | boolean>): void {\r\n const worker = loadWorker(String(args.run), String(args.name));\r\n const status = computeWorkerStatus(worker);\r\n writeJson(path.join(worker.workerDir, \"last-status.json\"), status);\r\n console.log(JSON.stringify(status, null, 2));\r\n}\r\n\r\nexport function runStatus(args: Record<string, string | boolean>): void {\r\n const run = loadRun(String(args.run));\r\n const names = Object.keys(run.workers || {});\r\n const workers = names.map((name) => {\r\n const worker = readJson<Record<string, unknown>>(\r\n path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n if (!worker) {\r\n return { worker: name, status: \"missing\", attention: \"needs_attention\", attentionReason: \"worker.json not found\" };\r\n }\r\n const status = computeWorkerStatus(worker as never, { base: run.base });\r\n return {\r\n worker: status.worker,\r\n status: status.status,\r\n attention: status.attention.state,\r\n attentionReason: status.attention.reason,\r\n pid: status.pid,\r\n alive: status.alive,\r\n currentTool: status.currentTool,\r\n lastActivityAt: status.lastActivityAt,\r\n lastHeartbeatPhase: status.lastHeartbeatPhase,\r\n lastHeartbeatSummary: status.lastHeartbeatSummary,\r\n heartbeatBlocker: status.heartbeatBlocker,\r\n changedFileCount: status.changedFiles.length,\r\n branch: status.branch,\r\n ancestry: status.gitAncestry.relation,\r\n ancestryChecked: status.gitAncestry.checked,\r\n };\r\n });\r\n const board = {\r\n runId: run.id,\r\n name: run.name,\r\n status: deriveRunStatus(run.status, workers),\r\n repo: run.repo,\r\n workerCount: workers.length,\r\n needsAttention: workers.filter((w) => w.attention && w.attention !== \"ok\" && w.attention !== \"done\").map((w) => w.worker),\r\n workers,\r\n };\r\n writeJson(path.join(runDirectory(run.id), \"last-board.json\"), board);\r\n console.log(JSON.stringify(board, null, 2));\r\n}\r\n\r\nexport function tailWorker(args: Record<string, string | boolean>): void {\r\n const worker = loadWorker(String(args.run), String(args.name));\r\n const raw = tailFile(worker.stdoutPath, Number(args.lines || 40));\r\n if (args.raw === true || args.raw === \"true\") {\r\n process.stdout.write(raw);\r\n return;\r\n }\r\n for (const line of raw.split(\"\\n\").filter(Boolean)) {\r\n const event = safeJson(line) as Record<string, unknown> | null;\r\n const summary = event ? summarizeEvent(event) : line;\r\n if (summary) console.log(summary);\r\n }\r\n}\r\n\r\nexport function stopWorker(args: Record<string, string | boolean>): void {\r\n const worker = loadWorker(String(args.run), String(args.name));\r\n if (!isPidAlive(worker.pid)) {\r\n console.log(JSON.stringify({ worker: worker.name, pid: worker.pid, status: \"not_running\" }, null, 2));\r\n return;\r\n }\r\n killWorkerProcess(worker.pid!, \"SIGTERM\");\r\n sleepMs(1500);\r\n if (isPidAlive(worker.pid)) {\r\n killWorkerProcess(worker.pid!, \"SIGKILL\");\r\n console.log(JSON.stringify({ worker: worker.name, pid: worker.pid, status: \"sigkill_sent\" }, null, 2));\r\n return;\r\n }\r\n console.log(JSON.stringify({ worker: worker.name, pid: worker.pid, status: \"stopped\" }, null, 2));\r\n}\r\n", "import path from \"node:path\";\r\nimport { resolveBaseUrl, resolveCallbackSecretWithMint } from \"./config.js\";\r\nimport { postJson } from \"./callbacks.js\";\r\nimport { dispatchRun } from \"./dispatch.js\";\r\nimport { finalizeStaleRuns, type RunFinalizeResult } from \"./finalize.js\";\r\nimport { observeRunnerResourceGate, type RunnerResourceGateShape } from \"./resource-gate.js\";\r\nimport { loadRun, runDirectory } from \"./run-store.js\";\r\nimport { computeWorkerStatus, isFinishedWorkerStatus } from \"./status.js\";\r\nimport { sweepRun } from \"./sweep.js\";\r\nimport { required, readJson, safeSlug } from \"./util.js\";\r\nimport { syncActiveWorkerPlanProgress } from \"./plan-progress-daemon-sync.js\";\r\nimport { runStatus, tryCompleteWorker } from \"./worker-ops.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\nimport { fetchWorkspaceRuntimePreferences } from \"./workspace-runtime-config.js\";\r\n\r\nexport interface PipelineTickResult {\r\n runId: string;\r\n agentOsId: string;\r\n execute: boolean;\r\n resourceGate: RunnerResourceGateShape;\r\n completedWorkers: Array<{ worker: string; ok: boolean; taskId?: string | null }>;\r\n finalizedStaleRuns: RunFinalizeResult[];\r\n planProgressSync: Array<{ worker: string; phase: string; ok: boolean; skipped?: boolean }>;\r\n operatorTick: unknown;\r\n sweep: unknown;\r\n dispatch: unknown;\r\n idle: boolean;\r\n}\r\n\r\nexport async function completeFinishedWorkers(\r\n runId: string,\r\n args: Record<string, string | boolean>,\r\n): Promise<Array<{ worker: string; ok: boolean; taskId?: string | null }>> {\r\n const run = loadRun(runId);\r\n const outcomes: Array<{ worker: string; ok: boolean; taskId?: string | null }> = [];\r\n for (const name of Object.keys(run.workers || {})) {\r\n const worker = readJson<HarnessWorkerRecord>(\r\n path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n if (!worker?.dispatched || !worker.taskId) continue;\r\n const status = computeWorkerStatus(worker);\r\n if (!isFinishedWorkerStatus(status)) continue;\r\n const result = await tryCompleteWorker({\r\n run: runId,\r\n name,\r\n agentOsId: String(args.agentOsId || worker.agentOsId || \"\"),\r\n ...args,\r\n });\r\n outcomes.push({ worker: name, ok: result.ok, taskId: worker.taskId ?? null });\r\n }\r\n return outcomes;\r\n}\r\n\r\nasync function postOperatorTick(\r\n agentOsId: string,\r\n runId: string,\r\n resourceGate: RunnerResourceGateShape,\r\n args: Record<string, string | boolean>,\r\n): Promise<unknown> {\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : undefined, agentOsId, { baseUrl: base });\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/operator/tick`;\r\n const res = await postJson(url, secret, {\r\n agentOsId,\r\n runId,\r\n ingestHarness: true,\r\n resourceGate,\r\n });\r\n return { ok: res.ok, httpStatus: res.status, response: res.response };\r\n}\r\n\r\n/**\r\n * One operator/dispatcher cycle (M10 / D7 pull-first):\r\n * refresh status \u2192 complete finished workers \u2192 ingest operator tick \u2192 sweep leases \u2192 dispatch up to slot cap.\r\n */\r\nexport async function runPipelineTick(args: Record<string, string | boolean>): Promise<PipelineTickResult> {\r\n const runId = String(required(String(args.run || \"\"), \"--run\"));\r\n const agentOsId = String(required(String(args.agentOsId || \"\"), \"--agent-os-id\"));\r\n const execute = args.execute !== false && args.execute !== \"false\";\r\n\r\n runStatus({ run: runId });\r\n\r\n // Close out runs whose workers have all exited so they stop piling up as\r\n // \"running\" (the box had 40+ stale runs eating 28 GB of worktrees). Global\r\n // active-worker accounting already ignores dead workers; this keeps run\r\n // status truthful and lets stale worktrees be pruned safely.\r\n const finalizedStaleRuns = finalizeStaleRuns();\r\n\r\n const completedWorkers = await completeFinishedWorkers(runId, args);\r\n const planProgressSync = await syncActiveWorkerPlanProgress(runId, args);\r\n const workspacePrefs = await fetchWorkspaceRuntimePreferences(agentOsId, args);\r\n const resourceGate = observeRunnerResourceGate({\r\n runId,\r\n configuredMaxWorkersOverride: workspacePrefs?.maxConcurrentWorkers,\r\n });\r\n const operatorTick = await postOperatorTick(agentOsId, runId, resourceGate, args);\r\n\r\n let maxStarts = resourceGate.slotsAvailable;\r\n const tickBody = operatorTick as { response?: { dispatch?: { recommendedMaxStarts?: number } } };\r\n const advised = tickBody.response?.dispatch?.recommendedMaxStarts;\r\n if (typeof advised === \"number\") {\r\n maxStarts = Math.min(maxStarts, Math.max(0, advised));\r\n }\r\n\r\n const sweep = await sweepRun({ run: runId, agentOsId, pipeline: true, ...args });\r\n\r\n let dispatch: unknown = null;\r\n if (execute && maxStarts > 0) {\r\n dispatch = await dispatchRun({\r\n run: runId,\r\n agentOsId,\r\n execute: true,\r\n maxStarts: String(maxStarts),\r\n pipeline: true,\r\n ...args,\r\n });\r\n } else {\r\n dispatch = {\r\n ok: true,\r\n skipped: true,\r\n reason: execute ? resourceGate.reason ?? \"no slots or queued work\" : \"execute disabled\",\r\n maxStarts: 0,\r\n };\r\n }\r\n\r\n const startedCount = (dispatch as { startedCount?: number })?.startedCount ?? 0;\r\n const idle = maxStarts === 0 && completedWorkers.length === 0 && startedCount === 0;\r\n\r\n return {\r\n runId,\r\n agentOsId,\r\n execute,\r\n resourceGate,\r\n completedWorkers,\r\n finalizedStaleRuns,\r\n planProgressSync,\r\n operatorTick,\r\n sweep,\r\n dispatch,\r\n idle,\r\n };\r\n}\r\n", "import path from \"node:path\";\r\nimport { listRunRecords, runDirectory, saveRun, type HarnessRunRecord } from \"./run-store.js\";\r\nimport { computeWorkerStatus } from \"./status.js\";\r\nimport { readJson, safeSlug } from \"./util.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\n\r\nexport interface RunFinalizeResult {\r\n runId: string;\r\n from: string;\r\n to: string;\r\n}\r\n\r\n/** Run statuses we treat as \"not yet terminal\" and therefore candidates for finalization. */\r\nconst ACTIVE_RUN_STATUSES = new Set([\"running\", \"dispatching\", \"pending\", \"queued\"]);\r\n\r\n/**\r\n * Decide the terminal status for a run, or null if it should stay active.\r\n * A run is terminal once none of its workers are still alive-and-unfinished.\r\n */\r\nfunction terminalStatusFor(run: HarnessRunRecord): string | null {\r\n const names = Object.keys(run.workers || {});\r\n if (names.length === 0) return \"failed\"; // marked active but never started a worker\r\n let anyAlive = false;\r\n let anyResult = false;\r\n for (const name of names) {\r\n const worker = readJson<HarnessWorkerRecord | undefined>(\r\n path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n if (!worker) continue;\r\n const status = computeWorkerStatus(worker);\r\n if (status.alive && !status.finalResult) {\r\n anyAlive = true;\r\n break;\r\n }\r\n if (status.finalResult) anyResult = true;\r\n }\r\n if (anyAlive) return null; // still doing real work \u2014 leave it running\r\n return anyResult ? \"completed\" : \"failed\";\r\n}\r\n\r\n/**\r\n * Finalize runs that are still marked active but have no live workers.\r\n *\r\n * The harness creates one run per task and never closed them out, leaving dozens\r\n * of \"running\" runs that bloated disk and broke operator views (and made cleanup\r\n * unsafe to reason about). Active-worker accounting already excludes dead workers,\r\n * so this is about run-status hygiene + enabling safe pruning of finished runs.\r\n *\r\n * Returns the runs whose status changed.\r\n */\r\nexport function finalizeStaleRuns(): RunFinalizeResult[] {\r\n const finalized: RunFinalizeResult[] = [];\r\n for (const run of listRunRecords()) {\r\n if (!ACTIVE_RUN_STATUSES.has(run.status)) continue;\r\n const next = terminalStatusFor(run);\r\n if (!next || next === run.status) continue;\r\n const from = run.status;\r\n run.status = next;\r\n saveRun(run);\r\n finalized.push({ runId: run.id, from, to: next });\r\n }\r\n return finalized;\r\n}\r\n", "import path from \"node:path\";\r\nimport { computeWorkerStatus } from \"./status.js\";\r\nimport { loadRun, runDirectory, saveWorker } from \"./run-store.js\";\r\nimport { readJson, safeSlug } from \"./util.js\";\r\nimport { syncPlanProgress } from \"./plan-progress-sync.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\n\r\n/** Push heartbeat blockers to the server orchestrator (deduped per worker). */\r\nexport async function syncActiveWorkerPlanProgress(\r\n runId: string,\r\n args: Record<string, string | boolean>,\r\n): Promise<Array<{ worker: string; phase: string; ok: boolean; skipped?: boolean }>> {\r\n const run = loadRun(runId);\r\n const agentOsId = String(args.agentOsId || \"\");\r\n if (!agentOsId) return [];\r\n\r\n const outcomes: Array<{ worker: string; phase: string; ok: boolean; skipped?: boolean }> = [];\r\n for (const name of Object.keys(run.workers || {})) {\r\n const worker = readJson<HarnessWorkerRecord>(\r\n path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n if (!worker?.dispatched || !worker.taskId) continue;\r\n\r\n const status = computeWorkerStatus(worker);\r\n if (!status.heartbeatBlocker) continue;\r\n\r\n if (worker.lastSyncedHeartbeatBlocker === status.heartbeatBlocker) {\r\n outcomes.push({ worker: name, phase: \"heartbeat_blocker\", ok: true, skipped: true });\r\n continue;\r\n }\r\n\r\n const res = await syncPlanProgress({\r\n agentOsId,\r\n taskId: worker.taskId,\r\n phase: \"heartbeat_blocker\",\r\n blocker: status.heartbeatBlocker,\r\n baseUrl: args.baseUrl ? String(args.baseUrl) : undefined,\r\n secret: args.secret ? String(args.secret) : undefined,\r\n });\r\n if (res.ok) {\r\n worker.lastSyncedHeartbeatBlocker = status.heartbeatBlocker;\r\n saveWorker(run.id, worker);\r\n }\r\n outcomes.push({ worker: name, phase: \"heartbeat_blocker\", ok: res.ok });\r\n }\r\n\r\n return outcomes;\r\n}\r\n", "import { resolveBaseUrl, resolveCallbackSecretWithMint } from \"./config.js\";\r\nimport { postJson } from \"./callbacks.js\";\r\n\r\nexport type PlanProgressSyncPhase = \"worker_dispatched\" | \"worker_completed\" | \"heartbeat_blocker\";\r\n\r\nexport interface PlanProgressSyncArtifact {\r\n branch?: string;\r\n worktreePath?: string;\r\n prUrl?: string;\r\n headCommit?: string;\r\n changedFiles?: string[];\r\n}\r\n\r\nexport async function syncPlanProgress(args: {\r\n agentOsId: string;\r\n taskId: string;\r\n phase: PlanProgressSyncPhase;\r\n blocker?: string;\r\n artifact?: PlanProgressSyncArtifact;\r\n baseUrl?: string;\r\n secret?: string;\r\n}): Promise<{ ok: boolean; status: number; response: unknown }> {\r\n const base = resolveBaseUrl(args.baseUrl);\r\n const secret = await resolveCallbackSecretWithMint(args.secret, args.agentOsId, { baseUrl: base });\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(args.agentOsId)}/tasks/${encodeURIComponent(args.taskId)}/plan-progress-sync`;\r\n const res = await postJson(url, secret, {\r\n phase: args.phase,\r\n taskId: args.taskId,\r\n blocker: args.blocker,\r\n artifact: args.artifact,\r\n });\r\n return { ok: res.ok, status: res.status, response: res.response };\r\n}\r\n", "import { getJson } from \"./callbacks.js\";\r\nimport { resolveBaseUrl, resolveCallbackSecretWithMint } from \"./config.js\";\r\n\r\nexport interface WorkspaceRuntimePreferences {\r\n maxConcurrentWorkers: number | null;\r\n}\r\n\r\n/**\r\n * Pull the Command Center worker cap each pipeline tick so the daemon honors\r\n * workspace settings without restarting or editing ~/.kynver/config.json.\r\n */\r\nexport async function fetchWorkspaceRuntimePreferences(\r\n agentOsId: string,\r\n args: Record<string, string | boolean>,\r\n): Promise<WorkspaceRuntimePreferences | null> {\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : undefined, agentOsId, { baseUrl: base });\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/runtime`;\r\n\r\n try {\r\n const res = await getJson(url, secret);\r\n if (!res.ok) return null;\r\n const body = res.response as { preferences?: { maxConcurrentWorkers?: unknown } } | null;\r\n const raw = body?.preferences?.maxConcurrentWorkers;\r\n if (raw === null || raw === undefined) {\r\n return { maxConcurrentWorkers: null };\r\n }\r\n const n = Number(raw);\r\n if (!Number.isFinite(n) || n <= 0) return { maxConcurrentWorkers: null };\r\n return { maxConcurrentWorkers: Math.floor(n) };\r\n } catch {\r\n return null;\r\n }\r\n}\r\n", "import { loadUserConfig } from \"./config.js\";\r\nimport { required, sleepMs } from \"./util.js\";\r\nimport { runPipelineTick } from \"./pipeline-tick.js\";\r\n\r\nconst DEFAULT_INTERVAL_MS = 60_000;\r\nconst IDLE_INTERVAL_MS = 5 * 60_000;\r\nconst MAX_IDLE_STREAK = 10;\r\n\r\nexport async function runDaemon(args: Record<string, string | boolean>): Promise<void> {\r\n const runId = String(required(String(args.run || \"\"), \"--run\"));\r\n const agentOsId = String(required(String(args.agentOsId || loadUserConfig().agentOsId || \"\"), \"--agent-os-id\"));\r\n const execute = args.execute !== false && args.execute !== \"false\";\r\n const intervalMs = Number(args.intervalMs) > 0 ? Math.floor(Number(args.intervalMs)) : DEFAULT_INTERVAL_MS;\r\n let stopping = false;\r\n let idleStreak = 0;\r\n\r\n process.on(\"SIGINT\", () => {\r\n stopping = true;\r\n });\r\n process.on(\"SIGTERM\", () => {\r\n stopping = true;\r\n });\r\n\r\n console.error(JSON.stringify({ event: \"daemon_start\", runId, agentOsId, execute, intervalMs }));\r\n\r\n while (!stopping) {\r\n try {\r\n const tick = await runPipelineTick({ run: runId, agentOsId, execute, ...args });\r\n console.error(JSON.stringify({ event: \"daemon_tick\", ...tick }));\r\n\r\n if (tick.idle) {\r\n idleStreak++;\r\n } else {\r\n idleStreak = 0;\r\n }\r\n\r\n const backoff = idleStreak >= MAX_IDLE_STREAK ? IDLE_INTERVAL_MS : intervalMs;\r\n sleepMs(backoff);\r\n } catch (error) {\r\n console.error(JSON.stringify({ event: \"daemon_tick_error\", error: (error as Error).message }));\r\n sleepMs(intervalMs);\r\n }\r\n }\r\n\r\n console.error(JSON.stringify({ event: \"daemon_stop\", runId, agentOsId }));\r\n}\r\n\r\nexport { runPipelineTick } from \"./pipeline-tick.js\";\r\nexport { dispatchRun } from \"./dispatch.js\";\r\nexport { sweepRun } from \"./sweep.js\";\r\nexport { completeWorker } from \"./worker-ops.js\";\r\n", "import { resolveBaseUrl, resolveCallbackSecretWithMint, loadUserConfig } from \"./config.js\";\r\nimport { buildHarnessCallbackHeaders } from \"./callback-headers.js\";\r\nimport { required } from \"./util.js\";\r\n\r\nexport interface PlanProgressCliEvidence {\r\n type: string;\r\n value: string;\r\n exitCode?: number;\r\n stdoutTail?: string;\r\n}\r\n\r\nfunction parseEvidenceArg(raw: string): PlanProgressCliEvidence {\r\n const idx = raw.indexOf(\":\");\r\n if (idx <= 0) throw new Error(`invalid --evidence ${raw} (expected type:value)`);\r\n return { type: raw.slice(0, idx), value: raw.slice(idx + 1) };\r\n}\r\n\r\nexport async function emitPlanProgress(args: Record<string, string | boolean>): Promise<void> {\r\n const planId = required(args.plan ? String(args.plan) : undefined, \"plan\");\r\n const agentOsId =\r\n (args.agentOsId ? String(args.agentOsId) : loadUserConfig().agentOsId) || \"\";\r\n if (!agentOsId) {\r\n console.error(\"requires --agent-os-id or agentOsId in ~/.kynver/config.json\");\r\n process.exit(1);\r\n }\r\n\r\n const roleLane = required(args.role ? String(args.role) : undefined, \"role\");\r\n const status = required(args.status ? String(args.status) : undefined, \"status\");\r\n const evidence: PlanProgressCliEvidence[] = [];\r\n const rawEvidence = args.evidence;\r\n if (Array.isArray(rawEvidence)) {\r\n for (const item of rawEvidence) evidence.push(parseEvidenceArg(String(item)));\r\n } else if (typeof rawEvidence === \"string\") {\r\n evidence.push(parseEvidenceArg(rawEvidence));\r\n }\r\n\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : undefined, agentOsId, { baseUrl: base });\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/plans/${encodeURIComponent(planId)}/progress-events`;\r\n const cfg = loadUserConfig();\r\n const provider = cfg.workerProvider ? `provider:${cfg.workerProvider}` : undefined;\r\n\r\n const body = {\r\n rowKey: args.row ? String(args.row) : undefined,\r\n rowId: args.rowId ? String(args.rowId) : undefined,\r\n taskId: args.task ? String(args.task) : undefined,\r\n reviewTaskId: args.reviewTask ? String(args.reviewTask) : undefined,\r\n roleLane,\r\n status,\r\n note: args.note ? String(args.note) : undefined,\r\n remainingWork: args.remaining ? String(args.remaining) : undefined,\r\n evidence: evidence.length ? evidence : undefined,\r\n proposed: args.proposed === true || args.proposed === \"true\",\r\n executorRef: args.executorRef ? String(args.executorRef) : provider,\r\n };\r\n\r\n const res = await fetch(url, {\r\n method: \"POST\",\r\n headers: buildHarnessCallbackHeaders(secret),\r\n body: JSON.stringify(body),\r\n });\r\n\r\n const text = await res.text();\r\n let parsed: unknown = null;\r\n try {\r\n parsed = JSON.parse(text);\r\n } catch {\r\n parsed = text;\r\n }\r\n if (!res.ok) {\r\n console.error(JSON.stringify({ httpStatus: res.status, response: parsed }, null, 2));\r\n process.exit(1);\r\n }\r\n console.log(JSON.stringify(parsed, null, 2));\r\n}\r\n\r\nexport async function verifyPlan(args: Record<string, string | boolean>): Promise<void> {\r\n const planId = required(args.plan ? String(args.plan) : undefined, \"plan\");\r\n const slug = loadUserConfig().agentOsSlug;\r\n if (!slug) {\r\n console.error(\"requires agentOsSlug in ~/.kynver/config.json for verify (session route)\");\r\n process.exit(1);\r\n }\r\n\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const apiKey = process.env.KYNVER_API_KEY;\r\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\r\n if (apiKey) headers.Authorization = `Bearer ${apiKey}`;\r\n\r\n const url = `${base}/api/agent-os/${encodeURIComponent(slug)}/plans/${encodeURIComponent(planId)}/verify`;\r\n const res = await fetch(url, {\r\n method: \"POST\",\r\n headers,\r\n body: JSON.stringify({\r\n worktreePath: args.worktree ? String(args.worktree) : undefined,\r\n taskId: args.task ? String(args.task) : undefined,\r\n humanOverride: args.humanOverride === true || args.humanOverride === \"true\",\r\n }),\r\n });\r\n\r\n const text = await res.text();\r\n let parsed: unknown = null;\r\n try {\r\n parsed = JSON.parse(text);\r\n } catch {\r\n parsed = text;\r\n }\r\n if (!res.ok) {\r\n console.error(JSON.stringify({ httpStatus: res.status, response: parsed }, null, 2));\r\n process.exit(1);\r\n }\r\n console.log(JSON.stringify(parsed, null, 2));\r\n}\r\n"],
5
- "mappings": "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",
6
- "names": ["mkdirSync", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "path", "path", "existsSync", "readFileSync", "mkdirSync", "writeFileSync", "path", "readFileSync", "path", "existsSync", "readdirSync", "path", "existsSync", "homedir", "path", "path", "homedir", "existsSync", "path", "existsSync", "readdirSync", "existsSync", "readFileSync", "existsSync", "readFileSync", "existsSync", "readFileSync", "existsSync", "readFileSync", "readFileSync", "path", "existsSync", "mkdirSync", "path", "closeSync", "existsSync", "openSync", "readdirSync", "spawn", "path", "path", "mkdirSync", "existsSync", "summary", "path", "path", "existsSync", "mkdirSync", "path", "path", "path", "existsSync", "mkdirSync", "path", "path", "path", "path", "path", "path", "path", "path", "path", "mkdirSync"]
3
+ "sources": ["../src/cli.ts", "../src/config.ts", "../src/util.ts", "../src/callback-headers.ts", "../src/callbacks.ts", "../src/disk-gate.ts", "../src/resource-gate.ts", "../src/run-store.ts", "../src/paths.ts", "../src/heartbeat.ts", "../src/stream.ts", "../src/git.ts", "../src/status.ts", "../src/supervisor.ts", "../src/prompt.ts", "../src/providers/claude.ts", "../src/providers/cursor.ts", "../src/providers/registry.ts", "../src/auto-complete.ts", "../src/worker-ops.ts", "../src/dispatch.ts", "../src/sweep.ts", "../src/worktree.ts", "../src/validate.ts", "../src/pipeline-tick.ts", "../src/finalize.ts", "../src/plan-progress-daemon-sync.ts", "../src/plan-progress-sync.ts", "../src/workspace-runtime-config.ts", "../src/daemon.ts", "../src/plan-progress.ts"],
4
+ "sourcesContent": ["#!/usr/bin/env node\r\nimport { mkdirSync, realpathSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { fileURLToPath } from \"node:url\";\r\nimport { parseArgs, runLogin, runSetup, mintRunnerCredential } from \"./config.js\";\r\nimport { dispatchRun } from \"./dispatch.js\";\r\nimport { getPaths } from \"./run-store.js\";\r\nimport { startWorker } from \"./supervisor.js\";\r\nimport { sweepRun } from \"./sweep.js\";\r\nimport { createRun, listRuns } from \"./worktree.js\";\r\nimport { completeWorker, runStatus, stopWorker, tailWorker, workerStatus } from \"./worker-ops.js\";\r\nimport { autoCompleteWorkerCli } from \"./auto-complete.js\";\r\nimport { runDaemon } from \"./daemon.js\";\r\nimport { emitPlanProgress, verifyPlan } from \"./plan-progress.js\";\r\n\r\nfunction isHelpFlag(arg: string): boolean {\r\n return arg === \"help\" || arg === \"--help\" || arg === \"-h\";\r\n}\r\n\r\nfunction unknownCommand(scope?: string, action?: string): never {\r\n const cmd = [scope, action].filter(Boolean).join(\" \");\r\n console.error(`unknown command: ${cmd || \"(none)\"}`);\r\n usage(1);\r\n}\r\n\r\nexport function usage(code = 0): never {\r\n const out = code === 0 ? console.log : console.error;\r\n out(\r\n [\r\n \"Usage:\",\r\n \" kynver login --api-key KEY\",\r\n \" kynver runner credential [--agent-os-id ID] [--base-url URL]\",\r\n \" kynver setup [--api-base-url URL] [--agent-os-id ID] [--agent-os-slug SLUG] [--repo PATH] [--max-workers N] [--provider claude|cursor]\",\r\n \" kynver daemon --run RUN_ID --agent-os-id AOS_ID [--execute] [--interval-ms MS]\",\r\n \" kynver run create --repo /path/repo [--name name] [--base origin/main]\",\r\n \" kynver run list\",\r\n \" kynver run status --run RUN_ID\",\r\n \" kynver run dispatch --run RUN_ID --agent-os-id AOS_ID [--base-url URL] [--secret SECRET] [--execute] [--lane any|implementation|review|landing] [--max-starts 1] [--lease-ms MS] [--owned path[,path]] [--model claude-opus-4-7] [--disk-path /]\",\r\n \" kynver run sweep --run RUN_ID --agent-os-id AOS_ID [--base-url URL] [--secret SECRET] [--grace-ms MS]\",\r\n \" kynver worker start --run RUN_ID --name worker --task \\\"...\\\" [--owned path[,path]] [--model MODEL] [--provider claude|cursor] [--agent-os-id AOS_ID] [--task-id TASK_ID]\",\r\n \" kynver worker status --run RUN_ID --name worker\",\r\n \" kynver worker tail --run RUN_ID --name worker [--lines 40] [--raw]\",\r\n \" kynver worker stop --run RUN_ID --name worker\",\r\n \" kynver worker complete --run RUN_ID --name worker [--agent-os-id AOS_ID] [--task-id TASK_ID] [--base-url URL] [--secret SECRET]\",\r\n \" kynver worker auto-complete --run RUN_ID --name worker [--agent-os-id AOS_ID] [--poll-ms 5000] [--max-total-ms 21600000] [--complete-attempts 3] [--complete-backoff-ms 5000] [--base-url URL] [--secret SECRET]\",\r\n \" kynver plan progress --plan PLAN_ID --row ROW_KEY --role ROLE --status STATUS [--task TASK_ID] [--note NOTE] [--evidence type:value] [--agent-os-id AOS_ID]\",\r\n \" kynver plan verify --plan PLAN_ID [--worktree PATH] [--task TASK_ID] [--human-override]\",\r\n ].join(\"\\n\"),\r\n );\r\n process.exit(code);\r\n}\r\n\r\nexport async function main(argv = process.argv.slice(2)): Promise<void> {\r\n if (argv.length === 0 || isHelpFlag(argv[0]!)) return usage(0);\r\n\r\n const scope = argv.shift();\r\n let action: string | undefined;\r\n let rest: string[];\r\n\r\n if (scope === \"run\" || scope === \"worker\" || scope === \"plan\" || scope === \"runner\") {\r\n action = argv.shift();\r\n rest = argv;\r\n } else {\r\n rest = argv;\r\n }\r\n\r\n if ((action && isHelpFlag(action)) || rest.some(isHelpFlag)) return usage(0);\r\n\r\n const args = parseArgs(rest);\r\n const { runsDir, worktreesDir } = getPaths();\r\n mkdirSync(runsDir, { recursive: true });\r\n mkdirSync(worktreesDir, { recursive: true });\r\n\r\n if (scope === \"login\") return void (await runLogin(args));\r\n if (scope === \"runner\" && action === \"credential\") return void (await mintRunnerCredential(args));\r\n if (scope === \"setup\") return void (await runSetup(args));\r\n if (scope === \"daemon\") return void (await runDaemon(args));\r\n if (scope === \"plan\" && action === \"progress\") return void (await emitPlanProgress(args));\r\n if (scope === \"plan\" && action === \"verify\") return void (await verifyPlan(args));\r\n\r\n if (scope === \"run\" && action === \"create\") return createRun(args);\r\n if (scope === \"run\" && action === \"list\") return listRuns();\r\n if (scope === \"run\" && action === \"status\") return runStatus(args);\r\n if (scope === \"run\" && action === \"dispatch\") return void (await dispatchRun(args));\r\n if (scope === \"run\" && action === \"sweep\") return void (await sweepRun(args));\r\n if (scope === \"worker\" && action === \"start\") return startWorker(args);\r\n if (scope === \"worker\" && action === \"status\") return workerStatus(args);\r\n if (scope === \"worker\" && action === \"tail\") return tailWorker(args);\r\n if (scope === \"worker\" && action === \"stop\") return stopWorker(args);\r\n if (scope === \"worker\" && action === \"complete\") return void (await completeWorker(args));\r\n if (scope === \"worker\" && action === \"auto-complete\") return void (await autoCompleteWorkerCli(args));\r\n\r\n unknownCommand(scope, action);\r\n}\r\n\r\nconst isCliEntry =\r\n process.argv[1] &&\r\n realpathSync.native(process.argv[1]) === realpathSync.native(fileURLToPath(import.meta.url));\r\n\r\nif (isCliEntry) {\r\n void main().catch((error) => {\r\n console.error(error);\r\n process.exit(1);\r\n });\r\n}\r\n", "import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport { trimTrailingSlash } from \"./util.js\";\r\n\r\nexport interface KynverUserConfig {\r\n apiBaseUrl?: string;\r\n agentOsSlug?: string;\r\n agentOsId?: string;\r\n defaultRepo?: string;\r\n workerProvider?: string;\r\n harnessRoot?: string;\r\n /** Max concurrent workers on this machine. Omit to auto-size from RAM. */\r\n maxConcurrentWorkers?: number;\r\n /** @internal Advanced tuning \u2014 not required for setup. */\r\n perWorkerMemBytes?: number;\r\n /** @internal Advanced tuning \u2014 not required for setup. */\r\n memReserveBytes?: number;\r\n /** @internal Advanced tuning \u2014 not required for setup. */\r\n memUtilization?: number;\r\n}\r\n\r\nconst CONFIG_DIR = path.join(homedir(), \".kynver\");\r\nconst CONFIG_FILE = path.join(CONFIG_DIR, \"config.json\");\r\nconst CREDENTIALS_FILE = path.join(CONFIG_DIR, \"credentials\");\r\n\r\ninterface KynverCredentialsFile {\r\n apiKey?: string;\r\n /** Scoped `krc1.*` runner token for AgentOS by-id callbacks. */\r\n runnerToken?: string;\r\n runnerTokenAgentOsId?: string;\r\n}\r\n\r\nexport function loadUserConfig(): KynverUserConfig {\r\n if (!existsSync(CONFIG_FILE)) return {};\r\n try {\r\n return JSON.parse(readFileSync(CONFIG_FILE, \"utf8\")) as KynverUserConfig;\r\n } catch {\r\n return {};\r\n }\r\n}\r\n\r\nexport function saveUserConfig(config: KynverUserConfig): void {\r\n mkdirSync(CONFIG_DIR, { recursive: true });\r\n writeFileSync(CONFIG_FILE, `${JSON.stringify(config, null, 2)}\\n`, { mode: 0o600 });\r\n}\r\n\r\nfunction loadCredentialsFile(): KynverCredentialsFile {\r\n if (!existsSync(CREDENTIALS_FILE)) return {};\r\n try {\r\n return JSON.parse(readFileSync(CREDENTIALS_FILE, \"utf8\")) as KynverCredentialsFile;\r\n } catch {\r\n return {};\r\n }\r\n}\r\n\r\nfunction saveCredentialsFile(parsed: KynverCredentialsFile): void {\r\n mkdirSync(CONFIG_DIR, { recursive: true });\r\n writeFileSync(CREDENTIALS_FILE, `${JSON.stringify(parsed, null, 2)}\\n`, { mode: 0o600 });\r\n}\r\n\r\nexport function loadApiKey(): string | undefined {\r\n if (process.env.KYNVER_API_KEY) return process.env.KYNVER_API_KEY;\r\n return loadCredentialsFile().apiKey;\r\n}\r\n\r\nexport function saveApiKey(apiKey: string): void {\r\n saveCredentialsFile({ ...loadCredentialsFile(), apiKey });\r\n}\r\n\r\nexport function loadRunnerToken(agentOsId?: string): string | undefined {\r\n const envToken = process.env.KYNVER_RUNNER_TOKEN?.trim();\r\n if (envToken) return envToken;\r\n\r\n const creds = loadCredentialsFile();\r\n if (!creds.runnerToken) return undefined;\r\n if (agentOsId && creds.runnerTokenAgentOsId && creds.runnerTokenAgentOsId !== agentOsId) {\r\n return undefined;\r\n }\r\n return creds.runnerToken;\r\n}\r\n\r\nexport function saveRunnerToken(agentOsId: string, token: string): void {\r\n saveCredentialsFile({\r\n ...loadCredentialsFile(),\r\n runnerToken: token,\r\n runnerTokenAgentOsId: agentOsId,\r\n });\r\n}\r\n\r\nexport function resolveBaseUrl(argsBaseUrl?: string): string {\r\n const baseUrl = resolveConfiguredBaseUrl(argsBaseUrl);\r\n if (!baseUrl) failConfig(\"requires --base-url, KYNVER_API_URL, OPENCLAW_CRON_FIRE_BASE_URL, or ~/.kynver/config.json apiBaseUrl\");\r\n return baseUrl;\r\n}\r\n\r\nfunction resolveConfiguredBaseUrl(argsBaseUrl?: string): string | undefined {\r\n const baseUrl =\r\n argsBaseUrl ||\r\n process.env.KYNVER_API_URL ||\r\n process.env.OPENCLAW_CRON_FIRE_BASE_URL ||\r\n loadUserConfig().apiBaseUrl;\r\n return baseUrl ? trimTrailingSlash(String(baseUrl)) : undefined;\r\n}\r\n\r\nfunction resolveConfiguredCallbackSecret(argsSecret?: string, agentOsId?: string): string | undefined {\r\n const scoped =\r\n argsSecret ||\r\n loadRunnerToken(agentOsId) ||\r\n loadRunnerToken(loadUserConfig().agentOsId);\r\n if (scoped) return String(scoped);\r\n\r\n const globalSecret = process.env.KYNVER_RUNTIME_SECRET || process.env.OPENCLAW_CRON_SECRET;\r\n if (globalSecret) {\r\n console.warn(\r\n \"[kynver] using deployment-level callback secret; run `kynver runner credential --agent-os-id <id>` for a scoped token\",\r\n );\r\n return String(globalSecret);\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nexport function resolveCallbackSecret(argsSecret?: string, agentOsId?: string): string {\r\n const configured = resolveConfiguredCallbackSecret(argsSecret, agentOsId);\r\n if (configured) return configured;\r\n\r\n failConfig(\r\n \"requires --secret, KYNVER_RUNNER_TOKEN, a scoped runner token (`kynver runner credential`), ~/.kynver/credentials runnerToken, KYNVER_API_KEY with an API base URL to mint one, or (legacy) KYNVER_RUNTIME_SECRET / OPENCLAW_CRON_SECRET\",\r\n );\r\n}\r\n\r\nexport async function resolveCallbackSecretWithMint(\r\n argsSecret?: string,\r\n agentOsId?: string,\r\n opts?: { baseUrl?: string },\r\n): Promise<string> {\r\n const configured = resolveConfiguredCallbackSecret(argsSecret, agentOsId);\r\n if (configured) return configured;\r\n\r\n const apiKey = loadApiKey();\r\n const baseUrl = resolveConfiguredBaseUrl(opts?.baseUrl);\r\n if (apiKey && agentOsId && baseUrl) {\r\n try {\r\n const token = await fetchRunnerCredential(agentOsId, { baseUrl, apiKey });\r\n saveRunnerToken(agentOsId, token);\r\n return token;\r\n } catch (error) {\r\n failConfig(`runner credential mint failed: ${(error as Error).message}`);\r\n }\r\n }\r\n\r\n failConfig(\r\n \"requires --secret, KYNVER_RUNNER_TOKEN, a scoped runner token (`kynver runner credential`), ~/.kynver/credentials runnerToken, KYNVER_API_KEY with an API base URL to mint one, or (legacy) KYNVER_RUNTIME_SECRET / OPENCLAW_CRON_SECRET\",\r\n );\r\n}\r\n\r\n/**\r\n * Force-mint a fresh scoped runner token for `agentOsId`, bypassing any cached\r\n * or env token. Recovery path for a callback that 401s because the configured\r\n * token is revoked, expired, or scoped to a *different* workspace (the\r\n * self-linked repair case). Requires an API key + base URL to mint; returns\r\n * `null` when a fresh token cannot be obtained, so the caller degrades to a\r\n * structural blocker instead of papering the worker over as done.\r\n */\r\nexport async function refreshRunnerToken(\r\n agentOsId: string,\r\n opts?: { baseUrl?: string },\r\n): Promise<string | null> {\r\n const apiKey = loadApiKey();\r\n const baseUrl = resolveConfiguredBaseUrl(opts?.baseUrl);\r\n if (!apiKey || !agentOsId || !baseUrl) return null;\r\n try {\r\n const token = await fetchRunnerCredential(agentOsId, { baseUrl, apiKey });\r\n saveRunnerToken(agentOsId, token);\r\n return token;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport async function fetchRunnerCredential(\r\n agentOsId: string,\r\n opts?: { baseUrl?: string; apiKey?: string },\r\n): Promise<string> {\r\n const apiKey = opts?.apiKey || loadApiKey();\r\n if (!apiKey) throw new Error(\"API key required \u2014 run `kynver login` first\");\r\n\r\n const base = resolveBaseUrl(opts?.baseUrl);\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/runner-credentials`;\r\n const res = await fetch(url, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${apiKey}`,\r\n },\r\n body: JSON.stringify({}),\r\n });\r\n\r\n const text = await res.text();\r\n let parsed: { token?: string; error?: string } | null = null;\r\n try {\r\n parsed = JSON.parse(text) as { token?: string; error?: string };\r\n } catch {\r\n parsed = null;\r\n }\r\n if (!res.ok || !parsed?.token) {\r\n throw new Error(\r\n `runner credential mint failed (${res.status}): ${parsed?.error ?? text.slice(0, 200)}`,\r\n );\r\n }\r\n return parsed.token;\r\n}\r\n\r\nexport async function mintRunnerCredential(args: Record<string, string | boolean>): Promise<void> {\r\n const agentOsId =\r\n (args.agentOsId ? String(args.agentOsId) : loadUserConfig().agentOsId) || \"\";\r\n if (!agentOsId) failConfig(\"runner credential requires --agent-os-id or agentOsId in ~/.kynver/config.json\");\r\n\r\n try {\r\n const token = await fetchRunnerCredential(agentOsId, {\r\n baseUrl: args.baseUrl ? String(args.baseUrl) : undefined,\r\n });\r\n saveRunnerToken(agentOsId, token);\r\n console.log(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n agentOsId,\r\n credentialsPath: CREDENTIALS_FILE,\r\n tokenPrefix: `${token.slice(0, 12)}\u2026`,\r\n note: \"Scoped runner token saved; callbacks use X-Kynver-Runner-Token.\",\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n } catch (err) {\r\n console.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction failConfig(message: string): never {\r\n console.error(message);\r\n process.exit(1);\r\n}\r\n\r\nexport function parseArgs(argv: string[]): Record<string, string | boolean> {\r\n const args: Record<string, string | boolean> = {};\r\n for (let i = 0; i < argv.length; i++) {\r\n const item = argv[i];\r\n if (!item.startsWith(\"--\")) continue;\r\n const key = item.slice(2).replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\r\n const next = argv[i + 1];\r\n if (!next || next.startsWith(\"--\")) args[key] = true;\r\n else {\r\n args[key] = next;\r\n i++;\r\n }\r\n }\r\n return args;\r\n}\r\n\r\nexport async function runSetup(args: Record<string, string | boolean>): Promise<void> {\r\n const existing = loadUserConfig();\r\n const maxWorkersRaw =\r\n typeof args.maxWorkers === \"string\"\r\n ? args.maxWorkers\r\n : typeof args.maxConcurrentWorkers === \"string\"\r\n ? args.maxConcurrentWorkers\r\n : undefined;\r\n const config: KynverUserConfig = {\r\n ...existing,\r\n ...(typeof args.apiBaseUrl === \"string\" ? { apiBaseUrl: args.apiBaseUrl } : {}),\r\n ...(typeof args.agentOsSlug === \"string\" ? { agentOsSlug: args.agentOsSlug } : {}),\r\n ...(typeof args.agentOsId === \"string\" ? { agentOsId: args.agentOsId } : {}),\r\n ...(typeof args.repo === \"string\" ? { defaultRepo: args.repo } : {}),\r\n ...(typeof args.harnessRoot === \"string\" ? { harnessRoot: args.harnessRoot } : {}),\r\n ...(maxWorkersRaw ? { maxConcurrentWorkers: Math.max(1, Math.floor(Number(maxWorkersRaw))) } : {}),\r\n workerProvider: typeof args.provider === \"string\" ? args.provider : existing.workerProvider || \"claude\",\r\n };\r\n saveUserConfig(config);\r\n\r\n let runnerCredentialNote: string | undefined;\r\n const apiKey = loadApiKey();\r\n const agentOsId = config.agentOsId;\r\n if (apiKey && agentOsId) {\r\n try {\r\n const token = await fetchRunnerCredential(agentOsId, {\r\n baseUrl: typeof args.apiBaseUrl === \"string\" ? args.apiBaseUrl : config.apiBaseUrl,\r\n apiKey,\r\n });\r\n saveRunnerToken(agentOsId, token);\r\n runnerCredentialNote = \"Scoped runner token minted and saved to ~/.kynver/credentials.\";\r\n } catch {\r\n runnerCredentialNote =\r\n \"Runner token not minted (server offline or master secret unset). Run `kynver runner credential` after deploy.\";\r\n }\r\n }\r\n\r\n console.log(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n configPath: CONFIG_FILE,\r\n config,\r\n note:\r\n runnerCredentialNote ??\r\n \"Set worker limit once with --max-workers N (or omit to auto-size from RAM). Run `kynver login` + `kynver runner credential` for scoped callbacks.\",\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n}\r\n\r\nexport async function runLogin(args: Record<string, string | boolean>): Promise<void> {\r\n const apiKey = typeof args.apiKey === \"string\" ? args.apiKey : process.env.KYNVER_API_KEY;\r\n if (!apiKey) failConfig(\"kynver login requires --api-key or KYNVER_API_KEY\");\r\n saveApiKey(apiKey);\r\n console.log(JSON.stringify({ ok: true, credentialsPath: CREDENTIALS_FILE }, null, 2));\r\n}\r\n", "import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\n\r\nexport function fail(message: string): never {\r\n console.error(message);\r\n process.exit(1);\r\n}\r\n\r\nexport function required(value: string | undefined, name: string): string {\r\n if (!value) fail(`missing ${name}`);\r\n return value;\r\n}\r\n\r\nexport function safeJson(line: string): unknown {\r\n try {\r\n return JSON.parse(line);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function readJson<T>(file: string, fallback?: T): T {\r\n try {\r\n return JSON.parse(readFileSync(file, \"utf8\")) as T;\r\n } catch (error) {\r\n if (arguments.length > 1) return fallback as T;\r\n fail(`failed to read ${file}: ${(error as Error).message}`);\r\n }\r\n}\r\n\r\nexport function writeJson(file: string, value: unknown): void {\r\n mkdirSync(path.dirname(file), { recursive: true });\r\n writeFileSync(file, `${JSON.stringify(value, null, 2)}\\n`);\r\n}\r\n\r\nexport function safeSlug(value: string | undefined): string {\r\n return (\r\n String(value || \"\")\r\n .toLowerCase()\r\n .replace(/[^a-z0-9._-]+/g, \"-\")\r\n .replace(/^-+|-+$/g, \"\") || \"worker\"\r\n );\r\n}\r\n\r\nexport function timestampSlug(name: string): string {\r\n return safeSlug(`${new Date().toISOString().replace(/[-:]/g, \"\").replace(/\\..+/, \"Z\")}-${name}`);\r\n}\r\n\r\nexport function splitCsv(value: string | undefined): string[] {\r\n return value ? String(value).split(\",\").map((item) => item.trim()).filter(Boolean) : [];\r\n}\r\n\r\nexport function trimTrailingSlash(url: string): string {\r\n return String(url).replace(/\\/+$/, \"\");\r\n}\r\n\r\nexport function oneLine(value: string): string {\r\n return String(value || \"\")\r\n .replace(/\\s+/g, \" \")\r\n .trim();\r\n}\r\n\r\nexport function fileSize(file: string): number {\r\n try {\r\n return statSync(file).size;\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\nexport function fileMtime(file: string): string | null {\r\n try {\r\n return statSync(file).mtime.toISOString();\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function tailFile(file: string, lines: number): string {\r\n if (!existsSync(file)) return \"\";\r\n const data = readFileSync(file, \"utf8\");\r\n return data.split(\"\\n\").slice(-lines).join(\"\\n\");\r\n}\r\n\r\nexport function readMaybeFile(file: string | undefined): string {\r\n return file ? readFileSync(path.resolve(file), \"utf8\") : \"\";\r\n}\r\n\r\nexport function listRunIds(runsDir: string): string[] {\r\n if (!existsSync(runsDir)) return [];\r\n return readdirSync(runsDir, { withFileTypes: true })\r\n .filter((entry) => entry.isDirectory())\r\n .map((entry) => entry.name);\r\n}\r\n\r\nexport function sleepMs(ms: number): void {\r\n Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);\r\n}\r\n\r\nexport function isPidAlive(pid: number | undefined): boolean {\r\n if (!pid) return false;\r\n try {\r\n process.kill(pid, 0);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function killWorkerProcess(pid: number, signal: NodeJS.Signals): void {\r\n try {\r\n process.kill(-pid, signal);\r\n } catch {\r\n process.kill(pid, signal);\r\n }\r\n}\r\n\r\nexport function latestIso(values: Array<string | null | undefined>): string | null {\r\n let best: string | null = null;\r\n let bestMs = -Infinity;\r\n for (const value of values) {\r\n if (!value) continue;\r\n const ms = Date.parse(value);\r\n if (Number.isFinite(ms) && ms > bestMs) {\r\n bestMs = ms;\r\n best = value;\r\n }\r\n }\r\n return best;\r\n}\r\n\r\nexport function secsAgo(ms: number): number {\r\n return Math.max(0, Math.round((Date.now() - ms) / 1000));\r\n}\r\n", "/** Build callback auth headers for AgentOS by-id harness routes. */\r\nexport function buildHarnessCallbackHeaders(secret: string): Record<string, string> {\r\n const trimmed = String(secret).trim();\r\n if (trimmed.startsWith(\"krc1.\")) {\r\n return {\r\n \"Content-Type\": \"application/json\",\r\n \"X-Kynver-Runner-Token\": trimmed,\r\n };\r\n }\r\n return {\r\n \"Content-Type\": \"application/json\",\r\n \"X-OpenClaw-Cron-Secret\": trimmed,\r\n \"X-Kynver-Runtime-Secret\": trimmed,\r\n };\r\n}\r\n", "import { buildHarnessCallbackHeaders } from \"./callback-headers.js\";\r\n\r\nexport interface DispatchNextDiskGateShape {\r\n ok: boolean;\r\n path: string;\r\n freeBytes: number;\r\n totalBytes: number;\r\n usedPercent: number;\r\n warnBelowBytes: number;\r\n criticalBelowBytes: number;\r\n maxUsedPercent: number;\r\n hardMaxUsedPercent: number;\r\n reason: string | null;\r\n}\r\n\r\nexport interface DispatchNextResourceGateShape {\r\n ok: boolean;\r\n totalMemBytes: number;\r\n freeMemBytes: number;\r\n memReserveBytes: number;\r\n perWorkerMemBytes: number;\r\n configuredMaxWorkers: number | null;\r\n capacityWorkers: number;\r\n maxConcurrentWorkers: number;\r\n activeWorkers: number;\r\n slotsAvailable: number;\r\n reason: string | null;\r\n}\r\n\r\nexport interface PostJsonResult {\r\n ok: boolean;\r\n status: number;\r\n response: unknown;\r\n}\r\n\r\nexport async function postJson(url: string, secret: string, body: unknown): Promise<PostJsonResult> {\r\n const res = await fetch(url, {\r\n method: \"POST\",\r\n headers: buildHarnessCallbackHeaders(secret),\r\n body: JSON.stringify(body),\r\n });\r\n let response: unknown = null;\r\n try {\r\n response = await res.json();\r\n } catch {\r\n response = null;\r\n }\r\n return { ok: res.ok, status: res.status, response };\r\n}\r\n\r\nexport async function getJson(url: string, secret: string): Promise<PostJsonResult> {\r\n const res = await fetch(url, {\r\n method: \"GET\",\r\n headers: buildHarnessCallbackHeaders(secret),\r\n });\r\n let response: unknown = null;\r\n try {\r\n response = await res.json();\r\n } catch {\r\n response = null;\r\n }\r\n return { ok: res.ok, status: res.status, response };\r\n}\r\n", "import { statfsSync } from \"node:fs\";\r\nimport type { DispatchNextDiskGateShape } from \"./callbacks.js\";\r\n\r\nconst DEFAULT_WARN_FREE_BYTES = 30 * 1024 * 1024 * 1024;\r\nconst DEFAULT_CRITICAL_FREE_BYTES = 15 * 1024 * 1024 * 1024;\r\nconst DEFAULT_MAX_USED_PERCENT = 80;\r\nconst DEFAULT_HARD_MAX_USED_PERCENT = 90;\r\n\r\nexport interface ObserveDiskGateInput {\r\n diskPath?: string;\r\n diskFreeWarnBytes?: number;\r\n diskFreeCriticalBytes?: number;\r\n diskMaxUsedPercent?: number;\r\n diskHardMaxUsedPercent?: number;\r\n}\r\n\r\nexport function observeRunnerDiskGate(input: ObserveDiskGateInput = {}): DispatchNextDiskGateShape {\r\n const path = input.diskPath?.trim() || \"/\";\r\n const warnBelowBytes = input.diskFreeWarnBytes ?? DEFAULT_WARN_FREE_BYTES;\r\n const criticalBelowBytes = input.diskFreeCriticalBytes ?? DEFAULT_CRITICAL_FREE_BYTES;\r\n const maxUsedPercent = input.diskMaxUsedPercent ?? DEFAULT_MAX_USED_PERCENT;\r\n const hardMaxUsedPercent = input.diskHardMaxUsedPercent ?? DEFAULT_HARD_MAX_USED_PERCENT;\r\n\r\n const stats = statfsSync(path);\r\n const freeBytes = Number(stats.bavail) * Number(stats.bsize);\r\n const totalBytes = Number(stats.blocks) * Number(stats.bsize);\r\n const usedPercent = totalBytes > 0 ? ((totalBytes - freeBytes) / totalBytes) * 100 : 100;\r\n const lowFree = freeBytes < warnBelowBytes;\r\n const criticalFree = freeBytes < criticalBelowBytes;\r\n const highUse = usedPercent > maxUsedPercent;\r\n const hardHighUse = usedPercent > hardMaxUsedPercent;\r\n const ok = !lowFree && !criticalFree && !highUse && !hardHighUse;\r\n\r\n let reason: string | null = null;\r\n if (!ok) {\r\n reason = [\r\n criticalFree ? `free space below critical ${criticalBelowBytes} bytes` : null,\r\n lowFree ? `free space below warning ${warnBelowBytes} bytes` : null,\r\n hardHighUse ? `used percent above hard cap ${hardMaxUsedPercent}%` : null,\r\n highUse ? `used percent above cap ${maxUsedPercent}%` : null,\r\n ]\r\n .filter(Boolean)\r\n .join(\"; \");\r\n }\r\n\r\n return {\r\n ok,\r\n path,\r\n freeBytes,\r\n totalBytes,\r\n usedPercent,\r\n warnBelowBytes,\r\n criticalBelowBytes,\r\n maxUsedPercent,\r\n hardMaxUsedPercent,\r\n reason,\r\n };\r\n}\r\n", "import { readFileSync } from \"node:fs\";\r\nimport os from \"node:os\";\r\nimport path from \"node:path\";\r\nimport { loadUserConfig, type KynverUserConfig } from \"./config.js\";\r\nimport { listRunRecords, loadRun, runDirectory, type HarnessRunRecord } from \"./run-store.js\";\r\nimport { computeWorkerStatus } from \"./status.js\";\r\nimport { readJson, safeSlug } from \"./util.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\n\r\n/** Default RAM budget per worker (~500 MiB, dogfood measured). Internal \u2014 not a setup knob. */\r\nexport const DEFAULT_PER_WORKER_MEM_BYTES = 500 * 1024 * 1024;\r\n\r\n/** Keep headroom for OS / IDE. Internal \u2014 not a setup knob. */\r\nexport const DEFAULT_MEM_RESERVE_BYTES = 4 * 1024 * 1024 * 1024;\r\n\r\n/** Fraction of total RAM used when auto-sizing worker cap. Internal. */\r\nexport const DEFAULT_MEM_UTILIZATION = 0.85;\r\n\r\n/** Auto cap when the user has not set maxConcurrentWorkers (safety on huge hosts). */\r\nexport const AUTO_MAX_WORKERS_CEILING = 64;\r\n\r\nexport interface RunnerResourceGateShape {\r\n ok: boolean;\r\n totalMemBytes: number;\r\n freeMemBytes: number;\r\n memReserveBytes: number;\r\n perWorkerMemBytes: number;\r\n configuredMaxWorkers: number | null;\r\n autoCap: number;\r\n capacityWorkers: number;\r\n maxConcurrentWorkers: number;\r\n activeWorkers: number;\r\n slotsAvailable: number;\r\n reason: string | null;\r\n}\r\n\r\nexport interface ObserveResourceGateInput {\r\n runId: string;\r\n config?: KynverUserConfig;\r\n /** Command Center / workspace override \u2014 wins over local config when set. */\r\n configuredMaxWorkersOverride?: number | null;\r\n /** Override active worker count (tests). */\r\n activeWorkers?: number;\r\n totalMemBytes?: number;\r\n freeMemBytes?: number;\r\n}\r\n\r\nfunction positiveInt(value: unknown, fallback: number): number {\r\n const n = Number(value);\r\n if (!Number.isFinite(n) || n <= 0) return fallback;\r\n return Math.floor(n);\r\n}\r\n\r\nfunction resolveResourceConfig(\r\n config: KynverUserConfig = loadUserConfig(),\r\n configuredMaxWorkersOverride?: number | null,\r\n) {\r\n const perWorkerMemBytes = positiveInt(config.perWorkerMemBytes, DEFAULT_PER_WORKER_MEM_BYTES);\r\n const memReserveBytes = positiveInt(config.memReserveBytes, DEFAULT_MEM_RESERVE_BYTES);\r\n const memUtilization = Math.min(\r\n 1,\r\n Math.max(0.1, Number(config.memUtilization) > 0 ? Number(config.memUtilization) : DEFAULT_MEM_UTILIZATION),\r\n );\r\n const envCap = process.env.KYNVER_MAX_WORKERS ? positiveInt(process.env.KYNVER_MAX_WORKERS, 0) || null : null;\r\n const configuredMaxWorkers =\r\n configuredMaxWorkersOverride !== undefined\r\n ? configuredMaxWorkersOverride\r\n : envCap ??\r\n (config.maxConcurrentWorkers !== undefined && config.maxConcurrentWorkers !== null\r\n ? positiveInt(config.maxConcurrentWorkers, 0) || null\r\n : null);\r\n return { perWorkerMemBytes, memReserveBytes, memUtilization, configuredMaxWorkers };\r\n}\r\n\r\n/** How many workers this host could run from RAM alone (before a user cap). */\r\nexport function computeAutoMaxWorkers(\r\n totalMemBytes: number,\r\n opts: { perWorkerMemBytes?: number; memReserveBytes?: number; memUtilization?: number } = {},\r\n): number {\r\n const perWorkerMemBytes = opts.perWorkerMemBytes ?? DEFAULT_PER_WORKER_MEM_BYTES;\r\n const memReserveBytes = opts.memReserveBytes ?? DEFAULT_MEM_RESERVE_BYTES;\r\n const memUtilization = opts.memUtilization ?? DEFAULT_MEM_UTILIZATION;\r\n const budgetBytes = Math.max(0, Math.floor(totalMemBytes * memUtilization) - memReserveBytes);\r\n const raw = Math.max(1, Math.floor(budgetBytes / perWorkerMemBytes));\r\n return Math.min(raw, AUTO_MAX_WORKERS_CEILING);\r\n}\r\n\r\n/** Truly-usable memory. On Linux, os.freemem() reports MemFree, which excludes\r\n * reclaimable page cache and badly understates real headroom on a busy box \u2014\r\n * that made the free-RAM gate throttle dispatch far below the configured cap.\r\n * Prefer /proc/meminfo MemAvailable; fall back to os.freemem() elsewhere. */\r\nfunction readAvailableMemBytes(): number {\r\n if (process.platform === \"linux\") {\r\n try {\r\n const meminfo = readFileSync(\"/proc/meminfo\", \"utf8\");\r\n const match = meminfo.match(/^MemAvailable:\\s+(\\d+)\\s*kB/m);\r\n if (match) return Number(match[1]) * 1024;\r\n } catch {\r\n // fall through to os.freemem()\r\n }\r\n }\r\n return os.freemem();\r\n}\r\n\r\n/** Count alive, still-executing workers in a single run record. */\r\nfunction countActiveWorkersForRun(run: HarnessRunRecord): number {\r\n let active = 0;\r\n for (const name of Object.keys(run.workers || {})) {\r\n const worker = readJson<HarnessWorkerRecord | undefined>(\r\n path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n if (!worker) continue;\r\n const status = computeWorkerStatus(worker);\r\n if (status.alive && !status.finalResult && status.attention.state !== \"done\") {\r\n active++;\r\n }\r\n }\r\n return active;\r\n}\r\n\r\n/** Count active workers in ONE run (kept for callers/tests scoped to a run). */\r\nexport function countActiveWorkers(runId: string): number {\r\n return countActiveWorkersForRun(loadRun(runId));\r\n}\r\n\r\n/**\r\n * Count active workers across EVERY run on disk. The harness creates a new run\r\n * per task, so a per-run count let concurrent runs each believe the machine was\r\n * idle \u2014 the configured cap was never a real global ceiling (the \"spawns 4 or\r\n * infinity, never N\" bug). This machine-wide count is what the gate must use.\r\n */\r\nexport function countActiveWorkersGlobal(): number {\r\n let active = 0;\r\n for (const run of listRunRecords()) active += countActiveWorkersForRun(run);\r\n return active;\r\n}\r\n\r\n/**\r\n * Compute how many workers this host can run and how many dispatch slots remain.\r\n * Uses total RAM for steady-state capacity and free RAM as a hard safety gate.\r\n */\r\nexport function observeRunnerResourceGate(input: ObserveResourceGateInput): RunnerResourceGateShape {\r\n const { perWorkerMemBytes, memReserveBytes, memUtilization, configuredMaxWorkers } = resolveResourceConfig(\r\n input.config,\r\n input.configuredMaxWorkersOverride,\r\n );\r\n\r\n const totalMemBytes = input.totalMemBytes ?? os.totalmem();\r\n const freeMemBytes = input.freeMemBytes ?? readAvailableMemBytes();\r\n // Active count is GLOBAL across all runs (see countActiveWorkersGlobal), so the\r\n // cap is a true machine-wide ceiling rather than per-run.\r\n const activeWorkers = input.activeWorkers ?? countActiveWorkersGlobal();\r\n\r\n const budgetBytes = Math.max(0, Math.floor(totalMemBytes * memUtilization) - memReserveBytes);\r\n const capacityFromTotal = Math.max(0, Math.floor(budgetBytes / perWorkerMemBytes));\r\n const capacityFromFree = Math.max(0, Math.floor(Math.max(0, freeMemBytes - memReserveBytes) / perWorkerMemBytes));\r\n\r\n const autoCap = computeAutoMaxWorkers(totalMemBytes, { perWorkerMemBytes, memReserveBytes, memUtilization });\r\n const targetCap = configuredMaxWorkers ?? autoCap;\r\n const maxConcurrentWorkers = Math.max(0, Math.min(targetCap, capacityFromTotal));\r\n const slotsByCapacity = Math.max(0, maxConcurrentWorkers - activeWorkers);\r\n // capacityFromFree is ADDITIONAL headroom: free/available RAM already excludes\r\n // memory held by running workers, so we must NOT subtract activeWorkers again.\r\n // Doing so (the old `capacityFromFree - activeWorkers`) double-counted active\r\n // workers and collapsed dispatch to a handful of slots under load.\r\n const slotsByFreeMem = capacityFromFree;\r\n const slotsAvailable = Math.min(slotsByCapacity, slotsByFreeMem);\r\n\r\n let reason: string | null = null;\r\n if (slotsAvailable <= 0) {\r\n if (activeWorkers >= maxConcurrentWorkers) {\r\n reason = `at worker limit (${activeWorkers}/${maxConcurrentWorkers} running)`;\r\n } else if (capacityFromFree <= 0) {\r\n reason = \"insufficient free memory \u2014 waiting for workers to finish\";\r\n } else {\r\n reason = \"no worker slots available\";\r\n }\r\n }\r\n\r\n return {\r\n ok: slotsAvailable > 0,\r\n totalMemBytes,\r\n freeMemBytes,\r\n memReserveBytes,\r\n perWorkerMemBytes,\r\n configuredMaxWorkers,\r\n autoCap,\r\n capacityWorkers: capacityFromTotal,\r\n maxConcurrentWorkers,\r\n activeWorkers,\r\n slotsAvailable,\r\n reason,\r\n };\r\n}\r\n", "import { existsSync, readdirSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { getHarnessPaths, runDir as runDirPath } from \"./paths.js\";\r\nimport { readJson, safeSlug, writeJson } from \"./util.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\n\r\nexport interface HarnessRunRecord {\r\n id: string;\r\n name: string;\r\n repo: string;\r\n base: string;\r\n baseCommit: string;\r\n status: string;\r\n createdAt: string;\r\n workers: Record<string, { workerDir: string; statusPath: string }>;\r\n}\r\n\r\nexport function getPaths() {\r\n return getHarnessPaths();\r\n}\r\n\r\nexport function loadRun(id: string): HarnessRunRecord {\r\n const { runsDir } = getPaths();\r\n return readJson<HarnessRunRecord>(path.join(runDirPath(runsDir, safeSlug(id)), \"run.json\"));\r\n}\r\n\r\n/**\r\n * Load every run record on disk. Used for global, cross-run accounting (the\r\n * resource gate must see workers from ALL runs, and stale-run finalization\r\n * iterates the whole set). Unreadable/partial run dirs are skipped.\r\n */\r\nexport function listRunRecords(): HarnessRunRecord[] {\r\n const { runsDir } = getPaths();\r\n if (!existsSync(runsDir)) return [];\r\n const runs: HarnessRunRecord[] = [];\r\n for (const entry of readdirSync(runsDir, { withFileTypes: true })) {\r\n if (!entry.isDirectory()) continue;\r\n const run = readJson<HarnessRunRecord | undefined>(\r\n path.join(runsDir, entry.name, \"run.json\"),\r\n undefined,\r\n );\r\n if (run?.id) runs.push(run);\r\n }\r\n return runs;\r\n}\r\n\r\nexport function loadWorker(runId: string, name: string): HarnessWorkerRecord {\r\n const { runsDir } = getPaths();\r\n return readJson<HarnessWorkerRecord>(\r\n path.join(runDirPath(runsDir, safeSlug(runId)), \"workers\", safeSlug(name), \"worker.json\"),\r\n );\r\n}\r\n\r\nexport function saveRun(run: HarnessRunRecord): void {\r\n const { runsDir } = getPaths();\r\n writeJson(path.join(runDirPath(runsDir, run.id), \"run.json\"), run);\r\n}\r\n\r\nexport function saveWorker(runId: string, worker: HarnessWorkerRecord): void {\r\n const { runsDir } = getPaths();\r\n writeJson(path.join(runDirPath(runsDir, runId), \"workers\", worker.name, \"worker.json\"), worker);\r\n}\r\n\r\nexport function runDirectory(id: string): string {\r\n const { runsDir } = getPaths();\r\n return runDirPath(runsDir, safeSlug(id));\r\n}\r\n", "import { existsSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport { safeSlug } from \"./util.js\";\r\n\r\nconst LEGACY_ROOT = path.join(homedir(), \".openclaw\", \"harness\");\r\n\r\nexport function resolveHarnessRoot(): string {\r\n const env = process.env.KYNVER_HARNESS_ROOT || process.env.OPUS_HARNESS_ROOT;\r\n if (env) return path.resolve(env);\r\n const kynverRoot = path.join(homedir(), \".kynver\", \"harness\");\r\n if (existsSync(kynverRoot)) return kynverRoot;\r\n if (existsSync(LEGACY_ROOT)) return LEGACY_ROOT;\r\n return kynverRoot;\r\n}\r\n\r\nexport function getHarnessPaths() {\r\n const harnessRoot = resolveHarnessRoot();\r\n return {\r\n harnessRoot,\r\n runsDir: path.join(harnessRoot, \"runs\"),\r\n worktreesDir: path.join(harnessRoot, \"worktrees\"),\r\n };\r\n}\r\n\r\nexport function runDir(runsDir: string, id: string): string {\r\n return path.join(runsDir, safeSlug(id));\r\n}\r\n", "import { existsSync, readFileSync } from \"node:fs\";\r\nimport { safeJson } from \"./util.js\";\r\n\r\nexport interface ParsedHeartbeat {\r\n heartbeatCount: number;\r\n lastHeartbeatAt: string | null;\r\n lastHeartbeatPhase: string | null;\r\n lastHeartbeatSummary: string | null;\r\n heartbeatBlocker: string | null;\r\n}\r\n\r\nexport function parseHeartbeat(file: string): ParsedHeartbeat {\r\n const result: ParsedHeartbeat = {\r\n heartbeatCount: 0,\r\n lastHeartbeatAt: null,\r\n lastHeartbeatPhase: null,\r\n lastHeartbeatSummary: null,\r\n heartbeatBlocker: null,\r\n };\r\n if (!existsSync(file)) return result;\r\n const lines = readFileSync(file, \"utf8\").split(\"\\n\").filter(Boolean);\r\n for (const line of lines) {\r\n const entry = safeJson(line);\r\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) continue;\r\n const row = entry as Record<string, unknown>;\r\n result.heartbeatCount++;\r\n if (row.ts) result.lastHeartbeatAt = String(row.ts);\r\n if (row.phase !== undefined && row.phase !== null) result.lastHeartbeatPhase = String(row.phase);\r\n if (row.summary !== undefined && row.summary !== null) result.lastHeartbeatSummary = String(row.summary);\r\n result.heartbeatBlocker = row.blocker ? String(row.blocker) : null;\r\n }\r\n return result;\r\n}\r\n", "import { existsSync, readFileSync } from \"node:fs\";\r\nimport { oneLine, safeJson } from \"./util.js\";\r\n\r\nexport interface ParsedStream {\r\n firstEventAt: string | null;\r\n lastEventAt: string | null;\r\n currentTool: string | null;\r\n finalResult: unknown;\r\n error: string | null;\r\n}\r\n\r\nexport function parseClaudeStream(file: string): ParsedStream {\r\n const result: ParsedStream = {\r\n firstEventAt: null,\r\n lastEventAt: null,\r\n currentTool: null,\r\n finalResult: null,\r\n error: null,\r\n };\r\n if (!existsSync(file)) return result;\r\n const lines = readFileSync(file, \"utf8\").split(\"\\n\").filter(Boolean);\r\n for (const line of lines) {\r\n const event = safeJson(line) as Record<string, unknown> | null;\r\n if (!event) continue;\r\n const tsMs = event.timestamp_ms as number | undefined;\r\n const ts = (event.timestamp || event.ts || (tsMs ? new Date(tsMs).toISOString() : undefined)) as\r\n | string\r\n | undefined;\r\n if (ts) {\r\n result.firstEventAt ||= ts;\r\n result.lastEventAt = ts;\r\n }\r\n if (\r\n event.type === \"stream_event\" &&\r\n event.event &&\r\n typeof event.event === \"object\" &&\r\n (event.event as Record<string, unknown>).type === \"content_block_start\"\r\n ) {\r\n const block = (event.event as Record<string, unknown>).content_block as Record<string, unknown> | undefined;\r\n if (block?.type === \"tool_use\") result.currentTool = String(block.name || \"tool\");\r\n }\r\n if (event.type === \"assistant\" && event.message && typeof event.message === \"object\") {\r\n const content = (event.message as Record<string, unknown>).content;\r\n if (Array.isArray(content)) {\r\n const tool = content.find((item) => item?.type === \"tool_use\") as Record<string, unknown> | undefined;\r\n if (tool) result.currentTool = String(tool.name || result.currentTool);\r\n }\r\n }\r\n if (event.type === \"result\") {\r\n result.finalResult = event.result || event.subtype || event.terminal_reason || \"completed\";\r\n if (event.is_error) result.error = String(event.result || event.api_error_status || \"Claude result error\");\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nexport function summarizeEvent(event: Record<string, unknown>): string | undefined {\r\n if (event.type === \"system\" && event.subtype) {\r\n return `[system:${event.subtype}] ${String(event.status || event.cwd || \"\")}`.trim();\r\n }\r\n if (event.type === \"stream_event\" && event.event && typeof event.event === \"object\") {\r\n const type = (event.event as Record<string, unknown>).type;\r\n if (type === \"content_block_start\") {\r\n const block = (event.event as Record<string, unknown>).content_block as Record<string, unknown> | undefined;\r\n if (block?.type === \"tool_use\") return `[tool:start] ${block.name}`;\r\n }\r\n if (type === \"content_block_delta\") {\r\n const delta = (event.event as Record<string, unknown>).delta as Record<string, unknown> | undefined;\r\n if (delta?.partial_json) return `[tool:input] ${delta.partial_json}`;\r\n }\r\n if (type === \"message_stop\") return \"[message:stop]\";\r\n return type ? `[stream:${type}]` : undefined;\r\n }\r\n if (event.type === \"assistant\" && event.message && typeof event.message === \"object\") {\r\n const content = (event.message as Record<string, unknown>).content;\r\n if (Array.isArray(content)) {\r\n const text = content.find((item) => item?.type === \"text\") as Record<string, unknown> | undefined;\r\n if (text) return `[assistant] ${oneLine(String(text.text || \"\"))}`;\r\n const tool = content.find((item) => item?.type === \"tool_use\") as Record<string, unknown> | undefined;\r\n if (tool) return `[tool] ${tool.name} ${JSON.stringify(tool.input || {})}`;\r\n }\r\n }\r\n if (event.type === \"user\" && event.tool_use_result) {\r\n const result = event.tool_use_result as Record<string, unknown>;\r\n return `[tool:result] stdout=${JSON.stringify(result.stdout || \"\")} stderr=${JSON.stringify(result.stderr || \"\")}`;\r\n }\r\n if (event.type === \"result\") {\r\n return `[result] ${event.subtype || \"\"} ${oneLine(String(event.result || \"\"))}`.trim();\r\n }\r\n return undefined;\r\n}\r\n", "import { spawnSync } from \"node:child_process\";\r\nimport { fail } from \"./util.js\";\r\n\r\nexport interface GitOptions {\r\n allowFailure?: boolean;\r\n throwError?: boolean;\r\n}\r\n\r\nexport function git(cwd: string, args: string[], options: GitOptions = {}): string {\r\n const res = spawnSync(\"git\", args, { cwd, encoding: \"utf8\" });\r\n if (res.status !== 0 && !options.allowFailure) {\r\n const message = `git ${args.join(\" \")} failed: ${res.stderr || res.stdout}`;\r\n if (options.throwError) throw new Error(message);\r\n fail(message);\r\n }\r\n return res.stdout || \"\";\r\n}\r\n\r\nexport function ensureGitRepo(repo: string): void {\r\n git(repo, [\"rev-parse\", \"--show-toplevel\"]);\r\n}\r\n\r\nexport function gitStatusShort(worktreePath: string): string[] {\r\n return git(worktreePath, [\"status\", \"--short\"], { allowFailure: true })\r\n .split(\"\\n\")\r\n .map((line) => line.trim())\r\n .filter(Boolean);\r\n}\r\n\r\nexport interface GitCaptureResult {\r\n status: number | null;\r\n stdout: string;\r\n stderr: string;\r\n error: string | null;\r\n}\r\n\r\nexport function gitCapture(cwd: string, args: string[]): GitCaptureResult {\r\n try {\r\n const res = spawnSync(\"git\", args, { cwd, encoding: \"utf8\" });\r\n return {\r\n status: res.status,\r\n stdout: res.stdout || \"\",\r\n stderr: res.stderr || \"\",\r\n error: res.error ? res.error.message : null,\r\n };\r\n } catch (error) {\r\n return {\r\n status: null,\r\n stdout: \"\",\r\n stderr: \"\",\r\n error: (error as Error).message,\r\n };\r\n }\r\n}\r\n\r\nexport function gitIsAncestor(\r\n cwd: string,\r\n ancestor: string,\r\n descendant: string,\r\n): { isAncestor: boolean | null; error: string | null } {\r\n const res = gitCapture(cwd, [\"merge-base\", \"--is-ancestor\", ancestor, descendant]);\r\n if (res.status === 0) return { isAncestor: true, error: null };\r\n if (res.status === 1) return { isAncestor: false, error: null };\r\n return { isAncestor: null, error: res.error || res.stderr || res.stdout || `git exited ${res.status}` };\r\n}\r\n\r\nexport type GitAncestryRelation = \"synced\" | \"merged\" | \"ahead\" | \"diverged\" | \"unknown\";\r\n\r\nexport interface GitAncestry {\r\n checked: boolean;\r\n base: string;\r\n head: string | null;\r\n baseHead: string | null;\r\n baseIsAncestorOfHead: boolean | null;\r\n headIsAncestorOfBase: boolean | null;\r\n relation: GitAncestryRelation;\r\n error?: string;\r\n}\r\n\r\nexport function computeGitAncestry(worktreePath: string, base = \"origin/main\"): GitAncestry {\r\n if (!worktreePath) {\r\n return unknownAncestry(base, \"missing worktree path\");\r\n }\r\n\r\n const head = gitCapture(worktreePath, [\"rev-parse\", \"HEAD\"]);\r\n if (head.status !== 0) return unknownAncestry(base, head.error || head.stderr || head.stdout || \"failed to resolve HEAD\");\r\n\r\n const baseHead = gitCapture(worktreePath, [\"rev-parse\", base]);\r\n if (baseHead.status !== 0) {\r\n return unknownAncestry(base, baseHead.error || baseHead.stderr || baseHead.stdout || `failed to resolve ${base}`, head.stdout.trim());\r\n }\r\n\r\n const headSha = head.stdout.trim();\r\n const baseSha = baseHead.stdout.trim();\r\n if (headSha === baseSha) {\r\n return {\r\n checked: true,\r\n base,\r\n head: headSha,\r\n baseHead: baseSha,\r\n baseIsAncestorOfHead: true,\r\n headIsAncestorOfBase: true,\r\n relation: \"synced\",\r\n };\r\n }\r\n\r\n const baseIsAncestorOfHead = gitIsAncestor(worktreePath, baseSha, headSha);\r\n const headIsAncestorOfBase = gitIsAncestor(worktreePath, headSha, baseSha);\r\n const error = baseIsAncestorOfHead.error || headIsAncestorOfBase.error || undefined;\r\n if (baseIsAncestorOfHead.isAncestor == null || headIsAncestorOfBase.isAncestor == null) {\r\n return {\r\n checked: false,\r\n base,\r\n head: headSha,\r\n baseHead: baseSha,\r\n baseIsAncestorOfHead: baseIsAncestorOfHead.isAncestor,\r\n headIsAncestorOfBase: headIsAncestorOfBase.isAncestor,\r\n relation: \"unknown\",\r\n ...(error ? { error } : {}),\r\n };\r\n }\r\n\r\n const relation: GitAncestryRelation = baseIsAncestorOfHead.isAncestor\r\n ? \"ahead\"\r\n : headIsAncestorOfBase.isAncestor\r\n ? \"merged\"\r\n : \"diverged\";\r\n\r\n return {\r\n checked: true,\r\n base,\r\n head: headSha,\r\n baseHead: baseSha,\r\n baseIsAncestorOfHead: baseIsAncestorOfHead.isAncestor,\r\n headIsAncestorOfBase: headIsAncestorOfBase.isAncestor,\r\n relation,\r\n ...(error ? { error } : {}),\r\n };\r\n}\r\n\r\nfunction unknownAncestry(base: string, error: string, head: string | null = null): GitAncestry {\r\n return {\r\n checked: false,\r\n base,\r\n head,\r\n baseHead: null,\r\n baseIsAncestorOfHead: null,\r\n headIsAncestorOfBase: null,\r\n relation: \"unknown\",\r\n error,\r\n };\r\n}\r\n\r\nexport function scrubClaudeEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\r\n const next = { ...env };\r\n delete next.ANTHROPIC_API_KEY;\r\n return next;\r\n}\r\n", "import { parseHeartbeat } from \"./heartbeat.js\";\r\nimport { parseClaudeStream } from \"./stream.js\";\r\nimport { computeGitAncestry, type GitAncestry, gitStatusShort } from \"./git.js\";\r\nimport {\r\n fileMtime,\r\n fileSize,\r\n isPidAlive,\r\n latestIso,\r\n secsAgo,\r\n tailFile,\r\n} from \"./util.js\";\r\n\r\nexport const NO_START_MS = 180_000;\r\nexport const STALE_MS = 600_000;\r\n\r\nexport interface WorkerAttention {\r\n state: \"done\" | \"needs_attention\" | \"blocked\" | \"stale\" | \"ok\";\r\n reason: string;\r\n}\r\n\r\nexport interface HarnessWorkerRecord {\r\n name: string;\r\n runId: string;\r\n status: string;\r\n pid?: number;\r\n model?: string;\r\n branch: string;\r\n worktreePath: string;\r\n workerDir: string;\r\n stdoutPath: string;\r\n stderrPath: string;\r\n heartbeatPath: string;\r\n ownedPaths?: string[];\r\n agentOsId?: string;\r\n taskId?: string;\r\n planId?: string;\r\n leaseOwner?: string;\r\n dispatched?: boolean;\r\n startedAt?: string;\r\n /** Last heartbeat blocker text successfully synced to plan-progress-sync (dedupe). */\r\n lastSyncedHeartbeatBlocker?: string;\r\n /**\r\n * Set when the most recent AgentOS completion replay for this finished worker\r\n * was rejected (e.g. a revoked / expired / cross-workspace runner token) or\r\n * otherwise failed. While set, the worker is NOT treated as cleanly done:\r\n * `finalizeStaleRuns` keeps the run non-terminal and the board surfaces it.\r\n * Cleared once the completion is acknowledged (2xx). Local-only \u2014 never sent\r\n * to the server as part of the worker's intrinsic status.\r\n */\r\n completionBlocker?: string;\r\n}\r\n\r\nexport interface RawHarnessWorkerStatus {\r\n runId: string;\r\n worker: string;\r\n pid?: number;\r\n alive: boolean;\r\n status: string;\r\n attention: WorkerAttention;\r\n branch: string;\r\n worktreePath: string;\r\n ownedPaths?: string[];\r\n stdoutBytes: number;\r\n stderrBytes: number;\r\n heartbeatBytes: number;\r\n firstEventAt: string | null;\r\n lastEventAt: string | null;\r\n lastActivityAt: string | null;\r\n currentTool: string | null;\r\n heartbeatCount: number;\r\n lastHeartbeatAt: string | null;\r\n lastHeartbeatPhase: string | null;\r\n lastHeartbeatSummary: string | null;\r\n heartbeatBlocker: string | null;\r\n finalResult: unknown;\r\n error?: string;\r\n changedFiles: string[];\r\n gitAncestry: GitAncestry;\r\n}\r\n\r\nexport interface WorkerStatusOptions {\r\n base?: string;\r\n}\r\n\r\nexport function computeAttention(input: {\r\n alive: boolean;\r\n finalResult: unknown;\r\n firstEventAt: string | null;\r\n stdoutBytes: number;\r\n heartbeatBytes: number;\r\n lastActivityAt: string | null;\r\n heartbeatBlocker: string | null;\r\n startedAt?: string;\r\n}): WorkerAttention {\r\n const now = Date.now();\r\n if (input.finalResult) return { state: \"done\", reason: \"final result recorded\" };\r\n if (!input.alive) return { state: \"needs_attention\", reason: \"process exited without a final result\" };\r\n if (input.heartbeatBlocker) {\r\n return { state: \"blocked\", reason: `worker heartbeat reported blocker: ${input.heartbeatBlocker}` };\r\n }\r\n const startMs = input.startedAt ? Date.parse(input.startedAt) : NaN;\r\n if (\r\n !input.firstEventAt &&\r\n input.stdoutBytes === 0 &&\r\n input.heartbeatBytes === 0 &&\r\n Number.isFinite(startMs) &&\r\n now - startMs > NO_START_MS\r\n ) {\r\n return { state: \"needs_attention\", reason: `no first stream event ${secsAgo(startMs)}s after start` };\r\n }\r\n const actMs = input.lastActivityAt ? Date.parse(input.lastActivityAt) : NaN;\r\n if (Number.isFinite(actMs) && now - actMs > STALE_MS) {\r\n return { state: \"stale\", reason: `no log/event/heartbeat activity for ${secsAgo(actMs)}s` };\r\n }\r\n return { state: \"ok\", reason: \"recent activity\" };\r\n}\r\n\r\nexport function computeWorkerStatus(worker: HarnessWorkerRecord, options: WorkerStatusOptions = {}): RawHarnessWorkerStatus {\r\n const parsed = parseClaudeStream(worker.stdoutPath);\r\n const heartbeat = parseHeartbeat(worker.heartbeatPath);\r\n const alive = isPidAlive(worker.pid);\r\n const stdoutBytes = fileSize(worker.stdoutPath);\r\n const stderrBytes = fileSize(worker.stderrPath);\r\n const heartbeatBytes = fileSize(worker.heartbeatPath);\r\n const changedFiles = gitStatusShort(worker.worktreePath);\r\n const gitAncestry = computeGitAncestry(worker.worktreePath, options.base);\r\n const lastActivityAt = latestIso([\r\n parsed.lastEventAt,\r\n heartbeat.lastHeartbeatAt,\r\n fileMtime(worker.stdoutPath),\r\n fileMtime(worker.stderrPath),\r\n fileMtime(worker.heartbeatPath),\r\n ]);\r\n const attention = computeAttention({\r\n alive,\r\n finalResult: parsed.finalResult,\r\n firstEventAt: parsed.firstEventAt,\r\n stdoutBytes,\r\n heartbeatBytes,\r\n lastActivityAt,\r\n heartbeatBlocker: heartbeat.heartbeatBlocker,\r\n startedAt: worker.startedAt,\r\n });\r\n return {\r\n runId: worker.runId,\r\n worker: worker.name,\r\n pid: worker.pid,\r\n alive,\r\n status: parsed.finalResult ? \"done\" : alive ? \"running\" : \"exited\",\r\n attention,\r\n branch: worker.branch,\r\n worktreePath: worker.worktreePath,\r\n ownedPaths: worker.ownedPaths,\r\n stdoutBytes,\r\n stderrBytes,\r\n heartbeatBytes,\r\n firstEventAt: parsed.firstEventAt,\r\n lastEventAt: parsed.lastEventAt,\r\n lastActivityAt,\r\n currentTool: parsed.currentTool,\r\n heartbeatCount: heartbeat.heartbeatCount,\r\n lastHeartbeatAt: heartbeat.lastHeartbeatAt,\r\n lastHeartbeatPhase: heartbeat.lastHeartbeatPhase,\r\n lastHeartbeatSummary: heartbeat.lastHeartbeatSummary,\r\n heartbeatBlocker: heartbeat.heartbeatBlocker,\r\n finalResult: parsed.finalResult,\r\n error:\r\n parsed.error ||\r\n (!alive && !parsed.finalResult ? tailFile(worker.stderrPath, 10).trim() || undefined : undefined),\r\n changedFiles,\r\n gitAncestry,\r\n };\r\n}\r\n\r\nexport function isFinishedWorkerStatus(status: RawHarnessWorkerStatus): boolean {\r\n if (status.finalResult) return true;\r\n if (status.alive === false) return true;\r\n if (status.status === \"exited\" || status.status === \"done\") return true;\r\n return false;\r\n}\r\n\r\nexport function deriveRunStatus(fallback: string, workers: Array<{ attention?: string; status?: string }>): string {\r\n if (workers.length === 0) return fallback;\r\n if (workers.some((w) => w.attention === \"needs_attention\" || w.attention === \"stale\" || w.attention === \"blocked\")) {\r\n return \"needs_attention\";\r\n }\r\n if (workers.every((w) => w.status === \"done\")) return \"done\";\r\n if (workers.some((w) => w.status === \"running\")) return \"running\";\r\n return fallback;\r\n}\r\n", "import { existsSync, mkdirSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { git } from \"./git.js\";\r\nimport { getPaths } from \"./run-store.js\";\r\nimport { loadRun, runDirectory, saveRun, saveWorker } from \"./run-store.js\";\r\nimport { buildPrompt } from \"./prompt.js\";\r\nimport { readMaybeFile, safeSlug } from \"./util.js\";\r\nimport { resolveWorkerProvider } from \"./providers/registry.js\";\r\nimport type { HarnessRunRecord } from \"./run-store.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\nimport { spawnCompletionSidecar } from \"./auto-complete.js\";\r\n\r\nexport interface SpawnWorkerOptions {\r\n name: string;\r\n task: string;\r\n ownedPaths?: string[];\r\n model?: string;\r\n branch?: string;\r\n agentOsId?: string;\r\n taskId?: string;\r\n planId?: string;\r\n leaseOwner?: string;\r\n dispatched?: boolean;\r\n provider?: string;\r\n}\r\n\r\nexport function spawnWorkerProcess(run: HarnessRunRecord, opts: SpawnWorkerOptions): HarnessWorkerRecord {\r\n // Guard against missing/sentinel names. A missing --name used to reach here as\r\n // the literal string \"undefined\" (String(undefined)) \u2014 truthy, so the old\r\n // `if (!opts.name)` check passed and every unnamed worker collided on the key\r\n // \"undefined\", corrupting run.workers and the active-worker count.\r\n const rawName = typeof opts.name === \"string\" ? opts.name.trim() : \"\";\r\n if (!rawName || rawName === \"undefined\" || rawName === \"null\") {\r\n throw new Error(`worker name is required and must be a real identifier (got: ${JSON.stringify(opts.name)})`);\r\n }\r\n const name = safeSlug(rawName);\r\n if (run.workers?.[name]) throw new Error(`worker already exists in run ${run.id}: ${name}`);\r\n if (!opts.task) throw new Error(`missing task text for worker ${name}`);\r\n\r\n const { worktreesDir } = getPaths();\r\n const workerDir = path.join(runDirectory(run.id), \"workers\", name);\r\n mkdirSync(workerDir, { recursive: true });\r\n const worktreePath = path.join(worktreesDir, run.id, name);\r\n const branch = opts.branch || `agent/${run.id}/${name}`;\r\n if (existsSync(worktreePath)) throw new Error(`worktree path already exists: ${worktreePath}`);\r\n\r\n git(run.repo, [\"fetch\", \"origin\", \"--prune\"], { allowFailure: true });\r\n git(run.repo, [\"worktree\", \"add\", \"-b\", branch, worktreePath, run.baseCommit], { throwError: true });\r\n\r\n const stdoutPath = path.join(workerDir, \"stdout.jsonl\");\r\n const stderrPath = path.join(workerDir, \"stderr.log\");\r\n const heartbeatPath = path.join(workerDir, \"heartbeat.jsonl\");\r\n const prompt = buildPrompt({\r\n task: opts.task,\r\n ownedPaths: opts.ownedPaths || [],\r\n worktreePath,\r\n heartbeatPath,\r\n });\r\n\r\n const provider = resolveWorkerProvider(opts.provider);\r\n let started;\r\n try {\r\n started = provider.start({\r\n name,\r\n task: opts.task,\r\n ownedPaths: opts.ownedPaths,\r\n model: opts.model,\r\n branch,\r\n worktreePath,\r\n workerDir,\r\n stdoutPath,\r\n stderrPath,\r\n heartbeatPath,\r\n prompt,\r\n });\r\n } catch (error) {\r\n git(run.repo, [\"worktree\", \"remove\", \"--force\", worktreePath], { allowFailure: true });\r\n git(run.repo, [\"branch\", \"-D\", branch], { allowFailure: true });\r\n throw error;\r\n }\r\n\r\n const model = started.model || opts.model || \"claude-opus-4-7\";\r\n const worker: HarnessWorkerRecord = {\r\n name,\r\n runId: run.id,\r\n status: \"running\",\r\n pid: started.pid,\r\n model,\r\n branch,\r\n worktreePath,\r\n workerDir,\r\n stdoutPath,\r\n stderrPath,\r\n heartbeatPath,\r\n ownedPaths: opts.ownedPaths,\r\n ...(opts.agentOsId ? { agentOsId: String(opts.agentOsId) } : {}),\r\n ...(opts.taskId ? { taskId: String(opts.taskId) } : {}),\r\n ...(opts.planId ? { planId: String(opts.planId) } : {}),\r\n ...(opts.leaseOwner ? { leaseOwner: String(opts.leaseOwner) } : {}),\r\n ...(opts.dispatched ? { dispatched: true } : {}),\r\n startedAt: new Date().toISOString(),\r\n };\r\n\r\n saveWorker(run.id, worker);\r\n run.workers = { ...(run.workers || {}), [name]: { workerDir, statusPath: path.join(workerDir, \"worker.json\") } };\r\n run.status = \"running\";\r\n saveRun(run);\r\n\r\n // For a board-linked worker (named `kynver worker start` clean retry OR\r\n // dispatch-spawn), detach a per-worker completion sidecar so the linked\r\n // AgentTask still advances even when no per-run `kynver daemon` is running.\r\n // Pre-fix evidence: run 20260525t094246z-retry-dalton-post-merge-review-clean\r\n // produced a finalResult but task 2a63e02f\u2026 stayed `running` because nothing\r\n // POSTed `/harness/completion`. Best-effort: a failed sidecar spawn must not\r\n // crash a successful worker spawn \u2014 the daemon/watchdog can still replay.\r\n if (worker.agentOsId && worker.taskId) {\r\n try {\r\n spawnCompletionSidecar({\r\n runId: run.id,\r\n workerName: name,\r\n workerDir,\r\n agentOsId: worker.agentOsId,\r\n });\r\n } catch {\r\n // swallowed \u2014 sidecar is opportunistic; the worker is already running.\r\n }\r\n }\r\n return worker;\r\n}\r\n\r\nexport function startWorker(args: Record<string, string | boolean>): void {\r\n const run = loadRun(String(args.run));\r\n const name = typeof args.name === \"string\" ? args.name.trim() : \"\";\r\n if (!name) {\r\n console.error(\"worker start failed: --name is required\");\r\n process.exit(1);\r\n }\r\n const task = args.task ? String(args.task) : readMaybeFile(args.taskFile ? String(args.taskFile) : undefined);\r\n if (!task) {\r\n console.error(\"missing --task or --task-file\");\r\n process.exit(1);\r\n }\r\n try {\r\n const worker = spawnWorkerProcess(run, {\r\n name,\r\n task,\r\n ownedPaths: args.owned ? String(args.owned).split(\",\").map((s) => s.trim()).filter(Boolean) : [],\r\n model: args.model ? String(args.model) : undefined,\r\n branch: args.branch ? String(args.branch) : undefined,\r\n agentOsId: args.agentOsId ? String(args.agentOsId) : undefined,\r\n taskId: args.taskId ? String(args.taskId) : undefined,\r\n provider: args.provider ? String(args.provider) : undefined,\r\n });\r\n console.log(\r\n JSON.stringify(\r\n {\r\n runId: run.id,\r\n worker: worker.name,\r\n pid: worker.pid,\r\n branch: worker.branch,\r\n worktreePath: worker.worktreePath,\r\n workerDir: worker.workerDir,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n } catch (error) {\r\n console.error(`worker start failed: ${(error as Error).message}`);\r\n process.exit(1);\r\n }\r\n}\r\n", "export function buildPrompt(input: {\r\n task: string;\r\n ownedPaths: string[];\r\n worktreePath: string;\r\n heartbeatPath: string;\r\n planId?: string;\r\n taskId?: string;\r\n}): string {\r\n const ownership = input.ownedPaths.length\r\n ? `Owned paths: ${input.ownedPaths.join(\", \")}. Do not edit outside these paths without stopping and reporting why.`\r\n : \"Owned paths: unrestricted for this worker, but keep edits tightly scoped.\";\r\n const progressLines = [\r\n \"Structured plan progress (required when planId is set):\",\r\n \"- Harness checkpoints only: `kynver plan progress --plan <planId> --row <rowKey> --role implementer --status running|partial|blocked` (the by-id harness route rejects `done` and confirm events).\",\r\n \"- When a slice is finished, emit `partial` with evidence (`--evidence pr:<url>`, `--evidence path:<file>`, or `--evidence command:<cmd>`). Do not propose or confirm row `done` from the worker CLI.\",\r\n \"- Propose/confirm row `done` is MCP/session only: chat agents use `agent_os_plan_progress_event_append` on the slug route (implementer proposes with `proposed: true`; report_reviewer/deep_reviewer confirm with `proposed: false`).\",\r\n \"- When blocked on operator/Ghost/runtime review, create a linked review task (MCP `agent_os_plan_review_task_create` or API) and pass `--review-task <taskId>`.\",\r\n \"- Before the completion report: mark completion-report rows partial with evidence; do not skip report review.\",\r\n \"- After implementation: wait for report_reviewer then deep_reviewer confirmation (via MCP/session agents) before follow-up rows close.\",\r\n input.planId\r\n ? `Active planId: ${input.planId}${input.taskId ? ` \u00B7 taskId: ${input.taskId}` : \"\"}`\r\n : \"No planId on this worker \u2014 still emit progress when you touch plan-scoped work.\",\r\n ];\r\n return [\r\n \"You are running under the Kynver AgentOS runtime.\",\r\n \"Immediately state your plan before editing.\",\r\n ownership,\r\n `Worktree: ${input.worktreePath}`,\r\n `Progress heartbeat file: ${input.heartbeatPath}`,\r\n \"After each major step, append one JSON line to the heartbeat file with fields: ts, phase, summary, changedFiles, blocker.\",\r\n \"Final response must include files changed, verification commands, and unresolved risks.\",\r\n \"\",\r\n ...progressLines,\r\n \"\",\r\n \"Task:\",\r\n input.task,\r\n ].join(\"\\n\");\r\n}\r\n", "import { closeSync, openSync } from \"node:fs\";\r\nimport { spawn } from \"node:child_process\";\r\nimport { scrubClaudeEnv } from \"../git.js\";\r\nimport type { WorkerProvider, WorkerProviderStartOptions } from \"./types.js\";\r\n\r\nexport const claudeProvider: WorkerProvider = {\r\n name: \"claude\",\r\n start(opts) {\r\n const model = opts.model || \"claude-opus-4-7\";\r\n const stdoutFd = openSync(opts.stdoutPath, \"a\");\r\n const stderrFd = openSync(opts.stderrPath, \"a\");\r\n const child = spawn(\r\n \"claude\",\r\n [\r\n \"--model\",\r\n model,\r\n \"-p\",\r\n \"--verbose\",\r\n \"--permission-mode\",\r\n \"bypassPermissions\",\r\n \"--output-format\",\r\n \"stream-json\",\r\n \"--include-partial-messages\",\r\n opts.prompt,\r\n ],\r\n {\r\n cwd: opts.worktreePath,\r\n detached: true,\r\n stdio: [\"ignore\", stdoutFd, stderrFd],\r\n env: scrubClaudeEnv(process.env),\r\n },\r\n );\r\n closeSync(stdoutFd);\r\n closeSync(stderrFd);\r\n\r\n if (!child.pid) {\r\n throw new Error(\"failed to spawn claude worker process (is the `claude` CLI on PATH?)\");\r\n }\r\n child.unref();\r\n return { pid: child.pid, model };\r\n },\r\n};\r\n", "import { closeSync, existsSync, openSync, readdirSync } from \"node:fs\";\r\nimport { spawn } from \"node:child_process\";\r\nimport path from \"node:path\";\r\nimport type { WorkerProvider, WorkerProviderStartOptions } from \"./types.js\";\r\n\r\nconst DEFAULT_CURSOR_MODEL = \"composer-2.5\";\r\n\r\ninterface CursorSpawnTarget {\r\n executable: string;\r\n prefixArgs: string[];\r\n shell: boolean;\r\n detached: boolean;\r\n}\r\n\r\nfunction latestVersionDir(versionsRoot: string): string | null {\r\n if (!existsSync(versionsRoot)) return null;\r\n const versions = readdirSync(versionsRoot, { withFileTypes: true })\r\n .filter((entry) => entry.isDirectory() && /^\\d{4}\\.\\d/.test(entry.name))\r\n .map((entry) => entry.name)\r\n .sort((a, b) => b.localeCompare(a));\r\n return versions[0] ? path.join(versionsRoot, versions[0]) : null;\r\n}\r\n\r\nfunction resolveBundledCursor(versionDir: string): CursorSpawnTarget | null {\r\n const nodeExe = path.join(versionDir, \"node.exe\");\r\n const indexJs = path.join(versionDir, \"index.js\");\r\n if (!existsSync(nodeExe) || !existsSync(indexJs)) return null;\r\n return { executable: nodeExe, prefixArgs: [indexJs], shell: false, detached: true };\r\n}\r\n\r\nfunction resolveWindowsCursorSpawn(agentBin: string): CursorSpawnTarget | null {\r\n const agentRoot = path.dirname(agentBin);\r\n const direct = resolveBundledCursor(agentRoot);\r\n if (direct) return direct;\r\n const versionDir = latestVersionDir(path.join(agentRoot, \"versions\"));\r\n return versionDir ? resolveBundledCursor(versionDir) : null;\r\n}\r\n\r\nexport function resolveCursorSpawn(agentBin: string): CursorSpawnTarget {\r\n if (process.platform === \"win32\" && /\\.(cmd|bat)$/i.test(agentBin)) {\r\n const bundled = resolveWindowsCursorSpawn(agentBin);\r\n if (bundled) return bundled;\r\n // shell + detached loses fd stdio on Windows; keep the worker attached instead.\r\n return { executable: agentBin, prefixArgs: [], shell: true, detached: false };\r\n }\r\n return { executable: agentBin, prefixArgs: [], shell: false, detached: true };\r\n}\r\n\r\nfunction resolveAgentBin(): string {\r\n const configured =\r\n process.env.KYNVER_CURSOR_AGENT_BIN?.trim() ||\r\n process.env.CURSOR_AGENT_BIN?.trim();\r\n if (configured) return configured;\r\n\r\n if (process.platform === \"win32\") {\r\n const localAgent = path.join(process.env.LOCALAPPDATA || \"\", \"cursor-agent\", \"agent.cmd\");\r\n if (existsSync(localAgent)) return localAgent;\r\n }\r\n\r\n return \"agent\";\r\n}\r\n\r\nexport const cursorProvider: WorkerProvider = {\r\n name: \"cursor\",\r\n start(opts) {\r\n const model = opts.model || DEFAULT_CURSOR_MODEL;\r\n const stdoutFd = openSync(opts.stdoutPath, \"a\");\r\n const stderrFd = openSync(opts.stderrPath, \"a\");\r\n const agentBin = resolveAgentBin();\r\n const spawnTarget = resolveCursorSpawn(agentBin);\r\n const child = spawn(\r\n spawnTarget.executable,\r\n [\r\n ...spawnTarget.prefixArgs,\r\n \"-p\",\r\n \"--force\",\r\n \"--trust\",\r\n \"--workspace\",\r\n opts.worktreePath,\r\n \"--output-format\",\r\n \"stream-json\",\r\n \"--stream-partial-output\",\r\n \"--model\",\r\n model,\r\n opts.prompt,\r\n ],\r\n {\r\n cwd: opts.worktreePath,\r\n detached: spawnTarget.detached,\r\n shell: spawnTarget.shell,\r\n stdio: [\"ignore\", stdoutFd, stderrFd],\r\n env: {\r\n ...process.env,\r\n ...(spawnTarget.prefixArgs.length > 0 ? { CURSOR_INVOKED_AS: path.basename(agentBin) } : {}),\r\n },\r\n },\r\n );\r\n closeSync(stdoutFd);\r\n closeSync(stderrFd);\r\n\r\n if (!child.pid) {\r\n throw new Error(\r\n `failed to spawn Cursor agent worker (is \\`${agentBin}\\` on PATH? run \\`agent login\\` or set CURSOR_API_KEY)`,\r\n );\r\n }\r\n child.unref();\r\n return { pid: child.pid, model };\r\n },\r\n};\r\n", "import { loadUserConfig } from \"../config.js\";\r\nimport { claudeProvider } from \"./claude.js\";\r\nimport { cursorProvider } from \"./cursor.js\";\r\nimport type { WorkerProvider } from \"./types.js\";\r\n\r\nconst BUILTIN: Record<string, WorkerProvider> = {\r\n claude: claudeProvider,\r\n cursor: cursorProvider,\r\n};\r\n\r\nlet overrideProvider: WorkerProvider | null = null;\r\n\r\n/** Test hook \u2014 inject a stub provider without spawning Claude. */\r\nexport function setWorkerProviderForTests(provider: WorkerProvider | null): void {\r\n overrideProvider = provider;\r\n}\r\n\r\nexport function resolveWorkerProvider(name?: string): WorkerProvider {\r\n if (overrideProvider) return overrideProvider;\r\n const configured = (name || loadUserConfig().workerProvider || \"claude\").trim();\r\n const provider = BUILTIN[configured];\r\n if (!provider) {\r\n throw new Error(`unknown worker provider \"${configured}\" \u2014 supported: ${Object.keys(BUILTIN).join(\", \")}`);\r\n }\r\n return provider;\r\n}\r\n", "// packages/kynver-runtime/src/auto-complete.ts\r\n//\r\n// Per-worker completion sidecar (the missing link for \"clean retry / named\r\n// worker / finalResult attribution\"). The `kynver worker start` path spawns a\r\n// worker process detached + unref'd, so the parent invocation returns\r\n// immediately. With no per-run `kynver daemon` running, nothing then notices\r\n// the worker's finalResult and POSTs `/api/agent-os/.../harness/completion`,\r\n// leaving the linked AgentTask stuck in `running` indefinitely (live evidence:\r\n// run 20260525t094246z-retry-dalton-post-merge-review-clean / task\r\n// 2a63e02f-ea56-4652-b260-8410b5a0c666).\r\n//\r\n// `worker auto-complete` is a tiny long-lived sidecar that polls until the\r\n// worker is finished (finalResult OR pid dead) and then runs `tryCompleteWorker`\r\n// \u2014 exactly what `runPipelineTick \u2192 completeFinishedWorkers` does, but scoped to\r\n// a single worker. `worker start` detaches one of these per board-linked worker.\r\n//\r\n// Kept small on purpose: no Prisma, no daemon shape, no global state. The\r\n// existing `tryCompleteWorker` already handles auth refresh, structural-blocker\r\n// persistence, and the dispatched-vs-direct distinction.\r\n\r\nimport { spawn } from \"node:child_process\";\r\nimport { existsSync, openSync, closeSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { fileURLToPath } from \"node:url\";\r\nimport { loadWorker } from \"./run-store.js\";\r\nimport { computeWorkerStatus, isFinishedWorkerStatus } from \"./status.js\";\r\nimport { tryCompleteWorker } from \"./worker-ops.js\";\r\nimport { isPidAlive, sleepMs } from \"./util.js\";\r\n\r\n/**\r\n * Defaults tuned for \"good enough for a one-off worker that may run for tens of\r\n * minutes\": ~5s between polls, ~6h cap on total wait time. The 6h cap is a\r\n * defence-in-depth tripwire \u2014 a wedged worker should be reaped by the harness\r\n * watchdog long before we hit it.\r\n */\r\nconst DEFAULT_POLL_MS = 5_000;\r\nconst DEFAULT_MAX_TOTAL_MS = 6 * 60 * 60 * 1000;\r\n/**\r\n * Retry budget for transient (non-2xx, non-401/403) completion failures after\r\n * the worker has finished. We do not loop forever \u2014 `tryCompleteWorker` already\r\n * persists a `completionBlocker` so the run stays non-terminal; a human/daemon\r\n * sweep will replay it.\r\n */\r\nconst DEFAULT_COMPLETE_ATTEMPTS = 3;\r\nconst DEFAULT_COMPLETE_BACKOFF_MS = 5_000;\r\n\r\nexport interface AutoCompleteArgs {\r\n run: string;\r\n name: string;\r\n agentOsId?: string;\r\n pollMs?: number;\r\n maxTotalMs?: number;\r\n completeAttempts?: number;\r\n completeBackoffMs?: number;\r\n baseUrl?: string;\r\n secret?: string;\r\n}\r\n\r\nexport interface AutoCompleteOutcome {\r\n worker: string;\r\n runId: string;\r\n /** \"completed\" \u2192 finished + completion call returned ok. \"blocked\" \u2192 finished + completion replay refused (structural blocker set). \"timed_out\" \u2192 never finished within the cap. */\r\n outcome: \"completed\" | \"blocked\" | \"timed_out\" | \"missing_link\";\r\n httpStatus?: number;\r\n attempts: number;\r\n reason?: string;\r\n}\r\n\r\nfunction readArgs(raw: Record<string, string | boolean>): AutoCompleteArgs {\r\n return {\r\n run: String(raw.run || \"\"),\r\n name: String(raw.name || \"\"),\r\n agentOsId: raw.agentOsId ? String(raw.agentOsId) : undefined,\r\n pollMs: Number(raw.pollMs) > 0 ? Math.floor(Number(raw.pollMs)) : undefined,\r\n maxTotalMs: Number(raw.maxTotalMs) > 0 ? Math.floor(Number(raw.maxTotalMs)) : undefined,\r\n completeAttempts:\r\n Number(raw.completeAttempts) > 0 ? Math.floor(Number(raw.completeAttempts)) : undefined,\r\n completeBackoffMs:\r\n Number(raw.completeBackoffMs) > 0 ? Math.floor(Number(raw.completeBackoffMs)) : undefined,\r\n baseUrl: raw.baseUrl ? String(raw.baseUrl) : undefined,\r\n secret: raw.secret ? String(raw.secret) : undefined,\r\n };\r\n}\r\n\r\n/**\r\n * Sidecar body: poll the worker until it finishes, then POST completion (with a\r\n * small retry budget). Pure logic \u2014 the CLI just adapts `--`-args in/out.\r\n */\r\nexport async function autoCompleteWorker(\r\n raw: Record<string, string | boolean>,\r\n): Promise<AutoCompleteOutcome> {\r\n const args = readArgs(raw);\r\n const pollMs = args.pollMs ?? DEFAULT_POLL_MS;\r\n const maxTotalMs = args.maxTotalMs ?? DEFAULT_MAX_TOTAL_MS;\r\n const completeAttempts = args.completeAttempts ?? DEFAULT_COMPLETE_ATTEMPTS;\r\n const completeBackoffMs = args.completeBackoffMs ?? DEFAULT_COMPLETE_BACKOFF_MS;\r\n\r\n const worker = loadWorker(args.run, args.name);\r\n if (!worker.agentOsId || !worker.taskId) {\r\n return {\r\n worker: worker.name,\r\n runId: worker.runId,\r\n outcome: \"missing_link\",\r\n attempts: 0,\r\n reason: \"worker has no agentOsId/taskId \u2014 nothing to attribute completion to\",\r\n };\r\n }\r\n\r\n // Wait for the worker to finish (finalResult OR dead pid). Bail at the\r\n // overall cap; the calling daemon/watchdog will reap a stuck worker.\r\n const startMs = Date.now();\r\n // We do not sleep before the first poll \u2014 a worker that already finished by\r\n // the time the sidecar starts (e.g. very fast workers, or restarts) is picked\r\n // up immediately.\r\n // eslint-disable-next-line no-constant-condition\r\n while (true) {\r\n const status = computeWorkerStatus(worker);\r\n if (isFinishedWorkerStatus(status)) break;\r\n // Defence in depth: if the pid is gone even though `isFinishedWorkerStatus`\r\n // hasn't latched yet (rare race on the heartbeat clock), do not spin.\r\n if (!isPidAlive(worker.pid)) break;\r\n if (Date.now() - startMs > maxTotalMs) {\r\n return {\r\n worker: worker.name,\r\n runId: worker.runId,\r\n outcome: \"timed_out\",\r\n attempts: 0,\r\n reason: `worker did not finish within ${maxTotalMs}ms`,\r\n };\r\n }\r\n sleepMs(pollMs);\r\n }\r\n\r\n // Worker is finished. Drive completion through the existing reporter so we\r\n // inherit auth refresh, blocker persistence, and the dispatched-vs-direct\r\n // gate handling for free.\r\n let lastHttpStatus: number | undefined;\r\n let lastReason: string | undefined;\r\n for (let attempt = 1; attempt <= completeAttempts; attempt++) {\r\n const result = await tryCompleteWorker({\r\n run: args.run,\r\n name: args.name,\r\n ...(args.agentOsId ? { agentOsId: args.agentOsId } : {}),\r\n ...(args.baseUrl ? { baseUrl: args.baseUrl } : {}),\r\n ...(args.secret ? { secret: args.secret } : {}),\r\n });\r\n lastHttpStatus = result.httpStatus;\r\n if (result.ok) {\r\n return {\r\n worker: worker.name,\r\n runId: worker.runId,\r\n outcome: \"completed\",\r\n httpStatus: result.httpStatus,\r\n attempts: attempt,\r\n };\r\n }\r\n // Sticky failures: auth rejection (401/403) is structural \u2014 the\r\n // refresh-and-retry has already been attempted inside `tryCompleteWorker`,\r\n // so doing it again with the same body will not help. The blocker is\r\n // already persisted; surface it and stop.\r\n // Other non-2xx (e.g. 5xx, transient network) are eligible to retry within\r\n // the budget.\r\n const authRejected = result.httpStatus === 401 || result.httpStatus === 403;\r\n if (authRejected) {\r\n lastReason = typeof result.reason === \"string\" ? result.reason : \"completion replay refused\";\r\n return {\r\n worker: worker.name,\r\n runId: worker.runId,\r\n outcome: \"blocked\",\r\n httpStatus: result.httpStatus,\r\n attempts: attempt,\r\n reason: lastReason,\r\n };\r\n }\r\n lastReason = typeof result.reason === \"string\" ? result.reason : \"transient failure\";\r\n if (attempt < completeAttempts) sleepMs(completeBackoffMs);\r\n }\r\n\r\n return {\r\n worker: worker.name,\r\n runId: worker.runId,\r\n outcome: \"blocked\",\r\n httpStatus: lastHttpStatus,\r\n attempts: completeAttempts,\r\n reason: lastReason ?? \"completion failed after retries\",\r\n };\r\n}\r\n\r\n/** CLI entry: write outcome JSON to stdout. Exit code 0 on completed/blocked (both record state); 1 on missing_link / timed_out. */\r\nexport async function autoCompleteWorkerCli(raw: Record<string, string | boolean>): Promise<void> {\r\n try {\r\n const outcome = await autoCompleteWorker(raw);\r\n console.log(JSON.stringify(outcome, null, 2));\r\n if (outcome.outcome === \"missing_link\" || outcome.outcome === \"timed_out\") {\r\n process.exitCode = 1;\r\n }\r\n } catch (error) {\r\n console.error(`worker auto-complete failed: ${(error as Error).message}`);\r\n process.exitCode = 1;\r\n }\r\n}\r\n\r\nexport interface SpawnSidecarOptions {\r\n runId: string;\r\n workerName: string;\r\n workerDir: string;\r\n /** Override the CLI script the sidecar invokes. Tests inject this. */\r\n cliPath?: string;\r\n /** Override the node executable. Tests inject this. */\r\n nodeExecutable?: string;\r\n /**\r\n * Carry the agentOsId on the command line so the sidecar still resolves\r\n * its callback target even if `worker.json` is rewritten/relocated.\r\n */\r\n agentOsId?: string;\r\n /**\r\n * Pass-through for callers that want a non-default base URL/secret (e.g.\r\n * tests or operator overrides). Production reads them from env.\r\n */\r\n baseUrl?: string;\r\n secret?: string;\r\n}\r\n\r\nexport interface SpawnedSidecar {\r\n pid?: number;\r\n logPath: string;\r\n cliPath: string;\r\n}\r\n\r\nfunction resolveDefaultCliPath(): string {\r\n // dist/auto-complete.js sits next to dist/cli.js after the build; in the\r\n // source tree, the same file layout holds under packages/kynver-runtime/dist.\r\n return path.join(fileURLToPath(new URL(\".\", import.meta.url)), \"cli.js\");\r\n}\r\n\r\n/**\r\n * Detach a per-worker completion sidecar that owns the worker's\r\n * finalResult \u2192 AgentTask attribution. Returns the spawned pid (or undefined if\r\n * `dryRun`). Failures here MUST NOT crash `worker start`: the worker is already\r\n * running; missing the sidecar just means a daemon/watchdog has to replay\r\n * completion later.\r\n */\r\nexport function spawnCompletionSidecar(opts: SpawnSidecarOptions): SpawnedSidecar | undefined {\r\n const cliPath = opts.cliPath ?? resolveDefaultCliPath();\r\n if (!existsSync(cliPath)) return undefined;\r\n const logPath = path.join(opts.workerDir, \"auto-complete.log\");\r\n let logFd: number | undefined;\r\n try {\r\n logFd = openSync(logPath, \"a\");\r\n } catch {\r\n logFd = undefined;\r\n }\r\n const stdio: (\"ignore\" | number)[] = [\r\n \"ignore\",\r\n logFd ?? \"ignore\",\r\n logFd ?? \"ignore\",\r\n ];\r\n const nodeExecutable = opts.nodeExecutable ?? process.execPath;\r\n const args = [\r\n cliPath,\r\n \"worker\",\r\n \"auto-complete\",\r\n \"--run\",\r\n opts.runId,\r\n \"--name\",\r\n opts.workerName,\r\n ];\r\n if (opts.agentOsId) args.push(\"--agent-os-id\", opts.agentOsId);\r\n if (opts.baseUrl) args.push(\"--base-url\", opts.baseUrl);\r\n if (opts.secret) args.push(\"--secret\", opts.secret);\r\n try {\r\n const child = spawn(nodeExecutable, args, {\r\n detached: true,\r\n stdio,\r\n env: process.env,\r\n });\r\n if (logFd !== undefined) closeSync(logFd);\r\n child.unref();\r\n return { pid: child.pid, logPath, cliPath };\r\n } catch {\r\n if (logFd !== undefined) {\r\n try {\r\n closeSync(logFd);\r\n } catch {\r\n // best effort\r\n }\r\n }\r\n return undefined;\r\n }\r\n}\r\n", "import path from \"node:path\";\r\nimport { resolveBaseUrl, resolveCallbackSecretWithMint, refreshRunnerToken } from \"./config.js\";\r\nimport { buildHarnessCallbackHeaders } from \"./callback-headers.js\";\r\nimport { loadRun, loadWorker, runDirectory, saveWorker } from \"./run-store.js\";\r\nimport { computeWorkerStatus, deriveRunStatus, isFinishedWorkerStatus } from \"./status.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\nimport { summarizeEvent } from \"./stream.js\";\r\nimport {\r\n isPidAlive,\r\n killWorkerProcess,\r\n readJson,\r\n required,\r\n safeJson,\r\n safeSlug,\r\n sleepMs,\r\n tailFile,\r\n writeJson,\r\n} from \"./util.js\";\r\n\r\ninterface CompletionPost {\r\n ok: boolean;\r\n status: number;\r\n parsed: unknown;\r\n}\r\n\r\nasync function postCompletion(url: string, secret: string, body: unknown): Promise<CompletionPost> {\r\n const res = await fetch(url, {\r\n method: \"POST\",\r\n headers: buildHarnessCallbackHeaders(secret),\r\n body: JSON.stringify(body),\r\n });\r\n let parsed: unknown = null;\r\n try {\r\n parsed = await res.json();\r\n } catch {\r\n parsed = null;\r\n }\r\n return { ok: res.ok, status: res.status, parsed };\r\n}\r\n\r\nfunction completionErrorText(parsed: unknown): string | undefined {\r\n if (parsed && typeof parsed === \"object\") {\r\n const err = (parsed as Record<string, unknown>).error;\r\n if (typeof err === \"string\" && err.trim()) return err.trim();\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Persist (or clear) the worker's structural completion blocker. Only writes\r\n * when the value actually changes, so the happy path never churns worker.json.\r\n */\r\nfunction persistCompletionBlocker(worker: HarnessWorkerRecord, reason: string | undefined): void {\r\n const current = worker.completionBlocker;\r\n if ((current ?? undefined) === (reason ?? undefined)) return;\r\n if (reason) worker.completionBlocker = reason;\r\n else delete worker.completionBlocker;\r\n saveWorker(worker.runId, worker);\r\n}\r\n\r\nexport async function tryCompleteWorker(\r\n args: Record<string, string | boolean>,\r\n): Promise<{\r\n ok: boolean;\r\n skipped?: boolean;\r\n reason?: string;\r\n httpStatus?: number;\r\n response?: unknown;\r\n completionBlocked?: boolean;\r\n}> {\r\n const worker = loadWorker(String(args.run), String(args.name));\r\n const status = computeWorkerStatus(worker);\r\n const agentOsId = (args.agentOsId ? String(args.agentOsId) : worker.agentOsId) || \"\";\r\n const taskId = (args.taskId ? String(args.taskId) : worker.taskId) || null;\r\n if (!agentOsId) {\r\n return { ok: false, reason: \"missing agentOsId\" };\r\n }\r\n if (!isFinishedWorkerStatus(status)) {\r\n return { ok: true, skipped: true, reason: \"worker-not-finished\" };\r\n }\r\n\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const explicitSecret = args.secret ? String(args.secret) : undefined;\r\n let secret = await resolveCallbackSecretWithMint(explicitSecret, agentOsId, { baseUrl: base });\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/harness/completion`;\r\n const body = {\r\n source: \"openclaw-harness\",\r\n agentOsId,\r\n runId: worker.runId,\r\n workerName: worker.name,\r\n taskId,\r\n startedAt: worker.startedAt,\r\n finishedAt: status.lastActivityAt || new Date().toISOString(),\r\n status,\r\n };\r\n\r\n let result = await postCompletion(url, secret, body);\r\n\r\n // A scoped runner token can be revoked, expired, or scoped to a DIFFERENT\r\n // workspace (the self-linked repair case) \u2014 the completion route then 401s\r\n // with \"Invalid, revoked, or cross-workspace runner token\". A finished\r\n // finalResult worker whose completion is rejected must NOT be papered over as\r\n // done. First try to recover and ADVANCE: force-mint a fresh token scoped to\r\n // the correct agentOsId and retry once. (Skipped when the caller passed an\r\n // explicit --secret; respect their choice.)\r\n if ((result.status === 401 || result.status === 403) && !explicitSecret) {\r\n const refreshed = await refreshRunnerToken(agentOsId, { baseUrl: base });\r\n if (refreshed && refreshed !== secret) {\r\n secret = refreshed;\r\n result = await postCompletion(url, secret, body);\r\n }\r\n }\r\n\r\n if (result.ok) {\r\n // Completion acknowledged \u2014 clear any prior structural blocker.\r\n persistCompletionBlocker(worker, undefined);\r\n return { ok: true, httpStatus: result.status, response: result.parsed };\r\n }\r\n\r\n // Still not acknowledged. Record a structural blocker so finalize keeps the\r\n // run non-terminal and the board surfaces it (rather than reporting done\r\n // while the linked AgentTask stays queued).\r\n const authRejected = result.status === 401 || result.status === 403;\r\n const detail = completionErrorText(result.parsed) ?? (authRejected ? \"runner token unauthorized\" : \"non-2xx response\");\r\n const reason = authRejected\r\n ? `completion replay rejected (${result.status}): ${detail}`\r\n : `completion replay failed (${result.status}): ${detail}`;\r\n persistCompletionBlocker(worker, reason);\r\n return { ok: false, httpStatus: result.status, response: result.parsed, completionBlocked: true };\r\n}\r\n\r\nexport async function completeWorker(args: Record<string, string | boolean>): Promise<void> {\r\n try {\r\n const worker = loadWorker(String(args.run), String(args.name));\r\n const status = computeWorkerStatus(worker);\r\n const agentOsId = (args.agentOsId ? String(args.agentOsId) : worker.agentOsId) || \"\";\r\n const taskId = (args.taskId ? String(args.taskId) : worker.taskId) || null;\r\n if (!agentOsId) {\r\n console.error(\"worker complete requires --agent-os-id (or an agentOsId persisted at worker start)\");\r\n process.exit(1);\r\n }\r\n if (!isFinishedWorkerStatus(status)) {\r\n console.log(\r\n JSON.stringify(\r\n {\r\n worker: worker.name,\r\n runId: worker.runId,\r\n status: \"skipped\",\r\n reason: \"worker-not-finished\",\r\n workerStatus: status.status,\r\n alive: status.alive,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n return;\r\n }\r\n\r\n const result = await tryCompleteWorker(args);\r\n console.log(\r\n JSON.stringify(\r\n {\r\n worker: worker.name,\r\n runId: worker.runId,\r\n agentOsId,\r\n taskId,\r\n httpStatus: result.httpStatus,\r\n response: result.response,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n if (!result.ok) process.exit(1);\r\n } catch (error) {\r\n console.error(`worker complete failed: ${(error as Error).message}`);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport function workerStatus(args: Record<string, string | boolean>): void {\r\n const worker = loadWorker(String(args.run), String(args.name));\r\n const status = computeWorkerStatus(worker);\r\n writeJson(path.join(worker.workerDir, \"last-status.json\"), status);\r\n console.log(JSON.stringify(status, null, 2));\r\n}\r\n\r\nexport function runStatus(args: Record<string, string | boolean>): void {\r\n const run = loadRun(String(args.run));\r\n const names = Object.keys(run.workers || {});\r\n const workers = names.map((name) => {\r\n const worker = readJson<Record<string, unknown>>(\r\n path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n if (!worker) {\r\n return { worker: name, status: \"missing\", attention: \"needs_attention\", attentionReason: \"worker.json not found\" };\r\n }\r\n const status = computeWorkerStatus(worker as never, { base: run.base });\r\n // A finished worker whose completion replay was rejected (e.g. revoked /\r\n // cross-workspace runner token) is not done \u2014 surface it as blocked on the\r\n // board even though the worker has a finalResult, so local status does not\r\n // read \"done\" while the linked AgentTask is still stuck.\r\n const rawBlocker = worker.completionBlocker;\r\n const completionBlocker = typeof rawBlocker === \"string\" && rawBlocker ? rawBlocker : undefined;\r\n return {\r\n worker: status.worker,\r\n status: completionBlocker ? \"blocked\" : status.status,\r\n attention: completionBlocker ? \"blocked\" : status.attention.state,\r\n attentionReason: completionBlocker ?? status.attention.reason,\r\n pid: status.pid,\r\n alive: status.alive,\r\n currentTool: status.currentTool,\r\n lastActivityAt: status.lastActivityAt,\r\n lastHeartbeatPhase: status.lastHeartbeatPhase,\r\n lastHeartbeatSummary: status.lastHeartbeatSummary,\r\n heartbeatBlocker: status.heartbeatBlocker,\r\n changedFileCount: status.changedFiles.length,\r\n branch: status.branch,\r\n ancestry: status.gitAncestry.relation,\r\n ancestryChecked: status.gitAncestry.checked,\r\n };\r\n });\r\n const board = {\r\n runId: run.id,\r\n name: run.name,\r\n status: deriveRunStatus(run.status, workers),\r\n repo: run.repo,\r\n workerCount: workers.length,\r\n needsAttention: workers.filter((w) => w.attention && w.attention !== \"ok\" && w.attention !== \"done\").map((w) => w.worker),\r\n workers,\r\n };\r\n writeJson(path.join(runDirectory(run.id), \"last-board.json\"), board);\r\n console.log(JSON.stringify(board, null, 2));\r\n}\r\n\r\nexport function tailWorker(args: Record<string, string | boolean>): void {\r\n const worker = loadWorker(String(args.run), String(args.name));\r\n const raw = tailFile(worker.stdoutPath, Number(args.lines || 40));\r\n if (args.raw === true || args.raw === \"true\") {\r\n process.stdout.write(raw);\r\n return;\r\n }\r\n for (const line of raw.split(\"\\n\").filter(Boolean)) {\r\n const event = safeJson(line) as Record<string, unknown> | null;\r\n const summary = event ? summarizeEvent(event) : line;\r\n if (summary) console.log(summary);\r\n }\r\n}\r\n\r\nexport function stopWorker(args: Record<string, string | boolean>): void {\r\n const worker = loadWorker(String(args.run), String(args.name));\r\n if (!isPidAlive(worker.pid)) {\r\n console.log(JSON.stringify({ worker: worker.name, pid: worker.pid, status: \"not_running\" }, null, 2));\r\n return;\r\n }\r\n killWorkerProcess(worker.pid!, \"SIGTERM\");\r\n sleepMs(1500);\r\n if (isPidAlive(worker.pid)) {\r\n killWorkerProcess(worker.pid!, \"SIGKILL\");\r\n console.log(JSON.stringify({ worker: worker.name, pid: worker.pid, status: \"sigkill_sent\" }, null, 2));\r\n return;\r\n }\r\n console.log(JSON.stringify({ worker: worker.name, pid: worker.pid, status: \"stopped\" }, null, 2));\r\n}\r\n", "import path from \"node:path\";\r\nimport { resolveBaseUrl, resolveCallbackSecretWithMint } from \"./config.js\";\r\nimport { postJson } from \"./callbacks.js\";\r\nimport { observeRunnerDiskGate } from \"./disk-gate.js\";\r\nimport { observeRunnerResourceGate } from \"./resource-gate.js\";\r\nimport { loadRun } from \"./run-store.js\";\r\nimport { runDirectory } from \"./run-store.js\";\r\nimport { spawnWorkerProcess } from \"./supervisor.js\";\r\nimport { required, safeSlug } from \"./util.js\";\r\n\r\nexport const DEFAULT_DISPATCH_LEASE_MS = 60 * 60 * 1000;\r\n\r\nexport function buildDispatchTaskText(task: Record<string, unknown>, agentOsId: string): string {\r\n return [\r\n `[AgentOS task ${task.id}] ${task.title}`,\r\n \"\",\r\n task.description ? String(task.description) : \"(no description on the board task)\",\r\n \"\",\r\n `Board linkage: agentOsId=${agentOsId}, taskId=${task.id}, attempt=${task.attempt}, executor=${task.executor}${\r\n task.executorRef ? `, executorRef=${task.executorRef}` : \"\"\r\n }.`,\r\n \"This worker was dispatched from the AgentOS board. The harness reports your completion back to the board when you finish.\",\r\n ].join(\"\\n\");\r\n}\r\n\r\nexport async function dispatchRun(args: Record<string, string | boolean>): Promise<Record<string, unknown> | void> {\r\n const pipeline = args.pipeline === true || args.pipeline === \"true\";\r\n try {\r\n const run = loadRun(String(required(String(args.run || \"\"), \"--run\")));\r\n const agentOsId = String(required(String(args.agentOsId || \"\"), \"--agent-os-id\"));\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : undefined, agentOsId, { baseUrl: base });\r\n const execute = args.execute === true || args.execute === \"true\";\r\n const dryRun = !execute;\r\n const leaseOwner = `openclaw-harness:${run.id}`;\r\n\r\n const runnerDiskGate = args.diskPath\r\n ? observeRunnerDiskGate({ diskPath: String(args.diskPath) })\r\n : observeRunnerDiskGate({ diskPath: run.repo });\r\n const runnerResourceGate = observeRunnerResourceGate({ runId: run.id });\r\n const requestedStarts = Number(args.maxStarts) > 0 ? Math.floor(Number(args.maxStarts)) : 1;\r\n const cappedStarts = dryRun\r\n ? requestedStarts\r\n : Math.min(requestedStarts, runnerResourceGate.slotsAvailable);\r\n\r\n const dispatchUrl = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/tasks/dispatch-next`;\r\n const body: Record<string, unknown> = {\r\n agentOsId,\r\n dryRun,\r\n maxStarts: cappedStarts,\r\n leaseOwner,\r\n leaseDurationMs:\r\n Number(args.leaseMs) > 0 ? Math.floor(Number(args.leaseMs)) : DEFAULT_DISPATCH_LEASE_MS,\r\n runnerDiskGate,\r\n runnerResourceGate,\r\n ...(args.lane ? { lane: String(args.lane) } : {}),\r\n ...(args.diskPath ? { diskPath: String(args.diskPath) } : {}),\r\n };\r\n\r\n const dispatch = await postJson(dispatchUrl, secret, body);\r\n const responseBody = dispatch.response as { ok?: boolean; result?: Record<string, unknown> } | null;\r\n if (!dispatch.ok || !responseBody?.result) {\r\n const failure = {\r\n runId: run.id,\r\n agentOsId,\r\n action: \"dispatch\",\r\n httpStatus: dispatch.status,\r\n response: dispatch.response,\r\n };\r\n if (pipeline) return { ok: false, ...failure };\r\n console.log(JSON.stringify(failure, null, 2));\r\n process.exit(1);\r\n }\r\n\r\n const result = responseBody.result;\r\n if (dryRun) {\r\n const summary = {\r\n runId: run.id,\r\n agentOsId,\r\n dryRun: true,\r\n wouldStart: (result.started as Array<{ task: Record<string, unknown>; reason: string }>).map((d) => ({\r\n taskId: d.task.id,\r\n title: d.task.title,\r\n reason: d.reason,\r\n })),\r\n skipped: (result.skipped as Array<{ task: Record<string, unknown>; skipReason: string; reason: string }>).map(\r\n (d) => ({ taskId: d.task.id, skipReason: d.skipReason, reason: d.reason }),\r\n ),\r\n diskGate: result.diskGate,\r\n resourceGate: result.resourceGate,\r\n inspected: result.inspected,\r\n };\r\n if (pipeline) return { ok: true, ...summary };\r\n console.log(JSON.stringify(summary, null, 2));\r\n return;\r\n }\r\n\r\n if (!dryRun && cappedStarts <= 0) {\r\n const summary = {\r\n runId: run.id,\r\n agentOsId,\r\n dryRun: false,\r\n skipped: true,\r\n reason: runnerResourceGate.reason ?? \"no resource slots\",\r\n resourceGate: runnerResourceGate,\r\n };\r\n if (pipeline) return { ok: true, ...summary };\r\n console.log(JSON.stringify(summary, null, 2));\r\n return;\r\n }\r\n\r\n const outcomes: Array<Record<string, unknown>> = [];\r\n for (const decision of result.started as Array<{ task: Record<string, unknown> }>) {\r\n const task = decision.task;\r\n const name = safeSlug(`t-${task.id}-a${task.attempt}`);\r\n try {\r\n const planId = task.planId ? String(task.planId) : undefined;\r\n const worker = spawnWorkerProcess(run, {\r\n name,\r\n task: buildDispatchTaskText(task, agentOsId),\r\n ownedPaths: args.owned ? String(args.owned).split(\",\").map((s) => s.trim()).filter(Boolean) : [],\r\n model: args.model ? String(args.model) : undefined,\r\n agentOsId,\r\n taskId: String(task.id),\r\n planId,\r\n leaseOwner,\r\n dispatched: true,\r\n });\r\n outcomes.push({\r\n taskId: task.id,\r\n started: true,\r\n worker: worker.name,\r\n pid: worker.pid,\r\n branch: worker.branch,\r\n });\r\n } catch (error) {\r\n const releaseUrl = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/tasks/${encodeURIComponent(String(task.id))}/release`;\r\n let release;\r\n try {\r\n release = await postJson(releaseUrl, secret, { agentOsId, leaseOwner });\r\n } catch (relErr) {\r\n release = { ok: false, error: (relErr as Error).message };\r\n }\r\n outcomes.push({\r\n taskId: task.id,\r\n started: false,\r\n error: (error as Error).message,\r\n released: release.ok === true || (release.response as Record<string, unknown>)?.ok === true,\r\n releaseResponse: release.response ?? release,\r\n });\r\n }\r\n }\r\n\r\n const summary = {\r\n runId: run.id,\r\n agentOsId,\r\n dryRun: false,\r\n leaseOwner,\r\n startedCount: outcomes.filter((o) => o.started).length,\r\n outcomes,\r\n skipped: (result.skipped as Array<{ task: Record<string, unknown>; skipReason: string }>).map((d) => ({\r\n taskId: d.task.id,\r\n skipReason: d.skipReason,\r\n })),\r\n diskGate: result.diskGate,\r\n resourceGate: result.resourceGate,\r\n };\r\n if (pipeline) {\r\n return { ok: !outcomes.some((o) => !o.started), ...summary };\r\n }\r\n console.log(JSON.stringify(summary, null, 2));\r\n if (outcomes.some((o) => !o.started)) process.exit(1);\r\n } catch (error) {\r\n if (pipeline) return { ok: false, error: (error as Error).message };\r\n console.error(`run dispatch failed: ${(error as Error).message}`);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport { runDirectory };\r\n", "import path from \"node:path\";\r\nimport { resolveBaseUrl, resolveCallbackSecretWithMint } from \"./config.js\";\r\nimport { postJson } from \"./callbacks.js\";\r\nimport { loadRun, runDirectory } from \"./run-store.js\";\r\nimport { computeWorkerStatus } from \"./status.js\";\r\nimport { required, readJson, safeSlug } from \"./util.js\";\r\n\r\nexport async function sweepRun(args: Record<string, string | boolean>): Promise<Record<string, unknown> | void> {\r\n const pipeline = args.pipeline === true || args.pipeline === \"true\";\r\n try {\r\n const run = loadRun(String(required(String(args.run || \"\"), \"--run\")));\r\n const agentOsId = String(required(String(args.agentOsId || \"\"), \"--agent-os-id\"));\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : undefined, agentOsId, { baseUrl: base });\r\n const leaseOwner = `openclaw-harness:${run.id}`;\r\n\r\n const releasedLocalOrphans: Array<Record<string, unknown>> = [];\r\n for (const name of Object.keys(run.workers || {})) {\r\n const worker = readJson<Record<string, unknown>>(\r\n path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n if (!worker || !worker.dispatched || !worker.taskId) continue;\r\n const status = computeWorkerStatus(worker as never);\r\n if (status.alive) continue;\r\n if (status.finalResult) continue;\r\n\r\n const releaseUrl = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/tasks/${encodeURIComponent(String(worker.taskId))}/release`;\r\n let release;\r\n try {\r\n release = await postJson(releaseUrl, secret, { agentOsId, leaseOwner });\r\n } catch (relErr) {\r\n release = { ok: false, error: (relErr as Error).message };\r\n }\r\n releasedLocalOrphans.push({\r\n worker: name,\r\n taskId: worker.taskId,\r\n pid: worker.pid,\r\n released: release.ok === true || (release.response as Record<string, unknown>)?.ok === true,\r\n response: release.response ?? release,\r\n });\r\n }\r\n\r\n const reapUrl = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/tasks/reap`;\r\n let reap;\r\n try {\r\n reap = await postJson(reapUrl, secret, {\r\n agentOsId,\r\n ...(Number(args.graceMs) >= 0 && args.graceMs !== undefined && args.graceMs !== true\r\n ? { graceMs: Math.floor(Number(args.graceMs)) }\r\n : {}),\r\n });\r\n } catch (reapErr) {\r\n reap = { ok: false, error: (reapErr as Error).message };\r\n }\r\n\r\n const summary = { runId: run.id, agentOsId, leaseOwner, releasedLocalOrphans, reap: reap.response ?? reap };\r\n if (pipeline) return { ok: true, ...summary };\r\n console.log(JSON.stringify(summary, null, 2));\r\n } catch (error) {\r\n if (pipeline) return { ok: false, error: (error as Error).message };\r\n console.error(`run sweep failed: ${(error as Error).message}`);\r\n process.exit(1);\r\n }\r\n}\r\n", "import { existsSync, mkdirSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { ensureGitRepo, git } from \"./git.js\";\r\nimport { getPaths } from \"./run-store.js\";\r\nimport { loadRun, runDirectory, saveRun } from \"./run-store.js\";\r\nimport { listRunIds, readJson, required, safeSlug, timestampSlug, writeJson } from \"./util.js\";\r\nimport { validateRepo, validateRunId } from \"./validate.js\";\r\n\r\nexport function createRun(args: Record<string, string | boolean>): void {\r\n const repo = validateRepo(required(String(args.repo || \"\"), \"--repo\"));\r\n ensureGitRepo(repo);\r\n const id = args.id ? validateRunId(String(args.id)) : timestampSlug(String(args.name || \"run\"));\r\n const dir = runDirectory(id);\r\n if (existsSync(dir)) failExists(`run already exists: ${id}`);\r\n mkdirSync(dir, { recursive: true });\r\n const base = String(args.base || \"origin/main\");\r\n const baseCommit = git(repo, [\"rev-parse\", base]).trim();\r\n const run = {\r\n id,\r\n name: String(args.name || id),\r\n repo,\r\n base,\r\n baseCommit,\r\n status: \"created\",\r\n createdAt: new Date().toISOString(),\r\n workers: {},\r\n };\r\n writeJson(path.join(dir, \"run.json\"), run);\r\n console.log(JSON.stringify({ runId: id, runDir: dir, repo, base, baseCommit }, null, 2));\r\n}\r\n\r\nexport function listRuns(): void {\r\n const { runsDir } = getPaths();\r\n const rows = listRunIds(runsDir)\r\n .map((id) => readJson<Record<string, unknown>>(path.join(runDirectory(id), \"run.json\"), undefined))\r\n .filter(Boolean)\r\n .map((run) => ({\r\n id: run!.id,\r\n name: run!.name,\r\n status: run!.status,\r\n repo: run!.repo,\r\n createdAt: run!.createdAt,\r\n }));\r\n console.log(JSON.stringify(rows, null, 2));\r\n}\r\n\r\nfunction failExists(message: string): never {\r\n console.error(message);\r\n process.exit(1);\r\n}\r\n\r\nexport { loadRun, saveRun, runDirectory };\r\n", "import path from \"node:path\";\r\n\r\nconst RUN_ID_RE = /^[a-z0-9][a-z0-9._-]{0,127}$/i;\r\nconst WORKER_NAME_RE = /^[a-z0-9][a-z0-9._-]{0,63}$/i;\r\n\r\nexport function validateRunId(runId: string): string {\r\n const trimmed = runId.trim();\r\n if (!RUN_ID_RE.test(trimmed)) throw new Error(`invalid run id: ${runId}`);\r\n return trimmed;\r\n}\r\n\r\nexport function validateWorkerName(name: string): string {\r\n const trimmed = name.trim();\r\n if (!WORKER_NAME_RE.test(trimmed)) throw new Error(`invalid worker name: ${name}`);\r\n return trimmed;\r\n}\r\n\r\nexport function validateRepo(repo: string): string {\r\n const resolved = path.resolve(repo);\r\n if (resolved.includes(\"..\")) throw new Error(\"repo path must not contain .. segments\");\r\n return resolved;\r\n}\r\n\r\nexport function validateOwnedPaths(repoRoot: string, ownedPaths: string[]): string[] {\r\n return ownedPaths.map((owned) => {\r\n const resolved = path.resolve(repoRoot, owned);\r\n const rel = path.relative(repoRoot, resolved);\r\n if (rel.startsWith(\"..\") || path.isAbsolute(rel)) {\r\n throw new Error(`owned path escapes repo: ${owned}`);\r\n }\r\n return resolved;\r\n });\r\n}\r\n\r\nexport function validateTailLines(lines: number): number {\r\n if (!Number.isFinite(lines) || lines <= 0 || lines > 500) return 40;\r\n return Math.floor(lines);\r\n}\r\n", "import path from \"node:path\";\r\nimport { resolveBaseUrl, resolveCallbackSecretWithMint } from \"./config.js\";\r\nimport { postJson } from \"./callbacks.js\";\r\nimport { dispatchRun } from \"./dispatch.js\";\r\nimport { finalizeStaleRuns, type RunFinalizeResult } from \"./finalize.js\";\r\nimport { observeRunnerResourceGate, type RunnerResourceGateShape } from \"./resource-gate.js\";\r\nimport { loadRun, runDirectory } from \"./run-store.js\";\r\nimport { computeWorkerStatus, isFinishedWorkerStatus } from \"./status.js\";\r\nimport { sweepRun } from \"./sweep.js\";\r\nimport { required, readJson, safeSlug } from \"./util.js\";\r\nimport { syncActiveWorkerPlanProgress } from \"./plan-progress-daemon-sync.js\";\r\nimport { runStatus, tryCompleteWorker } from \"./worker-ops.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\nimport { fetchWorkspaceRuntimePreferences } from \"./workspace-runtime-config.js\";\r\n\r\nexport interface PipelineTickResult {\r\n runId: string;\r\n agentOsId: string;\r\n execute: boolean;\r\n resourceGate: RunnerResourceGateShape;\r\n completedWorkers: Array<{ worker: string; ok: boolean; taskId?: string | null }>;\r\n finalizedStaleRuns: RunFinalizeResult[];\r\n planProgressSync: Array<{ worker: string; phase: string; ok: boolean; skipped?: boolean }>;\r\n operatorTick: unknown;\r\n sweep: unknown;\r\n dispatch: unknown;\r\n idle: boolean;\r\n}\r\n\r\nexport async function completeFinishedWorkers(\r\n runId: string,\r\n args: Record<string, string | boolean>,\r\n): Promise<Array<{ worker: string; ok: boolean; taskId?: string | null }>> {\r\n const run = loadRun(runId);\r\n const outcomes: Array<{ worker: string; ok: boolean; taskId?: string | null }> = [];\r\n for (const name of Object.keys(run.workers || {})) {\r\n const worker = readJson<HarnessWorkerRecord>(\r\n path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n if (!worker?.taskId) continue;\r\n const status = computeWorkerStatus(worker);\r\n if (!isFinishedWorkerStatus(status)) continue;\r\n // Complete pull-queue (`dispatched`) workers AND directly-started workers\r\n // that produced a finalResult \u2014 the self-linked repair worker case, where\r\n // the worker is not in the dispatch queue but its linked AgentTask must\r\n // still advance (or block) instead of sitting queued while local status\r\n // reads \"done\". A directly-started worker that exited WITHOUT a finalResult\r\n // is left alone (it may be a manual / interrupted run the runtime doesn't\r\n // own).\r\n if (!worker.dispatched && !status.finalResult) continue;\r\n const result = await tryCompleteWorker({\r\n run: runId,\r\n name,\r\n agentOsId: String(args.agentOsId || worker.agentOsId || \"\"),\r\n ...args,\r\n });\r\n outcomes.push({ worker: name, ok: result.ok, taskId: worker.taskId ?? null });\r\n }\r\n return outcomes;\r\n}\r\n\r\nasync function postOperatorTick(\r\n agentOsId: string,\r\n runId: string,\r\n resourceGate: RunnerResourceGateShape,\r\n args: Record<string, string | boolean>,\r\n): Promise<unknown> {\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : undefined, agentOsId, { baseUrl: base });\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/operator/tick`;\r\n const res = await postJson(url, secret, {\r\n agentOsId,\r\n runId,\r\n ingestHarness: true,\r\n resourceGate,\r\n });\r\n return { ok: res.ok, httpStatus: res.status, response: res.response };\r\n}\r\n\r\n/**\r\n * One operator/dispatcher cycle (M10 / D7 pull-first):\r\n * refresh status \u2192 complete finished workers \u2192 ingest operator tick \u2192 sweep leases \u2192 dispatch up to slot cap.\r\n */\r\nexport async function runPipelineTick(args: Record<string, string | boolean>): Promise<PipelineTickResult> {\r\n const runId = String(required(String(args.run || \"\"), \"--run\"));\r\n const agentOsId = String(required(String(args.agentOsId || \"\"), \"--agent-os-id\"));\r\n const execute = args.execute !== false && args.execute !== \"false\";\r\n\r\n runStatus({ run: runId });\r\n\r\n // Replay completion for finished workers FIRST, before finalizing run status.\r\n // A worker whose completion is rejected (revoked / cross-workspace runner\r\n // token) records its structural blocker here, so the finalization step below\r\n // sees it and refuses to paper the run over as `completed` while the linked\r\n // AgentTask is still stuck.\r\n const completedWorkers = await completeFinishedWorkers(runId, args);\r\n\r\n // Close out runs whose workers have all exited so they stop piling up as\r\n // \"running\" (the box had 40+ stale runs eating 28 GB of worktrees). Global\r\n // active-worker accounting already ignores dead workers; this keeps run\r\n // status truthful and lets stale worktrees be pruned safely. Completion-\r\n // blocked workers (above) keep their run non-terminal.\r\n const finalizedStaleRuns = finalizeStaleRuns();\r\n const planProgressSync = await syncActiveWorkerPlanProgress(runId, args);\r\n const workspacePrefs = await fetchWorkspaceRuntimePreferences(agentOsId, args);\r\n const resourceGate = observeRunnerResourceGate({\r\n runId,\r\n configuredMaxWorkersOverride: workspacePrefs?.maxConcurrentWorkers,\r\n });\r\n const operatorTick = await postOperatorTick(agentOsId, runId, resourceGate, args);\r\n\r\n let maxStarts = resourceGate.slotsAvailable;\r\n const tickBody = operatorTick as { response?: { dispatch?: { recommendedMaxStarts?: number } } };\r\n const advised = tickBody.response?.dispatch?.recommendedMaxStarts;\r\n if (typeof advised === \"number\") {\r\n maxStarts = Math.min(maxStarts, Math.max(0, advised));\r\n }\r\n\r\n const sweep = await sweepRun({ run: runId, agentOsId, pipeline: true, ...args });\r\n\r\n let dispatch: unknown = null;\r\n if (execute && maxStarts > 0) {\r\n dispatch = await dispatchRun({\r\n run: runId,\r\n agentOsId,\r\n execute: true,\r\n maxStarts: String(maxStarts),\r\n pipeline: true,\r\n ...args,\r\n });\r\n } else {\r\n dispatch = {\r\n ok: true,\r\n skipped: true,\r\n reason: execute ? resourceGate.reason ?? \"no slots or queued work\" : \"execute disabled\",\r\n maxStarts: 0,\r\n };\r\n }\r\n\r\n const startedCount = (dispatch as { startedCount?: number })?.startedCount ?? 0;\r\n const idle = maxStarts === 0 && completedWorkers.length === 0 && startedCount === 0;\r\n\r\n return {\r\n runId,\r\n agentOsId,\r\n execute,\r\n resourceGate,\r\n completedWorkers,\r\n finalizedStaleRuns,\r\n planProgressSync,\r\n operatorTick,\r\n sweep,\r\n dispatch,\r\n idle,\r\n };\r\n}\r\n", "import path from \"node:path\";\r\nimport { listRunRecords, runDirectory, saveRun, type HarnessRunRecord } from \"./run-store.js\";\r\nimport { computeWorkerStatus } from \"./status.js\";\r\nimport { readJson, safeSlug } from \"./util.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\n\r\nexport interface RunFinalizeResult {\r\n runId: string;\r\n from: string;\r\n to: string;\r\n}\r\n\r\n/** Run statuses we treat as \"not yet terminal\" and therefore candidates for finalization. */\r\nconst ACTIVE_RUN_STATUSES = new Set([\"running\", \"dispatching\", \"pending\", \"queued\"]);\r\n\r\n/**\r\n * Decide the terminal status for a run, or null if it should stay active.\r\n * A run is terminal once none of its workers are still alive-and-unfinished.\r\n */\r\nfunction terminalStatusFor(run: HarnessRunRecord): string | null {\r\n const names = Object.keys(run.workers || {});\r\n if (names.length === 0) return \"failed\"; // marked active but never started a worker\r\n let anyAlive = false;\r\n let anyResult = false;\r\n let anyCompletionBlocked = false;\r\n for (const name of names) {\r\n const worker = readJson<HarnessWorkerRecord | undefined>(\r\n path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n if (!worker) continue;\r\n const status = computeWorkerStatus(worker);\r\n if (status.alive && !status.finalResult) {\r\n anyAlive = true;\r\n break;\r\n }\r\n // A finished worker whose AgentOS completion replay was rejected (e.g. a\r\n // revoked / expired / cross-workspace runner token) is NOT done: its linked\r\n // AgentTask never advanced. Keep the run non-terminal so the pipeline keeps\r\n // retrying completion (and the board surfaces the blocked worker) instead of\r\n // papering an invalid runner token over as `completed`.\r\n if (typeof worker.completionBlocker === \"string\" && worker.completionBlocker) {\r\n anyCompletionBlocked = true;\r\n }\r\n if (status.finalResult) anyResult = true;\r\n }\r\n if (anyAlive) return null; // still doing real work \u2014 leave it running\r\n if (anyCompletionBlocked) return null; // completion replay blocked \u2014 not yet terminal\r\n return anyResult ? \"completed\" : \"failed\";\r\n}\r\n\r\n/**\r\n * Finalize runs that are still marked active but have no live workers.\r\n *\r\n * The harness creates one run per task and never closed them out, leaving dozens\r\n * of \"running\" runs that bloated disk and broke operator views (and made cleanup\r\n * unsafe to reason about). Active-worker accounting already excludes dead workers,\r\n * so this is about run-status hygiene + enabling safe pruning of finished runs.\r\n *\r\n * Returns the runs whose status changed.\r\n */\r\nexport function finalizeStaleRuns(): RunFinalizeResult[] {\r\n const finalized: RunFinalizeResult[] = [];\r\n for (const run of listRunRecords()) {\r\n if (!ACTIVE_RUN_STATUSES.has(run.status)) continue;\r\n const next = terminalStatusFor(run);\r\n if (!next || next === run.status) continue;\r\n const from = run.status;\r\n run.status = next;\r\n saveRun(run);\r\n finalized.push({ runId: run.id, from, to: next });\r\n }\r\n return finalized;\r\n}\r\n", "import path from \"node:path\";\r\nimport { computeWorkerStatus } from \"./status.js\";\r\nimport { loadRun, runDirectory, saveWorker } from \"./run-store.js\";\r\nimport { readJson, safeSlug } from \"./util.js\";\r\nimport { syncPlanProgress } from \"./plan-progress-sync.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\n\r\n/** Push heartbeat blockers to the server orchestrator (deduped per worker). */\r\nexport async function syncActiveWorkerPlanProgress(\r\n runId: string,\r\n args: Record<string, string | boolean>,\r\n): Promise<Array<{ worker: string; phase: string; ok: boolean; skipped?: boolean }>> {\r\n const run = loadRun(runId);\r\n const agentOsId = String(args.agentOsId || \"\");\r\n if (!agentOsId) return [];\r\n\r\n const outcomes: Array<{ worker: string; phase: string; ok: boolean; skipped?: boolean }> = [];\r\n for (const name of Object.keys(run.workers || {})) {\r\n const worker = readJson<HarnessWorkerRecord>(\r\n path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n if (!worker?.dispatched || !worker.taskId) continue;\r\n\r\n const status = computeWorkerStatus(worker);\r\n if (!status.heartbeatBlocker) continue;\r\n\r\n if (worker.lastSyncedHeartbeatBlocker === status.heartbeatBlocker) {\r\n outcomes.push({ worker: name, phase: \"heartbeat_blocker\", ok: true, skipped: true });\r\n continue;\r\n }\r\n\r\n const res = await syncPlanProgress({\r\n agentOsId,\r\n taskId: worker.taskId,\r\n phase: \"heartbeat_blocker\",\r\n blocker: status.heartbeatBlocker,\r\n baseUrl: args.baseUrl ? String(args.baseUrl) : undefined,\r\n secret: args.secret ? String(args.secret) : undefined,\r\n });\r\n if (res.ok) {\r\n worker.lastSyncedHeartbeatBlocker = status.heartbeatBlocker;\r\n saveWorker(run.id, worker);\r\n }\r\n outcomes.push({ worker: name, phase: \"heartbeat_blocker\", ok: res.ok });\r\n }\r\n\r\n return outcomes;\r\n}\r\n", "import { resolveBaseUrl, resolveCallbackSecretWithMint } from \"./config.js\";\r\nimport { postJson } from \"./callbacks.js\";\r\n\r\nexport type PlanProgressSyncPhase = \"worker_dispatched\" | \"worker_completed\" | \"heartbeat_blocker\";\r\n\r\nexport interface PlanProgressSyncArtifact {\r\n branch?: string;\r\n worktreePath?: string;\r\n prUrl?: string;\r\n headCommit?: string;\r\n changedFiles?: string[];\r\n}\r\n\r\nexport async function syncPlanProgress(args: {\r\n agentOsId: string;\r\n taskId: string;\r\n phase: PlanProgressSyncPhase;\r\n blocker?: string;\r\n artifact?: PlanProgressSyncArtifact;\r\n baseUrl?: string;\r\n secret?: string;\r\n}): Promise<{ ok: boolean; status: number; response: unknown }> {\r\n const base = resolveBaseUrl(args.baseUrl);\r\n const secret = await resolveCallbackSecretWithMint(args.secret, args.agentOsId, { baseUrl: base });\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(args.agentOsId)}/tasks/${encodeURIComponent(args.taskId)}/plan-progress-sync`;\r\n const res = await postJson(url, secret, {\r\n phase: args.phase,\r\n taskId: args.taskId,\r\n blocker: args.blocker,\r\n artifact: args.artifact,\r\n });\r\n return { ok: res.ok, status: res.status, response: res.response };\r\n}\r\n", "import { getJson } from \"./callbacks.js\";\r\nimport { resolveBaseUrl, resolveCallbackSecretWithMint } from \"./config.js\";\r\n\r\nexport interface WorkspaceRuntimePreferences {\r\n maxConcurrentWorkers: number | null;\r\n}\r\n\r\n/**\r\n * Pull the Command Center worker cap each pipeline tick so the daemon honors\r\n * workspace settings without restarting or editing ~/.kynver/config.json.\r\n */\r\nexport async function fetchWorkspaceRuntimePreferences(\r\n agentOsId: string,\r\n args: Record<string, string | boolean>,\r\n): Promise<WorkspaceRuntimePreferences | null> {\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : undefined, agentOsId, { baseUrl: base });\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/runtime`;\r\n\r\n try {\r\n const res = await getJson(url, secret);\r\n if (!res.ok) return null;\r\n const body = res.response as { preferences?: { maxConcurrentWorkers?: unknown } } | null;\r\n const raw = body?.preferences?.maxConcurrentWorkers;\r\n if (raw === null || raw === undefined) {\r\n return { maxConcurrentWorkers: null };\r\n }\r\n const n = Number(raw);\r\n if (!Number.isFinite(n) || n <= 0) return { maxConcurrentWorkers: null };\r\n return { maxConcurrentWorkers: Math.floor(n) };\r\n } catch {\r\n return null;\r\n }\r\n}\r\n", "import { loadUserConfig } from \"./config.js\";\r\nimport { required, sleepMs } from \"./util.js\";\r\nimport { runPipelineTick } from \"./pipeline-tick.js\";\r\n\r\nconst DEFAULT_INTERVAL_MS = 60_000;\r\nconst IDLE_INTERVAL_MS = 5 * 60_000;\r\nconst MAX_IDLE_STREAK = 10;\r\n\r\nexport async function runDaemon(args: Record<string, string | boolean>): Promise<void> {\r\n const runId = String(required(String(args.run || \"\"), \"--run\"));\r\n const agentOsId = String(required(String(args.agentOsId || loadUserConfig().agentOsId || \"\"), \"--agent-os-id\"));\r\n const execute = args.execute !== false && args.execute !== \"false\";\r\n const intervalMs = Number(args.intervalMs) > 0 ? Math.floor(Number(args.intervalMs)) : DEFAULT_INTERVAL_MS;\r\n let stopping = false;\r\n let idleStreak = 0;\r\n\r\n process.on(\"SIGINT\", () => {\r\n stopping = true;\r\n });\r\n process.on(\"SIGTERM\", () => {\r\n stopping = true;\r\n });\r\n\r\n console.error(JSON.stringify({ event: \"daemon_start\", runId, agentOsId, execute, intervalMs }));\r\n\r\n while (!stopping) {\r\n try {\r\n const tick = await runPipelineTick({ run: runId, agentOsId, execute, ...args });\r\n console.error(JSON.stringify({ event: \"daemon_tick\", ...tick }));\r\n\r\n if (tick.idle) {\r\n idleStreak++;\r\n } else {\r\n idleStreak = 0;\r\n }\r\n\r\n const backoff = idleStreak >= MAX_IDLE_STREAK ? IDLE_INTERVAL_MS : intervalMs;\r\n sleepMs(backoff);\r\n } catch (error) {\r\n console.error(JSON.stringify({ event: \"daemon_tick_error\", error: (error as Error).message }));\r\n sleepMs(intervalMs);\r\n }\r\n }\r\n\r\n console.error(JSON.stringify({ event: \"daemon_stop\", runId, agentOsId }));\r\n}\r\n\r\nexport { runPipelineTick } from \"./pipeline-tick.js\";\r\nexport { dispatchRun } from \"./dispatch.js\";\r\nexport { sweepRun } from \"./sweep.js\";\r\nexport { completeWorker } from \"./worker-ops.js\";\r\n", "import { resolveBaseUrl, resolveCallbackSecretWithMint, loadUserConfig } from \"./config.js\";\r\nimport { buildHarnessCallbackHeaders } from \"./callback-headers.js\";\r\nimport { required } from \"./util.js\";\r\n\r\nexport interface PlanProgressCliEvidence {\r\n type: string;\r\n value: string;\r\n exitCode?: number;\r\n stdoutTail?: string;\r\n}\r\n\r\nfunction parseEvidenceArg(raw: string): PlanProgressCliEvidence {\r\n const idx = raw.indexOf(\":\");\r\n if (idx <= 0) throw new Error(`invalid --evidence ${raw} (expected type:value)`);\r\n return { type: raw.slice(0, idx), value: raw.slice(idx + 1) };\r\n}\r\n\r\nexport async function emitPlanProgress(args: Record<string, string | boolean>): Promise<void> {\r\n const planId = required(args.plan ? String(args.plan) : undefined, \"plan\");\r\n const agentOsId =\r\n (args.agentOsId ? String(args.agentOsId) : loadUserConfig().agentOsId) || \"\";\r\n if (!agentOsId) {\r\n console.error(\"requires --agent-os-id or agentOsId in ~/.kynver/config.json\");\r\n process.exit(1);\r\n }\r\n\r\n const roleLane = required(args.role ? String(args.role) : undefined, \"role\");\r\n const status = required(args.status ? String(args.status) : undefined, \"status\");\r\n const evidence: PlanProgressCliEvidence[] = [];\r\n const rawEvidence = args.evidence;\r\n if (Array.isArray(rawEvidence)) {\r\n for (const item of rawEvidence) evidence.push(parseEvidenceArg(String(item)));\r\n } else if (typeof rawEvidence === \"string\") {\r\n evidence.push(parseEvidenceArg(rawEvidence));\r\n }\r\n\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : undefined, agentOsId, { baseUrl: base });\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/plans/${encodeURIComponent(planId)}/progress-events`;\r\n const cfg = loadUserConfig();\r\n const provider = cfg.workerProvider ? `provider:${cfg.workerProvider}` : undefined;\r\n\r\n const body = {\r\n rowKey: args.row ? String(args.row) : undefined,\r\n rowId: args.rowId ? String(args.rowId) : undefined,\r\n taskId: args.task ? String(args.task) : undefined,\r\n reviewTaskId: args.reviewTask ? String(args.reviewTask) : undefined,\r\n roleLane,\r\n status,\r\n note: args.note ? String(args.note) : undefined,\r\n remainingWork: args.remaining ? String(args.remaining) : undefined,\r\n evidence: evidence.length ? evidence : undefined,\r\n proposed: args.proposed === true || args.proposed === \"true\",\r\n executorRef: args.executorRef ? String(args.executorRef) : provider,\r\n };\r\n\r\n const res = await fetch(url, {\r\n method: \"POST\",\r\n headers: buildHarnessCallbackHeaders(secret),\r\n body: JSON.stringify(body),\r\n });\r\n\r\n const text = await res.text();\r\n let parsed: unknown = null;\r\n try {\r\n parsed = JSON.parse(text);\r\n } catch {\r\n parsed = text;\r\n }\r\n if (!res.ok) {\r\n console.error(JSON.stringify({ httpStatus: res.status, response: parsed }, null, 2));\r\n process.exit(1);\r\n }\r\n console.log(JSON.stringify(parsed, null, 2));\r\n}\r\n\r\nexport async function verifyPlan(args: Record<string, string | boolean>): Promise<void> {\r\n const planId = required(args.plan ? String(args.plan) : undefined, \"plan\");\r\n const slug = loadUserConfig().agentOsSlug;\r\n if (!slug) {\r\n console.error(\"requires agentOsSlug in ~/.kynver/config.json for verify (session route)\");\r\n process.exit(1);\r\n }\r\n\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const apiKey = process.env.KYNVER_API_KEY;\r\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\r\n if (apiKey) headers.Authorization = `Bearer ${apiKey}`;\r\n\r\n const url = `${base}/api/agent-os/${encodeURIComponent(slug)}/plans/${encodeURIComponent(planId)}/verify`;\r\n const res = await fetch(url, {\r\n method: \"POST\",\r\n headers,\r\n body: JSON.stringify({\r\n worktreePath: args.worktree ? String(args.worktree) : undefined,\r\n taskId: args.task ? String(args.task) : undefined,\r\n humanOverride: args.humanOverride === true || args.humanOverride === \"true\",\r\n }),\r\n });\r\n\r\n const text = await res.text();\r\n let parsed: unknown = null;\r\n try {\r\n parsed = JSON.parse(text);\r\n } catch {\r\n parsed = text;\r\n }\r\n if (!res.ok) {\r\n console.error(JSON.stringify({ httpStatus: res.status, response: parsed }, null, 2));\r\n process.exit(1);\r\n }\r\n console.log(JSON.stringify(parsed, null, 2));\r\n}\r\n"],
5
+ "mappings": "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",
6
+ "names": ["mkdirSync", "fileURLToPath", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "path", "path", "existsSync", "readFileSync", "mkdirSync", "writeFileSync", "path", "readFileSync", "path", "existsSync", "readdirSync", "path", "existsSync", "homedir", "path", "path", "homedir", "existsSync", "path", "existsSync", "readdirSync", "existsSync", "readFileSync", "existsSync", "readFileSync", "existsSync", "readFileSync", "existsSync", "readFileSync", "readFileSync", "path", "existsSync", "mkdirSync", "path", "closeSync", "existsSync", "openSync", "readdirSync", "spawn", "path", "spawn", "existsSync", "openSync", "closeSync", "path", "path", "path", "path", "existsSync", "openSync", "spawn", "closeSync", "path", "mkdirSync", "existsSync", "summary", "path", "path", "existsSync", "mkdirSync", "path", "path", "path", "existsSync", "mkdirSync", "path", "path", "path", "path", "path", "path", "path", "mkdirSync", "fileURLToPath"]
7
7
  }