@kynver-app/runtime 0.1.34 → 0.1.37
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 +1649 -114
- package/dist/cli.js.map +4 -4
- package/dist/index.js +1703 -153
- package/dist/index.js.map +4 -4
- package/package.json +1 -1
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/dispatch.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/exit-classify.ts", "../src/exited-salvage.ts", "../src/git.ts", "../src/landing-gate.ts", "../src/status.ts", "../src/model-routing-task-enrich.ts", "../src/providers/claude.ts", "../src/providers/model-preflight.ts", "../src/model-routing.ts", "../src/retry-limits.ts", "../src/lease-renewal.ts", "../src/supervisor.ts", "../src/prompt.ts", "../src/providers/cursor.ts", "../src/providers/cursor-windows.ts", "../src/providers/registry.ts", "../src/auto-complete.ts", "../src/worker-ops.ts", "../src/pr-handoff/pr-handoff-assess.ts", "../src/pr-handoff/pr-handoff-gh.ts", "../src/pr-handoff/pr-handoff.ts", "../src/completion-ack.ts", "../src/sweep.ts", "../src/worktree.ts", "../src/validate.ts", "../src/pipeline-tick.ts", "../src/stale-reconcile.ts", "../src/finalize.ts", "../src/plan-progress-daemon-sync.ts", "../src/plan-progress-sync.ts", "../src/workspace-runtime-config.ts", "../src/cleanup.ts", "../src/cleanup-types.ts", "../src/cleanup-guards.ts", "../src/cleanup-execute.ts", "../src/cleanup-dir-size.ts", "../src/cleanup-scan.ts", "../src/cleanup-worktree-index.ts", "../src/daemon.ts", "../src/plan-progress.ts", "../src/cleanup-cli.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\nimport { runCleanupCli } from \"./cleanup-cli.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] [--executor harness] [--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] [--wait]\",\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 \" kynver cleanup [--execute] [--node-modules-age-ms MS] [--worktrees-age-ms MS] [--harness-root PATH] [--include-orphans]\",\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 if (scope === \"cleanup\") return runCleanupCli(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 void (await 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 /** Default Claude model when dispatch does not infer or pass `--model`. */\r\n defaultModel?: 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 (agentOsId ? undefined : 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 refreshRunnerTokenForAuthFailure(\r\n rejectedSecret: string,\r\n agentOsId: string,\r\n opts?: { baseUrl?: string },\r\n): Promise<{ ok: true; token: string } | { ok: false; reason: string }> {\r\n const apiKey = loadApiKey();\r\n const baseUrl = resolveConfiguredBaseUrl(opts?.baseUrl);\r\n if (!apiKey) return { ok: false, reason: \"KYNVER_API_KEY is required to refresh a rejected runner token\" };\r\n if (!agentOsId) return { ok: false, reason: \"agentOsId is required to refresh a rejected runner token\" };\r\n if (!baseUrl) return { ok: false, reason: \"KYNVER_API_URL or --base-url is required to refresh a rejected runner token\" };\r\n\r\n try {\r\n const token = await fetchRunnerCredential(agentOsId, { baseUrl, apiKey });\r\n if (token && token !== rejectedSecret) {\r\n saveRunnerToken(agentOsId, token);\r\n return { ok: true, token };\r\n }\r\n return { ok: false, reason: \"runner credential refresh returned the rejected token\" };\r\n } catch (error) {\r\n return { ok: false, reason: (error as Error).message };\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\n/** Avoid flashing a visible console on Windows when spawning worker/sidecar children. */\r\nexport function hiddenSpawnOptions<T extends Record<string, unknown>>(opts: T): T {\r\n if (process.platform !== \"win32\") return opts;\r\n return { windowsHide: true, ...opts };\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", "import path from \"node:path\";\r\nimport { resolveBaseUrl, resolveCallbackSecretWithMint } from \"./config.js\";\r\nimport { postJsonWithCredentialRefresh } 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 { enrichTaskForModelRouting } from \"./model-routing-task-enrich.js\";\r\nimport { resolveWorkerLaunch } from \"./model-routing.js\";\r\nimport { readHarnessRetryLimits } from \"./retry-limits.js\";\r\nimport { hasLiveWorkerForTask } from \"./lease-renewal.js\";\r\nimport { spawnWorkerProcess } from \"./supervisor.js\";\r\nimport { buildRunBoard } from \"./worker-ops.js\";\r\nimport { isPidAlive, required, safeSlug } from \"./util.js\";\r\nimport { readJson } from \"./util.js\";\r\nimport type {\r\n HarnessWorkerRecord,\r\n InstructionPolicyEvidenceSnapshot,\r\n PersonaContextEvidenceSnapshot,\r\n} from \"./status.js\";\r\n\r\nexport const DEFAULT_DISPATCH_LEASE_MS = 60 * 60 * 1000;\r\n\r\nexport interface HarnessWorkerDispatchContext {\r\n instructionPolicyMarkdown: string | null;\r\n instructionPolicyFingerprint: string | null;\r\n instructionPolicyEvidence: InstructionPolicyEvidenceSnapshot | null;\r\n personaMarkdown: string | null;\r\n personaSlug: string | null;\r\n personaEvidence: PersonaContextEvidenceSnapshot | null;\r\n personaInjectionReady: boolean;\r\n}\r\n\r\nexport function readHarnessWorkerContext(\r\n decision: Record<string, unknown>,\r\n): HarnessWorkerDispatchContext | null {\r\n const raw = decision.harnessWorkerContext;\r\n if (!raw || typeof raw !== \"object\") return null;\r\n const ctx = raw as Record<string, unknown>;\r\n const markdown =\r\n typeof ctx.instructionPolicyMarkdown === \"string\" ? ctx.instructionPolicyMarkdown : null;\r\n const fingerprint =\r\n typeof ctx.instructionPolicyFingerprint === \"string\"\r\n ? ctx.instructionPolicyFingerprint\r\n : null;\r\n const evidence =\r\n ctx.instructionPolicyEvidence && typeof ctx.instructionPolicyEvidence === \"object\"\r\n ? (ctx.instructionPolicyEvidence as InstructionPolicyEvidenceSnapshot)\r\n : null;\r\n const personaMarkdown =\r\n typeof ctx.personaMarkdown === \"string\" ? ctx.personaMarkdown : null;\r\n const personaSlug =\r\n typeof ctx.personaEvidence === \"object\" &&\r\n ctx.personaEvidence &&\r\n typeof (ctx.personaEvidence as PersonaContextEvidenceSnapshot).injectedPersonaSlug === \"string\"\r\n ? (ctx.personaEvidence as PersonaContextEvidenceSnapshot).injectedPersonaSlug!\r\n : null;\r\n const personaEvidence =\r\n ctx.personaEvidence && typeof ctx.personaEvidence === \"object\"\r\n ? (ctx.personaEvidence as PersonaContextEvidenceSnapshot)\r\n : null;\r\n const personaInjectionReady = ctx.personaInjectionReady === true;\r\n return {\r\n instructionPolicyMarkdown: markdown,\r\n instructionPolicyFingerprint: fingerprint,\r\n instructionPolicyEvidence: evidence,\r\n personaMarkdown,\r\n personaSlug,\r\n personaEvidence,\r\n personaInjectionReady,\r\n };\r\n}\r\n\r\nfunction normalizePersonaSlug(value: unknown): string | null {\r\n if (typeof value !== \"string\") return null;\r\n const trimmed = value.trim().toLowerCase();\r\n return trimmed.length ? trimmed : null;\r\n}\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 = `kynver-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 activeHarnessWorkers: Array<{\r\n runId: string;\r\n workerName: string;\r\n taskId: string;\r\n pid?: number;\r\n }> = [];\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 || !isPidAlive(worker.pid)) continue;\r\n activeHarnessWorkers.push({\r\n runId: run.id,\r\n workerName: name,\r\n taskId: worker.taskId,\r\n pid: worker.pid,\r\n });\r\n }\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 activeHarnessWorkers,\r\n harnessBoardSnapshot: buildRunBoard(run.id),\r\n ...(args.lane ? { lane: String(args.lane) } : {}),\r\n executor: args.executor ? String(args.executor) : \"harness\",\r\n ...(args.diskPath ? { diskPath: String(args.diskPath) } : {}),\r\n };\r\n\r\n const dispatch = await postJsonWithCredentialRefresh(dispatchUrl, secret, body, { agentOsId, baseUrl: base });\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 authRefreshed: dispatch.refreshedAuth === true,\r\n authRefreshFailure: dispatch.authRefreshFailure,\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 retryLimits = readHarnessRetryLimits();\r\n const outcomes: Array<Record<string, unknown>> = [];\r\n for (const decision of result.started as Array<Record<string, unknown>>) {\r\n const task = decision.task as Record<string, unknown>;\r\n const harnessContext = readHarnessWorkerContext(decision);\r\n const taskId = String(task.id);\r\n const expectedPersona = normalizePersonaSlug(task.personaSlug);\r\n if (expectedPersona && (!harnessContext?.personaInjectionReady || !harnessContext.personaMarkdown)) {\r\n outcomes.push({\r\n taskId,\r\n started: false,\r\n error: `persona_injection_required: missing anchored context-envelope persona block for \"${expectedPersona}\"`,\r\n });\r\n continue;\r\n }\r\n if (hasLiveWorkerForTask(run.id, taskId)) {\r\n outcomes.push({\r\n taskId,\r\n started: false,\r\n error: \"duplicate_dispatch_prevented: live local worker already owns this task\",\r\n });\r\n continue;\r\n }\r\n const attempt = Number(task.attempt) || 1;\r\n if (attempt > retryLimits.maxTaskAttempts) {\r\n outcomes.push({\r\n taskId: task.id,\r\n started: false,\r\n error: `task attempt ${attempt} exceeds KYNVER_MAX_TASK_ATTEMPTS (${retryLimits.maxTaskAttempts})`,\r\n });\r\n continue;\r\n }\r\n const name = safeSlug(`t-${task.id}-a${task.attempt}`);\r\n const routing = resolveWorkerLaunch({\r\n explicitModel: args.model ? String(args.model) : undefined,\r\n task: enrichTaskForModelRouting(task),\r\n });\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: routing.model,\r\n provider: routing.provider,\r\n routingRule: routing.rule,\r\n requestedModel: routing.requestedModel,\r\n agentOsId,\r\n taskId: String(task.id),\r\n planId,\r\n instructionPolicyMarkdown: harnessContext?.instructionPolicyMarkdown ?? null,\r\n instructionPolicyFingerprint: harnessContext?.instructionPolicyFingerprint ?? null,\r\n instructionPolicyEvidence: harnessContext?.instructionPolicyEvidence ?? null,\r\n personaMarkdown: harnessContext?.personaMarkdown ?? null,\r\n personaSlug: harnessContext?.personaSlug ?? expectedPersona,\r\n personaEvidence: harnessContext?.personaEvidence ?? null,\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 model: worker.model,\r\n provider: routing.provider,\r\n routingRule: routing.rule,\r\n instructionPolicyFingerprint: harnessContext?.instructionPolicyFingerprint ?? null,\r\n instructionPolicyRuleCount: Array.isArray(harnessContext?.instructionPolicyEvidence?.ruleSlugs)\r\n ? (harnessContext.instructionPolicyEvidence.ruleSlugs as string[]).length\r\n : null,\r\n personaSlug: harnessContext?.personaSlug ?? expectedPersona,\r\n personaOperatingRuleCount: harnessContext?.personaEvidence?.operatingRuleCount ?? null,\r\n });\r\n if (harnessContext?.instructionPolicyFingerprint) {\r\n console.error(\r\n `[dispatch] task ${taskId}: Lane A instruction policy injected fingerprint=${harnessContext.instructionPolicyFingerprint}`,\r\n );\r\n }\r\n if (harnessContext?.personaSlug) {\r\n console.error(\r\n `[dispatch] task ${taskId}: persona context injected slug=${harnessContext.personaSlug}`,\r\n );\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 postJsonWithCredentialRefresh(releaseUrl, secret, { agentOsId, leaseOwner }, { agentOsId, baseUrl: base });\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", "/** 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\nimport { refreshRunnerTokenForAuthFailure } from \"./config.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 refreshedAuth?: boolean;\r\n authRefreshFailure?: string;\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 postJsonWithCredentialRefresh(\r\n url: string,\r\n secret: string,\r\n body: unknown,\r\n opts: { agentOsId: string; baseUrl?: string },\r\n): Promise<PostJsonResult> {\r\n const first = await postJson(url, secret, body);\r\n if (first.ok || first.status !== 401) return first;\r\n\r\n const refreshed = await refreshRunnerTokenForAuthFailure(secret, opts.agentOsId, { baseUrl: opts.baseUrl });\r\n if (!refreshed.ok) return { ...first, authRefreshFailure: refreshed.reason };\r\n\r\n const retry = await postJson(url, refreshed.token, body);\r\n return { ...retry, refreshedAuth: true };\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\nfunction isActiveHarnessWorker(worker: HarnessWorkerRecord): boolean {\r\n const status = computeWorkerStatus(worker);\r\n return status.alive && !status.finalResult && status.attention.state !== \"done\";\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 || !isActiveHarnessWorker(worker)) continue;\r\n active++;\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 let 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\n/** Worker contract: append `phase: \"complete\"` when productively finished. */\r\nexport function isTerminalHeartbeatPhase(phase: string | null | undefined): boolean {\r\n return phase === \"complete\";\r\n}\r\n\r\n/**\r\n * When stdout has no stream-json `result` yet (common for Cursor workers mid-exit),\r\n * treat the worker's completion heartbeat as a synthetic final result so lifecycle\r\n * sync, completion replay, and resource gates advance.\r\n */\r\nexport function terminalFinalResultFromHeartbeat(heartbeat: ParsedHeartbeat): string | null {\r\n if (!isTerminalHeartbeatPhase(heartbeat.lastHeartbeatPhase)) return null;\r\n const summary = heartbeat.lastHeartbeatSummary?.trim();\r\n return summary || \"completed\";\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\nfunction eventTimestampIso(event: Record<string, unknown>): string | undefined {\r\n const tsMs = event.timestamp_ms as number | undefined;\r\n return (event.timestamp || event.ts || (tsMs ? new Date(tsMs).toISOString() : undefined)) as\r\n | string\r\n | undefined;\r\n}\r\n\r\n/** Cursor `stream-json` encodes tools as `{ grepToolCall: \u2026 }` keys on `tool_call`. */\r\nfunction cursorToolNameFromCall(toolCall: Record<string, unknown> | undefined): string | null {\r\n if (!toolCall) return null;\r\n for (const key of Object.keys(toolCall)) {\r\n if (key.endsWith(\"ToolCall\")) {\r\n const stem = key.slice(0, -\"ToolCall\".length);\r\n return stem.length ? stem : key;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction recordStreamResult(result: ParsedStream, event: Record<string, unknown>): void {\r\n result.finalResult = event.result || event.subtype || event.terminal_reason || \"completed\";\r\n if (event.is_error) {\r\n result.error = String(event.result || event.api_error_status || \"stream result error\");\r\n }\r\n}\r\n\r\n/**\r\n * Parse harness worker stdout (`stream-json` from Claude Code or Cursor Agent).\r\n * Cursor emits `tool_call` events and may only write `type: \"result\"` after exit;\r\n * completion heartbeats are merged in `computeWorkerStatus`.\r\n */\r\nexport function parseHarnessStream(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 ts = eventTimestampIso(event);\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 === \"tool_call\" && event.subtype === \"started\") {\r\n const toolCall =\r\n event.tool_call && typeof event.tool_call === \"object\" && !Array.isArray(event.tool_call)\r\n ? (event.tool_call as Record<string, unknown>)\r\n : undefined;\r\n const name = cursorToolNameFromCall(toolCall);\r\n if (name) result.currentTool = name;\r\n }\r\n if (event.type === \"result\") {\r\n recordStreamResult(result, event);\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/** @deprecated Use {@link parseHarnessStream} \u2014 kept for existing imports. */\r\nexport function parseClaudeStream(file: string): ParsedStream {\r\n return parseHarnessStream(file);\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 === \"tool_call\") {\r\n const subtype = String(event.subtype || \"\");\r\n const toolCall =\r\n event.tool_call && typeof event.tool_call === \"object\" && !Array.isArray(event.tool_call)\r\n ? (event.tool_call as Record<string, unknown>)\r\n : undefined;\r\n const name = cursorToolNameFromCall(toolCall) ?? \"tool\";\r\n return `[tool:${subtype}] ${name}`;\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", "// Exit normalization for workers that died without a stream-json final result.\r\n//\r\n// When a worker process exits before recording a `result` event, the status path\r\n// used to surface a single generic \"process exited without a final result\"\r\n// needs_attention \u2014 indistinguishable whether the agent crashed mid-task or the\r\n// provider CLI rejected the model/args at startup. That made model/provider\r\n// misconfigurations look like silent stalls the watchdog had to triage by hand.\r\n//\r\n// `classifyExitFailure` inspects the worker's stderr/error tail and, when it\r\n// matches a known startup/config failure (model rejection, missing CLI, auth),\r\n// returns a structured `blocked` classification with a precise reason. The\r\n// status path promotes that to `attention.state = \"blocked\"` \u2014 a real board\r\n// attention state that flows through the harness completion ingest unchanged \u2014\r\n// instead of the catch-all needs_attention.\r\n\r\nexport interface ExitClassification {\r\n /** True when the failure is a structural blocker an operator must fix. */\r\n blocked: boolean;\r\n /** Precise, human-readable reason for the blocker. */\r\n reason: string;\r\n}\r\n\r\ninterface FailurePattern {\r\n test: RegExp;\r\n label: string;\r\n}\r\n\r\n// Ordered most-specific first. Each entry maps a recognizable stderr signature to\r\n// a short blocker label; the matched error tail is appended for context.\r\nconst FAILURE_PATTERNS: FailurePattern[] = [\r\n {\r\n test: /\\b(?:invalid|unknown|unsupported|unrecognized)\\b[^.\\n]*\\bmodel\\b/i,\r\n label: \"provider rejected the requested model\",\r\n },\r\n {\r\n test: /\\bmodel\\b[^.\\n]*\\b(?:not\\s+(?:found|supported|available|recognized|valid)|is\\s+not\\s+valid|does\\s+not\\s+exist)/i,\r\n label: \"provider rejected the requested model\",\r\n },\r\n {\r\n test: /\\b(?:did you mean|available models|choose (?:a|one of)|supported models)\\b/i,\r\n label: \"provider rejected the requested model\",\r\n },\r\n {\r\n test: /model preflight failed/i,\r\n label: \"model/provider preflight failed\",\r\n },\r\n {\r\n test: /\\b(?:command not found|ENOENT|is the .*CLI on PATH|executable not found|no such file or directory)\\b/i,\r\n label: \"provider CLI is missing or not on PATH\",\r\n },\r\n {\r\n test: /\\bfailed to spawn\\b/i,\r\n label: \"provider failed to spawn the worker process\",\r\n },\r\n {\r\n test: /\\b(?:not logged in|unauthorized|authentication (?:failed|required)|invalid api key|missing api key|401)\\b/i,\r\n label: \"provider authentication failed\",\r\n },\r\n];\r\n\r\n/** Collapse whitespace and clip a noisy error tail to a single readable line. */\r\nfunction tidy(errorText: string, max = 240): string {\r\n const oneLine = errorText.replace(/\\s+/g, \" \").trim();\r\n return oneLine.length > max ? `${oneLine.slice(0, max - 1)}\u2026` : oneLine;\r\n}\r\n\r\n/**\r\n * Classify a dead worker's error/stderr output. Returns a structured blocker when\r\n * the text matches a known startup/config failure, or null when it does not (the\r\n * caller should fall back to the generic needs_attention path).\r\n */\r\nexport function classifyExitFailure(\r\n errorText: string | null | undefined,\r\n): ExitClassification | null {\r\n const text = (errorText ?? \"\").trim();\r\n if (!text) return null;\r\n for (const pattern of FAILURE_PATTERNS) {\r\n if (pattern.test.test(text)) {\r\n return { blocked: true, reason: `${pattern.label}: ${tidy(text)}` };\r\n }\r\n }\r\n return null;\r\n}\r\n", "// Workers that die without a stream-json `result` event but leave salvageable work\r\n// behind (uncommitted changes and/or commits ahead of the run base). Distinct from\r\n// a generic \"process exited without a final result\" stall \u2014 operators need a\r\n// review-needed signal and a follow-up salvage/landing lane (PR #285 class).\r\n\r\nimport type { GitAncestry } from \"./git.js\";\r\n\r\nexport type ExitedSalvageKind = \"none\" | \"uncommitted\" | \"committed_ahead\" | \"both\";\r\n\r\nexport interface ExitedSalvageAssessment {\r\n kind: ExitedSalvageKind;\r\n /** True when the worktree has reviewable uncommitted and/or committed-ahead work. */\r\n salvageable: boolean;\r\n uncommittedCount: number;\r\n headCommit: string | null;\r\n /** Board / attention reason \u2014 stable prefix for downstream parsers. */\r\n attentionReason: string;\r\n}\r\n\r\nfunction trimOrNull(value: unknown): string | null {\r\n if (typeof value !== \"string\") return null;\r\n const trimmed = value.trim();\r\n return trimmed.length ? trimmed : null;\r\n}\r\n\r\nfunction hasFinalResult(value: unknown): boolean {\r\n if (value === undefined || value === null) return false;\r\n if (typeof value === \"string\") return value.trim().length > 0;\r\n if (typeof value === \"boolean\") return value;\r\n if (Array.isArray(value)) return value.length > 0;\r\n if (typeof value === \"object\") return Object.keys(value as object).length > 0;\r\n return true;\r\n}\r\n\r\nfunction committedHeadFromAncestry(ancestry: GitAncestry | null | undefined): string | null {\r\n if (!ancestry?.checked) return null;\r\n if (ancestry.headIsAncestorOfBase !== false) return null;\r\n return trimOrNull(ancestry.head);\r\n}\r\n\r\nfunction buildAttentionReason(\r\n kind: ExitedSalvageKind,\r\n uncommittedCount: number,\r\n headCommit: string | null,\r\n): string {\r\n const parts: string[] = [\"exited_with_changes_salvage\"];\r\n if (kind === \"uncommitted\" || kind === \"both\") {\r\n parts.push(\r\n `${uncommittedCount} uncommitted change${uncommittedCount === 1 ? \"\" : \"s\"} with no final result`,\r\n );\r\n }\r\n if ((kind === \"committed_ahead\" || kind === \"both\") && headCommit) {\r\n const sha = headCommit.length > 12 ? headCommit.slice(0, 12) : headCommit;\r\n parts.push(`commit ${sha} ahead of base with no final result`);\r\n }\r\n parts.push(\"review worktree \u2014 commit, open a PR, or run a salvage worker before discarding\");\r\n return parts.join(\": \");\r\n}\r\n\r\n/**\r\n * Classify a dead worker with no `finalResult`. Returns null when the worker is\r\n * still alive or already recorded a final result.\r\n */\r\nexport function assessExitedWorkerSalvage(input: {\r\n alive: boolean;\r\n finalResult: unknown;\r\n changedFiles?: string[];\r\n gitAncestry?: GitAncestry | null;\r\n headCommit?: string | null;\r\n}): ExitedSalvageAssessment | null {\r\n if (input.alive || hasFinalResult(input.finalResult)) return null;\r\n\r\n const uncommittedCount = (input.changedFiles ?? []).filter((line) => line.trim()).length;\r\n const headCommit = trimOrNull(input.headCommit) ?? committedHeadFromAncestry(input.gitAncestry);\r\n const hasUncommitted = uncommittedCount > 0;\r\n const hasCommittedAhead = Boolean(headCommit);\r\n\r\n if (!hasUncommitted && !hasCommittedAhead) {\r\n return {\r\n kind: \"none\",\r\n salvageable: false,\r\n uncommittedCount: 0,\r\n headCommit: null,\r\n attentionReason: \"process exited without a final result\",\r\n };\r\n }\r\n\r\n const kind: ExitedSalvageKind =\r\n hasUncommitted && hasCommittedAhead ? \"both\" : hasUncommitted ? \"uncommitted\" : \"committed_ahead\";\r\n\r\n return {\r\n kind,\r\n salvageable: true,\r\n uncommittedCount,\r\n headCommit,\r\n attentionReason: buildAttentionReason(kind, uncommittedCount, headCommit),\r\n };\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 interface GitAncestryOptions {\r\n /** Branch or ref name (e.g. origin/main). Used when baseCommit is unset. */\r\n base?: string;\r\n /** Pinned SHA the worktree was created from \u2014 preferred over a moving branch ref. */\r\n baseCommit?: string;\r\n}\r\n\r\nexport function computeGitAncestry(worktreePath: string, baseOrOptions: string | GitAncestryOptions = \"origin/main\"): GitAncestry {\r\n const options: GitAncestryOptions =\r\n typeof baseOrOptions === \"string\" ? { base: baseOrOptions } : baseOrOptions;\r\n const baseLabel = options.baseCommit?.trim() || options.base?.trim() || \"origin/main\";\r\n const pinnedBaseCommit = options.baseCommit?.trim() || null;\r\n\r\n if (!worktreePath) {\r\n return unknownAncestry(baseLabel, \"missing worktree path\");\r\n }\r\n\r\n const head = gitCapture(worktreePath, [\"rev-parse\", \"HEAD\"]);\r\n if (head.status !== 0) {\r\n return unknownAncestry(baseLabel, head.error || head.stderr || head.stdout || \"failed to resolve HEAD\");\r\n }\r\n\r\n let baseSha: string;\r\n if (pinnedBaseCommit) {\r\n baseSha = pinnedBaseCommit;\r\n } else {\r\n const baseHead = gitCapture(worktreePath, [\"rev-parse\", baseLabel]);\r\n if (baseHead.status !== 0) {\r\n return unknownAncestry(\r\n baseLabel,\r\n baseHead.error || baseHead.stderr || baseHead.stdout || `failed to resolve ${baseLabel}`,\r\n head.stdout.trim(),\r\n );\r\n }\r\n baseSha = baseHead.stdout.trim();\r\n }\r\n\r\n const headSha = head.stdout.trim();\r\n if (headSha === baseSha) {\r\n return {\r\n checked: true,\r\n base: baseLabel,\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: baseLabel,\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: baseLabel,\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 type { GitAncestry } from \"./git.js\";\r\n\r\nexport type WorkerLandingBlockReason = \"dirty_worktree_no_pr\";\r\n\r\nexport interface WorkerLandingSnapshot {\r\n finalResult: unknown;\r\n changedFiles: string[];\r\n headCommit?: string | null;\r\n prUrl?: string | null;\r\n artifactBundlePath?: string | null;\r\n patchPath?: string | null;\r\n gitAncestry?: GitAncestry | null;\r\n}\r\n\r\nexport interface WorkerLandingVerdict {\r\n /** When true, do not treat the worker as cleanly landed/done. */\r\n blocked: boolean;\r\n reason?: WorkerLandingBlockReason;\r\n /** Human-readable attention reason for boards and completion payloads. */\r\n detail?: string;\r\n}\r\n\r\nfunction trimOrNull(value: unknown): string | null {\r\n if (typeof value !== \"string\") return null;\r\n const trimmed = value.trim();\r\n return trimmed.length ? trimmed : null;\r\n}\r\n\r\nfunction hasFinalResult(value: unknown): boolean {\r\n if (value === undefined || value === null) return false;\r\n if (typeof value === \"string\") return value.trim().length > 0;\r\n if (typeof value === \"boolean\") return value;\r\n if (Array.isArray(value)) return value.length > 0;\r\n if (typeof value === \"object\") return Object.keys(value as object).length > 0;\r\n return true;\r\n}\r\n\r\nfunction hasCommittedLandingRef(snapshot: WorkerLandingSnapshot): boolean {\r\n if (trimOrNull(snapshot.headCommit)) return true;\r\n if (trimOrNull(snapshot.prUrl)) return true;\r\n if (trimOrNull(snapshot.artifactBundlePath)) return true;\r\n if (trimOrNull(snapshot.patchPath)) return true;\r\n const ancestry = snapshot.gitAncestry;\r\n if (ancestry?.checked && ancestry.headIsAncestorOfBase === false && trimOrNull(ancestry.head)) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Hard landing gate: a recorded final result is not sufficient when the worker\r\n * left uncommitted code and has no commit/PR/patch/bundle landing path.\r\n */\r\nexport function assessWorkerLanding(snapshot: WorkerLandingSnapshot): WorkerLandingVerdict {\r\n if (!hasFinalResult(snapshot.finalResult)) return { blocked: false };\r\n if (snapshot.changedFiles.length === 0) return { blocked: false };\r\n if (!hasCommittedLandingRef(snapshot)) {\r\n return {\r\n blocked: true,\r\n reason: \"dirty_worktree_no_pr\",\r\n detail: `Worktree has ${snapshot.changedFiles.length} uncommitted change(s) with no commit or PR; commit, open a PR, or discard before landing`,\r\n };\r\n }\r\n return {\r\n blocked: true,\r\n detail: `Worktree has ${snapshot.changedFiles.length} uncommitted change(s); commit or discard before landing`,\r\n };\r\n}\r\n\r\nexport function landingAttentionReason(verdict: WorkerLandingVerdict): string | undefined {\r\n if (!verdict.blocked) return undefined;\r\n return verdict.detail ?? verdict.reason ?? \"dirty_worktree_no_pr\";\r\n}\r\n", "import { parseHeartbeat, terminalFinalResultFromHeartbeat } from \"./heartbeat.js\";\r\nimport { parseHarnessStream } from \"./stream.js\";\r\nimport { classifyExitFailure } from \"./exit-classify.js\";\r\nimport { assessExitedWorkerSalvage } from \"./exited-salvage.js\";\r\nimport { computeGitAncestry, type GitAncestry, gitStatusShort } from \"./git.js\";\r\nimport { assessWorkerLanding, landingAttentionReason } from \"./landing-gate.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\n/** Snapshot of Lane A policy injection at worker spawn (from dispatch-next). */\r\nexport interface InstructionPolicyEvidenceSnapshot {\r\n fingerprint?: string;\r\n ruleSlugs?: string[];\r\n globalRuleCount?: number;\r\n personaRuleCount?: number;\r\n explicitKindCount?: number;\r\n invariantCount?: number;\r\n markdownChars?: number;\r\n injectedAt?: string;\r\n}\r\n\r\n/** Snapshot of anchored persona context-envelope injection at worker spawn. */\r\nexport interface PersonaContextEvidenceSnapshot {\r\n expectedPersonaSlug?: string;\r\n injectedPersonaSlug?: string;\r\n displayName?: string;\r\n operatingRuleCount?: number;\r\n anchorTaskId?: string;\r\n envelopeGeneratedAt?: string;\r\n injectedAt?: string;\r\n markdownChars?: number;\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 /** Lane A policy fingerprint when dispatch injected operating rules. */\r\n instructionPolicyFingerprint?: string;\r\n instructionPolicyEvidence?: InstructionPolicyEvidenceSnapshot;\r\n personaSlug?: string;\r\n personaEvidence?: PersonaContextEvidenceSnapshot;\r\n leaseOwner?: string;\r\n dispatched?: boolean;\r\n startedAt?: string;\r\n /** Routing audit \u2014 which rule selected model/provider (dispatch inference). */\r\n routingRule?: string;\r\n requestedModel?: string;\r\n /** Set when stale-reconcile patches a dead/stale worker record. */\r\n reconciledAt?: string;\r\n reconcileReason?: 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 /** ISO timestamp when `/harness/completion` returned 2xx for this worker. */\r\n completionReportedAt?: string;\r\n /** Local mirror of the last completion POST outcome. */\r\n completionOutcome?: \"acknowledged\" | \"rejected\";\r\n /** Truncated JSON body from the last acknowledged completion response. */\r\n completionResponse?: unknown;\r\n /**\r\n * Direct/local worker with no board linkage \u2014 must not be mistaken for an\r\n * AgentTask-backed harness worker in completion or dispatch paths.\r\n */\r\n localOnly?: boolean;\r\n /** Sidecar PID when detached; used for observability only. */\r\n completionSidecarPid?: number;\r\n completionSidecarSpawnFailedAt?: 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 /** Set by PR-ready handoff before completion is posted. */\r\n prUrl?: string;\r\n headCommit?: string;\r\n}\r\n\r\nexport interface WorkerStatusOptions {\r\n /** Branch ref for ancestry when baseCommit is not set. */\r\n base?: string;\r\n /** Pinned SHA from run creation \u2014 preferred for ancestry vs a moving branch tip. */\r\n baseCommit?: 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 /** stderr tail / parsed error for a worker that died without a final result. */\r\n error?: string | null;\r\n changedFiles?: string[];\r\n gitAncestry?: GitAncestry | null;\r\n completionBlocker?: string | null;\r\n}): WorkerAttention {\r\n const now = Date.now();\r\n if (input.completionBlocker) {\r\n return { state: \"blocked\", reason: input.completionBlocker };\r\n }\r\n if (input.finalResult) {\r\n const landing = assessWorkerLanding({\r\n finalResult: input.finalResult,\r\n changedFiles: input.changedFiles ?? [],\r\n gitAncestry: input.gitAncestry ?? null,\r\n });\r\n if (landing.blocked) {\r\n const detail = landingAttentionReason(landing);\r\n return {\r\n state: \"needs_attention\",\r\n reason: landing.reason\r\n ? `landing blocked (${landing.reason}): ${detail}`\r\n : `landing blocked: ${detail}`,\r\n };\r\n }\r\n return { state: \"done\", reason: \"final result recorded\" };\r\n }\r\n if (!input.alive) {\r\n // A worker that exited without a final result is not always a silent stall:\r\n // a recognizable startup/config failure (model/provider rejection, missing\r\n // CLI, auth) is a structural blocker, not a generic needs_attention.\r\n const classified = classifyExitFailure(input.error);\r\n if (classified) return { state: \"blocked\", reason: classified.reason };\r\n const salvage = assessExitedWorkerSalvage({\r\n alive: false,\r\n finalResult: null,\r\n changedFiles: input.changedFiles,\r\n gitAncestry: input.gitAncestry,\r\n });\r\n if (salvage?.salvageable) {\r\n const tail = input.error?.trim();\r\n return {\r\n state: \"needs_attention\",\r\n reason: tail ? `${salvage.attentionReason} (${tail})` : salvage.attentionReason,\r\n };\r\n }\r\n const tail = input.error?.trim();\r\n return {\r\n state: \"needs_attention\",\r\n reason: tail\r\n ? `process exited without a final result: ${tail}`\r\n : salvage?.attentionReason ?? \"process exited without a final result\",\r\n };\r\n }\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 = parseHarnessStream(worker.stdoutPath);\r\n const heartbeat = parseHeartbeat(worker.heartbeatPath);\r\n const finalResult = parsed.finalResult ?? terminalFinalResultFromHeartbeat(heartbeat);\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, {\r\n base: options.base,\r\n baseCommit: options.baseCommit,\r\n });\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 // The error surfaced when a worker died without a final result: the parsed\r\n // stream error, else the stderr tail. Computed before attention so a startup/\r\n // config failure can be classified as a structured blocker.\r\n const error =\r\n parsed.error ||\r\n (!alive && !finalResult ? tailFile(worker.stderrPath, 10).trim() || undefined : undefined);\r\n const completionBlocker =\r\n typeof worker.completionBlocker === \"string\" && worker.completionBlocker.trim()\r\n ? worker.completionBlocker.trim()\r\n : null;\r\n const attention = computeAttention({\r\n alive,\r\n 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 error,\r\n changedFiles,\r\n gitAncestry,\r\n completionBlocker,\r\n });\r\n const workerStatusLabel =\r\n completionBlocker || attention.state === \"blocked\"\r\n ? \"blocked\"\r\n : attention.state === \"done\"\r\n ? \"done\"\r\n : finalResult\r\n ? \"exited\"\r\n : alive\r\n ? \"running\"\r\n : \"exited\";\r\n return {\r\n runId: worker.runId,\r\n worker: worker.name,\r\n pid: worker.pid,\r\n alive,\r\n status: workerStatusLabel,\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,\r\n error,\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\n/** True when a worker recorded a final result but failed the landing gate. */\r\nexport function isLandingBlockedWorkerStatus(status: RawHarnessWorkerStatus): boolean {\r\n if (!status.finalResult) return false;\r\n return status.attention.state === \"needs_attention\" || status.attention.state === \"blocked\";\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", "/** Enrich dispatch task metadata with `roleLane` when the board row omits it. */\r\n\r\nfunction taskString(task: Record<string, unknown>, key: string): string {\r\n const v = task[key];\r\n return typeof v === \"string\" ? v.trim() : \"\";\r\n}\r\n\r\nfunction normalize(value: string): string {\r\n return value.toLowerCase();\r\n}\r\n\r\nconst PERSONA_DEFAULT_LANE: Record<string, string> = {\r\n dalton: \"implementer\",\r\n lorentz: \"report_reviewer\",\r\n};\r\n\r\n/**\r\n * Best-effort plan role lane from persona, title, and executorRef.\r\n * Returns undefined when nothing confident matches.\r\n */\r\nexport function inferRoleLaneFromTask(task: Record<string, unknown>): string | undefined {\r\n const existing = taskString(task, \"roleLane\");\r\n if (existing) return existing;\r\n\r\n const ref = normalize(taskString(task, \"executorRef\"));\r\n const title = normalize(taskString(task, \"title\"));\r\n const persona = normalize(taskString(task, \"personaSlug\"));\r\n const combined = `${ref} ${title}`;\r\n\r\n if (combined.includes(\"deep review\") || combined.includes(\"security review\") || ref.includes(\"deep-reviewer\")) {\r\n return \"deep_reviewer\";\r\n }\r\n if (combined.includes(\"plan author\") || combined.includes(\"plan-author\") || title.includes(\"strategy plan\")) {\r\n return \"plan_author\";\r\n }\r\n if (combined.includes(\"plan review\") || ref.includes(\"plan-reviewer\")) {\r\n return \"plan_reviewer\";\r\n }\r\n if (combined.includes(\"report review\") || combined.includes(\"completion report\")) {\r\n return \"report_reviewer\";\r\n }\r\n if (combined.includes(\"repair\") || title.startsWith(\"fix \") || ref.includes(\"repair\")) {\r\n return \"repair_implementer\";\r\n }\r\n if (\r\n ref.includes(\"cursor\") ||\r\n ref.includes(\"codex\") ||\r\n ref.includes(\"composer\") ||\r\n title.includes(\"implement\") ||\r\n title.includes(\"land:\")\r\n ) {\r\n return \"implementer\";\r\n }\r\n\r\n if (persona && PERSONA_DEFAULT_LANE[persona]) {\r\n const base = PERSONA_DEFAULT_LANE[persona];\r\n if (persona === \"lorentz\" && (combined.includes(\"deep\") || combined.includes(\"security\"))) {\r\n return \"deep_reviewer\";\r\n }\r\n return base;\r\n }\r\n\r\n if (combined.includes(\"review\")) return \"report_reviewer\";\r\n\r\n return undefined;\r\n}\r\n\r\n/** Attach inferred `roleLane` so `inferModelRoutingFromTask` can use plan-lane rules. */\r\nexport function enrichTaskForModelRouting(task: Record<string, unknown>): Record<string, unknown> {\r\n const roleLane = inferRoleLaneFromTask(task);\r\n if (!roleLane) return task;\r\n return { ...task, roleLane };\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 { hiddenSpawnOptions } from \"../util.js\";\r\nimport { preflightClaudeModel } from \"./model-preflight.js\";\r\nimport type { WorkerProvider } from \"./types.js\";\r\n\r\n/** Provider default when no explicit model is passed \u2014 Sonnet, not Opus. */\r\nexport const CLAUDE_DEFAULT_MODEL = \"claude-sonnet-4-6\";\r\n\r\nexport const claudeProvider: WorkerProvider = {\r\n name: \"claude\",\r\n defaultModel: CLAUDE_DEFAULT_MODEL,\r\n preflightModel(model) {\r\n return preflightClaudeModel(model, CLAUDE_DEFAULT_MODEL);\r\n },\r\n start(opts) {\r\n // Defence in depth: the supervisor already preflights, but normalize here too\r\n // so the direct `worker start` path never hands the CLI a suffixed model.\r\n const preflight = preflightClaudeModel(opts.model, CLAUDE_DEFAULT_MODEL);\r\n if (!preflight.ok) {\r\n throw new Error(`claude provider model preflight failed: ${preflight.note}`);\r\n }\r\n const model = preflight.model;\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 hiddenSpawnOptions({\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", "// Provider model preflight + normalization.\r\n//\r\n// Agent CLIs (Cursor's `agent`, the Kynver Harness, the AgentOS board) expose\r\n// model identifiers with a reasoning-effort suffix \u2014 e.g. `claude-opus-4-7-thinking-high`.\r\n// The underlying `claude` CLI only accepts the *base* model id (`claude-opus-4-7`)\r\n// and exits immediately when handed the suffixed form, with no stream-json `result`\r\n// event. That left workers in a silent \"exited without a final result\" state.\r\n//\r\n// This module makes the requested model safe before spawn:\r\n// - normalize a known reasoning-effort suffix to the base model the CLI accepts;\r\n// - reject a *clearly foreign* provider model (e.g. an OpenAI/Gemini/Cursor model\r\n// handed to the `claude` provider) as a structured preflight failure instead of\r\n// spawning a doomed process.\r\n//\r\n// It is intentionally conservative: anything that looks like a plausible model for\r\n// the provider passes through untouched and the CLI remains the final judge (the\r\n// status-path exit classifier catches a late CLI rejection \u2014 see ../exit-classify.ts).\r\n\r\nexport interface ModelPreflightResult {\r\n /** False when the model/provider combination is structurally invalid. */\r\n ok: boolean;\r\n /** The model to launch with (normalized). Meaningful only when `ok`. */\r\n model: string;\r\n /** True when the requested model was rewritten to a different launch model. */\r\n normalized: boolean;\r\n /** The originally requested model, present only when it differs from `model`. */\r\n requested?: string;\r\n /** Human-readable note: the normalization explanation, or the rejection reason. */\r\n note?: string;\r\n}\r\n\r\n/**\r\n * Trailing reasoning-effort suffix that agent CLIs append to a base model id.\r\n * Matches `-thinking`, `-thinking-high|medium|low|minimal|max|none`, and the bare\r\n * effort tokens `-high|medium|low|minimal`. No base Kynver model id ends in any of\r\n * these tokens, so stripping a trailing match is safe.\r\n */\r\nconst REASONING_SUFFIX_RE =\r\n /-(?:thinking(?:-(?:high|medium|low|minimal|max|none))?|high|medium|low|minimal)$/i;\r\n\r\n/** Strip a single trailing reasoning-effort suffix from a model id. */\r\nexport function stripReasoningSuffix(model: string): string {\r\n return model.replace(REASONING_SUFFIX_RE, \"\");\r\n}\r\n\r\n/** Recognizable \"this is some other vendor's model\" prefixes. */\r\nconst FOREIGN_MODEL_RE = /^(?:gpt-|gpt5|o1|o3|o4|gemini-|grok-|composer|deepseek|llama|mistral|qwen|command-)/i;\r\n\r\n/** A model id that plausibly belongs to the Anthropic/Claude family. */\r\nfunction looksLikeClaudeModel(model: string): boolean {\r\n return /^claude[-_]/i.test(model) || /^(?:opus|sonnet|haiku)\\b/i.test(model);\r\n}\r\n\r\n/** Board/CLI aliases that are not valid Cursor agent model ids (fail after spawn). */\r\nconst CURSOR_MODEL_ALIASES = new Set([\"cursor\"]);\r\n\r\n/**\r\n * Normalize provider=cursor requests that pass model=cursor (or similar aliases)\r\n * to a real Cursor CLI model. `auto` is the supported default when the board\r\n * does not pin a specific composer id.\r\n */\r\nexport function normalizeCursorModelAlias(model: string): string | null {\r\n const key = model.trim().toLowerCase();\r\n if (CURSOR_MODEL_ALIASES.has(key)) return \"auto\";\r\n return null;\r\n}\r\n\r\n/**\r\n * Preflight a model for the `claude` provider. Normalizes reasoning-effort\r\n * suffixes; rejects models that clearly belong to another provider.\r\n */\r\nexport function preflightClaudeModel(\r\n model: string | undefined,\r\n defaultModel: string,\r\n): ModelPreflightResult {\r\n const requested = (model ?? \"\").trim();\r\n if (!requested) {\r\n return { ok: true, model: defaultModel, normalized: false };\r\n }\r\n\r\n const stripped = stripReasoningSuffix(requested).trim();\r\n const launch = stripped || defaultModel;\r\n\r\n if (FOREIGN_MODEL_RE.test(launch) || (!looksLikeClaudeModel(launch) && launch !== defaultModel)) {\r\n return {\r\n ok: false,\r\n model: requested,\r\n normalized: false,\r\n requested,\r\n note:\r\n `model \"${requested}\" is not a Claude model \u2014 the \"claude\" provider drives the ` +\r\n `Claude CLI, which only accepts claude-* model ids (got \"${launch}\"). ` +\r\n `Pick a Claude model or switch the worker provider.`,\r\n };\r\n }\r\n\r\n if (launch !== requested) {\r\n return {\r\n ok: true,\r\n model: launch,\r\n normalized: true,\r\n requested,\r\n note: `normalized model \"${requested}\" \u2192 \"${launch}\" (the Claude CLI rejects reasoning-effort suffixes)`,\r\n };\r\n }\r\n return { ok: true, model: launch, normalized: false };\r\n}\r\n\r\n/**\r\n * Preflight a model for the `cursor` provider. The Cursor agent owns its own\r\n * reasoning levels, so suffixed ids pass through; we only flag a Claude-family\r\n * model that was clearly meant for the `claude` provider.\r\n */\r\nexport function preflightCursorModel(\r\n model: string | undefined,\r\n defaultModel: string,\r\n): ModelPreflightResult {\r\n const requested = (model ?? \"\").trim();\r\n if (!requested) {\r\n return { ok: true, model: defaultModel, normalized: false };\r\n }\r\n const aliasLaunch = normalizeCursorModelAlias(requested);\r\n if (aliasLaunch) {\r\n return {\r\n ok: true,\r\n model: aliasLaunch,\r\n normalized: true,\r\n requested,\r\n note:\r\n `normalized model \"${requested}\" \u2192 \"${aliasLaunch}\" ` +\r\n `(Cursor provider alias \u2014 use \"auto\" or a composer id, not \"cursor\")`,\r\n };\r\n }\r\n if (looksLikeClaudeModel(requested)) {\r\n return {\r\n ok: false,\r\n model: requested,\r\n normalized: false,\r\n requested,\r\n note:\r\n `model \"${requested}\" is a Claude model but the worker provider is \"cursor\". ` +\r\n `Switch the provider to \"claude\" or pick a Cursor model.`,\r\n };\r\n }\r\n return { ok: true, model: requested, normalized: false };\r\n}\r\n", "import { loadUserConfig, type KynverUserConfig } from \"./config.js\";\r\nimport { CLAUDE_DEFAULT_MODEL } from \"./providers/claude.js\";\r\n\r\n/** Conservative default \u2014 Sonnet for ordinary harness work (not Opus). */\r\nexport const GLOBAL_DEFAULT_MODEL = \"claude-sonnet-4-6\";\r\nexport const CURSOR_DEFAULT_MODEL = \"composer-2.5\";\r\n\r\nexport interface ModelRoutingDecision {\r\n /** Model id passed to the provider CLI (undefined \u2192 provider default). */\r\n model?: string;\r\n /** Worker provider key (`claude` | `cursor`). */\r\n provider: string;\r\n /** Audit trail for Command Center / worker.json. */\r\n rule: string;\r\n /** Original task/board model request when inferred from metadata. */\r\n requestedModel?: string;\r\n}\r\n\r\nfunction taskString(task: Record<string, unknown>, key: string): string {\r\n const v = task[key];\r\n return typeof v === \"string\" ? v.trim() : \"\";\r\n}\r\n\r\nfunction normalizeRef(ref: string): string {\r\n return ref.toLowerCase();\r\n}\r\n\r\n/** Resolve global default: config \u2192 env \u2192 Sonnet. */\r\nexport function resolveGlobalDefaultModel(config: KynverUserConfig = loadUserConfig()): string {\r\n const fromConfig = config.defaultModel?.trim();\r\n if (fromConfig) return fromConfig;\r\n const fromEnv = process.env.KYNVER_DEFAULT_MODEL?.trim();\r\n if (fromEnv) return fromEnv;\r\n return GLOBAL_DEFAULT_MODEL;\r\n}\r\n\r\nfunction inferProviderFromModel(model: string | undefined): string {\r\n const m = (model ?? \"\").toLowerCase();\r\n if (!m) return \"claude\";\r\n if (\r\n m.includes(\"composer\") ||\r\n m.includes(\"cursor\") ||\r\n m.includes(\"codex\") ||\r\n m.startsWith(\"gpt-\") ||\r\n m.startsWith(\"gpt5\")\r\n ) {\r\n return \"cursor\";\r\n }\r\n return \"claude\";\r\n}\r\n\r\nfunction normalizeProviderAliasModel(model: string, explicitProvider: string | undefined): ModelRoutingDecision | null {\r\n const alias = model.trim().toLowerCase();\r\n const provider = explicitProvider?.trim();\r\n if (alias === \"cursor\") {\r\n return {\r\n model: CURSOR_DEFAULT_MODEL,\r\n provider: \"cursor\",\r\n rule:\r\n provider && provider !== \"cursor\"\r\n ? \"explicit:model_provider_alias_overrode_provider\"\r\n : \"explicit:model_provider_alias\",\r\n requestedModel: model,\r\n };\r\n }\r\n if (alias === \"claude\" || alias === \"anthropic\") {\r\n return {\r\n model: CLAUDE_DEFAULT_MODEL,\r\n provider: \"claude\",\r\n rule:\r\n provider && provider !== \"claude\"\r\n ? \"explicit:model_provider_alias_overrode_provider\"\r\n : \"explicit:model_provider_alias\",\r\n requestedModel: model,\r\n };\r\n }\r\n return null;\r\n}\r\n\r\nfunction isOpusLane(ref: string, title: string): boolean {\r\n if (ref.includes(\"deep\") && ref.includes(\"review\")) return true;\r\n if (ref.includes(\"security\")) return true;\r\n if (ref.includes(\"plan_author\") || ref.includes(\"plan-author\")) return true;\r\n if (title.includes(\"deep review\") || title.includes(\"security review\")) return true;\r\n if (ref.includes(\"plan\") && !ref.includes(\"review\") && (ref.includes(\"author\") || ref.includes(\"strategy\"))) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Infer model + provider from AgentOS task metadata when the dispatcher did not\r\n * pass an explicit `--model`. Explicit CLI/model args always win.\r\n */\r\nexport function inferModelRoutingFromTask(task: Record<string, unknown>): ModelRoutingDecision {\r\n const ref = normalizeRef(taskString(task, \"executorRef\"));\r\n const title = taskString(task, \"title\").toLowerCase();\r\n const priority = taskString(task, \"priority\") || \"normal\";\r\n const roleLane = normalizeRef(taskString(task, \"roleLane\"));\r\n\r\n // Coding lanes \u2192 Cursor (cheaper than Opus for implementation).\r\n if (\r\n ref.includes(\"cursor\") ||\r\n ref.includes(\"codex\") ||\r\n ref.includes(\"composer\") ||\r\n ref.includes(\"copilot\") ||\r\n roleLane === \"implementer\" ||\r\n roleLane === \"repair_implementer\"\r\n ) {\r\n return { provider: \"cursor\", rule: \"lane:implementation\" };\r\n }\r\n\r\n // Landing / merge hygiene \u2192 Haiku on Claude.\r\n if (ref.includes(\"landing\") || title.startsWith(\"land:\") || title.includes(\" merge\")) {\r\n return {\r\n model: \"claude-haiku-4-5-20251001\",\r\n provider: \"claude\",\r\n rule: \"lane:landing\",\r\n };\r\n }\r\n\r\n // Reviews \u2014 Sonnet unless explicitly deep/security.\r\n if (ref.includes(\"review\") || title.startsWith(\"review \") || roleLane.includes(\"review\")) {\r\n if (isOpusLane(ref, title) || roleLane === \"deep_reviewer\") {\r\n return { model: \"claude-opus-4-7\", provider: \"claude\", rule: \"lane:deep_review\" };\r\n }\r\n return { model: \"claude-sonnet-4-6\", provider: \"claude\", rule: \"lane:review\" };\r\n }\r\n\r\n // Planning / strategy \u2192 Opus when the lane truly needs it.\r\n if (isOpusLane(ref, title) || roleLane === \"plan_author\") {\r\n return { model: \"claude-opus-4-7\", provider: \"claude\", rule: \"lane:planning\" };\r\n }\r\n\r\n if (priority === \"critical\") {\r\n return { model: \"claude-opus-4-7\", provider: \"claude\", rule: \"priority:critical\" };\r\n }\r\n if (priority === \"high\") {\r\n return { model: \"claude-sonnet-4-6\", provider: \"claude\", rule: \"priority:high\" };\r\n }\r\n if (priority === \"low\") {\r\n return {\r\n model: \"claude-haiku-4-5-20251001\",\r\n provider: \"claude\",\r\n rule: \"priority:low\",\r\n };\r\n }\r\n\r\n const model = resolveGlobalDefaultModel();\r\n return {\r\n model,\r\n provider: inferProviderFromModel(model),\r\n rule: \"default:global\",\r\n };\r\n}\r\n\r\n/** Resolve launch parameters: explicit CLI wins, then task inference, then global default. */\r\nexport function resolveWorkerLaunch(input: {\r\n explicitModel?: string;\r\n explicitProvider?: string;\r\n task?: Record<string, unknown>;\r\n}): ModelRoutingDecision {\r\n if (input.explicitModel?.trim()) {\r\n const model = input.explicitModel.trim();\r\n const providerAlias = normalizeProviderAliasModel(model, input.explicitProvider);\r\n if (providerAlias) return providerAlias;\r\n\r\n return {\r\n model,\r\n provider: input.explicitProvider?.trim() || inferProviderFromModel(model),\r\n rule: \"explicit:cli\",\r\n requestedModel: model,\r\n };\r\n }\r\n\r\n if (input.task && Object.keys(input.task).length > 0) {\r\n const inferred = inferModelRoutingFromTask(input.task);\r\n return {\r\n ...inferred,\r\n requestedModel: inferred.model,\r\n };\r\n }\r\n\r\n const model = resolveGlobalDefaultModel();\r\n return {\r\n model,\r\n provider: input.explicitProvider?.trim() || inferProviderFromModel(model),\r\n rule: \"default:global\",\r\n requestedModel: model,\r\n };\r\n}\r\n\r\n/** Fallback chain tail after provider start \u2014 never hard-code Opus here. */\r\nexport function resolveModelFallback(\r\n startedModel: string | undefined,\r\n launchModel: string | undefined,\r\n providerDefault: string | undefined,\r\n): string {\r\n return startedModel || launchModel || providerDefault || resolveGlobalDefaultModel() || CLAUDE_DEFAULT_MODEL;\r\n}\r\n", "/** Local dispatch retry/cooldown limits. */\r\n\r\nfunction positiveInt(value: string | undefined, 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\nexport interface HarnessRetryLimits {\r\n /** Advisory max task attempts surfaced to operator/dispatch (default 3). */\r\n maxTaskAttempts: number;\r\n /** Minimum ms between dispatch starts for the same run (default 5s). */\r\n dispatchCooldownMs: number;\r\n}\r\n\r\nexport function readHarnessRetryLimits(): HarnessRetryLimits {\r\n return {\r\n maxTaskAttempts: positiveInt(process.env.KYNVER_MAX_TASK_ATTEMPTS, 3),\r\n dispatchCooldownMs: positiveInt(process.env.KYNVER_DISPATCH_COOLDOWN_MS, 5_000),\r\n };\r\n}\r\n", "import path from \"node:path\";\r\nimport { resolveBaseUrl, resolveCallbackSecretWithMint } from \"./config.js\";\r\nimport { postJsonWithCredentialRefresh } from \"./callbacks.js\";\r\nimport { loadRun, runDirectory } from \"./run-store.js\";\r\nimport { computeWorkerStatus } from \"./status.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\nimport { isPidAlive, readJson, safeSlug } from \"./util.js\";\r\nimport { DEFAULT_DISPATCH_LEASE_MS } from \"./dispatch.js\";\r\n\r\nexport interface RenewActiveLeasesResult {\r\n renewed: string[];\r\n failed: Array<{ worker: string; reason: string }>;\r\n skipped: string[];\r\n}\r\n\r\nfunction workerRecord(runId: string, name: string): HarnessWorkerRecord | undefined {\r\n return readJson<HarnessWorkerRecord>(\r\n path.join(runDirectory(runId), \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n}\r\n\r\n/**\r\n * Renew leases for board-linked workers whose process is still alive.\r\n * Prevents dispatch/reaper from reclaiming a task while a local worker runs.\r\n */\r\nexport async function renewActiveTaskLeases(\r\n runId: string,\r\n args: Record<string, string | boolean>,\r\n): Promise<RenewActiveLeasesResult> {\r\n const run = loadRun(runId);\r\n const agentOsId = String(args.agentOsId || \"\");\r\n if (!agentOsId) {\r\n return { renewed: [], failed: [], skipped: [] };\r\n }\r\n\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const secret = await resolveCallbackSecretWithMint(\r\n args.secret ? String(args.secret) : undefined,\r\n agentOsId,\r\n { baseUrl: base },\r\n );\r\n const leaseDurationMs =\r\n Number(args.leaseMs) > 0 ? Math.floor(Number(args.leaseMs)) : DEFAULT_DISPATCH_LEASE_MS;\r\n const leaseOwner = `kynver-harness:${runId}`;\r\n\r\n const renewed: string[] = [];\r\n const failed: Array<{ worker: string; reason: string }> = [];\r\n const skipped: string[] = [];\r\n\r\n for (const name of Object.keys(run.workers || {})) {\r\n const worker = workerRecord(runId, name);\r\n if (!worker?.taskId || !worker.agentOsId) {\r\n skipped.push(name);\r\n continue;\r\n }\r\n if (!isPidAlive(worker.pid)) {\r\n skipped.push(name);\r\n continue;\r\n }\r\n const status = computeWorkerStatus(worker);\r\n if (status.status === \"done\") {\r\n skipped.push(name);\r\n continue;\r\n }\r\n\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/tasks/${encodeURIComponent(worker.taskId)}/renew-lease`;\r\n const res = await postJsonWithCredentialRefresh(\r\n url,\r\n secret,\r\n { leaseOwner, leaseDurationMs },\r\n { agentOsId, baseUrl: base },\r\n );\r\n if (res.ok) {\r\n renewed.push(name);\r\n continue;\r\n }\r\n const reason =\r\n res.response && typeof res.response === \"object\" && \"reason\" in res.response\r\n ? String((res.response as { reason?: unknown }).reason ?? `http ${res.status}`)\r\n : `http ${res.status}`;\r\n failed.push({ worker: name, reason });\r\n }\r\n\r\n return { renewed, failed, skipped };\r\n}\r\n\r\n/** True when this run already has a live worker bound to the same board task. */\r\nexport function hasLiveWorkerForTask(runId: string, taskId: string): boolean {\r\n const run = loadRun(runId);\r\n for (const name of Object.keys(run.workers || {})) {\r\n const worker = workerRecord(runId, name);\r\n if (!worker || worker.taskId !== taskId) continue;\r\n if (!isPidAlive(worker.pid)) continue;\r\n const status = computeWorkerStatus(worker);\r\n if (status.status === \"done\") continue;\r\n return true;\r\n }\r\n return false;\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 { resolveModelFallback, resolveWorkerLaunch } from \"./model-routing.js\";\r\nimport { resolveWorkerProvider } from \"./providers/registry.js\";\r\nimport type { HarnessRunRecord } from \"./run-store.js\";\r\nimport type {\r\n HarnessWorkerRecord,\r\n InstructionPolicyEvidenceSnapshot,\r\n PersonaContextEvidenceSnapshot,\r\n} from \"./status.js\";\r\nimport { autoCompleteWorker, 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 instructionPolicyMarkdown?: string | null;\r\n instructionPolicyFingerprint?: string | null;\r\n instructionPolicyEvidence?: InstructionPolicyEvidenceSnapshot | null;\r\n personaMarkdown?: string | null;\r\n personaSlug?: string | null;\r\n personaEvidence?: PersonaContextEvidenceSnapshot | null;\r\n leaseOwner?: string;\r\n dispatched?: boolean;\r\n provider?: string;\r\n routingRule?: string;\r\n requestedModel?: 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 // Resolve the provider and preflight the model *before* any git/worktree work so\r\n // an invalid model/provider combination fails fast (no orphan worktree) and an\r\n // agent-CLI reasoning suffix (e.g. claude-opus-4-7-thinking-high) is normalized\r\n // to a model the CLI accepts instead of silently dying with no final result.\r\n const routing =\r\n opts.routingRule || opts.requestedModel\r\n ? {\r\n provider: opts.provider || \"claude\",\r\n model: opts.model,\r\n rule: opts.routingRule || \"explicit:spawn\",\r\n requestedModel: opts.requestedModel ?? opts.model,\r\n }\r\n : resolveWorkerLaunch({\r\n explicitModel: opts.model,\r\n explicitProvider: opts.provider,\r\n });\r\n const provider = resolveWorkerProvider(routing.provider);\r\n let launchModel = routing.model;\r\n if (provider.preflightModel) {\r\n const preflight = provider.preflightModel(opts.model);\r\n if (!preflight.ok) {\r\n throw new Error(\r\n `model preflight failed for provider \"${provider.name}\": ${preflight.note ?? \"invalid model/provider combination\"}`,\r\n );\r\n }\r\n if (preflight.normalized) {\r\n console.error(`[supervisor] ${name}: ${preflight.note}`);\r\n }\r\n launchModel = preflight.model;\r\n }\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 planId: opts.planId,\r\n taskId: opts.taskId,\r\n instructionPolicyMarkdown: opts.instructionPolicyMarkdown,\r\n personaMarkdown: opts.personaMarkdown,\r\n model: launchModel,\r\n });\r\n\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: launchModel,\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 = resolveModelFallback(started.model, launchModel, provider.defaultModel);\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.instructionPolicyFingerprint\r\n ? { instructionPolicyFingerprint: String(opts.instructionPolicyFingerprint) }\r\n : {}),\r\n ...(opts.instructionPolicyEvidence ? { instructionPolicyEvidence: opts.instructionPolicyEvidence } : {}),\r\n ...(opts.personaSlug ? { personaSlug: String(opts.personaSlug) } : {}),\r\n ...(opts.personaEvidence ? { personaEvidence: opts.personaEvidence } : {}),\r\n ...(opts.leaseOwner ? { leaseOwner: String(opts.leaseOwner) } : {}),\r\n ...(opts.dispatched ? { dispatched: true } : {}),\r\n ...(!opts.agentOsId || !opts.taskId ? { localOnly: true } : {}),\r\n routingRule: routing.rule,\r\n ...(routing.requestedModel ? { requestedModel: routing.requestedModel } : {}),\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 let sidecarSpawned: ReturnType<typeof spawnCompletionSidecar> | undefined;\r\n try {\r\n sidecarSpawned = spawnCompletionSidecar({\r\n runId: run.id,\r\n workerName: name,\r\n workerDir,\r\n agentOsId: worker.agentOsId,\r\n });\r\n } catch (error) {\r\n // Sidecar spawn threw (e.g., permissions, file system error). Record the\r\n // failure as a completionBlocker so the worker routes to \"blocked\" instead\r\n // of leaving the task stuck in \"running\" when the worker exits.\r\n const reason = `completion sidecar failed to spawn: ${(error as Error).message}`;\r\n worker.completionBlocker = reason;\r\n saveWorker(run.id, worker);\r\n }\r\n // spawnCompletionSidecar can also return undefined on failure without throwing\r\n // (CLI path missing, log-file open failure, spawn failure). Surface this too.\r\n if (!sidecarSpawned) {\r\n const reason = \"completion sidecar failed to spawn (CLI not found or spawn error)\";\r\n worker.completionBlocker = reason;\r\n worker.completionSidecarSpawnFailedAt = new Date().toISOString();\r\n saveWorker(run.id, worker);\r\n } else if (sidecarSpawned.pid) {\r\n worker.completionSidecarPid = sidecarSpawned.pid;\r\n saveWorker(run.id, worker);\r\n }\r\n }\r\n return worker;\r\n}\r\n\r\nexport async function startWorker(args: Record<string, string | boolean>): Promise<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 const boardLinked = Boolean(args.agentOsId && args.taskId);\r\n const explicitLocalOnly = args.localOnly === true || args.localOnly === \"true\";\r\n if (!boardLinked && !explicitLocalOnly && (args.agentOsId || args.taskId)) {\r\n console.error(\r\n \"worker start: board-linked workers require both --agent-os-id and --task-id (or pass --local-only for direct runs)\",\r\n );\r\n process.exit(1);\r\n }\r\n const wait = args.wait === true || args.wait === \"true\";\r\n let worker: HarnessWorkerRecord | undefined;\r\n try {\r\n 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 if (!wait || !worker) return;\r\n\r\n // Block until the worker finishes and post completion to the AgentOS board.\r\n // The detached sidecar (spawned by spawnWorkerProcess) is still a fallback in\r\n // case this process is killed before the worker finishes. Both posting the same\r\n // completion is safe \u2014 tryCompleteWorker is idempotent on the backend.\r\n const outcome = await autoCompleteWorker({\r\n run: String(args.run),\r\n name: worker.name,\r\n ...(worker.agentOsId ? { agentOsId: worker.agentOsId } : {}),\r\n ...(args.baseUrl ? { baseUrl: String(args.baseUrl) } : {}),\r\n ...(args.secret ? { secret: String(args.secret) } : {}),\r\n });\r\n console.error(JSON.stringify({ event: \"start_wait_outcome\", ...outcome }));\r\n if (outcome.outcome === \"timed_out\") {\r\n process.exitCode = 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 /** Lane A operating rules from dispatch-next `harnessWorkerContext`. */\r\n instructionPolicyMarkdown?: string | null;\r\n /** Anchored task context-envelope persona block (required when task has personaSlug). */\r\n personaMarkdown?: string | null;\r\n /** When set, Haiku/compact models get a shorter harness instruction block. */\r\n model?: 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 compact = Boolean(input.model?.toLowerCase().includes(\"haiku\"));\r\n const progressLines = compact\r\n ? [\r\n \"Plan progress: when planId is set, use `kynver plan progress` for in_progress|running|partial|blocked. Use `in_progress` for agent-loop current focus; use `running` only when an executor holds a lease. Row `done` is MCP/session only.\",\r\n input.planId ? `Active planId: ${input.planId}` : \"No planId on this worker.\",\r\n ]\r\n : [\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 in_progress|running|partial|blocked` (the by-id harness route rejects `done` and confirm events). Prefer `in_progress` at turn start for current focus; daemon sets `running` on dispatch.\",\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 const planArtifactLines = compact\r\n ? [\r\n \"Plan artifacts: when authoring/revising docs/superpowers/plans/, open a GitHub PR early and iterate from that PR branch; do not leave the canonical plan only in the harness worktree.\",\r\n ]\r\n : [\r\n \"PR-first plan artifacts (when authoring or revising docs/superpowers/plans/):\",\r\n \"- Before substantial plan drafting: create a feature branch, open a GitHub PR (draft OK), commit and push the plan file \u2014 do not leave the canonical plan only in this harness worktree.\",\r\n \"- Iterate review on that PR branch; link prUrl on the AgentOS task and plan progress evidence (`--evidence pr:<url>`).\",\r\n \"- See docs/superpowers/plans/2026-05-25-pr-first-plan-artifact-preservation.md for the full checklist.\",\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 \"Completion handoff (required): before you stop, ensure the harness records a final result \u2014 summarize outcome in your last message and append a heartbeat line with phase `complete`. If you leave uncommitted changes or committed work without a PR, the orchestrator blocks completion until a GitHub PR exists (or you discard/commit cleanly). Exiting with only dirty files and no PR routes to salvage review, not production review.\",\r\n \"PR-ready handoff: for substantial implementation work, commit, push, and open a GitHub PR (draft OK) on your branch before finishing \u2014 or rely on the harness to run `gh pr create` at completion when `gh` is authenticated.\",\r\n \"Worker resource guard: do not run full monorepo verification (`npm run typecheck`, `npm run build`, or equivalent) from this worker lane unless an operator explicitly requests it. Use targeted checks for touched paths and rely on CI/operator lanes for heavy gates.\",\r\n \"If verification fails (including OOM), append a heartbeat line immediately with the last command, failure reason, dirty-file status, commit/PR handoff state, and next action so recovery does not require log spelunking.\",\r\n \"\",\r\n ...progressLines,\r\n \"\",\r\n ...planArtifactLines,\r\n \"\",\r\n ...(input.personaMarkdown?.trim()\r\n ? [input.personaMarkdown.trim(), \"\"]\r\n : []),\r\n ...(input.instructionPolicyMarkdown?.trim()\r\n ? [\"Operating rules (Lane A \u2014 from AgentOS memory policy):\", input.instructionPolicyMarkdown.trim(), \"\"]\r\n : []),\r\n \"Task:\",\r\n input.task,\r\n ].join(\"\\n\");\r\n}\r\n", "import { closeSync, existsSync, openSync } from \"node:fs\";\r\nimport { spawn } from \"node:child_process\";\r\nimport path from \"node:path\";\r\nimport { hiddenSpawnOptions } from \"../util.js\";\r\nimport { preflightCursorModel } from \"./model-preflight.js\";\r\nimport { resolveWindowsCursorBundled } from \"./cursor-windows.js\";\r\nimport type { WorkerProvider } from \"./types.js\";\r\n\r\nconst DEFAULT_CURSOR_MODEL = \"composer-2.5\";\r\n\r\nexport interface CursorSpawnTarget {\r\n executable: string;\r\n prefixArgs: string[];\r\n shell: boolean;\r\n detached: boolean;\r\n bundledVersionDir?: string;\r\n}\r\n\r\nfunction bundledSpawnTarget(nodeExe: string, indexJs: string, versionDir?: string): CursorSpawnTarget {\r\n return {\r\n executable: nodeExe,\r\n prefixArgs: [indexJs],\r\n shell: false,\r\n detached: true,\r\n bundledVersionDir: versionDir,\r\n };\r\n}\r\n\r\n/** Resolve a headless Windows spawn target (node.exe + index.js), never agent.cmd via shell. */\r\nexport function resolveCursorSpawn(agentBin: string): CursorSpawnTarget {\r\n if (process.platform === \"win32\") {\r\n const isCursorWrapper = /\\.(cmd|bat)$/i.test(agentBin);\r\n const isBundledNode =\r\n /node\\.exe$/i.test(agentBin) && existsSync(path.join(path.dirname(agentBin), \"index.js\"));\r\n const isDefaultShim = agentBin === \"agent\";\r\n\r\n if (isCursorWrapper || isBundledNode || isDefaultShim) {\r\n const bundled = isCursorWrapper\r\n ? resolveWindowsCursorBundled(path.dirname(agentBin))\r\n : isBundledNode\r\n ? {\r\n nodeExe: agentBin,\r\n indexJs: path.join(path.dirname(agentBin), \"index.js\"),\r\n versionDir: path.dirname(agentBin),\r\n }\r\n : resolveWindowsCursorBundled();\r\n\r\n if (bundled) {\r\n return bundledSpawnTarget(bundled.nodeExe, bundled.indexJs, bundled.versionDir);\r\n }\r\n\r\n throw new Error(\r\n \"Cursor Agent on Windows has no headless bundled node.exe under %LOCALAPPDATA%\\\\cursor-agent\\\\versions\\\\\u2026. \" +\r\n \"Run `agent login` / update Cursor Agent CLI, use `--provider claude`, or set KYNVER_CURSOR_AGENT_ROOT to the cursor-agent folder.\",\r\n );\r\n }\r\n }\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 bundled = resolveWindowsCursorBundled(\r\n process.env.KYNVER_CURSOR_AGENT_ROOT?.trim() || undefined,\r\n );\r\n if (bundled) return bundled.nodeExe;\r\n\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\nfunction cursorWorkerEnv(agentBin: string, spawnTarget: CursorSpawnTarget): NodeJS.ProcessEnv {\r\n return {\r\n ...process.env,\r\n CI: \"1\",\r\n NO_COLOR: \"1\",\r\n ...(spawnTarget.bundledVersionDir\r\n ? { CURSOR_INVOKED_AS: path.basename(agentBin) || \"agent.cmd\" }\r\n : {}),\r\n };\r\n}\r\n\r\nexport const cursorProvider: WorkerProvider = {\r\n name: \"cursor\",\r\n defaultModel: DEFAULT_CURSOR_MODEL,\r\n preflightModel(model) {\r\n return preflightCursorModel(model, DEFAULT_CURSOR_MODEL);\r\n },\r\n start(opts) {\r\n const preflight = preflightCursorModel(opts.model, DEFAULT_CURSOR_MODEL);\r\n if (!preflight.ok) {\r\n throw new Error(`cursor provider model preflight failed: ${preflight.note}`);\r\n }\r\n const model = preflight.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 hiddenSpawnOptions({\r\n cwd: opts.worktreePath,\r\n detached: spawnTarget.detached,\r\n shell: spawnTarget.shell,\r\n stdio: [\"ignore\", stdoutFd, stderrFd],\r\n env: cursorWorkerEnv(agentBin, spawnTarget),\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 { existsSync, readdirSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\n\r\n/** Match Cursor's agent.ps1 version folders: YYYY.MM.DD-commit */\r\nconst CURSOR_VERSION_DIR = /^\\d{4}\\.\\d{1,2}\\.\\d{1,2}-[a-f0-9]+$/i;\r\n\r\nexport function parseCursorVersionSortKey(versionName: string): number | null {\r\n const datePart = versionName.split(\"-\")[0];\r\n const parts = datePart.split(\".\");\r\n if (parts.length !== 3) return null;\r\n const [year, month, day] = parts;\r\n if (!year || !month || !day) return null;\r\n return Number(`${year}${month.padStart(2, \"0\")}${day.padStart(2, \"0\")}`);\r\n}\r\n\r\nexport function pickLatestCursorVersionDir(agentRoot: string): string | null {\r\n const versionsRoot = path.join(agentRoot, \"versions\");\r\n if (!existsSync(versionsRoot)) return null;\r\n\r\n let bestDir: string | null = null;\r\n let bestKey = -1;\r\n\r\n for (const entry of readdirSync(versionsRoot, { withFileTypes: true })) {\r\n if (!entry.isDirectory() || !CURSOR_VERSION_DIR.test(entry.name)) continue;\r\n const key = parseCursorVersionSortKey(entry.name);\r\n if (key == null || key <= bestKey) continue;\r\n bestKey = key;\r\n bestDir = path.join(versionsRoot, entry.name);\r\n }\r\n\r\n return bestDir;\r\n}\r\n\r\nexport function resolveWindowsCursorBundled(agentRoot?: string): {\r\n nodeExe: string;\r\n indexJs: string;\r\n versionDir: string;\r\n} | null {\r\n const root =\r\n agentRoot?.trim() ||\r\n path.join(process.env.LOCALAPPDATA || \"\", \"cursor-agent\");\r\n\r\n const directNode = path.join(root, \"node.exe\");\r\n const directIndex = path.join(root, \"index.js\");\r\n if (existsSync(directNode) && existsSync(directIndex)) {\r\n return { nodeExe: directNode, indexJs: directIndex, versionDir: root };\r\n }\r\n\r\n const versionDir = pickLatestCursorVersionDir(root);\r\n if (!versionDir) return null;\r\n\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\r\n return { nodeExe, indexJs, versionDir };\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 { hiddenSpawnOptions } from \"./util.js\";\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(\r\n nodeExecutable,\r\n args,\r\n hiddenSpawnOptions({\r\n detached: true,\r\n stdio,\r\n env: process.env,\r\n }),\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 { postJsonWithCredentialRefresh } from \"./callbacks.js\";\r\nimport { loadRun, loadWorker, runDirectory, saveWorker, type HarnessRunRecord } from \"./run-store.js\";\r\nimport { assessExitedWorkerSalvage } from \"./exited-salvage.js\";\r\nimport { ensurePrReadyHandoff } from \"./pr-handoff/index.js\";\r\nimport { computeWorkerStatus, deriveRunStatus, isFinishedWorkerStatus } from \"./status.js\";\r\nimport type {\r\n HarnessWorkerRecord,\r\n InstructionPolicyEvidenceSnapshot,\r\n RawHarnessWorkerStatus,\r\n} from \"./status.js\";\r\nimport { summarizeEvent } from \"./stream.js\";\r\nimport {\r\n hasCompletionAck,\r\n persistCompletionAck,\r\n type CompletionAckFields,\r\n} from \"./completion-ack.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\nfunction asRecord(value: unknown): Record<string, unknown> | null {\r\n return value && typeof value === \"object\" && !Array.isArray(value)\r\n ? (value as Record<string, unknown>)\r\n : null;\r\n}\r\n\r\nfunction asString(value: unknown): string | null {\r\n if (typeof value !== \"string\") return null;\r\n const trimmed = value.trim();\r\n return trimmed.length ? trimmed : null;\r\n}\r\n\r\nfunction deriveLifecycleStage(input: {\r\n finished: boolean;\r\n completionBlocker?: string;\r\n completionOutcome?: string | null;\r\n completionReportedAt?: string | null;\r\n}): string {\r\n if (input.completionBlocker) return `blocked:${input.completionBlocker}`;\r\n if (input.completionOutcome) return input.completionOutcome;\r\n if (input.completionReportedAt) return \"completion_acknowledged\";\r\n if (input.finished) return \"worker_finished\";\r\n return \"in_progress\";\r\n}\r\n\r\nfunction deriveNextAction(input: {\r\n completionBlocker?: string;\r\n completionOutcome?: string | null;\r\n completionReportedAt?: string | null;\r\n finished: boolean;\r\n}): string | null {\r\n if (input.completionBlocker) {\r\n return \"Resolve completion blocker, then rerun `kynver worker complete`.\";\r\n }\r\n if (input.completionOutcome === \"review_scheduled\" || input.completionOutcome === \"review_already_scheduled\") {\r\n return \"Await review lane and landing decision in Command Center.\";\r\n }\r\n if (input.completionOutcome === \"needs_attention\") {\r\n return \"Inspect blocker/attention reason in Command Center and dispatch a repair task.\";\r\n }\r\n if (input.finished && !input.completionReportedAt) {\r\n return \"Post completion acknowledgement to AgentOS (`kynver worker complete`).\";\r\n }\r\n return null;\r\n}\r\n\r\nfunction deriveHandoffState(input: {\r\n changedFiles: string[];\r\n headCommit?: string;\r\n prUrl?: string;\r\n}): \"pr_handoff\" | \"commit_handoff\" | \"dirty_worktree\" | \"none\" {\r\n if (input.prUrl) return \"pr_handoff\";\r\n if (input.headCommit) return \"commit_handoff\";\r\n if (input.changedFiles.length > 0) return \"dirty_worktree\";\r\n return \"none\";\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\nfunction workerStatusOptions(run: HarnessRunRecord | null) {\r\n return run ? { base: run.base, baseCommit: run.baseCommit } : {};\r\n}\r\n\r\nfunction applyPrHandoffToStatus(\r\n status: RawHarnessWorkerStatus,\r\n handoff: { prUrl?: string; headCommit?: string },\r\n): RawHarnessWorkerStatus {\r\n return {\r\n ...status,\r\n ...(handoff.prUrl ? { prUrl: handoff.prUrl } : {}),\r\n ...(handoff.headCommit ? { headCommit: handoff.headCommit } : {}),\r\n };\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 nextAction?: string;\r\n httpStatus?: number;\r\n response?: unknown;\r\n completionBlocked?: boolean;\r\n prHandoff?: { prUrl?: string; created?: boolean };\r\n}> {\r\n const worker = loadWorker(String(args.run), String(args.name));\r\n const run = loadRun(worker.runId);\r\n let status = computeWorkerStatus(worker, workerStatusOptions(run));\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 forceReplay = args.force === true || args.force === \"true\";\r\n if (!forceReplay && hasCompletionAck(worker)) {\r\n return {\r\n ok: true,\r\n skipped: true,\r\n reason: \"completion-already-acknowledged\",\r\n httpStatus: 200,\r\n };\r\n }\r\n\r\n if (worker.localOnly) {\r\n return { ok: true, skipped: true, reason: \"local-only-worker\" };\r\n }\r\n\r\n const skipPrHandoff = args.skipPrHandoff === true || args.skipPrHandoff === \"true\";\r\n if (!skipPrHandoff && worker.dispatched && taskId) {\r\n const handoff = ensurePrReadyHandoff({ worker, run, status });\r\n if (!handoff.ok) {\r\n persistCompletionBlocker(worker, handoff.reason);\r\n return {\r\n ok: false,\r\n reason: handoff.reason,\r\n nextAction: handoff.nextAction,\r\n completionBlocked: true,\r\n };\r\n }\r\n if (handoff.prUrl || handoff.headCommit) {\r\n status = applyPrHandoffToStatus(status, handoff);\r\n }\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: \"kynver-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 workerInjection: {\r\n instructionPolicyFingerprint: worker.instructionPolicyFingerprint ?? null,\r\n instructionPolicyEvidence: worker.instructionPolicyEvidence ?? null,\r\n personaSlug: worker.personaSlug ?? null,\r\n personaEvidence: worker.personaEvidence ?? null,\r\n },\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 const ack: CompletionAckFields = {\r\n completionReportedAt: new Date().toISOString(),\r\n completionOutcome: \"acknowledged\",\r\n completionResponse: result.parsed,\r\n };\r\n persistCompletionAck(worker, worker.runId, ack);\r\n const prUrl = status.prUrl;\r\n return {\r\n ok: true,\r\n httpStatus: result.status,\r\n response: result.parsed,\r\n ...(prUrl ? { prHandoff: { prUrl } } : {}),\r\n };\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 run = loadRun(worker.runId);\r\n const status = computeWorkerStatus(worker, workerStatusOptions(run));\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 run = loadRun(worker.runId);\r\n const status = computeWorkerStatus(worker, workerStatusOptions(run));\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 buildRunBoard(runId: string): Record<string, unknown> {\r\n const run = loadRun(runId);\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, {\r\n base: run.base,\r\n baseCommit: run.baseCommit,\r\n });\r\n const headCommit =\r\n status.gitAncestry.headIsAncestorOfBase === false && status.gitAncestry.head\r\n ? status.gitAncestry.head\r\n : undefined;\r\n const exitedSalvage = assessExitedWorkerSalvage({\r\n alive: status.alive,\r\n finalResult: status.finalResult,\r\n changedFiles: status.changedFiles,\r\n gitAncestry: status.gitAncestry,\r\n headCommit,\r\n });\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 const boardStatus = completionBlocker ? \"blocked\" : status.status;\r\n const boardAttention = completionBlocker ? \"blocked\" : status.attention.state;\r\n const completionResponse = asRecord(worker.completionResponse);\r\n const completionTask = asRecord(completionResponse?.task);\r\n const completionOutcome = asString(completionResponse?.outcome);\r\n const completionRouteStatus = asString(completionResponse?.status);\r\n const completionWarnings = Array.isArray(completionResponse?.warnings)\r\n ? completionResponse.warnings.filter((w): w is string => typeof w === \"string\" && w.trim().length > 0)\r\n : [];\r\n const prUrl = asString(completionTask?.prUrl) ?? asString(completionResponse?.prUrl);\r\n const lifecycleStage = deriveLifecycleStage({\r\n finished: isFinishedWorkerStatus(status),\r\n completionBlocker,\r\n completionOutcome,\r\n completionReportedAt: worker.completionReportedAt ?? null,\r\n });\r\n const nextAction = deriveNextAction({\r\n completionBlocker,\r\n completionOutcome,\r\n completionReportedAt: worker.completionReportedAt ?? null,\r\n finished: isFinishedWorkerStatus(status),\r\n });\r\n const handoffState = deriveHandoffState({\r\n changedFiles: status.changedFiles,\r\n headCommit,\r\n prUrl: prUrl ?? undefined,\r\n });\r\n return {\r\n worker: status.worker,\r\n status: boardStatus,\r\n attention: boardAttention,\r\n attentionReason: completionBlocker ?? status.attention.reason,\r\n landingBlocked: status.finalResult\r\n ? boardAttention === \"needs_attention\" || boardAttention === \"blocked\"\r\n : false,\r\n exitedWithoutFinalResult: !status.finalResult && !status.alive,\r\n salvageState: exitedSalvage?.salvageable ? \"review_needed\" : \"none\",\r\n salvageReason: exitedSalvage?.salvageable ? exitedSalvage.attentionReason : undefined,\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 changedFiles: status.changedFiles,\r\n branch: status.branch,\r\n taskId: worker.taskId ?? null,\r\n planId: worker.planId ?? null,\r\n instructionPolicyFingerprint:\r\n typeof worker.instructionPolicyFingerprint === \"string\"\r\n ? worker.instructionPolicyFingerprint\r\n : null,\r\n instructionPolicyRuleCount: (() => {\r\n const raw = worker.instructionPolicyEvidence;\r\n if (!raw || typeof raw !== \"object\") return null;\r\n const slugs = (raw as InstructionPolicyEvidenceSnapshot).ruleSlugs;\r\n return Array.isArray(slugs) ? slugs.length : null;\r\n })(),\r\n leaseOwner: worker.leaseOwner ?? null,\r\n model: typeof worker.model === \"string\" ? worker.model : undefined,\r\n routingRule: typeof worker.routingRule === \"string\" ? worker.routingRule : undefined,\r\n requestedModel: typeof worker.requestedModel === \"string\" ? worker.requestedModel : undefined,\r\n headCommit,\r\n prUrl,\r\n handoffState,\r\n gitAncestry: status.gitAncestry,\r\n finalResult: status.finalResult,\r\n lifecycleStage,\r\n completionReportedAt: worker.completionReportedAt ?? null,\r\n completionOutcome: worker.completionOutcome ?? null,\r\n completionRouteStatus,\r\n completionRouteOutcome: completionOutcome,\r\n completionWarnings,\r\n completionBlocker: completionBlocker ?? null,\r\n checkpoint: {\r\n phase: status.lastHeartbeatPhase,\r\n summary: status.lastHeartbeatSummary,\r\n blocker: status.heartbeatBlocker,\r\n },\r\n lastCommandHint: status.currentTool ?? status.lastHeartbeatSummary,\r\n failureReason: completionBlocker ?? status.error ?? null,\r\n nextAction,\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 return board;\r\n}\r\n\r\nexport async function publishHarnessBoardSnapshot(\r\n args: Record<string, string | boolean>,\r\n source: string,\r\n): Promise<Record<string, unknown> | null> {\r\n const runId = String(args.run || \"\");\r\n const agentOsId = String(args.agentOsId || \"\");\r\n if (!runId || !agentOsId) return null;\r\n const board = buildRunBoard(runId);\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : undefined, agentOsId, {\r\n baseUrl: base,\r\n });\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/harness/snapshot`;\r\n const res = await postJsonWithCredentialRefresh(\r\n url,\r\n secret,\r\n { agentOsId, runId, source, snapshot: board },\r\n { agentOsId, baseUrl: base },\r\n );\r\n return {\r\n ok: res.ok,\r\n httpStatus: res.status,\r\n response: res.response,\r\n authRefreshed: res.refreshedAuth,\r\n authRefreshFailure: res.authRefreshFailure,\r\n };\r\n}\r\n\r\nexport function runStatus(args: Record<string, string | boolean>): void {\r\n const board = buildRunBoard(String(args.run));\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 type { GitAncestry } from \"../git.js\";\r\nimport type { PrHandoffRequirement, PrHandoffSnapshot } from \"./pr-handoff.types.js\";\r\n\r\nconst REVIEW_LANE_RULE = /^(lane:)?(review|deep_review|planning|landing)(:|$)/i;\r\n\r\nfunction trimOrNull(value: unknown): string | null {\r\n if (typeof value !== \"string\") return null;\r\n const trimmed = value.trim();\r\n return trimmed.length ? trimmed : null;\r\n}\r\n\r\nfunction committedHead(ancestry: GitAncestry | null | undefined): string | null {\r\n if (!ancestry?.checked) return null;\r\n if (ancestry.headIsAncestorOfBase !== false) return null;\r\n return trimOrNull(ancestry.head);\r\n}\r\n\r\n/** Best-effort PR URL from free text (completion summary / final result). */\r\nexport function extractPrUrlFromText(value: unknown): string | null {\r\n if (value === undefined || value === null) return null;\r\n const text =\r\n typeof value === \"string\"\r\n ? value\r\n : typeof value === \"object\" && value !== null && \"summary\" in value\r\n ? String((value as { summary?: unknown }).summary ?? \"\")\r\n : JSON.stringify(value);\r\n const m = text.match(\r\n /https?:\\/\\/[^\\s)>\"]+\\/(?:pull|pulls|merge_requests|pull-requests)\\/\\d+/i,\r\n );\r\n return m ? trimOrNull(m[0]) : null;\r\n}\r\n\r\nfunction hasWorkProduct(snapshot: Pick<PrHandoffSnapshot, \"changedFiles\" | \"headCommit\" | \"gitAncestry\">): boolean {\r\n if (snapshot.changedFiles.length > 0) return true;\r\n if (trimOrNull(snapshot.headCommit)) return true;\r\n if (committedHead(snapshot.gitAncestry)) return true;\r\n return false;\r\n}\r\n\r\n/**\r\n * Board-dispatched implementation workers with code changes must land with a PR\r\n * URL before AgentOS completion is posted.\r\n */\r\nexport function assessPrHandoffRequirement(input: {\r\n dispatched?: boolean;\r\n routingRule?: string | null;\r\n prUrl?: string | null;\r\n patchPath?: string | null;\r\n artifactBundlePath?: string | null;\r\n snapshot: PrHandoffSnapshot;\r\n}): PrHandoffRequirement {\r\n if (!input.dispatched) {\r\n return { required: false, reason: \"not_dispatched\" };\r\n }\r\n\r\n const rule = trimOrNull(input.routingRule) ?? \"\";\r\n if (rule && REVIEW_LANE_RULE.test(rule)) {\r\n return { required: false, reason: \"review_lane\" };\r\n }\r\n\r\n if (trimOrNull(input.patchPath) || trimOrNull(input.artifactBundlePath)) {\r\n return { required: false, reason: \"patch_or_bundle\" };\r\n }\r\n\r\n const prUrl = trimOrNull(input.prUrl) ?? trimOrNull(input.snapshot.prUrl);\r\n if (prUrl) {\r\n return { required: false, reason: \"already_has_pr\" };\r\n }\r\n\r\n if (!hasWorkProduct(input.snapshot)) {\r\n return { required: false, reason: \"no_work_product\" };\r\n }\r\n\r\n return { required: true, snapshot: input.snapshot };\r\n}\r\n\r\nexport function buildPrHandoffSnapshotFromStatus(\r\n status: {\r\n changedFiles: string[];\r\n branch: string;\r\n worktreePath: string;\r\n gitAncestry: GitAncestry;\r\n finalResult: unknown;\r\n },\r\n extras?: { prUrl?: string | null; headCommit?: string | null },\r\n): PrHandoffSnapshot {\r\n return {\r\n changedFiles: status.changedFiles,\r\n branch: status.branch,\r\n worktreePath: status.worktreePath,\r\n gitAncestry: status.gitAncestry,\r\n finalResult: status.finalResult,\r\n headCommit: trimOrNull(extras?.headCommit) ?? committedHead(status.gitAncestry),\r\n prUrl: trimOrNull(extras?.prUrl) ?? null,\r\n };\r\n}\r\n", "import { spawnSync } from \"node:child_process\";\r\nimport { gitCapture } from \"../git.js\";\r\n\r\nexport interface CommandCapture {\r\n status: number | null;\r\n stdout: string;\r\n stderr: string;\r\n error: string | null;\r\n}\r\n\r\nexport interface PrHandoffExec {\r\n git: (cwd: string, args: string[]) => CommandCapture;\r\n gh: (cwd: string, args: string[]) => CommandCapture;\r\n}\r\n\r\nfunction capture(bin: string, cwd: string, args: string[]): CommandCapture {\r\n try {\r\n const res = spawnSync(bin, args, { cwd, encoding: \"utf8\" });\r\n return {\r\n status: res.status,\r\n stdout: (res.stdout || \"\").trim(),\r\n stderr: (res.stderr || \"\").trim(),\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 const defaultPrHandoffExec: PrHandoffExec = {\r\n git: (cwd, args) => gitCapture(cwd, args),\r\n gh: (cwd, args) => capture(\"gh\", cwd, args),\r\n};\r\n\r\nfunction parseGithubRepo(remoteUrl: string): string | null {\r\n const trimmed = remoteUrl.trim();\r\n const ssh = trimmed.match(/git@github\\.com:([^/]+\\/[^/.]+)(?:\\.git)?/i);\r\n if (ssh) return ssh[1];\r\n const https = trimmed.match(/github\\.com[/:]([^/]+\\/[^/.]+?)(?:\\.git)?/i);\r\n if (https) return https[1];\r\n return null;\r\n}\r\n\r\nfunction firstLine(text: string): string {\r\n return text.split(\"\\n\").map((l) => l.trim()).find(Boolean) ?? \"\";\r\n}\r\n\r\nexport function resolveGithubRepo(worktreePath: string, exec: PrHandoffExec): string | null {\r\n const remote = exec.git(worktreePath, [\"remote\", \"get-url\", \"origin\"]);\r\n if (remote.status !== 0) return null;\r\n return parseGithubRepo(remote.stdout);\r\n}\r\n\r\nexport function resolveHeadCommit(worktreePath: string, exec: PrHandoffExec): string | null {\r\n const head = exec.git(worktreePath, [\"rev-parse\", \"HEAD\"]);\r\n if (head.status !== 0) return null;\r\n return head.stdout.trim() || null;\r\n}\r\n\r\n/** Look up an open PR for this head branch. */\r\nexport function findOpenPrUrl(\r\n worktreePath: string,\r\n repo: string,\r\n branch: string,\r\n exec: PrHandoffExec,\r\n): string | null {\r\n const listed = exec.gh(worktreePath, [\r\n \"pr\",\r\n \"list\",\r\n \"--repo\",\r\n repo,\r\n \"--head\",\r\n branch,\r\n \"--state\",\r\n \"open\",\r\n \"--json\",\r\n \"url\",\r\n \"--limit\",\r\n \"1\",\r\n ]);\r\n if (listed.status !== 0) return null;\r\n try {\r\n const rows = JSON.parse(listed.stdout) as Array<{ url?: string }>;\r\n const url = rows[0]?.url?.trim();\r\n return url || null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport interface CommitAndPushResult {\r\n ok: boolean;\r\n committed: boolean;\r\n pushed: boolean;\r\n headCommit?: string;\r\n detail?: string;\r\n}\r\n\r\nexport function commitAndPushBranch(input: {\r\n worktreePath: string;\r\n branch: string;\r\n commitMessage: string;\r\n hasDirtyFiles: boolean;\r\n exec: PrHandoffExec;\r\n}): CommitAndPushResult {\r\n const { worktreePath, branch, commitMessage, hasDirtyFiles, exec } = input;\r\n\r\n if (hasDirtyFiles) {\r\n const add = exec.git(worktreePath, [\"add\", \"-A\"]);\r\n if (add.status !== 0) {\r\n return {\r\n ok: false,\r\n committed: false,\r\n pushed: false,\r\n detail: add.stderr || add.stdout || add.error || \"git add failed\",\r\n };\r\n }\r\n const commit = exec.git(worktreePath, [\"commit\", \"-m\", commitMessage]);\r\n if (commit.status !== 0) {\r\n return {\r\n ok: false,\r\n committed: false,\r\n pushed: false,\r\n detail: commit.stderr || commit.stdout || commit.error || \"git commit failed\",\r\n };\r\n }\r\n }\r\n\r\n const push = exec.git(worktreePath, [\"push\", \"-u\", \"origin\", branch]);\r\n if (push.status !== 0) {\r\n return {\r\n ok: false,\r\n committed: hasDirtyFiles,\r\n pushed: false,\r\n detail: push.stderr || push.stdout || push.error || \"git push failed\",\r\n };\r\n }\r\n\r\n const headCommit = resolveHeadCommit(worktreePath, exec) ?? undefined;\r\n return {\r\n ok: true,\r\n committed: hasDirtyFiles,\r\n pushed: true,\r\n headCommit,\r\n };\r\n}\r\n\r\nexport interface CreatePrResult {\r\n ok: boolean;\r\n prUrl?: string;\r\n created?: boolean;\r\n detail?: string;\r\n}\r\n\r\nexport function createGithubPr(input: {\r\n worktreePath: string;\r\n repo: string;\r\n branch: string;\r\n base: string;\r\n title: string;\r\n body: string;\r\n exec: PrHandoffExec;\r\n}): CreatePrResult {\r\n const existing = findOpenPrUrl(input.worktreePath, input.repo, input.branch, input.exec);\r\n if (existing) {\r\n return { ok: true, prUrl: existing, created: false };\r\n }\r\n\r\n const created = input.exec.gh(input.worktreePath, [\r\n \"pr\",\r\n \"create\",\r\n \"--repo\",\r\n input.repo,\r\n \"--base\",\r\n input.base,\r\n \"--head\",\r\n input.branch,\r\n \"--title\",\r\n input.title,\r\n \"--body\",\r\n input.body,\r\n \"--draft\",\r\n ]);\r\n if (created.status !== 0) {\r\n return {\r\n ok: false,\r\n detail: created.stderr || created.stdout || created.error || \"gh pr create failed\",\r\n };\r\n }\r\n\r\n const url =\r\n extractPrUrlFromGhOutput(created.stdout) ??\r\n findOpenPrUrl(input.worktreePath, input.repo, input.branch, input.exec);\r\n if (!url) {\r\n return { ok: false, detail: \"gh pr create succeeded but no PR URL was parsed\" };\r\n }\r\n return { ok: true, prUrl: url, created: true };\r\n}\r\n\r\nfunction extractPrUrlFromGhOutput(stdout: string): string | null {\r\n const line = firstLine(stdout);\r\n const m = line.match(/https?:\\/\\/[^\\s]+\\/pull\\/\\d+/i);\r\n return m ? m[0] : null;\r\n}\r\n", "import {\r\n assessPrHandoffRequirement,\r\n buildPrHandoffSnapshotFromStatus,\r\n extractPrUrlFromText,\r\n} from \"./pr-handoff-assess.js\";\r\nimport {\r\n commitAndPushBranch,\r\n createGithubPr,\r\n defaultPrHandoffExec,\r\n findOpenPrUrl,\r\n resolveGithubRepo,\r\n resolveHeadCommit,\r\n type PrHandoffExec,\r\n} from \"./pr-handoff-gh.js\";\r\nimport type { EnsurePrHandoffInput, EnsurePrHandoffResult } from \"./pr-handoff.types.js\";\r\n\r\nfunction ghAvailable(exec: PrHandoffExec): boolean {\r\n const probe = exec.gh(process.cwd(), [\"--version\"]);\r\n return probe.status === 0;\r\n}\r\n\r\nfunction defaultPrTitle(workerName: string, runId: string): string {\r\n return `AgentOS harness: ${workerName} (${runId})`;\r\n}\r\n\r\nfunction defaultPrBody(taskId: string | undefined, workerName: string, runId: string): string {\r\n return [\r\n \"Automated PR-ready handoff from the Kynver harness runtime.\",\r\n \"\",\r\n taskId ? `AgentOS task: \\`${taskId}\\`` : \"\",\r\n `Harness worker: \\`${workerName}\\` \u00B7 run \\`${runId}\\``,\r\n \"\",\r\n \"Opened by orchestrator completion enforcement so production review receives a reviewable artifact.\",\r\n ]\r\n .filter(Boolean)\r\n .join(\"\\n\");\r\n}\r\n\r\n/**\r\n * Ensure a board-dispatched implementation worker has a GitHub PR before completion\r\n * is posted to AgentOS. Commits dirty trees, pushes the branch, and runs\r\n * `gh pr create` when needed.\r\n */\r\nexport function ensurePrReadyHandoff(\r\n input: EnsurePrHandoffInput,\r\n exec: PrHandoffExec = defaultPrHandoffExec,\r\n): EnsurePrHandoffResult {\r\n const prUrlHint =\r\n input.prUrlHint ?? extractPrUrlFromText(input.status.finalResult) ?? null;\r\n\r\n const snapshot = buildPrHandoffSnapshotFromStatus(input.status, {\r\n prUrl: prUrlHint,\r\n headCommit: null,\r\n });\r\n\r\n const requirement = assessPrHandoffRequirement({\r\n dispatched: input.worker.dispatched,\r\n routingRule: input.worker.routingRule,\r\n prUrl: prUrlHint,\r\n snapshot,\r\n });\r\n\r\n if (!requirement.required) {\r\n return { ok: true, prUrl: prUrlHint ?? undefined };\r\n }\r\n\r\n if (prUrlHint) {\r\n return { ok: true, prUrl: prUrlHint };\r\n }\r\n\r\n if (!ghAvailable(exec)) {\r\n const dirty = snapshot.changedFiles.length;\r\n const detail = dirty\r\n ? `${dirty} uncommitted change(s) with no PR URL`\r\n : \"committed branch with no PR URL\";\r\n return {\r\n ok: false,\r\n reason: `PR-ready handoff blocked: ${detail}`,\r\n nextAction:\r\n \"Install and authenticate GitHub CLI (`gh auth login`), then commit, push, and run `gh pr create` (or rerun `kynver worker complete` after the PR exists).\",\r\n };\r\n }\r\n\r\n const repo = resolveGithubRepo(snapshot.worktreePath, exec);\r\n if (!repo) {\r\n return {\r\n ok: false,\r\n reason: \"PR-ready handoff blocked: could not resolve github.com origin for the worktree\",\r\n nextAction:\r\n \"Ensure `origin` points at GitHub, push the branch, open a PR, and rerun `kynver worker complete`.\",\r\n };\r\n }\r\n\r\n const existing = findOpenPrUrl(snapshot.worktreePath, repo, snapshot.branch, exec);\r\n if (existing) {\r\n return {\r\n ok: true,\r\n prUrl: existing,\r\n headCommit: snapshot.headCommit ?? resolveHeadCommit(snapshot.worktreePath, exec) ?? undefined,\r\n };\r\n }\r\n\r\n const hasDirty = snapshot.changedFiles.length > 0;\r\n\r\n let committed = false;\r\n let pushed = false;\r\n let headCommit = snapshot.headCommit ?? undefined;\r\n\r\n const pushResult = commitAndPushBranch({\r\n worktreePath: snapshot.worktreePath,\r\n branch: snapshot.branch,\r\n commitMessage: `chore(harness): PR-ready handoff for ${input.worker.name}`,\r\n hasDirtyFiles: hasDirty,\r\n exec,\r\n });\r\n if (hasDirty && !pushResult.ok) {\r\n return {\r\n ok: false,\r\n reason: `PR-ready handoff blocked: ${pushResult.detail ?? \"git commit/push failed\"}`,\r\n nextAction:\r\n \"Commit and push the branch, run `gh pr create`, then rerun `kynver worker complete`.\",\r\n };\r\n }\r\n if (!hasDirty) {\r\n const pushOnly = exec.git(snapshot.worktreePath, [\"push\", \"-u\", \"origin\", snapshot.branch]);\r\n if (pushOnly.status !== 0 && !/already up to date/i.test(pushOnly.stderr || pushOnly.stdout)) {\r\n return {\r\n ok: false,\r\n reason: `PR-ready handoff blocked: ${pushOnly.stderr || pushOnly.stdout || pushOnly.error || \"git push failed\"}`,\r\n nextAction:\r\n \"Push the branch to origin, run `gh pr create`, then rerun `kynver worker complete`.\",\r\n };\r\n }\r\n pushed = pushOnly.status === 0;\r\n } else {\r\n committed = pushResult.committed;\r\n pushed = pushResult.pushed;\r\n if (!pushResult.ok) {\r\n return {\r\n ok: false,\r\n reason: `PR-ready handoff blocked: ${pushResult.detail ?? \"git push failed\"}`,\r\n nextAction:\r\n \"Fix git auth or merge conflicts, push the branch, run `gh pr create`, then rerun `kynver worker complete`.\",\r\n };\r\n }\r\n }\r\n headCommit =\r\n pushResult.headCommit ?? headCommit ?? resolveHeadCommit(snapshot.worktreePath, exec) ?? undefined;\r\n\r\n const base = input.run.base?.trim() || \"main\";\r\n const pr = createGithubPr({\r\n worktreePath: snapshot.worktreePath,\r\n repo,\r\n branch: snapshot.branch,\r\n base: base.replace(/^origin\\//, \"\"),\r\n title: defaultPrTitle(input.worker.name, input.worker.runId),\r\n body: defaultPrBody(input.worker.taskId, input.worker.name, input.worker.runId),\r\n exec,\r\n });\r\n\r\n if (!pr.ok || !pr.prUrl) {\r\n const dirty = snapshot.changedFiles.length;\r\n const detail = dirty\r\n ? `${dirty} uncommitted change(s) and no PR URL after handoff attempt`\r\n : \"no PR URL after handoff attempt\";\r\n return {\r\n ok: false,\r\n reason: `PR-ready handoff blocked: ${detail}${pr.detail ? ` (${pr.detail})` : \"\"}`,\r\n nextAction:\r\n \"Run `gh pr create` on the worker branch (or fix `gh` auth), attach the PR URL to the task, then rerun `kynver worker complete`.\",\r\n };\r\n }\r\n\r\n return {\r\n ok: true,\r\n prUrl: pr.prUrl,\r\n headCommit: headCommit ?? undefined,\r\n committed,\r\n pushed,\r\n created: pr.created,\r\n };\r\n}\r\n", "import type { HarnessWorkerRecord } from \"./status.js\";\r\nimport { saveWorker } from \"./run-store.js\";\r\n\r\nexport type CompletionOutcome = \"acknowledged\" | \"skipped_already_acked\" | \"structural_blocker\";\r\n\r\nexport interface CompletionAckFields {\r\n completionReportedAt: string;\r\n completionOutcome: \"acknowledged\" | \"rejected\";\r\n completionResponse?: unknown;\r\n}\r\n\r\nexport function hasCompletionAck(worker: HarnessWorkerRecord): boolean {\r\n return Boolean(worker.completionReportedAt?.trim());\r\n}\r\n\r\nexport function persistCompletionAck(\r\n worker: HarnessWorkerRecord,\r\n runId: string,\r\n fields: CompletionAckFields,\r\n): void {\r\n worker.completionReportedAt = fields.completionReportedAt;\r\n worker.completionOutcome = fields.completionOutcome;\r\n if (fields.completionResponse !== undefined) {\r\n worker.completionResponse = fields.completionResponse;\r\n }\r\n saveWorker(runId, worker);\r\n}\r\n\r\nexport function clearCompletionAck(worker: HarnessWorkerRecord, runId: string): void {\r\n delete worker.completionReportedAt;\r\n delete worker.completionOutcome;\r\n delete worker.completionResponse;\r\n saveWorker(runId, worker);\r\n}\r\n", "import path from \"node:path\";\r\nimport { resolveBaseUrl, resolveCallbackSecretWithMint } from \"./config.js\";\r\nimport { postJsonWithCredentialRefresh } 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\nimport { publishHarnessBoardSnapshot } from \"./worker-ops.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 = `kynver-harness:${run.id}`;\r\n const snapshotPublished = await publishHarnessBoardSnapshot({ run: run.id, agentOsId, ...args }, \"run_sweep\");\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 || worker.completionReportedAt) 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 postJsonWithCredentialRefresh(releaseUrl, secret, { agentOsId, leaseOwner }, { agentOsId, baseUrl: base });\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 postJsonWithCredentialRefresh(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 }, { agentOsId, baseUrl: base });\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, snapshotPublished, 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 { reconcileStaleWorkers } from \"./stale-reconcile.js\";\r\nimport type { ReconcileStaleWorkersResult } from \"./stale-reconcile.js\";\r\nimport { observeRunnerResourceGate, type RunnerResourceGateShape } from \"./resource-gate.js\";\r\nimport { loadRun, runDirectory } from \"./run-store.js\";\r\nimport { assessExitedWorkerSalvage } from \"./exited-salvage.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 { renewActiveTaskLeases } from \"./lease-renewal.js\";\r\nimport { buildRunBoard, runStatus, tryCompleteWorker } from \"./worker-ops.js\";\r\nimport { hasCompletionAck } from \"./completion-ack.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\nimport { fetchWorkspaceRuntimePreferences } from \"./workspace-runtime-config.js\";\r\nimport { isPipelineCleanupEnabled, runPipelineHarnessCleanup } from \"./cleanup.js\";\r\nimport type { HarnessCleanupSummary } from \"./cleanup-types.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 leaseRenewal?: Awaited<ReturnType<typeof renewActiveTaskLeases>>;\r\n completedWorkers: Array<{ worker: string; ok: boolean; taskId?: string | null; skipped?: boolean }>;\r\n staleReconcile: ReconcileStaleWorkersResult;\r\n planProgressSync: Array<{ worker: string; phase: string; ok: boolean; skipped?: boolean }>;\r\n harnessCleanup?: HarnessCleanupSummary;\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; skipped?: boolean }>> {\r\n const run = loadRun(runId);\r\n const outcomes: Array<{ worker: string; ok: boolean; taskId?: string | null; 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?.taskId || worker.localOnly) continue;\r\n if (hasCompletionAck(worker)) {\r\n outcomes.push({ worker: name, ok: true, taskId: worker.taskId ?? null, skipped: true });\r\n continue;\r\n }\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 const exitedSalvage = assessExitedWorkerSalvage({\r\n alive: status.alive,\r\n finalResult: status.finalResult,\r\n changedFiles: status.changedFiles,\r\n gitAncestry: status.gitAncestry,\r\n });\r\n // Directly-started workers are normally left alone, but an exited worker with\r\n // salvageable work still needs completion ingested so the board can block +\r\n // propose a salvage review task.\r\n if (!worker.dispatched && !status.finalResult && !exitedSalvage?.salvageable) 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 harnessBoardSnapshot: buildRunBoard(runId),\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 const workspacePrefs = await fetchWorkspaceRuntimePreferences(agentOsId, args);\r\n const resourceGate = observeRunnerResourceGate({\r\n runId,\r\n configuredMaxWorkersOverride: workspacePrefs?.maxConcurrentWorkers,\r\n });\r\n\r\n // Heartbeat operator tick before slow completion replay so Command Center\r\n // `runtime.lastSnapshot` advances even when attention/finished workers block\r\n // the completion path for longer than the harness watchdog TTL.\r\n const operatorTick = await postOperatorTick(agentOsId, runId, resourceGate, args);\r\n\r\n const leaseRenewal = await renewActiveTaskLeases(runId, args);\r\n\r\n // Replay completion for finished workers 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 staleReconcile = reconcileStaleWorkers();\r\n const harnessCleanup = isPipelineCleanupEnabled() ? runPipelineHarnessCleanup(runId) : undefined;\r\n const planProgressSync = await syncActiveWorkerPlanProgress(runId, 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 leaseRenewal,\r\n completedWorkers,\r\n staleReconcile,\r\n harnessCleanup,\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 { finalizeStaleRuns, type RunFinalizeResult } from \"./finalize.js\";\r\nimport { listRunRecords, runDirectory, saveWorker } from \"./run-store.js\";\r\nimport { computeWorkerStatus, STALE_MS, type HarnessWorkerRecord } from \"./status.js\";\r\nimport { isPidAlive, killWorkerProcess, readJson, safeSlug } from \"./util.js\";\r\n\r\n/** No heartbeat this long + dead PID \u2192 reconcile as exited. */\r\nexport const STALE_RECONCILE_HEARTBEAT_MS = 15 * 60 * 1000;\r\n\r\nexport interface StaleWorkerReconcileOutcome {\r\n runId: string;\r\n worker: string;\r\n action: \"marked_exited\" | \"killed_stale\" | \"skipped\";\r\n reason: string;\r\n}\r\n\r\nexport interface ReconcileStaleWorkersResult {\r\n workers: StaleWorkerReconcileOutcome[];\r\n finalizedRuns: RunFinalizeResult[];\r\n}\r\n\r\nfunction staleReconcileDisabled(): boolean {\r\n return process.env.KYNVER_NO_STALE_CLEANUP === \"1\";\r\n}\r\n\r\n/**\r\n * Reconcile workers that exited without updating worker.json, and optionally\r\n * terminate long-idle live processes. Paused workers with recent heartbeat\r\n * blockers are left alone (heartbeat freshness gate).\r\n */\r\nexport function reconcileStaleWorkers(): ReconcileStaleWorkersResult {\r\n if (staleReconcileDisabled()) {\r\n return { workers: [], finalizedRuns: finalizeStaleRuns() };\r\n }\r\n\r\n const outcomes: StaleWorkerReconcileOutcome[] = [];\r\n const now = Date.now();\r\n\r\n for (const run of listRunRecords()) {\r\n for (const name of Object.keys(run.workers || {})) {\r\n const workerPath = path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\");\r\n const worker = readJson<HarnessWorkerRecord | undefined>(workerPath, undefined);\r\n if (!worker || worker.status !== \"running\") {\r\n outcomes.push({\r\n runId: run.id,\r\n worker: name,\r\n action: \"skipped\",\r\n reason: worker ? `worker status is ${worker.status}` : \"worker.json missing\",\r\n });\r\n continue;\r\n }\r\n\r\n const status = computeWorkerStatus(worker, { base: run.base, baseCommit: run.baseCommit });\r\n if (status.finalResult) {\r\n if (worker.status === \"running\") {\r\n const nextStatus =\r\n status.attention.state === \"blocked\"\r\n ? \"blocked\"\r\n : status.attention.state === \"done\" || status.status === \"done\"\r\n ? \"done\"\r\n : \"exited\";\r\n worker.status = nextStatus;\r\n worker.reconciledAt = new Date().toISOString();\r\n worker.reconcileReason = \"synced finished worker record after terminal stdout/heartbeat\";\r\n saveWorker(run.id, worker);\r\n outcomes.push({\r\n runId: run.id,\r\n worker: name,\r\n action: \"marked_exited\",\r\n reason: worker.reconcileReason,\r\n });\r\n } else {\r\n outcomes.push({ runId: run.id, worker: name, action: \"skipped\", reason: \"final result present\" });\r\n }\r\n continue;\r\n }\r\n\r\n if (!status.alive) {\r\n const nextStatus =\r\n status.attention.state === \"blocked\" ? \"blocked\" : status.status === \"done\" ? \"done\" : \"exited\";\r\n worker.status = nextStatus;\r\n worker.reconciledAt = new Date().toISOString();\r\n worker.reconcileReason = status.attention.reason;\r\n saveWorker(run.id, worker);\r\n outcomes.push({\r\n runId: run.id,\r\n worker: name,\r\n action: \"marked_exited\",\r\n reason: status.attention.reason,\r\n });\r\n continue;\r\n }\r\n\r\n // Live PID but no meaningful activity \u2014 only kill when heartbeat is also stale\r\n // (avoids killing a paused worker that recently reported a blocker).\r\n if (status.attention.state === \"stale\" && worker.pid && isPidAlive(worker.pid)) {\r\n const hbMs = status.lastHeartbeatAt ? Date.parse(status.lastHeartbeatAt) : NaN;\r\n const actMs = status.lastActivityAt ? Date.parse(status.lastActivityAt) : NaN;\r\n const hbStale =\r\n !Number.isFinite(hbMs) || now - hbMs > STALE_RECONCILE_HEARTBEAT_MS;\r\n const actStale = Number.isFinite(actMs) && now - actMs > STALE_MS;\r\n if (hbStale && actStale) {\r\n killWorkerProcess(worker.pid, \"SIGTERM\");\r\n worker.status = \"exited\";\r\n worker.reconciledAt = new Date().toISOString();\r\n worker.reconcileReason = `reconciled stale worker: ${status.attention.reason}`;\r\n saveWorker(run.id, worker);\r\n outcomes.push({\r\n runId: run.id,\r\n worker: name,\r\n action: \"killed_stale\",\r\n reason: status.attention.reason,\r\n });\r\n continue;\r\n }\r\n }\r\n\r\n outcomes.push({\r\n runId: run.id,\r\n worker: name,\r\n action: \"skipped\",\r\n reason: status.attention.reason,\r\n });\r\n }\r\n }\r\n\r\n return { workers: outcomes, finalizedRuns: finalizeStaleRuns() };\r\n}\r\n", "import path from \"node:path\";\r\nimport { listRunRecords, runDirectory, saveRun, type HarnessRunRecord } from \"./run-store.js\";\r\nimport { computeWorkerStatus, isLandingBlockedWorkerStatus } 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 let anyLandingBlocked = 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 base: run.base,\r\n baseCommit: run.baseCommit,\r\n });\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 (isLandingBlockedWorkerStatus(status)) {\r\n anyLandingBlocked = true;\r\n }\r\n if (status.finalResult && status.attention.state === \"done\") 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 if (anyLandingBlocked) return null; // dirty/unlanded work \u2014 keep run active for operator attention\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 { postJsonWithCredentialRefresh } 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 postJsonWithCredentialRefresh(url, secret, {\r\n phase: args.phase,\r\n taskId: args.taskId,\r\n blocker: args.blocker,\r\n artifact: args.artifact,\r\n }, { agentOsId: args.agentOsId, baseUrl: base });\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 path from \"node:path\";\r\nimport { getHarnessPaths, resolveHarnessRoot } from \"./paths.js\";\r\nimport {\r\n DEFAULT_NODE_MODULES_AGE_MS,\r\n type CleanupAction,\r\n type CleanupSkipReason,\r\n type HarnessCleanupOptions,\r\n type HarnessCleanupSummary,\r\n} from \"./cleanup-types.js\";\r\nimport { skipNodeModulesRemoval, skipWorktreeRemoval } from \"./cleanup-guards.js\";\r\nimport { removeNodeModules, removeWorktree, isHarnessNodeModulesPath } from \"./cleanup-execute.js\";\r\nimport { scanNodeModulesCandidates, scanWorktreeCandidates } from \"./cleanup-scan.js\";\r\nimport { buildWorktreeIndex } from \"./cleanup-worktree-index.js\";\r\n\r\nfunction resolveOptions(options: HarnessCleanupOptions = {}) {\r\n const harnessRoot = options.harnessRoot\r\n ? path.resolve(options.harnessRoot)\r\n : resolveHarnessRoot();\r\n const { worktreesDir } = options.harnessRoot\r\n ? { worktreesDir: path.join(harnessRoot, \"worktrees\") }\r\n : getHarnessPaths();\r\n const execute = options.execute === true;\r\n const nodeModulesAgeMs = options.nodeModulesAgeMs ?? DEFAULT_NODE_MODULES_AGE_MS;\r\n const worktreesAgeMs = options.worktreesAgeMs ?? 0;\r\n const includeOrphans = options.includeOrphans === true;\r\n const runIdFilter = options.runIdFilter ? String(options.runIdFilter) : undefined;\r\n const now = options.now ?? Date.now();\r\n return {\r\n harnessRoot,\r\n worktreesDir,\r\n execute,\r\n dryRun: !execute,\r\n nodeModulesAgeMs,\r\n worktreesAgeMs,\r\n includeOrphans,\r\n runIdFilter,\r\n now,\r\n };\r\n}\r\n\r\nfunction recordSkip(\r\n skips: HarnessCleanupSummary[\"skips\"],\r\n pathValue: string,\r\n reason: CleanupSkipReason,\r\n detail?: string,\r\n): void {\r\n skips.push({ path: pathValue, reason, ...(detail ? { detail } : {}) });\r\n}\r\n\r\nexport function runHarnessCleanup(options: HarnessCleanupOptions = {}): HarnessCleanupSummary {\r\n const resolved = resolveOptions(options);\r\n const index = buildWorktreeIndex();\r\n const scanOpts = {\r\n harnessRoot: resolved.harnessRoot,\r\n worktreesDir: resolved.worktreesDir,\r\n nodeModulesAgeMs: resolved.nodeModulesAgeMs,\r\n worktreesAgeMs: resolved.worktreesAgeMs,\r\n includeOrphans: resolved.includeOrphans,\r\n runIdFilter: resolved.runIdFilter,\r\n index,\r\n now: resolved.now,\r\n };\r\n const skips: HarnessCleanupSummary[\"skips\"] = [];\r\n const actions: CleanupAction[] = [];\r\n\r\n for (const candidate of scanNodeModulesCandidates(scanOpts)) {\r\n const pathSkip = isHarnessNodeModulesPath(candidate.path, resolved.harnessRoot, resolved.worktreesDir);\r\n if (pathSkip) {\r\n recordSkip(skips, candidate.path, pathSkip);\r\n actions.push({ ...candidate, executed: false, skipped: true, skipReason: pathSkip });\r\n continue;\r\n }\r\n const worktreePath = path.resolve(candidate.path, \"..\");\r\n const indexed = index.get(worktreePath) ?? null;\r\n const guardReason = skipNodeModulesRemoval({\r\n indexed,\r\n includeOrphans: resolved.includeOrphans,\r\n nodeModulesAgeMs: resolved.nodeModulesAgeMs,\r\n ageMs: candidate.ageMs,\r\n });\r\n if (guardReason) {\r\n recordSkip(skips, candidate.path, guardReason);\r\n actions.push({ ...candidate, executed: false, skipped: true, skipReason: guardReason });\r\n continue;\r\n }\r\n actions.push(removeNodeModules(candidate, resolved.execute));\r\n }\r\n\r\n for (const candidate of scanWorktreeCandidates(scanOpts)) {\r\n const indexed = index.get(path.resolve(candidate.path)) ?? null;\r\n const guardReason = skipWorktreeRemoval({\r\n indexed,\r\n includeOrphans: resolved.includeOrphans,\r\n worktreesAgeMs: resolved.worktreesAgeMs,\r\n ageMs: candidate.ageMs,\r\n });\r\n if (guardReason) {\r\n recordSkip(skips, candidate.path, guardReason);\r\n actions.push({ ...candidate, executed: false, skipped: true, skipReason: guardReason });\r\n continue;\r\n }\r\n actions.push(removeWorktree(candidate, resolved.execute));\r\n }\r\n\r\n let candidateBytes = 0;\r\n let removedBytes = 0;\r\n let removedPaths = 0;\r\n let skippedPaths = 0;\r\n for (const action of actions) {\r\n if (action.bytes) candidateBytes += action.bytes;\r\n if (action.executed) {\r\n removedPaths += 1;\r\n removedBytes += action.bytes ?? 0;\r\n } else if (action.skipped) {\r\n skippedPaths += 1;\r\n }\r\n }\r\n\r\n return {\r\n harnessRoot: resolved.harnessRoot,\r\n dryRun: resolved.dryRun,\r\n execute: resolved.execute,\r\n nodeModulesAgeMs: resolved.nodeModulesAgeMs,\r\n worktreesAgeMs: resolved.worktreesAgeMs,\r\n includeOrphans: resolved.includeOrphans,\r\n scannedAt: new Date(resolved.now).toISOString(),\r\n actions,\r\n skips,\r\n totals: {\r\n candidateBytes,\r\n removedBytes,\r\n removedPaths,\r\n skippedPaths,\r\n },\r\n };\r\n}\r\n\r\n/** Pipeline-safe defaults: node_modules only, dry-run unless execute env is set. */\r\nexport function runPipelineHarnessCleanup(runId?: string): HarnessCleanupSummary {\r\n const nodeModulesAgeMs = Number(process.env.KYNVER_CLEANUP_NODE_MODULES_AGE_MS) || DEFAULT_NODE_MODULES_AGE_MS;\r\n const worktreesAgeMs = Number(process.env.KYNVER_CLEANUP_WORKTREES_AGE_MS) || 0;\r\n const execute = process.env.KYNVER_CLEANUP_EXECUTE === \"1\";\r\n const includeOrphans = process.env.KYNVER_CLEANUP_INCLUDE_ORPHANS === \"1\";\r\n const scopeAll = process.env.KYNVER_CLEANUP_SCOPE === \"all\";\r\n return runHarnessCleanup({\r\n execute,\r\n nodeModulesAgeMs,\r\n worktreesAgeMs,\r\n includeOrphans,\r\n runIdFilter: scopeAll ? undefined : runId,\r\n });\r\n}\r\n\r\nexport function isPipelineCleanupEnabled(): boolean {\r\n return process.env.KYNVER_PIPELINE_CLEANUP !== \"0\";\r\n}\r\n", "export type CleanupActionKind = \"remove_node_modules\" | \"remove_worktree\";\r\n\r\nexport type CleanupSkipReason =\r\n | \"dry_run\"\r\n | \"below_age_threshold\"\r\n | \"active_worker\"\r\n | \"dirty_worktree\"\r\n | \"landing_blocked\"\r\n | \"pr_or_unmerged_commits\"\r\n | \"completion_blocked\"\r\n | \"run_still_active\"\r\n | \"path_outside_harness\"\r\n | \"worktrees_disabled\"\r\n | \"orphan_without_flag\"\r\n | \"missing_worktree\"\r\n | \"remove_failed\";\r\n\r\nexport interface CleanupCandidate {\r\n kind: CleanupActionKind;\r\n path: string;\r\n bytes: number | null;\r\n runId?: string;\r\n worker?: string;\r\n repo?: string;\r\n ageMs: number;\r\n}\r\n\r\nexport interface CleanupAction extends CleanupCandidate {\r\n executed: boolean;\r\n skipped: boolean;\r\n skipReason?: CleanupSkipReason;\r\n error?: string;\r\n}\r\n\r\nexport interface HarnessCleanupSummary {\r\n harnessRoot: string;\r\n dryRun: boolean;\r\n execute: boolean;\r\n nodeModulesAgeMs: number;\r\n worktreesAgeMs: number;\r\n includeOrphans: boolean;\r\n scannedAt: string;\r\n actions: CleanupAction[];\r\n skips: Array<{ path: string; reason: CleanupSkipReason; detail?: string }>;\r\n totals: {\r\n candidateBytes: number;\r\n removedBytes: number;\r\n removedPaths: number;\r\n skippedPaths: number;\r\n };\r\n}\r\n\r\nexport interface HarnessCleanupOptions {\r\n harnessRoot?: string;\r\n /** When false (default), only report candidates. */\r\n execute?: boolean;\r\n /** Minimum age before removing generated `node_modules` (default 6h). */\r\n nodeModulesAgeMs?: number;\r\n /** When 0 or unset, worktree removal is disabled. */\r\n worktreesAgeMs?: number;\r\n /** Allow cleaning `node_modules` under worktrees with no worker index entry. */\r\n includeOrphans?: boolean;\r\n /** When set, only consider workers for this harness run (pipeline tick scope). */\r\n runIdFilter?: string;\r\n now?: number;\r\n}\r\n\r\n/** Conservative default aligned with 2026-05-27 manual harness cleanup (6h). */\r\nexport const DEFAULT_NODE_MODULES_AGE_MS = 6 * 60 * 60 * 1000;\r\n\r\n/** Seven days \u2014 only used when worktree cleanup is explicitly enabled. */\r\nexport const DEFAULT_WORKTREES_AGE_MS = 7 * 24 * 60 * 60 * 1000;\r\n", "import type { CleanupSkipReason } from \"./cleanup-types.js\";\r\nimport { assessWorkerLanding } from \"./landing-gate.js\";\r\nimport type { IndexedWorktree } from \"./cleanup-worktree-index.js\";\r\nimport type { RawHarnessWorkerStatus } from \"./status.js\";\r\n\r\nconst ACTIVE_RUN_STATUSES = new Set([\"running\", \"dispatching\", \"pending\", \"queued\", \"needs_attention\"]);\r\n\r\nconst TERMINAL_RUN_STATUSES = new Set([\"completed\", \"failed\", \"cancelled\"]);\r\n\r\nfunction prUrlFromFinalResult(finalResult: unknown): string | null {\r\n if (typeof finalResult === \"string\") {\r\n const match = finalResult.match(/https:\\/\\/github\\.com\\/[^\\s]+\\/pull\\/\\d+/i);\r\n return match?.[0] ?? null;\r\n }\r\n if (finalResult && typeof finalResult === \"object\") {\r\n const obj = finalResult as Record<string, unknown>;\r\n for (const key of [\"prUrl\", \"pr_url\", \"pullRequestUrl\"]) {\r\n const value = obj[key];\r\n if (typeof value === \"string\" && value.trim()) return value.trim();\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nexport function isPrOrUnmergedWork(status: RawHarnessWorkerStatus): boolean {\r\n if (prUrlFromFinalResult(status.finalResult)) return true;\r\n const relation = status.gitAncestry?.relation;\r\n if (relation === \"ahead\" || relation === \"diverged\") return true;\r\n if (status.changedFiles.length > 0 && status.finalResult) return true;\r\n return false;\r\n}\r\n\r\nexport interface WorktreeGuardInput {\r\n indexed: IndexedWorktree | null;\r\n includeOrphans: boolean;\r\n worktreesAgeMs: number;\r\n ageMs: number;\r\n}\r\n\r\nexport function skipWorktreeRemoval(input: WorktreeGuardInput): CleanupSkipReason | null {\r\n const { indexed, includeOrphans, worktreesAgeMs, ageMs } = input;\r\n if (worktreesAgeMs <= 0) return \"worktrees_disabled\";\r\n if (ageMs < worktreesAgeMs) return \"below_age_threshold\";\r\n if (!indexed) return includeOrphans ? null : \"orphan_without_flag\";\r\n if (ACTIVE_RUN_STATUSES.has(indexed.run.status)) return \"run_still_active\";\r\n if (!TERMINAL_RUN_STATUSES.has(indexed.run.status)) return \"run_still_active\";\r\n if (indexed.status.alive) return \"active_worker\";\r\n if (indexed.worker.status === \"running\") return \"active_worker\";\r\n if (indexed.worker.completionBlocker) return \"completion_blocked\";\r\n if (isPrOrUnmergedWork(indexed.status)) return \"pr_or_unmerged_commits\";\r\n if (indexed.status.changedFiles.length > 0) return \"dirty_worktree\";\r\n const landing = assessWorkerLanding({\r\n finalResult: indexed.status.finalResult,\r\n changedFiles: indexed.status.changedFiles,\r\n gitAncestry: indexed.status.gitAncestry,\r\n prUrl: prUrlFromFinalResult(indexed.status.finalResult),\r\n });\r\n if (landing.blocked) return \"landing_blocked\";\r\n return null;\r\n}\r\n\r\nexport interface NodeModulesGuardInput {\r\n indexed: IndexedWorktree | null;\r\n includeOrphans: boolean;\r\n nodeModulesAgeMs: number;\r\n ageMs: number;\r\n}\r\n\r\nexport function skipNodeModulesRemoval(input: NodeModulesGuardInput): CleanupSkipReason | null {\r\n const { indexed, includeOrphans, nodeModulesAgeMs, ageMs } = input;\r\n if (ageMs < nodeModulesAgeMs) return \"below_age_threshold\";\r\n if (!indexed) return includeOrphans ? null : \"orphan_without_flag\";\r\n if (indexed.status.alive) return \"active_worker\";\r\n if (indexed.worker.status === \"running\") return \"active_worker\";\r\n if (indexed.worker.completionBlocker) return \"completion_blocked\";\r\n if (isPrOrUnmergedWork(indexed.status)) return \"pr_or_unmerged_commits\";\r\n if (indexed.status.changedFiles.length > 0) return \"dirty_worktree\";\r\n const landing = assessWorkerLanding({\r\n finalResult: indexed.status.finalResult,\r\n changedFiles: indexed.status.changedFiles,\r\n gitAncestry: indexed.status.gitAncestry,\r\n prUrl: prUrlFromFinalResult(indexed.status.finalResult),\r\n });\r\n if (landing.blocked) return \"landing_blocked\";\r\n return null;\r\n}\r\n", "import { existsSync, rmSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { git } from \"./git.js\";\r\nimport type { CleanupAction, CleanupCandidate, CleanupSkipReason } from \"./cleanup-types.js\";\r\nimport { directorySizeBytes } from \"./cleanup-dir-size.js\";\r\n\r\nexport function removeNodeModules(candidate: CleanupCandidate, execute: boolean): CleanupAction {\r\n if (!existsSync(candidate.path)) {\r\n return {\r\n ...candidate,\r\n executed: false,\r\n skipped: true,\r\n skipReason: \"missing_worktree\",\r\n };\r\n }\r\n if (!execute) {\r\n return { ...candidate, executed: false, skipped: true, skipReason: \"dry_run\" };\r\n }\r\n try {\r\n const bytesBefore = candidate.bytes ?? directorySizeBytes(candidate.path);\r\n rmSync(candidate.path, { recursive: true, force: true });\r\n return {\r\n ...candidate,\r\n bytes: bytesBefore,\r\n executed: true,\r\n skipped: false,\r\n };\r\n } catch (error) {\r\n return {\r\n ...candidate,\r\n executed: false,\r\n skipped: true,\r\n skipReason: \"remove_failed\",\r\n error: (error as Error).message,\r\n };\r\n }\r\n}\r\n\r\nexport function removeWorktree(candidate: CleanupCandidate, execute: boolean): CleanupAction {\r\n if (!existsSync(candidate.path)) {\r\n return {\r\n ...candidate,\r\n executed: false,\r\n skipped: true,\r\n skipReason: \"missing_worktree\",\r\n };\r\n }\r\n if (!execute) {\r\n return { ...candidate, executed: false, skipped: true, skipReason: \"dry_run\" };\r\n }\r\n const repo = candidate.repo;\r\n try {\r\n const bytesBefore = candidate.bytes ?? directorySizeBytes(candidate.path);\r\n if (repo) {\r\n git(repo, [\"worktree\", \"remove\", \"--force\", candidate.path], { allowFailure: true });\r\n }\r\n if (existsSync(candidate.path)) {\r\n rmSync(candidate.path, { recursive: true, force: true });\r\n }\r\n return {\r\n ...candidate,\r\n bytes: bytesBefore,\r\n executed: true,\r\n skipped: false,\r\n };\r\n } catch (error) {\r\n return {\r\n ...candidate,\r\n executed: false,\r\n skipped: true,\r\n skipReason: \"remove_failed\",\r\n error: (error as Error).message,\r\n };\r\n }\r\n}\r\n\r\nexport function isHarnessNodeModulesPath(\r\n targetPath: string,\r\n harnessRoot: string,\r\n worktreesDir: string,\r\n): CleanupSkipReason | null {\r\n const resolved = path.resolve(targetPath);\r\n const nm = resolved.endsWith(`${path.sep}node_modules`) ? resolved : null;\r\n if (!nm) return \"path_outside_harness\";\r\n const rel = path.relative(worktreesDir, nm);\r\n if (rel.startsWith(\"..\") || path.isAbsolute(rel)) return \"path_outside_harness\";\r\n const parts = rel.split(path.sep);\r\n if (parts.length < 3 || parts[parts.length - 1] !== \"node_modules\") return \"path_outside_harness\";\r\n if (!resolved.startsWith(path.resolve(harnessRoot))) return \"path_outside_harness\";\r\n return null;\r\n}\r\n", "import { existsSync, readdirSync, statSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\n\r\n/**\r\n * Best-effort directory size. Returns null when entry cap is exceeded (huge trees).\r\n */\r\nexport function directorySizeBytes(root: string, maxEntries = 50_000): number | null {\r\n if (!existsSync(root)) return 0;\r\n let total = 0;\r\n let seen = 0;\r\n const stack: string[] = [root];\r\n while (stack.length > 0) {\r\n const current = stack.pop()!;\r\n let entries: string[];\r\n try {\r\n entries = readdirSync(current);\r\n } catch {\r\n continue;\r\n }\r\n for (const name of entries) {\r\n if (seen++ > maxEntries) return null;\r\n const full = path.join(current, name);\r\n let st;\r\n try {\r\n st = statSync(full);\r\n } catch {\r\n continue;\r\n }\r\n if (st.isDirectory()) stack.push(full);\r\n else total += st.size;\r\n }\r\n }\r\n return total;\r\n}\r\n", "import { existsSync, readdirSync, statSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport type { CleanupCandidate } from \"./cleanup-types.js\";\r\nimport { buildWorktreeIndex, type IndexedWorktree } from \"./cleanup-worktree-index.js\";\r\n\r\nexport interface ScanHarnessOptions {\r\n harnessRoot: string;\r\n worktreesDir: string;\r\n nodeModulesAgeMs: number;\r\n worktreesAgeMs: number;\r\n includeOrphans: boolean;\r\n runIdFilter?: string;\r\n index: Map<string, IndexedWorktree>;\r\n now: number;\r\n}\r\n\r\nfunction pathAgeMs(target: string, now: number): number {\r\n try {\r\n const mtime = statSync(target).mtimeMs;\r\n return Math.max(0, now - mtime);\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\nfunction isPathInside(child: string, parent: string): boolean {\r\n const rel = path.relative(parent, child);\r\n return rel === \"\" || (!rel.startsWith(\"..\") && !path.isAbsolute(rel));\r\n}\r\n\r\nexport function scanNodeModulesCandidates(opts: ScanHarnessOptions): CleanupCandidate[] {\r\n const candidates: CleanupCandidate[] = [];\r\n const seen = new Set<string>();\r\n\r\n for (const entry of opts.index.values()) {\r\n if (opts.runIdFilter && entry.runId !== opts.runIdFilter) continue;\r\n const nm = path.join(entry.worktreePath, \"node_modules\");\r\n if (!existsSync(nm)) continue;\r\n const resolved = path.resolve(nm);\r\n if (seen.has(resolved)) continue;\r\n seen.add(resolved);\r\n candidates.push({\r\n kind: \"remove_node_modules\",\r\n path: resolved,\r\n bytes: null,\r\n runId: entry.runId,\r\n worker: entry.workerName,\r\n repo: entry.run.repo,\r\n ageMs: pathAgeMs(resolved, opts.now),\r\n });\r\n }\r\n\r\n if (!opts.includeOrphans || !existsSync(opts.worktreesDir)) return candidates;\r\n\r\n for (const runEntry of readdirSync(opts.worktreesDir, { withFileTypes: true })) {\r\n if (!runEntry.isDirectory()) continue;\r\n const runPath = path.join(opts.worktreesDir, runEntry.name);\r\n for (const workerEntry of readdirSync(runPath, { withFileTypes: true })) {\r\n if (!workerEntry.isDirectory()) continue;\r\n const worktreePath = path.join(runPath, workerEntry.name);\r\n const nm = path.join(worktreePath, \"node_modules\");\r\n if (!existsSync(nm)) continue;\r\n const resolved = path.resolve(nm);\r\n if (seen.has(resolved)) continue;\r\n if (!isPathInside(resolved, opts.harnessRoot)) continue;\r\n seen.add(resolved);\r\n candidates.push({\r\n kind: \"remove_node_modules\",\r\n path: resolved,\r\n bytes: null,\r\n runId: runEntry.name,\r\n worker: workerEntry.name,\r\n ageMs: pathAgeMs(resolved, opts.now),\r\n });\r\n }\r\n }\r\n\r\n return candidates;\r\n}\r\n\r\nexport function scanWorktreeCandidates(opts: ScanHarnessOptions): CleanupCandidate[] {\r\n if (opts.worktreesAgeMs <= 0) return [];\r\n const candidates: CleanupCandidate[] = [];\r\n const seen = new Set<string>();\r\n\r\n for (const entry of opts.index.values()) {\r\n if (opts.runIdFilter && entry.runId !== opts.runIdFilter) continue;\r\n const resolved = entry.worktreePath;\r\n if (!existsSync(resolved)) continue;\r\n if (seen.has(resolved)) continue;\r\n seen.add(resolved);\r\n candidates.push({\r\n kind: \"remove_worktree\",\r\n path: resolved,\r\n bytes: null,\r\n runId: entry.runId,\r\n worker: entry.workerName,\r\n repo: entry.run.repo,\r\n ageMs: pathAgeMs(resolved, opts.now),\r\n });\r\n }\r\n\r\n return candidates;\r\n}\r\n", "import path from \"node:path\";\r\nimport { listRunRecords, loadWorker, runDirectory, type HarnessRunRecord } from \"./run-store.js\";\r\nimport { computeWorkerStatus, type HarnessWorkerRecord, type RawHarnessWorkerStatus } from \"./status.js\";\r\nimport { readJson, safeSlug } from \"./util.js\";\r\n\r\nexport interface IndexedWorktree {\r\n worktreePath: string;\r\n runId: string;\r\n workerName: string;\r\n run: HarnessRunRecord;\r\n worker: HarnessWorkerRecord;\r\n status: RawHarnessWorkerStatus;\r\n}\r\n\r\nexport function buildWorktreeIndex(): Map<string, IndexedWorktree> {\r\n const index = new Map<string, IndexedWorktree>();\r\n for (const run of listRunRecords()) {\r\n for (const name of Object.keys(run.workers || {})) {\r\n const workerPath = path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\");\r\n const worker = readJson<HarnessWorkerRecord | undefined>(workerPath, undefined);\r\n if (!worker?.worktreePath) continue;\r\n const status = computeWorkerStatus(worker, { base: run.base, baseCommit: run.baseCommit });\r\n index.set(path.resolve(worker.worktreePath), {\r\n worktreePath: path.resolve(worker.worktreePath),\r\n runId: run.id,\r\n workerName: name,\r\n run,\r\n worker,\r\n status,\r\n });\r\n }\r\n }\r\n return index;\r\n}\r\n\r\n/** Load worker when index miss but path is known from disk layout. */\r\nexport function loadIndexedWorker(runId: string, workerName: string): HarnessWorkerRecord | null {\r\n try {\r\n return loadWorker(runId, workerName);\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", "import { runHarnessCleanup } from \"./cleanup.js\";\r\nimport { DEFAULT_NODE_MODULES_AGE_MS } from \"./cleanup-types.js\";\r\n\r\nexport function runCleanupCli(args: Record<string, string | boolean>): void {\r\n const execute = args.execute === true || args.execute === \"true\";\r\n const nodeModulesAgeMs = args.nodeModulesAgeMs\r\n ? Number(args.nodeModulesAgeMs)\r\n : DEFAULT_NODE_MODULES_AGE_MS;\r\n const worktreesAgeMs = args.worktreesAgeMs ? Number(args.worktreesAgeMs) : 0;\r\n const includeOrphans = args.includeOrphans === true || args.includeOrphans === \"true\";\r\n const harnessRoot = args.harnessRoot ? String(args.harnessRoot) : undefined;\r\n\r\n const summary = runHarnessCleanup({\r\n execute,\r\n nodeModulesAgeMs: Number.isFinite(nodeModulesAgeMs) ? nodeModulesAgeMs : DEFAULT_NODE_MODULES_AGE_MS,\r\n worktreesAgeMs: Number.isFinite(worktreesAgeMs) ? worktreesAgeMs : 0,\r\n includeOrphans,\r\n harnessRoot,\r\n });\r\n\r\n console.log(JSON.stringify(summary, null, 2));\r\n\r\n if (execute && summary.totals.removedPaths === 0 && summary.actions.length === 0) {\r\n process.exitCode = 0;\r\n }\r\n}\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", "path", "readFileSync", "path", "existsSync", "readdirSync", "path", "existsSync", "homedir", "path", "path", "homedir", "existsSync", "path", "existsSync", "readdirSync", "existsSync", "readFileSync", "existsSync", "readFileSync", "existsSync", "readFileSync", "existsSync", "readFileSync", "oneLine", "trimOrNull", "hasFinalResult", "tail", "readFileSync", "path", "taskString", "model", "positiveInt", "path", "path", "existsSync", "mkdirSync", "path", "closeSync", "existsSync", "openSync", "spawn", "path", "existsSync", "readdirSync", "path", "existsSync", "path", "openSync", "spawn", "closeSync", "spawn", "existsSync", "openSync", "closeSync", "path", "path", "trimOrNull", "spawnSync", "spawnSync", "path", "path", "existsSync", "openSync", "spawn", "closeSync", "path", "mkdirSync", "existsSync", "path", "summary", "path", "path", "existsSync", "mkdirSync", "path", "path", "path", "existsSync", "mkdirSync", "path", "path", "path", "path", "path", "path", "path", "path", "path", "ACTIVE_RUN_STATUSES", "existsSync", "path", "existsSync", "readdirSync", "statSync", "path", "existsSync", "path", "existsSync", "readdirSync", "statSync", "path", "path", "path", "path", "path", "mkdirSync", "fileURLToPath"]
|
|
3
|
+
"sources": ["../src/cli.ts", "../src/config.ts", "../src/util.ts", "../src/dispatch.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/exit-classify.ts", "../src/exited-salvage.ts", "../src/git.ts", "../src/landing-gate.ts", "../src/landing-contract-gate.ts", "../src/status.ts", "../src/model-routing-task-enrich.ts", "../src/providers/claude.ts", "../src/providers/model-preflight.ts", "../src/model-routing.ts", "../src/retry-limits.ts", "../src/lease-renewal.ts", "../src/supervisor.ts", "../src/prompt.ts", "../src/providers/cursor.ts", "../src/providers/cursor-windows.ts", "../src/providers/registry.ts", "../src/auto-complete.ts", "../src/worker-ops.ts", "../src/pr-handoff/pr-handoff-assess.ts", "../src/pr-handoff/pr-handoff-gh.ts", "../src/pr-handoff/pr-handoff.ts", "../src/completion-ack.ts", "../src/worker-lifecycle.ts", "../src/plan-persist/body-hash.ts", "../src/plan-persist/errors.ts", "../src/plan-persist/agentos-api.ts", "../src/plan-persist/idempotency.ts", "../src/plan-persist/paths.ts", "../src/plan-persist/outbox-store.ts", "../src/plan-persist/readback.ts", "../src/plan-persist/persist.ts", "../src/plan-persist/drain.ts", "../src/plan-persist/handoff.ts", "../src/sweep.ts", "../src/worktree.ts", "../src/validate.ts", "../src/pipeline-tick.ts", "../src/pipeline-dispatch.ts", "../src/stale-reconcile.ts", "../src/finalize.ts", "../src/plan-progress-daemon-sync.ts", "../src/plan-progress-sync.ts", "../src/workspace-runtime-config.ts", "../src/cleanup.ts", "../src/cleanup-types.ts", "../src/cleanup-guards.ts", "../src/cleanup-execute.ts", "../src/cleanup-dir-size.ts", "../src/cleanup-scan.ts", "../src/cleanup-worktree-index.ts", "../src/daemon.ts", "../src/plan-progress.ts", "../src/plan-persist-cli.ts", "../src/cleanup-cli.ts", "../src/monitor/monitor.service.ts", "../src/monitor/monitor.classify.ts", "../src/monitor/monitor.store.ts", "../src/monitor/monitor.terminal.ts", "../src/monitor/monitor.task-lease.ts", "../src/monitor/monitor-loop.ts", "../src/monitor/monitor-spawn.ts", "../src/monitor/monitor-cli.ts", "../src/package-version.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\nimport {\r\n runPlanOutboxDrain,\r\n runPlanOutboxList,\r\n runPlanPersist,\r\n} from \"./plan-persist-cli.js\";\r\nimport { runCleanupCli } from \"./cleanup-cli.js\";\r\nimport {\r\n monitorAutoCompleteCli,\r\n monitorListCli,\r\n monitorRunLoopCli,\r\n monitorStatusCli,\r\n monitorStopCli,\r\n monitorTickCli,\r\n startMonitorCli,\r\n} from \"./monitor/monitor-cli.js\";\r\nimport { handleCliVersionFlag } from \"./package-version.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] [--executor harness] [--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] [--wait]\",\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 \" kynver plan persist --operation create|add_version|update_metadata --title TITLE (--body-file PATH | --body TEXT) [--slug SLUG] [--plan PLAN_ID] [--summary TEXT] [--failure-kind approval_guard|auth|network|server|tool_interruption]\",\r\n \" kynver plan outbox list\",\r\n \" kynver plan outbox drain [--max N] [--id OUTBOX_ID]\",\r\n \" kynver cleanup [--execute] [--node-modules-age-ms MS] [--worktrees-age-ms MS] [--harness-root PATH] [--include-orphans]\",\r\n \" kynver monitor start --run RUN_ID [--name worker] [--agent-os-id AOS_ID] [--poll-ms MS]\",\r\n \" kynver monitor status [--run RUN_ID] [--name worker] [--tick]\",\r\n \" kynver monitor stop --run RUN_ID [--name worker]\",\r\n \" kynver monitor list\",\r\n \" kynver monitor tick --run RUN_ID [--name worker] [--agent-os-id AOS_ID] [--auto-complete] [--renew-leases]\",\r\n \" kynver monitor auto-complete --run RUN_ID --name worker [--agent-os-id AOS_ID] [--base-url URL] [--secret SECRET]\",\r\n \" kynver monitor run-loop --run RUN_ID --monitor-id ID [--name worker] [--agent-os-id AOS_ID] [--poll-ms MS] [--auto-complete] [--renew-leases]\",\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 (handleCliVersionFlag(argv, import.meta.url, \"kynver\")) return;\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 (\r\n scope === \"run\" ||\r\n scope === \"worker\" ||\r\n scope === \"plan\" ||\r\n scope === \"runner\" ||\r\n scope === \"monitor\"\r\n ) {\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 if (scope === \"plan\" && action === \"persist\") return void (await runPlanPersist(args));\r\n if (scope === \"plan\" && action === \"outbox\") {\r\n const outboxAction = rest.shift();\r\n if (outboxAction === \"list\") return void (await runPlanOutboxList());\r\n if (outboxAction === \"drain\") return void (await runPlanOutboxDrain(parseArgs(rest)));\r\n unknownCommand(\"plan\", `outbox ${outboxAction ?? \"\"}`.trim());\r\n }\r\n if (scope === \"cleanup\") return runCleanupCli(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 void (await 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 if (scope === \"monitor\" && action === \"start\") {\r\n const result = await startMonitorCli(args);\r\n console.log(JSON.stringify(result, null, 2));\r\n return;\r\n }\r\n if (scope === \"monitor\" && action === \"status\") return void (await monitorStatusCli(args));\r\n if (scope === \"monitor\" && action === \"stop\") return monitorStopCli(args);\r\n if (scope === \"monitor\" && action === \"list\") return monitorListCli();\r\n if (scope === \"monitor\" && action === \"tick\") return void (await monitorTickCli(args));\r\n if (scope === \"monitor\" && action === \"auto-complete\") return void (await monitorAutoCompleteCli(args));\r\n if (scope === \"monitor\" && action === \"run-loop\") return void (await monitorRunLoopCli(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 /** Default Claude model when dispatch does not infer or pass `--model`. */\r\n defaultModel?: 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 (agentOsId ? undefined : 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 refreshRunnerTokenForAuthFailure(\r\n rejectedSecret: string,\r\n agentOsId: string,\r\n opts?: { baseUrl?: string },\r\n): Promise<{ ok: true; token: string } | { ok: false; reason: string }> {\r\n const apiKey = loadApiKey();\r\n const baseUrl = resolveConfiguredBaseUrl(opts?.baseUrl);\r\n if (!apiKey) return { ok: false, reason: \"KYNVER_API_KEY is required to refresh a rejected runner token\" };\r\n if (!agentOsId) return { ok: false, reason: \"agentOsId is required to refresh a rejected runner token\" };\r\n if (!baseUrl) return { ok: false, reason: \"KYNVER_API_URL or --base-url is required to refresh a rejected runner token\" };\r\n\r\n try {\r\n const token = await fetchRunnerCredential(agentOsId, { baseUrl, apiKey });\r\n if (token && token !== rejectedSecret) {\r\n saveRunnerToken(agentOsId, token);\r\n return { ok: true, token };\r\n }\r\n return { ok: false, reason: \"runner credential refresh returned the rejected token\" };\r\n } catch (error) {\r\n return { ok: false, reason: (error as Error).message };\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\n/** Avoid flashing a visible console on Windows when spawning worker/sidecar children. */\r\nexport function hiddenSpawnOptions<T extends Record<string, unknown>>(opts: T): T {\r\n if (process.platform !== \"win32\") return opts;\r\n return { windowsHide: true, ...opts };\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", "import path from \"node:path\";\r\nimport { resolveBaseUrl, resolveCallbackSecretWithMint } from \"./config.js\";\r\nimport { postJsonWithCredentialRefresh } 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 { enrichTaskForModelRouting } from \"./model-routing-task-enrich.js\";\r\nimport { resolveWorkerLaunch } from \"./model-routing.js\";\r\nimport { readHarnessRetryLimits } from \"./retry-limits.js\";\r\nimport { hasLiveWorkerForTask } from \"./lease-renewal.js\";\r\nimport { spawnWorkerProcess } from \"./supervisor.js\";\r\nimport { buildRunBoard } from \"./worker-ops.js\";\r\nimport { isPidAlive, required, safeSlug } from \"./util.js\";\r\nimport { readJson } from \"./util.js\";\r\nimport {\r\n extractPlanOutboxFromTask,\r\n formatPlanOutboxHandoffBlock,\r\n loadOutboxById,\r\n} from \"./plan-persist/index.js\";\r\nimport type {\r\n HarnessWorkerRecord,\r\n InstructionPolicyEvidenceSnapshot,\r\n PersonaContextEvidenceSnapshot,\r\n} from \"./status.js\";\r\n\r\nexport const DEFAULT_DISPATCH_LEASE_MS = 60 * 60 * 1000;\r\n\r\nexport interface HarnessWorkerDispatchContext {\r\n instructionPolicyMarkdown: string | null;\r\n instructionPolicyFingerprint: string | null;\r\n instructionPolicyEvidence: InstructionPolicyEvidenceSnapshot | null;\r\n personaMarkdown: string | null;\r\n personaSlug: string | null;\r\n personaEvidence: PersonaContextEvidenceSnapshot | null;\r\n personaInjectionReady: boolean;\r\n}\r\n\r\nexport function readHarnessWorkerContext(\r\n decision: Record<string, unknown>,\r\n): HarnessWorkerDispatchContext | null {\r\n const raw = decision.harnessWorkerContext;\r\n if (!raw || typeof raw !== \"object\") return null;\r\n const ctx = raw as Record<string, unknown>;\r\n const markdown =\r\n typeof ctx.instructionPolicyMarkdown === \"string\" ? ctx.instructionPolicyMarkdown : null;\r\n const fingerprint =\r\n typeof ctx.instructionPolicyFingerprint === \"string\"\r\n ? ctx.instructionPolicyFingerprint\r\n : null;\r\n const evidence =\r\n ctx.instructionPolicyEvidence && typeof ctx.instructionPolicyEvidence === \"object\"\r\n ? (ctx.instructionPolicyEvidence as InstructionPolicyEvidenceSnapshot)\r\n : null;\r\n const personaMarkdown =\r\n typeof ctx.personaMarkdown === \"string\" ? ctx.personaMarkdown : null;\r\n const personaSlug =\r\n typeof ctx.personaEvidence === \"object\" &&\r\n ctx.personaEvidence &&\r\n typeof (ctx.personaEvidence as PersonaContextEvidenceSnapshot).injectedPersonaSlug === \"string\"\r\n ? (ctx.personaEvidence as PersonaContextEvidenceSnapshot).injectedPersonaSlug!\r\n : null;\r\n const personaEvidence =\r\n ctx.personaEvidence && typeof ctx.personaEvidence === \"object\"\r\n ? (ctx.personaEvidence as PersonaContextEvidenceSnapshot)\r\n : null;\r\n const personaInjectionReady = ctx.personaInjectionReady === true;\r\n return {\r\n instructionPolicyMarkdown: markdown,\r\n instructionPolicyFingerprint: fingerprint,\r\n instructionPolicyEvidence: evidence,\r\n personaMarkdown,\r\n personaSlug,\r\n personaEvidence,\r\n personaInjectionReady,\r\n };\r\n}\r\n\r\nfunction normalizePersonaSlug(value: unknown): string | null {\r\n if (typeof value !== \"string\") return null;\r\n const trimmed = value.trim().toLowerCase();\r\n return trimmed.length ? trimmed : null;\r\n}\r\n\r\nexport function buildDispatchTaskText(task: Record<string, unknown>, agentOsId: string): string {\r\n const lines = [\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 ];\r\n\r\n const outboxRef = extractPlanOutboxFromTask(task);\r\n if (outboxRef?.outboxId) {\r\n const item = loadOutboxById(outboxRef.outboxId);\r\n if (item) {\r\n lines.push(\"\", formatPlanOutboxHandoffBlock(item));\r\n } else {\r\n lines.push(\r\n \"\",\r\n `## Plan persistence risk`,\r\n \"\",\r\n `Unconfirmed AgentOS plan write (outboxId=${outboxRef.outboxId}).`,\r\n );\r\n }\r\n }\r\n\r\n return lines.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 = `kynver-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 activeHarnessWorkers: Array<{\r\n runId: string;\r\n workerName: string;\r\n taskId: string;\r\n pid?: number;\r\n }> = [];\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 || !isPidAlive(worker.pid)) continue;\r\n activeHarnessWorkers.push({\r\n runId: run.id,\r\n workerName: name,\r\n taskId: worker.taskId,\r\n pid: worker.pid,\r\n });\r\n }\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 activeHarnessWorkers,\r\n harnessBoardSnapshot: buildRunBoard(run.id),\r\n ...(args.lane ? { lane: String(args.lane) } : {}),\r\n executor: args.executor ? String(args.executor) : \"harness\",\r\n ...(args.diskPath ? { diskPath: String(args.diskPath) } : {}),\r\n };\r\n\r\n const dispatch = await postJsonWithCredentialRefresh(dispatchUrl, secret, body, { agentOsId, baseUrl: base });\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 authRefreshed: dispatch.refreshedAuth === true,\r\n authRefreshFailure: dispatch.authRefreshFailure,\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 retryLimits = readHarnessRetryLimits();\r\n const outcomes: Array<Record<string, unknown>> = [];\r\n for (const decision of result.started as Array<Record<string, unknown>>) {\r\n const task = decision.task as Record<string, unknown>;\r\n const harnessContext = readHarnessWorkerContext(decision);\r\n const taskId = String(task.id);\r\n const expectedPersona = normalizePersonaSlug(task.personaSlug);\r\n if (expectedPersona && (!harnessContext?.personaInjectionReady || !harnessContext.personaMarkdown)) {\r\n outcomes.push({\r\n taskId,\r\n started: false,\r\n error: `persona_injection_required: missing anchored context-envelope persona block for \"${expectedPersona}\"`,\r\n });\r\n continue;\r\n }\r\n if (hasLiveWorkerForTask(run.id, taskId)) {\r\n outcomes.push({\r\n taskId,\r\n started: false,\r\n error: \"duplicate_dispatch_prevented: live local worker already owns this task\",\r\n });\r\n continue;\r\n }\r\n const attempt = Number(task.attempt) || 1;\r\n if (attempt > retryLimits.maxTaskAttempts) {\r\n outcomes.push({\r\n taskId: task.id,\r\n started: false,\r\n error: `task attempt ${attempt} exceeds KYNVER_MAX_TASK_ATTEMPTS (${retryLimits.maxTaskAttempts})`,\r\n });\r\n continue;\r\n }\r\n const name = safeSlug(`t-${task.id}-a${task.attempt}`);\r\n const routing = resolveWorkerLaunch({\r\n explicitModel: args.model ? String(args.model) : undefined,\r\n task: enrichTaskForModelRouting(task),\r\n });\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: routing.model,\r\n provider: routing.provider,\r\n routingRule: routing.rule,\r\n requestedModel: routing.requestedModel,\r\n agentOsId,\r\n taskId: String(task.id),\r\n planId,\r\n instructionPolicyMarkdown: harnessContext?.instructionPolicyMarkdown ?? null,\r\n instructionPolicyFingerprint: harnessContext?.instructionPolicyFingerprint ?? null,\r\n instructionPolicyEvidence: harnessContext?.instructionPolicyEvidence ?? null,\r\n personaMarkdown: harnessContext?.personaMarkdown ?? null,\r\n personaSlug: harnessContext?.personaSlug ?? expectedPersona,\r\n personaEvidence: harnessContext?.personaEvidence ?? null,\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 model: worker.model,\r\n provider: routing.provider,\r\n routingRule: routing.rule,\r\n instructionPolicyFingerprint: harnessContext?.instructionPolicyFingerprint ?? null,\r\n instructionPolicyRuleCount: Array.isArray(harnessContext?.instructionPolicyEvidence?.ruleSlugs)\r\n ? (harnessContext.instructionPolicyEvidence.ruleSlugs as string[]).length\r\n : null,\r\n personaSlug: harnessContext?.personaSlug ?? expectedPersona,\r\n personaOperatingRuleCount: harnessContext?.personaEvidence?.operatingRuleCount ?? null,\r\n });\r\n if (harnessContext?.instructionPolicyFingerprint) {\r\n console.error(\r\n `[dispatch] task ${taskId}: Lane A instruction policy injected fingerprint=${harnessContext.instructionPolicyFingerprint}`,\r\n );\r\n }\r\n if (harnessContext?.personaSlug) {\r\n console.error(\r\n `[dispatch] task ${taskId}: persona context injected slug=${harnessContext.personaSlug}`,\r\n );\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 postJsonWithCredentialRefresh(releaseUrl, secret, { agentOsId, leaseOwner }, { agentOsId, baseUrl: base });\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", "/** 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\nimport { refreshRunnerTokenForAuthFailure } from \"./config.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 refreshedAuth?: boolean;\r\n authRefreshFailure?: string;\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 postJsonWithCredentialRefresh(\r\n url: string,\r\n secret: string,\r\n body: unknown,\r\n opts: { agentOsId: string; baseUrl?: string },\r\n): Promise<PostJsonResult> {\r\n const first = await postJson(url, secret, body);\r\n if (first.ok || first.status !== 401) return first;\r\n\r\n const refreshed = await refreshRunnerTokenForAuthFailure(secret, opts.agentOsId, { baseUrl: opts.baseUrl });\r\n if (!refreshed.ok) return { ...first, authRefreshFailure: refreshed.reason };\r\n\r\n const retry = await postJson(url, refreshed.token, body);\r\n return { ...retry, refreshedAuth: true };\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\nfunction isActiveHarnessWorker(worker: HarnessWorkerRecord): boolean {\r\n const status = computeWorkerStatus(worker);\r\n return status.alive && !status.finalResult && status.attention.state !== \"done\";\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 || !isActiveHarnessWorker(worker)) continue;\r\n active++;\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 let 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 timestampAnomalies: ParsedHeartbeatTimestampAnomaly[];\r\n}\r\n\r\nexport interface ParsedHeartbeatTimestampAnomaly {\r\n kind: \"future_heartbeat_timestamp\";\r\n observedAt: string;\r\n clampedTo: string;\r\n}\r\n\r\nconst HEARTBEAT_FUTURE_SKEW_MS = 60_000;\r\n\r\n/** Worker contract: append `phase: \"complete\"` when productively finished. */\r\nexport function isTerminalHeartbeatPhase(phase: string | null | undefined): boolean {\r\n return phase === \"complete\";\r\n}\r\n\r\n/**\r\n * When stdout has no stream-json `result` yet (common for Cursor workers mid-exit),\r\n * treat the worker's completion heartbeat as a synthetic final result so lifecycle\r\n * sync, completion replay, and resource gates advance.\r\n */\r\nexport function terminalFinalResultFromHeartbeat(heartbeat: ParsedHeartbeat): string | null {\r\n if (!isTerminalHeartbeatPhase(heartbeat.lastHeartbeatPhase)) return null;\r\n const summary = heartbeat.lastHeartbeatSummary?.trim();\r\n return summary || \"completed\";\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 timestampAnomalies: [],\r\n };\r\n if (!existsSync(file)) return result;\r\n const maxFutureMs = Date.now() + HEARTBEAT_FUTURE_SKEW_MS;\r\n const clampedTo = new Date(maxFutureMs).toISOString();\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) {\r\n const ts = String(row.ts);\r\n const tsMs = Date.parse(ts);\r\n if (Number.isFinite(tsMs) && tsMs > maxFutureMs) {\r\n result.timestampAnomalies.push({\r\n kind: \"future_heartbeat_timestamp\",\r\n observedAt: ts,\r\n clampedTo,\r\n });\r\n } else {\r\n result.lastHeartbeatAt = ts;\r\n }\r\n }\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\nfunction eventTimestampIso(event: Record<string, unknown>): string | undefined {\r\n const tsMs = event.timestamp_ms as number | undefined;\r\n return (event.timestamp || event.ts || (tsMs ? new Date(tsMs).toISOString() : undefined)) as\r\n | string\r\n | undefined;\r\n}\r\n\r\n/** Cursor `stream-json` encodes tools as `{ grepToolCall: \u2026 }` keys on `tool_call`. */\r\nfunction cursorToolNameFromCall(toolCall: Record<string, unknown> | undefined): string | null {\r\n if (!toolCall) return null;\r\n for (const key of Object.keys(toolCall)) {\r\n if (key.endsWith(\"ToolCall\")) {\r\n const stem = key.slice(0, -\"ToolCall\".length);\r\n return stem.length ? stem : key;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction recordStreamResult(result: ParsedStream, event: Record<string, unknown>): void {\r\n result.finalResult = event.result || event.subtype || event.terminal_reason || \"completed\";\r\n if (event.is_error) {\r\n result.error = String(event.result || event.api_error_status || \"stream result error\");\r\n }\r\n}\r\n\r\n/**\r\n * Parse harness worker stdout (`stream-json` from Claude Code or Cursor Agent).\r\n * Cursor emits `tool_call` events and may only write `type: \"result\"` after exit;\r\n * completion heartbeats are merged in `computeWorkerStatus`.\r\n */\r\nexport function parseHarnessStream(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 ts = eventTimestampIso(event);\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 === \"tool_call\" && event.subtype === \"started\") {\r\n const toolCall =\r\n event.tool_call && typeof event.tool_call === \"object\" && !Array.isArray(event.tool_call)\r\n ? (event.tool_call as Record<string, unknown>)\r\n : undefined;\r\n const name = cursorToolNameFromCall(toolCall);\r\n if (name) result.currentTool = name;\r\n }\r\n if (event.type === \"result\") {\r\n recordStreamResult(result, event);\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/** @deprecated Use {@link parseHarnessStream} \u2014 kept for existing imports. */\r\nexport function parseClaudeStream(file: string): ParsedStream {\r\n return parseHarnessStream(file);\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 === \"tool_call\") {\r\n const subtype = String(event.subtype || \"\");\r\n const toolCall =\r\n event.tool_call && typeof event.tool_call === \"object\" && !Array.isArray(event.tool_call)\r\n ? (event.tool_call as Record<string, unknown>)\r\n : undefined;\r\n const name = cursorToolNameFromCall(toolCall) ?? \"tool\";\r\n return `[tool:${subtype}] ${name}`;\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", "// Exit normalization for workers that died without a stream-json final result.\r\n//\r\n// When a worker process exits before recording a `result` event, the status path\r\n// used to surface a single generic \"process exited without a final result\"\r\n// needs_attention \u2014 indistinguishable whether the agent crashed mid-task or the\r\n// provider CLI rejected the model/args at startup. That made model/provider\r\n// misconfigurations look like silent stalls the watchdog had to triage by hand.\r\n//\r\n// `classifyExitFailure` inspects the worker's stderr/error tail and, when it\r\n// matches a known startup/config failure (model rejection, missing CLI, auth),\r\n// returns a structured `blocked` classification with a precise reason. The\r\n// status path promotes that to `attention.state = \"blocked\"` \u2014 a real board\r\n// attention state that flows through the harness completion ingest unchanged \u2014\r\n// instead of the catch-all needs_attention.\r\n\r\nexport interface ExitClassification {\r\n /** True when the failure is a structural blocker an operator must fix. */\r\n blocked: boolean;\r\n /** Precise, human-readable reason for the blocker. */\r\n reason: string;\r\n}\r\n\r\ninterface FailurePattern {\r\n test: RegExp;\r\n label: string;\r\n}\r\n\r\n// Ordered most-specific first. Each entry maps a recognizable stderr signature to\r\n// a short blocker label; the matched error tail is appended for context.\r\nconst FAILURE_PATTERNS: FailurePattern[] = [\r\n {\r\n test: /\\b(?:invalid|unknown|unsupported|unrecognized)\\b[^.\\n]*\\bmodel\\b/i,\r\n label: \"provider rejected the requested model\",\r\n },\r\n {\r\n test: /\\bmodel\\b[^.\\n]*\\b(?:not\\s+(?:found|supported|available|recognized|valid)|is\\s+not\\s+valid|does\\s+not\\s+exist)/i,\r\n label: \"provider rejected the requested model\",\r\n },\r\n {\r\n test: /\\b(?:did you mean|available models|choose (?:a|one of)|supported models)\\b/i,\r\n label: \"provider rejected the requested model\",\r\n },\r\n {\r\n test: /model preflight failed/i,\r\n label: \"model/provider preflight failed\",\r\n },\r\n {\r\n test: /\\b(?:command not found|ENOENT|is the .*CLI on PATH|executable not found|no such file or directory)\\b/i,\r\n label: \"provider CLI is missing or not on PATH\",\r\n },\r\n {\r\n test: /\\bfailed to spawn\\b/i,\r\n label: \"provider failed to spawn the worker process\",\r\n },\r\n {\r\n test: /\\b(?:not logged in|unauthorized|authentication (?:failed|required)|invalid api key|missing api key|401)\\b/i,\r\n label: \"provider authentication failed\",\r\n },\r\n];\r\n\r\n/** Collapse whitespace and clip a noisy error tail to a single readable line. */\r\nfunction tidy(errorText: string, max = 240): string {\r\n const oneLine = errorText.replace(/\\s+/g, \" \").trim();\r\n return oneLine.length > max ? `${oneLine.slice(0, max - 1)}\u2026` : oneLine;\r\n}\r\n\r\n/**\r\n * Classify a dead worker's error/stderr output. Returns a structured blocker when\r\n * the text matches a known startup/config failure, or null when it does not (the\r\n * caller should fall back to the generic needs_attention path).\r\n */\r\nexport function classifyExitFailure(\r\n errorText: string | null | undefined,\r\n): ExitClassification | null {\r\n const text = (errorText ?? \"\").trim();\r\n if (!text) return null;\r\n for (const pattern of FAILURE_PATTERNS) {\r\n if (pattern.test.test(text)) {\r\n return { blocked: true, reason: `${pattern.label}: ${tidy(text)}` };\r\n }\r\n }\r\n return null;\r\n}\r\n", "// Workers that die without a stream-json `result` event but leave salvageable work\r\n// behind (uncommitted changes and/or commits ahead of the run base). Distinct from\r\n// a generic \"process exited without a final result\" stall \u2014 operators need a\r\n// review-needed signal and a follow-up salvage/landing lane (PR #285 class).\r\n\r\nimport type { GitAncestry } from \"./git.js\";\r\n\r\nexport type ExitedSalvageKind = \"none\" | \"uncommitted\" | \"committed_ahead\" | \"both\";\r\n\r\nexport interface ExitedSalvageAssessment {\r\n kind: ExitedSalvageKind;\r\n /** True when the worktree has reviewable uncommitted and/or committed-ahead work. */\r\n salvageable: boolean;\r\n uncommittedCount: number;\r\n headCommit: string | null;\r\n /** Board / attention reason \u2014 stable prefix for downstream parsers. */\r\n attentionReason: string;\r\n}\r\n\r\nfunction trimOrNull(value: unknown): string | null {\r\n if (typeof value !== \"string\") return null;\r\n const trimmed = value.trim();\r\n return trimmed.length ? trimmed : null;\r\n}\r\n\r\nfunction hasFinalResult(value: unknown): boolean {\r\n if (value === undefined || value === null) return false;\r\n if (typeof value === \"string\") return value.trim().length > 0;\r\n if (typeof value === \"boolean\") return value;\r\n if (Array.isArray(value)) return value.length > 0;\r\n if (typeof value === \"object\") return Object.keys(value as object).length > 0;\r\n return true;\r\n}\r\n\r\nfunction committedHeadFromAncestry(ancestry: GitAncestry | null | undefined): string | null {\r\n if (!ancestry?.checked) return null;\r\n if (ancestry.headIsAncestorOfBase !== false) return null;\r\n return trimOrNull(ancestry.head);\r\n}\r\n\r\nfunction buildAttentionReason(\r\n kind: ExitedSalvageKind,\r\n uncommittedCount: number,\r\n headCommit: string | null,\r\n): string {\r\n const parts: string[] = [\"exited_with_changes_salvage\"];\r\n if (kind === \"uncommitted\" || kind === \"both\") {\r\n parts.push(\r\n `${uncommittedCount} uncommitted change${uncommittedCount === 1 ? \"\" : \"s\"} with no final result`,\r\n );\r\n }\r\n if ((kind === \"committed_ahead\" || kind === \"both\") && headCommit) {\r\n const sha = headCommit.length > 12 ? headCommit.slice(0, 12) : headCommit;\r\n parts.push(`commit ${sha} ahead of base with no final result`);\r\n }\r\n parts.push(\"review worktree \u2014 commit, open a PR, or run a salvage worker before discarding\");\r\n return parts.join(\": \");\r\n}\r\n\r\n/**\r\n * Classify a dead worker with no `finalResult`. Returns null when the worker is\r\n * still alive or already recorded a final result.\r\n */\r\nexport function assessExitedWorkerSalvage(input: {\r\n alive: boolean;\r\n finalResult: unknown;\r\n changedFiles?: string[];\r\n gitAncestry?: GitAncestry | null;\r\n headCommit?: string | null;\r\n}): ExitedSalvageAssessment | null {\r\n if (input.alive || hasFinalResult(input.finalResult)) return null;\r\n\r\n const uncommittedCount = (input.changedFiles ?? []).filter((line) => line.trim()).length;\r\n const headCommit = trimOrNull(input.headCommit) ?? committedHeadFromAncestry(input.gitAncestry);\r\n const hasUncommitted = uncommittedCount > 0;\r\n const hasCommittedAhead = Boolean(headCommit);\r\n\r\n if (!hasUncommitted && !hasCommittedAhead) {\r\n return {\r\n kind: \"none\",\r\n salvageable: false,\r\n uncommittedCount: 0,\r\n headCommit: null,\r\n attentionReason: \"process exited without a final result\",\r\n };\r\n }\r\n\r\n const kind: ExitedSalvageKind =\r\n hasUncommitted && hasCommittedAhead ? \"both\" : hasUncommitted ? \"uncommitted\" : \"committed_ahead\";\r\n\r\n return {\r\n kind,\r\n salvageable: true,\r\n uncommittedCount,\r\n headCommit,\r\n attentionReason: buildAttentionReason(kind, uncommittedCount, headCommit),\r\n };\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 interface GitAncestryOptions {\r\n /** Branch or ref name (e.g. origin/main). Used when baseCommit is unset. */\r\n base?: string;\r\n /** Pinned SHA the worktree was created from \u2014 preferred over a moving branch ref. */\r\n baseCommit?: string;\r\n}\r\n\r\nexport function computeGitAncestry(worktreePath: string, baseOrOptions: string | GitAncestryOptions = \"origin/main\"): GitAncestry {\r\n const options: GitAncestryOptions =\r\n typeof baseOrOptions === \"string\" ? { base: baseOrOptions } : baseOrOptions;\r\n const baseLabel = options.baseCommit?.trim() || options.base?.trim() || \"origin/main\";\r\n const pinnedBaseCommit = options.baseCommit?.trim() || null;\r\n\r\n if (!worktreePath) {\r\n return unknownAncestry(baseLabel, \"missing worktree path\");\r\n }\r\n\r\n const head = gitCapture(worktreePath, [\"rev-parse\", \"HEAD\"]);\r\n if (head.status !== 0) {\r\n return unknownAncestry(baseLabel, head.error || head.stderr || head.stdout || \"failed to resolve HEAD\");\r\n }\r\n\r\n let baseSha: string;\r\n if (pinnedBaseCommit) {\r\n baseSha = pinnedBaseCommit;\r\n } else {\r\n const baseHead = gitCapture(worktreePath, [\"rev-parse\", baseLabel]);\r\n if (baseHead.status !== 0) {\r\n return unknownAncestry(\r\n baseLabel,\r\n baseHead.error || baseHead.stderr || baseHead.stdout || `failed to resolve ${baseLabel}`,\r\n head.stdout.trim(),\r\n );\r\n }\r\n baseSha = baseHead.stdout.trim();\r\n }\r\n\r\n const headSha = head.stdout.trim();\r\n if (headSha === baseSha) {\r\n return {\r\n checked: true,\r\n base: baseLabel,\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: baseLabel,\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: baseLabel,\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 type { GitAncestry } from \"./git.js\";\r\n\r\nexport type WorkerLandingBlockReason = \"dirty_worktree_no_pr\";\r\n\r\nexport interface WorkerLandingSnapshot {\r\n finalResult: unknown;\r\n changedFiles: string[];\r\n headCommit?: string | null;\r\n prUrl?: string | null;\r\n artifactBundlePath?: string | null;\r\n patchPath?: string | null;\r\n gitAncestry?: GitAncestry | null;\r\n}\r\n\r\nexport interface WorkerLandingVerdict {\r\n /** When true, do not treat the worker as cleanly landed/done. */\r\n blocked: boolean;\r\n reason?: WorkerLandingBlockReason;\r\n /** Human-readable attention reason for boards and completion payloads. */\r\n detail?: string;\r\n}\r\n\r\nfunction trimOrNull(value: unknown): string | null {\r\n if (typeof value !== \"string\") return null;\r\n const trimmed = value.trim();\r\n return trimmed.length ? trimmed : null;\r\n}\r\n\r\nfunction hasFinalResult(value: unknown): boolean {\r\n if (value === undefined || value === null) return false;\r\n if (typeof value === \"string\") return value.trim().length > 0;\r\n if (typeof value === \"boolean\") return value;\r\n if (Array.isArray(value)) return value.length > 0;\r\n if (typeof value === \"object\") return Object.keys(value as object).length > 0;\r\n return true;\r\n}\r\n\r\nfunction hasCommittedLandingRef(snapshot: WorkerLandingSnapshot): boolean {\r\n if (trimOrNull(snapshot.headCommit)) return true;\r\n if (trimOrNull(snapshot.prUrl)) return true;\r\n if (trimOrNull(snapshot.artifactBundlePath)) return true;\r\n if (trimOrNull(snapshot.patchPath)) return true;\r\n const ancestry = snapshot.gitAncestry;\r\n if (ancestry?.checked && ancestry.headIsAncestorOfBase === false && trimOrNull(ancestry.head)) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Hard landing gate: a recorded final result is not sufficient when the worker\r\n * left uncommitted code and has no commit/PR/patch/bundle landing path.\r\n */\r\nexport function assessWorkerLanding(snapshot: WorkerLandingSnapshot): WorkerLandingVerdict {\r\n if (!hasFinalResult(snapshot.finalResult)) return { blocked: false };\r\n if (snapshot.changedFiles.length === 0) return { blocked: false };\r\n if (!hasCommittedLandingRef(snapshot)) {\r\n return {\r\n blocked: true,\r\n reason: \"dirty_worktree_no_pr\",\r\n detail: `Worktree has ${snapshot.changedFiles.length} uncommitted change(s) with no commit or PR; commit, open a PR, or discard before landing`,\r\n };\r\n }\r\n return {\r\n blocked: true,\r\n detail: `Worktree has ${snapshot.changedFiles.length} uncommitted change(s); commit or discard before landing`,\r\n };\r\n}\r\n\r\nexport function landingAttentionReason(verdict: WorkerLandingVerdict): string | undefined {\r\n if (!verdict.blocked) return undefined;\r\n return verdict.detail ?? verdict.reason ?? \"dirty_worktree_no_pr\";\r\n}\r\n", "// Runtime mirror of server landing-contract gate (Dalton landing-only / target PRs).\r\n\r\nimport type { WorkerLandingSnapshot } from \"./landing-gate.js\";\r\n\r\nexport type TargetPrOutcome = \"merged\" | \"skipped\" | \"blocked\";\r\n\r\nexport interface TargetPrReconciliation {\r\n prUrl: string;\r\n outcome: TargetPrOutcome;\r\n mergeCommit?: string | null;\r\n reason?: string | null;\r\n}\r\n\r\nexport interface WorkerLandingContract {\r\n landingOnly: boolean;\r\n targetPrUrls: string[];\r\n}\r\n\r\nexport type WorkerLandingContractBlockReason =\r\n | \"unrelated_implementation_pr\"\r\n | \"missing_target_pr_reconciliation\"\r\n | \"incomplete_target_pr_landing\";\r\n\r\nexport interface WorkerLandingContractVerdict {\r\n blocked: boolean;\r\n reason?: WorkerLandingContractBlockReason;\r\n detail?: string;\r\n}\r\n\r\nfunction trimOrNull(value: unknown): string | null {\r\n if (typeof value !== \"string\") return null;\r\n const t = value.trim();\r\n return t.length ? t : null;\r\n}\r\n\r\nfunction hasFinalResult(value: unknown): boolean {\r\n if (value === undefined || value === null) return false;\r\n if (typeof value === \"string\") return value.trim().length > 0;\r\n if (typeof value === \"object\") return Object.keys(value as object).length > 0;\r\n return true;\r\n}\r\n\r\nfunction normalizePrUrl(url: string): string | null {\r\n const m = url\r\n .trim()\r\n .match(/github\\.com\\/([^/]+\\/[^/]+)\\/(?:pull|pulls)\\/(\\d+)/i);\r\n if (!m) return trimOrNull(url);\r\n return `https://github.com/${m[1]}/pull/${m[2]}`;\r\n}\r\n\r\nfunction parseReconciliation(finalResult: unknown): TargetPrReconciliation[] {\r\n if (!finalResult || typeof finalResult !== \"object\" || Array.isArray(finalResult)) return [];\r\n const record = finalResult as Record<string, unknown>;\r\n const raw = record.targetPrReconciliation ?? record.target_pr_reconciliation;\r\n if (!Array.isArray(raw)) return [];\r\n const out: TargetPrReconciliation[] = [];\r\n for (const item of raw) {\r\n if (!item || typeof item !== \"object\" || Array.isArray(item)) continue;\r\n const row = item as Record<string, unknown>;\r\n const prUrl = normalizePrUrl(String(row.prUrl ?? row.pr_url ?? \"\"));\r\n const outcome = trimOrNull(row.outcome);\r\n if (!prUrl || (outcome !== \"merged\" && outcome !== \"skipped\" && outcome !== \"blocked\")) continue;\r\n out.push({\r\n prUrl,\r\n outcome,\r\n mergeCommit: trimOrNull(row.mergeCommit ?? row.merge_commit),\r\n reason: trimOrNull(row.reason),\r\n });\r\n }\r\n return out;\r\n}\r\n\r\nfunction workerPrUrls(snapshot: WorkerLandingSnapshot, finalResult: unknown): string[] {\r\n const urls: string[] = [];\r\n const fromSnapshot = normalizePrUrl(trimOrNull(snapshot.prUrl) ?? \"\");\r\n if (fromSnapshot) urls.push(fromSnapshot);\r\n if (finalResult && typeof finalResult === \"object\" && !Array.isArray(finalResult)) {\r\n const pr = normalizePrUrl(String((finalResult as Record<string, unknown>).prUrl ?? \"\"));\r\n if (pr) urls.push(pr);\r\n }\r\n return [...new Set(urls)];\r\n}\r\n\r\nexport function assessWorkerLandingContract(input: {\r\n contract: WorkerLandingContract;\r\n snapshot: WorkerLandingSnapshot;\r\n finalResult?: unknown;\r\n}): WorkerLandingContractVerdict {\r\n const { contract, snapshot } = input;\r\n const finalResult = input.finalResult ?? snapshot.finalResult;\r\n\r\n if (!contract.landingOnly && contract.targetPrUrls.length === 0) {\r\n return { blocked: false };\r\n }\r\n if (!hasFinalResult(finalResult)) return { blocked: false };\r\n\r\n const reconciliation = parseReconciliation(finalResult);\r\n const byUrl = new Map(reconciliation.map((r) => [r.prUrl, r]));\r\n const targetSet = new Set(\r\n contract.targetPrUrls.map((u) => normalizePrUrl(u) ?? u).filter(Boolean),\r\n );\r\n const workerPrs = workerPrUrls(snapshot, finalResult);\r\n\r\n if (contract.landingOnly) {\r\n for (const pr of workerPrs) {\r\n if (targetSet.size > 0 && !targetSet.has(pr)) {\r\n return {\r\n blocked: true,\r\n reason: \"unrelated_implementation_pr\",\r\n detail: `Landing-only worker attached unrelated PR ${pr}`,\r\n };\r\n }\r\n if (targetSet.size === 0) {\r\n return {\r\n blocked: true,\r\n reason: \"unrelated_implementation_pr\",\r\n detail: \"Landing-only worker must not open new implementation PRs\",\r\n };\r\n }\r\n }\r\n }\r\n\r\n if (contract.targetPrUrls.length === 0) return { blocked: false };\r\n\r\n const missing: string[] = [];\r\n for (const target of contract.targetPrUrls) {\r\n const key = normalizePrUrl(target) ?? target;\r\n const entry = byUrl.get(key);\r\n if (!entry) {\r\n missing.push(key);\r\n continue;\r\n }\r\n if (entry.outcome !== \"merged\" && !entry.reason?.trim()) {\r\n missing.push(key);\r\n }\r\n }\r\n\r\n if (missing.length > 0) {\r\n return {\r\n blocked: true,\r\n reason: missing.every((u) => byUrl.has(u))\r\n ? \"incomplete_target_pr_landing\"\r\n : \"missing_target_pr_reconciliation\",\r\n detail: `Target PR reconciliation incomplete: ${missing.join(\", \")}`,\r\n };\r\n }\r\n\r\n return { blocked: false };\r\n}\r\n\r\nexport function landingContractAttentionReason(\r\n verdict: WorkerLandingContractVerdict,\r\n): string | undefined {\r\n if (!verdict.blocked) return undefined;\r\n return verdict.detail ?? verdict.reason;\r\n}\r\n", "import { parseHeartbeat, terminalFinalResultFromHeartbeat } from \"./heartbeat.js\";\r\nimport { parseHarnessStream } from \"./stream.js\";\r\nimport { classifyExitFailure } from \"./exit-classify.js\";\r\nimport { assessExitedWorkerSalvage } from \"./exited-salvage.js\";\r\nimport { computeGitAncestry, type GitAncestry, gitStatusShort } from \"./git.js\";\r\nimport { assessWorkerLanding, landingAttentionReason } from \"./landing-gate.js\";\r\nimport {\r\n assessWorkerLandingContract,\r\n landingContractAttentionReason,\r\n type WorkerLandingContract,\r\n} from \"./landing-contract-gate.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\n/** Snapshot of Lane A policy injection at worker spawn (from dispatch-next). */\r\nexport interface InstructionPolicyEvidenceSnapshot {\r\n fingerprint?: string;\r\n ruleSlugs?: string[];\r\n globalRuleCount?: number;\r\n personaRuleCount?: number;\r\n explicitKindCount?: number;\r\n invariantCount?: number;\r\n markdownChars?: number;\r\n injectedAt?: string;\r\n}\r\n\r\n/** Snapshot of anchored persona context-envelope injection at worker spawn. */\r\nexport interface PersonaContextEvidenceSnapshot {\r\n expectedPersonaSlug?: string;\r\n injectedPersonaSlug?: string;\r\n displayName?: string;\r\n operatingRuleCount?: number;\r\n anchorTaskId?: string;\r\n envelopeGeneratedAt?: string;\r\n injectedAt?: string;\r\n markdownChars?: number;\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 /** Lane A policy fingerprint when dispatch injected operating rules. */\r\n instructionPolicyFingerprint?: string;\r\n instructionPolicyEvidence?: InstructionPolicyEvidenceSnapshot;\r\n personaSlug?: string;\r\n personaEvidence?: PersonaContextEvidenceSnapshot;\r\n leaseOwner?: string;\r\n dispatched?: boolean;\r\n startedAt?: string;\r\n /** Routing audit \u2014 which rule selected model/provider (dispatch inference). */\r\n routingRule?: string;\r\n requestedModel?: string;\r\n /** Set when stale-reconcile patches a dead/stale worker record. */\r\n reconciledAt?: string;\r\n reconcileReason?: 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 /** ISO timestamp when `/harness/completion` returned 2xx for this worker. */\r\n completionReportedAt?: string;\r\n /** Snapshot from the acknowledged completion POST \u2014 local-only. */\r\n completionSnapshot?: { finalResult?: unknown; prUrl?: string | null; summary?: string | null };\r\n /** Audit tag for how `completionReportedAt` was set (`tryCompleteWorker`, `board-task-*`). */\r\n completionAckSource?: string;\r\n /** Local mirror of the last completion POST outcome. */\r\n completionOutcome?: \"acknowledged\" | \"rejected\";\r\n /** Truncated JSON body from the last acknowledged completion response. */\r\n completionResponse?: unknown;\r\n /**\r\n * Direct/local worker with no board linkage \u2014 must not be mistaken for an\r\n * AgentTask-backed harness worker in completion or dispatch paths.\r\n */\r\n localOnly?: boolean;\r\n /** Sidecar PID when detached; used for observability only. */\r\n completionSidecarPid?: number;\r\n completionSidecarSpawnFailedAt?: 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 /** Parser-detected timestamp anomalies (e.g., future heartbeat ts). */\r\n timestampAnomalies?: Array<{\r\n kind: \"future_heartbeat_timestamp\";\r\n observedAt: string;\r\n clampedTo: string;\r\n }>;\r\n finalResult: unknown;\r\n error?: string;\r\n changedFiles: string[];\r\n gitAncestry: GitAncestry;\r\n /** Set by PR-ready handoff before completion is posted. */\r\n prUrl?: string;\r\n headCommit?: string;\r\n}\r\n\r\nexport interface WorkerStatusOptions {\r\n /** Branch ref for ancestry when baseCommit is not set. */\r\n base?: string;\r\n /** Pinned SHA from run creation \u2014 preferred for ancestry vs a moving branch tip. */\r\n baseCommit?: 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 /** stderr tail / parsed error for a worker that died without a final result. */\r\n error?: string | null;\r\n changedFiles?: string[];\r\n gitAncestry?: GitAncestry | null;\r\n completionBlocker?: string | null;\r\n landingContract?: WorkerLandingContract | null;\r\n prUrl?: string | null;\r\n}): WorkerAttention {\r\n const now = Date.now();\r\n if (input.completionBlocker) {\r\n return { state: \"blocked\", reason: input.completionBlocker };\r\n }\r\n if (input.finalResult) {\r\n const landingSnapshot = {\r\n finalResult: input.finalResult,\r\n changedFiles: input.changedFiles ?? [],\r\n gitAncestry: input.gitAncestry ?? null,\r\n prUrl: input.prUrl ?? null,\r\n };\r\n const landing = assessWorkerLanding(landingSnapshot);\r\n if (landing.blocked) {\r\n const detail = landingAttentionReason(landing);\r\n return {\r\n state: \"needs_attention\",\r\n reason: landing.reason\r\n ? `landing blocked (${landing.reason}): ${detail}`\r\n : `landing blocked: ${detail}`,\r\n };\r\n }\r\n if (input.landingContract) {\r\n const contractVerdict = assessWorkerLandingContract({\r\n contract: input.landingContract,\r\n snapshot: landingSnapshot,\r\n finalResult: input.finalResult,\r\n });\r\n const contractDetail = landingContractAttentionReason(contractVerdict);\r\n if (contractDetail) {\r\n return {\r\n state: \"needs_attention\",\r\n reason: contractVerdict.reason\r\n ? `landing contract (${contractVerdict.reason}): ${contractDetail}`\r\n : `landing contract: ${contractDetail}`,\r\n };\r\n }\r\n }\r\n return { state: \"done\", reason: \"final result recorded\" };\r\n }\r\n if (!input.alive) {\r\n // A worker that exited without a final result is not always a silent stall:\r\n // a recognizable startup/config failure (model/provider rejection, missing\r\n // CLI, auth) is a structural blocker, not a generic needs_attention.\r\n const classified = classifyExitFailure(input.error);\r\n if (classified) return { state: \"blocked\", reason: classified.reason };\r\n const salvage = assessExitedWorkerSalvage({\r\n alive: false,\r\n finalResult: null,\r\n changedFiles: input.changedFiles,\r\n gitAncestry: input.gitAncestry,\r\n });\r\n if (salvage?.salvageable) {\r\n const tail = input.error?.trim();\r\n return {\r\n state: \"needs_attention\",\r\n reason: tail ? `${salvage.attentionReason} (${tail})` : salvage.attentionReason,\r\n };\r\n }\r\n const tail = input.error?.trim();\r\n return {\r\n state: \"needs_attention\",\r\n reason: tail\r\n ? `process exited without a final result: ${tail}`\r\n : salvage?.attentionReason ?? \"process exited without a final result\",\r\n };\r\n }\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\nfunction resolveFinalResult(\r\n worker: HarnessWorkerRecord,\r\n parsedFinalResult: unknown,\r\n heartbeat: ReturnType<typeof parseHeartbeat>,\r\n): unknown {\r\n if (parsedFinalResult) return parsedFinalResult;\r\n const ackSnapshot = worker.completionSnapshot?.finalResult;\r\n if (ackSnapshot !== undefined && ackSnapshot !== null) return ackSnapshot;\r\n return terminalFinalResultFromHeartbeat(heartbeat);\r\n}\r\n\r\nexport function computeWorkerStatus(worker: HarnessWorkerRecord, options: WorkerStatusOptions = {}): RawHarnessWorkerStatus {\r\n const parsed = parseHarnessStream(worker.stdoutPath);\r\n const heartbeat = parseHeartbeat(worker.heartbeatPath);\r\n const completionAcknowledged =\r\n typeof worker.completionReportedAt === \"string\" && worker.completionReportedAt.trim().length > 0;\r\n const finalResult = resolveFinalResult(worker, parsed.finalResult, heartbeat);\r\n const alive = completionAcknowledged ? false : 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, {\r\n base: options.base,\r\n baseCommit: options.baseCommit,\r\n });\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 // The error surfaced when a worker died without a final result: the parsed\r\n // stream error, else the stderr tail. Computed before attention so a startup/\r\n // config failure can be classified as a structured blocker.\r\n const error =\r\n parsed.error ||\r\n (!alive && !finalResult ? tailFile(worker.stderrPath, 10).trim() || undefined : undefined);\r\n const completionBlocker =\r\n typeof worker.completionBlocker === \"string\" && worker.completionBlocker.trim()\r\n ? worker.completionBlocker.trim()\r\n : null;\r\n const attention = computeAttention({\r\n alive,\r\n 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 error,\r\n changedFiles,\r\n gitAncestry,\r\n completionBlocker,\r\n });\r\n const workerStatusLabel =\r\n completionBlocker || attention.state === \"blocked\"\r\n ? \"blocked\"\r\n : completionAcknowledged || attention.state === \"done\"\r\n ? \"done\"\r\n : finalResult\r\n ? \"exited\"\r\n : alive\r\n ? \"running\"\r\n : \"exited\";\r\n return {\r\n runId: worker.runId,\r\n worker: worker.name,\r\n pid: worker.pid,\r\n alive,\r\n status: workerStatusLabel,\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: completionAcknowledged ? null : 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 timestampAnomalies: heartbeat.timestampAnomalies,\r\n finalResult,\r\n error,\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\n/** True when a worker recorded a final result but failed the landing gate. */\r\nexport function isLandingBlockedWorkerStatus(status: RawHarnessWorkerStatus): boolean {\r\n if (!status.finalResult) return false;\r\n return status.attention.state === \"needs_attention\" || status.attention.state === \"blocked\";\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", "/** Enrich dispatch task metadata with `roleLane` when the board row omits it. */\r\n\r\nfunction taskString(task: Record<string, unknown>, key: string): string {\r\n const v = task[key];\r\n return typeof v === \"string\" ? v.trim() : \"\";\r\n}\r\n\r\nfunction normalize(value: string): string {\r\n return value.toLowerCase();\r\n}\r\n\r\nconst PERSONA_DEFAULT_LANE: Record<string, string> = {\r\n ghost: \"system\",\r\n astra: \"plan_author\",\r\n rhea: \"implementer\",\r\n mnemo: \"implementer\",\r\n sentinel: \"deep_reviewer\",\r\n pixel: \"implementer\",\r\n schema: \"implementer\",\r\n atlas: \"runtime_verifier\",\r\n bridge: \"implementer\",\r\n catalyst: \"implementer\",\r\n dalton: \"implementer\",\r\n lorentz: \"report_reviewer\",\r\n};\r\n\r\n/**\r\n * Best-effort plan role lane from persona, title, and executorRef.\r\n * Returns undefined when nothing confident matches.\r\n */\r\nexport function inferRoleLaneFromTask(task: Record<string, unknown>): string | undefined {\r\n const existing = taskString(task, \"roleLane\");\r\n if (existing) return existing;\r\n\r\n const ref = normalize(taskString(task, \"executorRef\"));\r\n const title = normalize(taskString(task, \"title\"));\r\n const persona = normalize(taskString(task, \"personaSlug\"));\r\n const combined = `${ref} ${title}`;\r\n\r\n if (combined.includes(\"deep review\") || combined.includes(\"security review\") || ref.includes(\"deep-reviewer\")) {\r\n return \"deep_reviewer\";\r\n }\r\n if (combined.includes(\"plan author\") || combined.includes(\"plan-author\") || title.includes(\"strategy plan\")) {\r\n return \"plan_author\";\r\n }\r\n if (combined.includes(\"plan review\") || ref.includes(\"plan-reviewer\")) {\r\n return \"plan_reviewer\";\r\n }\r\n if (combined.includes(\"report review\") || combined.includes(\"completion report\")) {\r\n return \"report_reviewer\";\r\n }\r\n if (combined.includes(\"repair\") || title.startsWith(\"fix \") || ref.includes(\"repair\")) {\r\n return \"repair_implementer\";\r\n }\r\n if (\r\n ref.includes(\"cursor\") ||\r\n ref.includes(\"codex\") ||\r\n ref.includes(\"composer\") ||\r\n title.includes(\"implement\") ||\r\n title.includes(\"land:\")\r\n ) {\r\n return \"implementer\";\r\n }\r\n\r\n if (persona && PERSONA_DEFAULT_LANE[persona]) {\r\n const base = PERSONA_DEFAULT_LANE[persona];\r\n if (persona === \"lorentz\" && (combined.includes(\"deep\") || combined.includes(\"security\"))) {\r\n return \"deep_reviewer\";\r\n }\r\n return base;\r\n }\r\n\r\n if (combined.includes(\"review\")) return \"report_reviewer\";\r\n\r\n return undefined;\r\n}\r\n\r\n/** Attach inferred `roleLane` so `inferModelRoutingFromTask` can use plan-lane rules. */\r\nexport function enrichTaskForModelRouting(task: Record<string, unknown>): Record<string, unknown> {\r\n const roleLane = inferRoleLaneFromTask(task);\r\n if (!roleLane) return task;\r\n return { ...task, roleLane };\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 { hiddenSpawnOptions } from \"../util.js\";\r\nimport { preflightClaudeModel } from \"./model-preflight.js\";\r\nimport type { WorkerProvider } from \"./types.js\";\r\n\r\n/** Provider default when no explicit model is passed \u2014 Sonnet, not Opus. */\r\nexport const CLAUDE_DEFAULT_MODEL = \"claude-sonnet-4-6\";\r\n\r\nexport const claudeProvider: WorkerProvider = {\r\n name: \"claude\",\r\n defaultModel: CLAUDE_DEFAULT_MODEL,\r\n preflightModel(model) {\r\n return preflightClaudeModel(model, CLAUDE_DEFAULT_MODEL);\r\n },\r\n start(opts) {\r\n // Defence in depth: the supervisor already preflights, but normalize here too\r\n // so the direct `worker start` path never hands the CLI a suffixed model.\r\n const preflight = preflightClaudeModel(opts.model, CLAUDE_DEFAULT_MODEL);\r\n if (!preflight.ok) {\r\n throw new Error(`claude provider model preflight failed: ${preflight.note}`);\r\n }\r\n const model = preflight.model;\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 hiddenSpawnOptions({\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", "// Provider model preflight + normalization.\r\n//\r\n// Agent CLIs (Cursor's `agent`, the Kynver Harness, the AgentOS board) expose\r\n// model identifiers with a reasoning-effort suffix \u2014 e.g. `claude-opus-4-7-thinking-high`.\r\n// The underlying `claude` CLI only accepts the *base* model id (`claude-opus-4-7`)\r\n// and exits immediately when handed the suffixed form, with no stream-json `result`\r\n// event. That left workers in a silent \"exited without a final result\" state.\r\n//\r\n// This module makes the requested model safe before spawn:\r\n// - normalize a known reasoning-effort suffix to the base model the CLI accepts;\r\n// - reject a *clearly foreign* provider model (e.g. an OpenAI/Gemini/Cursor model\r\n// handed to the `claude` provider) as a structured preflight failure instead of\r\n// spawning a doomed process.\r\n//\r\n// It is intentionally conservative: anything that looks like a plausible model for\r\n// the provider passes through untouched and the CLI remains the final judge (the\r\n// status-path exit classifier catches a late CLI rejection \u2014 see ../exit-classify.ts).\r\n\r\nexport interface ModelPreflightResult {\r\n /** False when the model/provider combination is structurally invalid. */\r\n ok: boolean;\r\n /** The model to launch with (normalized). Meaningful only when `ok`. */\r\n model: string;\r\n /** True when the requested model was rewritten to a different launch model. */\r\n normalized: boolean;\r\n /** The originally requested model, present only when it differs from `model`. */\r\n requested?: string;\r\n /** Human-readable note: the normalization explanation, or the rejection reason. */\r\n note?: string;\r\n}\r\n\r\n/**\r\n * Trailing reasoning-effort suffix that agent CLIs append to a base model id.\r\n * Matches `-thinking`, `-thinking-high|medium|low|minimal|max|none`, and the bare\r\n * effort tokens `-high|medium|low|minimal`. No base Kynver model id ends in any of\r\n * these tokens, so stripping a trailing match is safe.\r\n */\r\nconst REASONING_SUFFIX_RE =\r\n /-(?:thinking(?:-(?:high|medium|low|minimal|max|none))?|high|medium|low|minimal)$/i;\r\n\r\n/** Strip a single trailing reasoning-effort suffix from a model id. */\r\nexport function stripReasoningSuffix(model: string): string {\r\n return model.replace(REASONING_SUFFIX_RE, \"\");\r\n}\r\n\r\n/** Recognizable \"this is some other vendor's model\" prefixes. */\r\nconst FOREIGN_MODEL_RE = /^(?:gpt-|gpt5|o1|o3|o4|gemini-|grok-|composer|deepseek|llama|mistral|qwen|command-)/i;\r\n\r\n/** A model id that plausibly belongs to the Anthropic/Claude family. */\r\nfunction looksLikeClaudeModel(model: string): boolean {\r\n return /^claude[-_]/i.test(model) || /^(?:opus|sonnet|haiku)\\b/i.test(model);\r\n}\r\n\r\n/** Board/CLI aliases that are not valid Cursor agent model ids (fail after spawn). */\r\nconst CURSOR_MODEL_ALIASES = new Set([\"cursor\"]);\r\n\r\n/**\r\n * Normalize provider=cursor requests that pass model=cursor (or similar aliases)\r\n * to a real Cursor CLI model. `auto` is the supported default when the board\r\n * does not pin a specific composer id.\r\n */\r\nexport function normalizeCursorModelAlias(model: string): string | null {\r\n const key = model.trim().toLowerCase();\r\n if (CURSOR_MODEL_ALIASES.has(key)) return \"auto\";\r\n return null;\r\n}\r\n\r\n/**\r\n * Preflight a model for the `claude` provider. Normalizes reasoning-effort\r\n * suffixes; rejects models that clearly belong to another provider.\r\n */\r\nexport function preflightClaudeModel(\r\n model: string | undefined,\r\n defaultModel: string,\r\n): ModelPreflightResult {\r\n const requested = (model ?? \"\").trim();\r\n if (!requested) {\r\n return { ok: true, model: defaultModel, normalized: false };\r\n }\r\n\r\n const stripped = stripReasoningSuffix(requested).trim();\r\n const launch = stripped || defaultModel;\r\n\r\n if (FOREIGN_MODEL_RE.test(launch) || (!looksLikeClaudeModel(launch) && launch !== defaultModel)) {\r\n return {\r\n ok: false,\r\n model: requested,\r\n normalized: false,\r\n requested,\r\n note:\r\n `model \"${requested}\" is not a Claude model \u2014 the \"claude\" provider drives the ` +\r\n `Claude CLI, which only accepts claude-* model ids (got \"${launch}\"). ` +\r\n `Pick a Claude model or switch the worker provider.`,\r\n };\r\n }\r\n\r\n if (launch !== requested) {\r\n return {\r\n ok: true,\r\n model: launch,\r\n normalized: true,\r\n requested,\r\n note: `normalized model \"${requested}\" \u2192 \"${launch}\" (the Claude CLI rejects reasoning-effort suffixes)`,\r\n };\r\n }\r\n return { ok: true, model: launch, normalized: false };\r\n}\r\n\r\n/**\r\n * Preflight a model for the `cursor` provider. The Cursor agent owns its own\r\n * reasoning levels, so suffixed ids pass through; we only flag a Claude-family\r\n * model that was clearly meant for the `claude` provider.\r\n */\r\nexport function preflightCursorModel(\r\n model: string | undefined,\r\n defaultModel: string,\r\n): ModelPreflightResult {\r\n const requested = (model ?? \"\").trim();\r\n if (!requested) {\r\n return { ok: true, model: defaultModel, normalized: false };\r\n }\r\n const aliasLaunch = normalizeCursorModelAlias(requested);\r\n if (aliasLaunch) {\r\n return {\r\n ok: true,\r\n model: aliasLaunch,\r\n normalized: true,\r\n requested,\r\n note:\r\n `normalized model \"${requested}\" \u2192 \"${aliasLaunch}\" ` +\r\n `(Cursor provider alias \u2014 use \"auto\" or a composer id, not \"cursor\")`,\r\n };\r\n }\r\n if (looksLikeClaudeModel(requested)) {\r\n return {\r\n ok: false,\r\n model: requested,\r\n normalized: false,\r\n requested,\r\n note:\r\n `model \"${requested}\" is a Claude model but the worker provider is \"cursor\". ` +\r\n `Switch the provider to \"claude\" or pick a Cursor model.`,\r\n };\r\n }\r\n return { ok: true, model: requested, normalized: false };\r\n}\r\n", "import { loadUserConfig, type KynverUserConfig } from \"./config.js\";\r\nimport { CLAUDE_DEFAULT_MODEL } from \"./providers/claude.js\";\r\n\r\n/** Conservative default \u2014 Sonnet for ordinary harness work (not Opus). */\r\nexport const GLOBAL_DEFAULT_MODEL = \"claude-sonnet-4-6\";\r\nexport const CURSOR_DEFAULT_MODEL = \"composer-2.5\";\r\n\r\nexport interface ModelRoutingDecision {\r\n /** Model id passed to the provider CLI (undefined \u2192 provider default). */\r\n model?: string;\r\n /** Worker provider key (`claude` | `cursor`). */\r\n provider: string;\r\n /** Audit trail for Command Center / worker.json. */\r\n rule: string;\r\n /** Original task/board model request when inferred from metadata. */\r\n requestedModel?: string;\r\n}\r\n\r\nfunction taskString(task: Record<string, unknown>, key: string): string {\r\n const v = task[key];\r\n return typeof v === \"string\" ? v.trim() : \"\";\r\n}\r\n\r\nfunction normalizeRef(ref: string): string {\r\n return ref.toLowerCase();\r\n}\r\n\r\n/** Resolve global default: config \u2192 env \u2192 Sonnet. */\r\nexport function resolveGlobalDefaultModel(config: KynverUserConfig = loadUserConfig()): string {\r\n const fromConfig = config.defaultModel?.trim();\r\n if (fromConfig) return fromConfig;\r\n const fromEnv = process.env.KYNVER_DEFAULT_MODEL?.trim();\r\n if (fromEnv) return fromEnv;\r\n return GLOBAL_DEFAULT_MODEL;\r\n}\r\n\r\nfunction inferProviderFromModel(model: string | undefined): string {\r\n const m = (model ?? \"\").toLowerCase();\r\n if (!m) return \"claude\";\r\n if (\r\n m.includes(\"composer\") ||\r\n m.includes(\"cursor\") ||\r\n m.includes(\"codex\") ||\r\n m.startsWith(\"gpt-\") ||\r\n m.startsWith(\"gpt5\")\r\n ) {\r\n return \"cursor\";\r\n }\r\n return \"claude\";\r\n}\r\n\r\nfunction normalizeProviderAliasModel(model: string, explicitProvider: string | undefined): ModelRoutingDecision | null {\r\n const alias = model.trim().toLowerCase();\r\n const provider = explicitProvider?.trim();\r\n if (alias === \"cursor\") {\r\n return {\r\n model: CURSOR_DEFAULT_MODEL,\r\n provider: \"cursor\",\r\n rule:\r\n provider && provider !== \"cursor\"\r\n ? \"explicit:model_provider_alias_overrode_provider\"\r\n : \"explicit:model_provider_alias\",\r\n requestedModel: model,\r\n };\r\n }\r\n if (alias === \"claude\" || alias === \"anthropic\") {\r\n return {\r\n model: CLAUDE_DEFAULT_MODEL,\r\n provider: \"claude\",\r\n rule:\r\n provider && provider !== \"claude\"\r\n ? \"explicit:model_provider_alias_overrode_provider\"\r\n : \"explicit:model_provider_alias\",\r\n requestedModel: model,\r\n };\r\n }\r\n return null;\r\n}\r\n\r\nfunction isOpusLane(ref: string, title: string): boolean {\r\n if (ref.includes(\"deep\") && ref.includes(\"review\")) return true;\r\n if (ref.includes(\"security\")) return true;\r\n if (ref.includes(\"plan_author\") || ref.includes(\"plan-author\")) return true;\r\n if (title.includes(\"deep review\") || title.includes(\"security review\")) return true;\r\n if (ref.includes(\"plan\") && !ref.includes(\"review\") && (ref.includes(\"author\") || ref.includes(\"strategy\"))) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Infer model + provider from AgentOS task metadata when the dispatcher did not\r\n * pass an explicit `--model`. Explicit CLI/model args always win.\r\n */\r\nexport function inferModelRoutingFromTask(task: Record<string, unknown>): ModelRoutingDecision {\r\n const ref = normalizeRef(taskString(task, \"executorRef\"));\r\n const title = taskString(task, \"title\").toLowerCase();\r\n const priority = taskString(task, \"priority\") || \"normal\";\r\n const roleLane = normalizeRef(taskString(task, \"roleLane\"));\r\n\r\n // Coding lanes \u2192 Cursor (cheaper than Opus for implementation).\r\n if (\r\n ref.includes(\"cursor\") ||\r\n ref.includes(\"codex\") ||\r\n ref.includes(\"composer\") ||\r\n ref.includes(\"copilot\") ||\r\n roleLane === \"implementer\" ||\r\n roleLane === \"repair_implementer\"\r\n ) {\r\n return { provider: \"cursor\", rule: \"lane:implementation\" };\r\n }\r\n\r\n // Landing / merge hygiene \u2192 Haiku on Claude.\r\n if (ref.includes(\"landing\") || title.startsWith(\"land:\") || title.includes(\" merge\")) {\r\n return {\r\n model: \"claude-haiku-4-5-20251001\",\r\n provider: \"claude\",\r\n rule: \"lane:landing\",\r\n };\r\n }\r\n\r\n // Reviews \u2014 Sonnet unless explicitly deep/security.\r\n if (ref.includes(\"review\") || title.startsWith(\"review \") || roleLane.includes(\"review\")) {\r\n if (isOpusLane(ref, title) || roleLane === \"deep_reviewer\") {\r\n return { model: \"claude-opus-4-7\", provider: \"claude\", rule: \"lane:deep_review\" };\r\n }\r\n return { model: \"claude-sonnet-4-6\", provider: \"claude\", rule: \"lane:review\" };\r\n }\r\n\r\n // Planning / strategy \u2192 Opus when the lane truly needs it.\r\n if (isOpusLane(ref, title) || roleLane === \"plan_author\") {\r\n return { model: \"claude-opus-4-7\", provider: \"claude\", rule: \"lane:planning\" };\r\n }\r\n\r\n if (priority === \"critical\") {\r\n return { model: \"claude-opus-4-7\", provider: \"claude\", rule: \"priority:critical\" };\r\n }\r\n if (priority === \"high\") {\r\n return { model: \"claude-sonnet-4-6\", provider: \"claude\", rule: \"priority:high\" };\r\n }\r\n if (priority === \"low\") {\r\n return {\r\n model: \"claude-haiku-4-5-20251001\",\r\n provider: \"claude\",\r\n rule: \"priority:low\",\r\n };\r\n }\r\n\r\n const model = resolveGlobalDefaultModel();\r\n return {\r\n model,\r\n provider: inferProviderFromModel(model),\r\n rule: \"default:global\",\r\n };\r\n}\r\n\r\n/** Resolve launch parameters: explicit CLI wins, then task inference, then global default. */\r\nexport function resolveWorkerLaunch(input: {\r\n explicitModel?: string;\r\n explicitProvider?: string;\r\n task?: Record<string, unknown>;\r\n}): ModelRoutingDecision {\r\n if (input.explicitModel?.trim()) {\r\n const model = input.explicitModel.trim();\r\n const providerAlias = normalizeProviderAliasModel(model, input.explicitProvider);\r\n if (providerAlias) return providerAlias;\r\n\r\n return {\r\n model,\r\n provider: input.explicitProvider?.trim() || inferProviderFromModel(model),\r\n rule: \"explicit:cli\",\r\n requestedModel: model,\r\n };\r\n }\r\n\r\n if (input.task && Object.keys(input.task).length > 0) {\r\n const inferred = inferModelRoutingFromTask(input.task);\r\n return {\r\n ...inferred,\r\n requestedModel: inferred.model,\r\n };\r\n }\r\n\r\n const model = resolveGlobalDefaultModel();\r\n return {\r\n model,\r\n provider: input.explicitProvider?.trim() || inferProviderFromModel(model),\r\n rule: \"default:global\",\r\n requestedModel: model,\r\n };\r\n}\r\n\r\n/** Fallback chain tail after provider start \u2014 never hard-code Opus here. */\r\nexport function resolveModelFallback(\r\n startedModel: string | undefined,\r\n launchModel: string | undefined,\r\n providerDefault: string | undefined,\r\n): string {\r\n return startedModel || launchModel || providerDefault || resolveGlobalDefaultModel() || CLAUDE_DEFAULT_MODEL;\r\n}\r\n", "/** Local dispatch retry/cooldown limits. */\r\n\r\nfunction positiveInt(value: string | undefined, 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\nexport interface HarnessRetryLimits {\r\n /** Advisory max task attempts surfaced to operator/dispatch (default 3). */\r\n maxTaskAttempts: number;\r\n /** Minimum ms between dispatch starts for the same run (default 5s). */\r\n dispatchCooldownMs: number;\r\n}\r\n\r\nexport function readHarnessRetryLimits(): HarnessRetryLimits {\r\n return {\r\n maxTaskAttempts: positiveInt(process.env.KYNVER_MAX_TASK_ATTEMPTS, 3),\r\n dispatchCooldownMs: positiveInt(process.env.KYNVER_DISPATCH_COOLDOWN_MS, 5_000),\r\n };\r\n}\r\n", "import path from \"node:path\";\r\nimport { resolveBaseUrl, resolveCallbackSecretWithMint } from \"./config.js\";\r\nimport { postJsonWithCredentialRefresh } from \"./callbacks.js\";\r\nimport { loadRun, runDirectory } from \"./run-store.js\";\r\nimport { computeWorkerStatus } from \"./status.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\nimport { isPidAlive, readJson, safeSlug } from \"./util.js\";\r\nimport { DEFAULT_DISPATCH_LEASE_MS } from \"./dispatch.js\";\r\n\r\nexport interface RenewActiveLeasesResult {\r\n renewed: string[];\r\n failed: Array<{ worker: string; reason: string }>;\r\n skipped: string[];\r\n}\r\n\r\nfunction workerRecord(runId: string, name: string): HarnessWorkerRecord | undefined {\r\n return readJson<HarnessWorkerRecord>(\r\n path.join(runDirectory(runId), \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n}\r\n\r\n/**\r\n * Renew leases for board-linked workers whose process is still alive.\r\n * Prevents dispatch/reaper from reclaiming a task while a local worker runs.\r\n */\r\nexport async function renewActiveTaskLeases(\r\n runId: string,\r\n args: Record<string, string | boolean>,\r\n): Promise<RenewActiveLeasesResult> {\r\n const run = loadRun(runId);\r\n const agentOsId = String(args.agentOsId || \"\");\r\n if (!agentOsId) {\r\n return { renewed: [], failed: [], skipped: [] };\r\n }\r\n\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const secret = await resolveCallbackSecretWithMint(\r\n args.secret ? String(args.secret) : undefined,\r\n agentOsId,\r\n { baseUrl: base },\r\n );\r\n const leaseDurationMs =\r\n Number(args.leaseMs) > 0 ? Math.floor(Number(args.leaseMs)) : DEFAULT_DISPATCH_LEASE_MS;\r\n const leaseOwner = `kynver-harness:${runId}`;\r\n\r\n const renewed: string[] = [];\r\n const failed: Array<{ worker: string; reason: string }> = [];\r\n const skipped: string[] = [];\r\n\r\n for (const name of Object.keys(run.workers || {})) {\r\n const worker = workerRecord(runId, name);\r\n if (!worker?.taskId || !worker.agentOsId) {\r\n skipped.push(name);\r\n continue;\r\n }\r\n if (!isPidAlive(worker.pid)) {\r\n skipped.push(name);\r\n continue;\r\n }\r\n const status = computeWorkerStatus(worker);\r\n if (status.status === \"done\") {\r\n skipped.push(name);\r\n continue;\r\n }\r\n\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/tasks/${encodeURIComponent(worker.taskId)}/renew-lease`;\r\n const res = await postJsonWithCredentialRefresh(\r\n url,\r\n secret,\r\n { leaseOwner, leaseDurationMs },\r\n { agentOsId, baseUrl: base },\r\n );\r\n if (res.ok) {\r\n renewed.push(name);\r\n continue;\r\n }\r\n const reason =\r\n res.response && typeof res.response === \"object\" && \"reason\" in res.response\r\n ? String((res.response as { reason?: unknown }).reason ?? `http ${res.status}`)\r\n : `http ${res.status}`;\r\n failed.push({ worker: name, reason });\r\n }\r\n\r\n return { renewed, failed, skipped };\r\n}\r\n\r\n/** True when this run already has a live worker bound to the same board task. */\r\nexport function hasLiveWorkerForTask(runId: string, taskId: string): boolean {\r\n const run = loadRun(runId);\r\n for (const name of Object.keys(run.workers || {})) {\r\n const worker = workerRecord(runId, name);\r\n if (!worker || worker.taskId !== taskId) continue;\r\n if (!isPidAlive(worker.pid)) continue;\r\n const status = computeWorkerStatus(worker);\r\n if (status.status === \"done\") continue;\r\n return true;\r\n }\r\n return false;\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 { resolveModelFallback, resolveWorkerLaunch } from \"./model-routing.js\";\r\nimport { resolveWorkerProvider } from \"./providers/registry.js\";\r\nimport type { HarnessRunRecord } from \"./run-store.js\";\r\nimport type {\r\n HarnessWorkerRecord,\r\n InstructionPolicyEvidenceSnapshot,\r\n PersonaContextEvidenceSnapshot,\r\n} from \"./status.js\";\r\nimport { autoCompleteWorker, 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 instructionPolicyMarkdown?: string | null;\r\n instructionPolicyFingerprint?: string | null;\r\n instructionPolicyEvidence?: InstructionPolicyEvidenceSnapshot | null;\r\n personaMarkdown?: string | null;\r\n personaSlug?: string | null;\r\n personaEvidence?: PersonaContextEvidenceSnapshot | null;\r\n leaseOwner?: string;\r\n dispatched?: boolean;\r\n provider?: string;\r\n routingRule?: string;\r\n requestedModel?: 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 // Resolve the provider and preflight the model *before* any git/worktree work so\r\n // an invalid model/provider combination fails fast (no orphan worktree) and an\r\n // agent-CLI reasoning suffix (e.g. claude-opus-4-7-thinking-high) is normalized\r\n // to a model the CLI accepts instead of silently dying with no final result.\r\n const routing =\r\n opts.routingRule || opts.requestedModel\r\n ? {\r\n provider: opts.provider || \"claude\",\r\n model: opts.model,\r\n rule: opts.routingRule || \"explicit:spawn\",\r\n requestedModel: opts.requestedModel ?? opts.model,\r\n }\r\n : resolveWorkerLaunch({\r\n explicitModel: opts.model,\r\n explicitProvider: opts.provider,\r\n });\r\n const provider = resolveWorkerProvider(routing.provider);\r\n let launchModel = routing.model;\r\n if (provider.preflightModel) {\r\n const preflight = provider.preflightModel(opts.model);\r\n if (!preflight.ok) {\r\n throw new Error(\r\n `model preflight failed for provider \"${provider.name}\": ${preflight.note ?? \"invalid model/provider combination\"}`,\r\n );\r\n }\r\n if (preflight.normalized) {\r\n console.error(`[supervisor] ${name}: ${preflight.note}`);\r\n }\r\n launchModel = preflight.model;\r\n }\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 planId: opts.planId,\r\n taskId: opts.taskId,\r\n instructionPolicyMarkdown: opts.instructionPolicyMarkdown,\r\n personaMarkdown: opts.personaMarkdown,\r\n model: launchModel,\r\n });\r\n\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: launchModel,\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 = resolveModelFallback(started.model, launchModel, provider.defaultModel);\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.instructionPolicyFingerprint\r\n ? { instructionPolicyFingerprint: String(opts.instructionPolicyFingerprint) }\r\n : {}),\r\n ...(opts.instructionPolicyEvidence ? { instructionPolicyEvidence: opts.instructionPolicyEvidence } : {}),\r\n ...(opts.personaSlug ? { personaSlug: String(opts.personaSlug) } : {}),\r\n ...(opts.personaEvidence ? { personaEvidence: opts.personaEvidence } : {}),\r\n ...(opts.leaseOwner ? { leaseOwner: String(opts.leaseOwner) } : {}),\r\n ...(opts.dispatched ? { dispatched: true } : {}),\r\n ...(!opts.agentOsId || !opts.taskId ? { localOnly: true } : {}),\r\n routingRule: routing.rule,\r\n ...(routing.requestedModel ? { requestedModel: routing.requestedModel } : {}),\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 let sidecarSpawned: ReturnType<typeof spawnCompletionSidecar> | undefined;\r\n try {\r\n sidecarSpawned = spawnCompletionSidecar({\r\n runId: run.id,\r\n workerName: name,\r\n workerDir,\r\n agentOsId: worker.agentOsId,\r\n });\r\n } catch (error) {\r\n // Sidecar spawn threw (e.g., permissions, file system error). Record the\r\n // failure as a completionBlocker so the worker routes to \"blocked\" instead\r\n // of leaving the task stuck in \"running\" when the worker exits.\r\n const reason = `completion sidecar failed to spawn: ${(error as Error).message}`;\r\n worker.completionBlocker = reason;\r\n saveWorker(run.id, worker);\r\n }\r\n // spawnCompletionSidecar can also return undefined on failure without throwing\r\n // (CLI path missing, log-file open failure, spawn failure). Surface this too.\r\n if (!sidecarSpawned) {\r\n const reason = \"completion sidecar failed to spawn (CLI not found or spawn error)\";\r\n worker.completionBlocker = reason;\r\n worker.completionSidecarSpawnFailedAt = new Date().toISOString();\r\n saveWorker(run.id, worker);\r\n } else if (sidecarSpawned.pid) {\r\n worker.completionSidecarPid = sidecarSpawned.pid;\r\n saveWorker(run.id, worker);\r\n }\r\n }\r\n return worker;\r\n}\r\n\r\nexport async function startWorker(args: Record<string, string | boolean>): Promise<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 const boardLinked = Boolean(args.agentOsId && args.taskId);\r\n const explicitLocalOnly = args.localOnly === true || args.localOnly === \"true\";\r\n if (!boardLinked && !explicitLocalOnly && (args.agentOsId || args.taskId)) {\r\n console.error(\r\n \"worker start: board-linked workers require both --agent-os-id and --task-id (or pass --local-only for direct runs)\",\r\n );\r\n process.exit(1);\r\n }\r\n const wait = args.wait === true || args.wait === \"true\";\r\n let worker: HarnessWorkerRecord | undefined;\r\n try {\r\n 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 if (!wait || !worker) return;\r\n\r\n // Block until the worker finishes and post completion to the AgentOS board.\r\n // The detached sidecar (spawned by spawnWorkerProcess) is still a fallback in\r\n // case this process is killed before the worker finishes. Both posting the same\r\n // completion is safe \u2014 tryCompleteWorker is idempotent on the backend.\r\n const outcome = await autoCompleteWorker({\r\n run: String(args.run),\r\n name: worker.name,\r\n ...(worker.agentOsId ? { agentOsId: worker.agentOsId } : {}),\r\n ...(args.baseUrl ? { baseUrl: String(args.baseUrl) } : {}),\r\n ...(args.secret ? { secret: String(args.secret) } : {}),\r\n });\r\n console.error(JSON.stringify({ event: \"start_wait_outcome\", ...outcome }));\r\n if (outcome.outcome === \"timed_out\") {\r\n process.exitCode = 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 /** Lane A operating rules from dispatch-next `harnessWorkerContext`. */\r\n instructionPolicyMarkdown?: string | null;\r\n /** Anchored task context-envelope persona block (required when task has personaSlug). */\r\n personaMarkdown?: string | null;\r\n /** When set, Haiku/compact models get a shorter harness instruction block. */\r\n model?: 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 compact = Boolean(input.model?.toLowerCase().includes(\"haiku\"));\r\n const progressLines = compact\r\n ? [\r\n \"Plan progress: when planId is set, use `kynver plan progress` for in_progress|running|partial|blocked. Use `in_progress` for agent-loop current focus; use `running` only when an executor holds a lease. Row `done` is MCP/session only.\",\r\n input.planId ? `Active planId: ${input.planId}` : \"No planId on this worker.\",\r\n ]\r\n : [\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 in_progress|running|partial|blocked` (the by-id harness route rejects `done` and confirm events). Prefer `in_progress` at turn start for current focus; daemon sets `running` on dispatch.\",\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 const planArtifactLines = compact\r\n ? [\r\n \"Plan artifacts: when authoring/revising docs/superpowers/plans/, open a GitHub PR early and iterate from that PR branch; do not leave the canonical plan only in the harness worktree.\",\r\n ]\r\n : [\r\n \"Plan persistence: use AgentOS API/MCP first; on approval/auth/network/server/interruption failures run `kynver plan persist` (queues under ~/.kynver/state/plan-outbox) then `kynver plan outbox drain` when connectivity returns. Never treat /tmp-only files as persisted plans.\",\r\n \"PR-first plan artifacts (when authoring or revising docs/superpowers/plans/):\",\r\n \"- Before substantial plan drafting: create a feature branch, open a GitHub PR (draft OK), commit and push the plan file \u2014 do not leave the canonical plan only in this harness worktree.\",\r\n \"- Iterate review on that PR branch; link prUrl on the AgentOS task and plan progress evidence (`--evidence pr:<url>`).\",\r\n \"- See docs/superpowers/plans/2026-05-25-pr-first-plan-artifact-preservation.md for the full checklist.\",\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 \"Structured final result (recommended): record completion as JSON with summary, laneExpertise { whatChanged, why, files, prUrls, verification, risks, blockers, lessonsLearned, laneGuidance }, and targetPrReconciliation [{ prUrl, outcome: merged|skipped|blocked, mergeCommit?, reason? }] for every target PR on landing-only tasks.\",\r\n \"Completion handoff (required): before you stop, ensure the harness records a final result \u2014 summarize outcome in your last message and append a heartbeat line with phase `complete`. If you leave uncommitted changes or committed work without a PR, the orchestrator blocks completion until a GitHub PR exists (or you discard/commit cleanly). Exiting with only dirty files and no PR routes to salvage review, not production review.\",\r\n \"PR-ready handoff: for substantial implementation work, commit, push, and open a GitHub PR (draft OK) on your branch before finishing \u2014 or rely on the harness to run `gh pr create` at completion when `gh` is authenticated.\",\r\n \"Worker resource guard: do not run full monorepo verification (`npm run typecheck`, `npm run build`, or equivalent) from this worker lane unless an operator explicitly requests it. Use targeted checks for touched paths and rely on CI/operator lanes for heavy gates.\",\r\n \"If verification fails (including OOM), append a heartbeat line immediately with the last command, failure reason, dirty-file status, commit/PR handoff state, and next action so recovery does not require log spelunking.\",\r\n \"\",\r\n ...progressLines,\r\n \"\",\r\n ...planArtifactLines,\r\n \"\",\r\n ...(input.personaMarkdown?.trim()\r\n ? [input.personaMarkdown.trim(), \"\"]\r\n : []),\r\n ...(input.instructionPolicyMarkdown?.trim()\r\n ? [\"Operating rules (Lane A \u2014 from AgentOS memory policy):\", input.instructionPolicyMarkdown.trim(), \"\"]\r\n : []),\r\n \"Task:\",\r\n input.task,\r\n ].join(\"\\n\");\r\n}\r\n", "import { closeSync, existsSync, openSync } from \"node:fs\";\r\nimport { spawn } from \"node:child_process\";\r\nimport path from \"node:path\";\r\nimport { hiddenSpawnOptions } from \"../util.js\";\r\nimport { preflightCursorModel } from \"./model-preflight.js\";\r\nimport { resolveWindowsCursorBundled } from \"./cursor-windows.js\";\r\nimport type { WorkerProvider } from \"./types.js\";\r\n\r\nconst DEFAULT_CURSOR_MODEL = \"composer-2.5\";\r\n\r\nexport interface CursorSpawnTarget {\r\n executable: string;\r\n prefixArgs: string[];\r\n shell: boolean;\r\n detached: boolean;\r\n bundledVersionDir?: string;\r\n}\r\n\r\nfunction bundledSpawnTarget(nodeExe: string, indexJs: string, versionDir?: string): CursorSpawnTarget {\r\n return {\r\n executable: nodeExe,\r\n prefixArgs: [indexJs],\r\n shell: false,\r\n detached: true,\r\n bundledVersionDir: versionDir,\r\n };\r\n}\r\n\r\n/** Resolve a headless Windows spawn target (node.exe + index.js), never agent.cmd via shell. */\r\nexport function resolveCursorSpawn(agentBin: string): CursorSpawnTarget {\r\n if (process.platform === \"win32\") {\r\n const isCursorWrapper = /\\.(cmd|bat)$/i.test(agentBin);\r\n const isBundledNode =\r\n /node\\.exe$/i.test(agentBin) && existsSync(path.join(path.dirname(agentBin), \"index.js\"));\r\n const isDefaultShim = agentBin === \"agent\";\r\n\r\n if (isCursorWrapper || isBundledNode || isDefaultShim) {\r\n const bundled = isCursorWrapper\r\n ? resolveWindowsCursorBundled(path.dirname(agentBin))\r\n : isBundledNode\r\n ? {\r\n nodeExe: agentBin,\r\n indexJs: path.join(path.dirname(agentBin), \"index.js\"),\r\n versionDir: path.dirname(agentBin),\r\n }\r\n : resolveWindowsCursorBundled();\r\n\r\n if (bundled) {\r\n return bundledSpawnTarget(bundled.nodeExe, bundled.indexJs, bundled.versionDir);\r\n }\r\n\r\n throw new Error(\r\n \"Cursor Agent on Windows has no headless bundled node.exe under %LOCALAPPDATA%\\\\cursor-agent\\\\versions\\\\\u2026. \" +\r\n \"Run `agent login` / update Cursor Agent CLI, use `--provider claude`, or set KYNVER_CURSOR_AGENT_ROOT to the cursor-agent folder.\",\r\n );\r\n }\r\n }\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 bundled = resolveWindowsCursorBundled(\r\n process.env.KYNVER_CURSOR_AGENT_ROOT?.trim() || undefined,\r\n );\r\n if (bundled) return bundled.nodeExe;\r\n\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\nfunction cursorWorkerEnv(agentBin: string, spawnTarget: CursorSpawnTarget): NodeJS.ProcessEnv {\r\n return {\r\n ...process.env,\r\n CI: \"1\",\r\n NO_COLOR: \"1\",\r\n ...(spawnTarget.bundledVersionDir\r\n ? { CURSOR_INVOKED_AS: path.basename(agentBin) || \"agent.cmd\" }\r\n : {}),\r\n };\r\n}\r\n\r\nexport const cursorProvider: WorkerProvider = {\r\n name: \"cursor\",\r\n defaultModel: DEFAULT_CURSOR_MODEL,\r\n preflightModel(model) {\r\n return preflightCursorModel(model, DEFAULT_CURSOR_MODEL);\r\n },\r\n start(opts) {\r\n const preflight = preflightCursorModel(opts.model, DEFAULT_CURSOR_MODEL);\r\n if (!preflight.ok) {\r\n throw new Error(`cursor provider model preflight failed: ${preflight.note}`);\r\n }\r\n const model = preflight.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 hiddenSpawnOptions({\r\n cwd: opts.worktreePath,\r\n detached: spawnTarget.detached,\r\n shell: spawnTarget.shell,\r\n stdio: [\"ignore\", stdoutFd, stderrFd],\r\n env: cursorWorkerEnv(agentBin, spawnTarget),\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 { existsSync, readdirSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\n\r\n/** Match Cursor's agent.ps1 version folders: YYYY.MM.DD-commit */\r\nconst CURSOR_VERSION_DIR = /^\\d{4}\\.\\d{1,2}\\.\\d{1,2}-[a-f0-9]+$/i;\r\n\r\nexport function parseCursorVersionSortKey(versionName: string): number | null {\r\n const datePart = versionName.split(\"-\")[0];\r\n const parts = datePart.split(\".\");\r\n if (parts.length !== 3) return null;\r\n const [year, month, day] = parts;\r\n if (!year || !month || !day) return null;\r\n return Number(`${year}${month.padStart(2, \"0\")}${day.padStart(2, \"0\")}`);\r\n}\r\n\r\nexport function pickLatestCursorVersionDir(agentRoot: string): string | null {\r\n const versionsRoot = path.join(agentRoot, \"versions\");\r\n if (!existsSync(versionsRoot)) return null;\r\n\r\n let bestDir: string | null = null;\r\n let bestKey = -1;\r\n\r\n for (const entry of readdirSync(versionsRoot, { withFileTypes: true })) {\r\n if (!entry.isDirectory() || !CURSOR_VERSION_DIR.test(entry.name)) continue;\r\n const key = parseCursorVersionSortKey(entry.name);\r\n if (key == null || key <= bestKey) continue;\r\n bestKey = key;\r\n bestDir = path.join(versionsRoot, entry.name);\r\n }\r\n\r\n return bestDir;\r\n}\r\n\r\nexport function resolveWindowsCursorBundled(agentRoot?: string): {\r\n nodeExe: string;\r\n indexJs: string;\r\n versionDir: string;\r\n} | null {\r\n const root =\r\n agentRoot?.trim() ||\r\n path.join(process.env.LOCALAPPDATA || \"\", \"cursor-agent\");\r\n\r\n const directNode = path.join(root, \"node.exe\");\r\n const directIndex = path.join(root, \"index.js\");\r\n if (existsSync(directNode) && existsSync(directIndex)) {\r\n return { nodeExe: directNode, indexJs: directIndex, versionDir: root };\r\n }\r\n\r\n const versionDir = pickLatestCursorVersionDir(root);\r\n if (!versionDir) return null;\r\n\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\r\n return { nodeExe, indexJs, versionDir };\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 { hiddenSpawnOptions } from \"./util.js\";\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(\r\n nodeExecutable,\r\n args,\r\n hiddenSpawnOptions({\r\n detached: true,\r\n stdio,\r\n env: process.env,\r\n }),\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 { postJsonWithCredentialRefresh } from \"./callbacks.js\";\r\nimport { loadRun, loadWorker, runDirectory, saveWorker, type HarnessRunRecord } from \"./run-store.js\";\r\nimport { assessExitedWorkerSalvage } from \"./exited-salvage.js\";\r\nimport { ensurePrReadyHandoff } from \"./pr-handoff/index.js\";\r\nimport { computeWorkerStatus, deriveRunStatus, isFinishedWorkerStatus } from \"./status.js\";\r\nimport type {\r\n HarnessWorkerRecord,\r\n InstructionPolicyEvidenceSnapshot,\r\n RawHarnessWorkerStatus,\r\n} from \"./status.js\";\r\nimport { summarizeEvent } from \"./stream.js\";\r\nimport {\r\n hasCompletionAck,\r\n persistCompletionAck,\r\n type CompletionAckFields,\r\n} from \"./completion-ack.js\";\r\nimport { persistCompletionAcknowledged } from \"./worker-lifecycle.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\nfunction asRecord(value: unknown): Record<string, unknown> | null {\r\n return value && typeof value === \"object\" && !Array.isArray(value)\r\n ? (value as Record<string, unknown>)\r\n : null;\r\n}\r\n\r\nfunction asString(value: unknown): string | null {\r\n if (typeof value !== \"string\") return null;\r\n const trimmed = value.trim();\r\n return trimmed.length ? trimmed : null;\r\n}\r\n\r\nfunction deriveLifecycleStage(input: {\r\n finished: boolean;\r\n completionBlocker?: string;\r\n completionOutcome?: string | null;\r\n completionReportedAt?: string | null;\r\n}): string {\r\n if (input.completionBlocker) return `blocked:${input.completionBlocker}`;\r\n if (input.completionOutcome) return input.completionOutcome;\r\n if (input.completionReportedAt) return \"completion_acknowledged\";\r\n if (input.finished) return \"worker_finished\";\r\n return \"in_progress\";\r\n}\r\n\r\nfunction deriveNextAction(input: {\r\n completionBlocker?: string;\r\n completionOutcome?: string | null;\r\n completionReportedAt?: string | null;\r\n finished: boolean;\r\n}): string | null {\r\n if (input.completionBlocker) {\r\n return \"Resolve completion blocker, then rerun `kynver worker complete`.\";\r\n }\r\n if (input.completionOutcome === \"review_scheduled\" || input.completionOutcome === \"review_already_scheduled\") {\r\n return \"Await review lane and landing decision in Command Center.\";\r\n }\r\n if (input.completionOutcome === \"needs_attention\") {\r\n return \"Inspect blocker/attention reason in Command Center and dispatch a repair task.\";\r\n }\r\n if (input.finished && !input.completionReportedAt) {\r\n return \"Post completion acknowledgement to AgentOS (`kynver worker complete`).\";\r\n }\r\n return null;\r\n}\r\n\r\nfunction deriveHandoffState(input: {\r\n changedFiles: string[];\r\n headCommit?: string;\r\n prUrl?: string;\r\n}): \"pr_handoff\" | \"commit_handoff\" | \"dirty_worktree\" | \"none\" {\r\n if (input.prUrl) return \"pr_handoff\";\r\n if (input.headCommit) return \"commit_handoff\";\r\n if (input.changedFiles.length > 0) return \"dirty_worktree\";\r\n return \"none\";\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\nfunction workerStatusOptions(run: HarnessRunRecord | null) {\r\n return run ? { base: run.base, baseCommit: run.baseCommit } : {};\r\n}\r\n\r\nfunction applyPrHandoffToStatus(\r\n status: RawHarnessWorkerStatus,\r\n handoff: { prUrl?: string; headCommit?: string },\r\n): RawHarnessWorkerStatus {\r\n return {\r\n ...status,\r\n ...(handoff.prUrl ? { prUrl: handoff.prUrl } : {}),\r\n ...(handoff.headCommit ? { headCommit: handoff.headCommit } : {}),\r\n };\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 nextAction?: string;\r\n httpStatus?: number;\r\n response?: unknown;\r\n completionBlocked?: boolean;\r\n prHandoff?: { prUrl?: string; created?: boolean };\r\n}> {\r\n const worker = loadWorker(String(args.run), String(args.name));\r\n const run = loadRun(worker.runId);\r\n let status = computeWorkerStatus(worker, workerStatusOptions(run));\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 forceReplay = args.force === true || args.force === \"true\";\r\n if (!forceReplay && hasCompletionAck(worker)) {\r\n return {\r\n ok: true,\r\n skipped: true,\r\n reason: \"completion-already-acknowledged\",\r\n httpStatus: 200,\r\n };\r\n }\r\n\r\n if (worker.localOnly) {\r\n return { ok: true, skipped: true, reason: \"local-only-worker\" };\r\n }\r\n\r\n const skipPrHandoff = args.skipPrHandoff === true || args.skipPrHandoff === \"true\";\r\n if (!skipPrHandoff && worker.dispatched && taskId) {\r\n const handoff = ensurePrReadyHandoff({ worker, run, status });\r\n if (!handoff.ok) {\r\n persistCompletionBlocker(worker, handoff.reason);\r\n return {\r\n ok: false,\r\n reason: handoff.reason,\r\n nextAction: handoff.nextAction,\r\n completionBlocked: true,\r\n };\r\n }\r\n if (handoff.prUrl || handoff.headCommit) {\r\n status = applyPrHandoffToStatus(status, handoff);\r\n }\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: \"kynver-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 workerInjection: {\r\n instructionPolicyFingerprint: worker.instructionPolicyFingerprint ?? null,\r\n instructionPolicyEvidence: worker.instructionPolicyEvidence ?? null,\r\n policyAt:\r\n worker.instructionPolicyEvidence &&\r\n typeof worker.instructionPolicyEvidence === \"object\" &&\r\n \"policyAt\" in worker.instructionPolicyEvidence &&\r\n typeof (worker.instructionPolicyEvidence as { policyAt?: unknown }).policyAt === \"string\"\r\n ? (worker.instructionPolicyEvidence as { policyAt: string }).policyAt\r\n : null,\r\n personaSlug: worker.personaSlug ?? null,\r\n personaEvidence: worker.personaEvidence ?? null,\r\n },\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 const ack: CompletionAckFields = {\r\n completionReportedAt: new Date().toISOString(),\r\n completionOutcome: \"acknowledged\",\r\n completionResponse: result.parsed,\r\n };\r\n persistCompletionAck(worker, worker.runId, ack);\r\n persistCompletionAcknowledged(worker, status, { source: \"harness-completion\" });\r\n const prUrl = status.prUrl;\r\n return {\r\n ok: true,\r\n httpStatus: result.status,\r\n response: result.parsed,\r\n ...(prUrl ? { prHandoff: { prUrl } } : {}),\r\n };\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 run = loadRun(worker.runId);\r\n const status = computeWorkerStatus(worker, workerStatusOptions(run));\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 run = loadRun(worker.runId);\r\n const status = computeWorkerStatus(worker, workerStatusOptions(run));\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 buildRunBoard(runId: string): Record<string, unknown> {\r\n const run = loadRun(runId);\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, {\r\n base: run.base,\r\n baseCommit: run.baseCommit,\r\n });\r\n const headCommit =\r\n status.gitAncestry.headIsAncestorOfBase === false && status.gitAncestry.head\r\n ? status.gitAncestry.head\r\n : undefined;\r\n const exitedSalvage = assessExitedWorkerSalvage({\r\n alive: status.alive,\r\n finalResult: status.finalResult,\r\n changedFiles: status.changedFiles,\r\n gitAncestry: status.gitAncestry,\r\n headCommit,\r\n });\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 const boardStatus = completionBlocker ? \"blocked\" : status.status;\r\n const boardAttention = completionBlocker ? \"blocked\" : status.attention.state;\r\n const completionResponse = asRecord(worker.completionResponse);\r\n const completionTask = asRecord(completionResponse?.task);\r\n const completionOutcome = asString(completionResponse?.outcome);\r\n const completionRouteStatus = asString(completionResponse?.status);\r\n const completionWarnings = Array.isArray(completionResponse?.warnings)\r\n ? completionResponse.warnings.filter((w): w is string => typeof w === \"string\" && w.trim().length > 0)\r\n : [];\r\n const prUrl = asString(completionTask?.prUrl) ?? asString(completionResponse?.prUrl);\r\n const lifecycleStage = deriveLifecycleStage({\r\n finished: isFinishedWorkerStatus(status),\r\n completionBlocker,\r\n completionOutcome,\r\n completionReportedAt: worker.completionReportedAt ?? null,\r\n });\r\n const nextAction = deriveNextAction({\r\n completionBlocker,\r\n completionOutcome,\r\n completionReportedAt: worker.completionReportedAt ?? null,\r\n finished: isFinishedWorkerStatus(status),\r\n });\r\n const handoffState = deriveHandoffState({\r\n changedFiles: status.changedFiles,\r\n headCommit,\r\n prUrl: prUrl ?? undefined,\r\n });\r\n return {\r\n worker: status.worker,\r\n status: boardStatus,\r\n attention: boardAttention,\r\n attentionReason: completionBlocker ?? status.attention.reason,\r\n landingBlocked: status.finalResult\r\n ? boardAttention === \"needs_attention\" || boardAttention === \"blocked\"\r\n : false,\r\n exitedWithoutFinalResult: !status.finalResult && !status.alive,\r\n salvageState: exitedSalvage?.salvageable ? \"review_needed\" : \"none\",\r\n salvageReason: exitedSalvage?.salvageable ? exitedSalvage.attentionReason : undefined,\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 changedFiles: status.changedFiles,\r\n branch: status.branch,\r\n taskId: worker.taskId ?? null,\r\n planId: worker.planId ?? null,\r\n instructionPolicyFingerprint:\r\n typeof worker.instructionPolicyFingerprint === \"string\"\r\n ? worker.instructionPolicyFingerprint\r\n : null,\r\n instructionPolicyRuleCount: (() => {\r\n const raw = worker.instructionPolicyEvidence;\r\n if (!raw || typeof raw !== \"object\") return null;\r\n const slugs = (raw as InstructionPolicyEvidenceSnapshot).ruleSlugs;\r\n return Array.isArray(slugs) ? slugs.length : null;\r\n })(),\r\n leaseOwner: worker.leaseOwner ?? null,\r\n model: typeof worker.model === \"string\" ? worker.model : undefined,\r\n routingRule: typeof worker.routingRule === \"string\" ? worker.routingRule : undefined,\r\n requestedModel: typeof worker.requestedModel === \"string\" ? worker.requestedModel : undefined,\r\n headCommit,\r\n prUrl,\r\n handoffState,\r\n gitAncestry: status.gitAncestry,\r\n finalResult: status.finalResult,\r\n lifecycleStage,\r\n completionReportedAt: worker.completionReportedAt ?? null,\r\n completionOutcome: worker.completionOutcome ?? null,\r\n completionRouteStatus,\r\n completionRouteOutcome: completionOutcome,\r\n completionWarnings,\r\n completionBlocker: completionBlocker ?? null,\r\n checkpoint: {\r\n phase: status.lastHeartbeatPhase,\r\n summary: status.lastHeartbeatSummary,\r\n blocker: status.heartbeatBlocker,\r\n },\r\n lastCommandHint: status.currentTool ?? status.lastHeartbeatSummary,\r\n failureReason: completionBlocker ?? status.error ?? null,\r\n nextAction,\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 return board;\r\n}\r\n\r\nexport async function publishHarnessBoardSnapshot(\r\n args: Record<string, string | boolean>,\r\n source: string,\r\n): Promise<Record<string, unknown> | null> {\r\n const runId = String(args.run || \"\");\r\n const agentOsId = String(args.agentOsId || \"\");\r\n if (!runId || !agentOsId) return null;\r\n const board = buildRunBoard(runId);\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : undefined, agentOsId, {\r\n baseUrl: base,\r\n });\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/harness/snapshot`;\r\n const res = await postJsonWithCredentialRefresh(\r\n url,\r\n secret,\r\n { agentOsId, runId, source, snapshot: board },\r\n { agentOsId, baseUrl: base },\r\n );\r\n return {\r\n ok: res.ok,\r\n httpStatus: res.status,\r\n response: res.response,\r\n authRefreshed: res.refreshedAuth,\r\n authRefreshFailure: res.authRefreshFailure,\r\n };\r\n}\r\n\r\nexport function runStatus(args: Record<string, string | boolean>): void {\r\n const board = buildRunBoard(String(args.run));\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 type { GitAncestry } from \"../git.js\";\r\nimport type { PrHandoffRequirement, PrHandoffSnapshot } from \"./pr-handoff.types.js\";\r\n\r\nconst REVIEW_LANE_RULE = /^(lane:)?(review|deep_review|planning|landing)(:|$)/i;\r\n\r\nfunction trimOrNull(value: unknown): string | null {\r\n if (typeof value !== \"string\") return null;\r\n const trimmed = value.trim();\r\n return trimmed.length ? trimmed : null;\r\n}\r\n\r\nfunction committedHead(ancestry: GitAncestry | null | undefined): string | null {\r\n if (!ancestry?.checked) return null;\r\n if (ancestry.headIsAncestorOfBase !== false) return null;\r\n return trimOrNull(ancestry.head);\r\n}\r\n\r\n/** Best-effort PR URL from free text (completion summary / final result). */\r\nexport function extractPrUrlFromText(value: unknown): string | null {\r\n if (value === undefined || value === null) return null;\r\n const text =\r\n typeof value === \"string\"\r\n ? value\r\n : typeof value === \"object\" && value !== null && \"summary\" in value\r\n ? String((value as { summary?: unknown }).summary ?? \"\")\r\n : JSON.stringify(value);\r\n const m = text.match(\r\n /https?:\\/\\/[^\\s)>\"]+\\/(?:pull|pulls|merge_requests|pull-requests)\\/\\d+/i,\r\n );\r\n return m ? trimOrNull(m[0]) : null;\r\n}\r\n\r\nfunction hasWorkProduct(snapshot: Pick<PrHandoffSnapshot, \"changedFiles\" | \"headCommit\" | \"gitAncestry\">): boolean {\r\n if (snapshot.changedFiles.length > 0) return true;\r\n if (trimOrNull(snapshot.headCommit)) return true;\r\n if (committedHead(snapshot.gitAncestry)) return true;\r\n return false;\r\n}\r\n\r\n/**\r\n * Board-dispatched implementation workers with code changes must land with a PR\r\n * URL before AgentOS completion is posted.\r\n */\r\nexport function assessPrHandoffRequirement(input: {\r\n dispatched?: boolean;\r\n routingRule?: string | null;\r\n prUrl?: string | null;\r\n patchPath?: string | null;\r\n artifactBundlePath?: string | null;\r\n snapshot: PrHandoffSnapshot;\r\n}): PrHandoffRequirement {\r\n if (!input.dispatched) {\r\n return { required: false, reason: \"not_dispatched\" };\r\n }\r\n\r\n const rule = trimOrNull(input.routingRule) ?? \"\";\r\n if (rule && REVIEW_LANE_RULE.test(rule)) {\r\n return { required: false, reason: \"review_lane\" };\r\n }\r\n\r\n if (trimOrNull(input.patchPath) || trimOrNull(input.artifactBundlePath)) {\r\n return { required: false, reason: \"patch_or_bundle\" };\r\n }\r\n\r\n const prUrl = trimOrNull(input.prUrl) ?? trimOrNull(input.snapshot.prUrl);\r\n if (prUrl) {\r\n return { required: false, reason: \"already_has_pr\" };\r\n }\r\n\r\n if (!hasWorkProduct(input.snapshot)) {\r\n return { required: false, reason: \"no_work_product\" };\r\n }\r\n\r\n return { required: true, snapshot: input.snapshot };\r\n}\r\n\r\nexport function buildPrHandoffSnapshotFromStatus(\r\n status: {\r\n changedFiles: string[];\r\n branch: string;\r\n worktreePath: string;\r\n gitAncestry: GitAncestry;\r\n finalResult: unknown;\r\n },\r\n extras?: { prUrl?: string | null; headCommit?: string | null },\r\n): PrHandoffSnapshot {\r\n return {\r\n changedFiles: status.changedFiles,\r\n branch: status.branch,\r\n worktreePath: status.worktreePath,\r\n gitAncestry: status.gitAncestry,\r\n finalResult: status.finalResult,\r\n headCommit: trimOrNull(extras?.headCommit) ?? committedHead(status.gitAncestry),\r\n prUrl: trimOrNull(extras?.prUrl) ?? null,\r\n };\r\n}\r\n", "import { spawnSync } from \"node:child_process\";\r\nimport { gitCapture } from \"../git.js\";\r\n\r\nexport interface CommandCapture {\r\n status: number | null;\r\n stdout: string;\r\n stderr: string;\r\n error: string | null;\r\n}\r\n\r\nexport interface PrHandoffExec {\r\n git: (cwd: string, args: string[]) => CommandCapture;\r\n gh: (cwd: string, args: string[]) => CommandCapture;\r\n}\r\n\r\nfunction capture(bin: string, cwd: string, args: string[]): CommandCapture {\r\n try {\r\n const res = spawnSync(bin, args, { cwd, encoding: \"utf8\" });\r\n return {\r\n status: res.status,\r\n stdout: (res.stdout || \"\").trim(),\r\n stderr: (res.stderr || \"\").trim(),\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 const defaultPrHandoffExec: PrHandoffExec = {\r\n git: (cwd, args) => gitCapture(cwd, args),\r\n gh: (cwd, args) => capture(\"gh\", cwd, args),\r\n};\r\n\r\nfunction parseGithubRepo(remoteUrl: string): string | null {\r\n const trimmed = remoteUrl.trim();\r\n const ssh = trimmed.match(/git@github\\.com:([^/]+\\/[^/.]+)(?:\\.git)?/i);\r\n if (ssh) return ssh[1];\r\n const https = trimmed.match(/github\\.com[/:]([^/]+\\/[^/.]+?)(?:\\.git)?/i);\r\n if (https) return https[1];\r\n return null;\r\n}\r\n\r\nfunction firstLine(text: string): string {\r\n return text.split(\"\\n\").map((l) => l.trim()).find(Boolean) ?? \"\";\r\n}\r\n\r\nexport function resolveGithubRepo(worktreePath: string, exec: PrHandoffExec): string | null {\r\n const remote = exec.git(worktreePath, [\"remote\", \"get-url\", \"origin\"]);\r\n if (remote.status !== 0) return null;\r\n return parseGithubRepo(remote.stdout);\r\n}\r\n\r\nexport function resolveHeadCommit(worktreePath: string, exec: PrHandoffExec): string | null {\r\n const head = exec.git(worktreePath, [\"rev-parse\", \"HEAD\"]);\r\n if (head.status !== 0) return null;\r\n return head.stdout.trim() || null;\r\n}\r\n\r\n/** Look up an open PR for this head branch. */\r\nexport function findOpenPrUrl(\r\n worktreePath: string,\r\n repo: string,\r\n branch: string,\r\n exec: PrHandoffExec,\r\n): string | null {\r\n const listed = exec.gh(worktreePath, [\r\n \"pr\",\r\n \"list\",\r\n \"--repo\",\r\n repo,\r\n \"--head\",\r\n branch,\r\n \"--state\",\r\n \"open\",\r\n \"--json\",\r\n \"url\",\r\n \"--limit\",\r\n \"1\",\r\n ]);\r\n if (listed.status !== 0) return null;\r\n try {\r\n const rows = JSON.parse(listed.stdout) as Array<{ url?: string }>;\r\n const url = rows[0]?.url?.trim();\r\n return url || null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport interface CommitAndPushResult {\r\n ok: boolean;\r\n committed: boolean;\r\n pushed: boolean;\r\n headCommit?: string;\r\n detail?: string;\r\n}\r\n\r\nexport function commitAndPushBranch(input: {\r\n worktreePath: string;\r\n branch: string;\r\n commitMessage: string;\r\n hasDirtyFiles: boolean;\r\n exec: PrHandoffExec;\r\n}): CommitAndPushResult {\r\n const { worktreePath, branch, commitMessage, hasDirtyFiles, exec } = input;\r\n\r\n if (hasDirtyFiles) {\r\n const add = exec.git(worktreePath, [\"add\", \"-A\"]);\r\n if (add.status !== 0) {\r\n return {\r\n ok: false,\r\n committed: false,\r\n pushed: false,\r\n detail: add.stderr || add.stdout || add.error || \"git add failed\",\r\n };\r\n }\r\n const commit = exec.git(worktreePath, [\"commit\", \"-m\", commitMessage]);\r\n if (commit.status !== 0) {\r\n return {\r\n ok: false,\r\n committed: false,\r\n pushed: false,\r\n detail: commit.stderr || commit.stdout || commit.error || \"git commit failed\",\r\n };\r\n }\r\n }\r\n\r\n const push = exec.git(worktreePath, [\"push\", \"-u\", \"origin\", branch]);\r\n if (push.status !== 0) {\r\n return {\r\n ok: false,\r\n committed: hasDirtyFiles,\r\n pushed: false,\r\n detail: push.stderr || push.stdout || push.error || \"git push failed\",\r\n };\r\n }\r\n\r\n const headCommit = resolveHeadCommit(worktreePath, exec) ?? undefined;\r\n return {\r\n ok: true,\r\n committed: hasDirtyFiles,\r\n pushed: true,\r\n headCommit,\r\n };\r\n}\r\n\r\nexport interface CreatePrResult {\r\n ok: boolean;\r\n prUrl?: string;\r\n created?: boolean;\r\n detail?: string;\r\n}\r\n\r\nexport function createGithubPr(input: {\r\n worktreePath: string;\r\n repo: string;\r\n branch: string;\r\n base: string;\r\n title: string;\r\n body: string;\r\n exec: PrHandoffExec;\r\n}): CreatePrResult {\r\n const existing = findOpenPrUrl(input.worktreePath, input.repo, input.branch, input.exec);\r\n if (existing) {\r\n return { ok: true, prUrl: existing, created: false };\r\n }\r\n\r\n const created = input.exec.gh(input.worktreePath, [\r\n \"pr\",\r\n \"create\",\r\n \"--repo\",\r\n input.repo,\r\n \"--base\",\r\n input.base,\r\n \"--head\",\r\n input.branch,\r\n \"--title\",\r\n input.title,\r\n \"--body\",\r\n input.body,\r\n \"--draft\",\r\n ]);\r\n if (created.status !== 0) {\r\n return {\r\n ok: false,\r\n detail: created.stderr || created.stdout || created.error || \"gh pr create failed\",\r\n };\r\n }\r\n\r\n const url =\r\n extractPrUrlFromGhOutput(created.stdout) ??\r\n findOpenPrUrl(input.worktreePath, input.repo, input.branch, input.exec);\r\n if (!url) {\r\n return { ok: false, detail: \"gh pr create succeeded but no PR URL was parsed\" };\r\n }\r\n return { ok: true, prUrl: url, created: true };\r\n}\r\n\r\nfunction extractPrUrlFromGhOutput(stdout: string): string | null {\r\n const line = firstLine(stdout);\r\n const m = line.match(/https?:\\/\\/[^\\s]+\\/pull\\/\\d+/i);\r\n return m ? m[0] : null;\r\n}\r\n", "import {\r\n assessPrHandoffRequirement,\r\n buildPrHandoffSnapshotFromStatus,\r\n extractPrUrlFromText,\r\n} from \"./pr-handoff-assess.js\";\r\nimport {\r\n commitAndPushBranch,\r\n createGithubPr,\r\n defaultPrHandoffExec,\r\n findOpenPrUrl,\r\n resolveGithubRepo,\r\n resolveHeadCommit,\r\n type PrHandoffExec,\r\n} from \"./pr-handoff-gh.js\";\r\nimport type { EnsurePrHandoffInput, EnsurePrHandoffResult } from \"./pr-handoff.types.js\";\r\n\r\nfunction ghAvailable(exec: PrHandoffExec): boolean {\r\n const probe = exec.gh(process.cwd(), [\"--version\"]);\r\n return probe.status === 0;\r\n}\r\n\r\nfunction defaultPrTitle(workerName: string, runId: string): string {\r\n return `AgentOS harness: ${workerName} (${runId})`;\r\n}\r\n\r\nfunction defaultPrBody(taskId: string | undefined, workerName: string, runId: string): string {\r\n return [\r\n \"Automated PR-ready handoff from the Kynver harness runtime.\",\r\n \"\",\r\n taskId ? `AgentOS task: \\`${taskId}\\`` : \"\",\r\n `Harness worker: \\`${workerName}\\` \u00B7 run \\`${runId}\\``,\r\n \"\",\r\n \"Opened by orchestrator completion enforcement so production review receives a reviewable artifact.\",\r\n ]\r\n .filter(Boolean)\r\n .join(\"\\n\");\r\n}\r\n\r\n/**\r\n * Ensure a board-dispatched implementation worker has a GitHub PR before completion\r\n * is posted to AgentOS. Commits dirty trees, pushes the branch, and runs\r\n * `gh pr create` when needed.\r\n */\r\nexport function ensurePrReadyHandoff(\r\n input: EnsurePrHandoffInput,\r\n exec: PrHandoffExec = defaultPrHandoffExec,\r\n): EnsurePrHandoffResult {\r\n const prUrlHint =\r\n input.prUrlHint ?? extractPrUrlFromText(input.status.finalResult) ?? null;\r\n\r\n const snapshot = buildPrHandoffSnapshotFromStatus(input.status, {\r\n prUrl: prUrlHint,\r\n headCommit: null,\r\n });\r\n\r\n const requirement = assessPrHandoffRequirement({\r\n dispatched: input.worker.dispatched,\r\n routingRule: input.worker.routingRule,\r\n prUrl: prUrlHint,\r\n snapshot,\r\n });\r\n\r\n if (!requirement.required) {\r\n return { ok: true, prUrl: prUrlHint ?? undefined };\r\n }\r\n\r\n if (prUrlHint) {\r\n return { ok: true, prUrl: prUrlHint };\r\n }\r\n\r\n if (!ghAvailable(exec)) {\r\n const dirty = snapshot.changedFiles.length;\r\n const detail = dirty\r\n ? `${dirty} uncommitted change(s) with no PR URL`\r\n : \"committed branch with no PR URL\";\r\n return {\r\n ok: false,\r\n reason: `PR-ready handoff blocked: ${detail}`,\r\n nextAction:\r\n \"Install and authenticate GitHub CLI (`gh auth login`), then commit, push, and run `gh pr create` (or rerun `kynver worker complete` after the PR exists).\",\r\n };\r\n }\r\n\r\n const repo = resolveGithubRepo(snapshot.worktreePath, exec);\r\n if (!repo) {\r\n return {\r\n ok: false,\r\n reason: \"PR-ready handoff blocked: could not resolve github.com origin for the worktree\",\r\n nextAction:\r\n \"Ensure `origin` points at GitHub, push the branch, open a PR, and rerun `kynver worker complete`.\",\r\n };\r\n }\r\n\r\n const existing = findOpenPrUrl(snapshot.worktreePath, repo, snapshot.branch, exec);\r\n if (existing) {\r\n return {\r\n ok: true,\r\n prUrl: existing,\r\n headCommit: snapshot.headCommit ?? resolveHeadCommit(snapshot.worktreePath, exec) ?? undefined,\r\n };\r\n }\r\n\r\n const hasDirty = snapshot.changedFiles.length > 0;\r\n\r\n let committed = false;\r\n let pushed = false;\r\n let headCommit = snapshot.headCommit ?? undefined;\r\n\r\n const pushResult = commitAndPushBranch({\r\n worktreePath: snapshot.worktreePath,\r\n branch: snapshot.branch,\r\n commitMessage: `chore(harness): PR-ready handoff for ${input.worker.name}`,\r\n hasDirtyFiles: hasDirty,\r\n exec,\r\n });\r\n if (hasDirty && !pushResult.ok) {\r\n return {\r\n ok: false,\r\n reason: `PR-ready handoff blocked: ${pushResult.detail ?? \"git commit/push failed\"}`,\r\n nextAction:\r\n \"Commit and push the branch, run `gh pr create`, then rerun `kynver worker complete`.\",\r\n };\r\n }\r\n if (!hasDirty) {\r\n const pushOnly = exec.git(snapshot.worktreePath, [\"push\", \"-u\", \"origin\", snapshot.branch]);\r\n if (pushOnly.status !== 0 && !/already up to date/i.test(pushOnly.stderr || pushOnly.stdout)) {\r\n return {\r\n ok: false,\r\n reason: `PR-ready handoff blocked: ${pushOnly.stderr || pushOnly.stdout || pushOnly.error || \"git push failed\"}`,\r\n nextAction:\r\n \"Push the branch to origin, run `gh pr create`, then rerun `kynver worker complete`.\",\r\n };\r\n }\r\n pushed = pushOnly.status === 0;\r\n } else {\r\n committed = pushResult.committed;\r\n pushed = pushResult.pushed;\r\n if (!pushResult.ok) {\r\n return {\r\n ok: false,\r\n reason: `PR-ready handoff blocked: ${pushResult.detail ?? \"git push failed\"}`,\r\n nextAction:\r\n \"Fix git auth or merge conflicts, push the branch, run `gh pr create`, then rerun `kynver worker complete`.\",\r\n };\r\n }\r\n }\r\n headCommit =\r\n pushResult.headCommit ?? headCommit ?? resolveHeadCommit(snapshot.worktreePath, exec) ?? undefined;\r\n\r\n const base = input.run.base?.trim() || \"main\";\r\n const pr = createGithubPr({\r\n worktreePath: snapshot.worktreePath,\r\n repo,\r\n branch: snapshot.branch,\r\n base: base.replace(/^origin\\//, \"\"),\r\n title: defaultPrTitle(input.worker.name, input.worker.runId),\r\n body: defaultPrBody(input.worker.taskId, input.worker.name, input.worker.runId),\r\n exec,\r\n });\r\n\r\n if (!pr.ok || !pr.prUrl) {\r\n const dirty = snapshot.changedFiles.length;\r\n const detail = dirty\r\n ? `${dirty} uncommitted change(s) and no PR URL after handoff attempt`\r\n : \"no PR URL after handoff attempt\";\r\n return {\r\n ok: false,\r\n reason: `PR-ready handoff blocked: ${detail}${pr.detail ? ` (${pr.detail})` : \"\"}`,\r\n nextAction:\r\n \"Run `gh pr create` on the worker branch (or fix `gh` auth), attach the PR URL to the task, then rerun `kynver worker complete`.\",\r\n };\r\n }\r\n\r\n return {\r\n ok: true,\r\n prUrl: pr.prUrl,\r\n headCommit: headCommit ?? undefined,\r\n committed,\r\n pushed,\r\n created: pr.created,\r\n };\r\n}\r\n", "import type { HarnessWorkerRecord } from \"./status.js\";\r\nimport { saveWorker } from \"./run-store.js\";\r\n\r\nexport type CompletionOutcome = \"acknowledged\" | \"skipped_already_acked\" | \"structural_blocker\";\r\n\r\nexport interface CompletionAckFields {\r\n completionReportedAt: string;\r\n completionOutcome: \"acknowledged\" | \"rejected\";\r\n completionResponse?: unknown;\r\n}\r\n\r\nexport function hasCompletionAck(worker: HarnessWorkerRecord): boolean {\r\n return Boolean(worker.completionReportedAt?.trim());\r\n}\r\n\r\nexport function persistCompletionAck(\r\n worker: HarnessWorkerRecord,\r\n runId: string,\r\n fields: CompletionAckFields,\r\n): void {\r\n worker.completionReportedAt = fields.completionReportedAt;\r\n worker.completionOutcome = fields.completionOutcome;\r\n if (fields.completionResponse !== undefined) {\r\n worker.completionResponse = fields.completionResponse;\r\n }\r\n saveWorker(runId, worker);\r\n}\r\n\r\nexport function clearCompletionAck(worker: HarnessWorkerRecord, runId: string): void {\r\n delete worker.completionReportedAt;\r\n delete worker.completionOutcome;\r\n delete worker.completionResponse;\r\n saveWorker(runId, worker);\r\n}\r\n", "import path from \"node:path\";\r\nimport { loadRun, runDirectory, saveWorker } from \"./run-store.js\";\r\nimport type { HarnessWorkerRecord, RawHarnessWorkerStatus } from \"./status.js\";\r\nimport { computeWorkerStatus } from \"./status.js\";\r\nimport { readJson, safeSlug } from \"./util.js\";\r\n\r\n/** Board task statuses that mean the harness worker's execution slice is over. */\r\nconst TASK_LEFT_RUNNING = new Set([\r\n \"awaiting_review\",\r\n \"blocked\",\r\n \"done\",\r\n \"needs_input\",\r\n \"waiting\",\r\n \"scheduled\",\r\n \"ready\",\r\n \"cancelled\",\r\n \"failed\",\r\n]);\r\n\r\nexport interface CompletionSnapshot {\r\n finalResult?: unknown;\r\n prUrl?: string | null;\r\n summary?: string | null;\r\n}\r\n\r\nexport function isCompletionAcknowledged(worker: HarnessWorkerRecord): boolean {\r\n return Boolean(\r\n typeof worker.completionReportedAt === \"string\" && worker.completionReportedAt.trim(),\r\n );\r\n}\r\n\r\nexport function completionSnapshotFromStatus(\r\n status: RawHarnessWorkerStatus,\r\n): CompletionSnapshot {\r\n const summary =\r\n typeof status.lastHeartbeatSummary === \"string\" ? status.lastHeartbeatSummary : null;\r\n return {\r\n finalResult: status.finalResult ?? summary ?? \"completed\",\r\n summary,\r\n };\r\n}\r\n\r\n/**\r\n * Persist local terminal lifecycle after AgentOS acknowledges harness completion.\r\n * Prevents a later PID reuse or still-running wrapper from re-reporting the worker\r\n * as `running` once the board task has advanced.\r\n */\r\nexport function persistCompletionAcknowledged(\r\n worker: HarnessWorkerRecord,\r\n status: RawHarnessWorkerStatus,\r\n opts?: { source?: string },\r\n): void {\r\n if (\r\n isCompletionAcknowledged(worker) &&\r\n worker.status === \"done\" &&\r\n worker.completionSnapshot != null\r\n ) {\r\n return;\r\n }\r\n const at = new Date().toISOString();\r\n const snapshot = completionSnapshotFromStatus(status);\r\n const source = opts?.source?.trim();\r\n worker.completionReportedAt = at;\r\n worker.completionSnapshot = snapshot;\r\n worker.status = \"done\";\r\n if (source) worker.completionAckSource = source;\r\n saveWorker(worker.runId, worker);\r\n}\r\n\r\ninterface OperatorTickTaskRow {\r\n kind?: string;\r\n id?: string;\r\n taskStatus?: string | null;\r\n}\r\n\r\nfunction taskStatusByIdFromOperatorTick(operatorTick: unknown): Map<string, string> {\r\n const map = new Map<string, string>();\r\n const body = operatorTick as { response?: { tick?: { filteredItems?: OperatorTickTaskRow[] } } };\r\n const items = body.response?.tick?.filteredItems;\r\n if (!Array.isArray(items)) return map;\r\n for (const item of items) {\r\n if (item.kind !== \"task\" || typeof item.id !== \"string\") continue;\r\n const status = typeof item.taskStatus === \"string\" ? item.taskStatus.trim() : \"\";\r\n if (status) map.set(item.id, status);\r\n }\r\n return map;\r\n}\r\n\r\n/**\r\n * When the board task has left `running` but the local worker still looks live\r\n * (common after server-side completion reconcile), mirror the terminal lifecycle\r\n * on disk so harness status matches AgentOS.\r\n */\r\nexport function syncCompletionAcknowledgedFromOperatorTick(\r\n runId: string,\r\n operatorTick: unknown,\r\n): Array<{ worker: string; taskId: string; taskStatus: string }> {\r\n const taskStatusById = taskStatusByIdFromOperatorTick(operatorTick);\r\n if (taskStatusById.size === 0) return [];\r\n\r\n const run = loadRun(runId);\r\n const synced: Array<{ worker: string; taskId: string; taskStatus: string }> = [];\r\n\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?.taskId || isCompletionAcknowledged(worker)) continue;\r\n\r\n const taskStatus = taskStatusById.get(worker.taskId);\r\n if (!taskStatus || taskStatus === \"running\" || !TASK_LEFT_RUNNING.has(taskStatus)) {\r\n continue;\r\n }\r\n\r\n const status = computeWorkerStatus(worker, { base: run.base, baseCommit: run.baseCommit });\r\n persistCompletionAcknowledged(worker, status, {\r\n source: `board-task-${taskStatus}`,\r\n });\r\n synced.push({ worker: name, taskId: worker.taskId, taskStatus });\r\n }\r\n\r\n return synced;\r\n}\r\n\r\n/** Reload helper for callers that already hold a worker name. */\r\nexport function acknowledgeWorkerIfBoardTaskAdvanced(\r\n runId: string,\r\n workerName: string,\r\n operatorTick: unknown,\r\n): boolean {\r\n const synced = syncCompletionAcknowledgedFromOperatorTick(runId, operatorTick);\r\n return synced.some((row) => row.worker === workerName);\r\n}\r\n", "import { createHash } from \"node:crypto\";\r\n\r\n/** Stable hash for readback verification (normalized trailing whitespace). */\r\nexport function hashPlanBody(body: string): string {\r\n const normalized = body.replace(/\\r\\n/g, \"\\n\").trimEnd();\r\n return createHash(\"sha256\").update(normalized, \"utf8\").digest(\"hex\");\r\n}\r\n\r\nexport function hashSummary(summary: string | null | undefined): string | null {\r\n if (summary == null) return null;\r\n const trimmed = summary.trim();\r\n if (!trimmed) return null;\r\n return createHash(\"sha256\").update(trimmed, \"utf8\").digest(\"hex\");\r\n}\r\n", "import type { PlanPersistFailureKind } from \"./types.js\";\r\n\r\nexport class PlanPersistError extends Error {\r\n readonly kind: PlanPersistFailureKind;\r\n readonly httpStatus?: number;\r\n\r\n constructor(kind: PlanPersistFailureKind, message: string, httpStatus?: number) {\r\n super(message);\r\n this.name = \"PlanPersistError\";\r\n this.kind = kind;\r\n this.httpStatus = httpStatus;\r\n }\r\n}\r\n\r\nexport function classifyHttpFailure(status: number, message: string): PlanPersistError {\r\n if (status === 401 || status === 403) {\r\n return new PlanPersistError(\"auth\", message, status);\r\n }\r\n if (status >= 500) {\r\n return new PlanPersistError(\"server\", message, status);\r\n }\r\n return new PlanPersistError(\"permanent\", message, status);\r\n}\r\n\r\nexport function classifyFetchFailure(err: unknown): PlanPersistError {\r\n const message = err instanceof Error ? err.message : String(err);\r\n if (/ECONNREFUSED|ENOTFOUND|ETIMEDOUT|fetch failed|network/i.test(message)) {\r\n return new PlanPersistError(\"network\", message);\r\n }\r\n return new PlanPersistError(\"tool_interruption\", message);\r\n}\r\n\r\nexport function isRetryableFailure(kind: PlanPersistFailureKind): boolean {\r\n return kind !== \"permanent\";\r\n}\r\n", "import { loadApiKey, resolveBaseUrl } from \"../config.js\";\r\nimport { classifyFetchFailure, classifyHttpFailure, PlanPersistError } from \"./errors.js\";\r\nimport type { PersistPlanInput, PlanPersistSourceRefs } from \"./types.js\";\r\n\r\nexport interface AgentOsPlanGetPayload {\r\n plan: {\r\n id: string;\r\n title: string;\r\n summary: string | null;\r\n currentVersionId: string | null;\r\n };\r\n currentVersion: {\r\n id: string;\r\n versionNumber: number;\r\n title: string;\r\n body: string;\r\n summary: string | null;\r\n } | null;\r\n}\r\n\r\nexport interface AgentOsWriteResult {\r\n planId: string;\r\n versionId: string | null;\r\n versionNumber: number | null;\r\n}\r\n\r\nexport interface AgentOsApiDeps {\r\n baseUrl?: string;\r\n apiKey?: string;\r\n fetchFn?: typeof fetch;\r\n}\r\n\r\nfunction authHeaders(apiKey: string | undefined): Record<string, string> {\r\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\r\n if (apiKey) headers.Authorization = `Bearer ${apiKey}`;\r\n return headers;\r\n}\r\n\r\nasync function parseJsonResponse(res: Response): Promise<unknown> {\r\n const text = await res.text();\r\n try {\r\n return JSON.parse(text);\r\n } catch {\r\n return text;\r\n }\r\n}\r\n\r\nexport async function agentOsGetPlan(\r\n slug: string,\r\n planId: string,\r\n deps: AgentOsApiDeps = {},\r\n): Promise<AgentOsPlanGetPayload> {\r\n const base = resolveBaseUrl(deps.baseUrl);\r\n const apiKey = deps.apiKey ?? loadApiKey();\r\n const fetchFn = deps.fetchFn ?? fetch;\r\n const url = `${base}/api/agent-os/${encodeURIComponent(slug)}/plans/${encodeURIComponent(planId)}`;\r\n\r\n try {\r\n const res = await fetchFn(url, { method: \"GET\", headers: authHeaders(apiKey) });\r\n const parsed = await parseJsonResponse(res);\r\n if (!res.ok) {\r\n const msg =\r\n typeof parsed === \"object\" && parsed && \"error\" in parsed\r\n ? String((parsed as { error: unknown }).error)\r\n : `GET plan failed (${res.status})`;\r\n throw classifyHttpFailure(res.status, msg);\r\n }\r\n return parsed as AgentOsPlanGetPayload;\r\n } catch (err) {\r\n if (err instanceof PlanPersistError) throw err;\r\n throw classifyFetchFailure(err);\r\n }\r\n}\r\n\r\nexport async function agentOsWritePlan(\r\n input: PersistPlanInput,\r\n deps: AgentOsApiDeps = {},\r\n): Promise<AgentOsWriteResult> {\r\n const base = resolveBaseUrl(deps.baseUrl);\r\n const apiKey = deps.apiKey ?? loadApiKey();\r\n const fetchFn = deps.fetchFn ?? fetch;\r\n const slug = input.agentOsSlug;\r\n\r\n try {\r\n if (input.operation === \"create\") {\r\n const url = `${base}/api/agent-os/${encodeURIComponent(slug)}/plans`;\r\n const body = {\r\n title: input.title,\r\n summary: input.summary ?? null,\r\n slug: input.planSlug ?? null,\r\n sourceRefs: mergeSourceRefs(input),\r\n initialVersion: {\r\n title: input.title,\r\n body: input.body,\r\n summary: input.summary ?? null,\r\n changeSummary: input.changeSummary ?? null,\r\n author: input.author ?? null,\r\n sourceRefs: mergeSourceRefs(input),\r\n },\r\n };\r\n const res = await fetchFn(url, {\r\n method: \"POST\",\r\n headers: authHeaders(apiKey),\r\n body: JSON.stringify(body),\r\n });\r\n const parsed = await parseJsonResponse(res);\r\n if (!res.ok) {\r\n const msg =\r\n typeof parsed === \"object\" && parsed && \"error\" in parsed\r\n ? String((parsed as { error: unknown }).error)\r\n : `create plan failed (${res.status})`;\r\n throw classifyHttpFailure(res.status, msg);\r\n }\r\n const row = parsed as { plan: { id: string }; version: { id: string; versionNumber: number } };\r\n return {\r\n planId: row.plan.id,\r\n versionId: row.version.id,\r\n versionNumber: row.version.versionNumber,\r\n };\r\n }\r\n\r\n const planId = input.planId;\r\n if (!planId) throw new PlanPersistError(\"permanent\", \"planId is required for this operation\");\r\n\r\n if (input.operation === \"update_metadata\") {\r\n const url = `${base}/api/agent-os/${encodeURIComponent(slug)}/plans/${encodeURIComponent(planId)}`;\r\n const body: Record<string, unknown> = {\r\n title: input.title,\r\n summary: input.summary ?? null,\r\n sourceRefs: mergeSourceRefs(input),\r\n };\r\n const res = await fetchFn(url, {\r\n method: \"PATCH\",\r\n headers: authHeaders(apiKey),\r\n body: JSON.stringify(body),\r\n });\r\n const parsed = await parseJsonResponse(res);\r\n if (!res.ok) {\r\n const msg =\r\n typeof parsed === \"object\" && parsed && \"error\" in parsed\r\n ? String((parsed as { error: unknown }).error)\r\n : `update plan failed (${res.status})`;\r\n throw classifyHttpFailure(res.status, msg);\r\n }\r\n const row = parsed as { id: string; currentVersionId: string | null };\r\n return {\r\n planId: row.id,\r\n versionId: row.currentVersionId,\r\n versionNumber: null,\r\n };\r\n }\r\n\r\n const url = `${base}/api/agent-os/${encodeURIComponent(slug)}/plans/${encodeURIComponent(planId)}/versions`;\r\n const body = {\r\n title: input.title,\r\n body: input.body,\r\n summary: input.summary ?? null,\r\n changeSummary: input.changeSummary ?? null,\r\n author: input.author ?? null,\r\n sourceRefs: mergeSourceRefs(input),\r\n markCurrent: input.markCurrent !== false,\r\n };\r\n const res = await fetchFn(url, {\r\n method: \"POST\",\r\n headers: authHeaders(apiKey),\r\n body: JSON.stringify(body),\r\n });\r\n const parsed = await parseJsonResponse(res);\r\n if (!res.ok) {\r\n const msg =\r\n typeof parsed === \"object\" && parsed && \"error\" in parsed\r\n ? String((parsed as { error: unknown }).error)\r\n : `add version failed (${res.status})`;\r\n throw classifyHttpFailure(res.status, msg);\r\n }\r\n const row = parsed as { version: { id: string; versionNumber: number; planId: string } };\r\n return {\r\n planId: row.version.planId,\r\n versionId: row.version.id,\r\n versionNumber: row.version.versionNumber,\r\n };\r\n } catch (err) {\r\n if (err instanceof PlanPersistError) throw err;\r\n throw classifyFetchFailure(err);\r\n }\r\n}\r\n\r\nfunction mergeSourceRefs(input: PersistPlanInput): PlanPersistSourceRefs | null {\r\n const refs: PlanPersistSourceRefs = { ...(input.sourceRefs ?? {}) };\r\n if (input.model) refs.model = input.model;\r\n if (!Object.keys(refs).length) return input.sourceRefs ?? null;\r\n return refs;\r\n}\r\n", "import { createHash } from \"node:crypto\";\r\nimport type { PersistPlanInput } from \"./types.js\";\r\nimport { hashPlanBody, hashSummary } from \"./body-hash.js\";\r\n\r\nexport function buildPlanPersistIdempotencyKey(input: PersistPlanInput): string {\r\n const payload = {\r\n operation: input.operation,\r\n agentOsSlug: input.agentOsSlug,\r\n planId: input.planId ?? null,\r\n planSlug: input.planSlug ?? null,\r\n title: input.title.trim(),\r\n summaryHash: hashSummary(input.summary),\r\n bodyHash: hashPlanBody(input.body),\r\n changeSummary: input.changeSummary?.trim() ?? null,\r\n markCurrent: input.markCurrent ?? true,\r\n };\r\n return createHash(\"sha256\").update(JSON.stringify(payload), \"utf8\").digest(\"hex\");\r\n}\r\n", "import { existsSync, mkdirSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\n\r\nexport function resolveKynverStateRoot(): string {\r\n const env = process.env.KYNVER_STATE_ROOT;\r\n if (env) return path.resolve(env);\r\n return path.join(homedir(), \".kynver\", \"state\");\r\n}\r\n\r\nexport function planOutboxDir(): string {\r\n return path.join(resolveKynverStateRoot(), \"plan-outbox\");\r\n}\r\n\r\nexport function planOutboxArchiveDir(): string {\r\n return path.join(resolveKynverStateRoot(), \"plan-outbox-archive\");\r\n}\r\n\r\nexport function ensurePlanOutboxDirs(): { outboxDir: string; archiveDir: string } {\r\n const outboxDir = planOutboxDir();\r\n const archiveDir = planOutboxArchiveDir();\r\n mkdirSync(outboxDir, { recursive: true });\r\n mkdirSync(archiveDir, { recursive: true });\r\n return { outboxDir, archiveDir };\r\n}\r\n\r\nexport function isTmpOnlyPath(filePath: string): boolean {\r\n const resolved = path.resolve(filePath);\r\n return resolved.startsWith(\"/tmp/\") || resolved.startsWith(path.join(\"/var\", \"folders\"));\r\n}\r\n", "import {\r\n existsSync,\r\n readFileSync,\r\n renameSync,\r\n readdirSync,\r\n writeFileSync,\r\n unlinkSync,\r\n} from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { randomUUID } from \"node:crypto\";\r\nimport type { PlanOutboxItem, PersistPlanInput } from \"./types.js\";\r\nimport { hashPlanBody } from \"./body-hash.js\";\r\nimport { buildPlanPersistIdempotencyKey } from \"./idempotency.js\";\r\nimport { ensurePlanOutboxDirs, planOutboxDir } from \"./paths.js\";\r\n\r\nconst DEFAULT_MAX_RETRIES = 12;\r\n\r\nexport function listOutboxItems(): PlanOutboxItem[] {\r\n const { outboxDir } = ensurePlanOutboxDirs();\r\n const files = readdirSync(outboxDir).filter((f) => f.endsWith(\".json\"));\r\n const items: PlanOutboxItem[] = [];\r\n for (const file of files) {\r\n const item = readOutboxItem(path.join(outboxDir, file));\r\n if (item && item.queueStatus === \"queued\") items.push(item);\r\n }\r\n return items.sort((a, b) => a.createdAt.localeCompare(b.createdAt));\r\n}\r\n\r\nexport function findOutboxByIdempotencyKey(key: string): PlanOutboxItem | null {\r\n for (const item of listOutboxItems()) {\r\n if (item.idempotencyKey === key) return item;\r\n }\r\n return null;\r\n}\r\n\r\nexport function readOutboxItem(jsonPath: string): PlanOutboxItem | null {\r\n if (!existsSync(jsonPath)) return null;\r\n try {\r\n return JSON.parse(readFileSync(jsonPath, \"utf8\")) as PlanOutboxItem;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function readOutboxBody(item: PlanOutboxItem): string {\r\n const { outboxDir } = ensurePlanOutboxDirs();\r\n const bodyFile = path.join(outboxDir, item.bodyPath);\r\n return readFileSync(bodyFile, \"utf8\");\r\n}\r\n\r\nexport function writeOutboxItem(input: PersistPlanInput, opts: {\r\n lastError: string;\r\n lastFailureKind: PlanOutboxItem[\"lastFailureKind\"];\r\n existing?: PlanOutboxItem;\r\n}): PlanOutboxItem {\r\n const { outboxDir } = ensurePlanOutboxDirs();\r\n const now = new Date().toISOString();\r\n const id = opts.existing?.id ?? randomUUID();\r\n const bodyPath = opts.existing?.bodyPath ?? `${id}.body.md`;\r\n const jsonPath = path.join(outboxDir, `${id}.json`);\r\n const bodyFile = path.join(outboxDir, bodyPath);\r\n\r\n if (!opts.existing) {\r\n writeFileSync(bodyFile, input.body, \"utf8\");\r\n }\r\n\r\n const item: PlanOutboxItem = {\r\n id,\r\n idempotencyKey: buildPlanPersistIdempotencyKey(input),\r\n operation: input.operation,\r\n agentOsSlug: input.agentOsSlug,\r\n planId: input.planId ?? opts.existing?.planId ?? null,\r\n planSlug: input.planSlug ?? opts.existing?.planSlug ?? null,\r\n title: input.title,\r\n summary: input.summary ?? null,\r\n bodyPath,\r\n bodyHash: hashPlanBody(input.body),\r\n author: input.author ?? null,\r\n model: input.model ?? null,\r\n sourceRefs: input.sourceRefs ?? null,\r\n changeSummary: input.changeSummary ?? null,\r\n markCurrent: input.markCurrent ?? true,\r\n createdAt: opts.existing?.createdAt ?? now,\r\n updatedAt: now,\r\n retryCount: (opts.existing?.retryCount ?? 0) + (opts.existing ? 1 : 0),\r\n maxRetries: input.maxRetries ?? opts.existing?.maxRetries ?? DEFAULT_MAX_RETRIES,\r\n lastError: opts.lastError,\r\n lastFailureKind: opts.lastFailureKind,\r\n queueStatus: \"queued\",\r\n userStatus: \"queued for retry\",\r\n readbackEvidence: null,\r\n };\r\n\r\n writeFileSync(jsonPath, `${JSON.stringify(item, null, 2)}\\n`, { mode: 0o600 });\r\n return item;\r\n}\r\n\r\nexport function saveOutboxItem(item: PlanOutboxItem): void {\r\n const { outboxDir } = ensurePlanOutboxDirs();\r\n const jsonPath = path.join(outboxDir, `${item.id}.json`);\r\n writeFileSync(jsonPath, `${JSON.stringify(item, null, 2)}\\n`, { mode: 0o600 });\r\n}\r\n\r\nexport function archiveOutboxItem(item: PlanOutboxItem): void {\r\n const { outboxDir, archiveDir } = ensurePlanOutboxDirs();\r\n const jsonSrc = path.join(outboxDir, `${item.id}.json`);\r\n const bodySrc = path.join(outboxDir, item.bodyPath);\r\n const jsonDst = path.join(archiveDir, `${item.id}.json`);\r\n const bodyDst = path.join(archiveDir, item.bodyPath);\r\n if (existsSync(jsonSrc)) renameSync(jsonSrc, jsonDst);\r\n if (existsSync(bodySrc)) renameSync(bodySrc, bodyDst);\r\n}\r\n\r\nexport function outboxItemPaths(item: PlanOutboxItem): { jsonPath: string; bodyPath: string } {\r\n const { outboxDir } = ensurePlanOutboxDirs();\r\n return {\r\n jsonPath: path.join(outboxDir, `${item.id}.json`),\r\n bodyPath: path.join(outboxDir, item.bodyPath),\r\n };\r\n}\r\n\r\nexport function removeOutboxItem(item: PlanOutboxItem): void {\r\n const { jsonPath, bodyPath } = outboxItemPaths(item);\r\n if (existsSync(jsonPath)) unlinkSync(jsonPath);\r\n if (existsSync(bodyPath)) unlinkSync(bodyPath);\r\n}\r\n\r\nexport function outboxInputFromItem(item: PlanOutboxItem, body: string): PersistPlanInput {\r\n return {\r\n operation: item.operation,\r\n agentOsSlug: item.agentOsSlug,\r\n planId: item.planId,\r\n planSlug: item.planSlug,\r\n title: item.title,\r\n summary: item.summary,\r\n body,\r\n changeSummary: item.changeSummary ?? undefined,\r\n author: item.author ?? undefined,\r\n model: item.model ?? undefined,\r\n sourceRefs: item.sourceRefs,\r\n markCurrent: item.markCurrent ?? true,\r\n maxRetries: item.maxRetries,\r\n };\r\n}\r\n", "import { hashPlanBody, hashSummary } from \"./body-hash.js\";\r\nimport { PlanPersistError } from \"./errors.js\";\r\nimport { agentOsGetPlan, type AgentOsApiDeps } from \"./agentos-api.js\";\r\nimport type { PlanPersistReadbackEvidence, PersistPlanInput } from \"./types.js\";\r\n\r\nexport interface ReadbackExpectation {\r\n planId: string;\r\n title: string;\r\n summary: string | null;\r\n body: string;\r\n bodyHash: string;\r\n versionId?: string | null;\r\n versionNumber?: number | null;\r\n}\r\n\r\nexport async function verifyPlanReadback(\r\n slug: string,\r\n expectation: ReadbackExpectation,\r\n deps: AgentOsApiDeps = {},\r\n): Promise<PlanPersistReadbackEvidence> {\r\n const payload = await agentOsGetPlan(slug, expectation.planId, deps);\r\n const plan = payload.plan;\r\n const current = payload.currentVersion;\r\n\r\n if (plan.title.trim() !== expectation.title.trim()) {\r\n throw new PlanPersistError(\r\n \"verification_failed\",\r\n `title mismatch: expected \"${expectation.title}\", got \"${plan.title}\"`,\r\n );\r\n }\r\n\r\n const expectedSummaryHash = hashSummary(expectation.summary);\r\n const actualSummaryHash = hashSummary(plan.summary);\r\n if (expectedSummaryHash !== actualSummaryHash) {\r\n throw new PlanPersistError(\"verification_failed\", \"summary mismatch on readback\");\r\n }\r\n\r\n if (expectation.versionId && plan.currentVersionId !== expectation.versionId) {\r\n throw new PlanPersistError(\r\n \"verification_failed\",\r\n `currentVersionId mismatch: expected ${expectation.versionId}, got ${plan.currentVersionId}`,\r\n );\r\n }\r\n\r\n if (expectation.versionNumber != null) {\r\n if (!current || current.versionNumber !== expectation.versionNumber) {\r\n throw new PlanPersistError(\r\n \"verification_failed\",\r\n `versionNumber mismatch: expected ${expectation.versionNumber}, got ${current?.versionNumber ?? \"none\"}`,\r\n );\r\n }\r\n }\r\n\r\n const bodyForHash = current?.body ?? \"\";\r\n const actualBodyHash = hashPlanBody(bodyForHash);\r\n if (expectation.bodyHash && actualBodyHash !== expectation.bodyHash) {\r\n throw new PlanPersistError(\"verification_failed\", \"body hash mismatch on readback\");\r\n }\r\n\r\n return {\r\n planId: plan.id,\r\n currentVersionId: plan.currentVersionId,\r\n versionNumber: current?.versionNumber ?? null,\r\n title: plan.title,\r\n summary: plan.summary,\r\n bodyHash: expectation.bodyHash || actualBodyHash,\r\n readAt: new Date().toISOString(),\r\n };\r\n}\r\n\r\nexport function buildReadbackExpectation(\r\n input: PersistPlanInput,\r\n write: { planId: string; versionId: string | null; versionNumber: number | null },\r\n): ReadbackExpectation {\r\n return {\r\n planId: write.planId,\r\n title: input.title,\r\n summary: input.summary ?? null,\r\n body: input.body,\r\n bodyHash: hashPlanBody(input.body),\r\n versionId: write.versionId,\r\n versionNumber: write.versionNumber,\r\n };\r\n}\r\n", "import type { AgentOsApiDeps } from \"./agentos-api.js\";\r\nimport { agentOsWritePlan } from \"./agentos-api.js\";\r\nimport { isRetryableFailure, PlanPersistError } from \"./errors.js\";\r\nimport { buildPlanPersistIdempotencyKey } from \"./idempotency.js\";\r\nimport { isTmpOnlyPath } from \"./paths.js\";\r\nimport {\r\n archiveOutboxItem,\r\n findOutboxByIdempotencyKey,\r\n outboxItemPaths,\r\n saveOutboxItem,\r\n writeOutboxItem,\r\n} from \"./outbox-store.js\";\r\nimport {\r\n buildReadbackExpectation,\r\n verifyPlanReadback,\r\n type ReadbackExpectation,\r\n} from \"./readback.js\";\r\nimport type {\r\n PersistPlanInput,\r\n PersistPlanResult,\r\n PlanOutboxItem,\r\n PlanPersistUserStatus,\r\n} from \"./types.js\";\r\n\r\nexport interface PersistPlanDeps extends AgentOsApiDeps {\r\n /** When set, skip live HTTP (tests). */\r\n writePlan?: typeof agentOsWritePlan;\r\n verifyReadback?: typeof verifyPlanReadback;\r\n}\r\n\r\nconst SUCCESS_STATUS: PlanPersistUserStatus = \"persisted and read back\";\r\nconst QUEUED_STATUS: PlanPersistUserStatus = \"queued for retry\";\r\nconst FAILED_STATUS: PlanPersistUserStatus = \"failed and needs action\";\r\n\r\nexport async function persistPlan(\r\n input: PersistPlanInput,\r\n deps: PersistPlanDeps = {},\r\n): Promise<PersistPlanResult> {\r\n if (input.bodyPathHint && isTmpOnlyPath(input.bodyPathHint)) {\r\n // Caller must not treat /tmp-only paths as durable persistence.\r\n }\r\n\r\n const idempotencyKey = buildPlanPersistIdempotencyKey(input);\r\n const existingOutbox = findOutboxByIdempotencyKey(idempotencyKey);\r\n if (existingOutbox?.readbackEvidence) {\r\n return {\r\n userStatus: SUCCESS_STATUS,\r\n outboxId: existingOutbox.id,\r\n planId: existingOutbox.readbackEvidence.planId,\r\n readbackEvidence: existingOutbox.readbackEvidence,\r\n idempotencyKey,\r\n };\r\n }\r\n\r\n if (input.immediateFailure) {\r\n return queueForRetry(input, input.immediateFailure.message, input.immediateFailure.kind, existingOutbox);\r\n }\r\n\r\n const writeFn = deps.writePlan ?? agentOsWritePlan;\r\n const verifyFn = deps.verifyReadback ?? verifyPlanReadback;\r\n\r\n try {\r\n const write = await writeFn(input, deps);\r\n const enriched: PersistPlanInput = { ...input, planId: write.planId };\r\n const expectation = buildReadbackExpectation(enriched, write);\r\n const readback = await verifyFn(\r\n input.agentOsSlug,\r\n readbackExpectationForOperation(input, expectation),\r\n deps,\r\n );\r\n if (existingOutbox) archiveOutboxItem(existingOutbox);\r\n return {\r\n userStatus: SUCCESS_STATUS,\r\n planId: write.planId,\r\n versionId: write.versionId ?? undefined,\r\n readbackEvidence: readback,\r\n idempotencyKey,\r\n };\r\n } catch (err) {\r\n const failure =\r\n err instanceof PlanPersistError\r\n ? err\r\n : new PlanPersistError(\"tool_interruption\", err instanceof Error ? err.message : String(err));\r\n\r\n if (!isRetryableFailure(failure.kind)) {\r\n const item = writeOutboxItem(input, {\r\n lastError: failure.message,\r\n lastFailureKind: failure.kind,\r\n existing: existingOutbox ?? undefined,\r\n });\r\n const paths = outboxItemPaths(item);\r\n const failed = markOutboxFailed(item, failure.message);\r\n return {\r\n userStatus: FAILED_STATUS,\r\n outboxId: failed.id,\r\n outboxPath: paths.jsonPath,\r\n bodyPath: paths.bodyPath,\r\n lastError: failure.message,\r\n idempotencyKey,\r\n };\r\n }\r\n\r\n return queueForRetry(input, failure.message, failure.kind, existingOutbox);\r\n }\r\n}\r\n\r\nfunction readbackExpectationForOperation(\r\n input: PersistPlanInput,\r\n expectation: ReadbackExpectation,\r\n): ReadbackExpectation {\r\n if (input.operation === \"update_metadata\") {\r\n return { ...expectation, body: \"\", bodyHash: \"\" };\r\n }\r\n return expectation;\r\n}\r\n\r\nfunction queueForRetry(\r\n input: PersistPlanInput,\r\n message: string,\r\n kind: PlanOutboxItem[\"lastFailureKind\"],\r\n existing: PlanOutboxItem | null,\r\n): PersistPlanResult {\r\n const item = writeOutboxItem(input, {\r\n lastError: message,\r\n lastFailureKind: kind,\r\n existing: existing ?? undefined,\r\n });\r\n const paths = outboxItemPaths(item);\r\n\r\n if (item.retryCount >= item.maxRetries) {\r\n const failed = markOutboxFailed(item, message);\r\n return {\r\n userStatus: FAILED_STATUS,\r\n outboxId: failed.id,\r\n outboxPath: paths.jsonPath,\r\n bodyPath: paths.bodyPath,\r\n lastError: message,\r\n idempotencyKey: item.idempotencyKey,\r\n };\r\n }\r\n\r\n return {\r\n userStatus: QUEUED_STATUS,\r\n outboxId: item.id,\r\n outboxPath: paths.jsonPath,\r\n bodyPath: paths.bodyPath,\r\n lastError: message,\r\n idempotencyKey: item.idempotencyKey,\r\n };\r\n}\r\n\r\nfunction markOutboxFailed(item: PlanOutboxItem, message: string): PlanOutboxItem {\r\n const failed: PlanOutboxItem = {\r\n ...item,\r\n queueStatus: \"failed\",\r\n userStatus: FAILED_STATUS,\r\n lastError: message,\r\n updatedAt: new Date().toISOString(),\r\n };\r\n saveOutboxItem(failed);\r\n return failed;\r\n}\r\n", "import type { AgentOsApiDeps } from \"./agentos-api.js\";\r\nimport {\r\n listOutboxItems,\r\n outboxInputFromItem,\r\n readOutboxBody,\r\n readOutboxItem,\r\n} from \"./outbox-store.js\";\r\nimport { persistPlan, type PersistPlanDeps } from \"./persist.js\";\r\nimport type { DrainOutboxResult, PlanOutboxItem } from \"./types.js\";\r\nimport { planOutboxDir } from \"./paths.js\";\r\nimport path from \"node:path\";\r\n\r\nexport async function drainPlanOutbox(\r\n opts: { max?: number; outboxId?: string } = {},\r\n deps: PersistPlanDeps = {},\r\n): Promise<DrainOutboxResult> {\r\n const items = listOutboxItems().filter((item) =>\r\n opts.outboxId ? item.id === opts.outboxId : true,\r\n );\r\n const slice = opts.max && opts.max > 0 ? items.slice(0, opts.max) : items;\r\n\r\n const result: DrainOutboxResult = {\r\n processed: 0,\r\n succeeded: 0,\r\n stillQueued: 0,\r\n failed: 0,\r\n results: [],\r\n };\r\n\r\n for (const item of slice) {\r\n result.processed += 1;\r\n const body = readOutboxBody(item);\r\n const input = outboxInputFromItem(item, body);\r\n const attempt = await persistPlan(input, deps);\r\n\r\n if (attempt.userStatus === \"persisted and read back\") {\r\n result.succeeded += 1;\r\n } else if (attempt.userStatus === \"failed and needs action\") {\r\n result.failed += 1;\r\n } else {\r\n result.stillQueued += 1;\r\n }\r\n\r\n result.results.push({\r\n outboxId: item.id,\r\n userStatus: attempt.userStatus,\r\n lastError: attempt.lastError,\r\n });\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function loadOutboxById(outboxId: string): PlanOutboxItem | null {\r\n const jsonPath = path.join(planOutboxDir(), `${outboxId}.json`);\r\n return readOutboxItem(jsonPath);\r\n}\r\n", "import type { PlanOutboxItem } from \"./types.js\";\r\nimport { outboxItemPaths } from \"./outbox-store.js\";\r\n\r\nexport function formatPlanOutboxHandoffBlock(item: PlanOutboxItem): string {\r\n const paths = outboxItemPaths(item);\r\n\r\n return [\r\n \"## Plan persistence risk\",\r\n \"\",\r\n `AgentOS plan write is **not** confirmed (${item.userStatus}).`,\r\n `- outboxId: \\`${item.id}\\``,\r\n item.planId ? `- planId: \\`${item.planId}\\`` : \"- planId: (pending \u2014 create not yet applied)\",\r\n `- outbox: \\`${paths.jsonPath}\\``,\r\n `- body: \\`${paths.bodyPath}\\``,\r\n \"\",\r\n \"Drain when approval/connectivity returns: `kynver plan outbox drain`\",\r\n ].join(\"\\n\");\r\n}\r\n\r\nexport function extractPlanOutboxFromTask(task: Record<string, unknown>): {\r\n outboxId?: string;\r\n jsonPath?: string;\r\n bodyPath?: string;\r\n} | null {\r\n const meta =\r\n task.metadata && typeof task.metadata === \"object\"\r\n ? (task.metadata as Record<string, unknown>)\r\n : null;\r\n const outboxId =\r\n (typeof task.planPersistenceOutboxId === \"string\" && task.planPersistenceOutboxId) ||\r\n (meta && typeof meta.planPersistenceOutboxId === \"string\" ? meta.planPersistenceOutboxId : undefined);\r\n if (!outboxId) return null;\r\n return {\r\n outboxId,\r\n jsonPath:\r\n typeof task.planPersistenceOutboxPath === \"string\"\r\n ? task.planPersistenceOutboxPath\r\n : meta && typeof meta.planPersistenceOutboxPath === \"string\"\r\n ? meta.planPersistenceOutboxPath\r\n : undefined,\r\n bodyPath:\r\n typeof task.planPersistenceBodyPath === \"string\"\r\n ? task.planPersistenceBodyPath\r\n : meta && typeof meta.planPersistenceBodyPath === \"string\"\r\n ? meta.planPersistenceBodyPath\r\n : undefined,\r\n };\r\n}\r\n", "import path from \"node:path\";\r\nimport { resolveBaseUrl, resolveCallbackSecretWithMint } from \"./config.js\";\r\nimport { postJsonWithCredentialRefresh } 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\nimport { publishHarnessBoardSnapshot } from \"./worker-ops.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 = `kynver-harness:${run.id}`;\r\n const snapshotPublished = await publishHarnessBoardSnapshot({ run: run.id, agentOsId, ...args }, \"run_sweep\");\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 || worker.completionReportedAt) 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 postJsonWithCredentialRefresh(releaseUrl, secret, { agentOsId, leaseOwner }, { agentOsId, baseUrl: base });\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 postJsonWithCredentialRefresh(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 }, { agentOsId, baseUrl: base });\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, snapshotPublished, 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 { runPipelineDispatch } from \"./pipeline-dispatch.js\";\r\nimport { reconcileStaleWorkers } from \"./stale-reconcile.js\";\r\nimport type { ReconcileStaleWorkersResult } from \"./stale-reconcile.js\";\r\nimport { observeRunnerResourceGate, type RunnerResourceGateShape } from \"./resource-gate.js\";\r\nimport { loadRun, runDirectory } from \"./run-store.js\";\r\nimport { assessExitedWorkerSalvage } from \"./exited-salvage.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 { renewActiveTaskLeases } from \"./lease-renewal.js\";\r\nimport { buildRunBoard, runStatus, tryCompleteWorker } from \"./worker-ops.js\";\r\nimport { hasCompletionAck } from \"./completion-ack.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\nimport { fetchWorkspaceRuntimePreferences } from \"./workspace-runtime-config.js\";\r\nimport { isPipelineCleanupEnabled, runPipelineHarnessCleanup } from \"./cleanup.js\";\r\nimport type { HarnessCleanupSummary } from \"./cleanup-types.js\";\r\nimport { syncCompletionAcknowledgedFromOperatorTick } from \"./worker-lifecycle.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 leaseRenewal?: Awaited<ReturnType<typeof renewActiveTaskLeases>>;\r\n completedWorkers: Array<{ worker: string; ok: boolean; taskId?: string | null; skipped?: boolean }>;\r\n staleReconcile: ReconcileStaleWorkersResult;\r\n planProgressSync: Array<{ worker: string; phase: string; ok: boolean; skipped?: boolean }>;\r\n completionAckSync: Array<{ worker: string; taskId: string; taskStatus: string }>;\r\n harnessCleanup?: HarnessCleanupSummary;\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; skipped?: boolean }>> {\r\n const run = loadRun(runId);\r\n const outcomes: Array<{ worker: string; ok: boolean; taskId?: string | null; 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?.taskId || worker.localOnly) continue;\r\n if (hasCompletionAck(worker)) {\r\n outcomes.push({ worker: name, ok: true, taskId: worker.taskId ?? null, skipped: true });\r\n continue;\r\n }\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 const exitedSalvage = assessExitedWorkerSalvage({\r\n alive: status.alive,\r\n finalResult: status.finalResult,\r\n changedFiles: status.changedFiles,\r\n gitAncestry: status.gitAncestry,\r\n });\r\n // Directly-started workers are normally left alone, but an exited worker with\r\n // salvageable work still needs completion ingested so the board can block +\r\n // propose a salvage review task.\r\n if (!worker.dispatched && !status.finalResult && !exitedSalvage?.salvageable) 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 harnessBoardSnapshot: buildRunBoard(runId),\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 const workspacePrefs = await fetchWorkspaceRuntimePreferences(agentOsId, args);\r\n const resourceGate = observeRunnerResourceGate({\r\n runId,\r\n configuredMaxWorkersOverride: workspacePrefs?.maxConcurrentWorkers,\r\n });\r\n\r\n // Heartbeat operator tick before slow completion replay so Command Center\r\n // `runtime.lastSnapshot` advances even when attention/finished workers block\r\n // the completion path for longer than the harness watchdog TTL.\r\n const operatorTick = await postOperatorTick(agentOsId, runId, resourceGate, args);\r\n const completionAckSync = syncCompletionAcknowledgedFromOperatorTick(runId, operatorTick);\r\n\r\n const leaseRenewal = await renewActiveTaskLeases(runId, args);\r\n\r\n // Replay completion for finished workers 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 staleReconcile = reconcileStaleWorkers();\r\n const harnessCleanup = isPipelineCleanupEnabled() ? runPipelineHarnessCleanup(runId) : undefined;\r\n const planProgressSync = await syncActiveWorkerPlanProgress(runId, 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 runPipelineDispatch(\r\n {\r\n ...args,\r\n run: runId,\r\n agentOsId,\r\n },\r\n maxStarts,\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 leaseRenewal,\r\n completedWorkers,\r\n staleReconcile,\r\n harnessCleanup,\r\n planProgressSync,\r\n completionAckSync,\r\n operatorTick,\r\n sweep,\r\n dispatch,\r\n idle,\r\n };\r\n}\r\n", "import { dispatchRun } from \"./dispatch.js\";\r\n\r\nconst RESERVED_REVIEW_STARTS = 1;\r\n\r\nfunction countDispatchStarts(result: unknown): number {\r\n if (!result || typeof result !== \"object\") return 0;\r\n const startedCount = (result as { startedCount?: number }).startedCount;\r\n if (typeof startedCount === \"number\") return startedCount;\r\n const outcomes = (result as { outcomes?: Array<{ started?: boolean }> }).outcomes;\r\n if (!Array.isArray(outcomes)) return 0;\r\n return outcomes.filter((o) => o.started).length;\r\n}\r\n\r\n/** Drop CLI max-starts so pipeline ticks always use the resource-gate slot budget. */\r\nexport function stripCliMaxStarts(\r\n args: Record<string, string | boolean>,\r\n): Record<string, string | boolean> {\r\n const { maxStarts: _maxStarts, ...rest } = args;\r\n return rest;\r\n}\r\n\r\n/**\r\n * Two-pass daemon dispatch: reserve one start for the review lane, then fill\r\n * remaining slots from the mixed queue (review-first ordering on the server).\r\n */\r\nexport async function runPipelineDispatch(\r\n args: Record<string, string | boolean>,\r\n slots: number,\r\n): Promise<Record<string, unknown>> {\r\n if (slots <= 0) {\r\n return { ok: true, skipped: true, reason: \"no slots\", maxStarts: 0, startedCount: 0 };\r\n }\r\n\r\n const base = stripCliMaxStarts(args);\r\n const reviewBudget = Math.min(slots, RESERVED_REVIEW_STARTS);\r\n const workBudget = Math.max(0, slots - reviewBudget);\r\n\r\n const review = await dispatchRun({\r\n ...base,\r\n execute: true,\r\n pipeline: true,\r\n lane: \"review\",\r\n maxStarts: String(reviewBudget),\r\n });\r\n\r\n const reviewStarted = countDispatchStarts(review);\r\n const workSlots = workBudget + (reviewBudget - reviewStarted);\r\n if (workSlots <= 0) {\r\n return {\r\n ...(typeof review === \"object\" && review !== null ? review : {}),\r\n passes: { review },\r\n startedCount: reviewStarted,\r\n };\r\n }\r\n\r\n const work = await dispatchRun({\r\n ...base,\r\n execute: true,\r\n pipeline: true,\r\n maxStarts: String(workSlots),\r\n });\r\n\r\n const workStarted = countDispatchStarts(work);\r\n return {\r\n passes: { review, work },\r\n startedCount: reviewStarted + workStarted,\r\n ok: true,\r\n };\r\n}\r\n", "import path from \"node:path\";\r\nimport { finalizeStaleRuns, type RunFinalizeResult } from \"./finalize.js\";\r\nimport { listRunRecords, runDirectory, saveWorker } from \"./run-store.js\";\r\nimport { computeWorkerStatus, STALE_MS, type HarnessWorkerRecord } from \"./status.js\";\r\nimport { isPidAlive, killWorkerProcess, readJson, safeSlug } from \"./util.js\";\r\n\r\n/** No heartbeat this long + dead PID \u2192 reconcile as exited. */\r\nexport const STALE_RECONCILE_HEARTBEAT_MS = 15 * 60 * 1000;\r\n\r\nexport interface StaleWorkerReconcileOutcome {\r\n runId: string;\r\n worker: string;\r\n action: \"marked_exited\" | \"killed_stale\" | \"skipped\";\r\n reason: string;\r\n}\r\n\r\nexport interface ReconcileStaleWorkersResult {\r\n workers: StaleWorkerReconcileOutcome[];\r\n finalizedRuns: RunFinalizeResult[];\r\n}\r\n\r\nfunction staleReconcileDisabled(): boolean {\r\n return process.env.KYNVER_NO_STALE_CLEANUP === \"1\";\r\n}\r\n\r\n/**\r\n * Reconcile workers that exited without updating worker.json, and optionally\r\n * terminate long-idle live processes. Paused workers with recent heartbeat\r\n * blockers are left alone (heartbeat freshness gate).\r\n */\r\nexport function reconcileStaleWorkers(): ReconcileStaleWorkersResult {\r\n if (staleReconcileDisabled()) {\r\n return { workers: [], finalizedRuns: finalizeStaleRuns() };\r\n }\r\n\r\n const outcomes: StaleWorkerReconcileOutcome[] = [];\r\n const now = Date.now();\r\n\r\n for (const run of listRunRecords()) {\r\n for (const name of Object.keys(run.workers || {})) {\r\n const workerPath = path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\");\r\n const worker = readJson<HarnessWorkerRecord | undefined>(workerPath, undefined);\r\n if (!worker || worker.status !== \"running\") {\r\n outcomes.push({\r\n runId: run.id,\r\n worker: name,\r\n action: \"skipped\",\r\n reason: worker ? `worker status is ${worker.status}` : \"worker.json missing\",\r\n });\r\n continue;\r\n }\r\n\r\n const status = computeWorkerStatus(worker, { base: run.base, baseCommit: run.baseCommit });\r\n if (status.finalResult) {\r\n if (worker.status === \"running\") {\r\n const nextStatus =\r\n status.attention.state === \"blocked\"\r\n ? \"blocked\"\r\n : status.attention.state === \"done\" || status.status === \"done\"\r\n ? \"done\"\r\n : \"exited\";\r\n worker.status = nextStatus;\r\n worker.reconciledAt = new Date().toISOString();\r\n worker.reconcileReason = \"synced finished worker record after terminal stdout/heartbeat\";\r\n saveWorker(run.id, worker);\r\n outcomes.push({\r\n runId: run.id,\r\n worker: name,\r\n action: \"marked_exited\",\r\n reason: worker.reconcileReason,\r\n });\r\n } else {\r\n outcomes.push({ runId: run.id, worker: name, action: \"skipped\", reason: \"final result present\" });\r\n }\r\n continue;\r\n }\r\n\r\n if (!status.alive) {\r\n const nextStatus =\r\n status.attention.state === \"blocked\" ? \"blocked\" : status.status === \"done\" ? \"done\" : \"exited\";\r\n worker.status = nextStatus;\r\n worker.reconciledAt = new Date().toISOString();\r\n worker.reconcileReason = status.attention.reason;\r\n saveWorker(run.id, worker);\r\n outcomes.push({\r\n runId: run.id,\r\n worker: name,\r\n action: \"marked_exited\",\r\n reason: status.attention.reason,\r\n });\r\n continue;\r\n }\r\n\r\n // Live PID but no meaningful activity \u2014 only kill when heartbeat is also stale\r\n // (avoids killing a paused worker that recently reported a blocker).\r\n if (status.attention.state === \"stale\" && worker.pid && isPidAlive(worker.pid)) {\r\n const hbMs = status.lastHeartbeatAt ? Date.parse(status.lastHeartbeatAt) : NaN;\r\n const actMs = status.lastActivityAt ? Date.parse(status.lastActivityAt) : NaN;\r\n const hbStale =\r\n !Number.isFinite(hbMs) || now - hbMs > STALE_RECONCILE_HEARTBEAT_MS;\r\n const actStale = Number.isFinite(actMs) && now - actMs > STALE_MS;\r\n if (hbStale && actStale) {\r\n killWorkerProcess(worker.pid, \"SIGTERM\");\r\n worker.status = \"exited\";\r\n worker.reconciledAt = new Date().toISOString();\r\n worker.reconcileReason = `reconciled stale worker: ${status.attention.reason}`;\r\n saveWorker(run.id, worker);\r\n outcomes.push({\r\n runId: run.id,\r\n worker: name,\r\n action: \"killed_stale\",\r\n reason: status.attention.reason,\r\n });\r\n continue;\r\n }\r\n }\r\n\r\n outcomes.push({\r\n runId: run.id,\r\n worker: name,\r\n action: \"skipped\",\r\n reason: status.attention.reason,\r\n });\r\n }\r\n }\r\n\r\n return { workers: outcomes, finalizedRuns: finalizeStaleRuns() };\r\n}\r\n", "import path from \"node:path\";\r\nimport { listRunRecords, runDirectory, saveRun, type HarnessRunRecord } from \"./run-store.js\";\r\nimport { computeWorkerStatus, isLandingBlockedWorkerStatus } 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 let anyLandingBlocked = 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 base: run.base,\r\n baseCommit: run.baseCommit,\r\n });\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 (isLandingBlockedWorkerStatus(status)) {\r\n anyLandingBlocked = true;\r\n }\r\n if (status.finalResult && status.attention.state === \"done\") 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 if (anyLandingBlocked) return null; // dirty/unlanded work \u2014 keep run active for operator attention\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 { postJsonWithCredentialRefresh } 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 postJsonWithCredentialRefresh(url, secret, {\r\n phase: args.phase,\r\n taskId: args.taskId,\r\n blocker: args.blocker,\r\n artifact: args.artifact,\r\n }, { agentOsId: args.agentOsId, baseUrl: base });\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 path from \"node:path\";\r\nimport { getHarnessPaths, resolveHarnessRoot } from \"./paths.js\";\r\nimport {\r\n DEFAULT_NODE_MODULES_AGE_MS,\r\n type CleanupAction,\r\n type CleanupSkipReason,\r\n type HarnessCleanupOptions,\r\n type HarnessCleanupSummary,\r\n} from \"./cleanup-types.js\";\r\nimport { skipNodeModulesRemoval, skipWorktreeRemoval } from \"./cleanup-guards.js\";\r\nimport { removeNodeModules, removeWorktree, isHarnessNodeModulesPath } from \"./cleanup-execute.js\";\r\nimport { scanNodeModulesCandidates, scanWorktreeCandidates } from \"./cleanup-scan.js\";\r\nimport { buildWorktreeIndex } from \"./cleanup-worktree-index.js\";\r\n\r\nfunction resolveOptions(options: HarnessCleanupOptions = {}) {\r\n const harnessRoot = options.harnessRoot\r\n ? path.resolve(options.harnessRoot)\r\n : resolveHarnessRoot();\r\n const { worktreesDir } = options.harnessRoot\r\n ? { worktreesDir: path.join(harnessRoot, \"worktrees\") }\r\n : getHarnessPaths();\r\n const execute = options.execute === true;\r\n const nodeModulesAgeMs = options.nodeModulesAgeMs ?? DEFAULT_NODE_MODULES_AGE_MS;\r\n const worktreesAgeMs = options.worktreesAgeMs ?? 0;\r\n const includeOrphans = options.includeOrphans === true;\r\n const runIdFilter = options.runIdFilter ? String(options.runIdFilter) : undefined;\r\n const now = options.now ?? Date.now();\r\n return {\r\n harnessRoot,\r\n worktreesDir,\r\n execute,\r\n dryRun: !execute,\r\n nodeModulesAgeMs,\r\n worktreesAgeMs,\r\n includeOrphans,\r\n runIdFilter,\r\n now,\r\n };\r\n}\r\n\r\nfunction recordSkip(\r\n skips: HarnessCleanupSummary[\"skips\"],\r\n pathValue: string,\r\n reason: CleanupSkipReason,\r\n detail?: string,\r\n): void {\r\n skips.push({ path: pathValue, reason, ...(detail ? { detail } : {}) });\r\n}\r\n\r\nexport function runHarnessCleanup(options: HarnessCleanupOptions = {}): HarnessCleanupSummary {\r\n const resolved = resolveOptions(options);\r\n const index = buildWorktreeIndex();\r\n const scanOpts = {\r\n harnessRoot: resolved.harnessRoot,\r\n worktreesDir: resolved.worktreesDir,\r\n nodeModulesAgeMs: resolved.nodeModulesAgeMs,\r\n worktreesAgeMs: resolved.worktreesAgeMs,\r\n includeOrphans: resolved.includeOrphans,\r\n runIdFilter: resolved.runIdFilter,\r\n index,\r\n now: resolved.now,\r\n };\r\n const skips: HarnessCleanupSummary[\"skips\"] = [];\r\n const actions: CleanupAction[] = [];\r\n\r\n for (const candidate of scanNodeModulesCandidates(scanOpts)) {\r\n const pathSkip = isHarnessNodeModulesPath(candidate.path, resolved.harnessRoot, resolved.worktreesDir);\r\n if (pathSkip) {\r\n recordSkip(skips, candidate.path, pathSkip);\r\n actions.push({ ...candidate, executed: false, skipped: true, skipReason: pathSkip });\r\n continue;\r\n }\r\n const worktreePath = path.resolve(candidate.path, \"..\");\r\n const indexed = index.get(worktreePath) ?? null;\r\n const guardReason = skipNodeModulesRemoval({\r\n indexed,\r\n includeOrphans: resolved.includeOrphans,\r\n nodeModulesAgeMs: resolved.nodeModulesAgeMs,\r\n ageMs: candidate.ageMs,\r\n });\r\n if (guardReason) {\r\n recordSkip(skips, candidate.path, guardReason);\r\n actions.push({ ...candidate, executed: false, skipped: true, skipReason: guardReason });\r\n continue;\r\n }\r\n actions.push(removeNodeModules(candidate, resolved.execute));\r\n }\r\n\r\n for (const candidate of scanWorktreeCandidates(scanOpts)) {\r\n const indexed = index.get(path.resolve(candidate.path)) ?? null;\r\n const guardReason = skipWorktreeRemoval({\r\n indexed,\r\n includeOrphans: resolved.includeOrphans,\r\n worktreesAgeMs: resolved.worktreesAgeMs,\r\n ageMs: candidate.ageMs,\r\n });\r\n if (guardReason) {\r\n recordSkip(skips, candidate.path, guardReason);\r\n actions.push({ ...candidate, executed: false, skipped: true, skipReason: guardReason });\r\n continue;\r\n }\r\n actions.push(removeWorktree(candidate, resolved.execute));\r\n }\r\n\r\n let candidateBytes = 0;\r\n let removedBytes = 0;\r\n let removedPaths = 0;\r\n let skippedPaths = 0;\r\n for (const action of actions) {\r\n if (action.bytes) candidateBytes += action.bytes;\r\n if (action.executed) {\r\n removedPaths += 1;\r\n removedBytes += action.bytes ?? 0;\r\n } else if (action.skipped) {\r\n skippedPaths += 1;\r\n }\r\n }\r\n\r\n return {\r\n harnessRoot: resolved.harnessRoot,\r\n dryRun: resolved.dryRun,\r\n execute: resolved.execute,\r\n nodeModulesAgeMs: resolved.nodeModulesAgeMs,\r\n worktreesAgeMs: resolved.worktreesAgeMs,\r\n includeOrphans: resolved.includeOrphans,\r\n scannedAt: new Date(resolved.now).toISOString(),\r\n actions,\r\n skips,\r\n totals: {\r\n candidateBytes,\r\n removedBytes,\r\n removedPaths,\r\n skippedPaths,\r\n },\r\n };\r\n}\r\n\r\n/** Pipeline-safe defaults: node_modules only, dry-run unless execute env is set. */\r\nexport function runPipelineHarnessCleanup(runId?: string): HarnessCleanupSummary {\r\n const nodeModulesAgeMs = Number(process.env.KYNVER_CLEANUP_NODE_MODULES_AGE_MS) || DEFAULT_NODE_MODULES_AGE_MS;\r\n const worktreesAgeMs = Number(process.env.KYNVER_CLEANUP_WORKTREES_AGE_MS) || 0;\r\n const execute = process.env.KYNVER_CLEANUP_EXECUTE === \"1\";\r\n const includeOrphans = process.env.KYNVER_CLEANUP_INCLUDE_ORPHANS === \"1\";\r\n const scopeAll = process.env.KYNVER_CLEANUP_SCOPE === \"all\";\r\n return runHarnessCleanup({\r\n execute,\r\n nodeModulesAgeMs,\r\n worktreesAgeMs,\r\n includeOrphans,\r\n runIdFilter: scopeAll ? undefined : runId,\r\n });\r\n}\r\n\r\nexport function isPipelineCleanupEnabled(): boolean {\r\n return process.env.KYNVER_PIPELINE_CLEANUP !== \"0\";\r\n}\r\n", "export type CleanupActionKind = \"remove_node_modules\" | \"remove_worktree\";\r\n\r\nexport type CleanupSkipReason =\r\n | \"dry_run\"\r\n | \"below_age_threshold\"\r\n | \"active_worker\"\r\n | \"dirty_worktree\"\r\n | \"landing_blocked\"\r\n | \"pr_or_unmerged_commits\"\r\n | \"completion_blocked\"\r\n | \"run_still_active\"\r\n | \"path_outside_harness\"\r\n | \"worktrees_disabled\"\r\n | \"orphan_without_flag\"\r\n | \"missing_worktree\"\r\n | \"remove_failed\";\r\n\r\nexport interface CleanupCandidate {\r\n kind: CleanupActionKind;\r\n path: string;\r\n bytes: number | null;\r\n runId?: string;\r\n worker?: string;\r\n repo?: string;\r\n ageMs: number;\r\n}\r\n\r\nexport interface CleanupAction extends CleanupCandidate {\r\n executed: boolean;\r\n skipped: boolean;\r\n skipReason?: CleanupSkipReason;\r\n error?: string;\r\n}\r\n\r\nexport interface HarnessCleanupSummary {\r\n harnessRoot: string;\r\n dryRun: boolean;\r\n execute: boolean;\r\n nodeModulesAgeMs: number;\r\n worktreesAgeMs: number;\r\n includeOrphans: boolean;\r\n scannedAt: string;\r\n actions: CleanupAction[];\r\n skips: Array<{ path: string; reason: CleanupSkipReason; detail?: string }>;\r\n totals: {\r\n candidateBytes: number;\r\n removedBytes: number;\r\n removedPaths: number;\r\n skippedPaths: number;\r\n };\r\n}\r\n\r\nexport interface HarnessCleanupOptions {\r\n harnessRoot?: string;\r\n /** When false (default), only report candidates. */\r\n execute?: boolean;\r\n /** Minimum age before removing generated `node_modules` (default 6h). */\r\n nodeModulesAgeMs?: number;\r\n /** When 0 or unset, worktree removal is disabled. */\r\n worktreesAgeMs?: number;\r\n /** Allow cleaning `node_modules` under worktrees with no worker index entry. */\r\n includeOrphans?: boolean;\r\n /** When set, only consider workers for this harness run (pipeline tick scope). */\r\n runIdFilter?: string;\r\n now?: number;\r\n}\r\n\r\n/** Conservative default aligned with 2026-05-27 manual harness cleanup (6h). */\r\nexport const DEFAULT_NODE_MODULES_AGE_MS = 6 * 60 * 60 * 1000;\r\n\r\n/** Seven days \u2014 only used when worktree cleanup is explicitly enabled. */\r\nexport const DEFAULT_WORKTREES_AGE_MS = 7 * 24 * 60 * 60 * 1000;\r\n", "import type { CleanupSkipReason } from \"./cleanup-types.js\";\r\nimport { assessWorkerLanding } from \"./landing-gate.js\";\r\nimport type { IndexedWorktree } from \"./cleanup-worktree-index.js\";\r\nimport type { RawHarnessWorkerStatus } from \"./status.js\";\r\n\r\nconst ACTIVE_RUN_STATUSES = new Set([\"running\", \"dispatching\", \"pending\", \"queued\", \"needs_attention\"]);\r\n\r\nconst TERMINAL_RUN_STATUSES = new Set([\"completed\", \"failed\", \"cancelled\"]);\r\n\r\nfunction prUrlFromFinalResult(finalResult: unknown): string | null {\r\n if (typeof finalResult === \"string\") {\r\n const match = finalResult.match(/https:\\/\\/github\\.com\\/[^\\s]+\\/pull\\/\\d+/i);\r\n return match?.[0] ?? null;\r\n }\r\n if (finalResult && typeof finalResult === \"object\") {\r\n const obj = finalResult as Record<string, unknown>;\r\n for (const key of [\"prUrl\", \"pr_url\", \"pullRequestUrl\"]) {\r\n const value = obj[key];\r\n if (typeof value === \"string\" && value.trim()) return value.trim();\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nexport function isPrOrUnmergedWork(status: RawHarnessWorkerStatus): boolean {\r\n if (prUrlFromFinalResult(status.finalResult)) return true;\r\n const relation = status.gitAncestry?.relation;\r\n if (relation === \"ahead\" || relation === \"diverged\") return true;\r\n if (status.changedFiles.length > 0 && status.finalResult) return true;\r\n return false;\r\n}\r\n\r\nexport interface WorktreeGuardInput {\r\n indexed: IndexedWorktree | null;\r\n includeOrphans: boolean;\r\n worktreesAgeMs: number;\r\n ageMs: number;\r\n}\r\n\r\nexport function skipWorktreeRemoval(input: WorktreeGuardInput): CleanupSkipReason | null {\r\n const { indexed, includeOrphans, worktreesAgeMs, ageMs } = input;\r\n if (worktreesAgeMs <= 0) return \"worktrees_disabled\";\r\n if (ageMs < worktreesAgeMs) return \"below_age_threshold\";\r\n if (!indexed) return includeOrphans ? null : \"orphan_without_flag\";\r\n if (ACTIVE_RUN_STATUSES.has(indexed.run.status)) return \"run_still_active\";\r\n if (!TERMINAL_RUN_STATUSES.has(indexed.run.status)) return \"run_still_active\";\r\n if (indexed.status.alive) return \"active_worker\";\r\n if (indexed.worker.status === \"running\") return \"active_worker\";\r\n if (indexed.worker.completionBlocker) return \"completion_blocked\";\r\n if (isPrOrUnmergedWork(indexed.status)) return \"pr_or_unmerged_commits\";\r\n if (indexed.status.changedFiles.length > 0) return \"dirty_worktree\";\r\n const landing = assessWorkerLanding({\r\n finalResult: indexed.status.finalResult,\r\n changedFiles: indexed.status.changedFiles,\r\n gitAncestry: indexed.status.gitAncestry,\r\n prUrl: prUrlFromFinalResult(indexed.status.finalResult),\r\n });\r\n if (landing.blocked) return \"landing_blocked\";\r\n return null;\r\n}\r\n\r\nexport interface NodeModulesGuardInput {\r\n indexed: IndexedWorktree | null;\r\n includeOrphans: boolean;\r\n nodeModulesAgeMs: number;\r\n ageMs: number;\r\n}\r\n\r\nexport function skipNodeModulesRemoval(input: NodeModulesGuardInput): CleanupSkipReason | null {\r\n const { indexed, includeOrphans, nodeModulesAgeMs, ageMs } = input;\r\n if (ageMs < nodeModulesAgeMs) return \"below_age_threshold\";\r\n if (!indexed) return includeOrphans ? null : \"orphan_without_flag\";\r\n if (indexed.status.alive) return \"active_worker\";\r\n if (indexed.worker.status === \"running\") return \"active_worker\";\r\n if (indexed.worker.completionBlocker) return \"completion_blocked\";\r\n if (isPrOrUnmergedWork(indexed.status)) return \"pr_or_unmerged_commits\";\r\n if (indexed.status.changedFiles.length > 0) return \"dirty_worktree\";\r\n const landing = assessWorkerLanding({\r\n finalResult: indexed.status.finalResult,\r\n changedFiles: indexed.status.changedFiles,\r\n gitAncestry: indexed.status.gitAncestry,\r\n prUrl: prUrlFromFinalResult(indexed.status.finalResult),\r\n });\r\n if (landing.blocked) return \"landing_blocked\";\r\n return null;\r\n}\r\n", "import { existsSync, rmSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { git } from \"./git.js\";\r\nimport type { CleanupAction, CleanupCandidate, CleanupSkipReason } from \"./cleanup-types.js\";\r\nimport { directorySizeBytes } from \"./cleanup-dir-size.js\";\r\n\r\nexport function removeNodeModules(candidate: CleanupCandidate, execute: boolean): CleanupAction {\r\n if (!existsSync(candidate.path)) {\r\n return {\r\n ...candidate,\r\n executed: false,\r\n skipped: true,\r\n skipReason: \"missing_worktree\",\r\n };\r\n }\r\n if (!execute) {\r\n return { ...candidate, executed: false, skipped: true, skipReason: \"dry_run\" };\r\n }\r\n try {\r\n const bytesBefore = candidate.bytes ?? directorySizeBytes(candidate.path);\r\n rmSync(candidate.path, { recursive: true, force: true });\r\n return {\r\n ...candidate,\r\n bytes: bytesBefore,\r\n executed: true,\r\n skipped: false,\r\n };\r\n } catch (error) {\r\n return {\r\n ...candidate,\r\n executed: false,\r\n skipped: true,\r\n skipReason: \"remove_failed\",\r\n error: (error as Error).message,\r\n };\r\n }\r\n}\r\n\r\nexport function removeWorktree(candidate: CleanupCandidate, execute: boolean): CleanupAction {\r\n if (!existsSync(candidate.path)) {\r\n return {\r\n ...candidate,\r\n executed: false,\r\n skipped: true,\r\n skipReason: \"missing_worktree\",\r\n };\r\n }\r\n if (!execute) {\r\n return { ...candidate, executed: false, skipped: true, skipReason: \"dry_run\" };\r\n }\r\n const repo = candidate.repo;\r\n try {\r\n const bytesBefore = candidate.bytes ?? directorySizeBytes(candidate.path);\r\n if (repo) {\r\n git(repo, [\"worktree\", \"remove\", \"--force\", candidate.path], { allowFailure: true });\r\n }\r\n if (existsSync(candidate.path)) {\r\n rmSync(candidate.path, { recursive: true, force: true });\r\n }\r\n return {\r\n ...candidate,\r\n bytes: bytesBefore,\r\n executed: true,\r\n skipped: false,\r\n };\r\n } catch (error) {\r\n return {\r\n ...candidate,\r\n executed: false,\r\n skipped: true,\r\n skipReason: \"remove_failed\",\r\n error: (error as Error).message,\r\n };\r\n }\r\n}\r\n\r\nexport function isHarnessNodeModulesPath(\r\n targetPath: string,\r\n harnessRoot: string,\r\n worktreesDir: string,\r\n): CleanupSkipReason | null {\r\n const resolved = path.resolve(targetPath);\r\n const nm = resolved.endsWith(`${path.sep}node_modules`) ? resolved : null;\r\n if (!nm) return \"path_outside_harness\";\r\n const rel = path.relative(worktreesDir, nm);\r\n if (rel.startsWith(\"..\") || path.isAbsolute(rel)) return \"path_outside_harness\";\r\n const parts = rel.split(path.sep);\r\n if (parts.length < 3 || parts[parts.length - 1] !== \"node_modules\") return \"path_outside_harness\";\r\n if (!resolved.startsWith(path.resolve(harnessRoot))) return \"path_outside_harness\";\r\n return null;\r\n}\r\n", "import { existsSync, readdirSync, statSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\n\r\n/**\r\n * Best-effort directory size. Returns null when entry cap is exceeded (huge trees).\r\n */\r\nexport function directorySizeBytes(root: string, maxEntries = 50_000): number | null {\r\n if (!existsSync(root)) return 0;\r\n let total = 0;\r\n let seen = 0;\r\n const stack: string[] = [root];\r\n while (stack.length > 0) {\r\n const current = stack.pop()!;\r\n let entries: string[];\r\n try {\r\n entries = readdirSync(current);\r\n } catch {\r\n continue;\r\n }\r\n for (const name of entries) {\r\n if (seen++ > maxEntries) return null;\r\n const full = path.join(current, name);\r\n let st;\r\n try {\r\n st = statSync(full);\r\n } catch {\r\n continue;\r\n }\r\n if (st.isDirectory()) stack.push(full);\r\n else total += st.size;\r\n }\r\n }\r\n return total;\r\n}\r\n", "import { existsSync, readdirSync, statSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport type { CleanupCandidate } from \"./cleanup-types.js\";\r\nimport { buildWorktreeIndex, type IndexedWorktree } from \"./cleanup-worktree-index.js\";\r\n\r\nexport interface ScanHarnessOptions {\r\n harnessRoot: string;\r\n worktreesDir: string;\r\n nodeModulesAgeMs: number;\r\n worktreesAgeMs: number;\r\n includeOrphans: boolean;\r\n runIdFilter?: string;\r\n index: Map<string, IndexedWorktree>;\r\n now: number;\r\n}\r\n\r\nfunction pathAgeMs(target: string, now: number): number {\r\n try {\r\n const mtime = statSync(target).mtimeMs;\r\n return Math.max(0, now - mtime);\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\nfunction isPathInside(child: string, parent: string): boolean {\r\n const rel = path.relative(parent, child);\r\n return rel === \"\" || (!rel.startsWith(\"..\") && !path.isAbsolute(rel));\r\n}\r\n\r\nexport function scanNodeModulesCandidates(opts: ScanHarnessOptions): CleanupCandidate[] {\r\n const candidates: CleanupCandidate[] = [];\r\n const seen = new Set<string>();\r\n\r\n for (const entry of opts.index.values()) {\r\n if (opts.runIdFilter && entry.runId !== opts.runIdFilter) continue;\r\n const nm = path.join(entry.worktreePath, \"node_modules\");\r\n if (!existsSync(nm)) continue;\r\n const resolved = path.resolve(nm);\r\n if (seen.has(resolved)) continue;\r\n seen.add(resolved);\r\n candidates.push({\r\n kind: \"remove_node_modules\",\r\n path: resolved,\r\n bytes: null,\r\n runId: entry.runId,\r\n worker: entry.workerName,\r\n repo: entry.run.repo,\r\n ageMs: pathAgeMs(resolved, opts.now),\r\n });\r\n }\r\n\r\n if (!opts.includeOrphans || !existsSync(opts.worktreesDir)) return candidates;\r\n\r\n for (const runEntry of readdirSync(opts.worktreesDir, { withFileTypes: true })) {\r\n if (!runEntry.isDirectory()) continue;\r\n const runPath = path.join(opts.worktreesDir, runEntry.name);\r\n for (const workerEntry of readdirSync(runPath, { withFileTypes: true })) {\r\n if (!workerEntry.isDirectory()) continue;\r\n const worktreePath = path.join(runPath, workerEntry.name);\r\n const nm = path.join(worktreePath, \"node_modules\");\r\n if (!existsSync(nm)) continue;\r\n const resolved = path.resolve(nm);\r\n if (seen.has(resolved)) continue;\r\n if (!isPathInside(resolved, opts.harnessRoot)) continue;\r\n seen.add(resolved);\r\n candidates.push({\r\n kind: \"remove_node_modules\",\r\n path: resolved,\r\n bytes: null,\r\n runId: runEntry.name,\r\n worker: workerEntry.name,\r\n ageMs: pathAgeMs(resolved, opts.now),\r\n });\r\n }\r\n }\r\n\r\n return candidates;\r\n}\r\n\r\nexport function scanWorktreeCandidates(opts: ScanHarnessOptions): CleanupCandidate[] {\r\n if (opts.worktreesAgeMs <= 0) return [];\r\n const candidates: CleanupCandidate[] = [];\r\n const seen = new Set<string>();\r\n\r\n for (const entry of opts.index.values()) {\r\n if (opts.runIdFilter && entry.runId !== opts.runIdFilter) continue;\r\n const resolved = entry.worktreePath;\r\n if (!existsSync(resolved)) continue;\r\n if (seen.has(resolved)) continue;\r\n seen.add(resolved);\r\n candidates.push({\r\n kind: \"remove_worktree\",\r\n path: resolved,\r\n bytes: null,\r\n runId: entry.runId,\r\n worker: entry.workerName,\r\n repo: entry.run.repo,\r\n ageMs: pathAgeMs(resolved, opts.now),\r\n });\r\n }\r\n\r\n return candidates;\r\n}\r\n", "import path from \"node:path\";\r\nimport { listRunRecords, loadWorker, runDirectory, type HarnessRunRecord } from \"./run-store.js\";\r\nimport { computeWorkerStatus, type HarnessWorkerRecord, type RawHarnessWorkerStatus } from \"./status.js\";\r\nimport { readJson, safeSlug } from \"./util.js\";\r\n\r\nexport interface IndexedWorktree {\r\n worktreePath: string;\r\n runId: string;\r\n workerName: string;\r\n run: HarnessRunRecord;\r\n worker: HarnessWorkerRecord;\r\n status: RawHarnessWorkerStatus;\r\n}\r\n\r\nexport function buildWorktreeIndex(): Map<string, IndexedWorktree> {\r\n const index = new Map<string, IndexedWorktree>();\r\n for (const run of listRunRecords()) {\r\n for (const name of Object.keys(run.workers || {})) {\r\n const workerPath = path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\");\r\n const worker = readJson<HarnessWorkerRecord | undefined>(workerPath, undefined);\r\n if (!worker?.worktreePath) continue;\r\n const status = computeWorkerStatus(worker, { base: run.base, baseCommit: run.baseCommit });\r\n index.set(path.resolve(worker.worktreePath), {\r\n worktreePath: path.resolve(worker.worktreePath),\r\n runId: run.id,\r\n workerName: name,\r\n run,\r\n worker,\r\n status,\r\n });\r\n }\r\n }\r\n return index;\r\n}\r\n\r\n/** Load worker when index miss but path is known from disk layout. */\r\nexport function loadIndexedWorker(runId: string, workerName: string): HarnessWorkerRecord | null {\r\n try {\r\n return loadWorker(runId, workerName);\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 explicitProposed =\r\n args.proposed === true || args.proposed === \"true\"\r\n ? true\r\n : args.proposed === false || args.proposed === \"false\"\r\n ? false\r\n : undefined;\r\n // Harness by-id route rejects `proposed: false` (confirm-done). Implementer checkpoints default to propose.\r\n const proposed =\r\n explicitProposed ??\r\n (status !== \"done\" && (roleLane === \"implementer\" || roleLane === \"repair_implementer\"));\r\n\r\n const body: Record<string, unknown> = {\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 executorRef: args.executorRef ? String(args.executorRef) : provider,\r\n };\r\n if (proposed !== undefined) body.proposed = proposed;\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", "import { readFileSync } from \"node:fs\";\r\nimport { loadUserConfig } from \"./config.js\";\r\nimport { drainPlanOutbox } from \"./plan-persist/drain.js\";\r\nimport { listOutboxItems } from \"./plan-persist/outbox-store.js\";\r\nimport { persistPlan } from \"./plan-persist/persist.js\";\r\nimport type { PlanPersistOperation, PlanPersistFailureKind } from \"./plan-persist/types.js\";\r\nimport { required } from \"./util.js\";\r\nimport { isTmpOnlyPath } from \"./plan-persist/paths.js\";\r\n\r\nconst OPERATIONS: PlanPersistOperation[] = [\"create\", \"add_version\", \"update_metadata\"];\r\nconst FAILURE_KINDS: PlanPersistFailureKind[] = [\r\n \"approval_guard\",\r\n \"auth\",\r\n \"network\",\r\n \"server\",\r\n \"tool_interruption\",\r\n];\r\n\r\nfunction readBodyArg(args: Record<string, string | boolean>): { body: string; bodyPathHint?: string } {\r\n const bodyFile = args.bodyFile ? String(args.bodyFile) : undefined;\r\n if (bodyFile) {\r\n return { body: readFileSync(bodyFile, \"utf8\"), bodyPathHint: bodyFile };\r\n }\r\n const inline = args.body ? String(args.body) : undefined;\r\n if (inline) return { body: inline };\r\n throw new Error(\"requires --body-file PATH or --body TEXT\");\r\n}\r\n\r\nexport async function runPlanPersist(args: Record<string, string | boolean>): Promise<void> {\r\n const operationRaw = required(args.operation ? String(args.operation) : undefined, \"operation\");\r\n if (!OPERATIONS.includes(operationRaw as PlanPersistOperation)) {\r\n throw new Error(`invalid --operation ${operationRaw}`);\r\n }\r\n const operation = operationRaw as PlanPersistOperation;\r\n const cfg = loadUserConfig();\r\n const agentOsSlug = required(\r\n args.slug ? String(args.slug) : cfg.agentOsSlug,\r\n \"slug (or agentOsSlug in ~/.kynver/config.json)\",\r\n );\r\n const title = required(args.title ? String(args.title) : undefined, \"title\");\r\n const { body, bodyPathHint } = readBodyArg(args);\r\n\r\n if (bodyPathHint && isTmpOnlyPath(bodyPathHint)) {\r\n console.warn(\r\n JSON.stringify({\r\n warning:\r\n \"/tmp-only body path is not durable; AgentOS persistence requires outbox or successful API write\",\r\n bodyPathHint,\r\n }),\r\n );\r\n }\r\n\r\n const input = {\r\n operation,\r\n agentOsSlug,\r\n title,\r\n body,\r\n bodyPathHint,\r\n summary: args.summary ? String(args.summary) : undefined,\r\n planId: args.plan ? String(args.plan) : undefined,\r\n planSlug: args.planSlug ? String(args.planSlug) : undefined,\r\n changeSummary: args.changeSummary ? String(args.changeSummary) : undefined,\r\n author: args.author ? String(args.author) : undefined,\r\n model: args.model ? String(args.model) : undefined,\r\n maxRetries: args.maxRetries ? Number(args.maxRetries) : undefined,\r\n immediateFailure: parseImmediateFailure(args),\r\n };\r\n\r\n const result = await persistPlan(input);\r\n console.log(JSON.stringify(result, null, 2));\r\n if (result.userStatus === \"failed and needs action\") process.exit(1);\r\n}\r\n\r\nfunction parseImmediateFailure(\r\n args: Record<string, string | boolean>,\r\n): { kind: PlanPersistFailureKind; message: string } | undefined {\r\n const kind = args.failureKind ? String(args.failureKind) : undefined;\r\n if (!kind) return undefined;\r\n if (!FAILURE_KINDS.includes(kind as PlanPersistFailureKind)) {\r\n throw new Error(`invalid --failure-kind ${kind}`);\r\n }\r\n const message = args.failureMessage\r\n ? String(args.failureMessage)\r\n : `immediate failure (${kind})`;\r\n return { kind: kind as PlanPersistFailureKind, message };\r\n}\r\n\r\nexport async function runPlanOutboxList(): Promise<void> {\r\n const items = listOutboxItems();\r\n console.log(JSON.stringify({ count: items.length, items }, null, 2));\r\n}\r\n\r\nexport async function runPlanOutboxDrain(args: Record<string, string | boolean>): Promise<void> {\r\n const max = args.max ? Number(args.max) : undefined;\r\n const outboxId = args.id ? String(args.id) : undefined;\r\n const result = await drainPlanOutbox({ max, outboxId });\r\n console.log(JSON.stringify(result, null, 2));\r\n if (result.failed > 0) process.exit(1);\r\n}\r\n", "import { runHarnessCleanup } from \"./cleanup.js\";\r\nimport { DEFAULT_NODE_MODULES_AGE_MS } from \"./cleanup-types.js\";\r\n\r\nexport function runCleanupCli(args: Record<string, string | boolean>): void {\r\n const execute = args.execute === true || args.execute === \"true\";\r\n const nodeModulesAgeMs = args.nodeModulesAgeMs\r\n ? Number(args.nodeModulesAgeMs)\r\n : DEFAULT_NODE_MODULES_AGE_MS;\r\n const worktreesAgeMs = args.worktreesAgeMs ? Number(args.worktreesAgeMs) : 0;\r\n const includeOrphans = args.includeOrphans === true || args.includeOrphans === \"true\";\r\n const harnessRoot = args.harnessRoot ? String(args.harnessRoot) : undefined;\r\n\r\n const summary = runHarnessCleanup({\r\n execute,\r\n nodeModulesAgeMs: Number.isFinite(nodeModulesAgeMs) ? nodeModulesAgeMs : DEFAULT_NODE_MODULES_AGE_MS,\r\n worktreesAgeMs: Number.isFinite(worktreesAgeMs) ? worktreesAgeMs : 0,\r\n includeOrphans,\r\n harnessRoot,\r\n });\r\n\r\n console.log(JSON.stringify(summary, null, 2));\r\n\r\n if (execute && summary.totals.removedPaths === 0 && summary.actions.length === 0) {\r\n process.exitCode = 0;\r\n }\r\n}\r\n\r\n", "import path from \"node:path\";\r\nimport { autoCompleteWorker } from \"../auto-complete.js\";\r\nimport { loadRun, loadWorker, runDirectory } from \"../run-store.js\";\r\nimport { renewActiveTaskLeases } from \"../lease-renewal.js\";\r\nimport { computeWorkerStatus, type HarnessWorkerRecord } from \"../status.js\";\r\nimport { isPidAlive, readJson, required, safeSlug, sleepMs } from \"../util.js\";\r\nimport { classifyWorkerHealth } from \"./monitor.classify.js\";\r\nimport {\r\n deleteMonitorSession,\r\n listMonitorSessions,\r\n loadMonitorSession,\r\n monitorIdFor,\r\n saveMonitorSession,\r\n} from \"./monitor.store.js\";\r\nimport { assessAutoCompleteEligibility } from \"./monitor.terminal.js\";\r\nimport type {\r\n MonitorListEntry,\r\n MonitorSessionRecord,\r\n MonitorTickResult,\r\n TaskLeaseSnapshot,\r\n WorkerMonitorView,\r\n} from \"./monitor.types.js\";\r\nimport { fetchTaskLeasesForWorkers } from \"./monitor.task-lease.js\";\r\n\r\nfunction workerRecord(runId: string, name: string): HarnessWorkerRecord | undefined {\r\n return readJson<HarnessWorkerRecord | undefined>(\r\n path.join(runDirectory(runId), \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n}\r\n\r\nfunction workerNamesForRun(runId: string, scope?: string): string[] {\r\n const run = loadRun(runId);\r\n const names = Object.keys(run.workers || {});\r\n if (!scope) return names;\r\n const wanted = safeSlug(scope);\r\n return names.filter((n) => safeSlug(n) === wanted);\r\n}\r\n\r\nfunction buildWorkerView(\r\n worker: HarnessWorkerRecord,\r\n taskLeases: Map<string, TaskLeaseSnapshot>,\r\n): WorkerMonitorView {\r\n const run = loadRun(worker.runId);\r\n const status = computeWorkerStatus(worker, { base: run.base, baseCommit: run.baseCommit });\r\n const taskLease = worker.taskId ? taskLeases.get(worker.taskId) ?? null : null;\r\n const health = classifyWorkerHealth({ worker, status, taskLease });\r\n const autoComplete = assessAutoCompleteEligibility({ worker, status });\r\n return {\r\n runId: worker.runId,\r\n worker: worker.name,\r\n health: health.health,\r\n healthReason: health.reason,\r\n workerStatus: status.status,\r\n attentionState: status.attention.state,\r\n attentionReason: status.attention.reason,\r\n alive: status.alive,\r\n taskId: worker.taskId,\r\n leaseOwner: taskLease?.leaseOwner ?? undefined,\r\n taskStatus: taskLease?.status,\r\n autoComplete,\r\n status,\r\n };\r\n}\r\n\r\n/** One monitor poll: classify workers, renew leases, auto-complete when verified terminal. */\r\nexport async function runMonitorTick(\r\n args: Record<string, string | boolean>,\r\n): Promise<MonitorTickResult> {\r\n const runId = String(args.run || \"\");\r\n required(runId, \"--run\");\r\n const scope = args.name ? String(args.name) : undefined;\r\n const agentOsId = args.agentOsId ? String(args.agentOsId) : undefined;\r\n const run = loadRun(runId);\r\n const names = workerNamesForRun(runId, scope);\r\n const workers: HarnessWorkerRecord[] = [];\r\n for (const name of names) {\r\n const worker = workerRecord(runId, name);\r\n if (worker) workers.push(worker);\r\n }\r\n\r\n const resolvedAgentOsId =\r\n agentOsId ||\r\n workers.map((w) => w.agentOsId).find((id) => typeof id === \"string\" && id.trim()) ||\r\n undefined;\r\n\r\n const taskIds = workers.map((w) => w.taskId).filter((id): id is string => Boolean(id));\r\n const taskLeases = await fetchTaskLeasesForWorkers({\r\n agentOsId: resolvedAgentOsId,\r\n taskIds,\r\n baseUrl: args.baseUrl ? String(args.baseUrl) : undefined,\r\n secret: args.secret ? String(args.secret) : undefined,\r\n });\r\n\r\n const views = workers.map((w) => buildWorkerView(w, taskLeases));\r\n\r\n let leaseRenewal: MonitorTickResult[\"leaseRenewal\"];\r\n if (resolvedAgentOsId && args.renewLeases !== false && args.renewLeases !== \"false\") {\r\n leaseRenewal = await renewActiveTaskLeases(runId, {\r\n ...args,\r\n agentOsId: resolvedAgentOsId,\r\n });\r\n }\r\n\r\n const autoCompleted: MonitorTickResult[\"autoCompleted\"] = [];\r\n const shouldAutoComplete = args.autoComplete === true || args.autoComplete === \"true\";\r\n if (shouldAutoComplete) {\r\n for (const view of views) {\r\n if (!view.autoComplete.eligible) {\r\n autoCompleted.push({\r\n worker: view.worker,\r\n outcome: \"skipped\",\r\n ok: false,\r\n reason: view.autoComplete.blockers.join(\"; \") || \"not eligible\",\r\n });\r\n continue;\r\n }\r\n const outcome = await autoCompleteWorker({\r\n run: runId,\r\n name: view.worker,\r\n ...(resolvedAgentOsId ? { agentOsId: resolvedAgentOsId } : {}),\r\n ...(args.baseUrl ? { baseUrl: String(args.baseUrl) } : {}),\r\n ...(args.secret ? { secret: String(args.secret) } : {}),\r\n });\r\n autoCompleted.push({\r\n worker: view.worker,\r\n outcome: outcome.outcome,\r\n ok: outcome.outcome === \"completed\",\r\n reason: outcome.reason,\r\n });\r\n }\r\n }\r\n\r\n return {\r\n runId,\r\n agentOsId: resolvedAgentOsId,\r\n workers: views,\r\n leaseRenewal,\r\n autoCompleted,\r\n };\r\n}\r\n\r\nexport function getMonitorStatus(args: Record<string, string | boolean>): MonitorTickResult {\r\n const runId = String(args.run || \"\");\r\n required(runId, \"--run\");\r\n const scope = args.name ? String(args.name) : undefined;\r\n const names = workerNamesForRun(runId, scope);\r\n const workers: WorkerMonitorView[] = [];\r\n for (const name of names) {\r\n const worker = workerRecord(runId, name);\r\n if (!worker) continue;\r\n workers.push(buildWorkerView(worker, new Map()));\r\n }\r\n return { runId, workers, autoCompleted: [] };\r\n}\r\n\r\nexport function listMonitors(): MonitorListEntry[] {\r\n return listMonitorSessions();\r\n}\r\n\r\nexport interface StartMonitorResult {\r\n monitorId: string;\r\n session: MonitorSessionRecord;\r\n spawned: boolean;\r\n pid?: number;\r\n}\r\n\r\nexport function stopMonitor(args: Record<string, string | boolean>): {\r\n monitorId: string;\r\n stopped: boolean;\r\n pid?: number;\r\n} {\r\n const runId = String(args.run || \"\");\r\n required(runId, \"--run\");\r\n const monitorId = monitorIdFor(runId, args.name ? String(args.name) : undefined);\r\n const session = loadMonitorSession(monitorId);\r\n if (!session) {\r\n return { monitorId, stopped: false };\r\n }\r\n if (session.pid && isPidAlive(session.pid)) {\r\n try {\r\n process.kill(session.pid, \"SIGTERM\");\r\n } catch {\r\n // best effort\r\n }\r\n }\r\n session.stoppedAt = new Date().toISOString();\r\n saveMonitorSession(session);\r\n deleteMonitorSession(monitorId);\r\n return { monitorId, stopped: true, pid: session.pid };\r\n}\r\n\r\nexport async function monitorAutoCompleteCli(\r\n args: Record<string, string | boolean>,\r\n): Promise<void> {\r\n const runId = String(args.run || \"\");\r\n const name = String(args.name || \"\");\r\n required(runId, \"--run\");\r\n required(name, \"--name\");\r\n const worker = loadWorker(runId, name);\r\n const run = loadRun(runId);\r\n const status = computeWorkerStatus(worker, { base: run.base, baseCommit: run.baseCommit });\r\n const assessment = assessAutoCompleteEligibility({ worker, status });\r\n if (!assessment.eligible) {\r\n console.log(\r\n JSON.stringify(\r\n {\r\n runId,\r\n worker: name,\r\n outcome: \"blocked\",\r\n blockers: assessment.blockers,\r\n terminalVerified: assessment.terminalVerified,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n process.exitCode = 1;\r\n return;\r\n }\r\n const outcome = await autoCompleteWorker({\r\n ...args,\r\n run: runId,\r\n name,\r\n });\r\n console.log(JSON.stringify(outcome, null, 2));\r\n if (outcome.outcome !== \"completed\" && outcome.outcome !== \"blocked\") {\r\n process.exitCode = 1;\r\n }\r\n}\r\n", "import { STALE_MS, type HarnessWorkerRecord, type RawHarnessWorkerStatus } from \"../status.js\";\r\nimport { isPidAlive } from \"../util.js\";\r\nimport type { TaskLeaseSnapshot, WorkerHealthClass } from \"./monitor.types.js\";\r\n\r\nexport interface WorkerHealthClassification {\r\n health: WorkerHealthClass;\r\n reason: string;\r\n}\r\n\r\nfunction expectedLeaseOwner(runId: string): string {\r\n return `kynver-harness:${runId}`;\r\n}\r\n\r\n/**\r\n * Classify harness worker disk state vs optional board lease snapshot.\r\n * `running` on AgentTask means live executor lease \u2014 not plan-row `in_progress`.\r\n */\r\nexport function classifyWorkerHealth(input: {\r\n worker: HarnessWorkerRecord;\r\n status: RawHarnessWorkerStatus;\r\n taskLease?: TaskLeaseSnapshot | null;\r\n}): WorkerHealthClassification {\r\n const { worker, status, taskLease } = input;\r\n const leaseOwner = taskLease?.leaseOwner ?? null;\r\n const expectedOwner = expectedLeaseOwner(worker.runId);\r\n\r\n if (worker.dispatched && taskLease) {\r\n if (taskLease.status === \"running\" && leaseOwner && leaseOwner !== expectedOwner) {\r\n return {\r\n health: \"orphaned\",\r\n reason: `task lease held by ${leaseOwner}, expected ${expectedOwner}`,\r\n };\r\n }\r\n if (taskLease.status === \"running\" && !status.alive && !status.finalResult) {\r\n return {\r\n health: \"orphaned\",\r\n reason: \"board task running but worker process is not alive\",\r\n };\r\n }\r\n }\r\n\r\n if (worker.status === \"running\" && !status.alive && !status.finalResult) {\r\n return {\r\n health: \"orphaned\",\r\n reason: \"worker.json still running but process is dead\",\r\n };\r\n }\r\n\r\n if (status.attention.state === \"stale\") {\r\n return { health: \"stale\", reason: status.attention.reason };\r\n }\r\n\r\n const hbMs = status.lastHeartbeatAt ? Date.parse(status.lastHeartbeatAt) : NaN;\r\n if (status.alive && Number.isFinite(hbMs) && Date.now() - hbMs > STALE_MS) {\r\n return {\r\n health: \"stale\",\r\n reason: `heartbeat older than ${Math.floor(STALE_MS / 1000)}s`,\r\n };\r\n }\r\n\r\n if (status.alive && worker.pid && !isPidAlive(worker.pid)) {\r\n return { health: \"orphaned\", reason: \"pid recorded but process is not alive\" };\r\n }\r\n\r\n if (taskLease?.status === \"running\" && !status.alive && status.finalResult) {\r\n return {\r\n health: \"healthy\",\r\n reason: \"finished worker awaiting completion replay\",\r\n };\r\n }\r\n\r\n return {\r\n health: \"healthy\",\r\n reason: status.attention.reason || \"worker within expected lifecycle bounds\",\r\n };\r\n}\r\n", "import { existsSync, mkdirSync, readdirSync, unlinkSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { getHarnessPaths } from \"../paths.js\";\r\nimport { isPidAlive, readJson, safeSlug, writeJson } from \"../util.js\";\r\nimport type { MonitorListEntry, MonitorSessionRecord } from \"./monitor.types.js\";\r\n\r\nfunction monitorsDir(): string {\r\n const { harnessRoot } = getHarnessPaths();\r\n const dir = path.join(harnessRoot, \"monitors\");\r\n mkdirSync(dir, { recursive: true });\r\n return dir;\r\n}\r\n\r\nexport function monitorIdFor(runId: string, workerName?: string): string {\r\n return workerName ? `${safeSlug(runId)}--${safeSlug(workerName)}` : safeSlug(runId);\r\n}\r\n\r\nfunction monitorPath(monitorId: string): string {\r\n return path.join(monitorsDir(), `${monitorId}.json`);\r\n}\r\n\r\nexport function loadMonitorSession(monitorId: string): MonitorSessionRecord | undefined {\r\n return readJson<MonitorSessionRecord | undefined>(monitorPath(monitorId), undefined);\r\n}\r\n\r\nexport function saveMonitorSession(session: MonitorSessionRecord): void {\r\n writeJson(monitorPath(session.monitorId), session);\r\n}\r\n\r\nexport function deleteMonitorSession(monitorId: string): boolean {\r\n const file = monitorPath(monitorId);\r\n if (!existsSync(file)) return false;\r\n unlinkSync(file);\r\n return true;\r\n}\r\n\r\nexport function listMonitorSessions(): MonitorListEntry[] {\r\n const dir = monitorsDir();\r\n if (!existsSync(dir)) return [];\r\n const entries: MonitorListEntry[] = [];\r\n for (const name of readdirSync(dir)) {\r\n if (!name.endsWith(\".json\")) continue;\r\n const session = readJson<MonitorSessionRecord | undefined>(\r\n path.join(dir, name),\r\n undefined,\r\n );\r\n if (!session?.monitorId) continue;\r\n entries.push({\r\n monitorId: session.monitorId,\r\n runId: session.runId,\r\n workerName: session.workerName,\r\n agentOsId: session.agentOsId,\r\n pid: session.pid,\r\n alive: session.pid ? isPidAlive(session.pid) : false,\r\n startedAt: session.startedAt,\r\n pollMs: session.pollMs,\r\n logPath: session.logPath,\r\n });\r\n }\r\n return entries.sort((a, b) => a.startedAt.localeCompare(b.startedAt));\r\n}\r\n", "import { hasCompletionAck } from \"../completion-ack.js\";\r\nimport {\r\n isFinishedWorkerStatus,\r\n isLandingBlockedWorkerStatus,\r\n type HarnessWorkerRecord,\r\n type RawHarnessWorkerStatus,\r\n} from \"../status.js\";\r\nimport type { AutoCompleteAssessment } from \"./monitor.types.js\";\r\n\r\n/**\r\n * Auto-complete may only run when the worker has reached a verified terminal\r\n * condition and no structural blocker is present. Never paper over heartbeat\r\n * blockers, landing gates, or completion replay failures.\r\n */\r\nexport function assessAutoCompleteEligibility(input: {\r\n worker: HarnessWorkerRecord;\r\n status: RawHarnessWorkerStatus;\r\n}): AutoCompleteAssessment {\r\n const { worker, status } = input;\r\n const blockers: string[] = [];\r\n\r\n if (worker.localOnly) {\r\n blockers.push(\"local-only worker (no board linkage)\");\r\n }\r\n if (!worker.agentOsId || !worker.taskId) {\r\n blockers.push(\"missing agentOsId/taskId linkage\");\r\n }\r\n if (hasCompletionAck(worker)) {\r\n blockers.push(\"completion already acknowledged\");\r\n }\r\n if (worker.completionBlocker) {\r\n blockers.push(worker.completionBlocker);\r\n }\r\n if (status.heartbeatBlocker && status.alive) {\r\n blockers.push(`worker heartbeat blocker: ${status.heartbeatBlocker}`);\r\n }\r\n if (status.attention.state === \"blocked\") {\r\n blockers.push(status.attention.reason || \"worker attention blocked\");\r\n }\r\n if (isLandingBlockedWorkerStatus(status)) {\r\n blockers.push(status.attention.reason || \"landing gate blocked\");\r\n }\r\n\r\n const terminalVerified = isFinishedWorkerStatus(status);\r\n let terminalReason: string | undefined;\r\n if (terminalVerified) {\r\n if (status.finalResult) terminalReason = \"final_result\";\r\n else if (!status.alive) terminalReason = \"process_exited\";\r\n else terminalReason = \"terminal_status\";\r\n } else {\r\n blockers.push(\"worker has not reached a terminal condition\");\r\n }\r\n\r\n const eligible = terminalVerified && blockers.length === 0;\r\n return {\r\n eligible,\r\n terminalVerified,\r\n terminalReason,\r\n blockers,\r\n };\r\n}\r\n", "import { resolveBaseUrl, resolveCallbackSecretWithMint } from \"../config.js\";\r\nimport { postJsonWithCredentialRefresh } from \"../callbacks.js\";\r\nimport type { TaskLeaseSnapshot } from \"./monitor.types.js\";\r\n\r\n/**\r\n * Best-effort board lease snapshot for monitor classification. Failures return\r\n * an empty map \u2014 local disk classification still runs without server data.\r\n */\r\nexport async function fetchTaskLeasesForWorkers(input: {\r\n agentOsId?: string;\r\n taskIds: string[];\r\n baseUrl?: string;\r\n secret?: string;\r\n}): Promise<Map<string, TaskLeaseSnapshot>> {\r\n const out = new Map<string, TaskLeaseSnapshot>();\r\n const agentOsId = input.agentOsId?.trim();\r\n if (!agentOsId || input.taskIds.length === 0) return out;\r\n\r\n const base = resolveBaseUrl(input.baseUrl);\r\n try {\r\n const secret = await resolveCallbackSecretWithMint(input.secret, agentOsId, { baseUrl: base });\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/harness/monitor/task-leases`;\r\n\r\n const res = await postJsonWithCredentialRefresh(\r\n url,\r\n secret,\r\n { taskIds: [...new Set(input.taskIds)] },\r\n { agentOsId, baseUrl: base },\r\n );\r\n if (!res.ok || !res.response || typeof res.response !== \"object\") return out;\r\n const rows = (res.response as { tasks?: TaskLeaseSnapshot[] }).tasks;\r\n if (!Array.isArray(rows)) return out;\r\n for (const row of rows) {\r\n if (row?.taskId) out.set(row.taskId, row);\r\n }\r\n } catch {\r\n // Best-effort \u2014 local classification still runs without board lease data.\r\n }\r\n return out;\r\n}\r\n", "import { runMonitorTick } from \"./monitor.service.js\";\r\nimport { loadMonitorSession, saveMonitorSession } from \"./monitor.store.js\";\r\nimport { sleepMs } from \"../util.js\";\r\n\r\nconst DEFAULT_POLL_MS = 5_000;\r\nconst DEFAULT_MAX_TOTAL_MS = 6 * 60 * 60 * 1000;\r\n\r\nexport async function runMonitorLoop(args: Record<string, string | boolean>): Promise<void> {\r\n const monitorId = String(args.monitorId || \"\");\r\n const pollMs =\r\n Number(args.pollMs) > 0 ? Math.floor(Number(args.pollMs)) : DEFAULT_POLL_MS;\r\n const maxTotalMs =\r\n Number(args.maxTotalMs) > 0 ? Math.floor(Number(args.maxTotalMs)) : DEFAULT_MAX_TOTAL_MS;\r\n const startMs = Date.now();\r\n\r\n while (Date.now() - startMs <= maxTotalMs) {\r\n const session = monitorId ? loadMonitorSession(monitorId) : undefined;\r\n if (session?.stoppedAt) break;\r\n\r\n const tick = await runMonitorTick({\r\n ...args,\r\n autoComplete: args.autoComplete ?? true,\r\n renewLeases: args.renewLeases ?? true,\r\n });\r\n console.log(JSON.stringify({ monitorId, phase: \"tick\", ...tick }));\r\n\r\n const allTerminal =\r\n tick.workers.length > 0 &&\r\n tick.workers.every(\r\n (w) =>\r\n w.autoComplete.terminalVerified &&\r\n (w.autoComplete.eligible ||\r\n w.autoComplete.blockers.some((b) => b.includes(\"already acknowledged\"))),\r\n );\r\n if (allTerminal && tick.autoCompleted.every((a) => a.ok || a.outcome === \"skipped\")) {\r\n if (monitorId && session) {\r\n session.stoppedAt = new Date().toISOString();\r\n saveMonitorSession(session);\r\n }\r\n break;\r\n }\r\n\r\n sleepMs(pollMs);\r\n }\r\n}\r\n", "import { spawn } from \"node:child_process\";\r\nimport { closeSync, existsSync, openSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { fileURLToPath } from \"node:url\";\r\nimport { hiddenSpawnOptions } from \"../util.js\";\r\nimport { getHarnessPaths } from \"../paths.js\";\r\nimport { monitorIdFor, saveMonitorSession } from \"./monitor.store.js\";\r\nimport type { MonitorSessionRecord } from \"./monitor.types.js\";\r\n\r\nexport interface SpawnMonitorOptions {\r\n runId: string;\r\n workerName?: string;\r\n agentOsId?: string;\r\n pollMs?: number;\r\n cliPath?: string;\r\n nodeExecutable?: string;\r\n baseUrl?: string;\r\n secret?: string;\r\n}\r\n\r\nexport interface SpawnedMonitor {\r\n monitorId: string;\r\n pid?: number;\r\n logPath: string;\r\n session: MonitorSessionRecord;\r\n}\r\n\r\nfunction resolveDefaultCliPath(): string {\r\n return path.join(fileURLToPath(new URL(\".\", import.meta.url)), \"..\", \"cli.js\");\r\n}\r\n\r\nexport function spawnMonitorSidecar(opts: SpawnMonitorOptions): SpawnedMonitor | undefined {\r\n const cliPath = opts.cliPath ?? resolveDefaultCliPath();\r\n if (!existsSync(cliPath)) return undefined;\r\n\r\n const monitorId = monitorIdFor(opts.runId, opts.workerName);\r\n const { harnessRoot } = getHarnessPaths();\r\n const logPath = path.join(harnessRoot, \"monitors\", `${monitorId}.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\r\n const nodeExecutable = opts.nodeExecutable ?? process.execPath;\r\n const pollMs = opts.pollMs ?? 5_000;\r\n const args = [\r\n cliPath,\r\n \"monitor\",\r\n \"run-loop\",\r\n \"--run\",\r\n opts.runId,\r\n \"--monitor-id\",\r\n monitorId,\r\n \"--poll-ms\",\r\n String(pollMs),\r\n \"--auto-complete\",\r\n \"true\",\r\n \"--renew-leases\",\r\n \"true\",\r\n ];\r\n if (opts.workerName) args.push(\"--name\", opts.workerName);\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\r\n const stdio: (\"ignore\" | number)[] = [\r\n \"ignore\",\r\n logFd ?? \"ignore\",\r\n logFd ?? \"ignore\",\r\n ];\r\n\r\n try {\r\n const child = spawn(\r\n nodeExecutable,\r\n args,\r\n hiddenSpawnOptions({\r\n detached: true,\r\n stdio,\r\n env: process.env,\r\n }),\r\n );\r\n if (logFd !== undefined) closeSync(logFd);\r\n child.unref();\r\n\r\n const session: MonitorSessionRecord = {\r\n monitorId,\r\n runId: opts.runId,\r\n workerName: opts.workerName,\r\n agentOsId: opts.agentOsId,\r\n pid: child.pid,\r\n startedAt: new Date().toISOString(),\r\n pollMs,\r\n logPath,\r\n };\r\n saveMonitorSession(session);\r\n return { monitorId, pid: child.pid, logPath, session };\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 { runMonitorLoop } from \"./monitor-loop.js\";\r\nimport { spawnMonitorSidecar } from \"./monitor-spawn.js\";\r\nimport {\r\n getMonitorStatus,\r\n listMonitors,\r\n monitorAutoCompleteCli,\r\n runMonitorTick,\r\n stopMonitor,\r\n} from \"./monitor.service.js\";\r\nimport type { StartMonitorResult } from \"./monitor.service.js\";\r\nimport { loadMonitorSession, monitorIdFor } from \"./monitor.store.js\";\r\nimport { required } from \"../util.js\";\r\n\r\nexport async function startMonitorCli(\r\n args: Record<string, string | boolean>,\r\n): Promise<StartMonitorResult> {\r\n const runId = String(args.run || \"\");\r\n required(runId, \"--run\");\r\n const workerName = args.name ? String(args.name) : undefined;\r\n const monitorId = monitorIdFor(runId, workerName);\r\n const existing = loadMonitorSession(monitorId);\r\n if (existing?.pid && !existing.stoppedAt) {\r\n return { monitorId, session: existing, spawned: false, pid: existing.pid };\r\n }\r\n\r\n const spawned = spawnMonitorSidecar({\r\n runId,\r\n workerName,\r\n agentOsId: args.agentOsId ? String(args.agentOsId) : undefined,\r\n pollMs: Number(args.pollMs) > 0 ? Math.floor(Number(args.pollMs)) : undefined,\r\n baseUrl: args.baseUrl ? String(args.baseUrl) : undefined,\r\n secret: args.secret ? String(args.secret) : undefined,\r\n });\r\n if (!spawned) {\r\n throw new Error(\"failed to spawn monitor sidecar (cli.js missing or spawn error)\");\r\n }\r\n return {\r\n monitorId,\r\n session: spawned.session,\r\n spawned: true,\r\n pid: spawned.pid,\r\n };\r\n}\r\n\r\nexport async function monitorStatusCli(args: Record<string, string | boolean>): Promise<void> {\r\n const runId = String(args.run || \"\");\r\n if (runId) {\r\n const tick = args.tick === true || args.tick === \"true\"\r\n ? await runMonitorTick({ ...args, autoComplete: false })\r\n : getMonitorStatus(args);\r\n console.log(JSON.stringify(tick, null, 2));\r\n return;\r\n }\r\n console.log(JSON.stringify({ monitors: listMonitors() }, null, 2));\r\n}\r\n\r\nexport function monitorStopCli(args: Record<string, string | boolean>): void {\r\n console.log(JSON.stringify(stopMonitor(args), null, 2));\r\n}\r\n\r\nexport function monitorListCli(): void {\r\n console.log(JSON.stringify({ monitors: listMonitors() }, null, 2));\r\n}\r\n\r\nexport async function monitorRunLoopCli(args: Record<string, string | boolean>): Promise<void> {\r\n await runMonitorLoop(args);\r\n}\r\n\r\nexport async function monitorTickCli(args: Record<string, string | boolean>): Promise<void> {\r\n const tick = await runMonitorTick(args);\r\n console.log(JSON.stringify(tick, null, 2));\r\n}\r\n\r\nexport {\r\n monitorAutoCompleteCli,\r\n startMonitorCli as startMonitor,\r\n getMonitorStatus,\r\n listMonitors,\r\n runMonitorTick,\r\n stopMonitor,\r\n};\r\n", "import { existsSync, readFileSync } from \"node:fs\";\r\nimport { dirname, join } from \"node:path\";\r\nimport { fileURLToPath } from \"node:url\";\r\n\r\nfunction resolvePackageRoot(moduleUrl: string): string {\r\n let dir = dirname(fileURLToPath(moduleUrl));\r\n for (let depth = 0; depth < 6; depth += 1) {\r\n if (existsSync(join(dir, \"package.json\"))) return dir;\r\n const parent = dirname(dir);\r\n if (parent === dir) break;\r\n dir = parent;\r\n }\r\n throw new Error(`package.json not found above ${dirname(fileURLToPath(moduleUrl))}`);\r\n}\r\n\r\nexport function readOwnPackageVersion(moduleUrl: string = import.meta.url): string {\r\n const pkgPath = join(resolvePackageRoot(moduleUrl), \"package.json\");\r\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf8\")) as { version?: string };\r\n if (typeof pkg.version !== \"string\" || !pkg.version.trim()) {\r\n throw new Error(`Missing package.json version at ${pkgPath}`);\r\n }\r\n return pkg.version;\r\n}\r\n\r\nexport const PACKAGE_VERSION = readOwnPackageVersion();\r\n\r\nexport function wantsCliVersion(argv: string[]): boolean {\r\n return argv.some((arg) => arg === \"--version\" || arg === \"-v\");\r\n}\r\n\r\nexport function printCliVersionAndExit(version: string, binName?: string): never {\r\n console.log(binName ? `${binName} ${version}` : version);\r\n process.exit(0);\r\n}\r\n\r\nexport function handleCliVersionFlag(\r\n argv: string[],\r\n moduleUrl: string = import.meta.url,\r\n binName?: string,\r\n): boolean {\r\n if (!wantsCliVersion(argv)) return false;\r\n printCliVersionAndExit(readOwnPackageVersion(moduleUrl), binName);\r\n return true;\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", "path", "readFileSync", "path", "existsSync", "readdirSync", "path", "existsSync", "homedir", "path", "path", "homedir", "existsSync", "path", "existsSync", "readdirSync", "existsSync", "readFileSync", "existsSync", "readFileSync", "existsSync", "readFileSync", "existsSync", "readFileSync", "oneLine", "trimOrNull", "hasFinalResult", "trimOrNull", "hasFinalResult", "tail", "readFileSync", "path", "taskString", "model", "positiveInt", "path", "path", "existsSync", "mkdirSync", "path", "closeSync", "existsSync", "openSync", "spawn", "path", "existsSync", "readdirSync", "path", "existsSync", "path", "openSync", "spawn", "closeSync", "spawn", "existsSync", "openSync", "closeSync", "path", "path", "trimOrNull", "spawnSync", "spawnSync", "path", "path", "path", "path", "existsSync", "openSync", "spawn", "closeSync", "path", "mkdirSync", "existsSync", "url", "body", "res", "parsed", "row", "createHash", "createHash", "mkdirSync", "homedir", "path", "existsSync", "readFileSync", "readdirSync", "writeFileSync", "path", "readdirSync", "path", "existsSync", "readFileSync", "writeFileSync", "path", "path", "summary", "path", "path", "existsSync", "mkdirSync", "path", "path", "path", "existsSync", "mkdirSync", "path", "path", "path", "path", "path", "path", "path", "path", "path", "ACTIVE_RUN_STATUSES", "existsSync", "path", "existsSync", "readdirSync", "statSync", "path", "existsSync", "path", "existsSync", "readdirSync", "statSync", "path", "path", "path", "path", "path", "readFileSync", "readFileSync", "path", "existsSync", "mkdirSync", "readdirSync", "unlinkSync", "path", "path", "mkdirSync", "existsSync", "unlinkSync", "readdirSync", "workerRecord", "path", "DEFAULT_POLL_MS", "DEFAULT_MAX_TOTAL_MS", "spawn", "closeSync", "existsSync", "openSync", "path", "fileURLToPath", "resolveDefaultCliPath", "path", "fileURLToPath", "existsSync", "openSync", "spawn", "closeSync", "existsSync", "readFileSync", "fileURLToPath", "mkdirSync", "fileURLToPath"]
|
|
7
7
|
}
|