@isarai/maestro 0.1.0 → 0.1.2
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/index.js +15 -4
- package/dist/index.js.map +2 -2
- package/dist/server.js +196 -165
- package/dist/server.js.map +4 -4
- package/package.json +1 -1
package/dist/server.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../server/src/agents/sandbox.ts", "../../server/src/agents/pty-manager.ts", "../../server/src/agents/providers.ts", "../../server/src/agents/terminal-attach.ts", "../../server/src/agents/terminal-input-history.ts", "../../server/src/agents/terminal-replica.ts", "../../server/src/
|
|
4
|
-
"sourcesContent": ["import * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport { execFileSync, execSync } from \"child_process\";\nimport { fileURLToPath } from \"url\";\nimport type { SandboxProvider } from \"@maestro/wire\";\n\nexport interface SandboxConfig {\n /** Working directory (read-write) */\n cwd: string;\n /** Optional isolated HOME directory for the sandbox process */\n homeDir?: string;\n /** Environment variables to pass into the sandbox */\n env: Record<string, string>;\n /** Additional read-only mount paths (e.g. secondary project dirs) */\n readonlyMounts?: string[];\n /** Additional read-write mount paths */\n writableMounts?: string[];\n /** Additional Docker-only mounts (e.g. named volumes) */\n dockerExtraMounts?: DockerMountSpec[];\n /** Memory limit in bytes (default: 512MB) */\n memoryLimit?: number;\n /** Max number of child processes (default: 64) */\n maxProcesses?: number;\n}\n\ninterface DockerInspectMount {\n Type?: string;\n Source?: string;\n Name?: string;\n Destination?: string;\n RW?: boolean;\n}\n\nexport interface DockerMountSpec {\n type: \"bind\" | \"volume\";\n source: string;\n target: string;\n readonly: boolean;\n}\n\nconst SANDBOX_UID = 1500;\nconst SANDBOX_GID = 1500;\nconst BASE_READONLY_MOUNTS = [\"/usr\", \"/bin\", \"/lib\", \"/sbin\", \"/etc\"];\nconst BASE_PATH_DIRS = [\n \"/usr/local/sbin\",\n \"/usr/local/bin\",\n \"/usr/sbin\",\n \"/usr/bin\",\n \"/sbin\",\n \"/bin\",\n];\nconst DEFAULT_DOCKER_IMAGE = process.env.MAESTRO_DOCKER_SANDBOX_IMAGE || \"maestro-sandbox:latest\";\nconst DEFAULT_MEMORY_LIMIT = 512 * 1024 * 1024;\nconst DEFAULT_MAX_PROCESSES = 64;\n\nlet nsjailPath: string | null | undefined; // undefined = not checked yet\nlet nsjailRuntimeAvailable: boolean | undefined;\nlet nsjailUnavailableReason: string | null | undefined;\nlet dockerPath: string | null | undefined; // undefined = not checked yet\nlet dockerServerReachable: boolean | undefined;\nlet dockerImageReadyFor: string | null = null;\nlet cachedSelfMounts: DockerInspectMount[] | undefined;\nlet runningInsideContainer: boolean | undefined;\n\nfunction resolveBinaryPath(binary: \"docker\" | \"nsjail\"): string | null {\n try {\n return execSync(`which ${binary}`, { encoding: \"utf-8\" }).trim() || null;\n } catch {\n return null;\n }\n}\n\nfunction runNsjailSelfTest(\n binaryPath: string\n): { ok: true; reason: null } | { ok: false; reason: string } {\n const args = [\n \"--mode\", \"o\",\n \"--chroot\", \"/\",\n \"--user\", \"0\",\n \"--group\", \"0\",\n \"--disable_clone_newuser\",\n \"--disable_clone_newnet\",\n \"--cwd\", \"/\",\n \"--bindmount_ro\", \"/usr:/usr\",\n \"--bindmount_ro\", \"/bin:/bin\",\n \"--bindmount_ro\", \"/lib:/lib\",\n \"--bindmount_ro\", \"/sbin:/sbin\",\n \"--bindmount_ro\", \"/etc:/etc\",\n \"--bindmount\", \"/dev:/dev\",\n \"--tmpfsmount\", \"/tmp\",\n ];\n\n if (fs.existsSync(\"/lib64\")) {\n args.push(\"--bindmount_ro\", \"/lib64:/lib64\");\n }\n\n args.push(\"--\", \"/bin/true\");\n\n try {\n execFileSync(binaryPath, args, {\n stdio: [\"ignore\", \"ignore\", \"pipe\"],\n });\n return { ok: true, reason: null };\n } catch (error) {\n return {\n ok: false,\n reason: formatNsjailSelfTestError(error),\n };\n }\n}\n\nfunction formatNsjailSelfTestError(error: unknown): string {\n const appArmorProfile = getCurrentAppArmorProfile();\n\n if (\n error &&\n typeof error === \"object\" &&\n \"stderr\" in error &&\n (typeof error.stderr === \"string\" || Buffer.isBuffer(error.stderr))\n ) {\n const stderr = String(error.stderr)\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n\n const detail =\n stderr.find((line) => line.includes(\"Permission denied\")) ||\n stderr.find((line) => line.includes(\"buildMountTree()\")) ||\n stderr.find((line) => line.includes(\"runChild()\")) ||\n stderr.at(-1);\n\n if (detail) {\n return buildNsjailUnavailableReason(detail, appArmorProfile);\n }\n }\n\n return buildNsjailUnavailableReason(\"nsjail runtime self-test failed\", appArmorProfile);\n}\n\nfunction buildNsjailUnavailableReason(detail: string, appArmorProfile: string | null): string {\n if (detail.includes(\"Permission denied\")) {\n if (appArmorProfile && appArmorProfile !== \"unconfined\") {\n return (\n `${detail}. Active AppArmor profile '${appArmorProfile}' is likely blocking mount namespace setup; ` +\n \"when running Maestro in Docker, add `security_opt: [\\\"seccomp=unconfined\\\", \\\"apparmor=unconfined\\\"]` \" +\n \"to the server container or run it with `--privileged`.\"\n );\n }\n\n return (\n `${detail}. The runtime is blocking mount namespace setup required by nsjail; ` +\n \"when running in Docker, allow unconfined AppArmor/seccomp or run with `--privileged`.\"\n );\n }\n\n return detail;\n}\n\nfunction getCurrentAppArmorProfile(): string | null {\n try {\n const profile = fs.readFileSync(\"/proc/self/attr/current\", \"utf-8\").trim();\n return profile || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Check if nsjail is available on the system.\n */\nexport function isNsjailAvailable(): boolean {\n if (process.platform !== \"linux\") {\n nsjailUnavailableReason =\n `nsjail is only supported on Linux (current platform: ${process.platform})`;\n return false;\n }\n\n if (nsjailPath === undefined) {\n nsjailPath = resolveBinaryPath(\"nsjail\");\n }\n\n if (!nsjailPath) {\n nsjailUnavailableReason = \"nsjail binary was not found in PATH\";\n return false;\n }\n\n if (nsjailRuntimeAvailable === undefined) {\n const result = runNsjailSelfTest(nsjailPath);\n nsjailRuntimeAvailable = result.ok;\n nsjailUnavailableReason = result.reason;\n }\n\n return nsjailRuntimeAvailable;\n}\n\n/**\n * Get the resolved nsjail binary path.\n */\nexport function getNsjailPath(): string {\n if (!isNsjailAvailable() || !nsjailPath) {\n const reason = nsjailUnavailableReason ? `: ${nsjailUnavailableReason}` : \"\";\n throw new Error(`nsjail is not available${reason}`);\n }\n return nsjailPath;\n}\n\nexport function getNsjailUnavailableReason(): string | null {\n return isNsjailAvailable() ? null : (nsjailUnavailableReason ?? null);\n}\n\n/**\n * Check if Docker CLI access is available and can reach a daemon.\n */\nexport function isDockerAvailable(): boolean {\n if (dockerPath === undefined) {\n dockerPath = resolveBinaryPath(\"docker\");\n }\n\n if (!dockerPath) {\n dockerServerReachable = false;\n return false;\n }\n\n if (dockerServerReachable === undefined) {\n try {\n execFileSync(\n dockerPath,\n [\"version\", \"--format\", \"{{.Server.Version}}\"],\n { stdio: [\"ignore\", \"ignore\", \"ignore\"] }\n );\n dockerServerReachable = true;\n } catch {\n dockerServerReachable = false;\n }\n }\n\n return dockerServerReachable;\n}\n\nexport function getDockerPath(): string {\n if (!dockerPath) throw new Error(\"docker is not available\");\n return dockerPath;\n}\n\nexport function normalizeSandboxProvider(\n value: string | null | undefined,\n legacyEnabled = false\n): SandboxProvider {\n if (value === \"none\" || value === \"nsjail\" || value === \"docker\") {\n return value;\n }\n return legacyEnabled ? \"nsjail\" : \"none\";\n}\n\nexport function resolveSandboxProviderAvailability(\n requested: SandboxProvider,\n availability: { nsjailAvailable: boolean; dockerAvailable: boolean }\n): SandboxProvider {\n if (requested === \"docker\") {\n return availability.dockerAvailable ? \"docker\" : \"none\";\n }\n if (requested === \"nsjail\") {\n return availability.nsjailAvailable ? \"nsjail\" : \"none\";\n }\n return \"none\";\n}\n\nexport function resolveSandboxProvider(requested: SandboxProvider): SandboxProvider {\n return resolveSandboxProviderAvailability(requested, {\n nsjailAvailable: isNsjailAvailable(),\n dockerAvailable: isDockerAvailable(),\n });\n}\n\n/**\n * Ensure a directory is writable by the sandbox user.\n * Called by Maestro (running as root) before spawning the jailed process.\n */\nexport function ensureSandboxWritable(dirPath: string): void {\n try {\n execSync(`chown -R ${SANDBOX_UID}:${SANDBOX_GID} ${JSON.stringify(dirPath)}`, {\n stdio: \"ignore\",\n });\n } catch {\n // Best-effort; may fail for read-only mounts (which is fine)\n }\n}\n\n/**\n * Build nsjail arguments for sandboxed agent execution.\n *\n * The sandbox provides:\n * - Filesystem isolation: only explicit mounts are visible\n * - PID namespace: agent can't see other processes\n * - Resource limits: memory, process count (when cgroups available)\n * - No network isolation (agents need API access)\n * - Non-root execution (uid 1500 / sandbox user)\n */\nexport function buildNsjailArgs(config: SandboxConfig): string[] {\n const home = os.homedir();\n const sandboxHome = \"/home/sandbox\";\n const mountedReadonlyRoots = [...BASE_READONLY_MOUNTS];\n const nodeBin = getNodeBinaryDir();\n const npmGlobalPrefix = getNpmGlobalPrefix();\n const codexCompanionBinDir = getCliCompanionBinDir(\"codex\");\n\n const args: string[] = [\n \"--mode\", \"o\",\n \"--chroot\", \"/\",\n \"--user\", `${SANDBOX_UID}`,\n \"--group\", `${SANDBOX_GID}`,\n \"--disable_clone_newuser\",\n \"--disable_clone_newnet\",\n \"--forward_signals\",\n \"--cwd\", config.cwd,\n \"--detect_cgroupv2\",\n \"--cgroup_mem_max\", String(config.memoryLimit ?? DEFAULT_MEMORY_LIMIT),\n \"--cgroup_pids_max\", String(config.maxProcesses ?? DEFAULT_MAX_PROCESSES),\n \"--rlimit_cpu\", \"soft\",\n \"--rlimit_fsize\", \"1024\",\n \"--rlimit_nproc\", String(config.maxProcesses ?? DEFAULT_MAX_PROCESSES),\n \"--rlimit_nofile\", \"1024\",\n \"--really_quiet\",\n ];\n\n for (const dir of BASE_READONLY_MOUNTS) {\n if (fs.existsSync(dir)) {\n args.push(\"--bindmount_ro\", `${dir}:${dir}`);\n }\n }\n\n if (fs.existsSync(\"/lib64\")) {\n args.push(\"--bindmount_ro\", \"/lib64:/lib64\");\n }\n\n args.push(\"--bindmount\", \"/dev:/dev\");\n args.push(\"--tmpfsmount\", \"/tmp\");\n args.push(\"--bindmount\", `${config.cwd}:${config.cwd}`);\n\n if (fs.existsSync(\"/nix\")) {\n args.push(\"--bindmount_ro\", \"/nix:/nix\");\n }\n\n if (nodeBin && !isAlreadyMounted(nodeBin, mountedReadonlyRoots)) {\n args.push(\"--bindmount_ro\", `${nodeBin}:${nodeBin}`);\n mountedReadonlyRoots.push(nodeBin);\n }\n\n if (npmGlobalPrefix && !isAlreadyMounted(npmGlobalPrefix, mountedReadonlyRoots)) {\n args.push(\"--bindmount_ro\", `${npmGlobalPrefix}:${npmGlobalPrefix}`);\n mountedReadonlyRoots.push(npmGlobalPrefix);\n }\n\n if (codexCompanionBinDir && !isAlreadyMounted(codexCompanionBinDir, mountedReadonlyRoots)) {\n args.push(\"--bindmount_ro\", `${codexCompanionBinDir}:${codexCompanionBinDir}`);\n mountedReadonlyRoots.push(codexCompanionBinDir);\n }\n\n mountSharedAgentPaths(args, home);\n\n if (config.readonlyMounts) {\n for (const mountPath of config.readonlyMounts) {\n if (fs.existsSync(mountPath)) {\n args.push(\"--bindmount_ro\", `${mountPath}:${mountPath}`);\n }\n }\n }\n\n if (config.writableMounts) {\n for (const mountPath of config.writableMounts) {\n if (fs.existsSync(mountPath)) {\n args.push(\"--bindmount\", `${mountPath}:${mountPath}`);\n }\n }\n }\n\n args.push(\"--bindmount\", `${sandboxHome}:${sandboxHome}`);\n\n for (const [key, value] of Object.entries(config.env)) {\n args.push(\"--env\", `${key}=${value}`);\n }\n\n const sandboxPath = buildSandboxPath({\n nodeBin,\n npmGlobalPrefix,\n companionBinDirs: [codexCompanionBinDir],\n });\n args.push(\"--env\", `PATH=${sandboxPath}`);\n args.push(\"--env\", `HOME=${sandboxHome}`);\n args.push(\"--env\", \"USER=sandbox\");\n args.push(\"--env\", \"TERM=xterm-256color\");\n\n return args;\n}\n\nexport function buildDockerRunArgs(\n config: SandboxConfig,\n command: string[],\n image = DEFAULT_DOCKER_IMAGE\n): string[] {\n const args: string[] = [\n \"run\",\n \"--rm\",\n \"--interactive\",\n \"--tty\",\n \"--init\",\n \"--workdir\", config.cwd,\n \"--hostname\", \"maestro-sandbox\",\n \"--tmpfs\", \"/tmp:exec,mode=1777\",\n \"--security-opt\", \"no-new-privileges\",\n \"--memory\", String(config.memoryLimit ?? DEFAULT_MEMORY_LIMIT),\n \"--pids-limit\", String(config.maxProcesses ?? DEFAULT_MAX_PROCESSES),\n \"--name\", `maestro-sandbox-${process.pid}-${Date.now()}`,\n ];\n\n const mounts = collectDockerMounts(config);\n for (const mount of mounts) {\n if (mount.type === \"bind\") {\n args.push(\n \"--mount\",\n `type=bind,src=${mount.source},dst=${mount.target}${mount.readonly ? \",readonly\" : \"\"}`\n );\n } else {\n args.push(\n \"--mount\",\n `type=volume,src=${mount.source},dst=${mount.target}${mount.readonly ? \",readonly\" : \"\"}`\n );\n }\n }\n\n const env = {\n ...config.env,\n HOME: config.homeDir ?? \"/root\",\n USER: \"root\",\n TERM: \"xterm-256color\",\n };\n for (const [key, value] of Object.entries(env)) {\n args.push(\"--env\", `${key}=${value}`);\n }\n\n args.push(image, ...command);\n return args;\n}\n\nexport function ensureDockerSandboxImage(): string {\n if (!isDockerAvailable()) {\n throw new Error(\"docker is not available\");\n }\n\n const image = DEFAULT_DOCKER_IMAGE;\n if (dockerImageReadyFor === image) {\n return image;\n }\n\n try {\n execFileSync(getDockerPath(), [\"image\", \"inspect\", image], {\n stdio: [\"ignore\", \"ignore\", \"ignore\"],\n });\n dockerImageReadyFor = image;\n return image;\n } catch {\n const dockerfilePath = resolveDockerSandboxDockerfile();\n const repoRoot = path.resolve(dockerfilePath, \"../../..\");\n console.log(`Building Docker sandbox image ${image} from ${dockerfilePath}`);\n execFileSync(\n getDockerPath(),\n [\"build\", \"-t\", image, \"-f\", dockerfilePath, repoRoot],\n { stdio: \"inherit\" }\n );\n dockerImageReadyFor = image;\n return image;\n }\n}\n\nfunction collectDockerMounts(config: SandboxConfig): DockerMountSpec[] {\n const requested = new Map<string, DockerMountSpec>();\n\n const addResolvedMount = (mount: DockerMountSpec | null) => {\n if (!mount) return;\n\n const key = `${mount.type}:${mount.source}:${mount.target}`;\n const existing = requested.get(key);\n if (existing) {\n existing.readonly = existing.readonly && mount.readonly;\n return;\n }\n requested.set(key, { ...mount });\n };\n\n const addMount = (requestedPath: string, readonly: boolean) => {\n addResolvedMount(resolveDockerMount(requestedPath, readonly));\n };\n\n addMount(config.cwd, false);\n if (config.homeDir) {\n addMount(config.homeDir, false);\n }\n for (const mountPath of config.readonlyMounts ?? []) {\n addMount(mountPath, true);\n }\n for (const mountPath of config.writableMounts ?? []) {\n addMount(mountPath, false);\n }\n\n if (!config.homeDir) {\n const sharedPaths = getSharedAgentPaths(os.homedir());\n for (const sharedPath of sharedPaths.readwrite) {\n addMount(sharedPath, false);\n }\n for (const sharedPath of sharedPaths.readonly) {\n addMount(sharedPath, true);\n }\n }\n\n for (const mount of config.dockerExtraMounts ?? []) {\n addResolvedMount(mount);\n }\n\n return Array.from(requested.values());\n}\n\nfunction resolveDockerMount(\n requestedPath: string,\n readonly: boolean\n): DockerMountSpec | null {\n if (!path.isAbsolute(requestedPath) || !fs.existsSync(requestedPath)) {\n return null;\n }\n\n const selfMount = findCoveringSelfMount(requestedPath);\n if (selfMount?.Destination && selfMount.Type === \"volume\" && selfMount.Name) {\n return {\n type: \"volume\",\n source: selfMount.Name,\n target: selfMount.Destination,\n readonly,\n };\n }\n if (selfMount?.Destination && selfMount.Type === \"bind\" && selfMount.Source) {\n return {\n type: \"bind\",\n source: selfMount.Source,\n target: selfMount.Destination,\n readonly,\n };\n }\n\n // When Maestro itself runs in Docker, only paths backed by a bind/volume\n // mount are visible to sibling `docker run` containers. Image-layer files\n // like `/root/.claude.json` exist here but not on the Docker host.\n if (isRunningInsideContainer()) {\n return null;\n }\n\n return {\n type: \"bind\",\n source: requestedPath,\n target: requestedPath,\n readonly,\n };\n}\n\nexport function resolveDockerMountForPath(\n requestedPath: string,\n readonly = false\n): DockerMountSpec | null {\n return resolveDockerMount(requestedPath, readonly);\n}\n\nfunction getSelfContainerMounts(): DockerInspectMount[] {\n if (cachedSelfMounts !== undefined) {\n return cachedSelfMounts;\n }\n\n if (!isDockerAvailable()) {\n cachedSelfMounts = [];\n return cachedSelfMounts;\n }\n\n try {\n const containerId = os.hostname();\n const raw = execFileSync(\n getDockerPath(),\n [\"inspect\", containerId, \"--format\", \"{{json .Mounts}}\"],\n { encoding: \"utf-8\", stdio: [\"ignore\", \"pipe\", \"ignore\"] }\n ).trim();\n const parsed = JSON.parse(raw) as DockerInspectMount[];\n cachedSelfMounts = Array.isArray(parsed) ? parsed : [];\n } catch {\n cachedSelfMounts = [];\n }\n\n return cachedSelfMounts;\n}\n\nfunction isRunningInsideContainer(): boolean {\n if (runningInsideContainer === undefined) {\n runningInsideContainer = fs.existsSync(\"/.dockerenv\");\n }\n return runningInsideContainer;\n}\n\nfunction findCoveringSelfMount(requestedPath: string): DockerInspectMount | null {\n const mounts = getSelfContainerMounts();\n let best: DockerInspectMount | null = null;\n\n for (const mount of mounts) {\n const destination = mount.Destination;\n if (!destination) continue;\n if (!isPathWithin(requestedPath, destination)) continue;\n if (!best || destination.length > String(best.Destination).length) {\n best = mount;\n }\n }\n\n return best;\n}\n\nfunction getSharedAgentPaths(home: string): {\n readonly: string[];\n readwrite: string[];\n} {\n const maestroDir = path.join(home, \".maestro\");\n const codexDir = path.join(home, \".codex\");\n const claudeDir = path.join(home, \".claude\");\n const claudeProjectsDir = path.join(claudeDir, \"projects\");\n const claudeJson = path.join(home, \".claude.json\");\n const gitconfig = path.join(home, \".gitconfig\");\n const ghConfigDir = path.join(home, \".config\", \"gh\");\n\n return {\n // Codex, Claude, and gh may all persist runtime/session state under their\n // home config paths when started inside a sandbox. Keep those writable so\n // the CLIs can boot and authenticate normally while leaving gitconfig\n // itself read-only.\n readwrite: [maestroDir, codexDir, claudeDir, claudeProjectsDir, claudeJson, ghConfigDir].filter(fs.existsSync),\n readonly: [gitconfig].filter(fs.existsSync),\n };\n}\n\nfunction mountSharedAgentPaths(args: string[], home: string): void {\n const sharedPaths = getSharedAgentPaths(home);\n\n for (const dir of sharedPaths.readwrite) {\n args.push(\"--bindmount\", `${dir}:${dir}`);\n }\n for (const dir of sharedPaths.readonly) {\n args.push(\"--bindmount_ro\", `${dir}:${dir}`);\n }\n}\n\nfunction resolveDockerSandboxDockerfile(): string {\n const localDir = path.dirname(fileURLToPath(import.meta.url));\n const installRoot = process.env.MAESTRO_INSTALL_ROOT?.trim();\n const candidates = [\n ...(installRoot ? [path.resolve(installRoot, \"assets/docker/sandbox/Dockerfile\")] : []),\n path.resolve(process.cwd(), \"docker/sandbox/Dockerfile\"),\n path.resolve(localDir, \"../../../../docker/sandbox/Dockerfile\"),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n throw new Error(\"Docker sandbox Dockerfile not found\");\n}\n\nfunction isPathWithin(requestedPath: string, basePath: string): boolean {\n if (requestedPath === basePath) return true;\n if (!requestedPath.startsWith(basePath)) return false;\n return requestedPath.charAt(basePath.length) === path.sep;\n}\n\n/**\n * Build the PATH for inside the sandbox, including any companion bin dirs\n * from globally installed CLIs.\n */\nfunction buildSandboxPath(options: {\n nodeBin: string | null;\n npmGlobalPrefix: string | null;\n companionBinDirs: Array<string | null>;\n}): string {\n const pathParts = [...BASE_PATH_DIRS];\n\n if (options.nodeBin && !pathParts.includes(options.nodeBin)) {\n pathParts.unshift(options.nodeBin);\n }\n\n const globalBin = options.npmGlobalPrefix\n ? path.join(options.npmGlobalPrefix, \"bin\")\n : null;\n if (globalBin && !pathParts.includes(globalBin)) {\n pathParts.unshift(globalBin);\n }\n\n for (const dir of options.companionBinDirs) {\n if (dir && !pathParts.includes(dir)) {\n pathParts.unshift(dir);\n }\n }\n\n return pathParts.join(\":\");\n}\n\nfunction getNodeBinaryDir(): string | null {\n try {\n const nodePath = execSync(\"which node\", { encoding: \"utf-8\" }).trim();\n return nodePath ? path.dirname(nodePath) : null;\n } catch {\n return null;\n }\n}\n\nfunction getNpmGlobalPrefix(): string | null {\n try {\n const prefix = execSync(\"npm prefix -g\", { encoding: \"utf-8\" }).trim();\n return prefix || null;\n } catch {\n return null;\n }\n}\n\nfunction getCliCompanionBinDir(cliName: string): string | null {\n try {\n const cliPath = execSync(`which ${cliName}`, { encoding: \"utf-8\" }).trim();\n if (!cliPath) return null;\n return path.dirname(fs.realpathSync(cliPath));\n } catch {\n return null;\n }\n}\n\nfunction isAlreadyMounted(targetPath: string, mountRoots: string[]): boolean {\n return mountRoots.some((root) => isPathWithin(targetPath, root));\n}\n\nexport function __setSelfContainerMountsForTests(mounts: DockerInspectMount[] | undefined): void {\n cachedSelfMounts = mounts;\n}\n\nexport function __setRunningInsideContainerForTests(value: boolean | undefined): void {\n runningInsideContainer = value;\n}\n", "import * as pty from \"node-pty\";\nimport * as os from \"os\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { createRequire } from \"module\";\nimport type { SandboxProvider } from \"@maestro/wire\";\nimport {\n resolveSandboxProvider,\n isNsjailAvailable,\n getNsjailPath,\n getNsjailUnavailableReason,\n buildNsjailArgs,\n isDockerAvailable,\n getDockerPath,\n buildDockerRunArgs,\n ensureDockerSandboxImage,\n ensureSandboxWritable,\n type DockerMountSpec,\n type SandboxConfig,\n} from \"./sandbox.js\";\n\nconst require = createRequire(import.meta.url);\nlet didEnsureSpawnHelper = false;\n\nfunction getShellPath(env?: Record<string, string>): string {\n return env?.SHELL || process.env.SHELL || \"/bin/bash\";\n}\n\nfunction hardenShellHistory(env: Record<string, string>): Record<string, string> {\n const shellName = path.basename(getShellPath(env));\n const hardened = { ...env };\n\n if (shellName === \"bash\") {\n const existingPromptCommand = hardened.PROMPT_COMMAND?.trim();\n const bashOpts = new Set((hardened.BASHOPTS || \"\").split(\":\").filter(Boolean));\n const promptParts = [\"history -a\", \"history -n\"];\n if (existingPromptCommand) {\n promptParts.push(existingPromptCommand);\n }\n\n bashOpts.add(\"histappend\");\n hardened.BASHOPTS = Array.from(bashOpts).join(\":\");\n hardened.PROMPT_COMMAND = promptParts.join(\"; \");\n hardened.HISTCONTROL = hardened.HISTCONTROL || \"ignoredups:erasedups\";\n hardened.HISTSIZE = hardened.HISTSIZE || \"100000\";\n hardened.HISTFILESIZE = hardened.HISTFILESIZE || \"200000\";\n } else if (shellName === \"zsh\") {\n hardened.HISTSIZE = hardened.HISTSIZE || \"100000\";\n hardened.SAVEHIST = hardened.SAVEHIST || \"200000\";\n }\n\n return hardened;\n}\n\nfunction ensureSpawnHelperExecutable(): void {\n if (didEnsureSpawnHelper || process.platform !== \"darwin\") return;\n didEnsureSpawnHelper = true;\n\n try {\n const nodePtyPackage = require.resolve(\"node-pty/package.json\");\n const helperPath = path.join(\n path.dirname(nodePtyPackage),\n \"prebuilds\",\n `darwin-${process.arch}`,\n \"spawn-helper\"\n );\n\n if (!fs.existsSync(helperPath)) return;\n\n const mode = fs.statSync(helperPath).mode & 0o777;\n if ((mode & 0o111) !== 0) return;\n\n fs.chmodSync(helperPath, mode | 0o755);\n console.log(`Fixed node-pty helper permissions: ${helperPath}`);\n } catch (error) {\n console.warn(\"Failed to ensure node-pty helper permissions\", error);\n }\n}\n\nfunction buildChildEnv(env?: Record<string, string>): Record<string, string> {\n const childEnv = hardenShellHistory({\n ...(process.env as Record<string, string>),\n ...env,\n });\n\n // Local Maestro launches may happen from within a Claude Code session.\n // Strip the parent marker so spawned Claude agents don't abort as nested sessions.\n delete childEnv.CLAUDECODE;\n\n return childEnv;\n}\n\nexport interface PtyInstance {\n id: string;\n process: pty.IPty;\n terminalId: string;\n sandboxed: boolean;\n sandboxProvider: SandboxProvider;\n}\n\nconst ptyProcesses = new Map<string, PtyInstance>();\n\nlet idCounter = 0;\n\nfunction generateId(): string {\n return `pty_${Date.now()}_${++idCounter}`;\n}\n\nexport interface PtySpawnOptions {\n terminalId: string;\n cwd: string;\n homeDir?: string;\n cols?: number;\n rows?: number;\n env?: Record<string, string>;\n onData: (data: string) => void;\n onExit: (exitCode: number) => void;\n /** Legacy sandbox toggle; maps to nsjail when true */\n sandbox?: boolean;\n /** Requested sandbox provider */\n sandboxProvider?: SandboxProvider;\n /** Additional read-only mount paths for sandbox */\n readonlyMounts?: string[];\n /** Additional read-write mount paths for sandbox */\n writableMounts?: string[];\n /** Additional Docker-only mounts */\n dockerExtraMounts?: DockerMountSpec[];\n /** Memory limit in bytes for sandbox (default: 512MB) */\n memoryLimit?: number;\n}\n\nexport function spawnPty(options: PtySpawnOptions): PtyInstance {\n ensureSpawnHelperExecutable();\n\n const shell = getShellPath(options.env);\n const cwd = options.cwd || os.homedir();\n const requestedSandboxProvider =\n options.sandboxProvider ?? (options.sandbox ? \"nsjail\" : \"none\");\n const sandboxProvider = resolveSandboxProvider(requestedSandboxProvider);\n let actualSandboxProvider = sandboxProvider;\n const fullEnv = buildChildEnv(options.env);\n\n let ptyProcess: pty.IPty;\n\n if (sandboxProvider === \"nsjail\") {\n // Ensure project dir is writable by sandbox user (uid 1500)\n ensureSandboxWritable(cwd);\n\n const sandboxConfig: SandboxConfig = {\n cwd,\n homeDir: options.homeDir,\n env: fullEnv,\n readonlyMounts: options.readonlyMounts,\n writableMounts: options.writableMounts,\n memoryLimit: options.memoryLimit,\n };\n\n const nsjailArgs = [\n ...buildNsjailArgs(sandboxConfig),\n \"--\", shell, \"-l\",\n ];\n\n ptyProcess = pty.spawn(getNsjailPath(), nsjailArgs, {\n name: \"xterm-256color\",\n cols: options.cols ?? 120,\n rows: options.rows ?? 30,\n cwd,\n // nsjail manages env vars via --env flags, but node-pty still needs\n // a minimal env for the PTY master side\n env: { TERM: \"xterm-256color\" },\n });\n\n console.log(`Spawned sandboxed PTY for terminal ${options.terminalId}`);\n } else if (sandboxProvider === \"docker\") {\n const sandboxConfig: SandboxConfig = {\n cwd,\n homeDir: options.homeDir,\n env: fullEnv,\n readonlyMounts: options.readonlyMounts,\n writableMounts: options.writableMounts,\n dockerExtraMounts: options.dockerExtraMounts,\n memoryLimit: options.memoryLimit,\n };\n\n const dockerArgs = buildDockerRunArgs(\n sandboxConfig,\n [\"/bin/bash\", \"-l\"],\n ensureDockerSandboxImage()\n );\n\n ptyProcess = pty.spawn(getDockerPath(), dockerArgs, {\n name: \"xterm-256color\",\n cols: options.cols ?? 120,\n rows: options.rows ?? 30,\n cwd,\n env: { TERM: \"xterm-256color\" },\n });\n\n console.log(`Spawned docker-sandboxed PTY for terminal ${options.terminalId}`);\n } else {\n if (requestedSandboxProvider === \"nsjail\" && !isNsjailAvailable()) {\n const reason = getNsjailUnavailableReason();\n throw new Error(\n `Sandbox requested for terminal ${options.terminalId} but nsjail is not available ` +\n `(platform: ${process.platform}${reason ? `, reason: ${reason}` : \"\"}).`\n );\n }\n if (requestedSandboxProvider === \"docker\" && !isDockerAvailable()) {\n throw new Error(\n `Sandbox requested for terminal ${options.terminalId} but docker is not available.`\n );\n }\n\n ptyProcess = pty.spawn(shell, [\"-l\"], {\n name: \"xterm-256color\",\n cols: options.cols ?? 120,\n rows: options.rows ?? 30,\n cwd,\n env: fullEnv,\n });\n }\n\n const id = generateId();\n const instance: PtyInstance = {\n id,\n process: ptyProcess,\n terminalId: options.terminalId,\n sandboxed: actualSandboxProvider !== \"none\",\n sandboxProvider: actualSandboxProvider,\n };\n\n ptyProcesses.set(id, instance);\n\n ptyProcess.onData((data) => {\n options.onData(data);\n });\n\n ptyProcess.onExit(({ exitCode }) => {\n ptyProcesses.delete(id);\n options.onExit(exitCode);\n });\n\n return instance;\n}\n\nexport function writeToPty(ptyId: string, data: string): boolean {\n const instance = ptyProcesses.get(ptyId);\n if (!instance) return false;\n instance.process.write(data);\n return true;\n}\n\nexport function writeCommandToPty(ptyId: string, command: string): boolean {\n const instance = ptyProcesses.get(ptyId);\n if (!instance) return false;\n instance.process.write(command);\n instance.process.write(\"\\r\");\n return true;\n}\n\nexport function resizePty(\n ptyId: string,\n cols: number,\n rows: number\n): boolean {\n const instance = ptyProcesses.get(ptyId);\n if (!instance) return false;\n instance.process.resize(cols, rows);\n return true;\n}\n\nexport function killPty(ptyId: string): boolean {\n const instance = ptyProcesses.get(ptyId);\n if (!instance) return false;\n try {\n instance.process.kill();\n } catch {\n // Already dead\n }\n ptyProcesses.delete(ptyId);\n return true;\n}\n\nexport function killAllPty(): void {\n let killed = 0;\n for (const [id, instance] of ptyProcesses) {\n try {\n instance.process.kill();\n killed++;\n } catch {\n // Ignore\n }\n }\n ptyProcesses.clear();\n console.log(`Killed ${killed} PTY process(es) on shutdown`);\n}\n\nexport function getPtyByTerminal(terminalId: string): PtyInstance | undefined {\n for (const instance of ptyProcesses.values()) {\n if (instance.terminalId === terminalId) return instance;\n }\n return undefined;\n}\n\nexport function getAllPty(): PtyInstance[] {\n return Array.from(ptyProcesses.values());\n}\n", "import * as os from \"os\";\nimport * as path from \"path\";\nimport * as fs from \"fs\";\nimport type { AgentProvider } from \"@maestro/wire\";\n\nexport interface InteractiveCommandParams {\n binaryPath: string;\n prompt: string;\n projectPath: string;\n skipPermissions?: boolean;\n sandbox?: boolean;\n secondaryProjectPaths?: string[];\n mcpConfigPath?: string;\n skills?: string[];\n}\n\nexport interface CustomProviderConfig {\n displayName?: string | null;\n commandTemplate?: string | null;\n env?: Record<string, unknown> | null;\n}\n\nexport interface CLIProvider {\n readonly id: string;\n readonly displayName: string;\n readonly binaryName: string;\n\n resolveBinaryPath(): string;\n buildInteractiveCommand(params: InteractiveCommandParams): string;\n getPtyEnvVars(\n agentId: string,\n projectPath: string,\n skills: string[]\n ): Record<string, string>;\n}\n\nfunction escapeShell(s: string): string {\n return s.replace(/'/g, \"'\\\\''\");\n}\n\nfunction quoteShell(s: string): string {\n return `'${escapeShell(s)}'`;\n}\n\nfunction toStringRecord(\n value: Record<string, unknown> | null | undefined\n): Record<string, string> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return {};\n }\n\n const result: Record<string, string> = {};\n for (const [key, raw] of Object.entries(value)) {\n if (typeof raw === \"string\") {\n result[key] = raw;\n }\n }\n return result;\n}\n\nexport class ClaudeProvider implements CLIProvider {\n readonly id = \"claude\";\n readonly displayName = \"Claude Code\";\n readonly binaryName = \"claude\";\n\n resolveBinaryPath(): string {\n // Check common locations\n const candidates = [\n path.join(os.homedir(), \".npm-global/bin/claude\"),\n \"/usr/local/bin/claude\",\n \"claude\",\n ];\n for (const c of candidates) {\n if (c !== \"claude\" && fs.existsSync(c)) return c;\n }\n return \"claude\";\n }\n\n buildInteractiveCommand(params: InteractiveCommandParams): string {\n let cmd = quoteShell(params.binaryPath);\n\n if (params.mcpConfigPath && fs.existsSync(params.mcpConfigPath)) {\n cmd += ` --mcp-config ${quoteShell(params.mcpConfigPath)}`;\n }\n\n if (params.skipPermissions && params.sandbox) {\n cmd += \" --dangerously-skip-permissions\";\n }\n\n if (params.secondaryProjectPaths) {\n for (const p of params.secondaryProjectPaths) {\n if (fs.existsSync(p)) {\n cmd += ` --add-dir ${quoteShell(p)}`;\n }\n }\n }\n\n let finalPrompt = params.prompt;\n if (params.prompt && params.skills?.length) {\n const skillsList = params.skills.join(\", \");\n finalPrompt = `[IMPORTANT: Use these skills for this session: ${skillsList}. Invoke them with /<skill-name> when relevant to the task.] ${params.prompt}`;\n }\n\n if (finalPrompt) {\n cmd += ` -p ${quoteShell(finalPrompt)}`;\n }\n\n return cmd;\n }\n\n getPtyEnvVars(\n agentId: string,\n projectPath: string,\n skills: string[]\n ): Record<string, string> {\n return {\n CLAUDE_SKILLS: skills.join(\",\"),\n CLAUDE_AGENT_ID: agentId,\n CLAUDE_PROJECT_PATH: projectPath,\n };\n }\n}\n\nexport class CodexProvider implements CLIProvider {\n readonly id = \"codex\";\n readonly displayName = \"Codex\";\n readonly binaryName = \"codex\";\n\n resolveBinaryPath(): string {\n return \"codex\";\n }\n\n buildInteractiveCommand(params: InteractiveCommandParams): string {\n let cmd = `${quoteShell(params.binaryPath)} exec`;\n\n if (params.skipPermissions) {\n cmd += \" --yolo\";\n }\n\n if (params.prompt) {\n cmd += ` ${quoteShell(params.prompt)}`;\n }\n\n return cmd;\n }\n\n getPtyEnvVars(): Record<string, string> {\n return {};\n }\n}\n\nexport class ShellProvider implements CLIProvider {\n readonly id = \"none\";\n readonly displayName = \"None\";\n readonly binaryName = \"shell\";\n\n resolveBinaryPath(): string {\n return process.env.SHELL || \"/bin/bash\";\n }\n\n buildInteractiveCommand(): string {\n return \"\";\n }\n\n getPtyEnvVars(): Record<string, string> {\n return {};\n }\n}\n\nexport class CustomProvider implements CLIProvider {\n readonly id = \"custom\";\n readonly displayName: string;\n readonly binaryName = \"shell\";\n\n constructor(private readonly config: CustomProviderConfig) {\n this.displayName = config.displayName?.trim() || \"Custom CLI\";\n }\n\n resolveBinaryPath(): string {\n return process.env.SHELL || \"/bin/bash\";\n }\n\n buildInteractiveCommand(params: InteractiveCommandParams): string {\n const template = this.config.commandTemplate?.trim();\n if (!template) {\n throw new Error(\"Custom CLI command template is required\");\n }\n const hasPromptPlaceholder = /\\{\\{\\s*prompt\\s*\\}\\}/.test(template);\n\n const values: Record<string, string | undefined> = {\n prompt: params.prompt,\n projectPath: params.projectPath,\n };\n\n let command = template.replace(\n /\\{\\{\\s*(prompt|projectPath)\\s*\\}\\}/g,\n (_match, key: \"prompt\" | \"projectPath\") =>\n quoteShell(values[key] ?? \"\")\n );\n\n if (params.prompt && !hasPromptPlaceholder) {\n command += ` ${quoteShell(params.prompt)}`;\n }\n\n return command;\n }\n\n getPtyEnvVars(\n agentId: string,\n projectPath: string\n ): Record<string, string> {\n return {\n MAESTRO_AGENT_ID: agentId,\n MAESTRO_PROJECT_PATH: projectPath,\n ...toStringRecord(this.config.env),\n };\n }\n}\n\nconst providers: Record<string, CLIProvider> = {\n none: new ShellProvider(),\n claude: new ClaudeProvider(),\n codex: new CodexProvider(),\n};\n\nexport function getProvider(\n id?: AgentProvider,\n customConfig?: CustomProviderConfig\n): CLIProvider {\n if (id === \"custom\") {\n return new CustomProvider(customConfig ?? {});\n }\n return providers[id ?? \"claude\"] ?? providers.claude;\n}\n", "export interface TerminalOutputChunk {\n seq: number;\n data: string;\n}\n\nexport interface TerminalSnapshotState {\n cursor: number;\n data: string;\n}\n\nexport type TerminalAttachResponse =\n | {\n mode: \"snapshot\";\n terminalId: string;\n output: string[];\n cursor: number;\n }\n | {\n mode: \"replay\";\n terminalId: string;\n chunks: TerminalOutputChunk[];\n cursor: number;\n };\n\nexport function buildTerminalSnapshotOutput(options: {\n outputBuffer: TerminalOutputChunk[];\n persistedSnapshot?: TerminalSnapshotState | null;\n history?: string;\n}): { output: string[]; cursor: number } {\n const { outputBuffer, persistedSnapshot, history } = options;\n\n if (persistedSnapshot) {\n const output = [persistedSnapshot.data];\n let cursor = persistedSnapshot.cursor;\n let nextSeq = persistedSnapshot.cursor + 1;\n\n for (const chunk of outputBuffer) {\n if (chunk.seq < nextSeq) {\n continue;\n }\n if (chunk.seq !== nextSeq) {\n break;\n }\n\n output.push(chunk.data);\n cursor = chunk.seq;\n nextSeq += 1;\n }\n\n return { output, cursor };\n }\n\n if (outputBuffer.length > 0) {\n return {\n output: outputBuffer.map((chunk) => chunk.data),\n cursor: outputBuffer[outputBuffer.length - 1].seq,\n };\n }\n\n if (history) {\n return { output: [history], cursor: 0 };\n }\n\n return { output: [], cursor: 0 };\n}\n\nexport function buildTerminalAttachResponse(options: {\n terminalId: string;\n requestedCursor?: number;\n outputBuffer: TerminalOutputChunk[];\n snapshotOutput: string[];\n snapshotCursor: number;\n}): TerminalAttachResponse {\n const { terminalId, requestedCursor, outputBuffer, snapshotOutput, snapshotCursor } = options;\n\n if (\n requestedCursor !== undefined &&\n requestedCursor > 0 &&\n requestedCursor <= snapshotCursor &&\n outputBuffer.length > 0\n ) {\n const firstBufferedSeq = outputBuffer[0].seq;\n const replayStartSeq = requestedCursor + 1;\n\n if (replayStartSeq >= firstBufferedSeq) {\n return {\n mode: \"replay\",\n terminalId,\n chunks: outputBuffer.filter((chunk) => chunk.seq >= replayStartSeq),\n cursor: snapshotCursor,\n };\n }\n }\n\n return {\n mode: \"snapshot\",\n terminalId,\n output: snapshotOutput,\n cursor: snapshotCursor,\n };\n}\n", "const MAX_RECENT_TERMINAL_INPUTS = 10;\n\nfunction removeLastCharacter(value: string): string {\n const chars = Array.from(value);\n chars.pop();\n return chars.join(\"\");\n}\n\nfunction removeLastWord(value: string): string {\n const chars = Array.from(value);\n while (chars.length > 0 && /\\s/.test(chars[chars.length - 1] ?? \"\")) {\n chars.pop();\n }\n while (chars.length > 0 && !/\\s/.test(chars[chars.length - 1] ?? \"\")) {\n chars.pop();\n }\n return chars.join(\"\");\n}\n\nfunction commitInput(recentInputs: string[], currentLine: string) {\n const normalized = currentLine.trimEnd();\n if (!normalized.trim()) {\n return;\n }\n recentInputs.push(normalized);\n}\n\nexport function applyTerminalInputChunk(\n currentLine: string,\n data: string\n): { currentLine: string; committedInputs: string[] } {\n let nextLine = currentLine;\n const committedInputs: string[] = [];\n\n for (let index = 0; index < data.length; index += 1) {\n const char = data[index];\n\n if (!char) continue;\n\n if (char === \"\\x1b\") {\n while (index + 1 < data.length) {\n const nextChar = data[index + 1];\n if (!nextChar) break;\n if (/[A-Za-z~]/.test(nextChar)) {\n index += 1;\n break;\n }\n if (nextChar === \"[\" || nextChar === \"]\" || /[0-9;?]/.test(nextChar)) {\n index += 1;\n continue;\n }\n break;\n }\n continue;\n }\n\n if (char === \"\\r\" || char === \"\\n\") {\n commitInput(committedInputs, nextLine);\n nextLine = \"\";\n if (char === \"\\r\" && data[index + 1] === \"\\n\") {\n index += 1;\n }\n continue;\n }\n\n if (char === \"\\u0003\") {\n nextLine = \"\";\n continue;\n }\n\n if (char === \"\\u0008\" || char === \"\\u007f\") {\n nextLine = removeLastCharacter(nextLine);\n continue;\n }\n\n if (char === \"\\u0015\") {\n nextLine = \"\";\n continue;\n }\n\n if (char === \"\\u0017\") {\n nextLine = removeLastWord(nextLine);\n continue;\n }\n\n if (char < \" \") {\n continue;\n }\n\n nextLine += char;\n }\n\n return { currentLine: nextLine, committedInputs };\n}\n\nexport function appendRecentTerminalInputs(\n recentInputs: string[],\n inputs: string[]\n): string[] {\n const nextRecentInputs = recentInputs.slice(-MAX_RECENT_TERMINAL_INPUTS);\n\n for (const input of inputs) {\n commitInput(nextRecentInputs, input);\n }\n\n return nextRecentInputs.slice(-MAX_RECENT_TERMINAL_INPUTS);\n}\n\nexport { MAX_RECENT_TERMINAL_INPUTS };\n", "import headless from \"@xterm/headless\";\nimport serializePkg from \"@xterm/addon-serialize\";\n\nconst { Terminal: HeadlessTerminal } = headless;\nconst { SerializeAddon } = serializePkg;\n\nexport interface TerminalReplicaSnapshot {\n cursor: number;\n data: string;\n savedAt: number;\n cols: number;\n rows: number;\n}\n\ninterface CreateTerminalReplicaOptions {\n cols?: number;\n rows?: number;\n scrollback?: number;\n snapshot?: Pick<TerminalReplicaSnapshot, \"data\" | \"cols\" | \"rows\"> | null;\n}\n\nexport class TerminalReplica {\n private readonly terminal;\n private readonly serializeAddon;\n private pending: Promise<void> = Promise.resolve();\n private disposed = false;\n private lastSnapshot: TerminalReplicaSnapshot;\n\n constructor(options: CreateTerminalReplicaOptions = {}) {\n const cols = options.snapshot?.cols ?? options.cols ?? 120;\n const rows = options.snapshot?.rows ?? options.rows ?? 30;\n const scrollback = options.scrollback ?? 50000;\n\n this.terminal = new HeadlessTerminal({\n cols,\n rows,\n scrollback,\n allowProposedApi: true,\n convertEol: false,\n disableStdin: true,\n });\n this.serializeAddon = new SerializeAddon();\n this.terminal.loadAddon(this.serializeAddon);\n this.lastSnapshot = {\n cursor: 0,\n data: \"\",\n savedAt: Date.now(),\n cols,\n rows,\n };\n\n if (options.snapshot?.data) {\n void this.replaceSnapshot({\n data: options.snapshot.data,\n cols,\n rows,\n }, 0);\n } else {\n this.refreshSnapshot(0);\n }\n }\n\n write(data: string, cursor: number): Promise<void> {\n return this.enqueue(() =>\n new Promise<void>((resolve) => {\n this.terminal.write(data, () => {\n this.refreshSnapshot(cursor);\n resolve();\n });\n })\n );\n }\n\n resize(cols: number, rows: number, cursor: number): Promise<void> {\n return this.enqueue(() => {\n this.terminal.resize(cols, rows);\n this.refreshSnapshot(cursor);\n });\n }\n\n replaceSnapshot(\n snapshot: Pick<TerminalReplicaSnapshot, \"data\" | \"cols\" | \"rows\">,\n cursor: number\n ): Promise<void> {\n return this.enqueue(async () => {\n this.terminal.reset();\n if (this.terminal.cols !== snapshot.cols || this.terminal.rows !== snapshot.rows) {\n this.terminal.resize(snapshot.cols, snapshot.rows);\n }\n if (snapshot.data) {\n await new Promise<void>((resolve) => {\n this.terminal.write(snapshot.data, resolve);\n });\n }\n this.refreshSnapshot(cursor);\n });\n }\n\n async snapshot(): Promise<TerminalReplicaSnapshot> {\n await this.pending;\n return this.lastSnapshot;\n }\n\n dispose(): void {\n this.disposed = true;\n this.terminal.dispose();\n }\n\n private enqueue(operation: () => void | Promise<void>): Promise<void> {\n const next = this.pending.then(async () => {\n if (this.disposed) {\n return;\n }\n await operation();\n });\n this.pending = next.catch(() => undefined);\n return next;\n }\n\n private refreshSnapshot(cursor: number): void {\n this.lastSnapshot = {\n cursor,\n data: this.serializeAddon.serialize(),\n savedAt: Date.now(),\n cols: this.terminal.cols,\n rows: this.terminal.rows,\n };\n }\n}\n\nexport function createTerminalReplica(\n options: CreateTerminalReplicaOptions = {}\n): TerminalReplica {\n return new TerminalReplica(options);\n}\n", "import * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport { execSync } from \"child_process\";\n\nconst DEFAULT_WORKTREE_BASE = path.join(os.homedir(), \".maestro\", \"worktrees\");\nconst WORKTREE_BASE = process.env.MAESTRO_WORKTREE_BASE?.trim() || DEFAULT_WORKTREE_BASE;\n\nexport function getWorktreeBasePath(): string {\n return WORKTREE_BASE;\n}\n\n/**\n * Create a git worktree for a terminal.\n * Creates a new branch `agent/<terminalId>` from the requested git ref.\n * Returns the absolute path to the new worktree.\n */\nexport function createTerminalWorktree(\n projectPath: string,\n terminalId: string,\n startPoint = \"HEAD\"\n): string {\n const worktreeDir = path.join(WORKTREE_BASE, terminalId);\n const branchName = `agent/${terminalId}`;\n\n // Ensure base directory exists\n fs.mkdirSync(WORKTREE_BASE, { recursive: true });\n\n // Drop stale worktree metadata first so missing /tmp directories don't block recovery.\n try {\n execSync(\"git worktree prune\", { cwd: projectPath, stdio: \"ignore\" });\n } catch {\n // Best effort\n }\n\n // Clean up stale worktree at this path if it exists\n if (fs.existsSync(worktreeDir)) {\n try {\n execSync(`git worktree remove --force ${JSON.stringify(worktreeDir)}`, {\n cwd: projectPath,\n stdio: \"ignore\",\n });\n } catch {\n // May fail if the main repo moved; force-remove the directory\n fs.rmSync(worktreeDir, { recursive: true, force: true });\n }\n }\n\n // Delete the branch if it already exists (stale from a previous agent)\n try {\n execSync(`git branch -D ${JSON.stringify(branchName)}`, {\n cwd: projectPath,\n stdio: \"ignore\",\n });\n } catch {\n // Branch doesn't exist \u2014 fine\n }\n\n // Create the worktree with a new branch from the requested start point.\n execSync(\n `git worktree add -b ${JSON.stringify(branchName)} ${JSON.stringify(worktreeDir)} ${JSON.stringify(startPoint)}`,\n { cwd: projectPath, stdio: \"pipe\" }\n );\n\n console.log(\n `Created worktree for terminal ${terminalId}: ${worktreeDir} (branch: ${branchName})`\n );\n\n return worktreeDir;\n}\n\n/**\n * Remove a git worktree created for a terminal.\n * Also deletes the associated branch.\n */\nexport function removeTerminalWorktree(\n projectPath: string,\n terminalId: string\n): void {\n const worktreeDir = path.join(WORKTREE_BASE, terminalId);\n const branchName = `agent/${terminalId}`;\n\n // Remove the worktree\n if (fs.existsSync(worktreeDir)) {\n try {\n execSync(\n `git worktree remove --force ${JSON.stringify(worktreeDir)}`,\n { cwd: projectPath, stdio: \"ignore\" }\n );\n } catch {\n // Fallback: just delete the directory\n fs.rmSync(worktreeDir, { recursive: true, force: true });\n }\n }\n\n // Prune stale worktree references\n try {\n execSync(\"git worktree prune\", { cwd: projectPath, stdio: \"ignore\" });\n } catch {\n // Best effort\n }\n\n // Delete the branch\n try {\n execSync(`git branch -D ${JSON.stringify(branchName)}`, {\n cwd: projectPath,\n stdio: \"ignore\",\n });\n } catch {\n // Branch may already be gone\n }\n\n console.log(`Removed worktree for terminal ${terminalId}`);\n}\n\n/**\n * Check if a project path is a git repository.\n */\nexport function isGitRepo(projectPath: string): boolean {\n try {\n execSync(\"git rev-parse --is-inside-work-tree\", {\n cwd: projectPath,\n stdio: \"pipe\",\n });\n return true;\n } catch {\n return false;\n }\n}\n", "import * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\n\nconst DEFAULT_TERMINAL_STATE_BASE = path.join(os.homedir(), \".maestro\", \"terminals\");\nconst TERMINAL_STATE_BASE =\n process.env.MAESTRO_TERMINAL_STATE_BASE?.trim() || DEFAULT_TERMINAL_STATE_BASE;\nconst BOOTSTRAP_MARKER = \".bootstrap-complete\";\n\nexport interface TerminalIsolationPaths {\n rootDir: string;\n homeDir: string;\n}\n\nfunction getGlobalHome(): string {\n return os.homedir();\n}\n\nexport function getTerminalIsolationPaths(terminalId: string): TerminalIsolationPaths {\n const rootDir = path.join(TERMINAL_STATE_BASE, terminalId);\n return {\n rootDir,\n homeDir: path.join(rootDir, \"home\"),\n };\n}\n\nfunction copyPathIfPresent(source: string, target: string): void {\n if (!fs.existsSync(source) || fs.existsSync(target)) {\n return;\n }\n\n const stat = fs.statSync(source);\n fs.mkdirSync(path.dirname(target), { recursive: true });\n\n if (stat.isDirectory()) {\n fs.cpSync(source, target, {\n recursive: true,\n errorOnExist: false,\n });\n return;\n }\n\n fs.copyFileSync(source, target);\n}\n\nfunction bootstrapTerminalHome(homeDir: string): void {\n const markerPath = path.join(homeDir, BOOTSTRAP_MARKER);\n if (fs.existsSync(markerPath)) {\n return;\n }\n\n const globalHome = getGlobalHome();\n const copies: Array<[string, string]> = [\n [path.join(globalHome, \".gitconfig\"), path.join(homeDir, \".gitconfig\")],\n [path.join(globalHome, \".claude.json\"), path.join(homeDir, \".claude.json\")],\n [path.join(globalHome, \".config\", \"gh\"), path.join(homeDir, \".config\", \"gh\")],\n [path.join(globalHome, \".claude\"), path.join(homeDir, \".claude\")],\n [path.join(globalHome, \".codex\"), path.join(homeDir, \".codex\")],\n ];\n\n for (const [source, target] of copies) {\n copyPathIfPresent(source, target);\n }\n\n // Pre-create shell history so login shells don't emit noisy warnings when\n // history append is enabled inside isolated homes.\n fs.writeFileSync(path.join(homeDir, \".bash_history\"), \"\", { flag: \"a\" });\n fs.writeFileSync(markerPath, new Date().toISOString());\n}\n\nexport function ensureTerminalIsolationHome(terminalId: string): TerminalIsolationPaths {\n const paths = getTerminalIsolationPaths(terminalId);\n fs.mkdirSync(paths.homeDir, { recursive: true });\n bootstrapTerminalHome(paths.homeDir);\n return paths;\n}\n\nexport function removeTerminalIsolationState(terminalId: string): void {\n const paths = getTerminalIsolationPaths(terminalId);\n fs.rmSync(paths.rootDir, { recursive: true, force: true });\n}\n", "import * as os from \"os\";\nimport * as path from \"path\";\nimport { execFileSync } from \"child_process\";\nimport {\n getDockerPath,\n isDockerAvailable,\n resolveDockerMountForPath,\n type DockerMountSpec,\n} from \"./sandbox.js\";\n\nconst DEFAULT_DIND_IMAGE = process.env.MAESTRO_DIND_IMAGE || \"docker:29-dind\";\nconst DEFAULT_DIND_READY_TIMEOUT_MS = Number(\n process.env.MAESTRO_DIND_READY_TIMEOUT_MS || \"30000\"\n);\nconst DIND_SOCKET_DIR = \"/var/run/maestro-dind\";\nconst DIND_SOCKET_PATH = `${DIND_SOCKET_DIR}/docker.sock`;\n\nexport interface TerminalDockerRuntime {\n containerName: string;\n stateVolumeName: string;\n socketVolumeName: string;\n socketMount: DockerMountSpec;\n dockerHost: string;\n composeProjectName: string;\n}\n\nfunction getTerminalDockerResourceSuffix(terminalId: string): string {\n return terminalId.toLowerCase().replace(/[^a-z0-9_.-]/g, \"-\");\n}\n\nexport function getTerminalDockerRuntime(terminalId: string): TerminalDockerRuntime {\n const suffix = getTerminalDockerResourceSuffix(terminalId);\n return {\n containerName: `maestro-dind-${suffix}`,\n stateVolumeName: `maestro-dind-state-${suffix}`,\n socketVolumeName: `maestro-dind-sock-${suffix}`,\n socketMount: {\n type: \"volume\",\n source: `maestro-dind-sock-${suffix}`,\n target: DIND_SOCKET_DIR,\n readonly: false,\n },\n dockerHost: `unix://${DIND_SOCKET_PATH}`,\n composeProjectName: `maestro-${suffix}`,\n };\n}\n\nfunction getSharedTerminalRuntimeMounts(): DockerMountSpec[] {\n const requestedPaths = [\n path.join(os.homedir(), \".maestro\"),\n path.join(os.homedir(), \"maestro-projects\"),\n ];\n\n return requestedPaths.flatMap((requestedPath) => {\n const mount = resolveDockerMountForPath(requestedPath, false);\n return mount ? [mount] : [];\n });\n}\n\nfunction inspectContainerRunning(containerName: string): boolean | null {\n try {\n const value = execFileSync(\n getDockerPath(),\n [\"inspect\", containerName, \"--format\", \"{{.State.Running}}\"],\n { encoding: \"utf-8\", stdio: [\"ignore\", \"pipe\", \"ignore\"] }\n ).trim();\n return value === \"true\";\n } catch {\n return null;\n }\n}\n\nfunction buildDindRunArgs(runtime: TerminalDockerRuntime): string[] {\n const args: string[] = [\n \"run\",\n \"--detach\",\n \"--privileged\",\n \"--name\", runtime.containerName,\n \"--tmpfs\", \"/tmp:exec,mode=1777\",\n \"--env\", \"DOCKER_TLS_CERTDIR=\",\n \"--mount\", `type=volume,src=${runtime.stateVolumeName},dst=/var/lib/docker`,\n \"--mount\", `type=volume,src=${runtime.socketVolumeName},dst=${DIND_SOCKET_DIR}`,\n ];\n\n for (const mount of getSharedTerminalRuntimeMounts()) {\n args.push(\n \"--mount\",\n `type=${mount.type},src=${mount.source},dst=${mount.target}${mount.readonly ? \",readonly\" : \"\"}`\n );\n }\n\n args.push(\n DEFAULT_DIND_IMAGE,\n \"--host\",\n runtime.dockerHost,\n \"--storage-driver\",\n \"overlay2\"\n );\n return args;\n}\n\nfunction recreateContainer(runtime: TerminalDockerRuntime): void {\n try {\n execFileSync(getDockerPath(), [\"rm\", \"-f\", runtime.containerName], {\n stdio: [\"ignore\", \"ignore\", \"ignore\"],\n });\n } catch {\n // best effort\n }\n\n execFileSync(getDockerPath(), buildDindRunArgs(runtime), {\n stdio: [\"ignore\", \"inherit\", \"inherit\"],\n });\n}\n\nfunction waitForDockerRuntime(runtime: TerminalDockerRuntime): void {\n const deadline = Date.now() + DEFAULT_DIND_READY_TIMEOUT_MS;\n let lastError: unknown = null;\n\n while (Date.now() < deadline) {\n try {\n execFileSync(\n getDockerPath(),\n [\n \"exec\",\n runtime.containerName,\n \"docker\",\n \"--host\",\n runtime.dockerHost,\n \"version\",\n \"--format\",\n \"{{.Server.Version}}\",\n ],\n { stdio: [\"ignore\", \"ignore\", \"pipe\"] }\n );\n return;\n } catch (error) {\n lastError = error;\n Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 250);\n }\n }\n\n throw new Error(\n `Timed out waiting for terminal Docker runtime ${runtime.containerName} to become ready` +\n (lastError instanceof Error ? `: ${lastError.message}` : \"\")\n );\n}\n\nexport function ensureTerminalDockerRuntime(terminalId: string): TerminalDockerRuntime {\n if (!isDockerAvailable()) {\n throw new Error(\"docker is not available\");\n }\n\n const runtime = getTerminalDockerRuntime(terminalId);\n const running = inspectContainerRunning(runtime.containerName);\n if (running !== true) {\n recreateContainer(runtime);\n }\n waitForDockerRuntime(runtime);\n return runtime;\n}\n\nexport function cleanupTerminalDockerRuntime(terminalId: string): void {\n if (!isDockerAvailable()) {\n return;\n }\n\n const runtime = getTerminalDockerRuntime(terminalId);\n try {\n execFileSync(getDockerPath(), [\"rm\", \"-f\", runtime.containerName], {\n stdio: [\"ignore\", \"ignore\", \"ignore\"],\n });\n } catch {\n // best effort\n }\n\n for (const volumeName of [runtime.socketVolumeName, runtime.stateVolumeName]) {\n try {\n execFileSync(getDockerPath(), [\"volume\", \"rm\", \"-f\", volumeName], {\n stdio: [\"ignore\", \"ignore\", \"ignore\"],\n });\n } catch {\n // best effort\n }\n }\n}\n", "import * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { execFileSync } from \"node:child_process\";\nimport * as pty from \"node-pty\";\n\nconst ANSI_RE = /\\x1b(?:\\][^\\x07\\x1b]*(?:\\x07|\\x1b\\\\)?|\\[[0-9;]*[A-Za-z])/g;\n\nfunction stripAnsi(text: string): string {\n return text.replace(ANSI_RE, \"\");\n}\n\nfunction getCredentialHomes(): string[] {\n const candidates = [\n process.env.HOME,\n os.homedir(),\n \"/root\",\n \"/home/sandbox\",\n ];\n\n return Array.from(new Set(candidates.filter((value): value is string => Boolean(value))));\n}\n\nfunction decodeJwtPayload(token: string): Record<string, unknown> | null {\n const [, payload] = token.split(\".\");\n if (!payload) return null;\n\n try {\n const normalized = payload.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, \"=\");\n const json = Buffer.from(padded, \"base64\").toString(\"utf8\");\n const parsed = JSON.parse(json);\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? parsed as Record<string, unknown>\n : null;\n } catch {\n return null;\n }\n}\n\nfunction commandExists(binary: string): boolean {\n try {\n execFileSync(\"which\", [binary], { stdio: \"pipe\", encoding: \"utf8\" });\n return true;\n } catch {\n return false;\n }\n}\n\n// \u2500\u2500\u2500 Claude Code \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface ClaudeAuthStatus {\n installed: boolean;\n loggedIn: boolean;\n email: string | null;\n orgName: string | null;\n authMethod: string | null;\n}\n\ninterface ClaudeCliStatusPayload {\n loggedIn?: boolean;\n email?: string;\n orgName?: string;\n authMethod?: string;\n}\n\ninterface ClaudeCredentialsFile {\n claudeAiOauth?: {\n accessToken?: string;\n refreshToken?: string;\n expiresAt?: number;\n subscriptionType?: string;\n };\n}\n\nfunction logClaudeAuth(message: string): void {\n console.log(`[cli-auth][claude] ${message}`);\n}\n\nfunction parseClaudeCliStatus(raw: string): ClaudeAuthStatus | null {\n try {\n const data = JSON.parse(raw) as ClaudeCliStatusPayload;\n return {\n installed: true,\n loggedIn: Boolean(data.loggedIn),\n email: data.email ?? null,\n orgName: data.orgName ?? null,\n authMethod: data.authMethod ?? null,\n };\n } catch {\n return null;\n }\n}\n\nfunction getClaudeCredentialHomes(): string[] {\n return getCredentialHomes();\n}\n\nfunction getClaudeAuthStatusFromCredentials(): ClaudeAuthStatus | null {\n let bestStatus: ClaudeAuthStatus | null = null;\n let bestExpiresAt = -Infinity;\n\n for (const home of getClaudeCredentialHomes()) {\n const credentialsPath = path.join(home, \".claude\", \".credentials.json\");\n if (!fs.existsSync(credentialsPath)) {\n logClaudeAuth(`credentials file not found at ${credentialsPath}`);\n continue;\n }\n\n logClaudeAuth(`found credentials file at ${credentialsPath}`);\n\n try {\n const raw = fs.readFileSync(credentialsPath, \"utf8\");\n const data = JSON.parse(raw) as ClaudeCredentialsFile;\n const oauth = data.claudeAiOauth;\n if (!oauth?.accessToken) {\n logClaudeAuth(`credentials file at ${credentialsPath} has no access token; skipping`);\n continue;\n }\n\n const expiresAt =\n typeof oauth.expiresAt === \"number\" && Number.isFinite(oauth.expiresAt)\n ? oauth.expiresAt\n : null;\n const loggedIn = expiresAt === null || expiresAt > Date.now();\n\n logClaudeAuth(\n `credentials file at ${credentialsPath} evaluated to loggedIn=${loggedIn} (expiresAt=${\n expiresAt === null ? \"none\" : new Date(expiresAt).toISOString()\n })`\n );\n\n if (loggedIn && (expiresAt ?? Number.MAX_SAFE_INTEGER) > bestExpiresAt) {\n bestExpiresAt = expiresAt ?? Number.MAX_SAFE_INTEGER;\n bestStatus = {\n installed: true,\n loggedIn: true,\n email: null,\n orgName: null,\n authMethod: \"oauth-credentials\",\n };\n logClaudeAuth(`credentials file at ${credentialsPath} is the current best auth candidate`);\n }\n } catch (error) {\n logClaudeAuth(\n `failed to read or parse credentials file at ${credentialsPath}: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n if (bestStatus?.loggedIn) {\n logClaudeAuth(\"credential-based auth check succeeded\");\n } else {\n logClaudeAuth(\"no valid logged-in credential file found\");\n }\n\n return bestStatus;\n}\n\nfunction getClaudeAuthStatusFromCli(): ClaudeAuthStatus | null {\n try {\n const raw = execFileSync(\"claude\", [\"auth\", \"status\"], {\n encoding: \"utf8\",\n timeout: 15_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n\n const parsed = parseClaudeCliStatus(raw);\n logClaudeAuth(\n parsed\n ? `cli auth status parsed successfully (loggedIn=${parsed.loggedIn}, authMethod=${\n parsed.authMethod ?? \"unknown\"\n })`\n : \"cli auth status returned output that could not be parsed\"\n );\n return parsed;\n } catch (err) {\n const stdout =\n err instanceof Error && \"stdout\" in err && typeof err.stdout === \"string\"\n ? err.stdout.trim()\n : \"\";\n if (stdout) {\n const parsed = parseClaudeCliStatus(stdout);\n logClaudeAuth(\n parsed\n ? `cli auth status errored but stdout parsed successfully (loggedIn=${parsed.loggedIn}, authMethod=${\n parsed.authMethod ?? \"unknown\"\n })`\n : \"cli auth status errored and stdout could not be parsed\"\n );\n return parsed;\n }\n\n logClaudeAuth(\n `cli auth status command failed without parseable stdout: ${\n err instanceof Error ? err.message : String(err)\n }`\n );\n return null;\n }\n}\n\nexport function getClaudeAuthStatus(): ClaudeAuthStatus {\n if (!commandExists(\"claude\")) {\n logClaudeAuth(\"claude binary not found; reporting installed=false\");\n return { installed: false, loggedIn: false, email: null, orgName: null, authMethod: null };\n }\n\n logClaudeAuth(\"claude binary found; checking credentials first\");\n const credentialStatus = getClaudeAuthStatusFromCredentials();\n if (credentialStatus?.loggedIn) {\n logClaudeAuth(\"returning logged-in status from credentials file\");\n return credentialStatus;\n }\n\n logClaudeAuth(\"credentials did not establish login; falling back to `claude auth status`\");\n const cliStatus = getClaudeAuthStatusFromCli();\n if (cliStatus) {\n logClaudeAuth(`returning status from cli auth check (loggedIn=${cliStatus.loggedIn})`);\n return cliStatus;\n }\n\n logClaudeAuth(\"cli auth check returned no status; falling back to loggedOut default\");\n return {\n installed: true,\n loggedIn: false,\n email: null,\n orgName: null,\n authMethod: null,\n };\n}\n\n// \u2500\u2500\u2500 Codex \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface CodexAuthStatus {\n installed: boolean;\n loggedIn: boolean;\n detail: string | null;\n}\n\ninterface CodexAuthFile {\n auth_mode?: string;\n OPENAI_API_KEY?: string | null;\n tokens?: {\n id_token?: string;\n access_token?: string;\n refresh_token?: string;\n account_id?: string;\n };\n last_refresh?: string;\n}\n\nfunction parseCodexLoggedInStatus(detail: string | null): boolean {\n const normalized = detail?.trim().toLowerCase();\n if (!normalized) return false;\n if (/\\bnot logged in\\b/.test(normalized) || /\\blogged out\\b/.test(normalized)) {\n return false;\n }\n return /\\blogged in\\b/.test(normalized);\n}\n\nfunction getTokenExpiryMs(token?: string): number | null {\n if (!token) return null;\n const payload = decodeJwtPayload(token);\n const exp = payload?.exp;\n return typeof exp === \"number\" && Number.isFinite(exp) ? exp * 1000 : null;\n}\n\nfunction getCodexAuthStatusFromFile(): CodexAuthStatus | null {\n let bestStatus: CodexAuthStatus | null = null;\n let bestScore = -Infinity;\n\n for (const home of getCredentialHomes()) {\n const authPath = path.join(home, \".codex\", \"auth.json\");\n if (!fs.existsSync(authPath)) continue;\n\n try {\n const raw = fs.readFileSync(authPath, \"utf8\");\n const data = JSON.parse(raw) as CodexAuthFile;\n const apiKey = data.OPENAI_API_KEY?.trim();\n const tokens = data.tokens;\n const accessExp = getTokenExpiryMs(tokens?.access_token);\n const idExp = getTokenExpiryMs(tokens?.id_token);\n const bestExp = Math.max(accessExp ?? -Infinity, idExp ?? -Infinity);\n const hasRefreshToken = Boolean(tokens?.refresh_token);\n const hasCurrentJwt = bestExp > Date.now();\n const loggedIn = Boolean(apiKey) || hasRefreshToken || hasCurrentJwt;\n\n if (!loggedIn) continue;\n\n const idPayload = tokens?.id_token ? decodeJwtPayload(tokens.id_token) : null;\n const email = typeof idPayload?.email === \"string\" ? idPayload.email : null;\n const mode = data.auth_mode?.trim() || (apiKey ? \"api_key\" : \"chatgpt\");\n const detail = email\n ? `Logged in via ${mode} (${email})`\n : `Logged in via ${mode}`;\n const score = Math.max(bestExp, hasRefreshToken ? Number.MAX_SAFE_INTEGER : -Infinity);\n\n if (score > bestScore) {\n bestScore = score;\n bestStatus = {\n installed: true,\n loggedIn: true,\n detail,\n };\n }\n } catch {\n // Ignore malformed auth files and continue checking other homes.\n }\n }\n\n return bestStatus;\n}\n\nfunction getCodexAuthStatusFromCli(): CodexAuthStatus | null {\n try {\n const raw = execFileSync(\"codex\", [\"login\", \"status\"], {\n encoding: \"utf8\",\n timeout: 15_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n\n const loggedIn = parseCodexLoggedInStatus(raw);\n return { installed: true, loggedIn, detail: raw || null };\n } catch (err) {\n const stdout =\n err instanceof Error && \"stdout\" in err && typeof err.stdout === \"string\"\n ? err.stdout.trim()\n : \"\";\n const stderr =\n err instanceof Error && \"stderr\" in err && typeof err.stderr === \"string\"\n ? err.stderr.trim()\n : \"\";\n const detail = stdout || stderr || null;\n const loggedIn = parseCodexLoggedInStatus(detail);\n return { installed: true, loggedIn, detail };\n }\n}\n\nexport function getCodexAuthStatus(): CodexAuthStatus {\n if (!commandExists(\"codex\")) {\n return { installed: false, loggedIn: false, detail: null };\n }\n\n const fileStatus = getCodexAuthStatusFromFile();\n if (fileStatus?.loggedIn) {\n return fileStatus;\n }\n\n return getCodexAuthStatusFromCli() ?? { installed: true, loggedIn: false, detail: null };\n}\n\nexport interface DeviceAuthResult {\n code: string;\n url: string;\n}\n\nlet activeCodexPty: pty.IPty | null = null;\n\nexport function startCodexDeviceAuth(): Promise<DeviceAuthResult> {\n if (activeCodexPty) {\n activeCodexPty.kill();\n activeCodexPty = null;\n }\n\n return new Promise((resolve, reject) => {\n const proc = pty.spawn(\"codex\", [\"login\", \"--device-auth\"], {\n name: \"xterm-256color\",\n cols: 120,\n rows: 30,\n env: process.env as Record<string, string>,\n });\n\n activeCodexPty = proc;\n let output = \"\";\n let resolved = false;\n\n proc.onData((data) => {\n output += data;\n const clean = stripAnsi(output);\n\n const urlMatch = clean.match(/(https:\\/\\/[^\\s\"'<>]+)/);\n const codeMatch = clean.match(/one-time code[^\\n]*\\n\\s+([A-Z0-9]+-[A-Z0-9]+)/i);\n\n if (codeMatch && urlMatch && !resolved) {\n resolved = true;\n resolve({ code: codeMatch[1], url: urlMatch[1] });\n }\n });\n\n proc.onExit(({ exitCode }) => {\n if (activeCodexPty === proc) activeCodexPty = null;\n if (!resolved) {\n reject(new Error(stripAnsi(output) || `codex login exited with code ${exitCode}`));\n }\n });\n\n setTimeout(() => {\n if (!resolved) {\n proc.kill();\n if (activeCodexPty === proc) activeCodexPty = null;\n reject(new Error(\"Codex device auth timed out\"));\n }\n }, 5 * 60 * 1000);\n });\n}\n\nexport function connectCodexWithApiKey(apiKey: string): CodexAuthStatus {\n if (!commandExists(\"codex\")) {\n throw new Error(\"Codex CLI is not installed\");\n }\n\n try {\n execFileSync(\"codex\", [\"login\", \"--with-api-key\"], {\n encoding: \"utf8\",\n timeout: 15_000,\n input: apiKey.trim(),\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n } catch (err) {\n const stderr =\n err instanceof Error && \"stderr\" in err && typeof err.stderr === \"string\"\n ? err.stderr.trim()\n : \"\";\n throw new Error(stderr || \"Failed to authenticate with API key\");\n }\n\n return getCodexAuthStatus();\n}\n", "import * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\n\nexport const MAESTRO_DATA_DIR = path.join(os.homedir(), \".maestro\");\n\nexport function ensureDataDir(): string {\n fs.mkdirSync(MAESTRO_DATA_DIR, { recursive: true });\n return MAESTRO_DATA_DIR;\n}\n\nexport function ensureDir(dirPath: string): string {\n fs.mkdirSync(dirPath, { recursive: true });\n return dirPath;\n}\n\nexport function readJsonFile<T>(filePath: string, fallback: T): T {\n try {\n if (!fs.existsSync(filePath)) {\n return fallback;\n }\n\n const raw = fs.readFileSync(filePath, \"utf-8\");\n return JSON.parse(raw) as T;\n } catch {\n return fallback;\n }\n}\n\nexport function writeJsonFile(\n filePath: string,\n value: unknown,\n options?: { mode?: number }\n): void {\n ensureDir(path.dirname(filePath));\n const tempPath = `${filePath}.tmp`;\n fs.writeFileSync(tempPath, `${JSON.stringify(value, null, 2)}\\n`, {\n mode: options?.mode,\n });\n fs.renameSync(tempPath, filePath);\n if (options?.mode != null) {\n fs.chmodSync(filePath, options.mode);\n }\n}\n\nexport function nowIso(): string {\n return new Date().toISOString();\n}\n", "import * as fs from \"fs\";\nimport * as path from \"path\";\nimport { execFileSync } from \"node:child_process\";\nimport { ensureDataDir, nowIso, readJsonFile, writeJsonFile } from \"../state/files.js\";\n\nconst GITHUB_CONNECTION_PATH = path.join(ensureDataDir(), \"github-connection.json\");\n\ninterface StoredGitHubConnectionRecord {\n token: string;\n login: string;\n name: string | null;\n avatarUrl: string | null;\n scopes: string[];\n connectedAt: string;\n verifiedAt: string;\n}\n\nexport interface GitHubConnectionStatus {\n connected: boolean;\n source: \"stored\" | \"env\" | null;\n canDisconnect: boolean;\n login: string | null;\n name: string | null;\n avatarUrl: string | null;\n scopes: string[];\n connectedAt: string | null;\n verifiedAt: string | null;\n}\n\nexport interface GitHubRepoSuggestion {\n id: number;\n name: string;\n fullName: string;\n owner: string;\n private: boolean;\n defaultBranch: string;\n cloneUrl: string;\n htmlUrl: string;\n}\n\nexport interface ResolvedGitHubToken {\n token: string | null;\n source: \"stored\" | \"env\" | null;\n}\n\ninterface GhRequestOptions {\n method?: \"GET\" | \"POST\" | \"PATCH\" | \"PUT\" | \"DELETE\";\n input?: unknown;\n token?: string | null;\n}\n\nfunction readStoredGitHubConnection(): StoredGitHubConnectionRecord | null {\n const record = readJsonFile<StoredGitHubConnectionRecord | null>(\n GITHUB_CONNECTION_PATH,\n null\n );\n if (!record?.token || !record.login) {\n return null;\n }\n return record;\n}\n\nfunction toConnectionStatus(\n record: StoredGitHubConnectionRecord | null,\n source: \"stored\" | \"env\" | null\n): GitHubConnectionStatus {\n return {\n connected: Boolean(source),\n source,\n canDisconnect: source === \"stored\",\n login: record?.login ?? null,\n name: record?.name ?? null,\n avatarUrl: record?.avatarUrl ?? null,\n scopes: record?.scopes ?? [],\n connectedAt: record?.connectedAt ?? null,\n verifiedAt: record?.verifiedAt ?? null,\n };\n}\n\nfunction getEnvGitHubToken(): string | null {\n return process.env.GITHUB_TOKEN || process.env.GH_TOKEN || null;\n}\n\nfunction getGhEnv(token?: string | null): NodeJS.ProcessEnv {\n const env = { ...process.env };\n const resolved = token ?? resolveGitHubToken().token;\n if (resolved) {\n env.GH_TOKEN = resolved;\n env.GITHUB_TOKEN = resolved;\n }\n return env;\n}\n\nexport function runGhCommand(\n args: string[],\n options?: { token?: string | null; input?: string; cwd?: string }\n): string {\n try {\n return execFileSync(\"gh\", args, {\n encoding: \"utf8\",\n env: getGhEnv(options?.token),\n cwd: options?.cwd,\n input: options?.input,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n } catch (error) {\n const stderr =\n error instanceof Error && \"stderr\" in error && typeof error.stderr === \"string\"\n ? error.stderr.trim()\n : \"\";\n throw new Error(stderr || `gh ${args.join(\" \")} failed`);\n }\n}\n\nfunction parseHeaderBlock(raw: string): Record<string, string> {\n const lines = raw.split(/\\r?\\n/).slice(1);\n const headers: Record<string, string> = {};\n for (const line of lines) {\n const idx = line.indexOf(\":\");\n if (idx === -1) continue;\n headers[line.slice(0, idx).trim().toLowerCase()] = line.slice(idx + 1).trim();\n }\n return headers;\n}\n\nfunction runGhApiWithHeaders<T>(\n endpoint: string,\n options?: GhRequestOptions\n): { data: T; headers: Record<string, string> } {\n const args = [\"api\", \"-i\"];\n if (options?.method && options.method !== \"GET\") {\n args.push(\"-X\", options.method);\n }\n if (options?.input != null) {\n args.push(\"--input\", \"-\");\n }\n args.push(endpoint.replace(/^\\//, \"\"));\n const raw = runGhCommand(args, {\n token: options?.token,\n input: options?.input == null ? undefined : JSON.stringify(options.input),\n });\n const parts = raw.split(/\\r?\\n\\r?\\n/);\n if (parts.length < 2) {\n throw new Error(\"Unexpected gh api response\");\n }\n\n const body = parts[parts.length - 1];\n const headerBlock = parts\n .slice(0, -1)\n .reverse()\n .find((part) => /^HTTP\\/\\d/i.test(part.trim()));\n\n return {\n data: JSON.parse(body) as T,\n headers: parseHeaderBlock(headerBlock ?? \"\"),\n };\n}\n\nexport function runGitHubApi<T>(endpoint: string, options?: GhRequestOptions): T {\n return runGhApiWithHeaders<T>(endpoint, options).data;\n}\n\nasync function fetchViewer(token: string): Promise<StoredGitHubConnectionRecord> {\n const { data, headers } = runGhApiWithHeaders<{\n login: string;\n name: string | null;\n avatar_url: string | null;\n }>(\"user\", { token });\n\n const now = nowIso();\n const current = readStoredGitHubConnection();\n\n return {\n token,\n login: data.login,\n name: data.name,\n avatarUrl: data.avatar_url,\n scopes: headers[\"x-oauth-scopes\"]\n ? headers[\"x-oauth-scopes\"]\n .split(\",\")\n .map((scope) => scope.trim())\n .filter(Boolean)\n : [],\n connectedAt: current?.token === token ? current.connectedAt : now,\n verifiedAt: now,\n };\n}\n\nexport function resolveGitHubToken(): ResolvedGitHubToken {\n const stored = readStoredGitHubConnection();\n if (stored?.token) {\n return {\n token: stored.token,\n source: \"stored\",\n };\n }\n\n const envToken = getEnvGitHubToken();\n if (envToken) {\n return {\n token: envToken,\n source: \"env\",\n };\n }\n\n return {\n token: null,\n source: null,\n };\n}\n\nexport function getGitHubChildEnvVars(): Record<string, string> {\n const resolved = resolveGitHubToken();\n if (!resolved.token) {\n return {};\n }\n\n return {\n GITHUB_TOKEN: resolved.token,\n GH_TOKEN: resolved.token,\n };\n}\n\nexport async function connectGitHubToken(token: string): Promise<GitHubConnectionStatus> {\n const normalized = token.trim();\n if (!normalized) {\n throw new Error(\"GitHub token is required\");\n }\n\n const record = await fetchViewer(normalized);\n writeJsonFile(GITHUB_CONNECTION_PATH, record, { mode: 0o600 });\n return toConnectionStatus(record, \"stored\");\n}\n\nexport function disconnectGitHubToken(): GitHubConnectionStatus {\n if (fs.existsSync(GITHUB_CONNECTION_PATH)) {\n fs.unlinkSync(GITHUB_CONNECTION_PATH);\n }\n return toConnectionStatus(null, getEnvGitHubToken() ? \"env\" : null);\n}\n\nexport async function getGitHubConnectionStatus(): Promise<GitHubConnectionStatus> {\n const stored = readStoredGitHubConnection();\n if (stored?.token) {\n return toConnectionStatus(stored, \"stored\");\n }\n\n const envToken = getEnvGitHubToken();\n if (!envToken) {\n return toConnectionStatus(null, null);\n }\n\n try {\n const record = await fetchViewer(envToken);\n return toConnectionStatus(record, \"env\");\n } catch {\n return toConnectionStatus(null, \"env\");\n }\n}\n\nexport async function searchGitHubRepositories(\n query: string\n): Promise<GitHubRepoSuggestion[]> {\n const resolved = resolveGitHubToken();\n if (!resolved.token) {\n throw new Error(\"GitHub is not connected\");\n }\n\n const data = runGitHubApi<\n Array<{\n id: number;\n name: string;\n full_name: string;\n private: boolean;\n default_branch: string;\n clone_url: string;\n html_url: string;\n owner: { login: string };\n }>\n >(\n \"user/repos?sort=updated&per_page=100&affiliation=owner,collaborator,organization_member\",\n { token: resolved.token }\n );\n\n const normalized = query.trim().toLowerCase();\n return data\n .filter((repo) => {\n if (!normalized) return true;\n return (\n repo.full_name.toLowerCase().includes(normalized) ||\n repo.name.toLowerCase().includes(normalized) ||\n repo.owner.login.toLowerCase().includes(normalized)\n );\n })\n .slice(0, 20)\n .map((repo) => ({\n id: repo.id,\n name: repo.name,\n fullName: repo.full_name,\n owner: repo.owner.login,\n private: repo.private,\n defaultBranch: repo.default_branch,\n cloneUrl: repo.clone_url,\n htmlUrl: repo.html_url,\n }));\n}\n", "import {\n getClaudeAuthStatus,\n getCodexAuthStatus,\n type ClaudeAuthStatus,\n type CodexAuthStatus,\n} from \"../integrations/cli-auth.js\";\nimport {\n getGitHubConnectionStatus,\n type GitHubConnectionStatus,\n} from \"../integrations/github.js\";\n\nconst INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours\nconst INITIAL_DELAY_MS = 5_000; // 5 seconds after startup\n\nlet timer: ReturnType<typeof setInterval> | null = null;\nlet lastCheckAt: string | null = null;\n\nlet cachedClaude: ClaudeAuthStatus | null = null;\nlet cachedCodex: CodexAuthStatus | null = null;\nlet cachedGitHub: GitHubConnectionStatus | null = null;\n\nexport async function refreshAuthStatus(): Promise<void> {\n console.log(\"[auth-status] Checking CLI auth status...\");\n try {\n cachedClaude = getClaudeAuthStatus();\n } catch {\n cachedClaude = null;\n }\n try {\n cachedCodex = getCodexAuthStatus();\n } catch {\n cachedCodex = null;\n }\n try {\n cachedGitHub = await getGitHubConnectionStatus();\n } catch {\n cachedGitHub = null;\n }\n lastCheckAt = new Date().toISOString();\n console.log(\"[auth-status] Check complete.\");\n}\n\nexport function getCachedClaudeAuthStatus(): ClaudeAuthStatus | null {\n return cachedClaude;\n}\n\nexport function getCachedCodexAuthStatus(): CodexAuthStatus | null {\n return cachedCodex;\n}\n\nexport function getCachedGitHubConnectionStatus(): GitHubConnectionStatus | null {\n return cachedGitHub;\n}\n\nexport function getAuthStatusLastCheckAt(): string | null {\n return lastCheckAt;\n}\n\nexport function startAuthStatusChecker(): void {\n setTimeout(() => void refreshAuthStatus(), INITIAL_DELAY_MS);\n timer = setInterval(() => void refreshAuthStatus(), INTERVAL_MS);\n console.log(\"[auth-status] Started (interval: 24h)\");\n}\n\nexport function stopAuthStatusChecker(): void {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n}\n", "import * as path from \"path\";\nimport { randomUUID } from \"crypto\";\nimport { DatabaseSync } from \"node:sqlite\";\nimport { ensureDataDir, nowIso } from \"./files.js\";\nimport type {\n AutomationRecord,\n AutomationRunRecord,\n ScheduledTaskRecord,\n} from \"./types.js\";\n\nconst dbPath = path.join(ensureDataDir(), \"state.sqlite\");\nconst db = new DatabaseSync(dbPath);\n\ndb.exec(`\n CREATE TABLE IF NOT EXISTS scheduled_tasks (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n prompt TEXT NOT NULL,\n schedule TEXT NOT NULL,\n project_id TEXT,\n project_path TEXT NOT NULL,\n provider TEXT NOT NULL,\n model TEXT,\n custom_display_name TEXT,\n custom_command_template TEXT,\n custom_env_json TEXT,\n skip_permissions INTEGER NOT NULL,\n enabled INTEGER NOT NULL,\n last_run_at TEXT,\n next_run_at TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS automations (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n description TEXT,\n enabled INTEGER NOT NULL,\n source_type TEXT NOT NULL,\n source_config_json TEXT NOT NULL,\n trigger_type TEXT NOT NULL,\n agent_project_id TEXT,\n agent_project_path TEXT NOT NULL,\n agent_prompt_template TEXT NOT NULL,\n agent_provider TEXT NOT NULL,\n agent_model TEXT,\n agent_custom_display_name TEXT,\n agent_custom_command_template TEXT,\n agent_custom_env_json TEXT,\n agent_skip_permissions INTEGER NOT NULL,\n poll_interval_minutes INTEGER NOT NULL,\n last_poll_at TEXT,\n processed_hashes_json TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS automation_runs (\n id TEXT PRIMARY KEY,\n automation_id TEXT NOT NULL,\n status TEXT NOT NULL,\n items_found INTEGER NOT NULL,\n items_processed INTEGER NOT NULL,\n error TEXT,\n agent_id TEXT,\n started_at TEXT NOT NULL,\n completed_at TEXT,\n FOREIGN KEY (automation_id) REFERENCES automations(id) ON DELETE CASCADE\n );\n\n CREATE TABLE IF NOT EXISTS settings (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n`);\n\nfunction parseJson<T>(value: string | null | undefined, fallback: T): T {\n if (!value) return fallback;\n try {\n return JSON.parse(value) as T;\n } catch {\n return fallback;\n }\n}\n\nfunction toScheduledTask(row: Record<string, unknown>): ScheduledTaskRecord {\n return {\n id: String(row.id),\n name: String(row.name),\n prompt: String(row.prompt),\n schedule: String(row.schedule),\n projectId: row.project_id ? String(row.project_id) : null,\n projectPath: String(row.project_path),\n provider: String(row.provider),\n customDisplayName: row.custom_display_name ? String(row.custom_display_name) : null,\n customCommandTemplate: row.custom_command_template\n ? String(row.custom_command_template)\n : null,\n customEnv: parseJson<Record<string, string> | null>(\n row.custom_env_json as string | null,\n null\n ),\n skipPermissions: Boolean(row.skip_permissions),\n enabled: Boolean(row.enabled),\n lastRunAt: row.last_run_at ? String(row.last_run_at) : null,\n nextRunAt: row.next_run_at ? String(row.next_run_at) : null,\n createdAt: String(row.created_at),\n updatedAt: String(row.updated_at),\n };\n}\n\nfunction toAutomation(row: Record<string, unknown>): AutomationRecord {\n return {\n id: String(row.id),\n name: String(row.name),\n description: row.description ? String(row.description) : null,\n enabled: Boolean(row.enabled),\n sourceType: String(row.source_type),\n sourceConfig: parseJson<Record<string, string>>(String(row.source_config_json), {}),\n triggerType: String(row.trigger_type),\n agentProjectId: row.agent_project_id ? String(row.agent_project_id) : null,\n agentProjectPath: String(row.agent_project_path),\n agentPromptTemplate: String(row.agent_prompt_template),\n agentProvider: String(row.agent_provider),\n agentCustomDisplayName: row.agent_custom_display_name\n ? String(row.agent_custom_display_name)\n : null,\n agentCustomCommandTemplate: row.agent_custom_command_template\n ? String(row.agent_custom_command_template)\n : null,\n agentCustomEnv: parseJson<Record<string, string> | null>(\n row.agent_custom_env_json as string | null,\n null\n ),\n agentSkipPermissions: Boolean(row.agent_skip_permissions),\n pollIntervalMinutes: Number(row.poll_interval_minutes),\n lastPollAt: row.last_poll_at ? String(row.last_poll_at) : null,\n processedHashes: parseJson<string[]>(String(row.processed_hashes_json), []),\n createdAt: String(row.created_at),\n updatedAt: String(row.updated_at),\n };\n}\n\nfunction toAutomationRun(row: Record<string, unknown>): AutomationRunRecord {\n return {\n id: String(row.id),\n automationId: String(row.automation_id),\n status: String(row.status),\n itemsFound: Number(row.items_found),\n itemsProcessed: Number(row.items_processed),\n error: row.error ? String(row.error) : null,\n agentId: row.agent_id ? String(row.agent_id) : null,\n startedAt: String(row.started_at),\n completedAt: row.completed_at ? String(row.completed_at) : null,\n };\n}\n\nexport function listScheduledTaskRecords(): ScheduledTaskRecord[] {\n const rows = db\n .prepare(\"SELECT * FROM scheduled_tasks ORDER BY created_at DESC\")\n .all() as Record<string, unknown>[];\n return rows.map(toScheduledTask);\n}\n\nexport function getScheduledTaskRecord(id: string): ScheduledTaskRecord | null {\n const row = db\n .prepare(\"SELECT * FROM scheduled_tasks WHERE id = ?\")\n .get(id) as Record<string, unknown> | undefined;\n return row ? toScheduledTask(row) : null;\n}\n\nexport function createScheduledTaskRecord(\n input: Omit<ScheduledTaskRecord, \"id\" | \"createdAt\" | \"updatedAt\">\n): ScheduledTaskRecord {\n const task: ScheduledTaskRecord = {\n id: randomUUID(),\n ...input,\n createdAt: nowIso(),\n updatedAt: nowIso(),\n };\n\n db.prepare(`\n INSERT INTO scheduled_tasks (\n id, name, prompt, schedule, project_id, project_path, provider,\n custom_display_name, custom_command_template, custom_env_json,\n skip_permissions, enabled, last_run_at, next_run_at, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).run(\n task.id,\n task.name,\n task.prompt,\n task.schedule,\n task.projectId,\n task.projectPath,\n task.provider,\n task.customDisplayName,\n task.customCommandTemplate,\n JSON.stringify(task.customEnv),\n task.skipPermissions ? 1 : 0,\n task.enabled ? 1 : 0,\n task.lastRunAt,\n task.nextRunAt,\n task.createdAt,\n task.updatedAt\n );\n\n return task;\n}\n\nexport function updateScheduledTaskRecord(\n id: string,\n patch: Partial<Omit<ScheduledTaskRecord, \"id\" | \"createdAt\">>\n): ScheduledTaskRecord {\n const current = getScheduledTaskRecord(id);\n if (!current) {\n throw new Error(\"Task not found\");\n }\n\n const next: ScheduledTaskRecord = {\n ...current,\n ...patch,\n updatedAt: nowIso(),\n };\n\n db.prepare(`\n UPDATE scheduled_tasks SET\n name = ?, prompt = ?, schedule = ?, project_id = ?, project_path = ?,\n provider = ?, custom_display_name = ?, custom_command_template = ?,\n custom_env_json = ?, skip_permissions = ?, enabled = ?, last_run_at = ?,\n next_run_at = ?, updated_at = ?\n WHERE id = ?\n `).run(\n next.name,\n next.prompt,\n next.schedule,\n next.projectId,\n next.projectPath,\n next.provider,\n next.customDisplayName,\n next.customCommandTemplate,\n JSON.stringify(next.customEnv),\n next.skipPermissions ? 1 : 0,\n next.enabled ? 1 : 0,\n next.lastRunAt,\n next.nextRunAt,\n next.updatedAt,\n id\n );\n\n return next;\n}\n\nexport function deleteScheduledTaskRecord(id: string): void {\n db.prepare(\"DELETE FROM scheduled_tasks WHERE id = ?\").run(id);\n}\n\nexport function listAutomationRecords(): AutomationRecord[] {\n const rows = db\n .prepare(\"SELECT * FROM automations ORDER BY created_at DESC\")\n .all() as Record<string, unknown>[];\n return rows.map(toAutomation);\n}\n\nexport function getAutomationRecord(id: string): AutomationRecord | null {\n const row = db\n .prepare(\"SELECT * FROM automations WHERE id = ?\")\n .get(id) as Record<string, unknown> | undefined;\n return row ? toAutomation(row) : null;\n}\n\nexport function createAutomationRecord(\n input: Omit<AutomationRecord, \"id\" | \"createdAt\" | \"updatedAt\">\n): AutomationRecord {\n const automation: AutomationRecord = {\n id: randomUUID(),\n ...input,\n createdAt: nowIso(),\n updatedAt: nowIso(),\n };\n\n db.prepare(`\n INSERT INTO automations (\n id, name, description, enabled, source_type, source_config_json,\n trigger_type, agent_project_id, agent_project_path, agent_prompt_template,\n agent_provider, agent_custom_display_name,\n agent_custom_command_template, agent_custom_env_json,\n agent_skip_permissions, poll_interval_minutes, last_poll_at,\n processed_hashes_json, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).run(\n automation.id,\n automation.name,\n automation.description,\n automation.enabled ? 1 : 0,\n automation.sourceType,\n JSON.stringify(automation.sourceConfig),\n automation.triggerType,\n automation.agentProjectId,\n automation.agentProjectPath,\n automation.agentPromptTemplate,\n automation.agentProvider,\n automation.agentCustomDisplayName,\n automation.agentCustomCommandTemplate,\n JSON.stringify(automation.agentCustomEnv),\n automation.agentSkipPermissions ? 1 : 0,\n automation.pollIntervalMinutes,\n automation.lastPollAt,\n JSON.stringify(automation.processedHashes),\n automation.createdAt,\n automation.updatedAt\n );\n\n return automation;\n}\n\nexport function updateAutomationRecord(\n id: string,\n patch: Partial<Omit<AutomationRecord, \"id\" | \"createdAt\">>\n): AutomationRecord {\n const current = getAutomationRecord(id);\n if (!current) {\n throw new Error(\"Automation not found\");\n }\n\n const next: AutomationRecord = {\n ...current,\n ...patch,\n updatedAt: nowIso(),\n };\n\n db.prepare(`\n UPDATE automations SET\n name = ?, description = ?, enabled = ?, source_type = ?, source_config_json = ?,\n trigger_type = ?, agent_project_id = ?, agent_project_path = ?,\n agent_prompt_template = ?, agent_provider = ?,\n agent_custom_display_name = ?, agent_custom_command_template = ?,\n agent_custom_env_json = ?, agent_skip_permissions = ?,\n poll_interval_minutes = ?, last_poll_at = ?, processed_hashes_json = ?,\n updated_at = ?\n WHERE id = ?\n `).run(\n next.name,\n next.description,\n next.enabled ? 1 : 0,\n next.sourceType,\n JSON.stringify(next.sourceConfig),\n next.triggerType,\n next.agentProjectId,\n next.agentProjectPath,\n next.agentPromptTemplate,\n next.agentProvider,\n next.agentCustomDisplayName,\n next.agentCustomCommandTemplate,\n JSON.stringify(next.agentCustomEnv),\n next.agentSkipPermissions ? 1 : 0,\n next.pollIntervalMinutes,\n next.lastPollAt,\n JSON.stringify(next.processedHashes),\n next.updatedAt,\n id\n );\n\n return next;\n}\n\nexport function deleteAutomationRecord(id: string): void {\n db.prepare(\"DELETE FROM automation_runs WHERE automation_id = ?\").run(id);\n db.prepare(\"DELETE FROM automations WHERE id = ?\").run(id);\n}\n\nexport function listAutomationRunRecords(\n automationId: string,\n limit = 20\n): AutomationRunRecord[] {\n const rows = db\n .prepare(`\n SELECT * FROM automation_runs\n WHERE automation_id = ?\n ORDER BY started_at DESC\n LIMIT ?\n `)\n .all(automationId, limit) as Record<string, unknown>[];\n return rows.map(toAutomationRun);\n}\n\nexport function createAutomationRunRecord(\n input: Omit<AutomationRunRecord, \"id\">\n): AutomationRunRecord {\n const run: AutomationRunRecord = {\n id: randomUUID(),\n ...input,\n };\n\n db.prepare(`\n INSERT INTO automation_runs (\n id, automation_id, status, items_found, items_processed, error,\n agent_id, started_at, completed_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).run(\n run.id,\n run.automationId,\n run.status,\n run.itemsFound,\n run.itemsProcessed,\n run.error,\n run.agentId,\n run.startedAt,\n run.completedAt\n );\n\n return run;\n}\n\n// \u2500\u2500 Settings \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function getSetting(key: string): string | null {\n const row = db\n .prepare(\"SELECT value FROM settings WHERE key = ?\")\n .get(key) as { value: string } | undefined;\n return row?.value ?? null;\n}\n\nexport function setSetting(key: string, value: string): void {\n db.prepare(`\n INSERT INTO settings (key, value, updated_at) VALUES (?, ?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = excluded.updated_at\n `).run(key, value, nowIso());\n}\n\nexport function getAllSettings(): Record<string, string> {\n const rows = db\n .prepare(\"SELECT key, value FROM settings\")\n .all() as Array<{ key: string; value: string }>;\n const result: Record<string, string> = {};\n for (const row of rows) {\n result[row.key] = row.value;\n }\n return result;\n}\n\nexport function updateAutomationRunRecord(\n id: string,\n patch: Partial<Omit<AutomationRunRecord, \"id\" | \"automationId\" | \"startedAt\">>\n): AutomationRunRecord {\n const row = db\n .prepare(\"SELECT * FROM automation_runs WHERE id = ?\")\n .get(id) as Record<string, unknown> | undefined;\n if (!row) {\n throw new Error(\"Automation run not found\");\n }\n\n const current = toAutomationRun(row);\n const next: AutomationRunRecord = {\n ...current,\n ...patch,\n };\n\n db.prepare(`\n UPDATE automation_runs SET\n status = ?, items_found = ?, items_processed = ?, error = ?, agent_id = ?, completed_at = ?\n WHERE id = ?\n `).run(\n next.status,\n next.itemsFound,\n next.itemsProcessed,\n next.error,\n next.agentId,\n next.completedAt,\n id\n );\n\n return next;\n}\n", "import type { Settings, SettingsUpdate } from \"@maestro/wire\";\nimport { normalizeSandboxProvider } from \"../agents/sandbox.js\";\nimport { getSetting, setSetting } from \"./sqlite.js\";\n\nconst DEFAULTS: Settings = {\n autoUpdateEnabled: false,\n autoUpdateIntervalHours: 24,\n piOllamaModel: \"\",\n telegramBotToken: \"\",\n sandboxEnabled: false,\n sandboxProvider: \"none\",\n deepgramApiKey: \"\",\n agentDefaultProvider: \"claude\",\n agentDefaultDisableSandbox: false,\n agentDefaultSkipPermissions: true,\n agentDefaultWorktreeMode: \"none\",\n};\n\nexport function getSettings(): Settings {\n const enabled = getSetting(\"autoUpdateEnabled\");\n const interval = getSetting(\"autoUpdateIntervalHours\");\n const piModel = getSetting(\"piOllamaModel\");\n\n const telegramToken = getSetting(\"telegramBotToken\");\n const sandbox = getSetting(\"sandboxEnabled\");\n const sandboxProvider = getSetting(\"sandboxProvider\");\n const deepgramKey = getSetting(\"deepgramApiKey\");\n const agentDefaultProvider = getSetting(\"agentDefaultProvider\");\n const agentDefaultDisableSandbox = getSetting(\"agentDefaultDisableSandbox\");\n const agentDefaultSkipPermissions = getSetting(\"agentDefaultSkipPermissions\");\n const agentDefaultWorktreeMode = getSetting(\"agentDefaultWorktreeMode\");\n const storedSandboxProvider = normalizeSandboxProvider(\n sandboxProvider,\n sandbox === \"true\"\n );\n const resolvedSandboxProvider =\n storedSandboxProvider === \"nsjail\" ? \"docker\" : storedSandboxProvider;\n\n return {\n autoUpdateEnabled: enabled !== null ? enabled === \"true\" : DEFAULTS.autoUpdateEnabled,\n autoUpdateIntervalHours: interval !== null ? Number(interval) : DEFAULTS.autoUpdateIntervalHours,\n piOllamaModel: piModel !== null ? piModel : DEFAULTS.piOllamaModel,\n telegramBotToken: telegramToken !== null ? telegramToken : DEFAULTS.telegramBotToken,\n sandboxEnabled: resolvedSandboxProvider !== \"none\",\n sandboxProvider: resolvedSandboxProvider,\n deepgramApiKey: deepgramKey !== null ? deepgramKey : DEFAULTS.deepgramApiKey,\n agentDefaultProvider:\n agentDefaultProvider === \"codex\" ? \"codex\" : DEFAULTS.agentDefaultProvider,\n agentDefaultDisableSandbox:\n agentDefaultDisableSandbox !== null\n ? agentDefaultDisableSandbox === \"true\"\n : DEFAULTS.agentDefaultDisableSandbox,\n agentDefaultSkipPermissions:\n agentDefaultSkipPermissions !== null\n ? agentDefaultSkipPermissions === \"true\"\n : DEFAULTS.agentDefaultSkipPermissions,\n agentDefaultWorktreeMode:\n agentDefaultWorktreeMode === \"new\" ? \"new\" : DEFAULTS.agentDefaultWorktreeMode,\n };\n}\n\nexport function updateSettings(patch: SettingsUpdate): Settings {\n if (patch.autoUpdateEnabled !== undefined) {\n setSetting(\"autoUpdateEnabled\", String(patch.autoUpdateEnabled));\n }\n if (patch.autoUpdateIntervalHours !== undefined) {\n setSetting(\"autoUpdateIntervalHours\", String(patch.autoUpdateIntervalHours));\n }\n if (patch.piOllamaModel !== undefined) {\n setSetting(\"piOllamaModel\", patch.piOllamaModel);\n }\n if (patch.telegramBotToken !== undefined) {\n setSetting(\"telegramBotToken\", patch.telegramBotToken);\n }\n if (patch.sandboxEnabled !== undefined) {\n setSetting(\"sandboxEnabled\", String(patch.sandboxEnabled));\n if (patch.sandboxProvider === undefined) {\n setSetting(\"sandboxProvider\", patch.sandboxEnabled ? \"docker\" : \"none\");\n }\n }\n if (patch.sandboxProvider !== undefined) {\n const provider = patch.sandboxProvider === \"nsjail\" ? \"docker\" : patch.sandboxProvider;\n setSetting(\"sandboxProvider\", provider);\n setSetting(\"sandboxEnabled\", String(provider !== \"none\"));\n }\n if (patch.deepgramApiKey !== undefined) {\n setSetting(\"deepgramApiKey\", patch.deepgramApiKey);\n }\n if (patch.agentDefaultProvider !== undefined) {\n setSetting(\"agentDefaultProvider\", patch.agentDefaultProvider);\n }\n if (patch.agentDefaultDisableSandbox !== undefined) {\n setSetting(\"agentDefaultDisableSandbox\", String(patch.agentDefaultDisableSandbox));\n }\n if (patch.agentDefaultSkipPermissions !== undefined) {\n setSetting(\"agentDefaultSkipPermissions\", String(patch.agentDefaultSkipPermissions));\n }\n if (patch.agentDefaultWorktreeMode !== undefined) {\n setSetting(\"agentDefaultWorktreeMode\", patch.agentDefaultWorktreeMode);\n }\n return getSettings();\n}\n", "import type { AgentProvider } from \"@maestro/wire\";\nimport { getClaudeAuthStatus, getCodexAuthStatus } from \"../integrations/cli-auth.js\";\nimport { getCachedClaudeAuthStatus, getCachedCodexAuthStatus } from \"../services/auth-status-checker.js\";\nimport { getSettings } from \"../state/settings.js\";\n\nfunction getProviderLabel(provider: AgentProvider): string {\n return provider === \"codex\" ? \"Codex\" : \"Claude Code\";\n}\n\nexport function assertAutoSpawnProviderReady(): AgentProvider {\n const provider = getSettings().agentDefaultProvider;\n const status =\n provider === \"codex\"\n ? (getCachedCodexAuthStatus() ?? getCodexAuthStatus())\n : (getCachedClaudeAuthStatus() ?? getClaudeAuthStatus());\n\n if (!status.installed) {\n throw new Error(\n `${getProviderLabel(provider)} is selected in Settings, but it is not installed.`\n );\n }\n\n if (!status.loggedIn) {\n throw new Error(\n `${getProviderLabel(provider)} is selected in Settings, but it is not logged in.`\n );\n }\n\n return provider;\n}\n", "import * as fs from \"fs\";\nimport * as path from \"path\";\nimport { randomUUID } from \"crypto\";\nimport { ensureDataDir, ensureDir, nowIso, readJsonFile, writeJsonFile } from \"./files.js\";\nimport type { TerminalRecord } from \"./types.js\";\n\n// Keep the legacy on-disk filenames so existing installs do not need data migration.\nconst TERMINALS_PATH = path.join(ensureDataDir(), \"agents.json\");\nconst TERMINAL_HISTORY_DIR = path.join(ensureDataDir(), \"agents\");\n\nfunction readTerminals(): TerminalRecord[] {\n return readJsonFile<TerminalRecord[]>(TERMINALS_PATH, []);\n}\n\nfunction writeTerminals(terminals: TerminalRecord[]): void {\n writeJsonFile(TERMINALS_PATH, terminals);\n}\n\nfunction terminalDir(terminalId: string): string {\n return ensureDir(path.join(TERMINAL_HISTORY_DIR, terminalId));\n}\n\nfunction terminalSnapshotPath(terminalId: string): string {\n return path.join(terminalDir(terminalId), \"snapshot.json\");\n}\n\nfunction syncTerminalMeta(terminal: TerminalRecord): void {\n writeJsonFile(path.join(terminalDir(terminal.id), \"meta.json\"), terminal);\n}\n\nexport function listTerminalRecords(): TerminalRecord[] {\n return readTerminals().sort((a, b) => b.createdAt.localeCompare(a.createdAt));\n}\n\nexport function getTerminalRecord(terminalId: string): TerminalRecord | null {\n return readTerminals().find((terminal) => terminal.id === terminalId) ?? null;\n}\n\nexport function findTerminalRecords(\n predicate: (terminal: TerminalRecord) => boolean\n): TerminalRecord[] {\n return listTerminalRecords().filter(predicate);\n}\n\nexport function createTerminalRecord(\n data: Omit<TerminalRecord, \"id\" | \"createdAt\" | \"updatedAt\">\n): TerminalRecord {\n const timestamp = nowIso();\n const terminal: TerminalRecord = {\n id: randomUUID(),\n ...data,\n createdAt: timestamp,\n updatedAt: timestamp,\n };\n\n const terminals = readTerminals();\n terminals.push(terminal);\n writeTerminals(terminals);\n syncTerminalMeta(terminal);\n return terminal;\n}\n\nexport function updateTerminalRecord(\n terminalId: string,\n patch: Partial<Omit<TerminalRecord, \"id\" | \"createdAt\">>\n): TerminalRecord {\n const terminals = readTerminals();\n const index = terminals.findIndex((terminal) => terminal.id === terminalId);\n if (index === -1) {\n throw new Error(\"Terminal not found\");\n }\n\n const next: TerminalRecord = {\n ...terminals[index],\n ...patch,\n updatedAt: nowIso(),\n };\n terminals[index] = next;\n writeTerminals(terminals);\n syncTerminalMeta(next);\n return next;\n}\n\nexport function deleteTerminalRecord(terminalId: string): void {\n writeTerminals(readTerminals().filter((terminal) => terminal.id !== terminalId));\n}\n\nexport function deleteTerminalState(terminalId: string): void {\n fs.rmSync(terminalDir(terminalId), { recursive: true, force: true });\n}\n\nexport function appendTerminalHistory(terminalId: string, data: string): void {\n const historyPath = path.join(terminalDir(terminalId), \"transcript.log\");\n fs.appendFileSync(historyPath, data);\n}\n\nexport async function appendTerminalHistoryBatch(\n terminalId: string,\n data: string\n): Promise<void> {\n const historyPath = path.join(terminalDir(terminalId), \"transcript.log\");\n await fs.promises.appendFile(historyPath, data);\n}\n\nexport interface PersistedTerminalSnapshot {\n cursor: number;\n data: string;\n savedAt: number;\n cols?: number;\n rows?: number;\n}\n\nexport function readTerminalSnapshot(terminalId: string): PersistedTerminalSnapshot | null {\n const snapshot = readJsonFile<Partial<PersistedTerminalSnapshot> | null>(\n terminalSnapshotPath(terminalId),\n null\n );\n if (\n snapshot == null ||\n typeof snapshot.cursor !== \"number\" ||\n typeof snapshot.data !== \"string\" ||\n typeof snapshot.savedAt !== \"number\" ||\n (snapshot.cols !== undefined && typeof snapshot.cols !== \"number\") ||\n (snapshot.rows !== undefined && typeof snapshot.rows !== \"number\")\n ) {\n return null;\n }\n return snapshot as PersistedTerminalSnapshot;\n}\n\nexport function writeTerminalSnapshot(\n terminalId: string,\n snapshot: PersistedTerminalSnapshot\n): void {\n writeJsonFile(terminalSnapshotPath(terminalId), snapshot);\n}\n\nfunction trimPartialTerminalTail(content: string): string {\n if (!content) return content;\n\n const firstNewline = content.indexOf(\"\\n\");\n if (firstNewline === -1 || firstNewline === content.length - 1) {\n return content;\n }\n\n return content.slice(firstNewline + 1);\n}\n\n/**\n * Read the transcript log for a terminal.\n * Returns the raw content (up to `maxBytes` from the tail) or an empty string.\n */\nexport function readTerminalHistory(\n terminalId: string,\n maxBytes = 2 * 1024 * 1024\n): string {\n const historyPath = path.join(terminalDir(terminalId), \"transcript.log\");\n if (!fs.existsSync(historyPath)) return \"\";\n\n const stat = fs.statSync(historyPath);\n if (stat.size === 0) return \"\";\n\n if (stat.size <= maxBytes) {\n return fs.readFileSync(historyPath, \"utf-8\");\n }\n\n // Read only the tail\n const fd = fs.openSync(historyPath, \"r\");\n const buffer = Buffer.alloc(maxBytes);\n fs.readSync(fd, buffer, 0, maxBytes, stat.size - maxBytes);\n fs.closeSync(fd);\n return trimPartialTerminalTail(buffer.toString(\"utf-8\"));\n}\n", "import * as path from \"path\";\nimport { randomUUID } from \"crypto\";\nimport { ensureDataDir, nowIso, readJsonFile, writeJsonFile } from \"./files.js\";\nimport type { ProjectRecord } from \"./types.js\";\n\nconst PROJECTS_PATH = path.join(ensureDataDir(), \"projects.json\");\n\nfunction readProjects(): ProjectRecord[] {\n return readJsonFile<ProjectRecord[]>(PROJECTS_PATH, []);\n}\n\nfunction writeProjects(projects: ProjectRecord[]): void {\n writeJsonFile(PROJECTS_PATH, projects);\n}\n\nexport function listProjectRecords(): ProjectRecord[] {\n return readProjects().sort((a, b) => b.createdAt.localeCompare(a.createdAt));\n}\n\nexport function getProjectRecordById(projectId: string): ProjectRecord | null {\n return readProjects().find((project) => project.id === projectId) ?? null;\n}\n\nexport function getProjectRecordBySlug(slug: string): ProjectRecord | null {\n return readProjects().find((project) => project.slug === slug) ?? null;\n}\n\nexport function findProjectRecordByPath(projectPath: string): ProjectRecord | null {\n return readProjects().find((project) => project.localPath === projectPath) ?? null;\n}\n\nexport function findProjectRecordByGitHubRepo(\n githubOwner: string,\n githubRepo: string\n): ProjectRecord | null {\n const owner = githubOwner.trim().toLowerCase();\n const repo = githubRepo.trim().toLowerCase();\n\n return (\n readProjects().find(\n (project) =>\n project.githubOwner?.toLowerCase() === owner &&\n project.githubRepo?.toLowerCase() === repo\n ) ?? null\n );\n}\n\nexport function createProjectRecord(\n data: Omit<ProjectRecord, \"id\" | \"createdAt\" | \"updatedAt\">\n): ProjectRecord {\n const timestamp = nowIso();\n const project: ProjectRecord = {\n id: randomUUID(),\n ...data,\n createdAt: timestamp,\n updatedAt: timestamp,\n };\n\n const projects = readProjects();\n projects.push(project);\n writeProjects(projects);\n return project;\n}\n\nexport function updateProjectRecord(\n projectId: string,\n patch: Partial<Omit<ProjectRecord, \"id\" | \"createdAt\">>\n): ProjectRecord {\n const projects = readProjects();\n const index = projects.findIndex((project) => project.id === projectId);\n if (index === -1) {\n throw new Error(\"Project not found\");\n }\n\n const next: ProjectRecord = {\n ...projects[index],\n ...patch,\n updatedAt: nowIso(),\n };\n projects[index] = next;\n writeProjects(projects);\n return next;\n}\n\nexport function removeProjectRecord(projectId: string): void {\n writeProjects(readProjects().filter((project) => project.id !== projectId));\n}\n", "import { randomUUID } from \"crypto\";\nimport { execFileSync } from \"node:child_process\";\nimport * as path from \"path\";\nimport { ensureDataDir, nowIso, readJsonFile, writeJsonFile } from \"./files.js\";\nimport {\n findProjectRecordByPath,\n getProjectRecordById,\n listProjectRecords,\n updateProjectRecord,\n} from \"./projects.js\";\nimport { runGhCommand, runGitHubApi } from \"../integrations/github.js\";\nimport { findTerminalRecords, getTerminalRecord, readTerminalHistory } from \"./terminals.js\";\nimport type {\n KanbanOverlayRecord,\n KanbanTaskRecord,\n LocalKanbanTaskRecord,\n ProjectRecord,\n} from \"./types.js\";\n\nconst TASK_OVERLAYS_PATH = path.join(ensureDataDir(), \"kanban-overlays.json\");\nconst LOCAL_TASKS_PATH = path.join(ensureDataDir(), \"local-kanban-tasks.json\");\n\nconst STATUS_LABELS = {\n planned: \"maestro:planned\",\n ongoing: \"maestro:ongoing\",\n review: \"maestro:review\",\n} as const;\n\nconst STATUS_LABEL_SET = new Set<string>(Object.values(STATUS_LABELS));\n\nconst STATUS_LABEL_META: Record<\n (typeof STATUS_LABELS)[keyof typeof STATUS_LABELS],\n { color: string; description: string }\n> = {\n [STATUS_LABELS.planned]: {\n color: \"c2e0c6\",\n description: \"Queued in Maestro for planned work.\",\n },\n [STATUS_LABELS.ongoing]: {\n color: \"d4c5f9\",\n description: \"Currently being worked on by Maestro.\",\n },\n [STATUS_LABELS.review]: {\n color: \"fbca04\",\n description: \"Waiting for review in Maestro.\",\n },\n};\n\ninterface GitHubIssue {\n number: number;\n title: string;\n body: string | null;\n state: \"open\" | \"closed\";\n labels: Array<{ name: string }>;\n created_at: string;\n updated_at: string;\n html_url: string;\n pull_request?: unknown;\n}\n\ninterface GitHubPullRequest {\n number: number;\n html_url: string;\n}\n\ninterface GitHubPullRequestListItem {\n number: number;\n url: string;\n}\n\ninterface PullRequestResolution {\n pullRequest: GitHubPullRequest | null;\n status: \"none\" | \"existing\" | \"created\";\n}\n\nconst MAX_TERMINAL_COMMENT_LINES = 80;\nconst MAX_TERMINAL_COMMENT_CHARS = 6000;\n\nfunction readOverlays(): Record<string, KanbanOverlayRecord> {\n return readJsonFile<Record<string, KanbanOverlayRecord>>(TASK_OVERLAYS_PATH, {});\n}\n\nfunction writeOverlays(overlays: Record<string, KanbanOverlayRecord>): void {\n writeJsonFile(TASK_OVERLAYS_PATH, overlays);\n}\n\nfunction readLocalTasks(): LocalKanbanTaskRecord[] {\n return readJsonFile<LocalKanbanTaskRecord[]>(LOCAL_TASKS_PATH, []);\n}\n\nfunction writeLocalTasks(tasks: LocalKanbanTaskRecord[]): void {\n writeJsonFile(LOCAL_TASKS_PATH, tasks);\n}\n\nfunction overlayKey(projectId: string, issueNumber: number): string {\n return `${projectId}#${issueNumber}`;\n}\n\nfunction buildGitHubTaskId(projectId: string, issueNumber: number): string {\n return `github:${projectId}:${issueNumber}`;\n}\n\nfunction parseGitHubTaskId(taskId: string): { projectId: string; issueNumber: number } | null {\n const [prefix, projectId, issue] = taskId.split(\":\");\n if (prefix !== \"github\" || !projectId || !issue) {\n return null;\n }\n\n const issueNumber = Number(issue);\n if (!Number.isFinite(issueNumber)) {\n return null;\n }\n\n return { projectId, issueNumber };\n}\n\nfunction getOverlay(\n projectId: string,\n issueNumber: number\n): KanbanOverlayRecord | undefined {\n return readOverlays()[overlayKey(projectId, issueNumber)];\n}\n\nfunction slugifyBranchPart(input: string): string {\n return (\n input\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 48) || \"task\"\n );\n}\n\nfunction runGit(projectPath: string, args: string[]): string {\n try {\n return execFileSync(\"git\", args, {\n cwd: projectPath,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n }).trim();\n } catch (error) {\n const stderr =\n error instanceof Error && \"stderr\" in error && typeof error.stderr === \"string\"\n ? error.stderr.trim()\n : \"\";\n throw new Error(stderr || `git ${args.join(\" \")} failed`);\n }\n}\n\nfunction getPreferredBaseRef(projectPath: string, defaultBranch: string): string {\n try {\n runGit(projectPath, [\"rev-parse\", \"--verify\", `origin/${defaultBranch}`]);\n return `origin/${defaultBranch}`;\n } catch {\n return defaultBranch;\n }\n}\n\nfunction countCommitsAhead(projectPath: string, baseRef: string): number {\n const raw = runGit(projectPath, [\"rev-list\", \"--count\", `${baseRef}..HEAD`]);\n const count = Number(raw);\n return Number.isFinite(count) ? count : 0;\n}\n\nfunction stripAnsiSequences(input: string): string {\n return input\n .replace(/\\u001b\\][^\\u0007]*(?:\\u0007|\\u001b\\\\)/g, \"\")\n .replace(/\\u001b\\[[0-9;?]*[ -/]*[@-~]/g, \"\")\n .replace(/\\r/g, \"\")\n .replace(/\\0/g, \"\");\n}\n\nexport function extractTerminalTailForComment(\n transcript: string,\n maxLines = MAX_TERMINAL_COMMENT_LINES,\n maxChars = MAX_TERMINAL_COMMENT_CHARS\n): string {\n const cleaned = stripAnsiSequences(transcript).trim();\n if (!cleaned) {\n return \"\";\n }\n\n const tailLines = cleaned.split(\"\\n\").slice(-maxLines);\n let tail = tailLines.join(\"\\n\").trim();\n if (tail.length > maxChars) {\n tail = tail.slice(-maxChars).trim();\n const newlineIndex = tail.indexOf(\"\\n\");\n if (newlineIndex !== -1 && newlineIndex < tail.length - 1) {\n tail = tail.slice(newlineIndex + 1).trim();\n }\n }\n\n return tail;\n}\n\nexport function buildKanbanIssueCompletionComment(input: {\n successful: boolean;\n completionSummary: string;\n pullRequest?: GitHubPullRequest | null;\n terminalTail?: string;\n}): string {\n const lines = [\n `Maestro ${input.successful ? \"finished\" : \"stopped\"} work on this task.`,\n \"\",\n `Status: ${input.completionSummary}`,\n ];\n\n if (input.pullRequest?.html_url) {\n lines.push(`Pull request: ${input.pullRequest.html_url}`);\n }\n\n const terminalTail = input.terminalTail?.trim();\n if (terminalTail) {\n lines.push(\"\", \"Last terminal output:\", \"\", \"```text\");\n lines.push(terminalTail.replace(/```/g, \"'''\"));\n lines.push(\"```\");\n }\n\n return lines.join(\"\\n\").trim();\n}\n\nfunction getColumnForIssue(issue: GitHubIssue): KanbanTaskRecord[\"column\"] {\n if (issue.state === \"closed\") {\n return \"done\";\n }\n\n const labels = new Set(issue.labels.map((label) => label.name));\n if (labels.has(STATUS_LABELS.review)) {\n return \"review\";\n }\n if (labels.has(STATUS_LABELS.ongoing)) {\n return \"ongoing\";\n }\n if (labels.has(STATUS_LABELS.planned)) {\n return \"planned\";\n }\n return \"backlog\";\n}\n\nfunction withTaskRelations(task: KanbanTaskRecord): KanbanTaskRecord {\n const project = task.projectId ? getProjectRecordById(task.projectId) : null;\n const terminals = findTerminalRecords(\n (terminal) =>\n terminal.kanbanTaskId === task.id || terminal.id === task.assignedTerminalId\n ).map((terminal) => ({\n id: terminal.id,\n name: terminal.name,\n status: terminal.status,\n }));\n\n return {\n ...task,\n project: project ? { id: project.id, name: project.name } : null,\n terminals,\n };\n}\n\nasync function githubRequest<T>(\n project: ProjectRecord,\n route: string,\n init?: {\n method?: \"GET\" | \"POST\" | \"PATCH\" | \"PUT\" | \"DELETE\";\n body?: Record<string, unknown>;\n }\n): Promise<T> {\n if (!project.githubOwner || !project.githubRepo) {\n throw new Error(\"Project is not linked to a GitHub repository\");\n }\n\n return runGitHubApi<T>(\n `repos/${project.githubOwner}/${project.githubRepo}${route}`,\n {\n method: init?.method,\n input: init?.body,\n }\n );\n}\n\nasync function listGitHubIssues(project: ProjectRecord): Promise<GitHubIssue[]> {\n const issues = await githubRequest<GitHubIssue[]>(\n project,\n \"/issues?state=all&per_page=100\"\n );\n return issues.filter((issue) => !issue.pull_request);\n}\n\nasync function getGitHubIssue(\n project: ProjectRecord,\n issueNumber: number\n): Promise<GitHubIssue> {\n return githubRequest<GitHubIssue>(project, `/issues/${issueNumber}`);\n}\n\nasync function patchGitHubIssue(\n project: ProjectRecord,\n issueNumber: number,\n body: Record<string, unknown>\n): Promise<GitHubIssue> {\n return githubRequest<GitHubIssue>(project, `/issues/${issueNumber}`, {\n method: \"PATCH\",\n body,\n });\n}\n\nasync function postGitHubIssueComment(\n project: ProjectRecord,\n issueNumber: number,\n body: string\n): Promise<void> {\n await githubRequest(project, `/issues/${issueNumber}/comments`, {\n method: \"POST\",\n body: { body },\n });\n}\n\nasync function ensureGitHubLabels(\n project: ProjectRecord,\n labelNames: string[]\n): Promise<void> {\n const needed = [...new Set(labelNames)].filter(Boolean);\n if (needed.length === 0) {\n return;\n }\n\n const labels = await githubRequest<Array<{ name: string }>>(\n project,\n \"/labels?per_page=100\"\n );\n const existing = new Set(labels.map((label) => label.name));\n\n for (const name of needed) {\n if (existing.has(name)) {\n continue;\n }\n\n const meta = STATUS_LABEL_META[name as keyof typeof STATUS_LABEL_META] ?? {\n color: \"ededed\",\n description: \"Managed by Maestro.\",\n };\n await githubRequest(project, \"/labels\", {\n method: \"POST\",\n body: {\n name,\n color: meta.color,\n description: meta.description,\n },\n });\n existing.add(name);\n }\n}\n\nfunction mapGitHubIssueToTask(\n project: ProjectRecord,\n issue: GitHubIssue,\n overlay: KanbanOverlayRecord | undefined\n): KanbanTaskRecord {\n const visibleLabels = issue.labels\n .map((label) => label.name)\n .filter((name) => !STATUS_LABEL_SET.has(name));\n const issueColumn = getColumnForIssue(issue);\n const column =\n issue.state === \"open\" && overlay?.pullRequestUrl\n ? \"review\"\n : overlay?.assignedTerminalId && issue.state === \"open\"\n ? overlay.progress === 100\n ? \"done\"\n : issueColumn\n : issueColumn;\n\n return withTaskRelations({\n id: buildGitHubTaskId(project.id, issue.number),\n title: issue.title,\n description: issue.body ?? \"\",\n column,\n projectId: project.id,\n projectPath: project.localPath,\n blockedBy: overlay?.blockedBy ?? [],\n priority: overlay?.priority ?? \"medium\",\n progress:\n issue.state === \"closed\" ? 100 : Math.max(0, Math.min(100, overlay?.progress ?? 0)),\n orderIndex: overlay?.orderIndex ?? issue.number,\n labels: visibleLabels,\n completionSummary: overlay?.completionSummary ?? null,\n assignedTerminalId: overlay?.assignedTerminalId ?? null,\n pullRequestNumber: overlay?.pullRequestNumber ?? null,\n pullRequestUrl: overlay?.pullRequestUrl ?? null,\n createdAt: issue.created_at,\n updatedAt: issue.updated_at,\n sourceType: \"github_issue\",\n sourceId: String(issue.number),\n });\n}\n\nfunction listLocalTasks(projectId?: string): KanbanTaskRecord[] {\n return readLocalTasks()\n .filter((task) => !projectId || task.projectId === projectId)\n .map((task) => withTaskRelations({ ...task, blockedBy: task.blockedBy ?? [], sourceType: \"local\", sourceId: task.id }));\n}\n\nasync function listGitHubTasks(projectId?: string): Promise<KanbanTaskRecord[]> {\n const overlays = readOverlays();\n const projects = listProjectRecords().filter(\n (project) =>\n (!projectId || project.id === projectId) &&\n Boolean(project.githubOwner && project.githubRepo)\n );\n\n const taskGroups = await Promise.all(\n projects.map(async (project) => {\n try {\n const issues = await listGitHubIssues(project);\n return issues.map((issue) =>\n mapGitHubIssueToTask(project, issue, overlays[overlayKey(project.id, issue.number)])\n );\n } catch (error) {\n updateProjectRecord(project.id, {\n lastSyncError: error instanceof Error ? error.message : \"GitHub sync failed\",\n });\n return [];\n }\n })\n );\n\n return taskGroups.flat();\n}\n\nexport async function listKanbanTasks(filters?: {\n projectId?: string;\n column?: string;\n}): Promise<KanbanTaskRecord[]> {\n const [githubTasks, localTasks] = await Promise.all([\n listGitHubTasks(filters?.projectId),\n Promise.resolve(listLocalTasks(filters?.projectId)),\n ]);\n\n return [...githubTasks, ...localTasks]\n .filter((task) => !filters?.column || task.column === filters.column)\n .sort((a, b) => a.orderIndex - b.orderIndex || a.createdAt.localeCompare(b.createdAt));\n}\n\nexport async function getKanbanTask(taskId: string): Promise<KanbanTaskRecord | null> {\n if (taskId.startsWith(\"local:\")) {\n const local = readLocalTasks().find((task) => `local:${task.id}` === taskId);\n return local ? withTaskRelations({ ...local, sourceType: \"local\", sourceId: local.id }) : null;\n }\n\n const parsed = parseGitHubTaskId(taskId);\n if (!parsed) {\n return null;\n }\n\n const project = getProjectRecordById(parsed.projectId);\n if (!project) {\n return null;\n }\n\n const issue = await getGitHubIssue(project, parsed.issueNumber);\n const overlays = readOverlays();\n return mapGitHubIssueToTask(project, issue, overlays[overlayKey(project.id, parsed.issueNumber)]);\n}\n\nexport async function probeGitHubMirror(projectId: string): Promise<{ syncedCount: number }> {\n const project = getProjectRecordById(projectId);\n if (!project) {\n throw new Error(\"Project not found\");\n }\n\n try {\n const issues = await listGitHubIssues(project);\n updateProjectRecord(project.id, {\n lastSyncedAt: nowIso(),\n lastSyncError: null,\n });\n return { syncedCount: issues.length };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"GitHub sync failed\";\n updateProjectRecord(project.id, {\n lastSyncError: message,\n });\n throw new Error(message);\n }\n}\n\nexport async function createKanbanTask(input: {\n title: string;\n description: string;\n projectId?: string;\n projectPath?: string;\n blockedBy?: string[];\n priority?: \"low\" | \"medium\" | \"high\";\n labels?: string[];\n}): Promise<KanbanTaskRecord> {\n const project =\n (input.projectId ? getProjectRecordById(input.projectId) : null) ||\n (input.projectPath ? findProjectRecordByPath(input.projectPath) : null);\n\n if (!project && !input.projectPath) {\n throw new Error(\"projectId or projectPath is required\");\n }\n\n if (project?.githubOwner && project.githubRepo) {\n const issue = await githubRequest<GitHubIssue>(project, \"/issues\", {\n method: \"POST\",\n body: {\n title: input.title,\n body: input.description,\n labels: input.labels ?? [],\n },\n });\n\n const overlays = readOverlays();\n overlays[overlayKey(project.id, issue.number)] = {\n blockedBy: input.blockedBy ?? [],\n priority: input.priority ?? \"medium\",\n progress: 0,\n assignedTerminalId: null,\n completionSummary: null,\n orderIndex: issue.number,\n };\n writeOverlays(overlays);\n\n return mapGitHubIssueToTask(project, issue, overlays[overlayKey(project.id, issue.number)]);\n }\n\n const timestamp = nowIso();\n const localTask: LocalKanbanTaskRecord = {\n id: randomUUID(),\n title: input.title,\n description: input.description,\n column: \"backlog\",\n projectId: project?.id ?? null,\n projectPath: project?.localPath ?? input.projectPath ?? \"\",\n blockedBy: input.blockedBy ?? [],\n priority: input.priority ?? \"medium\",\n progress: 0,\n orderIndex: Date.now(),\n labels: input.labels ?? [],\n completionSummary: null,\n assignedTerminalId: null,\n createdAt: timestamp,\n updatedAt: timestamp,\n };\n\n const tasks = readLocalTasks();\n tasks.push(localTask);\n writeLocalTasks(tasks);\n return withTaskRelations({ ...localTask, id: `local:${localTask.id}`, sourceType: \"local\", sourceId: localTask.id });\n}\n\nfunction setOverlay(\n projectId: string,\n issueNumber: number,\n patch: Partial<KanbanOverlayRecord>\n): KanbanOverlayRecord {\n const overlays = readOverlays();\n const key = overlayKey(projectId, issueNumber);\n const next = {\n ...overlays[key],\n ...patch,\n };\n overlays[key] = next;\n writeOverlays(overlays);\n return next;\n}\n\nfunction deleteOverlay(projectId: string, issueNumber: number): void {\n const overlays = readOverlays();\n const key = overlayKey(projectId, issueNumber);\n if (!(key in overlays)) {\n return;\n }\n\n delete overlays[key];\n writeOverlays(overlays);\n}\n\nexport function handleGitHubIssueWebhookEvent(\n projectId: string,\n action: string,\n issueNumber: number\n): { taskId: string } {\n updateProjectRecord(projectId, {\n lastSyncedAt: nowIso(),\n lastSyncError: null,\n });\n\n if (action === \"deleted\") {\n deleteOverlay(projectId, issueNumber);\n }\n\n return {\n taskId: buildGitHubTaskId(projectId, issueNumber),\n };\n}\n\nfunction extractLinkedIssueNumber(text: string | null | undefined): number | null {\n if (!text) {\n return null;\n }\n\n const match = text.match(/(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?)\\s+#(\\d+)/i);\n if (!match) {\n return null;\n }\n\n const issueNumber = Number(match[1]);\n return Number.isFinite(issueNumber) ? issueNumber : null;\n}\n\nexport function handleGitHubPullRequestWebhookEvent(\n projectId: string,\n action: string,\n pullRequest: {\n number: number;\n htmlUrl: string;\n body?: string | null;\n merged?: boolean;\n }\n): { taskId: string | null } {\n updateProjectRecord(projectId, {\n lastSyncedAt: nowIso(),\n lastSyncError: null,\n });\n\n const issueNumber = extractLinkedIssueNumber(pullRequest.body);\n if (!issueNumber) {\n return { taskId: null };\n }\n\n if (\n action === \"opened\" ||\n action === \"reopened\" ||\n action === \"synchronize\" ||\n action === \"ready_for_review\"\n ) {\n setOverlay(projectId, issueNumber, {\n pullRequestNumber: pullRequest.number,\n pullRequestUrl: pullRequest.htmlUrl,\n });\n } else if (action === \"closed\" && pullRequest.merged) {\n setOverlay(projectId, issueNumber, {\n pullRequestNumber: pullRequest.number,\n pullRequestUrl: pullRequest.htmlUrl,\n assignedTerminalId: null,\n progress: 100,\n completionSummary: `PR #${pullRequest.number} merged.`,\n });\n } else if (action === \"closed\" && !pullRequest.merged) {\n setOverlay(projectId, issueNumber, {\n pullRequestNumber: null,\n pullRequestUrl: null,\n });\n }\n\n return {\n taskId: buildGitHubTaskId(projectId, issueNumber),\n };\n}\n\nexport async function handleGitHubPullRequestReviewWebhookEvent(\n projectId: string,\n action: string,\n review: {\n state?: string | null;\n },\n pullRequest: {\n body?: string | null;\n }\n): Promise<{ taskId: string | null }> {\n updateProjectRecord(projectId, {\n lastSyncedAt: nowIso(),\n lastSyncError: null,\n });\n\n if (\n action !== \"submitted\" ||\n (review.state !== \"changes_requested\" && review.state !== \"commented\")\n ) {\n return { taskId: null };\n }\n\n const issueNumber = extractLinkedIssueNumber(pullRequest.body);\n if (!issueNumber) {\n return { taskId: null };\n }\n\n const taskId = buildGitHubTaskId(projectId, issueNumber);\n const task = await getKanbanTask(taskId);\n if (!task || task.column !== \"review\") {\n return { taskId: null };\n }\n\n await updateKanbanTaskRecord(taskId, {\n column: \"planned\",\n assignedTerminalId: null,\n completionSummary:\n review.state === \"changes_requested\"\n ? \"GitHub review requested changes. Task moved back to planned.\"\n : \"GitHub review feedback received. Task moved back to planned.\",\n });\n\n return { taskId };\n}\n\nexport async function handleGitHubPullRequestReviewCommentWebhookEvent(\n projectId: string,\n action: string,\n pullRequest: {\n body?: string | null;\n }\n): Promise<{ taskId: string | null }> {\n updateProjectRecord(projectId, {\n lastSyncedAt: nowIso(),\n lastSyncError: null,\n });\n\n if (action !== \"created\") {\n return { taskId: null };\n }\n\n const issueNumber = extractLinkedIssueNumber(pullRequest.body);\n if (!issueNumber) {\n return { taskId: null };\n }\n\n const taskId = buildGitHubTaskId(projectId, issueNumber);\n const task = await getKanbanTask(taskId);\n if (!task || task.column !== \"review\") {\n return { taskId: null };\n }\n\n await updateKanbanTaskRecord(taskId, {\n column: \"planned\",\n assignedTerminalId: null,\n completionSummary: \"GitHub review comment received. Task moved back to planned.\",\n });\n\n return { taskId };\n}\n\nasync function createOrUpdatePullRequestForTask(\n task: KanbanTaskRecord,\n project: ProjectRecord,\n issueNumber: number,\n gitPath: string\n): Promise<PullRequestResolution> {\n if (!project.githubOwner || !project.githubRepo) {\n return { pullRequest: null, status: \"none\" };\n }\n\n const existingOverlay = getOverlay(project.id, issueNumber);\n if (existingOverlay?.pullRequestNumber && existingOverlay.pullRequestUrl) {\n return {\n pullRequest: {\n number: existingOverlay.pullRequestNumber,\n html_url: existingOverlay.pullRequestUrl,\n },\n status: \"existing\",\n };\n }\n\n runGit(gitPath, [\"rev-parse\", \"--is-inside-work-tree\"]);\n\n const currentBranch = runGit(gitPath, [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n const defaultBranch = project.defaultBranch || \"main\";\n const baseRef = getPreferredBaseRef(gitPath, defaultBranch);\n const branchName =\n existingOverlay?.branchName ||\n (currentBranch !== \"HEAD\" && currentBranch !== defaultBranch\n ? currentBranch\n : `maestro/issue-${issueNumber}-${slugifyBranchPart(task.title)}`);\n if (currentBranch !== branchName) {\n const localBranch = runGit(gitPath, [\"branch\", \"--list\", branchName]);\n if (localBranch) {\n runGit(gitPath, [\"checkout\", branchName]);\n } else {\n runGit(gitPath, [\"checkout\", \"-b\", branchName]);\n }\n }\n\n setOverlay(project.id, issueNumber, {\n branchName,\n });\n\n const findPullRequest = (): GitHubPullRequest | null => {\n const raw = runGhCommand(\n [\n \"pr\",\n \"list\",\n \"--state\",\n \"open\",\n \"--head\",\n branchName,\n \"--json\",\n \"number,url\",\n \"--limit\",\n \"1\",\n ],\n { cwd: gitPath }\n );\n const pulls = JSON.parse(raw) as GitHubPullRequestListItem[];\n const pull = pulls[0];\n return pull\n ? {\n number: pull.number,\n html_url: pull.url,\n }\n : null;\n };\n\n let pullRequest = findPullRequest();\n if (pullRequest) {\n setOverlay(project.id, issueNumber, {\n branchName,\n pullRequestNumber: pullRequest.number,\n pullRequestUrl: pullRequest.html_url,\n });\n return { pullRequest, status: \"existing\" };\n }\n\n const hasUncommittedChanges = Boolean(runGit(gitPath, [\"status\", \"--porcelain\"]));\n if (hasUncommittedChanges) {\n runGit(gitPath, [\"add\", \"-A\"]);\n if (!runGit(gitPath, [\"diff\", \"--cached\", \"--name-only\"])) {\n return { pullRequest: null, status: \"none\" };\n }\n\n runGit(gitPath, [\"commit\", \"-m\", `Resolve #${issueNumber}: ${task.title}`]);\n }\n\n if (!hasUncommittedChanges) {\n if (branchName === defaultBranch || countCommitsAhead(gitPath, baseRef) === 0) {\n return { pullRequest: null, status: \"none\" };\n }\n }\n\n runGit(gitPath, [\"push\", \"-u\", \"origin\", branchName]);\n\n pullRequest = findPullRequest();\n let status: PullRequestResolution[\"status\"] = \"existing\";\n if (!pullRequest) {\n runGhCommand(\n [\n \"pr\",\n \"create\",\n \"--base\",\n project.defaultBranch || \"main\",\n \"--head\",\n branchName,\n \"--title\",\n `Resolve #${issueNumber}: ${task.title}`,\n \"--body\",\n `Fixes #${issueNumber}\\n\\nAutomated by Maestro.`,\n ],\n { cwd: gitPath }\n );\n pullRequest = findPullRequest();\n status = \"created\";\n }\n\n if (!pullRequest) {\n throw new Error(`Failed to create or locate PR for branch ${branchName}`);\n }\n\n setOverlay(project.id, issueNumber, {\n branchName,\n pullRequestNumber: pullRequest.number,\n pullRequestUrl: pullRequest.html_url,\n });\n\n return { pullRequest, status };\n}\n\nexport async function finalizeKanbanTaskAfterTerminalExit(\n terminalId: string,\n taskId: string,\n successful: boolean\n): Promise<{ taskId: string; column: KanbanTaskRecord[\"column\"] }> {\n const task = await getKanbanTask(taskId);\n if (!task) {\n throw new Error(\"Task not found\");\n }\n\n const terminalTail = extractTerminalTailForComment(readTerminalHistory(terminalId));\n\n if (!successful) {\n const resetTask = await updateKanbanTaskRecord(task.id, {\n column: \"planned\",\n assignedTerminalId: null,\n completionSummary: \"Terminal run failed. Task moved back to planned.\",\n });\n\n const parsedFailureTask = parseGitHubTaskId(task.id);\n if (parsedFailureTask) {\n const failureProject = getProjectRecordById(parsedFailureTask.projectId);\n if (failureProject) {\n try {\n await postGitHubIssueComment(\n failureProject,\n parsedFailureTask.issueNumber,\n buildKanbanIssueCompletionComment({\n successful: false,\n completionSummary: \"Terminal run failed. Task moved back to planned.\",\n terminalTail,\n })\n );\n } catch (error) {\n console.warn(\n `Failed to post kanban completion comment for issue ${parsedFailureTask.issueNumber}:`,\n error\n );\n }\n }\n }\n\n return { taskId: resetTask.id, column: resetTask.column };\n }\n\n if (task.sourceType === \"local\") {\n const completedTask = await updateKanbanTaskRecord(task.id, {\n column: \"done\",\n progress: 100,\n assignedTerminalId: terminalId,\n });\n return { taskId: completedTask.id, column: completedTask.column };\n }\n\n const parsed = parseGitHubTaskId(task.id);\n if (!parsed) {\n throw new Error(\"Task is not linked to a GitHub issue\");\n }\n\n const project = getProjectRecordById(parsed.projectId);\n if (!project) {\n throw new Error(\"Project not found\");\n }\n\n const terminal = getTerminalRecord(terminalId);\n const gitPath = terminal?.worktreePath || terminal?.projectPath || project.localPath;\n\n const pullRequestResult = await createOrUpdatePullRequestForTask(\n task,\n project,\n parsed.issueNumber,\n gitPath\n );\n const pullRequest = pullRequestResult.pullRequest;\n const completionSummary = pullRequest\n ? `PR #${pullRequest.number} ready for review.`\n : \"Completed without code changes.\";\n const nextTask = await updateKanbanTaskRecord(task.id, {\n column: pullRequest ? \"review\" : \"done\",\n progress: 100,\n assignedTerminalId: terminalId,\n completionSummary,\n });\n\n try {\n await postGitHubIssueComment(\n project,\n parsed.issueNumber,\n buildKanbanIssueCompletionComment({\n successful: true,\n completionSummary,\n pullRequest,\n terminalTail,\n })\n );\n } catch (error) {\n console.warn(\n `Failed to post kanban completion comment for issue ${parsed.issueNumber}:`,\n error\n );\n }\n\n return { taskId: nextTask.id, column: nextTask.column };\n}\n\nfunction updateLocalTask(\n taskId: string,\n patch: Partial<LocalKanbanTaskRecord>\n): LocalKanbanTaskRecord {\n const tasks = readLocalTasks();\n const index = tasks.findIndex((task) => task.id === taskId);\n if (index === -1) {\n throw new Error(\"Task not found\");\n }\n\n const next: LocalKanbanTaskRecord = {\n ...tasks[index],\n ...patch,\n updatedAt: nowIso(),\n };\n tasks[index] = next;\n writeLocalTasks(tasks);\n return next;\n}\n\nexport async function updateKanbanTaskRecord(\n taskId: string,\n patch: {\n title?: string;\n description?: string;\n column?: \"backlog\" | \"planned\" | \"ongoing\" | \"review\" | \"done\";\n priority?: \"low\" | \"medium\" | \"high\";\n progress?: number;\n labels?: string[];\n blockedBy?: string[];\n completionSummary?: string;\n assignedTerminalId?: string | null;\n }\n): Promise<KanbanTaskRecord> {\n if (taskId.startsWith(\"local:\")) {\n const task = updateLocalTask(taskId.replace(/^local:/, \"\"), {\n ...(patch.title !== undefined ? { title: patch.title } : {}),\n ...(patch.description !== undefined ? { description: patch.description } : {}),\n ...(patch.column !== undefined ? { column: patch.column } : {}),\n ...(patch.priority !== undefined ? { priority: patch.priority } : {}),\n ...(patch.progress !== undefined ? { progress: patch.progress } : {}),\n ...(patch.labels !== undefined ? { labels: patch.labels } : {}),\n ...(patch.blockedBy !== undefined ? { blockedBy: patch.blockedBy } : {}),\n ...(patch.completionSummary !== undefined\n ? { completionSummary: patch.completionSummary }\n : {}),\n ...(patch.assignedTerminalId !== undefined\n ? { assignedTerminalId: patch.assignedTerminalId }\n : {}),\n });\n return withTaskRelations({\n ...task,\n id: `local:${task.id}`,\n blockedBy: task.blockedBy ?? [],\n sourceType: \"local\",\n sourceId: task.id,\n pullRequestNumber: task.pullRequestNumber ?? null,\n pullRequestUrl: task.pullRequestUrl ?? null,\n });\n }\n\n const parsed = parseGitHubTaskId(taskId);\n if (!parsed) {\n throw new Error(\"Task not found\");\n }\n\n const project = getProjectRecordById(parsed.projectId);\n if (!project) {\n throw new Error(\"Project not found\");\n }\n\n const current = await getGitHubIssue(project, parsed.issueNumber);\n const existingLabels = current.labels\n .map((label) => label.name)\n .filter((name) => !STATUS_LABEL_SET.has(name));\n\n const nextColumn = patch.column ?? getColumnForIssue(current);\n const nextLabels = patch.labels ?? existingLabels;\n const statusLabels =\n nextColumn === \"planned\"\n ? [STATUS_LABELS.planned]\n : nextColumn === \"ongoing\"\n ? [STATUS_LABELS.ongoing]\n : nextColumn === \"review\"\n ? [STATUS_LABELS.review]\n : [];\n\n await ensureGitHubLabels(project, statusLabels);\n\n const issue = await patchGitHubIssue(project, parsed.issueNumber, {\n ...(patch.title !== undefined ? { title: patch.title } : {}),\n ...(patch.description !== undefined ? { body: patch.description } : {}),\n labels: [...nextLabels, ...statusLabels],\n state: nextColumn === \"done\" ? \"closed\" : \"open\",\n });\n\n const overlay = setOverlay(project.id, parsed.issueNumber, {\n ...(patch.priority !== undefined ? { priority: patch.priority } : {}),\n ...(patch.progress !== undefined ? { progress: patch.progress } : {}),\n ...(patch.blockedBy !== undefined ? { blockedBy: patch.blockedBy } : {}),\n ...(patch.completionSummary !== undefined\n ? { completionSummary: patch.completionSummary }\n : {}),\n ...(patch.assignedTerminalId !== undefined\n ? { assignedTerminalId: patch.assignedTerminalId }\n : {}),\n });\n\n return mapGitHubIssueToTask(project, issue, overlay);\n}\n\nexport async function moveKanbanTaskRecord(\n taskId: string,\n column: \"backlog\" | \"planned\" | \"ongoing\" | \"review\" | \"done\"\n): Promise<KanbanTaskRecord> {\n return updateKanbanTaskRecord(taskId, {\n column,\n ...(column === \"done\" ? { progress: 100 } : {}),\n ...(column === \"backlog\" || column === \"planned\"\n ? { assignedTerminalId: null }\n : {}),\n });\n}\n\nexport async function deleteKanbanTaskRecord(taskId: string): Promise<void> {\n if (taskId.startsWith(\"local:\")) {\n writeLocalTasks(\n readLocalTasks().filter((task) => `local:${task.id}` !== taskId)\n );\n return;\n }\n\n const parsed = parseGitHubTaskId(taskId);\n if (!parsed) {\n throw new Error(\"Task not found\");\n }\n\n const project = getProjectRecordById(parsed.projectId);\n if (!project) {\n throw new Error(\"Project not found\");\n }\n\n await patchGitHubIssue(project, parsed.issueNumber, {\n state: \"closed\",\n });\n}\n\nexport function deleteKanbanStateForProject(\n projectId: string,\n projectPath?: string\n): void {\n const overlays = readOverlays();\n const nextOverlays = Object.fromEntries(\n Object.entries(overlays).filter(([key]) => !key.startsWith(`${projectId}#`))\n );\n writeOverlays(nextOverlays);\n writeLocalTasks(\n readLocalTasks().filter(\n (task) => task.projectId !== projectId && (!projectPath || task.projectPath !== projectPath)\n )\n );\n}\n", "import { execFileSync } from \"node:child_process\";\nimport {\n findProjectRecordByPath,\n getProjectRecordById,\n updateProjectRecord,\n} from \"../state/projects.js\";\nimport type { ProjectRecord } from \"../state/types.js\";\n\nexport interface RepoSyncDecisionInput {\n currentBranch: string;\n upstreamRef: string | null;\n isDirty: boolean;\n localHead: string | null;\n upstreamHead: string | null;\n mergeBase: string | null;\n}\n\nexport interface RepoSyncDecision {\n action: \"skip\" | \"noop\" | \"fast-forward\";\n reason: string;\n}\n\nexport interface AutoWorktreeStartPointInput {\n currentBranch: string;\n upstreamRef: string | null;\n preferredBranch: string | null;\n preferredBranchExists: boolean;\n}\n\nexport interface AutoWorktreeStartPoint {\n ref: string;\n usedRemote: boolean;\n reason: string;\n}\n\nfunction readCommandError(error: unknown, fallback: string): string {\n if (error instanceof Error && \"stderr\" in error && typeof error.stderr === \"string\") {\n const stderr = error.stderr.trim();\n if (stderr) {\n return stderr;\n }\n }\n\n return error instanceof Error && error.message ? error.message : fallback;\n}\n\nfunction runGit(path: string, args: string[]): string {\n return execFileSync(\"git\", args, {\n cwd: path,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n }).trim();\n}\n\nfunction tryRunGit(path: string, args: string[]): { ok: true; output: string } | {\n ok: false;\n error: string;\n} {\n try {\n return { ok: true, output: runGit(path, args) };\n } catch (error) {\n return {\n ok: false,\n error: readCommandError(error, `git ${args.join(\" \")} failed`),\n };\n }\n}\n\nfunction resolveProjectRecord(input: {\n projectId?: string | null;\n projectPath: string;\n}): ProjectRecord | null {\n if (input.projectId) {\n return getProjectRecordById(input.projectId);\n }\n\n return findProjectRecordByPath(input.projectPath);\n}\n\nfunction shouldPersistSyncStatus(project: ProjectRecord | null): boolean {\n return Boolean(project && (project.repoUrl || (project.githubOwner && project.githubRepo)));\n}\n\nfunction persistSyncSuccess(project: ProjectRecord | null) {\n if (!project || !shouldPersistSyncStatus(project)) {\n return;\n }\n\n updateProjectRecord(project.id, {\n lastSyncedAt: new Date().toISOString(),\n lastSyncError: null,\n });\n}\n\nfunction persistSyncError(project: ProjectRecord | null, message: string) {\n if (!project || !shouldPersistSyncStatus(project)) {\n return;\n }\n\n updateProjectRecord(project.id, {\n lastSyncError: message,\n });\n}\n\nexport function decideRepoSyncAction(input: RepoSyncDecisionInput): RepoSyncDecision {\n if (input.currentBranch === \"HEAD\") {\n return {\n action: \"skip\",\n reason: \"Skipped pre-spawn sync because the repository is in detached HEAD state.\",\n };\n }\n\n if (!input.upstreamRef) {\n return {\n action: \"skip\",\n reason: \"Skipped pre-spawn sync because the current branch has no upstream branch.\",\n };\n }\n\n if (input.isDirty) {\n return {\n action: \"skip\",\n reason: \"Skipped pre-spawn sync because the repository has uncommitted changes.\",\n };\n }\n\n if (!input.localHead || !input.upstreamHead || !input.mergeBase) {\n return {\n action: \"skip\",\n reason: \"Skipped pre-spawn sync because the repository state could not be resolved.\",\n };\n }\n\n if (input.localHead === input.upstreamHead) {\n return {\n action: \"noop\",\n reason: \"Repository is already up to date with its upstream branch.\",\n };\n }\n\n if (input.mergeBase === input.localHead) {\n return {\n action: \"fast-forward\",\n reason: `Fast-forwarded ${input.currentBranch} to ${input.upstreamRef}.`,\n };\n }\n\n if (input.mergeBase === input.upstreamHead) {\n return {\n action: \"noop\",\n reason: \"Repository is ahead of its upstream branch; no fast-forward was needed.\",\n };\n }\n\n return {\n action: \"skip\",\n reason: \"Skipped pre-spawn sync because the local branch has diverged from upstream.\",\n };\n}\n\nexport function decideAutoWorktreeStartPoint(\n input: AutoWorktreeStartPointInput\n): AutoWorktreeStartPoint {\n const preferredBranch = input.preferredBranch?.trim() || null;\n if (preferredBranch && input.preferredBranchExists) {\n return {\n ref: `origin/${preferredBranch}`,\n usedRemote: true,\n reason: `Using latest origin/${preferredBranch} in a fresh worktree.`,\n };\n }\n\n if (input.upstreamRef) {\n return {\n ref: input.upstreamRef,\n usedRemote: true,\n reason: `Using latest ${input.upstreamRef} in a fresh worktree.`,\n };\n }\n\n if (input.currentBranch !== \"HEAD\") {\n return {\n ref: input.currentBranch,\n usedRemote: false,\n reason: `Using local ${input.currentBranch} in a fresh worktree because no remote tracking branch was available.`,\n };\n }\n\n return {\n ref: \"HEAD\",\n usedRemote: false,\n reason: \"Using local HEAD in a fresh worktree because no remote tracking branch was available.\",\n };\n}\n\nfunction resolveUpstreamRef(path: string, currentBranch: string): string | null {\n const upstream = tryRunGit(path, [\"rev-parse\", \"--abbrev-ref\", \"@{upstream}\"]);\n if (upstream.ok && upstream.output) {\n return upstream.output;\n }\n\n const originBranch = `refs/remotes/origin/${currentBranch}`;\n const remoteBranch = tryRunGit(path, [\"show-ref\", \"--verify\", \"--quiet\", originBranch]);\n if (remoteBranch.ok) {\n return `origin/${currentBranch}`;\n }\n\n return null;\n}\n\nfunction hasGitRef(path: string, ref: string): boolean {\n return tryRunGit(path, [\"show-ref\", \"--verify\", \"--quiet\", ref]).ok;\n}\n\nexport async function resolveAutoWorktreeStartPoint(input: {\n projectId?: string | null;\n projectPath: string;\n preferredBranch?: string | null;\n}): Promise<AutoWorktreeStartPoint> {\n const project = resolveProjectRecord(input);\n const insideWorkTree = tryRunGit(input.projectPath, [\"rev-parse\", \"--is-inside-work-tree\"]);\n if (!insideWorkTree.ok) {\n const reason = \"Auto-worktree requires the project path to be a git repository.\";\n persistSyncError(project, reason);\n throw new Error(reason);\n }\n\n const currentBranch = tryRunGit(input.projectPath, [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n if (!currentBranch.ok) {\n const reason = `Pre-spawn sync failed while resolving the current branch: ${currentBranch.error}`;\n persistSyncError(project, reason);\n throw new Error(reason);\n }\n\n const origin = tryRunGit(input.projectPath, [\"remote\", \"get-url\", \"origin\"]);\n if (origin.ok && origin.output) {\n const fetch = tryRunGit(input.projectPath, [\"fetch\", \"--prune\", \"origin\"]);\n if (!fetch.ok) {\n const reason = `Pre-spawn sync failed during fetch: ${fetch.error}`;\n persistSyncError(project, reason);\n throw new Error(reason);\n }\n }\n\n const preferredBranch = input.preferredBranch?.trim() || project?.defaultBranch?.trim() || null;\n const preferredBranchExists = Boolean(\n preferredBranch && hasGitRef(input.projectPath, `refs/remotes/origin/${preferredBranch}`)\n );\n const upstreamRef = resolveUpstreamRef(input.projectPath, currentBranch.output);\n const decision = decideAutoWorktreeStartPoint({\n currentBranch: currentBranch.output,\n upstreamRef,\n preferredBranch,\n preferredBranchExists,\n });\n\n if (decision.usedRemote) {\n persistSyncSuccess(project);\n } else {\n persistSyncError(project, decision.reason);\n }\n\n return decision;\n}\n\nexport async function syncProjectRepoBeforeSpawn(input: {\n projectId?: string | null;\n projectPath: string;\n}): Promise<RepoSyncDecision> {\n const project = resolveProjectRecord(input);\n const insideWorkTree = tryRunGit(input.projectPath, [\"rev-parse\", \"--is-inside-work-tree\"]);\n if (!insideWorkTree.ok) {\n const reason = \"Skipped pre-spawn sync because the project path is not a git repository.\";\n persistSyncError(project, reason);\n return { action: \"skip\", reason };\n }\n\n const origin = tryRunGit(input.projectPath, [\"remote\", \"get-url\", \"origin\"]);\n if (!origin.ok || !origin.output) {\n const reason = \"Skipped pre-spawn sync because the repository has no origin remote.\";\n persistSyncError(project, reason);\n return { action: \"skip\", reason };\n }\n\n const fetch = tryRunGit(input.projectPath, [\"fetch\", \"--prune\", \"origin\"]);\n if (!fetch.ok) {\n const reason = `Pre-spawn sync failed during fetch: ${fetch.error}`;\n persistSyncError(project, reason);\n return { action: \"skip\", reason };\n }\n\n const currentBranch = tryRunGit(input.projectPath, [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n if (!currentBranch.ok) {\n const reason = `Pre-spawn sync failed while resolving the current branch: ${currentBranch.error}`;\n persistSyncError(project, reason);\n return { action: \"skip\", reason };\n }\n\n const upstreamRef = resolveUpstreamRef(input.projectPath, currentBranch.output);\n const isDirty = Boolean(runGit(input.projectPath, [\"status\", \"--porcelain\"]));\n const localHead = tryRunGit(input.projectPath, [\"rev-parse\", \"HEAD\"]);\n const upstreamHead = upstreamRef\n ? tryRunGit(input.projectPath, [\"rev-parse\", upstreamRef])\n : null;\n const mergeBase =\n upstreamRef && localHead.ok && upstreamHead?.ok\n ? tryRunGit(input.projectPath, [\"merge-base\", \"HEAD\", upstreamRef])\n : null;\n\n const decision = decideRepoSyncAction({\n currentBranch: currentBranch.output,\n upstreamRef,\n isDirty,\n localHead: localHead.ok ? localHead.output : null,\n upstreamHead: upstreamHead?.ok ? upstreamHead.output : null,\n mergeBase: mergeBase?.ok ? mergeBase.output : null,\n });\n\n if (decision.action === \"fast-forward\") {\n const fastForward = tryRunGit(input.projectPath, [\"merge\", \"--ff-only\", upstreamRef!]);\n if (!fastForward.ok) {\n const reason = `Pre-spawn sync failed during fast-forward: ${fastForward.error}`;\n persistSyncError(project, reason);\n return { action: \"skip\", reason };\n }\n }\n\n if (decision.action === \"skip\") {\n persistSyncError(project, decision.reason);\n } else {\n persistSyncSuccess(project);\n }\n\n return decision;\n}\n", "import * as fs from \"fs\";\nimport type { Server as SocketServer } from \"socket.io\";\nimport type { AgentStatus, AgentProvider, SandboxProvider } from \"@maestro/wire\";\nimport {\n spawnPty,\n writeToPty,\n writeCommandToPty,\n killPty,\n resizePty,\n} from \"./pty-manager.js\";\nimport { getProvider } from \"./providers.js\";\nimport {\n buildTerminalSnapshotOutput,\n buildTerminalAttachResponse,\n type TerminalAttachResponse,\n} from \"./terminal-attach.js\";\nimport {\n appendRecentTerminalInputs,\n applyTerminalInputChunk,\n} from \"./terminal-input-history.js\";\nimport { createTerminalReplica, type TerminalReplica } from \"./terminal-replica.js\";\nimport {\n createTerminalWorktree,\n isGitRepo,\n removeTerminalWorktree,\n} from \"./worktree.js\";\nimport {\n ensureTerminalIsolationHome,\n removeTerminalIsolationState,\n} from \"./terminal-isolation.js\";\nimport {\n cleanupTerminalDockerRuntime,\n ensureTerminalDockerRuntime,\n} from \"./dind.js\";\nimport { assertAutoSpawnProviderReady } from \"./auto-spawn-provider.js\";\nimport {\n appendTerminalHistoryBatch,\n readTerminalHistory,\n readTerminalSnapshot,\n createTerminalRecord,\n deleteTerminalRecord,\n deleteTerminalState,\n getTerminalRecord,\n listTerminalRecords,\n updateTerminalRecord,\n writeTerminalSnapshot,\n} from \"../state/terminals.js\";\nimport { finalizeKanbanTaskAfterTerminalExit } from \"../state/kanban.js\";\nimport { getProjectRecordById } from \"../state/projects.js\";\nimport { getGitHubChildEnvVars } from \"../integrations/github.js\";\nimport {\n resolveAutoWorktreeStartPoint,\n syncProjectRepoBeforeSpawn,\n} from \"../projects/repo-sync.js\";\nimport { getSettings } from \"../state/settings.js\";\nimport type { TerminalRecord } from \"../state/types.js\";\n\nexport interface TerminalRuntime {\n ptyId: string | null;\n replica: TerminalReplica;\n outputBuffer: Array<{ seq: number; data: string } | undefined>;\n outputBufferHead: number;\n outputBufferSize: number;\n nextOutputSeq: number;\n lastStartedAt: number | null;\n intentionalStop: boolean;\n deleting: boolean;\n deleted: boolean;\n restartTimer: ReturnType<typeof setTimeout> | null;\n pendingHistory: string[];\n historyFlushTimer: ReturnType<typeof setTimeout> | null;\n historyWritePromise: Promise<void>;\n snapshotPersistTimer: ReturnType<typeof setTimeout> | null;\n snapshotWritePromise: Promise<void>;\n exitPromise: Promise<void>;\n resolveExit: (() => void) | null;\n pendingInputLine: string;\n}\n\nexport interface StartTerminalOptions {\n mcpConfigPath?: string;\n /** Override the sandbox provider for this start */\n sandboxProvider?: SandboxProvider;\n syncRepo?: boolean;\n}\n\nconst agentRuntimes = new Map<string, TerminalRuntime>();\nconst MAX_OUTPUT_LINES = 10000;\nconst RESTORE_CONCURRENCY = 2;\nconst HISTORY_FLUSH_DELAY_MS = 64;\nconst SNAPSHOT_PERSIST_DELAY_MS = 400;\n\nexport interface TerminalManagerDeps {\n io: SocketServer;\n}\n\nlet deps: TerminalManagerDeps;\n\nexport function initTerminalManager(d: TerminalManagerDeps) {\n deps = d;\n}\n\nfunction normalizeTerminalName(name?: string): string | null {\n const trimmed = name?.trim();\n if (!trimmed) {\n return null;\n }\n\n const legacyGeneratedName = /^terminal ([0-9a-f]{6})$/i.exec(trimmed);\n if (legacyGeneratedName) {\n return legacyGeneratedName[1].toLowerCase();\n }\n\n return trimmed;\n}\n\nexport function prepareShellCommand(\n command: string,\n kind: TerminalRecord[\"kind\"]\n): string {\n const trimmed = command.trim();\n if (!trimmed) {\n return trimmed;\n }\n\n if (kind === \"kanban\" || kind === \"automation\" || kind === \"scheduler\") {\n return `${trimmed}; exit $?`;\n }\n\n return trimmed;\n}\n\nexport function shouldDeleteTerminalDuringRestore(terminal: TerminalRecord): boolean {\n return Boolean(\n terminal.autoWorktree && terminal.worktreePath && !fs.existsSync(terminal.worktreePath)\n );\n}\n\nfunction createExitWaiter(): {\n promise: Promise<void>;\n resolve: () => void;\n} {\n let resolve: () => void = () => undefined;\n const promise = new Promise<void>((innerResolve) => {\n resolve = innerResolve;\n });\n return { promise, resolve };\n}\n\nfunction getRuntime(terminalId: string): TerminalRuntime {\n let rt = agentRuntimes.get(terminalId);\n if (!rt) {\n const persistedSnapshot = readTerminalSnapshot(terminalId);\n rt = {\n ptyId: null,\n replica: createTerminalReplica({\n cols: persistedSnapshot?.cols,\n rows: persistedSnapshot?.rows,\n scrollback: MAX_OUTPUT_LINES,\n snapshot: persistedSnapshot\n ? {\n data: persistedSnapshot.data,\n cols: persistedSnapshot.cols ?? 120,\n rows: persistedSnapshot.rows ?? 30,\n }\n : null,\n }),\n outputBuffer: new Array(MAX_OUTPUT_LINES),\n outputBufferHead: 0,\n outputBufferSize: 0,\n nextOutputSeq: persistedSnapshot ? persistedSnapshot.cursor + 1 : 1,\n lastStartedAt: null,\n intentionalStop: false,\n deleting: false,\n deleted: false,\n restartTimer: null,\n pendingHistory: [],\n historyFlushTimer: null,\n historyWritePromise: Promise.resolve(),\n snapshotPersistTimer: null,\n snapshotWritePromise: Promise.resolve(),\n exitPromise: Promise.resolve(),\n resolveExit: null,\n pendingInputLine: \"\",\n };\n agentRuntimes.set(terminalId, rt);\n }\n return rt;\n}\n\nfunction terminalCanUseRuntime(terminalId: string, rt: TerminalRuntime): boolean {\n return !rt.deleting && !rt.deleted && getTerminalRecord(terminalId) != null;\n}\n\nfunction resetOutputBuffer(rt: TerminalRuntime) {\n rt.outputBufferHead = 0;\n rt.outputBufferSize = 0;\n rt.outputBuffer.fill(undefined);\n}\n\nfunction appendOutputChunk(\n rt: TerminalRuntime,\n chunk: { seq: number; data: string }\n) {\n if (rt.outputBufferSize < MAX_OUTPUT_LINES) {\n const index = (rt.outputBufferHead + rt.outputBufferSize) % MAX_OUTPUT_LINES;\n rt.outputBuffer[index] = chunk;\n rt.outputBufferSize += 1;\n return;\n }\n\n rt.outputBuffer[rt.outputBufferHead] = chunk;\n rt.outputBufferHead = (rt.outputBufferHead + 1) % MAX_OUTPUT_LINES;\n}\n\nfunction getOutputBufferChunks(\n rt: TerminalRuntime\n): Array<{ seq: number; data: string }> {\n const chunks: Array<{ seq: number; data: string }> = [];\n for (let index = 0; index < rt.outputBufferSize; index += 1) {\n const chunk = rt.outputBuffer[(rt.outputBufferHead + index) % MAX_OUTPUT_LINES];\n if (chunk) {\n chunks.push(chunk);\n }\n }\n return chunks;\n}\n\nfunction clearRuntimeTimers(rt: TerminalRuntime) {\n if (rt.restartTimer) {\n clearTimeout(rt.restartTimer);\n rt.restartTimer = null;\n }\n if (rt.historyFlushTimer) {\n clearTimeout(rt.historyFlushTimer);\n rt.historyFlushTimer = null;\n }\n if (rt.snapshotPersistTimer) {\n clearTimeout(rt.snapshotPersistTimer);\n rt.snapshotPersistTimer = null;\n }\n}\n\nfunction prepareExitWaiter(rt: TerminalRuntime) {\n const waiter = createExitWaiter();\n rt.exitPromise = waiter.promise;\n rt.resolveExit = waiter.resolve;\n}\n\nfunction resolveExitWaiter(rt: TerminalRuntime) {\n const resolve = rt.resolveExit;\n rt.resolveExit = null;\n resolve?.();\n}\n\nfunction scheduleHistoryFlush(terminalId: string, rt: TerminalRuntime) {\n if (rt.historyFlushTimer || !terminalCanUseRuntime(terminalId, rt)) {\n return;\n }\n\n rt.historyFlushTimer = setTimeout(() => {\n rt.historyFlushTimer = null;\n void flushBufferedHistory(terminalId, rt);\n }, HISTORY_FLUSH_DELAY_MS);\n}\n\nasync function flushBufferedHistory(terminalId: string, rt: TerminalRuntime) {\n if (rt.pendingHistory.length === 0 || !terminalCanUseRuntime(terminalId, rt)) {\n rt.pendingHistory = [];\n return;\n }\n\n const batch = rt.pendingHistory.join(\"\");\n rt.pendingHistory = [];\n rt.historyWritePromise = rt.historyWritePromise\n .catch(() => undefined)\n .then(() => appendTerminalHistoryBatch(terminalId, batch))\n .catch((error) => {\n console.error(`Failed to append history for terminal ${terminalId}:`, error);\n });\n\n await rt.historyWritePromise;\n}\n\nfunction scheduleSnapshotPersist(terminalId: string, rt: TerminalRuntime) {\n if (rt.snapshotPersistTimer || !terminalCanUseRuntime(terminalId, rt)) {\n return;\n }\n\n rt.snapshotPersistTimer = setTimeout(() => {\n rt.snapshotPersistTimer = null;\n void persistRuntimeSnapshot(terminalId, rt);\n }, SNAPSHOT_PERSIST_DELAY_MS);\n}\n\nasync function persistRuntimeSnapshot(terminalId: string, rt: TerminalRuntime) {\n if (!terminalCanUseRuntime(terminalId, rt)) {\n return;\n }\n\n rt.snapshotWritePromise = rt.snapshotWritePromise\n .catch(() => undefined)\n .then(async () => {\n if (!terminalCanUseRuntime(terminalId, rt)) {\n return;\n }\n const snapshot = await rt.replica.snapshot();\n if (!terminalCanUseRuntime(terminalId, rt)) {\n return;\n }\n writeTerminalSnapshot(terminalId, snapshot);\n })\n .catch((error) => {\n console.error(`Failed to persist snapshot for terminal ${terminalId}:`, error);\n });\n\n await rt.snapshotWritePromise;\n}\n\nasync function flushRuntimePersistence(terminalId: string, rt: TerminalRuntime) {\n clearRuntimeTimers(rt);\n\n await flushBufferedHistory(terminalId, rt);\n await persistRuntimeSnapshot(terminalId, rt);\n}\n\nasync function waitForRuntimeWritesToSettle(rt: TerminalRuntime) {\n await Promise.all([\n rt.historyWritePromise.catch(() => undefined),\n rt.snapshotWritePromise.catch(() => undefined),\n ]);\n}\n\ntype TerminalWithProject = TerminalRecord & {\n project: { id: string; name: string } | null;\n};\n\nfunction getRecentInputs(terminal: TerminalRecord): string[] {\n const recentInputs = (terminal as { recentInputs?: unknown }).recentInputs;\n if (!Array.isArray(recentInputs)) {\n return [];\n }\n\n return recentInputs.filter((input): input is string => typeof input === \"string\").slice(-10);\n}\n\nfunction emitTerminalStatus(\n terminalId: string,\n status: AgentStatus,\n error: string | null\n) {\n const terminal = getTerminalRecord(terminalId);\n deps.io.emit(\"terminal:status\", {\n terminalId,\n status,\n error,\n recentInputs: terminal ? getRecentInputs(terminal) : [],\n });\n}\n\nfunction hydrateTerminal(terminal: TerminalRecord | null): TerminalWithProject | null {\n if (!terminal) {\n return null;\n }\n\n const project = terminal.projectId ? getProjectRecordById(terminal.projectId) : null;\n return {\n ...terminal,\n recentInputs: getRecentInputs(terminal),\n project: project ? { id: project.id, name: project.name } : null,\n };\n}\n\nexport async function createTerminal(options: {\n name?: string;\n kind?: TerminalRecord[\"kind\"];\n provider?: AgentProvider;\n projectId?: string;\n projectPath: string;\n worktreePath?: string | null;\n autoWorktree?: boolean;\n customDisplayName?: string;\n customCommandTemplate?: string;\n customEnv?: Record<string, string>;\n sandboxProvider?: SandboxProvider | null;\n secondaryProjectPaths?: string[];\n skills?: string[];\n skipPermissions?: boolean;\n disableSandbox?: boolean;\n}) {\n const agent = createTerminalRecord({\n name: normalizeTerminalName(options.name),\n kind: options.kind ?? \"terminal\",\n provider: options.provider ?? \"claude\",\n projectId: options.projectId ?? null,\n projectPath: options.projectPath,\n worktreePath: options.worktreePath ?? null,\n autoWorktree: options.autoWorktree ?? false,\n customDisplayName: options.customDisplayName ?? null,\n customCommandTemplate: options.customCommandTemplate ?? null,\n customEnv: options.customEnv ?? null,\n sandboxProvider: options.sandboxProvider ?? null,\n secondaryProjectPaths: options.secondaryProjectPaths ?? [],\n skills: options.skills ?? [],\n status: \"idle\",\n currentTask: null,\n error: null,\n recentInputs: [],\n lastActivity: null,\n skipPermissions: options.skipPermissions ?? false,\n disableSandbox: options.disableSandbox ?? false,\n kanbanTaskId: null,\n });\n\n emitTerminalStatus(agent.id, agent.status, null);\n\n return agent;\n}\n\nexport async function createAutoSpawnTerminal(options: {\n name?: string;\n kind?: TerminalRecord[\"kind\"];\n projectId?: string;\n projectPath: string;\n}) {\n const settings = getSettings();\n const provider = assertAutoSpawnProviderReady();\n return createTerminal({\n name: options.name,\n kind: options.kind ?? \"kanban\",\n provider,\n projectId: options.projectId,\n projectPath: options.projectPath,\n skipPermissions: settings.agentDefaultSkipPermissions,\n disableSandbox: settings.agentDefaultDisableSandbox,\n autoWorktree: settings.agentDefaultWorktreeMode === \"new\",\n });\n}\n\nexport async function startTerminal(\n terminalId: string,\n prompt: string,\n options?: StartTerminalOptions\n) {\n const agent = getTerminalRecord(terminalId);\n if (!agent) throw new Error(`Agent ${terminalId} not found`);\n const rt = getRuntime(terminalId);\n if (rt.ptyId) {\n throw new Error(`Agent ${terminalId} is already running`);\n }\n\n let cwd = agent.worktreePath || agent.projectPath;\n if (agent.autoWorktree && !agent.worktreePath) {\n if (!isGitRepo(agent.projectPath)) {\n throw new Error(\"Auto-worktree requires the project to be a git repository\");\n }\n\n const project = agent.projectId ? getProjectRecordById(agent.projectId) : null;\n const startPoint =\n options?.syncRepo === false\n ? \"HEAD\"\n : (\n await resolveAutoWorktreeStartPoint({\n projectId: agent.projectId,\n projectPath: agent.projectPath,\n preferredBranch: project?.defaultBranch ?? null,\n })\n ).ref;\n const worktreePath = createTerminalWorktree(agent.projectPath, terminalId, startPoint);\n updateTerminalRecord(terminalId, {\n worktreePath,\n lastActivity: new Date().toISOString(),\n });\n cwd = worktreePath;\n } else if (options?.syncRepo !== false) {\n await syncProjectRepoBeforeSpawn({\n projectId: agent.projectId,\n projectPath: cwd,\n });\n }\n\n if (!fs.existsSync(cwd)) {\n throw new Error(`Agent working directory does not exist: ${cwd}`);\n }\n\n const provider = getProvider(agent.provider as AgentProvider, {\n displayName: agent.customDisplayName,\n commandTemplate: agent.customCommandTemplate,\n env: agent.customEnv,\n });\n const binaryPath = provider.resolveBinaryPath();\n const envVars = provider.getPtyEnvVars(agent.id, cwd, agent.skills);\n const githubEnvVars = getGitHubChildEnvVars();\n const childEnv = {\n ...envVars,\n ...githubEnvVars,\n };\n\n const settings = getSettings();\n const sandboxProvider =\n agent.disableSandbox\n ? \"none\"\n : (options?.sandboxProvider ?? agent.sandboxProvider ?? settings.sandboxProvider);\n const sandboxEnabled = sandboxProvider !== \"none\";\n const isolatedHome =\n sandboxProvider === \"docker\" ? ensureTerminalIsolationHome(terminalId) : null;\n const dockerRuntime =\n sandboxProvider === \"docker\" ? ensureTerminalDockerRuntime(terminalId) : null;\n const runtimeEnv = dockerRuntime\n ? {\n DOCKER_HOST: dockerRuntime.dockerHost,\n DOCKER_BUILDKIT: \"1\",\n COMPOSE_DOCKER_CLI_BUILD: \"1\",\n COMPOSE_PROJECT_NAME: dockerRuntime.composeProjectName,\n }\n : {};\n Object.assign(childEnv, runtimeEnv);\n\n const command = provider.buildInteractiveCommand({\n binaryPath,\n prompt,\n projectPath: cwd,\n skipPermissions: agent.skipPermissions,\n sandbox: sandboxEnabled,\n mcpConfigPath: options?.mcpConfigPath,\n secondaryProjectPaths: agent.secondaryProjectPaths,\n skills: agent.skills,\n });\n\n clearRuntimeTimers(rt);\n const persistedSnapshot = readTerminalSnapshot(terminalId);\n if (persistedSnapshot && rt.nextOutputSeq <= persistedSnapshot.cursor) {\n rt.nextOutputSeq = persistedSnapshot.cursor + 1;\n }\n rt.deleting = false;\n rt.deleted = false;\n rt.intentionalStop = false;\n rt.lastStartedAt = Date.now();\n rt.pendingInputLine = \"\";\n resetOutputBuffer(rt);\n prepareExitWaiter(rt);\n\n const ptyInstance = spawnPty({\n terminalId,\n cwd,\n env: childEnv,\n homeDir: isolatedHome?.homeDir,\n sandboxProvider,\n readonlyMounts: agent.secondaryProjectPaths,\n dockerExtraMounts: dockerRuntime ? [dockerRuntime.socketMount] : undefined,\n onData: (data) => {\n if (!terminalCanUseRuntime(terminalId, rt)) {\n return;\n }\n\n const seq = rt.nextOutputSeq++;\n appendOutputChunk(rt, { seq, data });\n\n deps.io.to(`terminal:${terminalId}`).emit(\"terminal:output\", {\n terminalId,\n data,\n seq,\n });\n\n void rt.replica.write(data, seq);\n scheduleSnapshotPersist(terminalId, rt);\n rt.pendingHistory.push(data);\n scheduleHistoryFlush(terminalId, rt);\n },\n onExit: async (exitCode) => {\n const newStatus: AgentStatus = exitCode === 0 ? \"completed\" : \"error\";\n rt.ptyId = null;\n const agent = getTerminalRecord(terminalId);\n const ranForMs = rt.lastStartedAt ? Date.now() - rt.lastStartedAt : null;\n const intentionalStop = rt.intentionalStop;\n rt.lastStartedAt = null;\n\n try {\n if (rt.deleting || rt.deleted) {\n return;\n }\n\n await flushRuntimePersistence(terminalId, rt);\n\n if (!agent) {\n return;\n }\n\n if (intentionalStop) {\n updateTerminalRecord(terminalId, {\n status: \"idle\",\n currentTask: null,\n error: null,\n lastActivity: new Date().toISOString(),\n });\n\n emitTerminalStatus(terminalId, \"idle\" as AgentStatus, null);\n } else {\n updateTerminalRecord(terminalId, {\n status: newStatus,\n currentTask: null,\n error: exitCode !== 0 ? `Exited with code ${exitCode}` : null,\n lastActivity: new Date().toISOString(),\n });\n\n emitTerminalStatus(\n terminalId,\n newStatus,\n exitCode !== 0 ? `Exited with code ${exitCode}` : null\n );\n }\n\n const shouldAutoRestart =\n !isShuttingDown &&\n agent.kind !== \"kanban\" &&\n agent.kind !== \"automation\" &&\n agent.kind !== \"scheduler\" &&\n !intentionalStop &&\n (exitCode === 0 || ranForMs === null || ranForMs >= 5_000);\n\n rt.intentionalStop = false;\n\n if (agent.kanbanTaskId) {\n try {\n const taskResult = await finalizeKanbanTaskAfterTerminalExit(\n terminalId,\n agent.kanbanTaskId,\n exitCode === 0\n );\n\n updateTerminalRecord(terminalId, {\n status: exitCode === 0 ? \"idle\" : newStatus,\n currentTask: null,\n error: exitCode === 0 ? null : `Exited with code ${exitCode}`,\n kanbanTaskId: null,\n lastActivity: new Date().toISOString(),\n });\n\n emitTerminalStatus(\n terminalId,\n exitCode === 0 ? \"idle\" : newStatus,\n exitCode === 0 ? null : `Exited with code ${exitCode}`\n );\n deps.io.emit(\"kanban:updated\", {\n taskId: taskResult.taskId,\n column: taskResult.column,\n assignedTerminalId: terminalId,\n });\n } catch (error) {\n console.error(`Failed to finalize kanban task for terminal ${terminalId}:`, error);\n updateTerminalRecord(terminalId, {\n kanbanTaskId: null,\n lastActivity: new Date().toISOString(),\n });\n }\n }\n\n if (shouldAutoRestart && getTerminalRecord(terminalId)) {\n updateTerminalRecord(terminalId, {\n status: \"idle\",\n currentTask: null,\n error: null,\n lastActivity: new Date().toISOString(),\n });\n emitTerminalStatus(terminalId, \"idle\" as AgentStatus, null);\n\n rt.restartTimer = setTimeout(() => {\n rt.restartTimer = null;\n void startTerminal(terminalId, \"\", { syncRepo: false }).catch((error) => {\n console.error(`Failed to auto-restart terminal ${terminalId}:`, error);\n if (!getTerminalRecord(terminalId)) {\n return;\n }\n updateTerminalRecord(terminalId, {\n status: \"error\",\n error:\n error instanceof Error ? error.message : \"Failed to auto-restart terminal\",\n lastActivity: new Date().toISOString(),\n });\n emitTerminalStatus(\n terminalId,\n \"error\" as AgentStatus,\n error instanceof Error ? error.message : \"Failed to auto-restart terminal\"\n );\n });\n }, 250);\n }\n } finally {\n resolveExitWaiter(rt);\n }\n },\n });\n\n rt.ptyId = ptyInstance.id;\n\n updateTerminalRecord(terminalId, {\n status: \"running\",\n currentTask: prompt.trim() ? prompt.slice(0, 200) : null,\n error: null,\n lastActivity: new Date().toISOString(),\n });\n\n emitTerminalStatus(terminalId, \"running\" as AgentStatus, null);\n\n const shellCommand = prepareShellCommand(command, agent.kind);\n if (shellCommand) {\n writeCommandToPty(ptyInstance.id, shellCommand);\n }\n return { ptyId: ptyInstance.id };\n}\n\nexport async function stopTerminal(terminalId: string) {\n const agent = getTerminalRecord(terminalId);\n const rt = agentRuntimes.get(terminalId);\n if (!agent && !rt) {\n return;\n }\n\n if (rt?.ptyId) {\n rt.intentionalStop = true;\n const exitPromise = rt.exitPromise;\n killPty(rt.ptyId);\n rt.ptyId = null;\n await exitPromise;\n return;\n }\n\n if (rt && agent) {\n await flushRuntimePersistence(terminalId, rt);\n }\n\n if (!agent) {\n return;\n }\n\n updateTerminalRecord(terminalId, {\n status: \"idle\",\n currentTask: null,\n error: null,\n lastActivity: new Date().toISOString(),\n });\n\n emitTerminalStatus(terminalId, \"idle\" as AgentStatus, null);\n}\n\nexport async function deleteTerminal(terminalId: string) {\n const agent = getTerminalRecord(terminalId);\n const rt = agentRuntimes.get(terminalId);\n if (!agent && !rt) {\n return;\n }\n\n if (agent?.kanbanTaskId) {\n updateTerminalRecord(terminalId, {\n kanbanTaskId: null,\n currentTask: null,\n lastActivity: new Date().toISOString(),\n });\n }\n if (rt) {\n clearRuntimeTimers(rt);\n rt.intentionalStop = true;\n rt.deleting = true;\n rt.pendingHistory = [];\n }\n if (rt?.ptyId) {\n const exitPromise = rt.exitPromise;\n killPty(rt.ptyId);\n rt.ptyId = null;\n await exitPromise;\n }\n if (rt) {\n await waitForRuntimeWritesToSettle(rt);\n rt.deleted = true;\n rt.replica.dispose();\n }\n agentRuntimes.delete(terminalId);\n\n // Clean up auto-created worktree\n if (agent?.autoWorktree && agent.worktreePath) {\n try {\n removeTerminalWorktree(agent.projectPath, terminalId);\n } catch (err) {\n console.warn(`Failed to remove worktree for terminal ${terminalId}:`, err);\n }\n }\n\n try {\n cleanupTerminalDockerRuntime(terminalId);\n } catch (err) {\n console.warn(`Failed to clean up Docker runtime for terminal ${terminalId}:`, err);\n }\n\n try {\n removeTerminalIsolationState(terminalId);\n } catch (err) {\n console.warn(`Failed to remove isolated home for terminal ${terminalId}:`, err);\n }\n\n deleteTerminalRecord(terminalId);\n deleteTerminalState(terminalId);\n\n emitTerminalStatus(terminalId, \"idle\" as AgentStatus, null);\n}\n\nexport function sendTerminalInput(terminalId: string, data: string): boolean {\n if (!getTerminalRecord(terminalId)) return false;\n const rt = agentRuntimes.get(terminalId);\n if (!rt?.ptyId) return false;\n\n const { currentLine, committedInputs } = applyTerminalInputChunk(\n rt.pendingInputLine,\n data\n );\n const ok = writeToPty(rt.ptyId, data);\n if (!ok) {\n return false;\n }\n\n rt.pendingInputLine = currentLine;\n if (committedInputs.length > 0) {\n const terminal = getTerminalRecord(terminalId);\n if (terminal) {\n const nextRecentInputs = appendRecentTerminalInputs(\n getRecentInputs(terminal),\n committedInputs\n );\n updateTerminalRecord(terminalId, {\n recentInputs: nextRecentInputs,\n lastActivity: new Date().toISOString(),\n });\n emitTerminalStatus(terminalId, terminal.status, terminal.error);\n }\n }\n\n return true;\n}\n\nexport function hasTerminal(terminalId: string): boolean {\n return getTerminalRecord(terminalId) != null;\n}\n\nexport function resizeTerminal(\n terminalId: string,\n cols: number,\n rows: number\n): boolean {\n if (!getTerminalRecord(terminalId)) {\n return false;\n }\n\n const rt = getRuntime(terminalId);\n if (rt.deleting || rt.deleted) {\n return false;\n }\n void rt.replica.resize(cols, rows, rt.nextOutputSeq - 1);\n scheduleSnapshotPersist(terminalId, rt);\n if (!rt.ptyId) return false;\n return resizePty(rt.ptyId, cols, rows);\n}\n\nexport async function restorePersistentTerminals() {\n const terminals = listTerminalRecords().filter(\n (agent) =>\n agent.kind !== \"kanban\" &&\n agent.kind !== \"automation\" &&\n agent.kind !== \"scheduler\"\n );\n\n let nextIndex = 0;\n const workerCount = Math.min(RESTORE_CONCURRENCY, terminals.length);\n\n const restoreNext = async () => {\n while (nextIndex < terminals.length) {\n const terminal = terminals[nextIndex++];\n\n try {\n if (shouldDeleteTerminalDuringRestore(terminal)) {\n console.warn(\n `Deleting terminal ${terminal.id} during restore because its auto-worktree path is missing: ${terminal.worktreePath}`\n );\n await deleteTerminal(terminal.id);\n continue;\n }\n\n await startTerminal(terminal.id, \"\", { syncRepo: false });\n } catch (error) {\n console.error(`Failed to restore terminal ${terminal.id}:`, error);\n updateTerminalRecord(terminal.id, {\n status: \"error\",\n error:\n error instanceof Error ? error.message : \"Failed to restore terminal session\",\n lastActivity: new Date().toISOString(),\n });\n emitTerminalStatus(\n terminal.id,\n \"error\" as AgentStatus,\n error instanceof Error ? error.message : \"Failed to restore terminal session\"\n );\n }\n }\n };\n\n await Promise.all(Array.from({ length: workerCount }, () => restoreNext()));\n}\n\nexport async function getTerminalOutput(terminalId: string): Promise<string[]> {\n return (await getTerminalOutputSnapshot(terminalId)).output;\n}\n\nexport async function getTerminalOutputSnapshot(\n terminalId: string\n): Promise<{ output: string[]; cursor: number }> {\n if (!getTerminalRecord(terminalId)) {\n throw new Error(\"Terminal not found\");\n }\n\n const rt = getRuntime(terminalId);\n const persistedSnapshot = await rt.replica.snapshot();\n const history = readTerminalHistory(terminalId);\n\n return buildTerminalSnapshotOutput({\n outputBuffer: getOutputBufferChunks(rt),\n persistedSnapshot,\n history,\n });\n}\n\nexport function getBufferedTerminalOutputSince(\n terminalId: string,\n sinceSeq: number\n): Array<{ seq: number; data: string }> {\n if (!getTerminalRecord(terminalId)) {\n return [];\n }\n\n const rt = getRuntime(terminalId);\n return getOutputBufferChunks(rt).filter((chunk) => chunk.seq >= sinceSeq);\n}\n\nexport async function getTerminalAttachment(\n terminalId: string,\n cursor?: number\n): Promise<TerminalAttachResponse> {\n if (!getTerminalRecord(terminalId)) {\n throw new Error(\"Terminal not found\");\n }\n\n const rt = getRuntime(terminalId);\n const snapshot = await getTerminalOutputSnapshot(terminalId);\n\n return buildTerminalAttachResponse({\n terminalId,\n requestedCursor: cursor,\n outputBuffer: getOutputBufferChunks(rt),\n snapshotOutput: snapshot.output,\n snapshotCursor: snapshot.cursor,\n });\n}\n\nlet isShuttingDown = false;\n\nexport async function shutdownTerminalManager() {\n isShuttingDown = true;\n\n const activeExitPromises: Promise<void>[] = [];\n const idleFlushes: Promise<void>[] = [];\n\n for (const [terminalId, rt] of agentRuntimes) {\n clearRuntimeTimers(rt);\n if (rt.deleting || rt.deleted) {\n continue;\n }\n\n if (rt.ptyId) {\n rt.intentionalStop = true;\n const exitPromise = rt.exitPromise;\n killPty(rt.ptyId);\n rt.ptyId = null;\n activeExitPromises.push(exitPromise);\n continue;\n }\n\n if (getTerminalRecord(terminalId)) {\n idleFlushes.push(flushRuntimePersistence(terminalId, rt));\n }\n }\n\n await Promise.all(activeExitPromises);\n await Promise.all(idleFlushes);\n}\n\nexport async function listTerminals() {\n return listTerminalRecords().map((terminal) => hydrateTerminal(terminal));\n}\n\nexport async function getTerminal(terminalId: string) {\n return hydrateTerminal(getTerminalRecord(terminalId));\n}\n", "import Fastify from \"fastify\";\nimport cors from \"@fastify/cors\";\nimport { Server as SocketServer } from \"socket.io\";\nimport {\n initTerminalManager,\n restorePersistentTerminals,\n shutdownTerminalManager,\n} from \"./agents/terminal-manager.js\";\nimport { registerTerminalRoutes } from \"./routes/terminal-routes.js\";\nimport { registerProjectRoutes } from \"./routes/project-routes.js\";\nimport { registerKanbanRoutes } from \"./routes/kanban-routes.js\";\nimport { registerSocketHandlers } from \"./socket/handlers.js\";\nimport { startKanbanAssigner, stopKanbanAssigner } from \"./agents/kanban-assigner.js\";\nimport { registerSchedulerRoutes } from \"./routes/scheduler-routes.js\";\nimport { registerAutomationRoutes } from \"./routes/automation-routes.js\";\nimport { startScheduler, stopScheduler } from \"./scheduler/scheduler.js\";\nimport { startAutomationRunner, stopAutomationRunner } from \"./scheduler/automation-runner.js\";\nimport { initAuth, registerAuthHook, registerAuthRoutes, verifySessionToken } from \"./auth/auth.js\";\nimport { registerSystemRoutes } from \"./routes/system-routes.js\";\nimport { registerCliAuthRoutes } from \"./routes/cli-auth-routes.js\";\nimport { registerGitHubIntegrationRoutes } from \"./routes/github-integration-routes.js\";\nimport { registerWebhookRoutes } from \"./routes/webhook-routes.js\";\nimport { registerSettingsRoutes } from \"./routes/settings-routes.js\";\nimport { registerDeploymentRoutes } from \"./routes/deployment-routes.js\";\nimport { getRuntimeStatus } from \"./runtime/runtime-status.js\";\nimport { startAutoUpdater, stopAutoUpdater } from \"./services/auto-updater.js\";\nimport { startAuthStatusChecker, stopAuthStatusChecker } from \"./services/auth-status-checker.js\";\nimport { registerSetupRoutes } from \"./routes/setup-routes.js\";\nimport { registerOllamaRoutes } from \"./routes/ollama-routes.js\";\nimport { registerWhatsAppRoutes, startWhatsApp, stopWhatsApp, startWhatsAppQueue, stopWhatsAppQueue } from \"@maestro/pi\";\nimport { registerTelegramRoutes, startTelegram, stopTelegram, startTelegramQueue, stopTelegramQueue } from \"@maestro/pi\";\nimport { getSettings as getSettingsState } from \"./state/settings.js\";\nimport { writePiModelsConfig } from \"./services/ollama.js\";\n\nconst PORT = parseInt(process.env.PORT || \"4800\", 10);\nconst HOST = process.env.HOST || \"0.0.0.0\";\n\nasync function main() {\n console.log(\"Starting Maestro server...\");\n\n // 2. Initialize auth\n const { apiToken } = initAuth();\n console.log(`API token: ${apiToken}`);\n\n // 3. Create Fastify app\n const app = Fastify({ logger: false });\n app.removeContentTypeParser(\"application/json\");\n app.addContentTypeParser(\"application/json\", { parseAs: \"buffer\" }, (req, body, done) => {\n const rawBody = Buffer.isBuffer(body) ? body : Buffer.from(body);\n req.rawBody = rawBody;\n\n try {\n const text = rawBody.length > 0 ? rawBody.toString(\"utf8\") : \"\";\n done(null, text ? JSON.parse(text) : {});\n } catch (error) {\n done(error as Error, undefined);\n }\n });\n await app.register(cors, { origin: true });\n\n // 4. Register auth hook and routes\n registerAuthHook(app);\n await registerAuthRoutes(app);\n\n // 5. Create Socket.io server attached to Fastify's underlying HTTP server\n const io = new SocketServer(app.server, {\n cors: { origin: \"*\" },\n transports: [\"websocket\", \"polling\"],\n });\n\n // Socket.io auth middleware\n io.use((socket, next) => {\n if (process.env.AUTH_DISABLED === \"1\") return next();\n const token = socket.handshake.auth?.token as string | undefined;\n if (!token) return next(new Error(\"Missing auth token\"));\n if (token === apiToken) return next();\n const payload = verifySessionToken(token);\n if (payload) return next();\n return next(new Error(\"Invalid auth token\"));\n });\n\n // 6. Initialize terminal manager with dependencies\n initTerminalManager({ io });\n\n // 7. Register routes\n await registerProjectRoutes(app);\n await registerTerminalRoutes(app);\n await registerKanbanRoutes(app, io);\n\n await registerSchedulerRoutes(app);\n await registerAutomationRoutes(app);\n await registerSystemRoutes(app);\n await registerCliAuthRoutes(app);\n await registerGitHubIntegrationRoutes(app);\n await registerWebhookRoutes(app, io);\n await registerSettingsRoutes(app);\n await registerDeploymentRoutes(app);\n await registerSetupRoutes(app);\n await registerWhatsAppRoutes(app, io);\n await registerTelegramRoutes(app, io, () => getSettingsState().telegramBotToken);\n await registerOllamaRoutes(app);\n\n // 8. Register socket handlers\n registerSocketHandlers(io);\n\n // 9. Start background services\n startKanbanAssigner(io);\n await startScheduler();\n startAutomationRunner();\n startAutoUpdater();\n startAuthStatusChecker();\n\n // Ensure Pi models.json is written if a model is configured\n const savedPiModel = getSettingsState().piOllamaModel;\n if (savedPiModel) {\n writePiModelsConfig(savedPiModel);\n console.log(`[startup] Pi models.json written for model: ${savedPiModel}`);\n }\n\n // Start WhatsApp if enabled\n if (process.env.WHATSAPP_ENABLED === \"1\") {\n await startWhatsApp(io);\n startWhatsAppQueue();\n console.log(\"[startup] WhatsApp integration enabled\");\n }\n\n // Start Telegram if enabled (via env var or saved token in settings)\n const savedTelegramToken = getSettingsState().telegramBotToken;\n if (process.env.TELEGRAM_ENABLED === \"1\" || savedTelegramToken) {\n await startTelegram(io, savedTelegramToken || undefined);\n startTelegramQueue();\n console.log(\"[startup] Telegram integration enabled\");\n }\n\n // 10. Health check\n app.get(\"/health\", async () => ({ status: \"ok\", timestamp: new Date().toISOString() }));\n\n const runtimeStatus = getRuntimeStatus();\n if (runtimeStatus.github.needsAuthWarning) {\n console.warn(\n \"[startup] GitHub-backed features are configured, but GITHUB_TOKEN/GH_TOKEN is missing.\"\n );\n }\n\n // 11. Start server\n await app.listen({ port: PORT, host: HOST });\n console.log(`Maestro server listening on http://${HOST}:${PORT}`);\n void restorePersistentTerminals().catch((error) => {\n console.error(\"Failed to restore persistent terminals:\", error);\n });\n\n // Graceful shutdown\n const shutdown = async (signal: string) => {\n console.log(`\\nReceived ${signal}, shutting down...`);\n stopKanbanAssigner();\n stopScheduler();\n stopAutomationRunner();\n stopAutoUpdater();\n stopAuthStatusChecker();\n stopWhatsAppQueue();\n await stopWhatsApp();\n stopTelegramQueue();\n await stopTelegram();\n await shutdownTerminalManager();\n io.close();\n await app.close();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", () => shutdown(\"SIGINT\"));\n process.on(\"SIGTERM\", () => shutdown(\"SIGTERM\"));\n}\n\nmain().catch((err) => {\n console.error(\"Failed to start Maestro:\", err);\n process.exit(1);\n});\n", "import * as fs from \"fs\";\nimport type { FastifyInstance } from \"fastify\";\nimport {\n AgentSpawnOptions,\n AgentStartInput,\n AgentSendInput,\n} from \"@maestro/wire\";\nimport {\n createTerminal,\n deleteTerminal,\n getTerminal,\n getTerminalOutputSnapshot,\n listTerminals,\n sendTerminalInput,\n startTerminal,\n stopTerminal,\n} from \"../agents/terminal-manager.js\";\nimport { getProjectRecordById } from \"../state/projects.js\";\nimport { updateTerminalRecord } from \"../state/terminals.js\";\nimport { isGitRepo } from \"../agents/worktree.js\";\n\nexport async function registerTerminalRoutes(app: FastifyInstance) {\n // List all terminals\n app.get(\"/api/terminals\", async () => {\n const terminals = await listTerminals();\n return { terminals };\n });\n\n // Get single terminal\n app.get<{ Params: { id: string } }>(\"/api/terminals/:id\", async (req, reply) => {\n const terminal = await getTerminal(req.params.id);\n if (!terminal) return reply.status(404).send({ error: \"Terminal not found\" });\n return { terminal };\n });\n\n // Get terminal output buffer\n app.get<{ Params: { id: string } }>(\n \"/api/terminals/:id/output\",\n async (req, reply) => {\n const terminal = await getTerminal(req.params.id);\n if (!terminal) return reply.status(404).send({ error: \"Terminal not found\" });\n return await getTerminalOutputSnapshot(req.params.id);\n }\n );\n\n // Create terminal\n app.post(\"/api/terminals\", async (req, reply) => {\n try {\n const options = AgentSpawnOptions.parse(req.body);\n let projectPath = options.projectPath;\n\n if (options.projectId) {\n const project = getProjectRecordById(options.projectId);\n if (!project) {\n return reply.status(404).send({ error: \"Project not found\" });\n }\n projectPath = project.localPath;\n }\n\n if (!projectPath) {\n return reply.status(400).send({ error: \"projectPath is required\" });\n }\n\n const wantsWorktree = options.useWorktree ?? options.worktree ?? false;\n const wantsAutoWorktree = options.autoWorktree ?? false;\n let worktreePath = options.worktreePath?.trim() || null;\n\n if (wantsWorktree && !worktreePath) {\n return reply.status(400).send({\n error: \"worktreePath is required when useWorktree is enabled\",\n });\n }\n\n if (worktreePath && !fs.existsSync(worktreePath)) {\n return reply.status(400).send({ error: \"worktreePath does not exist\" });\n }\n\n // Validate auto-worktree precondition (git repo check)\n if (wantsAutoWorktree && !worktreePath) {\n if (!isGitRepo(projectPath)) {\n return reply.status(400).send({\n error: \"Auto-worktree requires the project to be a git repository\",\n });\n }\n }\n\n const createdAgent = await createTerminal({\n name: options.name,\n kind: \"terminal\",\n provider: options.provider,\n projectId: options.projectId,\n projectPath,\n worktreePath,\n autoWorktree: wantsAutoWorktree,\n customDisplayName: options.customDisplayName,\n customCommandTemplate: options.customCommandTemplate,\n customEnv: options.customEnv,\n sandboxProvider: options.sandboxProvider ?? null,\n secondaryProjectPaths: options.secondaryProjectPaths,\n skills: options.skills,\n skipPermissions: options.skipPermissions,\n disableSandbox: options.disableSandbox,\n });\n\n try {\n await startTerminal(createdAgent.id, options.prompt ?? \"\");\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Failed to start terminal session\";\n updateTerminalRecord(createdAgent.id, {\n status: \"error\",\n error: message,\n lastActivity: new Date().toISOString(),\n });\n }\n\n const terminal = await getTerminal(createdAgent.id);\n return reply.status(201).send({ terminal: terminal ?? createdAgent });\n } catch (err) {\n return reply\n .status(400)\n .send({ error: err instanceof Error ? err.message : \"Invalid input\" });\n }\n });\n\n // Start terminal with prompt\n app.post<{ Params: { id: string } }>(\n \"/api/terminals/:id/start\",\n async (req, reply) => {\n try {\n const input = AgentStartInput.parse(req.body);\n const result = await startTerminal(\n req.params.id,\n input.prompt\n );\n return { ok: true, ...result };\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to start terminal\",\n });\n }\n }\n );\n\n // Stop terminal\n app.post<{ Params: { id: string } }>(\n \"/api/terminals/:id/stop\",\n async (req, reply) => {\n try {\n await stopTerminal(req.params.id);\n return { ok: true };\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to stop terminal\",\n });\n }\n }\n );\n\n // Send input to terminal\n app.post<{ Params: { id: string } }>(\n \"/api/terminals/:id/input\",\n async (req, reply) => {\n try {\n const input = AgentSendInput.parse(req.body);\n const ok = sendTerminalInput(req.params.id, input.text);\n if (!ok) return reply.status(400).send({ error: \"Terminal has no active PTY\" });\n return { ok: true };\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to send input\",\n });\n }\n }\n );\n\n // Delete terminal\n app.delete<{ Params: { id: string } }>(\n \"/api/terminals/:id\",\n async (req, reply) => {\n try {\n await deleteTerminal(req.params.id);\n return { ok: true };\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to delete terminal\",\n });\n }\n }\n );\n}\n", "import { z } from \"zod\";\nimport { SandboxProviderSchema } from \"./settings\";\n\nexport const AgentProvider = z.enum([\"none\", \"claude\", \"codex\", \"custom\"]);\nexport type AgentProvider = z.infer<typeof AgentProvider>;\n\nexport const AgentStatus = z.enum([\n \"idle\",\n \"running\",\n \"waiting\",\n \"completed\",\n \"error\",\n]);\nexport type AgentStatus = z.infer<typeof AgentStatus>;\n\nexport const AgentSpawnOptions = z\n .object({\n name: z.string().optional(),\n provider: AgentProvider.default(\"claude\"),\n projectId: z.string().optional(),\n projectPath: z.string().optional(),\n customDisplayName: z.string().optional(),\n customCommandTemplate: z.string().optional(),\n customEnv: z.record(z.string()).optional(),\n secondaryProjectPaths: z.array(z.string()).optional(),\n skills: z.array(z.string()).optional(),\n skipPermissions: z.boolean().default(false),\n disableSandbox: z.boolean().default(false),\n sandboxProvider: SandboxProviderSchema.optional(),\n useWorktree: z.boolean().optional(),\n worktree: z.boolean().optional(),\n worktreePath: z.string().optional(),\n autoWorktree: z.boolean().optional(),\n prompt: z.string().optional(),\n })\n .refine((data) => Boolean(data.projectId || data.projectPath), {\n message: \"projectId or projectPath is required\",\n path: [\"projectPath\"],\n })\n .refine(\n (data) =>\n data.provider !== \"custom\" ||\n Boolean(data.customCommandTemplate?.trim()),\n {\n message: \"customCommandTemplate is required for custom providers\",\n path: [\"customCommandTemplate\"],\n }\n );\nexport type AgentSpawnOptions = z.infer<typeof AgentSpawnOptions>;\n\nexport const AgentInfo = z.object({\n id: z.string(),\n name: z.string().nullable(),\n provider: AgentProvider,\n projectId: z.string().nullable().optional(),\n projectName: z.string().nullable().optional(),\n projectPath: z.string(),\n customDisplayName: z.string().nullable().optional(),\n customCommandTemplate: z.string().nullable().optional(),\n customEnv: z.record(z.string()).nullable().optional(),\n sandboxProvider: SandboxProviderSchema.nullable().optional(),\n status: AgentStatus,\n currentTask: z.string().nullable(),\n error: z.string().nullable(),\n recentInputs: z.array(z.string()).default([]),\n lastActivity: z.string().nullable(),\n skills: z.array(z.string()),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\nexport type AgentInfo = z.infer<typeof AgentInfo>;\n\nexport const AgentStartInput = z.object({\n prompt: z.string().optional().default(\"\"),\n});\nexport type AgentStartInput = z.infer<typeof AgentStartInput>;\n\nexport const AgentSendInput = z.object({\n text: z.string(),\n});\nexport type AgentSendInput = z.infer<typeof AgentSendInput>;\n", "import { z } from \"zod\";\n\nexport const AutoSpawnAgentProviderSchema = z.enum([\"claude\", \"codex\"]);\nexport type AutoSpawnAgentProvider = z.infer<typeof AutoSpawnAgentProviderSchema>;\n\nexport const AutoSpawnAgentWorktreeModeSchema = z.enum([\"none\", \"new\"]);\nexport type AutoSpawnAgentWorktreeMode = z.infer<typeof AutoSpawnAgentWorktreeModeSchema>;\n\nexport const SandboxProviderSchema = z.enum([\"none\", \"nsjail\", \"docker\"]);\nexport type SandboxProvider = z.infer<typeof SandboxProviderSchema>;\n\nexport const SettingsSchema = z.object({\n autoUpdateEnabled: z.boolean().default(false),\n autoUpdateIntervalHours: z.number().min(1).max(168).default(24),\n piOllamaModel: z.string().default(\"\"),\n telegramBotToken: z.string().default(\"\"),\n /** Legacy boolean retained for backwards compatibility with older clients */\n sandboxEnabled: z.boolean().default(false),\n /** Sandbox runtime used when a terminal/agent enables sandboxing */\n sandboxProvider: SandboxProviderSchema.default(\"none\"),\n /** Deepgram API key for voice-to-text on mobile */\n deepgramApiKey: z.string().default(\"\"),\n /** Default coding agent provider used for automatic spawns */\n agentDefaultProvider: AutoSpawnAgentProviderSchema.default(\"claude\"),\n /** Disable sandbox for automatically spawned agents */\n agentDefaultDisableSandbox: z.boolean().default(false),\n /** Run automatically spawned agents without approval prompts */\n agentDefaultSkipPermissions: z.boolean().default(true),\n /** Worktree mode for automatically spawned agents */\n agentDefaultWorktreeMode: AutoSpawnAgentWorktreeModeSchema.default(\"none\"),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n\nexport const SettingsUpdateSchema = SettingsSchema.partial();\nexport type SettingsUpdate = z.infer<typeof SettingsUpdateSchema>;\n\n// Ollama types for Pi agent configuration\nexport const OllamaModelInfo = z.object({\n name: z.string(),\n size: z.number(),\n digest: z.string(),\n modifiedAt: z.string(),\n});\nexport type OllamaModelInfo = z.infer<typeof OllamaModelInfo>;\n\nexport const OllamaPullProgress = z.object({\n status: z.string(),\n digest: z.string().optional(),\n total: z.number().optional(),\n completed: z.number().optional(),\n});\nexport type OllamaPullProgress = z.infer<typeof OllamaPullProgress>;\n\nexport const UpdateStatus = z.object({\n lastCheckAt: z.string().nullable(),\n lastUpdateAt: z.string().nullable(),\n claudeCode: z.object({\n currentVersion: z.string().nullable(),\n latestVersion: z.string().nullable(),\n updateAvailable: z.boolean(),\n }),\n codex: z.object({\n currentVersion: z.string().nullable(),\n latestVersion: z.string().nullable(),\n updateAvailable: z.boolean(),\n }),\n gh: z.object({\n currentVersion: z.string().nullable(),\n latestVersion: z.string().nullable(),\n updateAvailable: z.boolean(),\n }),\n updating: z.boolean(),\n lastError: z.string().nullable(),\n});\n\nexport type UpdateStatus = z.infer<typeof UpdateStatus>;\n\nexport const DeploymentReleaseInfo = z.object({\n tag: z.string(),\n name: z.string().nullable(),\n url: z.string().nullable(),\n publishedAt: z.string().nullable(),\n notes: z.string().nullable(),\n});\nexport type DeploymentReleaseInfo = z.infer<typeof DeploymentReleaseInfo>;\n\nexport const DeploymentUpdateStatus = z.object({\n configured: z.boolean(),\n currentVersion: z.string().nullable(),\n latestVersion: z.string().nullable(),\n updateAvailable: z.boolean(),\n updating: z.boolean(),\n lastCheckedAt: z.string().nullable(),\n lastUpdatedAt: z.string().nullable(),\n lastError: z.string().nullable(),\n latestRelease: DeploymentReleaseInfo.nullable(),\n});\nexport type DeploymentUpdateStatus = z.infer<typeof DeploymentUpdateStatus>;\n\nexport const DeploymentRedeployResponse = z.object({\n accepted: z.boolean(),\n targetVersion: z.string().nullable(),\n message: z.string(),\n});\nexport type DeploymentRedeployResponse = z.infer<typeof DeploymentRedeployResponse>;\n", "import { z } from \"zod\";\n\nexport const KanbanColumn = z.enum([\"backlog\", \"planned\", \"ongoing\", \"review\", \"done\"]);\nexport type KanbanColumn = z.infer<typeof KanbanColumn>;\n\nexport const KanbanPriority = z.enum([\"low\", \"medium\", \"high\"]);\nexport type KanbanPriority = z.infer<typeof KanbanPriority>;\n\nexport const KanbanTask = z.object({\n id: z.string(),\n title: z.string(),\n description: z.string(),\n column: KanbanColumn,\n projectId: z.string().nullable().optional(),\n projectPath: z.string(),\n blockedBy: z.array(z.string()),\n priority: KanbanPriority,\n progress: z.number().min(0).max(100),\n order: z.number(),\n labels: z.array(z.string()),\n completionSummary: z.string().nullable(),\n assignedTerminalId: z.string().nullable(),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\nexport type KanbanTask = z.infer<typeof KanbanTask>;\n\nexport const KanbanTaskCreate = z.object({\n title: z.string(),\n description: z.string(),\n projectId: z.string().optional(),\n projectPath: z.string().optional(),\n blockedBy: z.array(z.string()).optional(),\n priority: KanbanPriority.default(\"medium\"),\n labels: z.array(z.string()).optional(),\n}).refine((data) => Boolean(data.projectId || data.projectPath), {\n message: \"projectId or projectPath is required\",\n path: [\"projectPath\"],\n});\nexport type KanbanTaskCreate = z.infer<typeof KanbanTaskCreate>;\n\nexport const KanbanTaskUpdate = z.object({\n title: z.string().optional(),\n description: z.string().optional(),\n column: KanbanColumn.optional(),\n priority: KanbanPriority.optional(),\n progress: z.number().min(0).max(100).optional(),\n labels: z.array(z.string()).optional(),\n blockedBy: z.array(z.string()).optional(),\n completionSummary: z.string().optional(),\n});\nexport type KanbanTaskUpdate = z.infer<typeof KanbanTaskUpdate>;\n", "import { z } from \"zod\";\nimport { AgentStatus } from \"./agent\";\nimport { KanbanColumn } from \"./kanban\";\n\nexport const TerminalOutputChunk = z.object({\n seq: z.number().int().nonnegative(),\n data: z.string(),\n});\n\nexport const TerminalAttachResponse = z.discriminatedUnion(\"mode\", [\n z.object({\n mode: z.literal(\"snapshot\"),\n terminalId: z.string(),\n output: z.array(z.string()),\n cursor: z.number().int().nonnegative(),\n }),\n z.object({\n mode: z.literal(\"replay\"),\n terminalId: z.string(),\n chunks: z.array(TerminalOutputChunk),\n cursor: z.number().int().nonnegative(),\n }),\n]);\n\n// Server -> Client events\nexport const ServerEvents = {\n \"terminal:output\": z.object({\n terminalId: z.string(),\n ...TerminalOutputChunk.shape,\n }),\n \"terminal:status\": z.object({\n terminalId: z.string(),\n status: AgentStatus,\n error: z.string().nullable().optional(),\n recentInputs: z.array(z.string()).optional(),\n }),\n \"kanban:updated\": z.object({\n taskId: z.string(),\n column: KanbanColumn.optional(),\n assignedTerminalId: z.string().nullable().optional(),\n }),\n \"setup:output\": z.object({\n data: z.string(),\n }),\n \"setup:complete\": z.object({}),\n \"setup:url\": z.object({\n url: z.string(),\n }),\n \"setup:clear-url\": z.object({}),\n \"whatsapp:message\": z.object({\n message: z.object({\n id: z.string(),\n chatJid: z.string(),\n messageId: z.string(),\n direction: z.enum([\"incoming\", \"outgoing\"]),\n senderName: z.string().nullable(),\n body: z.string(),\n status: z.enum([\"queued\", \"processing\", \"completed\", \"failed\"]),\n responseText: z.string().nullable(),\n error: z.string().nullable(),\n createdAt: z.string(),\n processedAt: z.string().nullable(),\n }),\n }),\n \"whatsapp:status\": z.object({\n status: z.enum([\"disconnected\", \"connecting\", \"qr_pending\", \"connected\"]),\n }),\n \"whatsapp:qr\": z.object({\n qrCode: z.string(),\n }),\n \"telegram:message\": z.object({\n message: z.object({\n id: z.string(),\n chatId: z.string(),\n messageId: z.string(),\n direction: z.enum([\"incoming\", \"outgoing\"]),\n senderName: z.string().nullable(),\n body: z.string(),\n status: z.enum([\"queued\", \"processing\", \"completed\", \"failed\"]),\n responseText: z.string().nullable(),\n error: z.string().nullable(),\n createdAt: z.string(),\n processedAt: z.string().nullable(),\n }),\n }),\n \"telegram:status\": z.object({\n status: z.enum([\"disconnected\", \"connecting\", \"connected\", \"error\"]),\n }),\n} as const;\n\n// Client -> Server events\nexport const ClientEvents = {\n \"terminal:input\": z.object({\n terminalId: z.string(),\n data: z.string(),\n }),\n \"terminal:resize\": z.object({\n terminalId: z.string(),\n cols: z.number(),\n rows: z.number(),\n }),\n \"terminal:attach\": z.object({\n terminalId: z.string(),\n cursor: z.number().int().nonnegative().optional(),\n }),\n \"terminal:subscribe\": z.object({\n terminalId: z.string(),\n sinceSeq: z.number().int().nonnegative().optional(),\n }),\n \"terminal:unsubscribe\": z.object({\n terminalId: z.string(),\n }),\n \"setup:input\": z.object({\n data: z.string(),\n }),\n \"setup:resize\": z.object({\n cols: z.number(),\n rows: z.number(),\n }),\n \"setup:subscribe\": z.object({\n cols: z.number().optional(),\n rows: z.number().optional(),\n }),\n \"setup:unsubscribe\": z.object({}),\n \"setup:restart\": z.object({\n cols: z.number().optional(),\n rows: z.number().optional(),\n }),\n \"whatsapp:subscribe\": z.object({}),\n \"whatsapp:unsubscribe\": z.object({}),\n \"telegram:subscribe\": z.object({}),\n \"telegram:unsubscribe\": z.object({}),\n} as const;\n\nexport type ServerEventMap = {\n [K in keyof typeof ServerEvents]: z.infer<(typeof ServerEvents)[K]>;\n};\n\nexport type ClientEventMap = {\n [K in keyof typeof ClientEvents]: z.infer<(typeof ClientEvents)[K]>;\n};\n\nexport type TerminalAttachResponse = z.infer<typeof TerminalAttachResponse>;\n", "import { z } from \"zod\";\nimport { AgentProvider } from \"./agent\";\n\nexport const ProjectStatus = z.enum([\"ready\", \"error\"]);\nexport type ProjectStatus = z.infer<typeof ProjectStatus>;\n\nexport const ProjectCreateInput = z.object({\n name: z.string().min(1),\n repoUrl: z.string().optional(),\n githubOwner: z.string().optional(),\n githubRepo: z.string().optional(),\n defaultBranch: z.string().optional(),\n localPath: z.string().optional(),\n\n syncIssues: z.boolean().default(false),\n provider: AgentProvider.default(\"claude\"),\n});\nexport type ProjectCreateInput = z.infer<typeof ProjectCreateInput>;\n\nexport const ProjectInfo = z.object({\n id: z.string(),\n name: z.string(),\n slug: z.string(),\n repoUrl: z.string().nullable(),\n githubOwner: z.string().nullable(),\n githubRepo: z.string().nullable(),\n defaultBranch: z.string().nullable(),\n localPath: z.string(),\n status: ProjectStatus,\n\n lastSyncedAt: z.string().nullable(),\n lastSyncError: z.string().nullable(),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\nexport type ProjectInfo = z.infer<typeof ProjectInfo>;\n", "import { z } from \"zod\";\n\nexport const WhatsAppConnectionStatus = z.enum([\n \"disconnected\",\n \"connecting\",\n \"qr_pending\",\n \"connected\",\n]);\nexport type WhatsAppConnectionStatus = z.infer<typeof WhatsAppConnectionStatus>;\n\nexport const WhatsAppStatusResponse = z.object({\n status: WhatsAppConnectionStatus,\n qrCode: z.string().nullable().optional(),\n phoneNumber: z.string().nullable().optional(),\n});\nexport type WhatsAppStatusResponse = z.infer<typeof WhatsAppStatusResponse>;\n\nexport const WhatsAppMessageDirection = z.enum([\"incoming\", \"outgoing\"]);\nexport type WhatsAppMessageDirection = z.infer<typeof WhatsAppMessageDirection>;\n\nexport const WhatsAppMessageStatus = z.enum([\n \"queued\",\n \"processing\",\n \"completed\",\n \"failed\",\n]);\nexport type WhatsAppMessageStatus = z.infer<typeof WhatsAppMessageStatus>;\n\nexport const WhatsAppMessage = z.object({\n id: z.string(),\n chatJid: z.string(),\n messageId: z.string(),\n direction: WhatsAppMessageDirection,\n senderName: z.string().nullable(),\n body: z.string(),\n status: WhatsAppMessageStatus,\n responseText: z.string().nullable(),\n error: z.string().nullable(),\n createdAt: z.string(),\n processedAt: z.string().nullable(),\n});\nexport type WhatsAppMessage = z.infer<typeof WhatsAppMessage>;\n", "import { z } from \"zod\";\n\nexport const TelegramConnectionStatus = z.enum([\n \"disconnected\",\n \"connecting\",\n \"connected\",\n \"error\",\n]);\nexport type TelegramConnectionStatus = z.infer<typeof TelegramConnectionStatus>;\n\nexport const TelegramStatusResponse = z.object({\n status: TelegramConnectionStatus,\n botUsername: z.string().nullable().optional(),\n});\nexport type TelegramStatusResponse = z.infer<typeof TelegramStatusResponse>;\n\nexport const TelegramMessageDirection = z.enum([\"incoming\", \"outgoing\"]);\nexport type TelegramMessageDirection = z.infer<typeof TelegramMessageDirection>;\n\nexport const TelegramMessageStatus = z.enum([\n \"queued\",\n \"processing\",\n \"completed\",\n \"failed\",\n]);\nexport type TelegramMessageStatus = z.infer<typeof TelegramMessageStatus>;\n\nexport const TelegramMessage = z.object({\n id: z.string(),\n chatId: z.string(),\n messageId: z.string(),\n direction: TelegramMessageDirection,\n senderName: z.string().nullable(),\n body: z.string(),\n status: TelegramMessageStatus,\n responseText: z.string().nullable(),\n error: z.string().nullable(),\n createdAt: z.string(),\n processedAt: z.string().nullable(),\n});\nexport type TelegramMessage = z.infer<typeof TelegramMessage>;\n", "import * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport { execFileSync } from \"node:child_process\";\nimport type { ProjectCreateInput } from \"@maestro/wire\";\nimport {\n deleteTerminal,\n} from \"../agents/terminal-manager.js\";\nimport { resolveGitHubToken, runGhCommand } from \"../integrations/github.js\";\nimport { unregisterJob } from \"../scheduler/scheduler.js\";\nimport { listTerminalRecords } from \"../state/terminals.js\";\nimport { deleteKanbanStateForProject, probeGitHubMirror } from \"../state/kanban.js\";\nimport {\n createProjectRecord,\n findProjectRecordByGitHubRepo,\n findProjectRecordByPath,\n getProjectRecordById,\n getProjectRecordBySlug,\n listProjectRecords,\n removeProjectRecord,\n updateProjectRecord,\n} from \"../state/projects.js\";\nimport {\n deleteAutomationRecord,\n deleteScheduledTaskRecord,\n listAutomationRecords,\n listScheduledTaskRecords,\n} from \"../state/sqlite.js\";\nimport type { ProjectRecord } from \"../state/types.js\";\n\nconst MANAGED_PROJECTS_DIR = path.join(os.homedir(), \"maestro-projects\");\n\ninterface GitHubRepoParts {\n repoUrl: string | null;\n githubOwner: string | null;\n githubRepo: string | null;\n}\n\nfunction slugify(input: string): string {\n return (\n input\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\") || \"project\"\n );\n}\n\nfunction stripGitSuffix(value: string): string {\n return value.endsWith(\".git\") ? value.slice(0, -4) : value;\n}\n\nfunction parseGitHubRepo(\n repoUrl?: string,\n githubOwner?: string,\n githubRepo?: string\n): GitHubRepoParts {\n if (githubOwner && githubRepo) {\n return {\n repoUrl: repoUrl ?? `https://github.com/${githubOwner}/${githubRepo}.git`,\n githubOwner,\n githubRepo: stripGitSuffix(githubRepo),\n };\n }\n\n const raw = repoUrl?.trim();\n if (!raw) {\n return {\n repoUrl: null,\n githubOwner: null,\n githubRepo: null,\n };\n }\n\n const normalized = stripGitSuffix(\n raw.replace(/^git@github\\.com:/, \"https://github.com/\")\n );\n const match = normalized.match(\n /^https?:\\/\\/github\\.com\\/(?<owner>[^/]+)\\/(?<repo>[^/]+)$|^(?<shortOwner>[^/\\s]+)\\/(?<shortRepo>[^/\\s]+)$/\n );\n\n const owner = match?.groups?.owner ?? match?.groups?.shortOwner ?? null;\n const repo = match?.groups?.repo ?? match?.groups?.shortRepo ?? null;\n\n return {\n repoUrl: owner && repo ? `https://github.com/${owner}/${repo}.git` : raw,\n githubOwner: owner,\n githubRepo: repo,\n };\n}\n\nfunction getUniqueSlug(name: string): string {\n const base = slugify(name);\n let slug = base;\n let counter = 2;\n\n while (getProjectRecordBySlug(slug)) {\n slug = `${base}-${counter}`;\n counter += 1;\n }\n\n return slug;\n}\n\nfunction deriveLocalPath(\n localPath: string | undefined,\n name: string\n): string {\n if (localPath?.trim()) {\n return path.resolve(localPath.trim());\n }\n\n return path.join(MANAGED_PROJECTS_DIR, slugify(name));\n}\n\nfunction runGitCommand(args: string[]): void {\n try {\n execFileSync(\"git\", args, {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n } catch (error) {\n const stderr =\n error instanceof Error && \"stderr\" in error && typeof error.stderr === \"string\"\n ? error.stderr.trim()\n : \"\";\n throw new Error(stderr || `git ${args.join(\" \")} failed`);\n }\n}\n\nfunction ensureProjectPathAvailable(localPath: string): void {\n const existingProject = findProjectRecordByPath(localPath);\n if (existingProject) {\n throw new Error(`A project already uses ${localPath}`);\n }\n\n if (!fs.existsSync(localPath)) {\n return;\n }\n\n const stat = fs.statSync(localPath);\n if (!stat.isDirectory()) {\n throw new Error(`Local path already exists and is not a directory: ${localPath}`);\n }\n\n if (fs.readdirSync(localPath).length > 0) {\n throw new Error(`Local path already exists and is not empty: ${localPath}`);\n }\n}\n\nfunction cloneRepository(\n repo: GitHubRepoParts,\n localPath: string,\n defaultBranch?: string\n): void {\n if (!repo.repoUrl) {\n return;\n }\n\n const parentDir = path.dirname(localPath);\n fs.mkdirSync(parentDir, { recursive: true });\n ensureProjectPathAvailable(localPath);\n\n const branch = defaultBranch?.trim();\n const hasGitHubToken = Boolean(resolveGitHubToken().token);\n let ghCloneError: string | null = null;\n\n if (repo.githubOwner && repo.githubRepo && hasGitHubToken) {\n const ghArgs = [\"repo\", \"clone\", `${repo.githubOwner}/${repo.githubRepo}`, localPath];\n if (branch) {\n ghArgs.push(\"--\", \"--branch\", branch);\n }\n\n try {\n runGhCommand(ghArgs);\n return;\n } catch (error) {\n if (fs.existsSync(localPath) && fs.readdirSync(localPath).length === 0) {\n fs.rmdirSync(localPath);\n }\n\n ghCloneError =\n error instanceof Error ? error.message : \"gh repo clone failed\";\n }\n }\n\n const gitArgs = [\"clone\"];\n if (branch) {\n gitArgs.push(\"--branch\", branch);\n }\n gitArgs.push(repo.repoUrl, localPath);\n\n try {\n runGitCommand(gitArgs);\n } catch (error) {\n if (fs.existsSync(localPath) && fs.readdirSync(localPath).length === 0) {\n fs.rmdirSync(localPath);\n }\n\n const message = error instanceof Error ? error.message : \"git clone failed\";\n throw new Error(\n ghCloneError\n ? `Failed to clone repository. gh: ${ghCloneError}. git: ${message}`\n : `Failed to clone repository: ${message}`\n );\n }\n}\n\nexport async function listProjects(): Promise<ProjectRecord[]> {\n return listProjectRecords();\n}\n\nexport async function getProjectById(projectId: string): Promise<ProjectRecord | null> {\n return getProjectRecordById(projectId);\n}\n\nexport async function resolveProjectContext(input: {\n projectId?: string | null;\n projectPath?: string | null;\n}): Promise<{\n project: ProjectRecord | null;\n projectId: string | null;\n projectPath: string;\n}> {\n let project: ProjectRecord | null = null;\n\n if (input.projectId) {\n project = getProjectRecordById(input.projectId);\n if (!project) {\n throw new Error(\"Project not found\");\n }\n } else if (input.projectPath) {\n project = findProjectRecordByPath(input.projectPath);\n }\n\n const projectPath = project?.localPath || input.projectPath?.trim();\n if (!projectPath) {\n throw new Error(\"projectId or projectPath is required\");\n }\n\n return {\n project,\n projectId: project?.id ?? input.projectId ?? null,\n projectPath,\n };\n}\n\nexport async function syncGitHubIssues(\n projectId: string\n): Promise<{ syncedCount: number }> {\n return probeGitHubMirror(projectId);\n}\n\nexport async function deleteProject(projectId: string): Promise<void> {\n const project = getProjectRecordById(projectId);\n if (!project) {\n throw new Error(\"Project not found\");\n }\n\n const agents = listTerminalRecords().filter(\n (agent) => agent.projectId === projectId || agent.projectPath === project.localPath\n );\n for (const agent of agents) {\n await deleteTerminal(agent.id);\n }\n\n for (const task of listScheduledTaskRecords().filter(\n (task) => task.projectId === projectId || task.projectPath === project.localPath\n )) {\n unregisterJob(task.id);\n deleteScheduledTaskRecord(task.id);\n }\n\n for (const automation of listAutomationRecords().filter(\n (record) =>\n record.agentProjectId === projectId ||\n record.agentProjectPath === project.localPath\n )) {\n deleteAutomationRecord(automation.id);\n }\n\n deleteKanbanStateForProject(projectId, project.localPath);\n removeProjectRecord(projectId);\n}\n\nexport async function createProject(\n input: ProjectCreateInput\n): Promise<ProjectRecord> {\n const repo = parseGitHubRepo(input.repoUrl, input.githubOwner, input.githubRepo);\n if (repo.githubOwner && repo.githubRepo) {\n const existingProject = findProjectRecordByGitHubRepo(\n repo.githubOwner,\n repo.githubRepo\n );\n if (existingProject) {\n throw new Error(\n `GitHub repository ${repo.githubOwner}/${repo.githubRepo} is already linked to ${existingProject.name}`\n );\n }\n }\n\n const slug = getUniqueSlug(input.name);\n const localPath = deriveLocalPath(input.localPath, input.name);\n\n if (repo.repoUrl) {\n cloneRepository(repo, localPath, input.defaultBranch);\n } else {\n fs.mkdirSync(localPath, { recursive: true });\n }\n\n const project = createProjectRecord({\n name: input.name.trim(),\n slug,\n repoUrl: repo.repoUrl,\n githubOwner: repo.githubOwner,\n githubRepo: repo.githubRepo,\n defaultBranch: input.defaultBranch?.trim() || null,\n localPath,\n status: \"ready\",\n lastSyncedAt: null,\n lastSyncError: null,\n });\n\n if (input.syncIssues && project.githubOwner && project.githubRepo) {\n try {\n await syncGitHubIssues(project.id);\n } catch {\n // Preserve the project and surface sync errors through lastSyncError.\n }\n }\n\n return (await getProjectById(project.id)) ?? project;\n}\n", "import cron from \"node-cron\";\nimport {\n createTerminal,\n createAutoSpawnTerminal,\n startTerminal,\n} from \"../agents/terminal-manager.js\";\nimport type { AgentProvider } from \"@maestro/wire\";\nimport {\n listScheduledTaskRecords,\n updateScheduledTaskRecord,\n} from \"../state/sqlite.js\";\nimport type { ScheduledTaskRecord } from \"../state/types.js\";\n\ninterface ScheduledJob {\n taskId: string;\n cronTask: ReturnType<typeof cron.schedule>;\n}\n\nconst activeJobs = new Map<string, ScheduledJob>();\n\nexport async function startScheduler() {\n const tasks = listScheduledTaskRecords().filter((task) => task.enabled);\n for (const task of tasks) {\n registerJob(task);\n }\n\n console.log(`Scheduler started with ${tasks.length} task(s)`);\n}\n\nexport function stopScheduler() {\n for (const [, job] of activeJobs) {\n job.cronTask.stop();\n }\n activeJobs.clear();\n console.log(\"Scheduler stopped\");\n}\n\nexport function registerJob(task: ScheduledTaskRecord) {\n unregisterJob(task.id);\n\n if (!cron.validate(task.schedule)) {\n console.error(`Invalid cron expression for task \"${task.name}\": ${task.schedule}`);\n return;\n }\n\n const cronTask = cron.schedule(task.schedule, async () => {\n console.log(`Scheduler: running task \"${task.name}\"`);\n await executeScheduledTask(task);\n });\n\n activeJobs.set(task.id, { taskId: task.id, cronTask });\n console.log(`Scheduler: registered task \"${task.name}\" with schedule \"${task.schedule}\"`);\n}\n\nexport function unregisterJob(taskId: string) {\n const existing = activeJobs.get(taskId);\n if (existing) {\n existing.cronTask.stop();\n activeJobs.delete(taskId);\n }\n}\n\nasync function executeScheduledTask(task: ScheduledTaskRecord) {\n try {\n const name = `scheduled-${task.name}-${Date.now()}`;\n const agent = task.provider === \"custom\"\n ? await createTerminal({\n name,\n kind: \"scheduler\",\n provider: task.provider as AgentProvider,\n projectId: task.projectId || undefined,\n projectPath: task.projectPath,\n customDisplayName: task.customDisplayName || undefined,\n customCommandTemplate: task.customCommandTemplate || undefined,\n customEnv: task.customEnv || undefined,\n skipPermissions: task.skipPermissions,\n })\n : await createAutoSpawnTerminal({\n name,\n kind: \"scheduler\",\n projectId: task.projectId || undefined,\n projectPath: task.projectPath,\n });\n\n await startTerminal(agent.id, task.prompt);\n updateScheduledTaskRecord(task.id, {\n lastRunAt: new Date().toISOString(),\n });\n\n console.log(`Scheduler: task \"${task.name}\" started agent ${agent.id}`);\n } catch (err) {\n console.error(`Scheduler: failed to run task \"${task.name}\":`, err);\n }\n}\n\nexport function cronToHuman(expression: string): string {\n const parts = expression.split(\" \");\n if (parts.length !== 5) return expression;\n\n const [min, hour, dom, month, dow] = parts;\n\n if (min === \"*\" && hour === \"*\") return \"Every minute\";\n if (hour === \"*\" && min !== \"*\") return `Every hour at :${min.padStart(2, \"0\")}`;\n if (dom === \"*\" && month === \"*\" && dow === \"*\") {\n if (min !== \"*\" && hour !== \"*\") {\n return `Daily at ${hour.padStart(2, \"0\")}:${min.padStart(2, \"0\")}`;\n }\n }\n\n return expression;\n}\n", "import type { FastifyInstance } from \"fastify\";\nimport { ProjectCreateInput } from \"@maestro/wire\";\nimport {\n createProject,\n deleteProject,\n getProjectById,\n listProjects,\n syncGitHubIssues,\n} from \"../projects/project-service.js\";\n\nexport async function registerProjectRoutes(app: FastifyInstance) {\n app.get(\"/api/projects\", async () => {\n const projects = await listProjects();\n return { projects };\n });\n\n app.get<{ Params: { id: string } }>(\"/api/projects/:id\", async (req, reply) => {\n const project = await getProjectById(req.params.id);\n if (!project) {\n return reply.status(404).send({ error: \"Project not found\" });\n }\n return { project };\n });\n\n app.post(\"/api/projects\", async (req, reply) => {\n try {\n const input = ProjectCreateInput.parse(req.body);\n const project = await createProject(input);\n return reply.status(201).send({ project });\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to create project\",\n });\n }\n });\n\n app.delete<{ Params: { id: string } }>(\"/api/projects/:id\", async (req, reply) => {\n try {\n await deleteProject(req.params.id);\n return { ok: true };\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Failed to delete project\";\n return reply.status(message === \"Project not found\" ? 404 : 400).send({\n error: message,\n });\n }\n });\n\n app.post<{ Params: { id: string } }>(\n \"/api/projects/:id/sync/github-issues\",\n async (req, reply) => {\n try {\n const result = await syncGitHubIssues(req.params.id);\n const project = await getProjectById(req.params.id);\n return { ok: true, ...result, project };\n } catch (err) {\n return reply.status(400).send({\n error:\n err instanceof Error ? err.message : \"Failed to sync GitHub issues\",\n });\n }\n }\n );\n}\n", "import type { FastifyInstance } from \"fastify\";\nimport type { Server as SocketServer } from \"socket.io\";\nimport { KanbanTaskCreate, KanbanTaskUpdate, KanbanColumn } from \"@maestro/wire\";\nimport {\n createKanbanTask,\n deleteKanbanTaskRecord,\n getKanbanTask,\n listKanbanTasks,\n moveKanbanTaskRecord,\n updateKanbanTaskRecord,\n} from \"../state/kanban.js\";\nimport { deleteTerminal } from \"../agents/terminal-manager.js\";\nimport { assertAutoSpawnProviderReady } from \"../agents/auto-spawn-provider.js\";\n\nexport async function registerKanbanRoutes(\n app: FastifyInstance,\n io: SocketServer\n) {\n app.get<{ Querystring: { column?: string; projectId?: string } }>(\n \"/api/kanban/tasks\",\n async (req) => {\n const tasks = await listKanbanTasks({\n column: req.query.column,\n projectId: req.query.projectId,\n });\n return { tasks };\n }\n );\n\n app.get<{ Params: { id: string } }>(\n \"/api/kanban/tasks/:id\",\n async (req, reply) => {\n const task = await getKanbanTask(req.params.id);\n if (!task) return reply.status(404).send({ error: \"Task not found\" });\n return { task };\n }\n );\n\n app.post(\"/api/kanban/tasks\", async (req, reply) => {\n try {\n const input = KanbanTaskCreate.parse(req.body);\n const task = await createKanbanTask(input);\n io.emit(\"kanban:updated\", { taskId: task.id, column: task.column });\n return reply.status(201).send({ task });\n } catch (err) {\n return reply\n .status(400)\n .send({ error: err instanceof Error ? err.message : \"Invalid input\" });\n }\n });\n\n app.patch<{ Params: { id: string } }>(\n \"/api/kanban/tasks/:id\",\n async (req, reply) => {\n try {\n const input = KanbanTaskUpdate.parse(req.body);\n const task = await updateKanbanTaskRecord(req.params.id, input);\n io.emit(\"kanban:updated\", {\n taskId: task.id,\n column: task.column,\n assignedTerminalId: task.assignedTerminalId,\n });\n return { task };\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to update task\",\n });\n }\n }\n );\n\n app.post<{ Params: { id: string }; Body: { column: string } }>(\n \"/api/kanban/tasks/:id/move\",\n async (req, reply) => {\n try {\n const column = KanbanColumn.parse((req.body as { column: string }).column);\n const currentTask = await getKanbanTask(req.params.id);\n if (!currentTask) {\n return reply.status(404).send({ error: \"Task not found\" });\n }\n\n if (currentTask.column === \"backlog\" && column === \"planned\") {\n assertAutoSpawnProviderReady();\n }\n\n if (currentTask.column === \"ongoing\" && column === \"planned\") {\n const terminalIds = Array.from(\n new Set(\n [\n currentTask.assignedTerminalId,\n ...(currentTask.terminals?.map((terminal) => terminal.id) ?? []),\n ].filter((terminalId): terminalId is string => Boolean(terminalId))\n )\n );\n\n for (const terminalId of terminalIds) {\n await deleteTerminal(terminalId);\n }\n }\n\n const task = await moveKanbanTaskRecord(req.params.id, column);\n io.emit(\"kanban:updated\", {\n taskId: task.id,\n column: task.column,\n assignedTerminalId: task.assignedTerminalId,\n });\n return { task };\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to move task\",\n });\n }\n }\n );\n\n app.delete<{ Params: { id: string } }>(\n \"/api/kanban/tasks/:id\",\n async (req, reply) => {\n try {\n await deleteKanbanTaskRecord(req.params.id);\n io.emit(\"kanban:updated\", { taskId: req.params.id });\n return { ok: true };\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to delete task\",\n });\n }\n }\n );\n}\n", "import type { Server as SocketServer, Socket } from \"socket.io\";\nimport { ClientEvents, TerminalAttachResponse } from \"@maestro/wire\";\nimport {\n getTerminalAttachment,\n getBufferedTerminalOutputSince,\n hasTerminal,\n sendTerminalInput,\n resizeTerminal,\n} from \"../agents/terminal-manager.js\";\nimport { sendSetupInput, resizeSetupPty, getSetupOutputBuffer, isSetupDone, startSetupPty, isSetupRunning, resetSetup } from \"../setup/setup-manager.js\";\n\nexport function registerSocketHandlers(io: SocketServer) {\n io.on(\"connection\", (socket: Socket) => {\n console.log(`Client connected: ${socket.id}`);\n\n socket.on(\"terminal:attach\", async (data, respond?: (payload: TerminalAttachResponse) => void) => {\n try {\n const { terminalId, cursor } = ClientEvents[\"terminal:attach\"].parse(data);\n if (!hasTerminal(terminalId)) {\n socket.emit(\"error\", { message: \"Terminal not found\" });\n return;\n }\n socket.join(`terminal:${terminalId}`);\n respond?.(TerminalAttachResponse.parse(await getTerminalAttachment(terminalId, cursor)));\n console.log(`Client ${socket.id} attached to terminal ${terminalId}`);\n } catch {\n socket.emit(\"error\", { message: \"Invalid attach payload\" });\n }\n });\n\n // Subscribe to terminal output stream\n socket.on(\"terminal:subscribe\", (data) => {\n try {\n const { terminalId, sinceSeq } = ClientEvents[\"terminal:subscribe\"].parse(data);\n if (!hasTerminal(terminalId)) {\n socket.emit(\"error\", { message: \"Terminal not found\" });\n return;\n }\n socket.join(`terminal:${terminalId}`);\n\n if (sinceSeq !== undefined) {\n for (const chunk of getBufferedTerminalOutputSince(terminalId, sinceSeq)) {\n socket.emit(\"terminal:output\", {\n terminalId,\n data: chunk.data,\n seq: chunk.seq,\n });\n }\n }\n\n console.log(`Client ${socket.id} subscribed to terminal ${terminalId}`);\n } catch {\n socket.emit(\"error\", { message: \"Invalid subscribe payload\" });\n }\n });\n\n // Unsubscribe from terminal output stream\n socket.on(\"terminal:unsubscribe\", (data) => {\n try {\n const { terminalId } = ClientEvents[\"terminal:unsubscribe\"].parse(data);\n socket.leave(`terminal:${terminalId}`);\n } catch {\n socket.emit(\"error\", { message: \"Invalid unsubscribe payload\" });\n }\n });\n\n // Forward keyboard input to terminal PTY\n socket.on(\"terminal:input\", (data) => {\n try {\n const { terminalId, data: inputData } =\n ClientEvents[\"terminal:input\"].parse(data);\n if (!hasTerminal(terminalId)) {\n socket.emit(\"error\", { message: \"Terminal not found\" });\n return;\n }\n sendTerminalInput(terminalId, inputData);\n } catch {\n socket.emit(\"error\", { message: \"Invalid input payload\" });\n }\n });\n\n // Resize terminal viewport\n socket.on(\"terminal:resize\", (data) => {\n try {\n const { terminalId, cols, rows } =\n ClientEvents[\"terminal:resize\"].parse(data);\n if (!hasTerminal(terminalId)) {\n socket.emit(\"error\", { message: \"Terminal not found\" });\n return;\n }\n resizeTerminal(terminalId, cols, rows);\n } catch {\n socket.emit(\"error\", { message: \"Invalid resize payload\" });\n }\n });\n\n // Setup terminal handlers\n socket.on(\"setup:subscribe\", (data) => {\n socket.join(\"setup\");\n console.log(`Client ${socket.id} subscribed to setup`);\n\n // If PTY is already running or done, replay buffered output\n const buffer = getSetupOutputBuffer();\n if (buffer.length > 0) {\n for (const chunk of buffer) {\n socket.emit(\"setup:output\", { data: chunk });\n }\n }\n if (isSetupDone()) {\n socket.emit(\"setup:complete\", {});\n }\n\n // Auto-start PTY if not already running/done, using client dimensions\n if (!isSetupRunning() && !isSetupDone()) {\n const cols = (data as { cols?: number })?.cols;\n const rows = (data as { rows?: number })?.rows;\n startSetupPty(io, cols, rows);\n }\n });\n\n socket.on(\"setup:unsubscribe\", () => {\n socket.leave(\"setup\");\n });\n\n socket.on(\"setup:input\", (data) => {\n try {\n const { data: inputData } = ClientEvents[\"setup:input\"].parse(data);\n sendSetupInput(inputData);\n } catch {\n socket.emit(\"error\", { message: \"Invalid setup input payload\" });\n }\n });\n\n socket.on(\"setup:resize\", (data) => {\n try {\n const { cols, rows } = ClientEvents[\"setup:resize\"].parse(data);\n resizeSetupPty(cols, rows);\n } catch {\n socket.emit(\"error\", { message: \"Invalid setup resize payload\" });\n }\n });\n\n socket.on(\"setup:restart\", (data) => {\n try {\n const { cols, rows } = ClientEvents[\"setup:restart\"].parse(data);\n console.log(`[setup] Restart requested by ${socket.id}`);\n resetSetup();\n startSetupPty(io, cols, rows);\n } catch {\n socket.emit(\"error\", { message: \"Invalid setup restart payload\" });\n }\n });\n\n // WhatsApp handlers\n socket.on(\"whatsapp:subscribe\", () => {\n socket.join(\"whatsapp\");\n console.log(`Client ${socket.id} subscribed to whatsapp`);\n });\n\n socket.on(\"whatsapp:unsubscribe\", () => {\n socket.leave(\"whatsapp\");\n });\n\n socket.on(\"disconnect\", () => {\n console.log(`Client disconnected: ${socket.id}`);\n });\n });\n}\n", "import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport * as pty from \"node-pty\";\nimport type { Server as SocketServer } from \"socket.io\";\n\nconst FLAG_DIR = path.join(os.homedir(), \".maestro\");\nconst FLAG_FILE = path.join(FLAG_DIR, \"setup-complete\");\nconst SENTINEL = \"__MAESTRO_SETUP_DONE__\";\n// Match URLs in PTY output. PTY data may contain ANSI escape codes interleaved\n// with the URL text, so we first strip all escape sequences before matching.\nconst URL_RE = /https?:\\/\\/[^\\s\"'<>]+/g;\nconst ANSI_RE = /\\x1b(?:\\][^\\x07\\x1b]*(?:\\x07|\\x1b\\\\)?|\\[[0-9;]*[A-Za-z])/g;\n// Detect prompts like \"Do you want to use Claude Code? (y/n)\" or \"Running:\"\n// which indicate a new step has started and any previous URL is stale.\nconst STEP_BOUNDARY_RE = /(?:Running:|Checking|Do you want|Enter|Paste|Token)/i;\nconst INSTALL_ROOT = process.env.MAESTRO_INSTALL_ROOT?.trim();\nconst SCRIPT_PATH = INSTALL_ROOT\n ? path.resolve(INSTALL_ROOT, \"assets/setup.sh\")\n : path.resolve(\n import.meta.dirname ?? __dirname,\n \"../../scripts/setup.sh\"\n );\n\nlet activePty: pty.IPty | null = null;\nlet running = false;\nlet outputBuffer: string[] = [];\nlet setupComplete = false;\n\nexport function isSetupComplete(): boolean {\n return fs.existsSync(FLAG_FILE);\n}\n\nexport function markSetupComplete(): void {\n fs.mkdirSync(FLAG_DIR, { recursive: true });\n fs.writeFileSync(FLAG_FILE, new Date().toISOString(), \"utf-8\");\n}\n\nexport function resetSetup(): void {\n if (fs.existsSync(FLAG_FILE)) {\n fs.unlinkSync(FLAG_FILE);\n }\n cleanup();\n resetOutputBuffer();\n}\n\nexport function isSetupRunning(): boolean {\n return running;\n}\n\nexport function startSetupPty(io: SocketServer, cols?: number, rows?: number): void {\n // Kill any stale PTY from a previous session\n if (activePty) {\n console.log(\"[setup] Killing stale PTY before starting new one\");\n cleanup();\n }\n\n // Clear buffer from any previous run\n outputBuffer = [];\n setupComplete = false;\n\n console.log(`[setup] Starting setup PTY, script: ${SCRIPT_PATH}`);\n console.log(`[setup] Script exists: ${fs.existsSync(SCRIPT_PATH)}`);\n console.log(`[setup] Requested dimensions: cols=${cols}, rows=${rows}`);\n\n running = true;\n\n // Ensure script is executable\n try {\n fs.chmodSync(SCRIPT_PATH, 0o755);\n } catch {\n // ignore if already executable\n }\n\n activePty = pty.spawn(\"bash\", [SCRIPT_PATH], {\n name: \"xterm-256color\",\n cols: cols ?? 120,\n rows: rows ?? 30,\n cwd: os.homedir(),\n env: process.env as Record<string, string>,\n });\n\n console.log(`[setup] PTY spawned, pid: ${activePty.pid}`);\n\n activePty.onData((data) => {\n const roomSize = io.sockets.adapter.rooms.get(\"setup\")?.size ?? 0;\n console.log(`[setup] PTY output (${data.length} bytes, ${roomSize} subscribers)`);\n outputBuffer.push(data);\n io.to(\"setup\").emit(\"setup:output\", { data });\n\n // Strip ANSI escape sequences before URL/boundary detection\n const clean = data.replace(ANSI_RE, \"\");\n\n // When a new step boundary is detected, clear any stale URL banner\n const hasUrl = URL_RE.test(clean);\n URL_RE.lastIndex = 0; // reset regex state\n if (!hasUrl && STEP_BOUNDARY_RE.test(clean)) {\n io.to(\"setup\").emit(\"setup:clear-url\", {});\n }\n\n // Detect URLs and emit them separately for the UI to show as clickable links\n const urls = clean.match(URL_RE);\n if (urls) {\n for (const url of urls) {\n io.to(\"setup\").emit(\"setup:url\", { url });\n }\n }\n\n if (data.includes(SENTINEL)) {\n setupComplete = true;\n markSetupComplete();\n io.to(\"setup\").emit(\"setup:complete\", {});\n cleanup();\n }\n });\n\n activePty.onExit(({ exitCode }) => {\n console.log(`[setup] PTY exited with code ${exitCode}`);\n cleanup();\n });\n}\n\nexport function getSetupOutputBuffer(): string[] {\n return outputBuffer;\n}\n\nexport function isSetupDone(): boolean {\n return setupComplete;\n}\n\nexport function sendSetupInput(data: string): void {\n activePty?.write(data);\n}\n\nexport function resizeSetupPty(cols: number, rows: number): void {\n activePty?.resize(cols, rows);\n}\n\nfunction cleanup(): void {\n if (activePty) {\n try {\n activePty.kill();\n } catch {\n // already dead\n }\n activePty = null;\n }\n running = false;\n}\n\nexport function resetOutputBuffer(): void {\n outputBuffer = [];\n setupComplete = false;\n}\n", "import type { Server as SocketServer } from \"socket.io\";\nimport { createAutoSpawnTerminal, startTerminal, deleteTerminal } from \"./terminal-manager.js\";\nimport { listKanbanTasks, updateKanbanTaskRecord } from \"../state/kanban.js\";\nimport { updateTerminalRecord } from \"../state/terminals.js\";\n\nconst POLL_INTERVAL = 10_000;\n\nlet timer: ReturnType<typeof setInterval> | null = null;\n\nexport function startKanbanAssigner(io: SocketServer) {\n console.log(\"Kanban assigner started (polling every 10s)\");\n timer = setInterval(() => tick(io), POLL_INTERVAL);\n void tick(io);\n}\n\nexport function stopKanbanAssigner() {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n}\n\nasync function tick(io: SocketServer) {\n try {\n const allTasks = await listKanbanTasks();\n const doneTaskIds = new Set(\n allTasks.filter((t) => t.column === \"done\").map((t) => t.id)\n );\n const plannedTasks = allTasks.filter((t) => t.column === \"planned\");\n const assignableTasks = plannedTasks.filter(\n (task) =>\n !task.assignedTerminalId &&\n task.blockedBy.every((id) => doneTaskIds.has(id))\n );\n if (assignableTasks.length === 0) return;\n\n for (const task of assignableTasks) {\n await assignTaskToTerminal(io, task);\n }\n } catch (err) {\n console.error(\"Kanban assigner error:\", err);\n }\n}\n\ninterface TaskLike {\n id: string;\n title: string;\n description: string;\n projectId?: string | null;\n projectPath: string;\n}\n\nasync function assignTaskToTerminal(\n io: SocketServer,\n task: TaskLike\n) {\n let terminalId: string | null = null;\n try {\n const terminal = await createAutoSpawnTerminal({\n kind: \"kanban\",\n projectId: task.projectId ?? undefined,\n projectPath: task.projectPath,\n });\n terminalId = terminal.id;\n\n await updateKanbanTaskRecord(task.id, {\n column: \"ongoing\",\n assignedTerminalId: terminalId,\n });\n\n updateTerminalRecord(terminalId, {\n kanbanTaskId: task.id,\n });\n\n const prompt = `Task: ${task.title}\\n\\n${task.description}`;\n await startTerminal(terminalId, prompt);\n\n io.emit(\"kanban:updated\", {\n taskId: task.id,\n column: \"ongoing\",\n assignedTerminalId: terminalId,\n });\n\n console.log(`Kanban: assigned task \"${task.title}\" to terminal ${terminalId}`);\n } catch (err) {\n if (terminalId) {\n try {\n await deleteTerminal(terminalId);\n } catch {\n // Best effort cleanup for partially created terminals.\n }\n }\n await updateKanbanTaskRecord(task.id, {\n column: \"planned\",\n assignedTerminalId: null,\n });\n io.emit(\"kanban:updated\", {\n taskId: task.id,\n column: \"planned\",\n assignedTerminalId: null,\n });\n console.error(`Failed to assign task ${task.id} to an auto-spawned terminal:`, err);\n }\n}\n", "import type { FastifyInstance } from \"fastify\";\nimport { registerJob, unregisterJob, cronToHuman } from \"../scheduler/scheduler.js\";\nimport { resolveProjectContext } from \"../projects/project-service.js\";\nimport {\n createScheduledTaskRecord,\n deleteScheduledTaskRecord,\n getScheduledTaskRecord,\n listScheduledTaskRecords,\n updateScheduledTaskRecord,\n} from \"../state/sqlite.js\";\nimport { getProjectRecordById } from \"../state/projects.js\";\n\nfunction withProject(task: ReturnType<typeof getScheduledTaskRecord>) {\n if (!task) return null;\n const project = task.projectId ? getProjectRecordById(task.projectId) : null;\n return {\n ...task,\n project: project ? { id: project.id, name: project.name } : null,\n };\n}\n\nexport async function registerSchedulerRoutes(app: FastifyInstance) {\n app.get(\"/api/scheduler/tasks\", async () => {\n const tasks = listScheduledTaskRecords().map((task) => ({\n ...withProject(task),\n scheduleHuman: cronToHuman(task.schedule),\n }));\n return { tasks };\n });\n\n app.get<{ Params: { id: string } }>(\n \"/api/scheduler/tasks/:id\",\n async (req, reply) => {\n const task = getScheduledTaskRecord(req.params.id);\n if (!task) return reply.status(404).send({ error: \"Task not found\" });\n return {\n task: {\n ...withProject(task),\n scheduleHuman: cronToHuman(task.schedule),\n },\n };\n }\n );\n\n app.post(\"/api/scheduler/tasks\", async (req, reply) => {\n try {\n const body = req.body as {\n name: string;\n prompt: string;\n schedule: string;\n projectId?: string;\n projectPath?: string;\n provider?: string;\n customDisplayName?: string;\n customCommandTemplate?: string;\n customEnv?: Record<string, string>;\n skipPermissions?: boolean;\n enabled?: boolean;\n };\n\n if (!body.name || !body.prompt || !body.schedule) {\n return reply\n .status(400)\n .send({ error: \"name, prompt, schedule, and projectId/projectPath are required\" });\n }\n\n const projectContext = await resolveProjectContext({\n projectId: body.projectId,\n projectPath: body.projectPath,\n });\n\n const task = createScheduledTaskRecord({\n name: body.name,\n prompt: body.prompt,\n schedule: body.schedule,\n projectId: projectContext.projectId,\n projectPath: projectContext.projectPath,\n provider: body.provider || \"claude\",\n customDisplayName: body.customDisplayName || null,\n customCommandTemplate: body.customCommandTemplate || null,\n customEnv: body.customEnv || null,\n skipPermissions: body.skipPermissions ?? true,\n enabled: body.enabled ?? true,\n lastRunAt: null,\n nextRunAt: null,\n });\n\n if (task.enabled) {\n registerJob(task);\n }\n\n return reply.status(201).send({ task: withProject(task) });\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to create task\",\n });\n }\n });\n\n app.patch<{ Params: { id: string } }>(\n \"/api/scheduler/tasks/:id\",\n async (req, reply) => {\n try {\n const body = req.body as Partial<{\n name: string;\n prompt: string;\n schedule: string;\n projectId: string;\n projectPath: string;\n provider: string;\n customDisplayName: string;\n customCommandTemplate: string;\n customEnv: Record<string, string>;\n skipPermissions: boolean;\n enabled: boolean;\n }>;\n\n const projectContext =\n body.projectId || body.projectPath\n ? await resolveProjectContext({\n projectId: body.projectId,\n projectPath: body.projectPath,\n })\n : null;\n\n const task = updateScheduledTaskRecord(req.params.id, {\n ...body,\n ...(projectContext\n ? {\n projectId: projectContext.projectId,\n projectPath: projectContext.projectPath,\n }\n : {}),\n });\n\n if (task.enabled) {\n registerJob(task);\n } else {\n unregisterJob(task.id);\n }\n\n return { task: withProject(task) };\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to update task\",\n });\n }\n }\n );\n\n app.delete<{ Params: { id: string } }>(\n \"/api/scheduler/tasks/:id\",\n async (req, reply) => {\n try {\n unregisterJob(req.params.id);\n deleteScheduledTaskRecord(req.params.id);\n return { ok: true };\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to delete task\",\n });\n }\n }\n );\n\n app.post<{ Params: { id: string } }>(\n \"/api/scheduler/tasks/:id/run\",\n async (req, reply) => {\n try {\n const task = getScheduledTaskRecord(req.params.id);\n if (!task) return reply.status(404).send({ error: \"Task not found\" });\n\n const { createTerminal, createAutoSpawnTerminal, startTerminal } = await import(\"../agents/terminal-manager.js\");\n\n const name = `manual-${task.name}-${Date.now()}`;\n const agent = task.provider === \"custom\"\n ? await createTerminal({\n name,\n kind: \"scheduler\",\n provider: task.provider as \"custom\",\n projectId: task.projectId || undefined,\n projectPath: task.projectPath,\n customDisplayName: task.customDisplayName || undefined,\n customCommandTemplate: task.customCommandTemplate || undefined,\n customEnv: task.customEnv || undefined,\n skipPermissions: task.skipPermissions,\n })\n : await createAutoSpawnTerminal({\n name,\n kind: \"scheduler\",\n projectId: task.projectId || undefined,\n projectPath: task.projectPath,\n });\n\n await startTerminal(agent.id, task.prompt);\n updateScheduledTaskRecord(task.id, {\n lastRunAt: new Date().toISOString(),\n });\n\n return { ok: true, terminalId: agent.id };\n } catch (err) {\n return reply.status(500).send({\n error: err instanceof Error ? err.message : \"Failed to run task\",\n });\n }\n }\n );\n}\n", "import type { FastifyInstance } from \"fastify\";\nimport { resolveProjectContext } from \"../projects/project-service.js\";\nimport {\n createAutomationRecord,\n deleteAutomationRecord,\n getAutomationRecord,\n listAutomationRecords,\n listAutomationRunRecords,\n updateAutomationRecord,\n} from \"../state/sqlite.js\";\nimport { getProjectRecordById } from \"../state/projects.js\";\n\nfunction withProject(automation: ReturnType<typeof getAutomationRecord>) {\n if (!automation) return null;\n const project = automation.agentProjectId\n ? getProjectRecordById(automation.agentProjectId)\n : null;\n return {\n ...automation,\n project: project ? { id: project.id, name: project.name } : null,\n runs: listAutomationRunRecords(automation.id, 5),\n };\n}\n\nexport async function registerAutomationRoutes(app: FastifyInstance) {\n app.get(\"/api/automations\", async () => {\n const automations = listAutomationRecords().map((automation) => withProject(automation));\n return { automations };\n });\n\n app.get<{ Params: { id: string } }>(\n \"/api/automations/:id\",\n async (req, reply) => {\n const auto = getAutomationRecord(req.params.id);\n if (!auto) return reply.status(404).send({ error: \"Automation not found\" });\n return {\n automation: {\n ...withProject(auto),\n runs: listAutomationRunRecords(auto.id, 20),\n },\n };\n }\n );\n\n app.post(\"/api/automations\", async (req, reply) => {\n try {\n const body = req.body as {\n name: string;\n description?: string;\n sourceType: string;\n sourceConfig: Record<string, string>;\n triggerType?: string;\n agentProjectId?: string;\n agentProjectPath?: string;\n agentPromptTemplate: string;\n agentProvider?: string;\n agentCustomDisplayName?: string;\n agentCustomCommandTemplate?: string;\n agentCustomEnv?: Record<string, string>;\n agentSkipPermissions?: boolean;\n pollIntervalMinutes?: number;\n };\n\n if (\n !body.name ||\n !body.sourceType ||\n !body.sourceConfig ||\n !body.agentPromptTemplate\n ) {\n return reply.status(400).send({\n error:\n \"name, sourceType, sourceConfig, agentProjectId/agentProjectPath, and agentPromptTemplate are required\",\n });\n }\n\n const projectContext = await resolveProjectContext({\n projectId: body.agentProjectId,\n projectPath: body.agentProjectPath,\n });\n\n const automation = createAutomationRecord({\n name: body.name,\n description: body.description || null,\n enabled: true,\n sourceType: body.sourceType,\n sourceConfig: body.sourceConfig,\n triggerType: body.triggerType || \"on_new\",\n agentProjectId: projectContext.projectId,\n agentProjectPath: projectContext.projectPath,\n agentPromptTemplate: body.agentPromptTemplate,\n agentProvider: body.agentProvider || \"claude\",\n agentCustomDisplayName: body.agentCustomDisplayName || null,\n agentCustomCommandTemplate: body.agentCustomCommandTemplate || null,\n agentCustomEnv: body.agentCustomEnv || null,\n agentSkipPermissions: body.agentSkipPermissions ?? true,\n pollIntervalMinutes: body.pollIntervalMinutes || 5,\n lastPollAt: null,\n processedHashes: [],\n });\n\n return reply.status(201).send({ automation: withProject(automation) });\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to create automation\",\n });\n }\n });\n\n app.patch<{ Params: { id: string } }>(\n \"/api/automations/:id\",\n async (req, reply) => {\n try {\n const body = req.body as Record<string, unknown> & {\n agentProjectId?: string;\n agentProjectPath?: string;\n };\n const projectContext =\n body.agentProjectId || body.agentProjectPath\n ? await resolveProjectContext({\n projectId: body.agentProjectId,\n projectPath: body.agentProjectPath,\n })\n : null;\n\n const automation = updateAutomationRecord(req.params.id, {\n ...body,\n ...(projectContext\n ? {\n agentProjectId: projectContext.projectId,\n agentProjectPath: projectContext.projectPath,\n }\n : {}),\n });\n\n return { automation: withProject(automation) };\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to update automation\",\n });\n }\n }\n );\n\n app.delete<{ Params: { id: string } }>(\n \"/api/automations/:id\",\n async (req, reply) => {\n try {\n deleteAutomationRecord(req.params.id);\n return { ok: true };\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to delete automation\",\n });\n }\n }\n );\n\n app.get<{ Params: { id: string }; Querystring: { limit?: string } }>(\n \"/api/automations/:id/runs\",\n async (req) => {\n const limit = parseInt(req.query.limit || \"20\", 10);\n return { runs: listAutomationRunRecords(req.params.id, limit) };\n }\n );\n\n app.post<{ Params: { id: string } }>(\n \"/api/automations/:id/reset\",\n async (req, reply) => {\n try {\n updateAutomationRecord(req.params.id, {\n processedHashes: [],\n lastPollAt: null,\n });\n return { ok: true };\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to reset\",\n });\n }\n }\n );\n}\n", "import crypto from \"crypto\";\nimport { createTerminal, startTerminal } from \"../agents/terminal-manager.js\";\nimport type { AgentProvider } from \"@maestro/wire\";\nimport {\n createAutomationRunRecord,\n listAutomationRecords,\n updateAutomationRecord,\n updateAutomationRunRecord,\n} from \"../state/sqlite.js\";\nimport { runGitHubApi } from \"../integrations/github.js\";\nimport type { AutomationRecord } from \"../state/types.js\";\n\nlet timer: ReturnType<typeof setInterval> | null = null;\n\nexport function startAutomationRunner() {\n timer = setInterval(tick, 60_000);\n console.log(\"Automation runner started (checking every 60s)\");\n}\n\nexport function stopAutomationRunner() {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n}\n\nasync function tick() {\n try {\n const automations = listAutomationRecords().filter((automation) => automation.enabled);\n const now = new Date();\n\n for (const auto of automations) {\n if (auto.lastPollAt) {\n const elapsed =\n (now.getTime() - new Date(auto.lastPollAt).getTime()) / 60_000;\n if (elapsed < auto.pollIntervalMinutes) continue;\n }\n\n await runAutomation(auto);\n }\n } catch (err) {\n console.error(\"Automation runner tick error:\", err);\n }\n}\n\nasync function runAutomation(auto: AutomationRecord) {\n const run = createAutomationRunRecord({\n automationId: auto.id,\n status: \"running\",\n itemsFound: 0,\n itemsProcessed: 0,\n error: null,\n agentId: null,\n startedAt: new Date().toISOString(),\n completedAt: null,\n });\n\n try {\n const items = await fetchItems(auto.sourceType, auto.sourceConfig);\n\n updateAutomationRunRecord(run.id, { itemsFound: items.length });\n\n let processed = 0;\n let processedHashes = [...auto.processedHashes];\n\n for (const item of items) {\n const hash = hashItem(item);\n if (processedHashes.includes(hash)) continue;\n\n const prompt = renderTemplate(auto.agentPromptTemplate, item);\n const agent = await createTerminal({\n name: `auto-${auto.name}-${Date.now()}`,\n kind: \"automation\",\n provider: auto.agentProvider as AgentProvider,\n projectId: auto.agentProjectId || undefined,\n projectPath: auto.agentProjectPath,\n customDisplayName: auto.agentCustomDisplayName || undefined,\n customCommandTemplate: auto.agentCustomCommandTemplate || undefined,\n customEnv: auto.agentCustomEnv || undefined,\n skipPermissions: auto.agentSkipPermissions,\n });\n\n await startTerminal(agent.id, prompt);\n\n processedHashes = [...processedHashes, hash];\n updateAutomationRecord(auto.id, {\n processedHashes,\n });\n\n processed += 1;\n updateAutomationRunRecord(run.id, {\n itemsProcessed: processed,\n agentId: agent.id,\n });\n }\n\n updateAutomationRecord(auto.id, {\n lastPollAt: new Date().toISOString(),\n processedHashes,\n });\n\n updateAutomationRunRecord(run.id, {\n status: \"completed\",\n completedAt: new Date().toISOString(),\n });\n\n if (processed > 0) {\n console.log(`Automation \"${auto.name}\": processed ${processed}/${items.length} items`);\n }\n } catch (err) {\n console.error(`Automation \"${auto.name}\" error:`, err);\n updateAutomationRunRecord(run.id, {\n status: \"error\",\n error: err instanceof Error ? err.message : String(err),\n completedAt: new Date().toISOString(),\n });\n }\n}\n\ninterface SourceItem {\n id: string;\n title: string;\n body: string;\n url: string;\n author?: string;\n labels?: string[];\n [key: string]: unknown;\n}\n\nasync function fetchItems(\n sourceType: string,\n config: Record<string, string>\n): Promise<SourceItem[]> {\n switch (sourceType) {\n case \"github_issues\":\n return fetchGitHubIssues(config);\n case \"github_prs\":\n return fetchGitHubPRs(config);\n case \"webhook\":\n return [];\n case \"rss\":\n return fetchRSS(config);\n default:\n console.warn(`Unknown source type: ${sourceType}`);\n return [];\n }\n}\n\nasync function fetchGitHubIssues(\n config: Record<string, string>\n): Promise<SourceItem[]> {\n const { owner, repo, token, state = \"open\", labels } = config;\n if (!owner || !repo) return [];\n\n const params = new URLSearchParams({ state, per_page: \"20\" });\n if (labels) params.set(\"labels\", labels);\n\n const data = runGitHubApi<\n Array<{\n number: number;\n title: string;\n body: string;\n html_url: string;\n user: { login: string };\n labels: Array<{ name: string }>;\n pull_request?: unknown;\n }>\n >(`repos/${owner}/${repo}/issues?${params.toString()}`, { token });\n\n return data\n .filter((item) => !item.pull_request)\n .map((item) => ({\n id: String(item.number),\n title: item.title,\n body: item.body || \"\",\n url: item.html_url,\n author: item.user.login,\n labels: item.labels.map((label) => label.name),\n }));\n}\n\nasync function fetchGitHubPRs(\n config: Record<string, string>\n): Promise<SourceItem[]> {\n const { owner, repo, token, state = \"open\" } = config;\n if (!owner || !repo) return [];\n\n const data = runGitHubApi<\n Array<{\n number: number;\n title: string;\n body: string;\n html_url: string;\n user: { login: string };\n labels: Array<{ name: string }>;\n }>\n >(`repos/${owner}/${repo}/pulls?state=${state}&per_page=20`, { token });\n\n return data.map((item) => ({\n id: String(item.number),\n title: item.title,\n body: item.body || \"\",\n url: item.html_url,\n author: item.user.login,\n labels: item.labels.map((label) => label.name),\n }));\n}\n\nasync function fetchRSS(\n config: Record<string, string>\n): Promise<SourceItem[]> {\n const { url } = config;\n if (!url) return [];\n\n const res = await fetch(url);\n if (!res.ok) return [];\n\n const xml = await res.text();\n const items: SourceItem[] = [];\n const itemRegex = /<item>([\\s\\S]*?)<\\/item>/g;\n let match: RegExpExecArray | null;\n\n while ((match = itemRegex.exec(xml)) !== null) {\n const content = match[1];\n const title = content.match(/<title>([\\s\\S]*?)<\\/title>/)?.[1] || \"\";\n const link = content.match(/<link>([\\s\\S]*?)<\\/link>/)?.[1] || \"\";\n const desc =\n content.match(/<description>([\\s\\S]*?)<\\/description>/)?.[1] || \"\";\n\n items.push({\n id: link || title,\n title: title.replace(/<!\\[CDATA\\[(.*?)\\]\\]>/, \"$1\"),\n body: desc.replace(/<!\\[CDATA\\[(.*?)\\]\\]>/, \"$1\"),\n url: link,\n });\n }\n\n return items;\n}\n\nfunction hashItem(item: SourceItem): string {\n return crypto\n .createHash(\"sha256\")\n .update(`${item.id}:${item.title}`)\n .digest(\"hex\")\n .slice(0, 16);\n}\n\nfunction renderTemplate(template: string, item: SourceItem): string {\n return template.replace(/\\{\\{\\s*item\\.(\\w+)\\s*\\}\\}/g, (_, key: string) => {\n const val = item[key];\n if (val == null) return \"\";\n if (Array.isArray(val)) return val.join(\", \");\n return String(val);\n });\n}\n", "import * as crypto from \"crypto\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport jwt from \"jsonwebtoken\";\nimport type { FastifyInstance, FastifyRequest, FastifyReply } from \"fastify\";\n\nconst MAESTRO_DIR = path.join(os.homedir(), \".maestro\");\nconst SECRET_PATH = path.join(MAESTRO_DIR, \"jwt-secret\");\nconst TOKEN_PATH = path.join(MAESTRO_DIR, \"api-token\");\n\nlet jwtSecret: string;\n\n/**\n * Initialize auth \u2014 generate or load JWT secret and initial API token.\n * Returns the API token for display on first run.\n */\nexport function initAuth(): { apiToken: string } {\n if (!fs.existsSync(MAESTRO_DIR)) {\n fs.mkdirSync(MAESTRO_DIR, { recursive: true });\n }\n\n // JWT secret\n if (fs.existsSync(SECRET_PATH)) {\n jwtSecret = fs.readFileSync(SECRET_PATH, \"utf-8\").trim();\n } else {\n jwtSecret = crypto.randomBytes(48).toString(\"base64\");\n fs.writeFileSync(SECRET_PATH, jwtSecret, { mode: 0o600 });\n }\n\n // API token (static bearer token for simple auth)\n let apiToken: string;\n if (fs.existsSync(TOKEN_PATH)) {\n apiToken = fs.readFileSync(TOKEN_PATH, \"utf-8\").trim();\n } else {\n apiToken = `sym_${crypto.randomBytes(32).toString(\"hex\")}`;\n fs.writeFileSync(TOKEN_PATH, apiToken, { mode: 0o600 });\n console.log(`\\nAPI token generated: ${apiToken}`);\n console.log(`Stored at: ${TOKEN_PATH}\\n`);\n }\n\n return { apiToken };\n}\n\n/**\n * Create a short-lived JWT for WebSocket auth.\n */\nexport function createSessionToken(payload: {\n sub?: string;\n scope?: string;\n}): string {\n return jwt.sign(payload, jwtSecret, { expiresIn: \"24h\" });\n}\n\n/**\n * Verify a JWT token.\n */\nexport function verifySessionToken(\n token: string\n): { sub?: string; scope?: string } | null {\n try {\n return jwt.verify(token, jwtSecret) as { sub?: string; scope?: string };\n } catch {\n return null;\n }\n}\n\n/**\n * Get the stored API token.\n */\nexport function getApiToken(): string {\n if (fs.existsSync(TOKEN_PATH)) {\n return fs.readFileSync(TOKEN_PATH, \"utf-8\").trim();\n }\n return \"\";\n}\n\n/**\n * Fastify auth middleware \u2014 checks Bearer token or skips for health endpoint.\n */\nexport function registerAuthHook(app: FastifyInstance) {\n const apiToken = getApiToken();\n\n // Skip auth if no token exists (dev mode) or AUTH_DISABLED=1\n if (!apiToken || process.env.AUTH_DISABLED === \"1\") {\n console.log(\"Auth: disabled (no token or AUTH_DISABLED=1)\");\n return;\n }\n\n app.addHook(\n \"onRequest\",\n async (request: FastifyRequest, reply: FastifyReply) => {\n // Skip auth for health and token exchange endpoints\n const url = request.url;\n if (url === \"/health\" || url === \"/api/auth/token\" || url === \"/api/webhooks/github\") {\n return;\n }\n\n const authHeader = request.headers.authorization;\n if (!authHeader) {\n return reply.status(401).send({ error: \"Missing authorization header\" });\n }\n\n const [scheme, token] = authHeader.split(\" \");\n\n if (scheme === \"Bearer\" && token === apiToken) {\n return; // Valid API token\n }\n\n if (scheme === \"Bearer\" && token) {\n // Try JWT\n const payload = verifySessionToken(token);\n if (payload) return;\n }\n\n return reply.status(401).send({ error: \"Invalid token\" });\n }\n );\n\n console.log(\"Auth: enabled (Bearer token required)\");\n}\n\n/**\n * Auth routes \u2014 exchange API token for session JWT, get token info.\n */\nexport async function registerAuthRoutes(app: FastifyInstance) {\n // Exchange API token for a session JWT (useful for WebSocket auth)\n app.post(\"/api/auth/token\", async (req, reply) => {\n const body = req.body as { apiToken?: string };\n const storedToken = getApiToken();\n\n if (!body.apiToken || body.apiToken !== storedToken) {\n return reply.status(401).send({ error: \"Invalid API token\" });\n }\n\n const sessionToken = createSessionToken({ scope: \"full\" });\n return { token: sessionToken, expiresIn: \"24h\" };\n });\n}\n", "import { listAutomationRecords } from \"../state/sqlite.js\";\nimport { listProjectRecords } from \"../state/projects.js\";\nimport { resolveGitHubToken } from \"../integrations/github.js\";\n\nexport interface RuntimeStatus {\n github: {\n tokenConfigured: boolean;\n githubProjectCount: number;\n githubAutomationCount: number;\n featuresEnabled: boolean;\n needsAuthWarning: boolean;\n warningMessage: string | null;\n };\n}\n\nexport function getRuntimeStatus(): RuntimeStatus {\n const githubProjectCount = listProjectRecords().filter(\n (project) => Boolean(project.githubOwner && project.githubRepo)\n ).length;\n const githubAutomationCount = listAutomationRecords().filter((automation) =>\n automation.sourceType === \"github_issues\" || automation.sourceType === \"github_prs\"\n ).length;\n const tokenConfigured = Boolean(resolveGitHubToken().token);\n const featuresEnabled = githubProjectCount > 0 || githubAutomationCount > 0;\n const needsAuthWarning = featuresEnabled && !tokenConfigured;\n\n return {\n github: {\n tokenConfigured,\n githubProjectCount,\n githubAutomationCount,\n featuresEnabled,\n needsAuthWarning,\n warningMessage: needsAuthWarning\n ? \"GitHub-backed projects or automations are configured, but GITHUB_TOKEN/GH_TOKEN is missing.\"\n : null,\n },\n };\n}\n", "import type { FastifyInstance } from \"fastify\";\nimport { getRuntimeStatus } from \"../runtime/runtime-status.js\";\n\nexport async function registerSystemRoutes(app: FastifyInstance) {\n app.get(\"/api/system/status\", async () => {\n return getRuntimeStatus();\n });\n}\n", "import type { FastifyInstance } from \"fastify\";\nimport {\n getClaudeAuthStatus,\n getCodexAuthStatus,\n startCodexDeviceAuth,\n connectCodexWithApiKey,\n} from \"../integrations/cli-auth.js\";\nimport {\n getCachedClaudeAuthStatus,\n getCachedCodexAuthStatus,\n refreshAuthStatus,\n} from \"../services/auth-status-checker.js\";\n\nexport async function registerCliAuthRoutes(app: FastifyInstance) {\n // \u2500\u2500\u2500 Claude Code \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n app.get(\"/api/integrations/claude/status\", async (req) => {\n const fresh = (req.query as Record<string, string>).fresh === \"1\";\n if (fresh) return getClaudeAuthStatus();\n return getCachedClaudeAuthStatus() ?? getClaudeAuthStatus();\n });\n\n // \u2500\u2500\u2500 Codex \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n app.get(\"/api/integrations/codex/status\", async (req) => {\n const fresh = (req.query as Record<string, string>).fresh === \"1\";\n if (fresh) return getCodexAuthStatus();\n return getCachedCodexAuthStatus() ?? getCodexAuthStatus();\n });\n\n // \u2500\u2500\u2500 Refresh all auth status \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n app.post(\"/api/integrations/auth/refresh\", async () => {\n await refreshAuthStatus();\n return { ok: true };\n });\n\n app.post(\"/api/integrations/codex/device-auth/start\", async (_req, reply) => {\n try {\n const result = await startCodexDeviceAuth();\n return result;\n } catch (error) {\n return reply.status(400).send({\n error: error instanceof Error ? error.message : \"Failed to start codex device auth\",\n });\n }\n });\n\n app.post(\"/api/integrations/codex/connect-api-key\", async (req, reply) => {\n try {\n const body = req.body as { apiKey?: string };\n if (!body.apiKey?.trim()) {\n return reply.status(400).send({ error: \"API key is required\" });\n }\n const status = connectCodexWithApiKey(body.apiKey.trim());\n return status;\n } catch (error) {\n return reply.status(400).send({\n error: error instanceof Error ? error.message : \"Failed to connect with API key\",\n });\n }\n });\n}\n", "import type { FastifyInstance } from \"fastify\";\nimport {\n connectGitHubToken,\n disconnectGitHubToken,\n getGitHubConnectionStatus,\n searchGitHubRepositories,\n} from \"../integrations/github.js\";\nimport { getCachedGitHubConnectionStatus } from \"../services/auth-status-checker.js\";\n\nexport async function registerGitHubIntegrationRoutes(app: FastifyInstance) {\n app.get(\"/api/integrations/github\", async (req) => {\n const fresh = (req.query as Record<string, string>).fresh === \"1\";\n if (fresh) {\n const github = await getGitHubConnectionStatus();\n return { github };\n }\n const cached = getCachedGitHubConnectionStatus();\n const github = cached ?? await getGitHubConnectionStatus();\n return { github };\n });\n\n app.post(\"/api/integrations/github/connect\", async (req, reply) => {\n try {\n const body = req.body as { token?: string };\n const github = await connectGitHubToken(body.token ?? \"\");\n return { github };\n } catch (error) {\n return reply.status(400).send({\n error: error instanceof Error ? error.message : \"Failed to connect GitHub\",\n });\n }\n });\n\n app.delete(\"/api/integrations/github/connect\", async () => {\n const github = disconnectGitHubToken();\n return { ok: true, github };\n });\n\n app.get<{ Querystring: { q?: string } }>(\n \"/api/integrations/github/repos\",\n async (req, reply) => {\n try {\n const repos = await searchGitHubRepositories(req.query.q ?? \"\");\n return { repos };\n } catch (error) {\n return reply.status(400).send({\n error: error instanceof Error ? error.message : \"Failed to load repositories\",\n });\n }\n }\n );\n}\n", "import crypto from \"crypto\";\nimport type { FastifyInstance } from \"fastify\";\nimport type { Server as SocketServer } from \"socket.io\";\nimport {\n handleGitHubIssueWebhookEvent,\n handleGitHubPullRequestWebhookEvent,\n handleGitHubPullRequestReviewCommentWebhookEvent,\n handleGitHubPullRequestReviewWebhookEvent,\n} from \"../state/kanban.js\";\nimport { findProjectRecordByGitHubRepo } from \"../state/projects.js\";\n\ninterface GitHubWebhookBody {\n action?: string;\n repository?: {\n name?: string;\n owner?: {\n login?: string;\n };\n };\n issue?: {\n number: number;\n pull_request?: unknown;\n };\n pull_request?: {\n number: number;\n html_url: string;\n body?: string | null;\n merged?: boolean;\n };\n review?: {\n state?: string | null;\n body?: string | null;\n };\n}\n\nfunction verifySignature(rawBody: Buffer, signature: string, secret: string): boolean {\n const expected = `sha256=${crypto\n .createHmac(\"sha256\", secret)\n .update(rawBody)\n .digest(\"hex\")}`;\n\n const expectedBuffer = Buffer.from(expected);\n const providedBuffer = Buffer.from(signature);\n if (expectedBuffer.length !== providedBuffer.length) {\n return false;\n }\n\n return crypto.timingSafeEqual(expectedBuffer, providedBuffer);\n}\n\nexport async function registerWebhookRoutes(app: FastifyInstance, io: SocketServer) {\n app.post(\"/api/webhooks/github\", async (req, reply) => {\n const secret = process.env.GITHUB_WEBHOOK_SECRET?.trim();\n if (!secret) {\n return reply.status(503).send({\n error: \"GITHUB_WEBHOOK_SECRET is not configured\",\n });\n }\n\n const signature = req.headers[\"x-hub-signature-256\"];\n if (typeof signature !== \"string\" || !req.rawBody) {\n return reply.status(401).send({ error: \"Missing GitHub signature\" });\n }\n\n if (!verifySignature(req.rawBody, signature, secret)) {\n return reply.status(401).send({ error: \"Invalid GitHub signature\" });\n }\n\n const event = req.headers[\"x-github-event\"];\n if (event === \"ping\") {\n return { ok: true, event: \"ping\" };\n }\n\n const body = req.body as GitHubWebhookBody;\n const owner = body.repository?.owner?.login;\n const repo = body.repository?.name;\n if (!owner || !repo) {\n return { ok: true, ignored: true, reason: \"Repository payload missing\" };\n }\n\n const project = findProjectRecordByGitHubRepo(owner, repo);\n if (!project) {\n return { ok: true, ignored: true, reason: \"No matching project\" };\n }\n\n if (event === \"issues\" && body.issue && !body.issue.pull_request) {\n const result = handleGitHubIssueWebhookEvent(\n project.id,\n body.action ?? \"\",\n body.issue.number\n );\n io.emit(\"kanban:updated\", { taskId: result.taskId });\n return { ok: true, handled: true, projectId: project.id, taskId: result.taskId };\n }\n\n if (event === \"pull_request\" && body.pull_request) {\n const result = handleGitHubPullRequestWebhookEvent(project.id, body.action ?? \"\", {\n number: body.pull_request.number,\n htmlUrl: body.pull_request.html_url,\n body: body.pull_request.body,\n merged: body.pull_request.merged,\n });\n\n if (result.taskId) {\n io.emit(\"kanban:updated\", { taskId: result.taskId });\n }\n\n return {\n ok: true,\n handled: Boolean(result.taskId),\n projectId: project.id,\n taskId: result.taskId,\n };\n }\n\n if (event === \"pull_request_review\" && body.pull_request) {\n const result = await handleGitHubPullRequestReviewWebhookEvent(\n project.id,\n body.action ?? \"\",\n {\n state: body.review?.state,\n },\n {\n body: body.pull_request.body,\n }\n );\n\n if (result.taskId) {\n io.emit(\"kanban:updated\", { taskId: result.taskId });\n }\n\n return {\n ok: true,\n handled: Boolean(result.taskId),\n projectId: project.id,\n taskId: result.taskId,\n };\n }\n\n if (event === \"pull_request_review_comment\" && body.pull_request) {\n const result = await handleGitHubPullRequestReviewCommentWebhookEvent(\n project.id,\n body.action ?? \"\",\n {\n body: body.pull_request.body,\n }\n );\n\n if (result.taskId) {\n io.emit(\"kanban:updated\", { taskId: result.taskId });\n }\n\n return {\n ok: true,\n handled: Boolean(result.taskId),\n projectId: project.id,\n taskId: result.taskId,\n };\n }\n\n return { ok: true, ignored: true, reason: `Unhandled event: ${String(event ?? \"unknown\")}` };\n });\n}\n", "import type { FastifyInstance } from \"fastify\";\nimport { SettingsUpdateSchema } from \"@maestro/wire\";\nimport { getSettings, updateSettings } from \"../state/settings.js\";\nimport {\n getUpdateStatus,\n checkForUpdates,\n performUpdate,\n restartAutoUpdater,\n} from \"../services/auto-updater.js\";\nimport { writePiModelsConfig } from \"../services/ollama.js\";\n\nexport async function registerSettingsRoutes(app: FastifyInstance) {\n // Get current settings\n app.get(\"/api/settings\", async () => {\n return getSettings();\n });\n\n // Update settings\n app.patch(\"/api/settings\", async (req, reply) => {\n const parsed = SettingsUpdateSchema.safeParse(req.body);\n if (!parsed.success) {\n return reply.status(400).send({ error: parsed.error.flatten() });\n }\n\n const settings = updateSettings(parsed.data);\n\n // Restart the auto-updater timer if settings changed\n restartAutoUpdater();\n\n // Write Pi's models.json when Ollama model is configured\n if (parsed.data.piOllamaModel) {\n writePiModelsConfig(parsed.data.piOllamaModel);\n }\n\n return settings;\n });\n\n // Get Deepgram API key for client-side voice input\n app.get(\"/api/settings/deepgram-key\", async (_req, reply) => {\n const settings = getSettings();\n if (!settings.deepgramApiKey) {\n return reply.status(404).send({ error: \"Deepgram API key not configured\" });\n }\n return { apiKey: settings.deepgramApiKey };\n });\n\n // Get update status (installed versions, available updates)\n app.get(\"/api/settings/update-status\", async () => {\n return getUpdateStatus();\n });\n\n // Manually check for updates (does not install)\n app.post(\"/api/settings/check-updates\", async () => {\n await checkForUpdates();\n return getUpdateStatus();\n });\n\n // Manually trigger update now\n app.post(\"/api/settings/update-now\", async () => {\n const result = await performUpdate();\n return {\n ...result,\n status: getUpdateStatus(),\n };\n });\n}\n", "import { execSync } from \"child_process\";\nimport { getSettings } from \"../state/settings.js\";\nimport type { UpdateStatus } from \"@maestro/wire\";\n\nlet checkTimer: ReturnType<typeof setInterval> | null = null;\nlet updating = false;\nlet lastCheckAt: string | null = null;\nlet lastUpdateAt: string | null = null;\nlet lastError: string | null = null;\n\nlet cachedStatus: {\n claude: { current: string | null; latest: string | null };\n codex: { current: string | null; latest: string | null };\n gh: { current: string | null; latest: string | null };\n} = {\n claude: { current: null, latest: null },\n codex: { current: null, latest: null },\n gh: { current: null, latest: null },\n};\n\nfunction run(cmd: string): string {\n try {\n return execSync(cmd, { encoding: \"utf8\", timeout: 60_000 }).trim();\n } catch {\n return \"\";\n }\n}\n\nfunction getInstalledVersionViaCli(binary: string): string | null {\n const output = run(`${binary} --version 2>/dev/null`);\n if (!output) return null;\n // Extract version number from output like \"2.1.72 (Claude Code)\" or \"codex-cli 0.114.0\"\n const match = output.match(/(\\d+\\.\\d+\\.\\d+(?:-[\\w.]+)?)/);\n return match?.[1] ?? null;\n}\n\nfunction getInstalledVersion(pkg: string, binary: string): string | null {\n // First try the CLI binary directly \u2014 works regardless of install method\n const cliVersion = getInstalledVersionViaCli(binary);\n if (cliVersion) return cliVersion;\n\n // Fallback to npm list for npm-global installs\n const output = run(`npm list -g ${pkg} --depth=0 --json 2>/dev/null`);\n if (!output) return null;\n try {\n const data = JSON.parse(output);\n return data.dependencies?.[pkg]?.version ?? null;\n } catch {\n return null;\n }\n}\n\nfunction getLatestVersion(pkg: string): string | null {\n const output = run(`npm view ${pkg} version 2>/dev/null`);\n return output || null;\n}\n\nfunction getGhLatestVersion(): string | null {\n const output = run(`gh api repos/cli/cli/releases/latest --jq '.tag_name' 2>/dev/null`);\n if (!output) return null;\n const match = output.match(/(\\d+\\.\\d+\\.\\d+(?:-[\\w.]+)?)/);\n return match?.[1] ?? null;\n}\n\nfunction updatePackage(pkg: string, binary: string): { success: boolean; version: string | null; error: string | null } {\n try {\n execSync(`npm install -g ${pkg}@latest`, {\n encoding: \"utf8\",\n timeout: 120_000,\n stdio: \"pipe\",\n });\n const newVersion = getInstalledVersion(pkg, binary);\n return { success: true, version: newVersion, error: null };\n } catch (err) {\n return {\n success: false,\n version: null,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\nexport async function checkForUpdates(): Promise<void> {\n if (updating) return;\n\n try {\n const claudeCurrent = getInstalledVersion(\"@anthropic-ai/claude-code\", \"claude\");\n const claudeLatest = getLatestVersion(\"@anthropic-ai/claude-code\");\n const codexCurrent = getInstalledVersion(\"@openai/codex\", \"codex\");\n const codexLatest = getLatestVersion(\"@openai/codex\");\n const ghCurrent = getInstalledVersionViaCli(\"gh\");\n const ghLatest = getGhLatestVersion();\n\n cachedStatus = {\n claude: { current: claudeCurrent, latest: claudeLatest },\n codex: { current: codexCurrent, latest: codexLatest },\n gh: { current: ghCurrent, latest: ghLatest },\n };\n\n lastCheckAt = new Date().toISOString();\n lastError = null;\n } catch (err) {\n lastError = err instanceof Error ? err.message : String(err);\n }\n}\n\nexport async function performUpdate(): Promise<{ claude: string | null; codex: string | null; errors: string[] }> {\n if (updating) {\n return { claude: null, codex: null, errors: [\"Update already in progress\"] };\n }\n\n updating = true;\n const errors: string[] = [];\n let claudeVersion: string | null = null;\n let codexVersion: string | null = null;\n\n try {\n // Update Claude Code\n const claudeResult = updatePackage(\"@anthropic-ai/claude-code\", \"claude\");\n if (claudeResult.success) {\n claudeVersion = claudeResult.version;\n console.log(`[auto-updater] Claude Code updated to ${claudeVersion}`);\n } else if (claudeResult.error) {\n errors.push(`Claude Code: ${claudeResult.error}`);\n console.error(`[auto-updater] Failed to update Claude Code: ${claudeResult.error}`);\n }\n\n // Update Codex\n const codexResult = updatePackage(\"@openai/codex\", \"codex\");\n if (codexResult.success) {\n codexVersion = codexResult.version;\n console.log(`[auto-updater] Codex updated to ${codexVersion}`);\n } else if (codexResult.error) {\n errors.push(`Codex: ${codexResult.error}`);\n console.error(`[auto-updater] Failed to update Codex: ${codexResult.error}`);\n }\n\n lastUpdateAt = new Date().toISOString();\n lastError = errors.length > 0 ? errors.join(\"; \") : null;\n\n // Refresh cached versions\n await checkForUpdates();\n } finally {\n updating = false;\n }\n\n return { claude: claudeVersion, codex: codexVersion, errors };\n}\n\nasync function tick(): Promise<void> {\n const settings = getSettings();\n if (!settings.autoUpdateEnabled) return;\n\n console.log(\"[auto-updater] Checking for updates...\");\n await checkForUpdates();\n\n const claudeNeedsUpdate =\n cachedStatus.claude.current &&\n cachedStatus.claude.latest &&\n cachedStatus.claude.current !== cachedStatus.claude.latest;\n\n const codexNeedsUpdate =\n cachedStatus.codex.current &&\n cachedStatus.codex.latest &&\n cachedStatus.codex.current !== cachedStatus.codex.latest;\n\n if (claudeNeedsUpdate || codexNeedsUpdate) {\n console.log(\"[auto-updater] Updates available, installing...\");\n await performUpdate();\n } else {\n console.log(\"[auto-updater] All packages are up to date.\");\n }\n}\n\nexport function getUpdateStatus(): UpdateStatus {\n const claudeUpdateAvailable =\n cachedStatus.claude.current !== null &&\n cachedStatus.claude.latest !== null &&\n cachedStatus.claude.current !== cachedStatus.claude.latest;\n\n const codexUpdateAvailable =\n cachedStatus.codex.current !== null &&\n cachedStatus.codex.latest !== null &&\n cachedStatus.codex.current !== cachedStatus.codex.latest;\n\n const ghUpdateAvailable =\n cachedStatus.gh.current !== null &&\n cachedStatus.gh.latest !== null &&\n cachedStatus.gh.current !== cachedStatus.gh.latest;\n\n return {\n lastCheckAt,\n lastUpdateAt,\n claudeCode: {\n currentVersion: cachedStatus.claude.current,\n latestVersion: cachedStatus.claude.latest,\n updateAvailable: claudeUpdateAvailable,\n },\n codex: {\n currentVersion: cachedStatus.codex.current,\n latestVersion: cachedStatus.codex.latest,\n updateAvailable: codexUpdateAvailable,\n },\n gh: {\n currentVersion: cachedStatus.gh.current,\n latestVersion: cachedStatus.gh.latest,\n updateAvailable: ghUpdateAvailable,\n },\n updating,\n lastError,\n };\n}\n\nexport function startAutoUpdater(): void {\n const settings = getSettings();\n const intervalMs = settings.autoUpdateIntervalHours * 60 * 60 * 1000;\n\n // Do an initial check shortly after startup\n setTimeout(() => tick(), 10_000);\n\n // Schedule recurring checks\n checkTimer = setInterval(() => tick(), intervalMs);\n\n console.log(\n `[auto-updater] Started (enabled: ${settings.autoUpdateEnabled}, interval: ${settings.autoUpdateIntervalHours}h)`\n );\n}\n\nexport function restartAutoUpdater(): void {\n stopAutoUpdater();\n startAutoUpdater();\n}\n\nexport function stopAutoUpdater(): void {\n if (checkTimer) {\n clearInterval(checkTimer);\n checkTimer = null;\n }\n}\n", "import { mkdirSync, writeFileSync, readFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { OllamaModelInfo } from \"@maestro/wire\";\n\nconst OLLAMA_HOST = process.env.OLLAMA_HOST || \"http://localhost:11434\";\nconst PI_MODELS_PATH = join(homedir(), \".pi\", \"agent\", \"models.json\");\n\nexport async function getOllamaStatus(): Promise<{ running: boolean; host: string }> {\n try {\n const res = await fetch(`${OLLAMA_HOST}/api/version`);\n return { running: res.ok, host: OLLAMA_HOST };\n } catch {\n return { running: false, host: OLLAMA_HOST };\n }\n}\n\nexport async function listOllamaModels(): Promise<OllamaModelInfo[]> {\n const res = await fetch(`${OLLAMA_HOST}/api/tags`);\n if (!res.ok) throw new Error(`Ollama returned ${res.status}`);\n const data = (await res.json()) as { models: Array<{ name: string; size: number; digest: string; modified_at: string }> };\n return (data.models || []).map((m) => ({\n name: m.name,\n size: m.size,\n digest: m.digest,\n modifiedAt: m.modified_at,\n }));\n}\n\n// Available models to offer for download\nexport const RECOMMENDED_MODELS = [\n \"qwen3:4b\",\n \"qwen3:2b\",\n \"qwen3:9b-q4_K_M\",\n \"llama3.1:8b-q4_K_M\",\n \"llama3.2:3b\",\n];\n\n// Pull state tracking\ninterface PullState {\n model: string;\n status: string;\n progress: number; // 0-100\n error: string | null;\n done: boolean;\n}\n\nlet activePull: PullState | null = null;\n\nexport function getPullStatus(): PullState | null {\n return activePull;\n}\n\nexport async function pullOllamaModel(modelName: string): Promise<void> {\n if (activePull && !activePull.done) {\n throw new Error(`Already pulling model: ${activePull.model}`);\n }\n\n activePull = { model: modelName, status: \"starting\", progress: 0, error: null, done: false };\n\n try {\n const res = await fetch(`${OLLAMA_HOST}/api/pull`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ name: modelName, stream: true }),\n });\n\n if (!res.ok) {\n const body = await res.text();\n throw new Error(`Ollama pull failed: ${res.status} ${body}`);\n }\n\n const reader = res.body?.getReader();\n if (!reader) throw new Error(\"No response body\");\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const msg = JSON.parse(line) as {\n status: string;\n digest?: string;\n total?: number;\n completed?: number;\n error?: string;\n };\n\n if (msg.error) {\n activePull!.error = msg.error;\n activePull!.status = \"error\";\n activePull!.done = true;\n return;\n }\n\n activePull!.status = msg.status;\n if (msg.total && msg.completed) {\n activePull!.progress = Math.round((msg.completed / msg.total) * 100);\n }\n if (msg.status === \"success\") {\n activePull!.progress = 100;\n activePull!.done = true;\n }\n } catch {\n // ignore parse errors on partial lines\n }\n }\n }\n\n // If we didn't get a success message, mark as done anyway\n if (!activePull!.done) {\n activePull!.done = true;\n activePull!.progress = 100;\n activePull!.status = \"success\";\n }\n } catch (err) {\n activePull!.error = err instanceof Error ? err.message : String(err);\n activePull!.status = \"error\";\n activePull!.done = true;\n }\n}\n\n/**\n * Write/update ~/.pi/agent/models.json so Pi knows about the selected Ollama model.\n * Preserves any existing non-ollama providers in the config.\n */\nexport function writePiModelsConfig(modelId: string): void {\n const dir = join(homedir(), \".pi\", \"agent\");\n mkdirSync(dir, { recursive: true });\n\n // Read existing config to preserve other providers\n let existing: Record<string, unknown> = {};\n if (existsSync(PI_MODELS_PATH)) {\n try {\n existing = JSON.parse(readFileSync(PI_MODELS_PATH, \"utf-8\"));\n } catch {\n // Corrupted file, start fresh\n }\n }\n\n const providers = (existing.providers ?? {}) as Record<string, unknown>;\n\n // Set/overwrite the ollama provider with the selected model\n providers.ollama = {\n baseUrl: `${OLLAMA_HOST}/v1`,\n api: \"openai-completions\",\n apiKey: \"ollama\",\n compat: {\n supportsDeveloperRole: false,\n supportsReasoningEffort: false,\n },\n models: [{ id: modelId }],\n };\n\n const config = { ...existing, providers };\n writeFileSync(PI_MODELS_PATH, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n}\n", "import type {\n DeploymentRedeployResponse,\n DeploymentUpdateStatus,\n} from \"@maestro/wire\";\n\nfunction getUpdaterConfig():\n | {\n url: string;\n token: string | null;\n }\n | null {\n const url = process.env.UPDATER_URL?.trim();\n const token = process.env.UPDATER_TOKEN?.trim();\n if (!url) {\n return null;\n }\n\n return {\n url: url.replace(/\\/+$/g, \"\"),\n token: token || null,\n };\n}\n\nfunction getDisabledStatus(message?: string): DeploymentUpdateStatus {\n return {\n configured: false,\n currentVersion: null,\n latestVersion: null,\n updateAvailable: false,\n updating: false,\n lastCheckedAt: null,\n lastUpdatedAt: null,\n lastError: message ?? null,\n latestRelease: null,\n };\n}\n\nasync function requestUpdater<T>(\n path: string,\n init?: RequestInit & { timeoutMs?: number }\n): Promise<T> {\n const config = getUpdaterConfig();\n if (!config) {\n throw new Error(\"Deployment updater is not configured\");\n }\n\n const res = await fetch(`${config.url}${path}`, {\n ...init,\n headers: {\n ...(config.token ? { Authorization: `Bearer ${config.token}` } : {}),\n ...(init?.body != null ? { \"Content-Type\": \"application/json\" } : {}),\n ...init?.headers,\n },\n signal: AbortSignal.timeout(init?.timeoutMs ?? 15_000),\n });\n\n const body = (await res.json().catch(() => ({}))) as Record<string, unknown>;\n if (!res.ok) {\n throw new Error(\n typeof body.error === \"string\" ? body.error : `Updater request failed (${res.status})`\n );\n }\n\n return body as T;\n}\n\nexport async function getDeploymentUpdateStatus(): Promise<DeploymentUpdateStatus> {\n const config = getUpdaterConfig();\n if (!config) {\n return getDisabledStatus(\n \"Set UPDATER_URL on the Maestro server to enable release redeploys. UPDATER_TOKEN is optional on the internal network.\"\n );\n }\n\n try {\n return await requestUpdater<DeploymentUpdateStatus>(\"/status\");\n } catch (error) {\n return {\n configured: true,\n currentVersion: null,\n latestVersion: null,\n updateAvailable: false,\n updating: false,\n lastCheckedAt: null,\n lastUpdatedAt: null,\n lastError:\n error instanceof Error ? error.message : \"Failed to reach the deployment updater\",\n latestRelease: null,\n };\n }\n}\n\nexport async function checkDeploymentUpdateStatus(): Promise<DeploymentUpdateStatus> {\n const config = getUpdaterConfig();\n if (!config) {\n return getDisabledStatus(\n \"Set UPDATER_URL on the Maestro server to enable release redeploys. UPDATER_TOKEN is optional on the internal network.\"\n );\n }\n\n return requestUpdater<DeploymentUpdateStatus>(\"/check\", {\n method: \"POST\",\n });\n}\n\nexport async function triggerDeploymentRedeploy(\n tag?: string\n): Promise<DeploymentRedeployResponse> {\n return requestUpdater<DeploymentRedeployResponse>(\"/redeploy\", {\n method: \"POST\",\n body: JSON.stringify(tag ? { tag } : {}),\n timeoutMs: 30_000,\n });\n}\n", "import type { FastifyInstance } from \"fastify\";\nimport {\n checkDeploymentUpdateStatus,\n getDeploymentUpdateStatus,\n triggerDeploymentRedeploy,\n} from \"../services/deployment-updater.js\";\n\nexport async function registerDeploymentRoutes(app: FastifyInstance) {\n app.get(\"/api/deployment/update-status\", async () => {\n return getDeploymentUpdateStatus();\n });\n\n app.post(\"/api/deployment/check\", async () => {\n return checkDeploymentUpdateStatus();\n });\n\n app.post(\"/api/deployment/redeploy\", async (req, reply) => {\n try {\n const body = req.body as { tag?: string } | undefined;\n return await triggerDeploymentRedeploy(body?.tag);\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Failed to trigger redeploy\";\n const status =\n /not configured/i.test(message) || /missing/i.test(message) ? 400 : 502;\n return reply.status(status).send({ error: message });\n }\n });\n}\n", "import type { FastifyInstance } from \"fastify\";\n\nexport async function registerSetupRoutes(app: FastifyInstance) {\n // Setup flow is currently disabled \u2014 always report setup as complete.\n app.get(\"/api/setup/status\", async () => ({\n needsSetup: false,\n running: false,\n }));\n\n app.post(\"/api/setup/reset\", async () => {\n return { ok: true };\n });\n}\n", "import type { FastifyInstance } from \"fastify\";\nimport {\n getOllamaStatus,\n listOllamaModels,\n pullOllamaModel,\n getPullStatus,\n RECOMMENDED_MODELS,\n} from \"../services/ollama.js\";\n\nexport async function registerOllamaRoutes(app: FastifyInstance) {\n // Ollama connection status\n app.get(\"/api/ollama/status\", async () => {\n return getOllamaStatus();\n });\n\n // List locally available models\n app.get(\"/api/ollama/models\", async (_req, reply) => {\n try {\n const models = await listOllamaModels();\n return { models };\n } catch (err) {\n return reply.status(502).send({\n error: err instanceof Error ? err.message : \"Cannot reach Ollama\",\n });\n }\n });\n\n // List recommended models for download\n app.get(\"/api/ollama/recommended\", async () => {\n return { models: RECOMMENDED_MODELS };\n });\n\n // Pull (download) a model \u2014 async, returns immediately\n app.post(\"/api/ollama/pull\", async (req, reply) => {\n const { model } = req.body as { model?: string };\n if (!model || typeof model !== \"string\") {\n return reply.status(400).send({ error: \"model is required\" });\n }\n try {\n // Fire and forget \u2014 client polls /api/ollama/pull/status\n void pullOllamaModel(model);\n return { ok: true, model };\n } catch (err) {\n return reply.status(409).send({\n error: err instanceof Error ? err.message : \"Pull failed\",\n });\n }\n });\n\n // Poll pull progress\n app.get(\"/api/ollama/pull/status\", async () => {\n return getPullStatus() ?? { model: null, status: \"idle\", progress: 0, error: null, done: true };\n });\n}\n", "/**\n * Shared system prompt extensions for Pi agent across all channels (Telegram, WhatsApp, etc.)\n * Channel-independent \u2014 appended to the default Pi SDK prompt to preserve tool/skill sections.\n *\n * Uses appendSystemPromptOverride (Option 2) so the default Pi prompt with tool descriptions,\n * guidelines, context files, and skills is kept intact.\n */\n\n/**\n * Returns additional prompt sections to append to the default Pi system prompt.\n * The `base` parameter contains any existing append sections (e.g. from APPEND_SYSTEM.md).\n * We prepend our personality/behavior instructions so they appear right after the default prompt.\n */\nexport function buildAppendSections(base: string[]): string[] {\n return [\n `## Personality & Behavior\n\nYou are a friendly, conversational AI assistant. You communicate via messaging (Telegram, WhatsApp, etc.).\n\n### Conversation style\n- Be warm, natural, and concise. Write like a helpful friend, not a manual.\n- Greet users back naturally when they greet you.\n- Use short paragraphs. Avoid walls of text \u2014 this is chat, not a document.\n- If you don't know something, say so honestly.\n- Ask for clarification when the request is ambiguous.\n\n### When to use tools\n- For casual chat (greetings, questions, advice), just respond with text. No tool calls needed.\n- For coding, technical, or file-related requests, use your tools to explore and help.\n- State your intent before making tool calls, but never predict or claim results before receiving them.\n- Before modifying a file, always read it first. Do not assume files or directories exist.\n- If a tool call fails, analyze the error before retrying with a different approach.`,\n ...base,\n ];\n}\n", "import * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport type { Server as SocketServer } from \"socket.io\";\nimport makeWASocket, {\n useMultiFileAuthState,\n DisconnectReason,\n fetchLatestBaileysVersion,\n makeCacheableSignalKeyStore,\n} from \"@whiskeysockets/baileys\";\nimport type { WASocket } from \"@whiskeysockets/baileys\";\nimport { Boom } from \"@hapi/boom\";\nimport * as QRCode from \"qrcode\";\nimport type { WhatsAppConnectionStatus } from \"@maestro/wire\";\n\nconst DATA_DIR = path.join(os.homedir(), \".maestro\");\nconst AUTH_DIR = path.join(DATA_DIR, \"whatsapp-auth\");\n\nlet sock: WASocket | null = null;\nlet io: SocketServer | null = null;\nlet connectionStatus: WhatsAppConnectionStatus = \"disconnected\";\nlet currentQrCode: string | null = null;\nlet currentQrRaw: string | null = null;\nlet reconnectAttempts = 0;\nlet reconnectTimer: ReturnType<typeof setTimeout> | null = null;\nlet messageCallback: ((chatJid: string, messageId: string, body: string, senderName: string) => void) | null = null;\n\nfunction getAllowedJids(): string[] {\n const raw = process.env.WHATSAPP_ALLOWED_JIDS || \"\";\n return raw.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n\nfunction isJidAllowed(jid: string): boolean {\n const allowed = getAllowedJids();\n if (allowed.length === 0) return true;\n return allowed.some((a) => jid.includes(a));\n}\n\nfunction setStatus(status: WhatsAppConnectionStatus) {\n connectionStatus = status;\n io?.emit(\"whatsapp:status\", { status });\n}\n\nexport function onWhatsAppMessage(\n cb: (chatJid: string, messageId: string, body: string, senderName: string) => void\n) {\n messageCallback = cb;\n}\n\nexport async function startWhatsApp(socketIo: SocketServer): Promise<void> {\n io = socketIo;\n\n if (sock) {\n console.log(\"[whatsapp] Already connected, skipping start\");\n return;\n }\n\n setStatus(\"connecting\");\n reconnectAttempts = 0;\n\n await connectBaileys();\n}\n\nasync function connectBaileys(): Promise<void> {\n try {\n const { state, saveCreds } = await useMultiFileAuthState(AUTH_DIR);\n const { version } = await fetchLatestBaileysVersion();\n\n sock = makeWASocket({\n version,\n auth: {\n creds: state.creds,\n keys: makeCacheableSignalKeyStore(state.keys, undefined as any),\n },\n generateHighQualityLinkPreview: false,\n });\n\n sock.ev.on(\"creds.update\", saveCreds);\n\n sock.ev.on(\"connection.update\", (update) => {\n const { connection, lastDisconnect, qr } = update;\n\n if (qr) {\n setStatus(\"qr_pending\");\n currentQrRaw = qr;\n QRCode.toDataURL(qr)\n .then((url: string) => {\n currentQrCode = url;\n io?.emit(\"whatsapp:qr\", { qrCode: url });\n })\n .catch((err: unknown) => {\n console.error(\"[whatsapp] Failed to generate QR code:\", err);\n });\n QRCode.toString(qr, { type: \"terminal\", small: true, margin: 1 })\n .then((ascii: string) => {\n console.log(\"[whatsapp] Scan this QR code with WhatsApp:\\n\" + ascii);\n console.log(\"[whatsapp] If the QR code above doesn't work, use this code manually:\\n\" + qr);\n })\n .catch(() => {});\n }\n\n if (connection === \"close\") {\n sock = null;\n currentQrCode = null;\n currentQrRaw = null;\n\n const statusCode = (lastDisconnect?.error as Boom)?.output?.statusCode;\n const loggedOut = statusCode === DisconnectReason.loggedOut;\n\n if (loggedOut) {\n console.log(\"[whatsapp] Logged out \u2014 clearing auth state\");\n setStatus(\"disconnected\");\n reconnectAttempts = 0;\n return;\n }\n\n const isQrTimeout = statusCode === DisconnectReason.timedOut || statusCode === 515;\n if (isQrTimeout) {\n console.log(\"[whatsapp] QR expired, reconnecting immediately for a fresh code...\");\n setStatus(\"connecting\");\n reconnectTimer = setTimeout(() => connectBaileys(), 1000);\n return;\n }\n\n reconnectAttempts++;\n const delay = Math.min(1000 * Math.pow(2, reconnectAttempts), 60000);\n console.log(`[whatsapp] Connection closed (code=${statusCode}), reconnecting in ${delay}ms...`);\n setStatus(\"connecting\");\n reconnectTimer = setTimeout(() => connectBaileys(), delay);\n }\n\n if (connection === \"open\") {\n console.log(\"[whatsapp] Connected successfully\");\n setStatus(\"connected\");\n currentQrCode = null;\n currentQrRaw = null;\n reconnectAttempts = 0;\n }\n });\n\n sock.ev.on(\"messages.upsert\", (m) => {\n if (m.type !== \"notify\") return;\n\n for (const msg of m.messages) {\n const text =\n msg.message?.conversation ||\n msg.message?.extendedTextMessage?.text;\n if (!text) continue;\n\n const chatJid = msg.key.remoteJid;\n if (!chatJid) continue;\n\n if (!isJidAllowed(chatJid)) {\n console.log(`[whatsapp] Ignoring message from non-allowed JID: ${chatJid}`);\n continue;\n }\n\n const messageId = msg.key.id || \"\";\n const senderName = msg.pushName || chatJid.split(\"@\")[0];\n\n console.log(`[whatsapp] Incoming message from ${senderName} (${chatJid}): ${text.slice(0, 80)}`);\n messageCallback?.(chatJid, messageId, text, senderName);\n }\n });\n } catch (error) {\n console.error(\"[whatsapp] Failed to connect:\", error);\n setStatus(\"disconnected\");\n }\n}\n\nexport async function stopWhatsApp(): Promise<void> {\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n if (sock) {\n sock.end(undefined);\n sock = null;\n }\n currentQrCode = null;\n currentQrRaw = null;\n setStatus(\"disconnected\");\n}\n\nexport function getWhatsAppStatus(): {\n status: WhatsAppConnectionStatus;\n qrCode: string | null;\n qrRaw: string | null;\n} {\n return { status: connectionStatus, qrCode: currentQrCode, qrRaw: currentQrRaw };\n}\n\nexport async function sendWhatsAppMessage(\n jid: string,\n text: string\n): Promise<void> {\n if (!sock) {\n throw new Error(\"WhatsApp is not connected\");\n }\n await sock.sendMessage(jid, { text });\n}\n", "import {\n AuthStorage,\n createAgentSession,\n createCodingTools,\n DefaultResourceLoader,\n ModelRegistry,\n SessionManager,\n type AgentSession,\n} from \"@mariozechner/pi-coding-agent\";\nimport {\n insertWhatsAppMessage,\n getNextQueuedMessage,\n updateWhatsAppMessage,\n whatsAppMessageExists,\n} from \"./store.js\";\nimport {\n onWhatsAppMessage,\n sendWhatsAppMessage,\n} from \"./whatsapp.js\";\nimport { buildAppendSections } from \"../../system-prompt.js\";\n\nlet session: AgentSession | null = null;\nlet isProcessing = false;\n\nconst PI_PROJECT_PATH = process.env.PI_PROJECT_PATH || \"/tmp/maestro-whatsapp\";\nconst PI_TIMEOUT_MS = parseInt(process.env.PI_TIMEOUT_MS || \"300000\", 10);\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\n// \u2500\u2500 Pi SDK Session \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function ensureSession(): Promise<AgentSession> {\n if (session) return session;\n\n const authStorage = AuthStorage.create();\n const modelRegistry = new ModelRegistry(authStorage);\n\n const available = await modelRegistry.getAvailable();\n const model = available[0];\n if (!model) {\n throw new Error(\n \"No model available. Configure an Ollama model in Settings > Pi Agent.\"\n );\n }\n console.log(`[whatsapp-queue] Using model: ${model.id} (provider: ${model.provider})`);\n\n const resourceLoader = new DefaultResourceLoader({\n cwd: PI_PROJECT_PATH,\n appendSystemPromptOverride: (base) => buildAppendSections(base),\n });\n await resourceLoader.reload();\n\n const { session: s } = await createAgentSession({\n cwd: PI_PROJECT_PATH,\n tools: createCodingTools(PI_PROJECT_PATH),\n sessionManager: SessionManager.continueRecent(PI_PROJECT_PATH),\n resourceLoader,\n authStorage,\n modelRegistry,\n model,\n });\n\n session = s;\n console.log(\"[whatsapp-queue] Pi agent session created\");\n return s;\n}\n\nfunction sendPrompt(s: AgentSession, message: string): Promise<string> {\n return new Promise((resolve, reject) => {\n let responseText = \"\";\n let done = false;\n\n const timer = setTimeout(() => {\n if (!done) {\n done = true;\n unsubscribe();\n reject(new Error(\"Pi agent timed out\"));\n }\n }, PI_TIMEOUT_MS);\n\n const unsubscribe = s.subscribe((event: any) => {\n if (event.type === \"message_update\" && event.assistantMessageEvent?.type === \"text_delta\") {\n responseText += event.assistantMessageEvent.delta;\n }\n\n if (event.type === \"agent_end\") {\n done = true;\n clearTimeout(timer);\n unsubscribe();\n\n const messages = event.messages || [];\n const lastAssistant = messages.findLast((m: any) => m.role === \"assistant\");\n if (lastAssistant?.stopReason === \"error\" && lastAssistant?.errorMessage) {\n reject(new Error(lastAssistant.errorMessage));\n return;\n }\n\n resolve(responseText.trim() || \"Agent completed without text output.\");\n }\n });\n\n s.prompt(message).catch((err) => {\n if (!done) {\n done = true;\n clearTimeout(timer);\n unsubscribe();\n reject(err);\n }\n });\n });\n}\n\n// \u2500\u2500 Queue Processor \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function startWhatsAppQueue(): void {\n onWhatsAppMessage((chatJid, messageId, body, senderName) => {\n onMessage(chatJid, messageId, body, senderName);\n });\n\n console.log(\"[whatsapp-queue] Queue processor started\");\n}\n\nexport function stopWhatsAppQueue(): void {\n session = null;\n console.log(\"[whatsapp-queue] Queue processor stopped\");\n}\n\nfunction onMessage(\n chatJid: string,\n messageId: string,\n body: string,\n senderName: string\n): void {\n if (whatsAppMessageExists(messageId)) {\n console.log(`[whatsapp-queue] Duplicate message ${messageId}, skipping`);\n return;\n }\n\n insertWhatsAppMessage({\n chatJid,\n messageId,\n direction: \"incoming\",\n senderName,\n body,\n status: \"queued\",\n });\n\n console.log(`[whatsapp-queue] Queued message from ${senderName}`);\n processNext();\n}\n\nasync function processNext(): Promise<void> {\n if (isProcessing) return;\n\n const msg = getNextQueuedMessage();\n if (!msg) return;\n\n isProcessing = true;\n\n try {\n updateWhatsAppMessage(msg.id, { status: \"processing\" });\n\n const s = await ensureSession();\n\n if (msg.body.trim().toLowerCase() === \"reset\") {\n await s.newSession();\n await sendWhatsAppMessage(msg.chatJid, \"Session reset.\");\n updateWhatsAppMessage(msg.id, { status: \"completed\", responseText: \"Session reset.\", processedAt: nowIso() });\n console.log(\"[whatsapp-queue] Session reset by user\");\n return;\n }\n\n const responseText = await sendPrompt(s, msg.body);\n\n await sendWhatsAppMessage(msg.chatJid, responseText);\n\n insertWhatsAppMessage({\n chatJid: msg.chatJid,\n messageId: `out_${msg.id}`,\n direction: \"outgoing\",\n senderName: null,\n body: responseText,\n status: \"completed\",\n });\n\n updateWhatsAppMessage(msg.id, {\n status: \"completed\",\n responseText,\n processedAt: nowIso(),\n });\n\n console.log(`[whatsapp-queue] Completed message ${msg.id}`);\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error);\n console.error(`[whatsapp-queue] Failed to process message ${msg.id}:`, errMsg);\n\n updateWhatsAppMessage(msg.id, {\n status: \"failed\",\n error: errMsg,\n processedAt: nowIso(),\n });\n } finally {\n isProcessing = false;\n processNext();\n }\n}\n", "import * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport { randomUUID } from \"crypto\";\nimport { DatabaseSync } from \"node:sqlite\";\n\nconst DATA_DIR = path.join(os.homedir(), \".maestro\");\nfs.mkdirSync(DATA_DIR, { recursive: true });\n\nconst dbPath = path.join(DATA_DIR, \"pi.sqlite\");\nconst db = new DatabaseSync(dbPath);\n\ndb.exec(`\n CREATE TABLE IF NOT EXISTS whatsapp_messages (\n id TEXT PRIMARY KEY,\n chat_jid TEXT NOT NULL,\n message_id TEXT NOT NULL UNIQUE,\n direction TEXT NOT NULL,\n sender_name TEXT,\n body TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'queued',\n response_text TEXT,\n error TEXT,\n created_at TEXT NOT NULL,\n processed_at TEXT\n );\n CREATE INDEX IF NOT EXISTS idx_wa_status ON whatsapp_messages(status);\n CREATE INDEX IF NOT EXISTS idx_wa_chat ON whatsapp_messages(chat_jid, created_at);\n`);\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nexport interface WhatsAppMessageRow {\n id: string;\n chatJid: string;\n messageId: string;\n direction: \"incoming\" | \"outgoing\";\n senderName: string | null;\n body: string;\n status: \"queued\" | \"processing\" | \"completed\" | \"failed\";\n responseText: string | null;\n error: string | null;\n createdAt: string;\n processedAt: string | null;\n}\n\nfunction toWhatsAppMessage(row: Record<string, unknown>): WhatsAppMessageRow {\n return {\n id: String(row.id),\n chatJid: String(row.chat_jid),\n messageId: String(row.message_id),\n direction: String(row.direction) as \"incoming\" | \"outgoing\",\n senderName: row.sender_name ? String(row.sender_name) : null,\n body: String(row.body),\n status: String(row.status) as WhatsAppMessageRow[\"status\"],\n responseText: row.response_text ? String(row.response_text) : null,\n error: row.error ? String(row.error) : null,\n createdAt: String(row.created_at),\n processedAt: row.processed_at ? String(row.processed_at) : null,\n };\n}\n\nexport function insertWhatsAppMessage(input: {\n chatJid: string;\n messageId: string;\n direction: \"incoming\" | \"outgoing\";\n senderName: string | null;\n body: string;\n status?: string;\n}): WhatsAppMessageRow {\n const id = randomUUID();\n const now = nowIso();\n const status = input.status ?? \"queued\";\n\n db.prepare(`\n INSERT INTO whatsapp_messages (id, chat_jid, message_id, direction, sender_name, body, status, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `).run(id, input.chatJid, input.messageId, input.direction, input.senderName, input.body, status, now);\n\n return {\n id,\n chatJid: input.chatJid,\n messageId: input.messageId,\n direction: input.direction,\n senderName: input.senderName,\n body: input.body,\n status: status as WhatsAppMessageRow[\"status\"],\n responseText: null,\n error: null,\n createdAt: now,\n processedAt: null,\n };\n}\n\nexport function getNextQueuedMessage(): WhatsAppMessageRow | null {\n const row = db\n .prepare(\"SELECT * FROM whatsapp_messages WHERE status = 'queued' AND direction = 'incoming' ORDER BY created_at ASC LIMIT 1\")\n .get() as Record<string, unknown> | undefined;\n return row ? toWhatsAppMessage(row) : null;\n}\n\nexport function updateWhatsAppMessage(\n id: string,\n patch: Partial<Pick<WhatsAppMessageRow, \"status\" | \"responseText\" | \"error\" | \"processedAt\">>\n): void {\n const sets: string[] = [];\n const values: (string | null)[] = [];\n\n if (patch.status !== undefined) { sets.push(\"status = ?\"); values.push(patch.status ?? null); }\n if (patch.responseText !== undefined) { sets.push(\"response_text = ?\"); values.push(patch.responseText ?? null); }\n if (patch.error !== undefined) { sets.push(\"error = ?\"); values.push(patch.error ?? null); }\n if (patch.processedAt !== undefined) { sets.push(\"processed_at = ?\"); values.push(patch.processedAt ?? null); }\n\n if (sets.length === 0) return;\n values.push(id);\n db.prepare(`UPDATE whatsapp_messages SET ${sets.join(\", \")} WHERE id = ?`).run(...(values as string[]));\n}\n\nexport function getWhatsAppMessageHistory(chatJid: string, limit = 20): WhatsAppMessageRow[] {\n const rows = db\n .prepare(\"SELECT * FROM whatsapp_messages WHERE chat_jid = ? ORDER BY created_at DESC LIMIT ?\")\n .all(chatJid, limit) as Record<string, unknown>[];\n return rows.map(toWhatsAppMessage).reverse();\n}\n\nexport function listWhatsAppMessages(chatJid?: string, limit = 50): WhatsAppMessageRow[] {\n if (chatJid) {\n const rows = db\n .prepare(\"SELECT * FROM whatsapp_messages WHERE chat_jid = ? ORDER BY created_at DESC LIMIT ?\")\n .all(chatJid, limit) as Record<string, unknown>[];\n return rows.map(toWhatsAppMessage);\n }\n const rows = db\n .prepare(\"SELECT * FROM whatsapp_messages ORDER BY created_at DESC LIMIT ?\")\n .all(limit) as Record<string, unknown>[];\n return rows.map(toWhatsAppMessage);\n}\n\nexport function whatsAppMessageExists(messageId: string): boolean {\n const row = db\n .prepare(\"SELECT 1 FROM whatsapp_messages WHERE message_id = ?\")\n .get(messageId);\n return !!row;\n}\n", "import type { FastifyInstance } from \"fastify\";\nimport {\n startWhatsApp,\n stopWhatsApp,\n getWhatsAppStatus,\n sendWhatsAppMessage,\n} from \"./whatsapp.js\";\nimport { listWhatsAppMessages } from \"./store.js\";\nimport type { Server as SocketServer } from \"socket.io\";\n\nexport async function registerWhatsAppRoutes(\n app: FastifyInstance,\n io: SocketServer\n) {\n app.get(\"/api/integrations/whatsapp\", async () => {\n return getWhatsAppStatus();\n });\n\n app.post(\"/api/integrations/whatsapp/connect\", async (_req, reply) => {\n try {\n await startWhatsApp(io);\n return getWhatsAppStatus();\n } catch (error) {\n return reply.status(500).send({\n error:\n error instanceof Error\n ? error.message\n : \"Failed to start WhatsApp\",\n });\n }\n });\n\n app.delete(\"/api/integrations/whatsapp/connect\", async () => {\n await stopWhatsApp();\n return { ok: true };\n });\n\n app.get(\"/api/integrations/whatsapp/messages\", async (req) => {\n const query = req.query as { chatJid?: string; limit?: string };\n const chatJid = query.chatJid || undefined;\n const limit = query.limit ? parseInt(query.limit, 10) : 50;\n return listWhatsAppMessages(chatJid, limit);\n });\n\n app.post(\"/api/integrations/whatsapp/send\", async (req, reply) => {\n try {\n const body = req.body as { jid: string; text: string };\n if (!body.jid || !body.text) {\n return reply\n .status(400)\n .send({ error: \"jid and text are required\" });\n }\n await sendWhatsAppMessage(body.jid, body.text);\n return { ok: true };\n } catch (error) {\n return reply.status(500).send({\n error:\n error instanceof Error ? error.message : \"Failed to send message\",\n });\n }\n });\n}\n", "import type { Server as SocketServer } from \"socket.io\";\nimport type { TelegramConnectionStatus } from \"@maestro/wire\";\n\ninterface TelegramUpdate {\n update_id: number;\n message?: {\n message_id: number;\n from?: { id: number; first_name?: string; last_name?: string; username?: string };\n chat: { id: number; type: string };\n text?: string;\n };\n}\n\nlet io: SocketServer | null = null;\nlet connectionStatus: TelegramConnectionStatus = \"disconnected\";\nlet botToken: string | null = null;\nlet botUsername: string | null = null;\nlet pollTimer: ReturnType<typeof setTimeout> | null = null;\nlet lastUpdateId = 0;\nlet messageCallback: ((chatId: string, messageId: string, body: string, senderName: string) => void) | null = null;\n\nfunction getAllowedChatIds(): string[] {\n const raw = process.env.TELEGRAM_ALLOWED_CHAT_IDS || \"\";\n return raw.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n\nfunction isChatAllowed(chatId: string): boolean {\n const allowed = getAllowedChatIds();\n if (allowed.length === 0) return true;\n return allowed.includes(chatId);\n}\n\nfunction setStatus(status: TelegramConnectionStatus) {\n connectionStatus = status;\n io?.emit(\"telegram:status\", { status });\n}\n\nasync function telegramApi(method: string, body?: Record<string, unknown>): Promise<any> {\n const url = `https://api.telegram.org/bot${botToken}/${method}`;\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: body ? JSON.stringify(body) : undefined,\n });\n const json = await res.json() as { ok: boolean; description?: string; result?: any };\n if (!json.ok) {\n throw new Error(`Telegram API error: ${json.description || \"unknown error\"}`);\n }\n return json.result;\n}\n\nexport function onTelegramMessage(\n cb: (chatId: string, messageId: string, body: string, senderName: string) => void\n) {\n messageCallback = cb;\n}\n\nexport async function startTelegram(socketIo: SocketServer, token?: string): Promise<void> {\n io = socketIo;\n const resolvedToken = token || process.env.TELEGRAM_BOT_TOKEN;\n\n if (!resolvedToken) {\n console.error(\"[telegram] No bot token provided\");\n setStatus(\"error\");\n return;\n }\n\n botToken = resolvedToken;\n setStatus(\"connecting\");\n\n try {\n const me = await telegramApi(\"getMe\");\n botUsername = me.username || null;\n console.log(`[telegram] Connected as @${botUsername}`);\n setStatus(\"connected\");\n lastUpdateId = 0;\n pollUpdates();\n } catch (error) {\n console.error(\"[telegram] Failed to connect:\", error);\n setStatus(\"error\");\n }\n}\n\nasync function pollUpdates(): Promise<void> {\n if (connectionStatus !== \"connected\" || !botToken) return;\n\n try {\n const updates: TelegramUpdate[] = await telegramApi(\"getUpdates\", {\n offset: lastUpdateId + 1,\n timeout: 30,\n });\n\n for (const update of updates) {\n lastUpdateId = update.update_id;\n\n if (!update.message?.text) continue;\n\n const chatId = String(update.message.chat.id);\n if (!isChatAllowed(chatId)) {\n console.log(`[telegram] Ignoring message from non-allowed chat: ${chatId}`);\n continue;\n }\n\n const messageId = String(update.message.message_id);\n const from = update.message.from;\n const senderName = from\n ? [from.first_name, from.last_name].filter(Boolean).join(\" \") || from.username || chatId\n : chatId;\n\n console.log(`[telegram] Incoming message from ${senderName} (${chatId}): ${update.message.text.slice(0, 80)}`);\n messageCallback?.(chatId, messageId, update.message.text, senderName);\n }\n } catch (error) {\n console.error(\"[telegram] Polling error:\", error);\n }\n\n // Schedule next poll\n pollTimer = setTimeout(() => pollUpdates(), 500);\n}\n\nexport async function stopTelegram(): Promise<void> {\n if (pollTimer) {\n clearTimeout(pollTimer);\n pollTimer = null;\n }\n botToken = null;\n botUsername = null;\n lastUpdateId = 0;\n setStatus(\"disconnected\");\n}\n\nexport function getTelegramStatus(): {\n status: TelegramConnectionStatus;\n botUsername: string | null;\n} {\n return { status: connectionStatus, botUsername };\n}\n\nexport async function sendTelegramMessage(\n chatId: string,\n text: string\n): Promise<void> {\n if (!botToken) {\n throw new Error(\"Telegram bot is not connected\");\n }\n\n // Telegram messages have a 4096 character limit\n if (text.length <= 4096) {\n await telegramApi(\"sendMessage\", { chat_id: chatId, text });\n return;\n }\n\n // Split long messages\n const chunks: string[] = [];\n let remaining = text;\n while (remaining.length > 0) {\n chunks.push(remaining.slice(0, 4096));\n remaining = remaining.slice(4096);\n }\n for (const chunk of chunks) {\n await telegramApi(\"sendMessage\", { chat_id: chatId, text: chunk });\n }\n}\n", "import {\n AuthStorage,\n createAgentSession,\n createCodingTools,\n DefaultResourceLoader,\n ModelRegistry,\n SessionManager,\n type AgentSession,\n} from \"@mariozechner/pi-coding-agent\";\nimport {\n insertTelegramMessage,\n getNextQueuedTelegramMessage,\n updateTelegramMessage,\n telegramMessageExists,\n} from \"./store.js\";\nimport {\n onTelegramMessage,\n sendTelegramMessage,\n} from \"./telegram.js\";\nimport { buildAppendSections } from \"../../system-prompt.js\";\n\nlet session: AgentSession | null = null;\nlet isProcessing = false;\n\nconst PI_PROJECT_PATH = process.env.PI_PROJECT_PATH || \"/tmp/maestro-telegram\";\nconst PI_TIMEOUT_MS = parseInt(process.env.PI_TIMEOUT_MS || \"300000\", 10);\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\n// \u2500\u2500 Pi SDK Session \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function ensureSession(): Promise<AgentSession> {\n if (session) return session;\n\n const authStorage = AuthStorage.create();\n const modelRegistry = new ModelRegistry(authStorage);\n\n const available = await modelRegistry.getAvailable();\n const model = available[0];\n if (!model) {\n throw new Error(\n \"No model available. Configure an Ollama model in Settings > Pi Agent.\"\n );\n }\n console.log(`[telegram-queue] Using model: ${model.id} (provider: ${model.provider})`);\n\n const resourceLoader = new DefaultResourceLoader({\n cwd: PI_PROJECT_PATH,\n appendSystemPromptOverride: (base) => buildAppendSections(base),\n });\n await resourceLoader.reload();\n\n const { session: s } = await createAgentSession({\n cwd: PI_PROJECT_PATH,\n tools: createCodingTools(PI_PROJECT_PATH),\n sessionManager: SessionManager.continueRecent(PI_PROJECT_PATH),\n resourceLoader,\n authStorage,\n modelRegistry,\n model,\n });\n\n session = s;\n console.log(\"[telegram-queue] Pi agent session created\");\n return s;\n}\n\nfunction sendPrompt(s: AgentSession, message: string): Promise<string> {\n return new Promise((resolve, reject) => {\n let responseText = \"\";\n let done = false;\n\n const timer = setTimeout(() => {\n if (!done) {\n done = true;\n unsubscribe();\n reject(new Error(\"Pi agent timed out\"));\n }\n }, PI_TIMEOUT_MS);\n\n const unsubscribe = s.subscribe((event: any) => {\n if (event.type === \"message_update\" && event.assistantMessageEvent?.type === \"text_delta\") {\n responseText += event.assistantMessageEvent.delta;\n }\n\n if (event.type === \"agent_end\") {\n done = true;\n clearTimeout(timer);\n unsubscribe();\n\n const messages = event.messages || [];\n const lastAssistant = messages.findLast((m: any) => m.role === \"assistant\");\n if (lastAssistant?.stopReason === \"error\" && lastAssistant?.errorMessage) {\n reject(new Error(lastAssistant.errorMessage));\n return;\n }\n\n resolve(responseText.trim() || \"Agent completed without text output.\");\n }\n });\n\n s.prompt(message).catch((err) => {\n if (!done) {\n done = true;\n clearTimeout(timer);\n unsubscribe();\n reject(err);\n }\n });\n });\n}\n\n// \u2500\u2500 Queue Processor \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function startTelegramQueue(): void {\n onTelegramMessage((chatId, messageId, body, senderName) => {\n onMessage(chatId, messageId, body, senderName);\n });\n\n console.log(\"[telegram-queue] Queue processor started\");\n}\n\nexport function stopTelegramQueue(): void {\n session = null;\n console.log(\"[telegram-queue] Queue processor stopped\");\n}\n\nfunction onMessage(\n chatId: string,\n messageId: string,\n body: string,\n senderName: string\n): void {\n if (telegramMessageExists(messageId)) {\n console.log(`[telegram-queue] Duplicate message ${messageId}, skipping`);\n return;\n }\n\n insertTelegramMessage({\n chatId,\n messageId,\n direction: \"incoming\",\n senderName,\n body,\n status: \"queued\",\n });\n\n console.log(`[telegram-queue] Queued message from ${senderName}`);\n processNext();\n}\n\nasync function processNext(): Promise<void> {\n if (isProcessing) return;\n\n const msg = getNextQueuedTelegramMessage();\n if (!msg) return;\n\n isProcessing = true;\n\n try {\n updateTelegramMessage(msg.id, { status: \"processing\" });\n\n const s = await ensureSession();\n\n if (msg.body.trim().toLowerCase() === \"reset\") {\n await s.newSession();\n await sendTelegramMessage(msg.chatId, \"Session reset.\");\n updateTelegramMessage(msg.id, { status: \"completed\", responseText: \"Session reset.\", processedAt: nowIso() });\n console.log(\"[telegram-queue] Session reset by user\");\n return;\n }\n\n const responseText = await sendPrompt(s, msg.body);\n\n await sendTelegramMessage(msg.chatId, responseText);\n\n insertTelegramMessage({\n chatId: msg.chatId,\n messageId: `out_${msg.id}`,\n direction: \"outgoing\",\n senderName: null,\n body: responseText,\n status: \"completed\",\n });\n\n updateTelegramMessage(msg.id, {\n status: \"completed\",\n responseText,\n processedAt: nowIso(),\n });\n\n console.log(`[telegram-queue] Completed message ${msg.id}`);\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error);\n console.error(`[telegram-queue] Failed to process message ${msg.id}:`, errMsg);\n\n updateTelegramMessage(msg.id, {\n status: \"failed\",\n error: errMsg,\n processedAt: nowIso(),\n });\n } finally {\n isProcessing = false;\n processNext();\n }\n}\n", "import * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport { randomUUID } from \"crypto\";\nimport { DatabaseSync } from \"node:sqlite\";\n\nconst DATA_DIR = path.join(os.homedir(), \".maestro\");\nfs.mkdirSync(DATA_DIR, { recursive: true });\n\nconst dbPath = path.join(DATA_DIR, \"pi.sqlite\");\nconst db = new DatabaseSync(dbPath);\n\ndb.exec(`\n CREATE TABLE IF NOT EXISTS telegram_messages (\n id TEXT PRIMARY KEY,\n chat_id TEXT NOT NULL,\n message_id TEXT NOT NULL UNIQUE,\n direction TEXT NOT NULL,\n sender_name TEXT,\n body TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'queued',\n response_text TEXT,\n error TEXT,\n created_at TEXT NOT NULL,\n processed_at TEXT\n );\n CREATE INDEX IF NOT EXISTS idx_tg_status ON telegram_messages(status);\n CREATE INDEX IF NOT EXISTS idx_tg_chat ON telegram_messages(chat_id, created_at);\n`);\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nexport interface TelegramMessageRow {\n id: string;\n chatId: string;\n messageId: string;\n direction: \"incoming\" | \"outgoing\";\n senderName: string | null;\n body: string;\n status: \"queued\" | \"processing\" | \"completed\" | \"failed\";\n responseText: string | null;\n error: string | null;\n createdAt: string;\n processedAt: string | null;\n}\n\nfunction toTelegramMessage(row: Record<string, unknown>): TelegramMessageRow {\n return {\n id: String(row.id),\n chatId: String(row.chat_id),\n messageId: String(row.message_id),\n direction: String(row.direction) as \"incoming\" | \"outgoing\",\n senderName: row.sender_name ? String(row.sender_name) : null,\n body: String(row.body),\n status: String(row.status) as TelegramMessageRow[\"status\"],\n responseText: row.response_text ? String(row.response_text) : null,\n error: row.error ? String(row.error) : null,\n createdAt: String(row.created_at),\n processedAt: row.processed_at ? String(row.processed_at) : null,\n };\n}\n\nexport function insertTelegramMessage(input: {\n chatId: string;\n messageId: string;\n direction: \"incoming\" | \"outgoing\";\n senderName: string | null;\n body: string;\n status?: string;\n}): TelegramMessageRow {\n const id = randomUUID();\n const now = nowIso();\n const status = input.status ?? \"queued\";\n\n db.prepare(`\n INSERT INTO telegram_messages (id, chat_id, message_id, direction, sender_name, body, status, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `).run(id, input.chatId, input.messageId, input.direction, input.senderName, input.body, status, now);\n\n return {\n id,\n chatId: input.chatId,\n messageId: input.messageId,\n direction: input.direction,\n senderName: input.senderName,\n body: input.body,\n status: status as TelegramMessageRow[\"status\"],\n responseText: null,\n error: null,\n createdAt: now,\n processedAt: null,\n };\n}\n\nexport function getNextQueuedTelegramMessage(): TelegramMessageRow | null {\n const row = db\n .prepare(\"SELECT * FROM telegram_messages WHERE status = 'queued' AND direction = 'incoming' ORDER BY created_at ASC LIMIT 1\")\n .get() as Record<string, unknown> | undefined;\n return row ? toTelegramMessage(row) : null;\n}\n\nexport function updateTelegramMessage(\n id: string,\n patch: Partial<Pick<TelegramMessageRow, \"status\" | \"responseText\" | \"error\" | \"processedAt\">>\n): void {\n const sets: string[] = [];\n const values: (string | null)[] = [];\n\n if (patch.status !== undefined) { sets.push(\"status = ?\"); values.push(patch.status ?? null); }\n if (patch.responseText !== undefined) { sets.push(\"response_text = ?\"); values.push(patch.responseText ?? null); }\n if (patch.error !== undefined) { sets.push(\"error = ?\"); values.push(patch.error ?? null); }\n if (patch.processedAt !== undefined) { sets.push(\"processed_at = ?\"); values.push(patch.processedAt ?? null); }\n\n if (sets.length === 0) return;\n values.push(id);\n db.prepare(`UPDATE telegram_messages SET ${sets.join(\", \")} WHERE id = ?`).run(...(values as string[]));\n}\n\nexport function listTelegramMessages(chatId?: string, limit = 50): TelegramMessageRow[] {\n if (chatId) {\n const rows = db\n .prepare(\"SELECT * FROM telegram_messages WHERE chat_id = ? ORDER BY created_at DESC LIMIT ?\")\n .all(chatId, limit) as Record<string, unknown>[];\n return rows.map(toTelegramMessage);\n }\n const rows = db\n .prepare(\"SELECT * FROM telegram_messages ORDER BY created_at DESC LIMIT ?\")\n .all(limit) as Record<string, unknown>[];\n return rows.map(toTelegramMessage);\n}\n\nexport function telegramMessageExists(messageId: string): boolean {\n const row = db\n .prepare(\"SELECT 1 FROM telegram_messages WHERE message_id = ?\")\n .get(messageId);\n return !!row;\n}\n", "import type { FastifyInstance } from \"fastify\";\nimport {\n startTelegram,\n stopTelegram,\n getTelegramStatus,\n sendTelegramMessage,\n} from \"./telegram.js\";\nimport { startTelegramQueue } from \"./queue.js\";\nimport { listTelegramMessages } from \"./store.js\";\nimport type { Server as SocketServer } from \"socket.io\";\n\nexport async function registerTelegramRoutes(\n app: FastifyInstance,\n io: SocketServer,\n getToken?: () => string\n) {\n app.get(\"/api/integrations/telegram\", async () => {\n return getTelegramStatus();\n });\n\n app.post(\"/api/integrations/telegram/connect\", async (_req, reply) => {\n try {\n const token = getToken?.() || undefined;\n await startTelegram(io, token);\n startTelegramQueue();\n return getTelegramStatus();\n } catch (error) {\n return reply.status(500).send({\n error:\n error instanceof Error\n ? error.message\n : \"Failed to start Telegram bot\",\n });\n }\n });\n\n app.delete(\"/api/integrations/telegram/connect\", async () => {\n await stopTelegram();\n return { ok: true };\n });\n\n app.get(\"/api/integrations/telegram/messages\", async (req) => {\n const query = req.query as { chatId?: string; limit?: string };\n const chatId = query.chatId || undefined;\n const limit = query.limit ? parseInt(query.limit, 10) : 50;\n return listTelegramMessages(chatId, limit);\n });\n\n app.post(\"/api/integrations/telegram/send\", async (req, reply) => {\n try {\n const body = req.body as { chatId: string; text: string };\n if (!body.chatId || !body.text) {\n return reply\n .status(400)\n .send({ error: \"chatId and text are required\" });\n }\n await sendTelegramMessage(body.chatId, body.text);\n return { ok: true };\n } catch (error) {\n return reply.status(500).send({\n error:\n error instanceof Error ? error.message : \"Failed to send message\",\n });\n }\n });\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["os", "fs", "path", "require", "os", "path", "fs", "outputBuffer", "resolve", "fs", "os", "path", "
|
|
3
|
+
"sources": ["../../server/src/agents/sandbox.ts", "../../server/src/agents/pty-manager.ts", "../../server/src/agents/providers.ts", "../../server/src/agents/terminal-attach.ts", "../../server/src/agents/terminal-input-history.ts", "../../server/src/agents/terminal-replica.ts", "../../server/src/state/files.ts", "../../server/src/agents/worktree.ts", "../../server/src/agents/terminal-isolation.ts", "../../server/src/agents/dind.ts", "../../server/src/integrations/cli-auth.ts", "../../server/src/integrations/github.ts", "../../server/src/services/auth-status-checker.ts", "../../server/src/state/sqlite.ts", "../../server/src/state/settings.ts", "../../server/src/agents/auto-spawn-provider.ts", "../../server/src/state/terminals.ts", "../../server/src/state/projects.ts", "../../server/src/state/kanban.ts", "../../server/src/projects/repo-sync.ts", "../../server/src/agents/terminal-manager.ts", "../../server/src/main.ts", "../../server/src/routes/terminal-routes.ts", "../../wire/src/agent.ts", "../../wire/src/settings.ts", "../../wire/src/kanban.ts", "../../wire/src/events.ts", "../../wire/src/project.ts", "../../wire/src/whatsapp.ts", "../../wire/src/telegram.ts", "../../server/src/projects/project-service.ts", "../../server/src/scheduler/scheduler.ts", "../../server/src/routes/project-routes.ts", "../../server/src/routes/kanban-routes.ts", "../../server/src/socket/handlers.ts", "../../server/src/setup/setup-manager.ts", "../../server/src/agents/kanban-assigner.ts", "../../server/src/routes/scheduler-routes.ts", "../../server/src/routes/automation-routes.ts", "../../server/src/scheduler/automation-runner.ts", "../../server/src/auth/auth.ts", "../../server/src/runtime/runtime-status.ts", "../../server/src/routes/system-routes.ts", "../../server/src/routes/cli-auth-routes.ts", "../../server/src/routes/github-integration-routes.ts", "../../server/src/routes/webhook-routes.ts", "../../server/src/routes/settings-routes.ts", "../../server/src/services/auto-updater.ts", "../../server/src/services/ollama.ts", "../../server/src/services/deployment-updater.ts", "../../server/src/routes/deployment-routes.ts", "../../server/src/routes/setup-routes.ts", "../../server/src/routes/ollama-routes.ts", "../../pi/src/system-prompt.ts", "../../pi/src/channels/whatsapp/whatsapp.ts", "../../pi/src/channels/whatsapp/queue.ts", "../../pi/src/channels/whatsapp/store.ts", "../../pi/src/channels/whatsapp/routes.ts", "../../pi/src/channels/telegram/telegram.ts", "../../pi/src/channels/telegram/queue.ts", "../../pi/src/channels/telegram/store.ts", "../../pi/src/channels/telegram/routes.ts"],
|
|
4
|
+
"sourcesContent": ["import * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport { execFileSync, execSync } from \"child_process\";\nimport { fileURLToPath } from \"url\";\nimport type { SandboxProvider } from \"@maestro/wire\";\n\nexport interface SandboxConfig {\n /** Working directory (read-write) */\n cwd: string;\n /** Optional isolated HOME directory for the sandbox process */\n homeDir?: string;\n /** Environment variables to pass into the sandbox */\n env: Record<string, string>;\n /** Additional read-only mount paths (e.g. secondary project dirs) */\n readonlyMounts?: string[];\n /** Additional read-write mount paths */\n writableMounts?: string[];\n /** Additional Docker-only mounts (e.g. named volumes) */\n dockerExtraMounts?: DockerMountSpec[];\n /** Memory limit in bytes (default: 512MB) */\n memoryLimit?: number;\n /** Max number of child processes (default: 64) */\n maxProcesses?: number;\n}\n\ninterface DockerInspectMount {\n Type?: string;\n Source?: string;\n Name?: string;\n Destination?: string;\n RW?: boolean;\n}\n\nexport interface DockerMountSpec {\n type: \"bind\" | \"volume\";\n source: string;\n target: string;\n readonly: boolean;\n}\n\nconst SANDBOX_UID = 1500;\nconst SANDBOX_GID = 1500;\nconst BASE_READONLY_MOUNTS = [\"/usr\", \"/bin\", \"/lib\", \"/sbin\", \"/etc\"];\nconst BASE_PATH_DIRS = [\n \"/usr/local/sbin\",\n \"/usr/local/bin\",\n \"/usr/sbin\",\n \"/usr/bin\",\n \"/sbin\",\n \"/bin\",\n];\nconst DEFAULT_DOCKER_IMAGE = process.env.MAESTRO_DOCKER_SANDBOX_IMAGE || \"maestro-sandbox:latest\";\nconst DEFAULT_MEMORY_LIMIT = 512 * 1024 * 1024;\nconst DEFAULT_MAX_PROCESSES = 64;\n\nlet nsjailPath: string | null | undefined; // undefined = not checked yet\nlet nsjailRuntimeAvailable: boolean | undefined;\nlet nsjailUnavailableReason: string | null | undefined;\nlet dockerPath: string | null | undefined; // undefined = not checked yet\nlet dockerServerReachable: boolean | undefined;\nlet dockerImageReadyFor: string | null = null;\nlet cachedSelfMounts: DockerInspectMount[] | undefined;\nlet runningInsideContainer: boolean | undefined;\n\nfunction resolveBinaryPath(binary: \"docker\" | \"nsjail\"): string | null {\n try {\n return execSync(`which ${binary}`, { encoding: \"utf-8\" }).trim() || null;\n } catch {\n return null;\n }\n}\n\nfunction runNsjailSelfTest(\n binaryPath: string\n): { ok: true; reason: null } | { ok: false; reason: string } {\n const args = [\n \"--mode\", \"o\",\n \"--chroot\", \"/\",\n \"--user\", \"0\",\n \"--group\", \"0\",\n \"--disable_clone_newuser\",\n \"--disable_clone_newnet\",\n \"--cwd\", \"/\",\n \"--bindmount_ro\", \"/usr:/usr\",\n \"--bindmount_ro\", \"/bin:/bin\",\n \"--bindmount_ro\", \"/lib:/lib\",\n \"--bindmount_ro\", \"/sbin:/sbin\",\n \"--bindmount_ro\", \"/etc:/etc\",\n \"--bindmount\", \"/dev:/dev\",\n \"--tmpfsmount\", \"/tmp\",\n ];\n\n if (fs.existsSync(\"/lib64\")) {\n args.push(\"--bindmount_ro\", \"/lib64:/lib64\");\n }\n\n args.push(\"--\", \"/bin/true\");\n\n try {\n execFileSync(binaryPath, args, {\n stdio: [\"ignore\", \"ignore\", \"pipe\"],\n });\n return { ok: true, reason: null };\n } catch (error) {\n return {\n ok: false,\n reason: formatNsjailSelfTestError(error),\n };\n }\n}\n\nfunction formatNsjailSelfTestError(error: unknown): string {\n const appArmorProfile = getCurrentAppArmorProfile();\n\n if (\n error &&\n typeof error === \"object\" &&\n \"stderr\" in error &&\n (typeof error.stderr === \"string\" || Buffer.isBuffer(error.stderr))\n ) {\n const stderr = String(error.stderr)\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n\n const detail =\n stderr.find((line) => line.includes(\"Permission denied\")) ||\n stderr.find((line) => line.includes(\"buildMountTree()\")) ||\n stderr.find((line) => line.includes(\"runChild()\")) ||\n stderr.at(-1);\n\n if (detail) {\n return buildNsjailUnavailableReason(detail, appArmorProfile);\n }\n }\n\n return buildNsjailUnavailableReason(\"nsjail runtime self-test failed\", appArmorProfile);\n}\n\nfunction buildNsjailUnavailableReason(detail: string, appArmorProfile: string | null): string {\n if (detail.includes(\"Permission denied\")) {\n if (appArmorProfile && appArmorProfile !== \"unconfined\") {\n return (\n `${detail}. Active AppArmor profile '${appArmorProfile}' is likely blocking mount namespace setup; ` +\n \"when running Maestro in Docker, add `security_opt: [\\\"seccomp=unconfined\\\", \\\"apparmor=unconfined\\\"]` \" +\n \"to the server container or run it with `--privileged`.\"\n );\n }\n\n return (\n `${detail}. The runtime is blocking mount namespace setup required by nsjail; ` +\n \"when running in Docker, allow unconfined AppArmor/seccomp or run with `--privileged`.\"\n );\n }\n\n return detail;\n}\n\nfunction getCurrentAppArmorProfile(): string | null {\n try {\n const profile = fs.readFileSync(\"/proc/self/attr/current\", \"utf-8\").trim();\n return profile || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Check if nsjail is available on the system.\n */\nexport function isNsjailAvailable(): boolean {\n if (process.platform !== \"linux\") {\n nsjailUnavailableReason =\n `nsjail is only supported on Linux (current platform: ${process.platform})`;\n return false;\n }\n\n if (nsjailPath === undefined) {\n nsjailPath = resolveBinaryPath(\"nsjail\");\n }\n\n if (!nsjailPath) {\n nsjailUnavailableReason = \"nsjail binary was not found in PATH\";\n return false;\n }\n\n if (nsjailRuntimeAvailable === undefined) {\n const result = runNsjailSelfTest(nsjailPath);\n nsjailRuntimeAvailable = result.ok;\n nsjailUnavailableReason = result.reason;\n }\n\n return nsjailRuntimeAvailable;\n}\n\n/**\n * Get the resolved nsjail binary path.\n */\nexport function getNsjailPath(): string {\n if (!isNsjailAvailable() || !nsjailPath) {\n const reason = nsjailUnavailableReason ? `: ${nsjailUnavailableReason}` : \"\";\n throw new Error(`nsjail is not available${reason}`);\n }\n return nsjailPath;\n}\n\nexport function getNsjailUnavailableReason(): string | null {\n return isNsjailAvailable() ? null : (nsjailUnavailableReason ?? null);\n}\n\n/**\n * Check if Docker CLI access is available and can reach a daemon.\n */\nexport function isDockerAvailable(): boolean {\n if (dockerPath === undefined) {\n dockerPath = resolveBinaryPath(\"docker\");\n }\n\n if (!dockerPath) {\n dockerServerReachable = false;\n return false;\n }\n\n if (dockerServerReachable === undefined) {\n try {\n execFileSync(\n dockerPath,\n [\"version\", \"--format\", \"{{.Server.Version}}\"],\n { stdio: [\"ignore\", \"ignore\", \"ignore\"] }\n );\n dockerServerReachable = true;\n } catch {\n dockerServerReachable = false;\n }\n }\n\n return dockerServerReachable;\n}\n\nexport function getDockerPath(): string {\n if (!dockerPath) throw new Error(\"docker is not available\");\n return dockerPath;\n}\n\nexport function normalizeSandboxProvider(\n value: string | null | undefined,\n legacyEnabled = false\n): SandboxProvider {\n if (value === \"none\" || value === \"nsjail\" || value === \"docker\") {\n return value;\n }\n return legacyEnabled ? \"nsjail\" : \"none\";\n}\n\nexport function resolveSandboxProviderAvailability(\n requested: SandboxProvider,\n availability: { nsjailAvailable: boolean; dockerAvailable: boolean }\n): SandboxProvider {\n if (requested === \"docker\") {\n return availability.dockerAvailable ? \"docker\" : \"none\";\n }\n if (requested === \"nsjail\") {\n return availability.nsjailAvailable ? \"nsjail\" : \"none\";\n }\n return \"none\";\n}\n\nexport function resolveSandboxProvider(requested: SandboxProvider): SandboxProvider {\n return resolveSandboxProviderAvailability(requested, {\n nsjailAvailable: isNsjailAvailable(),\n dockerAvailable: isDockerAvailable(),\n });\n}\n\n/**\n * Ensure a directory is writable by the sandbox user.\n * Called by Maestro (running as root) before spawning the jailed process.\n */\nexport function ensureSandboxWritable(dirPath: string): void {\n try {\n execSync(`chown -R ${SANDBOX_UID}:${SANDBOX_GID} ${JSON.stringify(dirPath)}`, {\n stdio: \"ignore\",\n });\n } catch {\n // Best-effort; may fail for read-only mounts (which is fine)\n }\n}\n\n/**\n * Build nsjail arguments for sandboxed agent execution.\n *\n * The sandbox provides:\n * - Filesystem isolation: only explicit mounts are visible\n * - PID namespace: agent can't see other processes\n * - Resource limits: memory, process count (when cgroups available)\n * - No network isolation (agents need API access)\n * - Non-root execution (uid 1500 / sandbox user)\n */\nexport function buildNsjailArgs(config: SandboxConfig): string[] {\n const home = os.homedir();\n const sandboxHome = \"/home/sandbox\";\n const mountedReadonlyRoots = [...BASE_READONLY_MOUNTS];\n const nodeBin = getNodeBinaryDir();\n const npmGlobalPrefix = getNpmGlobalPrefix();\n const codexCompanionBinDir = getCliCompanionBinDir(\"codex\");\n\n const args: string[] = [\n \"--mode\", \"o\",\n \"--chroot\", \"/\",\n \"--user\", `${SANDBOX_UID}`,\n \"--group\", `${SANDBOX_GID}`,\n \"--disable_clone_newuser\",\n \"--disable_clone_newnet\",\n \"--forward_signals\",\n \"--cwd\", config.cwd,\n \"--detect_cgroupv2\",\n \"--cgroup_mem_max\", String(config.memoryLimit ?? DEFAULT_MEMORY_LIMIT),\n \"--cgroup_pids_max\", String(config.maxProcesses ?? DEFAULT_MAX_PROCESSES),\n \"--rlimit_cpu\", \"soft\",\n \"--rlimit_fsize\", \"1024\",\n \"--rlimit_nproc\", String(config.maxProcesses ?? DEFAULT_MAX_PROCESSES),\n \"--rlimit_nofile\", \"1024\",\n \"--really_quiet\",\n ];\n\n for (const dir of BASE_READONLY_MOUNTS) {\n if (fs.existsSync(dir)) {\n args.push(\"--bindmount_ro\", `${dir}:${dir}`);\n }\n }\n\n if (fs.existsSync(\"/lib64\")) {\n args.push(\"--bindmount_ro\", \"/lib64:/lib64\");\n }\n\n args.push(\"--bindmount\", \"/dev:/dev\");\n args.push(\"--tmpfsmount\", \"/tmp\");\n args.push(\"--bindmount\", `${config.cwd}:${config.cwd}`);\n\n if (fs.existsSync(\"/nix\")) {\n args.push(\"--bindmount_ro\", \"/nix:/nix\");\n }\n\n if (nodeBin && !isAlreadyMounted(nodeBin, mountedReadonlyRoots)) {\n args.push(\"--bindmount_ro\", `${nodeBin}:${nodeBin}`);\n mountedReadonlyRoots.push(nodeBin);\n }\n\n if (npmGlobalPrefix && !isAlreadyMounted(npmGlobalPrefix, mountedReadonlyRoots)) {\n args.push(\"--bindmount_ro\", `${npmGlobalPrefix}:${npmGlobalPrefix}`);\n mountedReadonlyRoots.push(npmGlobalPrefix);\n }\n\n if (codexCompanionBinDir && !isAlreadyMounted(codexCompanionBinDir, mountedReadonlyRoots)) {\n args.push(\"--bindmount_ro\", `${codexCompanionBinDir}:${codexCompanionBinDir}`);\n mountedReadonlyRoots.push(codexCompanionBinDir);\n }\n\n mountSharedAgentPaths(args, home);\n\n if (config.readonlyMounts) {\n for (const mountPath of config.readonlyMounts) {\n if (fs.existsSync(mountPath)) {\n args.push(\"--bindmount_ro\", `${mountPath}:${mountPath}`);\n }\n }\n }\n\n if (config.writableMounts) {\n for (const mountPath of config.writableMounts) {\n if (fs.existsSync(mountPath)) {\n args.push(\"--bindmount\", `${mountPath}:${mountPath}`);\n }\n }\n }\n\n args.push(\"--bindmount\", `${sandboxHome}:${sandboxHome}`);\n\n for (const [key, value] of Object.entries(config.env)) {\n args.push(\"--env\", `${key}=${value}`);\n }\n\n const sandboxPath = buildSandboxPath({\n nodeBin,\n npmGlobalPrefix,\n companionBinDirs: [codexCompanionBinDir],\n });\n args.push(\"--env\", `PATH=${sandboxPath}`);\n args.push(\"--env\", `HOME=${sandboxHome}`);\n args.push(\"--env\", \"USER=sandbox\");\n args.push(\"--env\", \"TERM=xterm-256color\");\n\n return args;\n}\n\nexport function buildDockerRunArgs(\n config: SandboxConfig,\n command: string[],\n image = DEFAULT_DOCKER_IMAGE\n): string[] {\n const args: string[] = [\n \"run\",\n \"--rm\",\n \"--interactive\",\n \"--tty\",\n \"--init\",\n \"--workdir\", config.cwd,\n \"--hostname\", \"maestro-sandbox\",\n \"--tmpfs\", \"/tmp:exec,mode=1777\",\n \"--security-opt\", \"no-new-privileges\",\n \"--memory\", String(config.memoryLimit ?? DEFAULT_MEMORY_LIMIT),\n \"--pids-limit\", String(config.maxProcesses ?? DEFAULT_MAX_PROCESSES),\n \"--name\", `maestro-sandbox-${process.pid}-${Date.now()}`,\n ];\n\n const mounts = collectDockerMounts(config);\n for (const mount of mounts) {\n if (mount.type === \"bind\") {\n args.push(\n \"--mount\",\n `type=bind,src=${mount.source},dst=${mount.target}${mount.readonly ? \",readonly\" : \"\"}`\n );\n } else {\n args.push(\n \"--mount\",\n `type=volume,src=${mount.source},dst=${mount.target}${mount.readonly ? \",readonly\" : \"\"}`\n );\n }\n }\n\n const env = {\n ...config.env,\n HOME: config.homeDir ?? \"/root\",\n USER: \"root\",\n TERM: \"xterm-256color\",\n };\n for (const [key, value] of Object.entries(env)) {\n args.push(\"--env\", `${key}=${value}`);\n }\n\n args.push(image, ...command);\n return args;\n}\n\nexport function ensureDockerSandboxImage(): string {\n if (!isDockerAvailable()) {\n throw new Error(\"docker is not available\");\n }\n\n const image = DEFAULT_DOCKER_IMAGE;\n if (dockerImageReadyFor === image) {\n return image;\n }\n\n try {\n execFileSync(getDockerPath(), [\"image\", \"inspect\", image], {\n stdio: [\"ignore\", \"ignore\", \"ignore\"],\n });\n dockerImageReadyFor = image;\n return image;\n } catch {\n const dockerfilePath = resolveDockerSandboxDockerfile();\n const repoRoot = path.resolve(dockerfilePath, \"../../..\");\n console.log(`Building Docker sandbox image ${image} from ${dockerfilePath}`);\n execFileSync(\n getDockerPath(),\n [\"build\", \"-t\", image, \"-f\", dockerfilePath, repoRoot],\n { stdio: \"inherit\" }\n );\n dockerImageReadyFor = image;\n return image;\n }\n}\n\nfunction collectDockerMounts(config: SandboxConfig): DockerMountSpec[] {\n const requested = new Map<string, DockerMountSpec>();\n\n const addResolvedMount = (mount: DockerMountSpec | null) => {\n if (!mount) return;\n\n const key = `${mount.type}:${mount.source}:${mount.target}`;\n const existing = requested.get(key);\n if (existing) {\n existing.readonly = existing.readonly && mount.readonly;\n return;\n }\n requested.set(key, { ...mount });\n };\n\n const addMount = (requestedPath: string, readonly: boolean) => {\n addResolvedMount(resolveDockerMount(requestedPath, readonly));\n };\n\n addMount(config.cwd, false);\n if (config.homeDir) {\n addMount(config.homeDir, false);\n }\n for (const mountPath of config.readonlyMounts ?? []) {\n addMount(mountPath, true);\n }\n for (const mountPath of config.writableMounts ?? []) {\n addMount(mountPath, false);\n }\n\n if (!config.homeDir) {\n const sharedPaths = getSharedAgentPaths(os.homedir());\n for (const sharedPath of sharedPaths.readwrite) {\n addMount(sharedPath, false);\n }\n for (const sharedPath of sharedPaths.readonly) {\n addMount(sharedPath, true);\n }\n }\n\n for (const mount of config.dockerExtraMounts ?? []) {\n addResolvedMount(mount);\n }\n\n return Array.from(requested.values());\n}\n\nfunction resolveDockerMount(\n requestedPath: string,\n readonly: boolean\n): DockerMountSpec | null {\n if (!path.isAbsolute(requestedPath) || !fs.existsSync(requestedPath)) {\n return null;\n }\n\n const selfMount = findCoveringSelfMount(requestedPath);\n if (selfMount?.Destination && selfMount.Type === \"volume\" && selfMount.Name) {\n return {\n type: \"volume\",\n source: selfMount.Name,\n target: selfMount.Destination,\n readonly,\n };\n }\n if (selfMount?.Destination && selfMount.Type === \"bind\" && selfMount.Source) {\n return {\n type: \"bind\",\n source: selfMount.Source,\n target: selfMount.Destination,\n readonly,\n };\n }\n\n // When Maestro itself runs in Docker, only paths backed by a bind/volume\n // mount are visible to sibling `docker run` containers. Image-layer files\n // like `/root/.claude.json` exist here but not on the Docker host.\n if (isRunningInsideContainer()) {\n return null;\n }\n\n return {\n type: \"bind\",\n source: requestedPath,\n target: requestedPath,\n readonly,\n };\n}\n\nexport function resolveDockerMountForPath(\n requestedPath: string,\n readonly = false\n): DockerMountSpec | null {\n return resolveDockerMount(requestedPath, readonly);\n}\n\nfunction getSelfContainerMounts(): DockerInspectMount[] {\n if (cachedSelfMounts !== undefined) {\n return cachedSelfMounts;\n }\n\n if (!isDockerAvailable()) {\n cachedSelfMounts = [];\n return cachedSelfMounts;\n }\n\n try {\n const containerId = os.hostname();\n const raw = execFileSync(\n getDockerPath(),\n [\"inspect\", containerId, \"--format\", \"{{json .Mounts}}\"],\n { encoding: \"utf-8\", stdio: [\"ignore\", \"pipe\", \"ignore\"] }\n ).trim();\n const parsed = JSON.parse(raw) as DockerInspectMount[];\n cachedSelfMounts = Array.isArray(parsed) ? parsed : [];\n } catch {\n cachedSelfMounts = [];\n }\n\n return cachedSelfMounts;\n}\n\nfunction isRunningInsideContainer(): boolean {\n if (runningInsideContainer === undefined) {\n runningInsideContainer = fs.existsSync(\"/.dockerenv\");\n }\n return runningInsideContainer;\n}\n\nfunction findCoveringSelfMount(requestedPath: string): DockerInspectMount | null {\n const mounts = getSelfContainerMounts();\n let best: DockerInspectMount | null = null;\n\n for (const mount of mounts) {\n const destination = mount.Destination;\n if (!destination) continue;\n if (!isPathWithin(requestedPath, destination)) continue;\n if (!best || destination.length > String(best.Destination).length) {\n best = mount;\n }\n }\n\n return best;\n}\n\nfunction getSharedAgentPaths(home: string): {\n readonly: string[];\n readwrite: string[];\n} {\n const codexDir = path.join(home, \".codex\");\n const claudeDir = path.join(home, \".claude\");\n const claudeProjectsDir = path.join(claudeDir, \"projects\");\n const claudeJson = path.join(home, \".claude.json\");\n const gitconfig = path.join(home, \".gitconfig\");\n const ghConfigDir = path.join(home, \".config\", \"gh\");\n\n return {\n // Keep only CLI/runtime config writable here. Maestro's own server state\n // stays outside the generic sandbox mount set and terminal sandboxes use\n // a dedicated isolated HOME under ~/.maestro/sandboxes/terminals/<id>.\n readwrite: [codexDir, claudeDir, claudeProjectsDir, claudeJson, ghConfigDir].filter(fs.existsSync),\n readonly: [gitconfig].filter(fs.existsSync),\n };\n}\n\nfunction mountSharedAgentPaths(args: string[], home: string): void {\n const sharedPaths = getSharedAgentPaths(home);\n\n for (const dir of sharedPaths.readwrite) {\n args.push(\"--bindmount\", `${dir}:${dir}`);\n }\n for (const dir of sharedPaths.readonly) {\n args.push(\"--bindmount_ro\", `${dir}:${dir}`);\n }\n}\n\nfunction resolveDockerSandboxDockerfile(): string {\n const localDir = path.dirname(fileURLToPath(import.meta.url));\n const installRoot = process.env.MAESTRO_INSTALL_ROOT?.trim();\n const candidates = [\n ...(installRoot ? [path.resolve(installRoot, \"assets/docker/sandbox/Dockerfile\")] : []),\n path.resolve(process.cwd(), \"docker/sandbox/Dockerfile\"),\n path.resolve(localDir, \"../../../../docker/sandbox/Dockerfile\"),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n throw new Error(\"Docker sandbox Dockerfile not found\");\n}\n\nfunction isPathWithin(requestedPath: string, basePath: string): boolean {\n if (requestedPath === basePath) return true;\n if (!requestedPath.startsWith(basePath)) return false;\n return requestedPath.charAt(basePath.length) === path.sep;\n}\n\n/**\n * Build the PATH for inside the sandbox, including any companion bin dirs\n * from globally installed CLIs.\n */\nfunction buildSandboxPath(options: {\n nodeBin: string | null;\n npmGlobalPrefix: string | null;\n companionBinDirs: Array<string | null>;\n}): string {\n const pathParts = [...BASE_PATH_DIRS];\n\n if (options.nodeBin && !pathParts.includes(options.nodeBin)) {\n pathParts.unshift(options.nodeBin);\n }\n\n const globalBin = options.npmGlobalPrefix\n ? path.join(options.npmGlobalPrefix, \"bin\")\n : null;\n if (globalBin && !pathParts.includes(globalBin)) {\n pathParts.unshift(globalBin);\n }\n\n for (const dir of options.companionBinDirs) {\n if (dir && !pathParts.includes(dir)) {\n pathParts.unshift(dir);\n }\n }\n\n return pathParts.join(\":\");\n}\n\nfunction getNodeBinaryDir(): string | null {\n try {\n const nodePath = execSync(\"which node\", { encoding: \"utf-8\" }).trim();\n return nodePath ? path.dirname(nodePath) : null;\n } catch {\n return null;\n }\n}\n\nfunction getNpmGlobalPrefix(): string | null {\n try {\n const prefix = execSync(\"npm prefix -g\", { encoding: \"utf-8\" }).trim();\n return prefix || null;\n } catch {\n return null;\n }\n}\n\nfunction getCliCompanionBinDir(cliName: string): string | null {\n try {\n const cliPath = execSync(`which ${cliName}`, { encoding: \"utf-8\" }).trim();\n if (!cliPath) return null;\n return path.dirname(fs.realpathSync(cliPath));\n } catch {\n return null;\n }\n}\n\nfunction isAlreadyMounted(targetPath: string, mountRoots: string[]): boolean {\n return mountRoots.some((root) => isPathWithin(targetPath, root));\n}\n\nexport function __setSelfContainerMountsForTests(mounts: DockerInspectMount[] | undefined): void {\n cachedSelfMounts = mounts;\n}\n\nexport function __setRunningInsideContainerForTests(value: boolean | undefined): void {\n runningInsideContainer = value;\n}\n", "import * as pty from \"node-pty\";\nimport * as os from \"os\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { createRequire } from \"module\";\nimport type { SandboxProvider } from \"@maestro/wire\";\nimport {\n resolveSandboxProvider,\n isNsjailAvailable,\n getNsjailPath,\n getNsjailUnavailableReason,\n buildNsjailArgs,\n isDockerAvailable,\n getDockerPath,\n buildDockerRunArgs,\n ensureDockerSandboxImage,\n ensureSandboxWritable,\n type DockerMountSpec,\n type SandboxConfig,\n} from \"./sandbox.js\";\n\nconst require = createRequire(import.meta.url);\nlet didEnsureSpawnHelper = false;\n\nfunction getShellPath(env?: Record<string, string>): string {\n return env?.SHELL || process.env.SHELL || \"/bin/bash\";\n}\n\nfunction hardenShellHistory(env: Record<string, string>): Record<string, string> {\n const shellName = path.basename(getShellPath(env));\n const hardened = { ...env };\n\n if (shellName === \"bash\") {\n const existingPromptCommand = hardened.PROMPT_COMMAND?.trim();\n const bashOpts = new Set((hardened.BASHOPTS || \"\").split(\":\").filter(Boolean));\n const promptParts = [\"history -a\", \"history -n\"];\n if (existingPromptCommand) {\n promptParts.push(existingPromptCommand);\n }\n\n bashOpts.add(\"histappend\");\n hardened.BASHOPTS = Array.from(bashOpts).join(\":\");\n hardened.PROMPT_COMMAND = promptParts.join(\"; \");\n hardened.HISTCONTROL = hardened.HISTCONTROL || \"ignoredups:erasedups\";\n hardened.HISTSIZE = hardened.HISTSIZE || \"100000\";\n hardened.HISTFILESIZE = hardened.HISTFILESIZE || \"200000\";\n } else if (shellName === \"zsh\") {\n hardened.HISTSIZE = hardened.HISTSIZE || \"100000\";\n hardened.SAVEHIST = hardened.SAVEHIST || \"200000\";\n }\n\n return hardened;\n}\n\nfunction ensureSpawnHelperExecutable(): void {\n if (didEnsureSpawnHelper || process.platform !== \"darwin\") return;\n didEnsureSpawnHelper = true;\n\n try {\n const nodePtyPackage = require.resolve(\"node-pty/package.json\");\n const helperPath = path.join(\n path.dirname(nodePtyPackage),\n \"prebuilds\",\n `darwin-${process.arch}`,\n \"spawn-helper\"\n );\n\n if (!fs.existsSync(helperPath)) return;\n\n const mode = fs.statSync(helperPath).mode & 0o777;\n if ((mode & 0o111) !== 0) return;\n\n fs.chmodSync(helperPath, mode | 0o755);\n console.log(`Fixed node-pty helper permissions: ${helperPath}`);\n } catch (error) {\n console.warn(\"Failed to ensure node-pty helper permissions\", error);\n }\n}\n\nfunction buildChildEnv(env?: Record<string, string>): Record<string, string> {\n const childEnv = hardenShellHistory({\n ...(process.env as Record<string, string>),\n ...env,\n });\n\n // Local Maestro launches may happen from within a Claude Code session.\n // Strip the parent marker so spawned Claude agents don't abort as nested sessions.\n delete childEnv.CLAUDECODE;\n\n return childEnv;\n}\n\nexport interface PtyInstance {\n id: string;\n process: pty.IPty;\n terminalId: string;\n sandboxed: boolean;\n sandboxProvider: SandboxProvider;\n}\n\nconst ptyProcesses = new Map<string, PtyInstance>();\n\nlet idCounter = 0;\n\nfunction generateId(): string {\n return `pty_${Date.now()}_${++idCounter}`;\n}\n\nexport interface PtySpawnOptions {\n terminalId: string;\n cwd: string;\n homeDir?: string;\n cols?: number;\n rows?: number;\n env?: Record<string, string>;\n onData: (data: string) => void;\n onExit: (exitCode: number) => void;\n /** Legacy sandbox toggle; maps to nsjail when true */\n sandbox?: boolean;\n /** Requested sandbox provider */\n sandboxProvider?: SandboxProvider;\n /** Additional read-only mount paths for sandbox */\n readonlyMounts?: string[];\n /** Additional read-write mount paths for sandbox */\n writableMounts?: string[];\n /** Additional Docker-only mounts */\n dockerExtraMounts?: DockerMountSpec[];\n /** Memory limit in bytes for sandbox (default: 512MB) */\n memoryLimit?: number;\n}\n\nexport function spawnPty(options: PtySpawnOptions): PtyInstance {\n ensureSpawnHelperExecutable();\n\n const shell = getShellPath(options.env);\n const cwd = options.cwd || os.homedir();\n const requestedSandboxProvider =\n options.sandboxProvider ?? (options.sandbox ? \"nsjail\" : \"none\");\n const sandboxProvider = resolveSandboxProvider(requestedSandboxProvider);\n let actualSandboxProvider = sandboxProvider;\n const fullEnv = buildChildEnv(options.env);\n\n let ptyProcess: pty.IPty;\n\n if (sandboxProvider === \"nsjail\") {\n // Ensure project dir is writable by sandbox user (uid 1500)\n ensureSandboxWritable(cwd);\n\n const sandboxConfig: SandboxConfig = {\n cwd,\n homeDir: options.homeDir,\n env: fullEnv,\n readonlyMounts: options.readonlyMounts,\n writableMounts: options.writableMounts,\n memoryLimit: options.memoryLimit,\n };\n\n const nsjailArgs = [\n ...buildNsjailArgs(sandboxConfig),\n \"--\", shell, \"-l\",\n ];\n\n ptyProcess = pty.spawn(getNsjailPath(), nsjailArgs, {\n name: \"xterm-256color\",\n cols: options.cols ?? 120,\n rows: options.rows ?? 30,\n cwd,\n // nsjail manages env vars via --env flags, but node-pty still needs\n // a minimal env for the PTY master side\n env: { TERM: \"xterm-256color\" },\n });\n\n console.log(`Spawned sandboxed PTY for terminal ${options.terminalId}`);\n } else if (sandboxProvider === \"docker\") {\n const sandboxConfig: SandboxConfig = {\n cwd,\n homeDir: options.homeDir,\n env: fullEnv,\n readonlyMounts: options.readonlyMounts,\n writableMounts: options.writableMounts,\n dockerExtraMounts: options.dockerExtraMounts,\n memoryLimit: options.memoryLimit,\n };\n\n const dockerArgs = buildDockerRunArgs(\n sandboxConfig,\n [\"/bin/bash\", \"-l\"],\n ensureDockerSandboxImage()\n );\n\n ptyProcess = pty.spawn(getDockerPath(), dockerArgs, {\n name: \"xterm-256color\",\n cols: options.cols ?? 120,\n rows: options.rows ?? 30,\n cwd,\n env: { TERM: \"xterm-256color\" },\n });\n\n console.log(`Spawned docker-sandboxed PTY for terminal ${options.terminalId}`);\n } else {\n if (requestedSandboxProvider === \"nsjail\" && !isNsjailAvailable()) {\n const reason = getNsjailUnavailableReason();\n throw new Error(\n `Sandbox requested for terminal ${options.terminalId} but nsjail is not available ` +\n `(platform: ${process.platform}${reason ? `, reason: ${reason}` : \"\"}).`\n );\n }\n if (requestedSandboxProvider === \"docker\" && !isDockerAvailable()) {\n throw new Error(\n `Sandbox requested for terminal ${options.terminalId} but docker is not available.`\n );\n }\n\n ptyProcess = pty.spawn(shell, [\"-l\"], {\n name: \"xterm-256color\",\n cols: options.cols ?? 120,\n rows: options.rows ?? 30,\n cwd,\n env: fullEnv,\n });\n }\n\n const id = generateId();\n const instance: PtyInstance = {\n id,\n process: ptyProcess,\n terminalId: options.terminalId,\n sandboxed: actualSandboxProvider !== \"none\",\n sandboxProvider: actualSandboxProvider,\n };\n\n ptyProcesses.set(id, instance);\n\n ptyProcess.onData((data) => {\n options.onData(data);\n });\n\n ptyProcess.onExit(({ exitCode }) => {\n ptyProcesses.delete(id);\n options.onExit(exitCode);\n });\n\n return instance;\n}\n\nexport function writeToPty(ptyId: string, data: string): boolean {\n const instance = ptyProcesses.get(ptyId);\n if (!instance) return false;\n instance.process.write(data);\n return true;\n}\n\nexport function writeCommandToPty(ptyId: string, command: string): boolean {\n const instance = ptyProcesses.get(ptyId);\n if (!instance) return false;\n instance.process.write(command);\n instance.process.write(\"\\r\");\n return true;\n}\n\nexport function resizePty(\n ptyId: string,\n cols: number,\n rows: number\n): boolean {\n const instance = ptyProcesses.get(ptyId);\n if (!instance) return false;\n instance.process.resize(cols, rows);\n return true;\n}\n\nexport function killPty(ptyId: string): boolean {\n const instance = ptyProcesses.get(ptyId);\n if (!instance) return false;\n try {\n instance.process.kill();\n } catch {\n // Already dead\n }\n ptyProcesses.delete(ptyId);\n return true;\n}\n\nexport function killAllPty(): void {\n let killed = 0;\n for (const [id, instance] of ptyProcesses) {\n try {\n instance.process.kill();\n killed++;\n } catch {\n // Ignore\n }\n }\n ptyProcesses.clear();\n console.log(`Killed ${killed} PTY process(es) on shutdown`);\n}\n\nexport function getPtyByTerminal(terminalId: string): PtyInstance | undefined {\n for (const instance of ptyProcesses.values()) {\n if (instance.terminalId === terminalId) return instance;\n }\n return undefined;\n}\n\nexport function getAllPty(): PtyInstance[] {\n return Array.from(ptyProcesses.values());\n}\n", "import * as os from \"os\";\nimport * as path from \"path\";\nimport * as fs from \"fs\";\nimport type { AgentProvider } from \"@maestro/wire\";\n\nexport interface InteractiveCommandParams {\n binaryPath: string;\n prompt: string;\n projectPath: string;\n skipPermissions?: boolean;\n sandbox?: boolean;\n secondaryProjectPaths?: string[];\n mcpConfigPath?: string;\n skills?: string[];\n}\n\nexport interface CustomProviderConfig {\n displayName?: string | null;\n commandTemplate?: string | null;\n env?: Record<string, unknown> | null;\n}\n\nexport interface CLIProvider {\n readonly id: string;\n readonly displayName: string;\n readonly binaryName: string;\n\n resolveBinaryPath(): string;\n buildInteractiveCommand(params: InteractiveCommandParams): string;\n getPtyEnvVars(\n agentId: string,\n projectPath: string,\n skills: string[]\n ): Record<string, string>;\n}\n\nfunction escapeShell(s: string): string {\n return s.replace(/'/g, \"'\\\\''\");\n}\n\nfunction quoteShell(s: string): string {\n return `'${escapeShell(s)}'`;\n}\n\nfunction toStringRecord(\n value: Record<string, unknown> | null | undefined\n): Record<string, string> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return {};\n }\n\n const result: Record<string, string> = {};\n for (const [key, raw] of Object.entries(value)) {\n if (typeof raw === \"string\") {\n result[key] = raw;\n }\n }\n return result;\n}\n\nexport class ClaudeProvider implements CLIProvider {\n readonly id = \"claude\";\n readonly displayName = \"Claude Code\";\n readonly binaryName = \"claude\";\n\n resolveBinaryPath(): string {\n // Check common locations\n const candidates = [\n path.join(os.homedir(), \".npm-global/bin/claude\"),\n \"/usr/local/bin/claude\",\n \"claude\",\n ];\n for (const c of candidates) {\n if (c !== \"claude\" && fs.existsSync(c)) return c;\n }\n return \"claude\";\n }\n\n buildInteractiveCommand(params: InteractiveCommandParams): string {\n let cmd = quoteShell(params.binaryPath);\n\n if (params.mcpConfigPath && fs.existsSync(params.mcpConfigPath)) {\n cmd += ` --mcp-config ${quoteShell(params.mcpConfigPath)}`;\n }\n\n if (params.skipPermissions && params.sandbox) {\n cmd += \" --dangerously-skip-permissions\";\n }\n\n if (params.secondaryProjectPaths) {\n for (const p of params.secondaryProjectPaths) {\n if (fs.existsSync(p)) {\n cmd += ` --add-dir ${quoteShell(p)}`;\n }\n }\n }\n\n let finalPrompt = params.prompt;\n if (params.prompt && params.skills?.length) {\n const skillsList = params.skills.join(\", \");\n finalPrompt = `[IMPORTANT: Use these skills for this session: ${skillsList}. Invoke them with /<skill-name> when relevant to the task.] ${params.prompt}`;\n }\n\n if (finalPrompt) {\n cmd += ` -p ${quoteShell(finalPrompt)}`;\n }\n\n return cmd;\n }\n\n getPtyEnvVars(\n agentId: string,\n projectPath: string,\n skills: string[]\n ): Record<string, string> {\n return {\n CLAUDE_SKILLS: skills.join(\",\"),\n CLAUDE_AGENT_ID: agentId,\n CLAUDE_PROJECT_PATH: projectPath,\n };\n }\n}\n\nexport class CodexProvider implements CLIProvider {\n readonly id = \"codex\";\n readonly displayName = \"Codex\";\n readonly binaryName = \"codex\";\n\n resolveBinaryPath(): string {\n return \"codex\";\n }\n\n buildInteractiveCommand(params: InteractiveCommandParams): string {\n let cmd = `${quoteShell(params.binaryPath)} exec`;\n\n if (params.skipPermissions) {\n cmd += \" --yolo\";\n }\n\n if (params.prompt) {\n cmd += ` ${quoteShell(params.prompt)}`;\n }\n\n return cmd;\n }\n\n getPtyEnvVars(): Record<string, string> {\n return {};\n }\n}\n\nexport class ShellProvider implements CLIProvider {\n readonly id = \"none\";\n readonly displayName = \"None\";\n readonly binaryName = \"shell\";\n\n resolveBinaryPath(): string {\n return process.env.SHELL || \"/bin/bash\";\n }\n\n buildInteractiveCommand(): string {\n return \"\";\n }\n\n getPtyEnvVars(): Record<string, string> {\n return {};\n }\n}\n\nexport class CustomProvider implements CLIProvider {\n readonly id = \"custom\";\n readonly displayName: string;\n readonly binaryName = \"shell\";\n\n constructor(private readonly config: CustomProviderConfig) {\n this.displayName = config.displayName?.trim() || \"Custom CLI\";\n }\n\n resolveBinaryPath(): string {\n return process.env.SHELL || \"/bin/bash\";\n }\n\n buildInteractiveCommand(params: InteractiveCommandParams): string {\n const template = this.config.commandTemplate?.trim();\n if (!template) {\n throw new Error(\"Custom CLI command template is required\");\n }\n const hasPromptPlaceholder = /\\{\\{\\s*prompt\\s*\\}\\}/.test(template);\n\n const values: Record<string, string | undefined> = {\n prompt: params.prompt,\n projectPath: params.projectPath,\n };\n\n let command = template.replace(\n /\\{\\{\\s*(prompt|projectPath)\\s*\\}\\}/g,\n (_match, key: \"prompt\" | \"projectPath\") =>\n quoteShell(values[key] ?? \"\")\n );\n\n if (params.prompt && !hasPromptPlaceholder) {\n command += ` ${quoteShell(params.prompt)}`;\n }\n\n return command;\n }\n\n getPtyEnvVars(\n agentId: string,\n projectPath: string\n ): Record<string, string> {\n return {\n MAESTRO_AGENT_ID: agentId,\n MAESTRO_PROJECT_PATH: projectPath,\n ...toStringRecord(this.config.env),\n };\n }\n}\n\nconst providers: Record<string, CLIProvider> = {\n none: new ShellProvider(),\n claude: new ClaudeProvider(),\n codex: new CodexProvider(),\n};\n\nexport function getProvider(\n id?: AgentProvider,\n customConfig?: CustomProviderConfig\n): CLIProvider {\n if (id === \"custom\") {\n return new CustomProvider(customConfig ?? {});\n }\n return providers[id ?? \"claude\"] ?? providers.claude;\n}\n", "export interface TerminalOutputChunk {\n seq: number;\n data: string;\n}\n\nexport interface TerminalSnapshotState {\n cursor: number;\n data: string;\n}\n\nexport type TerminalAttachResponse =\n | {\n mode: \"snapshot\";\n terminalId: string;\n output: string[];\n cursor: number;\n }\n | {\n mode: \"replay\";\n terminalId: string;\n chunks: TerminalOutputChunk[];\n cursor: number;\n };\n\nexport function buildTerminalSnapshotOutput(options: {\n outputBuffer: TerminalOutputChunk[];\n persistedSnapshot?: TerminalSnapshotState | null;\n history?: string;\n}): { output: string[]; cursor: number } {\n const { outputBuffer, persistedSnapshot, history } = options;\n\n if (persistedSnapshot) {\n const output = [persistedSnapshot.data];\n let cursor = persistedSnapshot.cursor;\n let nextSeq = persistedSnapshot.cursor + 1;\n\n for (const chunk of outputBuffer) {\n if (chunk.seq < nextSeq) {\n continue;\n }\n if (chunk.seq !== nextSeq) {\n break;\n }\n\n output.push(chunk.data);\n cursor = chunk.seq;\n nextSeq += 1;\n }\n\n return { output, cursor };\n }\n\n if (outputBuffer.length > 0) {\n return {\n output: outputBuffer.map((chunk) => chunk.data),\n cursor: outputBuffer[outputBuffer.length - 1].seq,\n };\n }\n\n if (history) {\n return { output: [history], cursor: 0 };\n }\n\n return { output: [], cursor: 0 };\n}\n\nexport function buildTerminalAttachResponse(options: {\n terminalId: string;\n requestedCursor?: number;\n outputBuffer: TerminalOutputChunk[];\n snapshotOutput: string[];\n snapshotCursor: number;\n}): TerminalAttachResponse {\n const { terminalId, requestedCursor, outputBuffer, snapshotOutput, snapshotCursor } = options;\n\n if (\n requestedCursor !== undefined &&\n requestedCursor > 0 &&\n requestedCursor <= snapshotCursor &&\n outputBuffer.length > 0\n ) {\n const firstBufferedSeq = outputBuffer[0].seq;\n const replayStartSeq = requestedCursor + 1;\n\n if (replayStartSeq >= firstBufferedSeq) {\n return {\n mode: \"replay\",\n terminalId,\n chunks: outputBuffer.filter((chunk) => chunk.seq >= replayStartSeq),\n cursor: snapshotCursor,\n };\n }\n }\n\n return {\n mode: \"snapshot\",\n terminalId,\n output: snapshotOutput,\n cursor: snapshotCursor,\n };\n}\n", "const MAX_RECENT_TERMINAL_INPUTS = 10;\n\nfunction removeLastCharacter(value: string): string {\n const chars = Array.from(value);\n chars.pop();\n return chars.join(\"\");\n}\n\nfunction removeLastWord(value: string): string {\n const chars = Array.from(value);\n while (chars.length > 0 && /\\s/.test(chars[chars.length - 1] ?? \"\")) {\n chars.pop();\n }\n while (chars.length > 0 && !/\\s/.test(chars[chars.length - 1] ?? \"\")) {\n chars.pop();\n }\n return chars.join(\"\");\n}\n\nfunction commitInput(recentInputs: string[], currentLine: string) {\n const normalized = currentLine.trimEnd();\n if (!normalized.trim()) {\n return;\n }\n recentInputs.push(normalized);\n}\n\nexport function applyTerminalInputChunk(\n currentLine: string,\n data: string\n): { currentLine: string; committedInputs: string[] } {\n let nextLine = currentLine;\n const committedInputs: string[] = [];\n\n for (let index = 0; index < data.length; index += 1) {\n const char = data[index];\n\n if (!char) continue;\n\n if (char === \"\\x1b\") {\n while (index + 1 < data.length) {\n const nextChar = data[index + 1];\n if (!nextChar) break;\n if (/[A-Za-z~]/.test(nextChar)) {\n index += 1;\n break;\n }\n if (nextChar === \"[\" || nextChar === \"]\" || /[0-9;?]/.test(nextChar)) {\n index += 1;\n continue;\n }\n break;\n }\n continue;\n }\n\n if (char === \"\\r\" || char === \"\\n\") {\n commitInput(committedInputs, nextLine);\n nextLine = \"\";\n if (char === \"\\r\" && data[index + 1] === \"\\n\") {\n index += 1;\n }\n continue;\n }\n\n if (char === \"\\u0003\") {\n nextLine = \"\";\n continue;\n }\n\n if (char === \"\\u0008\" || char === \"\\u007f\") {\n nextLine = removeLastCharacter(nextLine);\n continue;\n }\n\n if (char === \"\\u0015\") {\n nextLine = \"\";\n continue;\n }\n\n if (char === \"\\u0017\") {\n nextLine = removeLastWord(nextLine);\n continue;\n }\n\n if (char < \" \") {\n continue;\n }\n\n nextLine += char;\n }\n\n return { currentLine: nextLine, committedInputs };\n}\n\nexport function appendRecentTerminalInputs(\n recentInputs: string[],\n inputs: string[]\n): string[] {\n const nextRecentInputs = recentInputs.slice(-MAX_RECENT_TERMINAL_INPUTS);\n\n for (const input of inputs) {\n commitInput(nextRecentInputs, input);\n }\n\n return nextRecentInputs.slice(-MAX_RECENT_TERMINAL_INPUTS);\n}\n\nexport { MAX_RECENT_TERMINAL_INPUTS };\n", "import headless from \"@xterm/headless\";\nimport serializePkg from \"@xterm/addon-serialize\";\n\nconst { Terminal: HeadlessTerminal } = headless;\nconst { SerializeAddon } = serializePkg;\n\nexport interface TerminalReplicaSnapshot {\n cursor: number;\n data: string;\n savedAt: number;\n cols: number;\n rows: number;\n}\n\ninterface CreateTerminalReplicaOptions {\n cols?: number;\n rows?: number;\n scrollback?: number;\n snapshot?: Pick<TerminalReplicaSnapshot, \"data\" | \"cols\" | \"rows\"> | null;\n}\n\nexport class TerminalReplica {\n private readonly terminal;\n private readonly serializeAddon;\n private pending: Promise<void> = Promise.resolve();\n private disposed = false;\n private lastSnapshot: TerminalReplicaSnapshot;\n\n constructor(options: CreateTerminalReplicaOptions = {}) {\n const cols = options.snapshot?.cols ?? options.cols ?? 120;\n const rows = options.snapshot?.rows ?? options.rows ?? 30;\n const scrollback = options.scrollback ?? 50000;\n\n this.terminal = new HeadlessTerminal({\n cols,\n rows,\n scrollback,\n allowProposedApi: true,\n convertEol: false,\n disableStdin: true,\n });\n this.serializeAddon = new SerializeAddon();\n this.terminal.loadAddon(this.serializeAddon);\n this.lastSnapshot = {\n cursor: 0,\n data: \"\",\n savedAt: Date.now(),\n cols,\n rows,\n };\n\n if (options.snapshot?.data) {\n void this.replaceSnapshot({\n data: options.snapshot.data,\n cols,\n rows,\n }, 0);\n } else {\n this.refreshSnapshot(0);\n }\n }\n\n write(data: string, cursor: number): Promise<void> {\n return this.enqueue(() =>\n new Promise<void>((resolve) => {\n this.terminal.write(data, () => {\n this.refreshSnapshot(cursor);\n resolve();\n });\n })\n );\n }\n\n resize(cols: number, rows: number, cursor: number): Promise<void> {\n return this.enqueue(() => {\n this.terminal.resize(cols, rows);\n this.refreshSnapshot(cursor);\n });\n }\n\n replaceSnapshot(\n snapshot: Pick<TerminalReplicaSnapshot, \"data\" | \"cols\" | \"rows\">,\n cursor: number\n ): Promise<void> {\n return this.enqueue(async () => {\n this.terminal.reset();\n if (this.terminal.cols !== snapshot.cols || this.terminal.rows !== snapshot.rows) {\n this.terminal.resize(snapshot.cols, snapshot.rows);\n }\n if (snapshot.data) {\n await new Promise<void>((resolve) => {\n this.terminal.write(snapshot.data, resolve);\n });\n }\n this.refreshSnapshot(cursor);\n });\n }\n\n async snapshot(): Promise<TerminalReplicaSnapshot> {\n await this.pending;\n return this.lastSnapshot;\n }\n\n dispose(): void {\n this.disposed = true;\n this.terminal.dispose();\n }\n\n private enqueue(operation: () => void | Promise<void>): Promise<void> {\n const next = this.pending.then(async () => {\n if (this.disposed) {\n return;\n }\n await operation();\n });\n this.pending = next.catch(() => undefined);\n return next;\n }\n\n private refreshSnapshot(cursor: number): void {\n this.lastSnapshot = {\n cursor,\n data: this.serializeAddon.serialize(),\n savedAt: Date.now(),\n cols: this.terminal.cols,\n rows: this.terminal.rows,\n };\n }\n}\n\nexport function createTerminalReplica(\n options: CreateTerminalReplicaOptions = {}\n): TerminalReplica {\n return new TerminalReplica(options);\n}\n", "import * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\n\nexport const MAESTRO_DATA_DIR = path.join(os.homedir(), \".maestro\");\nexport const MAESTRO_PROJECTS_DIR = path.join(MAESTRO_DATA_DIR, \"projects\");\nexport const MAESTRO_SANDBOXES_DIR = path.join(MAESTRO_DATA_DIR, \"sandboxes\");\nexport const MAESTRO_SANDBOX_TERMINALS_DIR = path.join(MAESTRO_SANDBOXES_DIR, \"terminals\");\nexport const MAESTRO_SANDBOX_WORKTREES_DIR = path.join(MAESTRO_SANDBOXES_DIR, \"worktrees\");\n\nexport function ensureDataDir(): string {\n fs.mkdirSync(MAESTRO_DATA_DIR, { recursive: true });\n return MAESTRO_DATA_DIR;\n}\n\nexport function ensureSandboxesDir(): string {\n fs.mkdirSync(MAESTRO_SANDBOXES_DIR, { recursive: true });\n return MAESTRO_SANDBOXES_DIR;\n}\n\nexport function ensureDir(dirPath: string): string {\n fs.mkdirSync(dirPath, { recursive: true });\n return dirPath;\n}\n\nexport function readJsonFile<T>(filePath: string, fallback: T): T {\n try {\n if (!fs.existsSync(filePath)) {\n return fallback;\n }\n\n const raw = fs.readFileSync(filePath, \"utf-8\");\n return JSON.parse(raw) as T;\n } catch {\n return fallback;\n }\n}\n\nexport function writeJsonFile(\n filePath: string,\n value: unknown,\n options?: { mode?: number }\n): void {\n ensureDir(path.dirname(filePath));\n const tempPath = `${filePath}.tmp`;\n fs.writeFileSync(tempPath, `${JSON.stringify(value, null, 2)}\\n`, {\n mode: options?.mode,\n });\n fs.renameSync(tempPath, filePath);\n if (options?.mode != null) {\n fs.chmodSync(filePath, options.mode);\n }\n}\n\nexport function nowIso(): string {\n return new Date().toISOString();\n}\n", "import * as fs from \"fs\";\nimport * as path from \"path\";\nimport { execSync } from \"child_process\";\nimport { MAESTRO_SANDBOX_WORKTREES_DIR } from \"../state/files.js\";\n\nconst DEFAULT_WORKTREE_BASE = MAESTRO_SANDBOX_WORKTREES_DIR;\nconst WORKTREE_BASE = process.env.MAESTRO_WORKTREE_BASE?.trim() || DEFAULT_WORKTREE_BASE;\n\nexport function getWorktreeBasePath(): string {\n return WORKTREE_BASE;\n}\n\n/**\n * Create a git worktree for a terminal.\n * Creates a new branch `agent/<terminalId>` from the requested git ref.\n * Returns the absolute path to the new worktree.\n */\nexport function createTerminalWorktree(\n projectPath: string,\n terminalId: string,\n startPoint = \"HEAD\"\n): string {\n const worktreeDir = path.join(WORKTREE_BASE, terminalId);\n const branchName = `agent/${terminalId}`;\n\n // Ensure base directory exists\n fs.mkdirSync(WORKTREE_BASE, { recursive: true });\n\n // Drop stale worktree metadata first so missing /tmp directories don't block recovery.\n try {\n execSync(\"git worktree prune\", { cwd: projectPath, stdio: \"ignore\" });\n } catch {\n // Best effort\n }\n\n // Clean up stale worktree at this path if it exists\n if (fs.existsSync(worktreeDir)) {\n try {\n execSync(`git worktree remove --force ${JSON.stringify(worktreeDir)}`, {\n cwd: projectPath,\n stdio: \"ignore\",\n });\n } catch {\n // May fail if the main repo moved; force-remove the directory\n fs.rmSync(worktreeDir, { recursive: true, force: true });\n }\n }\n\n // Delete the branch if it already exists (stale from a previous agent)\n try {\n execSync(`git branch -D ${JSON.stringify(branchName)}`, {\n cwd: projectPath,\n stdio: \"ignore\",\n });\n } catch {\n // Branch doesn't exist \u2014 fine\n }\n\n // Create the worktree with a new branch from the requested start point.\n execSync(\n `git worktree add -b ${JSON.stringify(branchName)} ${JSON.stringify(worktreeDir)} ${JSON.stringify(startPoint)}`,\n { cwd: projectPath, stdio: \"pipe\" }\n );\n\n console.log(\n `Created worktree for terminal ${terminalId}: ${worktreeDir} (branch: ${branchName})`\n );\n\n return worktreeDir;\n}\n\n/**\n * Remove a git worktree created for a terminal.\n * Also deletes the associated branch.\n */\nexport function removeTerminalWorktree(\n projectPath: string,\n terminalId: string\n): void {\n const worktreeDir = path.join(WORKTREE_BASE, terminalId);\n const branchName = `agent/${terminalId}`;\n\n // Remove the worktree\n if (fs.existsSync(worktreeDir)) {\n try {\n execSync(\n `git worktree remove --force ${JSON.stringify(worktreeDir)}`,\n { cwd: projectPath, stdio: \"ignore\" }\n );\n } catch {\n // Fallback: just delete the directory\n fs.rmSync(worktreeDir, { recursive: true, force: true });\n }\n }\n\n // Prune stale worktree references\n try {\n execSync(\"git worktree prune\", { cwd: projectPath, stdio: \"ignore\" });\n } catch {\n // Best effort\n }\n\n // Delete the branch\n try {\n execSync(`git branch -D ${JSON.stringify(branchName)}`, {\n cwd: projectPath,\n stdio: \"ignore\",\n });\n } catch {\n // Branch may already be gone\n }\n\n console.log(`Removed worktree for terminal ${terminalId}`);\n}\n\n/**\n * Check if a project path is a git repository.\n */\nexport function isGitRepo(projectPath: string): boolean {\n try {\n execSync(\"git rev-parse --is-inside-work-tree\", {\n cwd: projectPath,\n stdio: \"pipe\",\n });\n return true;\n } catch {\n return false;\n }\n}\n", "import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { MAESTRO_SANDBOX_TERMINALS_DIR } from \"../state/files.js\";\n\nconst DEFAULT_TERMINAL_STATE_BASE = MAESTRO_SANDBOX_TERMINALS_DIR;\nconst TERMINAL_STATE_BASE =\n process.env.MAESTRO_TERMINAL_STATE_BASE?.trim() || DEFAULT_TERMINAL_STATE_BASE;\nconst BOOTSTRAP_MARKER = \".bootstrap-complete\";\n\nexport interface TerminalIsolationPaths {\n rootDir: string;\n homeDir: string;\n}\n\nfunction getGlobalHome(): string {\n return os.homedir();\n}\n\nexport function getTerminalIsolationPaths(terminalId: string): TerminalIsolationPaths {\n const rootDir = path.join(TERMINAL_STATE_BASE, terminalId);\n return {\n rootDir,\n homeDir: path.join(rootDir, \"home\"),\n };\n}\n\nfunction copyPathIfPresent(source: string, target: string): void {\n if (!fs.existsSync(source) || fs.existsSync(target)) {\n return;\n }\n\n const stat = fs.statSync(source);\n fs.mkdirSync(path.dirname(target), { recursive: true });\n\n if (stat.isDirectory()) {\n fs.cpSync(source, target, {\n recursive: true,\n errorOnExist: false,\n });\n return;\n }\n\n fs.copyFileSync(source, target);\n}\n\nfunction bootstrapTerminalHome(homeDir: string): void {\n const markerPath = path.join(homeDir, BOOTSTRAP_MARKER);\n if (fs.existsSync(markerPath)) {\n return;\n }\n\n const globalHome = getGlobalHome();\n const copies: Array<[string, string]> = [\n [path.join(globalHome, \".gitconfig\"), path.join(homeDir, \".gitconfig\")],\n [path.join(globalHome, \".claude.json\"), path.join(homeDir, \".claude.json\")],\n [path.join(globalHome, \".config\", \"gh\"), path.join(homeDir, \".config\", \"gh\")],\n [path.join(globalHome, \".claude\"), path.join(homeDir, \".claude\")],\n [path.join(globalHome, \".codex\"), path.join(homeDir, \".codex\")],\n ];\n\n for (const [source, target] of copies) {\n copyPathIfPresent(source, target);\n }\n\n // Pre-create shell history so login shells don't emit noisy warnings when\n // history append is enabled inside isolated homes.\n fs.writeFileSync(path.join(homeDir, \".bash_history\"), \"\", { flag: \"a\" });\n fs.writeFileSync(markerPath, new Date().toISOString());\n}\n\nexport function ensureTerminalIsolationHome(terminalId: string): TerminalIsolationPaths {\n const paths = getTerminalIsolationPaths(terminalId);\n fs.mkdirSync(paths.homeDir, { recursive: true });\n bootstrapTerminalHome(paths.homeDir);\n return paths;\n}\n\nexport function removeTerminalIsolationState(terminalId: string): void {\n const paths = getTerminalIsolationPaths(terminalId);\n fs.rmSync(paths.rootDir, { recursive: true, force: true });\n}\n", "import * as os from \"os\";\nimport * as path from \"path\";\nimport { execFileSync } from \"child_process\";\nimport { MAESTRO_PROJECTS_DIR, MAESTRO_SANDBOXES_DIR } from \"../state/files.js\";\nimport {\n getDockerPath,\n isDockerAvailable,\n resolveDockerMountForPath,\n type DockerMountSpec,\n} from \"./sandbox.js\";\n\nconst DEFAULT_DIND_IMAGE = process.env.MAESTRO_DIND_IMAGE || \"docker:29-dind\";\nconst DEFAULT_DIND_READY_TIMEOUT_MS = Number(\n process.env.MAESTRO_DIND_READY_TIMEOUT_MS || \"30000\"\n);\nconst DIND_SOCKET_DIR = \"/var/run/maestro-dind\";\nconst DIND_SOCKET_PATH = `${DIND_SOCKET_DIR}/docker.sock`;\n\nexport interface TerminalDockerRuntime {\n containerName: string;\n stateVolumeName: string;\n socketVolumeName: string;\n socketMount: DockerMountSpec;\n dockerHost: string;\n composeProjectName: string;\n}\n\nfunction getTerminalDockerResourceSuffix(terminalId: string): string {\n return terminalId.toLowerCase().replace(/[^a-z0-9_.-]/g, \"-\");\n}\n\nexport function getTerminalDockerRuntime(terminalId: string): TerminalDockerRuntime {\n const suffix = getTerminalDockerResourceSuffix(terminalId);\n return {\n containerName: `maestro-dind-${suffix}`,\n stateVolumeName: `maestro-dind-state-${suffix}`,\n socketVolumeName: `maestro-dind-sock-${suffix}`,\n socketMount: {\n type: \"volume\",\n source: `maestro-dind-sock-${suffix}`,\n target: DIND_SOCKET_DIR,\n readonly: false,\n },\n dockerHost: `unix://${DIND_SOCKET_PATH}`,\n composeProjectName: `maestro-${suffix}`,\n };\n}\n\nfunction getSharedTerminalRuntimeMounts(): DockerMountSpec[] {\n const requestedPaths = [\n MAESTRO_SANDBOXES_DIR,\n MAESTRO_PROJECTS_DIR,\n ];\n\n return requestedPaths.flatMap((requestedPath) => {\n const mount = resolveDockerMountForPath(requestedPath, false);\n return mount ? [mount] : [];\n });\n}\n\nfunction inspectContainerRunning(containerName: string): boolean | null {\n try {\n const value = execFileSync(\n getDockerPath(),\n [\"inspect\", containerName, \"--format\", \"{{.State.Running}}\"],\n { encoding: \"utf-8\", stdio: [\"ignore\", \"pipe\", \"ignore\"] }\n ).trim();\n return value === \"true\";\n } catch {\n return null;\n }\n}\n\nfunction buildDindRunArgs(runtime: TerminalDockerRuntime): string[] {\n const args: string[] = [\n \"run\",\n \"--detach\",\n \"--privileged\",\n \"--name\", runtime.containerName,\n \"--tmpfs\", \"/tmp:exec,mode=1777\",\n \"--env\", \"DOCKER_TLS_CERTDIR=\",\n \"--mount\", `type=volume,src=${runtime.stateVolumeName},dst=/var/lib/docker`,\n \"--mount\", `type=volume,src=${runtime.socketVolumeName},dst=${DIND_SOCKET_DIR}`,\n ];\n\n for (const mount of getSharedTerminalRuntimeMounts()) {\n args.push(\n \"--mount\",\n `type=${mount.type},src=${mount.source},dst=${mount.target}${mount.readonly ? \",readonly\" : \"\"}`\n );\n }\n\n args.push(\n DEFAULT_DIND_IMAGE,\n \"--host\",\n runtime.dockerHost,\n \"--storage-driver\",\n \"overlay2\"\n );\n return args;\n}\n\nfunction recreateContainer(runtime: TerminalDockerRuntime): void {\n try {\n execFileSync(getDockerPath(), [\"rm\", \"-f\", runtime.containerName], {\n stdio: [\"ignore\", \"ignore\", \"ignore\"],\n });\n } catch {\n // best effort\n }\n\n execFileSync(getDockerPath(), buildDindRunArgs(runtime), {\n stdio: [\"ignore\", \"inherit\", \"inherit\"],\n });\n}\n\nfunction waitForDockerRuntime(runtime: TerminalDockerRuntime): void {\n const deadline = Date.now() + DEFAULT_DIND_READY_TIMEOUT_MS;\n let lastError: unknown = null;\n\n while (Date.now() < deadline) {\n try {\n execFileSync(\n getDockerPath(),\n [\n \"exec\",\n runtime.containerName,\n \"docker\",\n \"--host\",\n runtime.dockerHost,\n \"version\",\n \"--format\",\n \"{{.Server.Version}}\",\n ],\n { stdio: [\"ignore\", \"ignore\", \"pipe\"] }\n );\n return;\n } catch (error) {\n lastError = error;\n Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 250);\n }\n }\n\n throw new Error(\n `Timed out waiting for terminal Docker runtime ${runtime.containerName} to become ready` +\n (lastError instanceof Error ? `: ${lastError.message}` : \"\")\n );\n}\n\nexport function ensureTerminalDockerRuntime(terminalId: string): TerminalDockerRuntime {\n if (!isDockerAvailable()) {\n throw new Error(\"docker is not available\");\n }\n\n const runtime = getTerminalDockerRuntime(terminalId);\n const running = inspectContainerRunning(runtime.containerName);\n if (running !== true) {\n recreateContainer(runtime);\n }\n waitForDockerRuntime(runtime);\n return runtime;\n}\n\nexport function cleanupTerminalDockerRuntime(terminalId: string): void {\n if (!isDockerAvailable()) {\n return;\n }\n\n const runtime = getTerminalDockerRuntime(terminalId);\n try {\n execFileSync(getDockerPath(), [\"rm\", \"-f\", runtime.containerName], {\n stdio: [\"ignore\", \"ignore\", \"ignore\"],\n });\n } catch {\n // best effort\n }\n\n for (const volumeName of [runtime.socketVolumeName, runtime.stateVolumeName]) {\n try {\n execFileSync(getDockerPath(), [\"volume\", \"rm\", \"-f\", volumeName], {\n stdio: [\"ignore\", \"ignore\", \"ignore\"],\n });\n } catch {\n // best effort\n }\n }\n}\n", "import * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { execFileSync } from \"node:child_process\";\nimport * as pty from \"node-pty\";\n\nconst ANSI_RE = /\\x1b(?:\\][^\\x07\\x1b]*(?:\\x07|\\x1b\\\\)?|\\[[0-9;]*[A-Za-z])/g;\n\nfunction stripAnsi(text: string): string {\n return text.replace(ANSI_RE, \"\");\n}\n\nfunction getCredentialHomes(): string[] {\n const candidates = [\n process.env.HOME,\n os.homedir(),\n \"/root\",\n \"/home/sandbox\",\n ];\n\n return Array.from(new Set(candidates.filter((value): value is string => Boolean(value))));\n}\n\nfunction decodeJwtPayload(token: string): Record<string, unknown> | null {\n const [, payload] = token.split(\".\");\n if (!payload) return null;\n\n try {\n const normalized = payload.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, \"=\");\n const json = Buffer.from(padded, \"base64\").toString(\"utf8\");\n const parsed = JSON.parse(json);\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? parsed as Record<string, unknown>\n : null;\n } catch {\n return null;\n }\n}\n\nfunction commandExists(binary: string): boolean {\n try {\n execFileSync(\"which\", [binary], { stdio: \"pipe\", encoding: \"utf8\" });\n return true;\n } catch {\n return false;\n }\n}\n\n// \u2500\u2500\u2500 Claude Code \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface ClaudeAuthStatus {\n installed: boolean;\n loggedIn: boolean;\n email: string | null;\n orgName: string | null;\n authMethod: string | null;\n}\n\ninterface ClaudeCliStatusPayload {\n loggedIn?: boolean;\n email?: string;\n orgName?: string;\n authMethod?: string;\n}\n\ninterface ClaudeCredentialsFile {\n claudeAiOauth?: {\n accessToken?: string;\n refreshToken?: string;\n expiresAt?: number;\n subscriptionType?: string;\n };\n}\n\nfunction logClaudeAuth(message: string): void {\n console.log(`[cli-auth][claude] ${message}`);\n}\n\nfunction parseClaudeCliStatus(raw: string): ClaudeAuthStatus | null {\n try {\n const data = JSON.parse(raw) as ClaudeCliStatusPayload;\n return {\n installed: true,\n loggedIn: Boolean(data.loggedIn),\n email: data.email ?? null,\n orgName: data.orgName ?? null,\n authMethod: data.authMethod ?? null,\n };\n } catch {\n return null;\n }\n}\n\nfunction getClaudeCredentialHomes(): string[] {\n return getCredentialHomes();\n}\n\nfunction getClaudeAuthStatusFromCredentials(): ClaudeAuthStatus | null {\n let bestStatus: ClaudeAuthStatus | null = null;\n let bestExpiresAt = -Infinity;\n\n for (const home of getClaudeCredentialHomes()) {\n const credentialsPath = path.join(home, \".claude\", \".credentials.json\");\n if (!fs.existsSync(credentialsPath)) {\n logClaudeAuth(`credentials file not found at ${credentialsPath}`);\n continue;\n }\n\n logClaudeAuth(`found credentials file at ${credentialsPath}`);\n\n try {\n const raw = fs.readFileSync(credentialsPath, \"utf8\");\n const data = JSON.parse(raw) as ClaudeCredentialsFile;\n const oauth = data.claudeAiOauth;\n if (!oauth?.accessToken) {\n logClaudeAuth(`credentials file at ${credentialsPath} has no access token; skipping`);\n continue;\n }\n\n const expiresAt =\n typeof oauth.expiresAt === \"number\" && Number.isFinite(oauth.expiresAt)\n ? oauth.expiresAt\n : null;\n const loggedIn = expiresAt === null || expiresAt > Date.now();\n\n logClaudeAuth(\n `credentials file at ${credentialsPath} evaluated to loggedIn=${loggedIn} (expiresAt=${\n expiresAt === null ? \"none\" : new Date(expiresAt).toISOString()\n })`\n );\n\n if (loggedIn && (expiresAt ?? Number.MAX_SAFE_INTEGER) > bestExpiresAt) {\n bestExpiresAt = expiresAt ?? Number.MAX_SAFE_INTEGER;\n bestStatus = {\n installed: true,\n loggedIn: true,\n email: null,\n orgName: null,\n authMethod: \"oauth-credentials\",\n };\n logClaudeAuth(`credentials file at ${credentialsPath} is the current best auth candidate`);\n }\n } catch (error) {\n logClaudeAuth(\n `failed to read or parse credentials file at ${credentialsPath}: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n if (bestStatus?.loggedIn) {\n logClaudeAuth(\"credential-based auth check succeeded\");\n } else {\n logClaudeAuth(\"no valid logged-in credential file found\");\n }\n\n return bestStatus;\n}\n\nfunction getClaudeAuthStatusFromCli(): ClaudeAuthStatus | null {\n try {\n const raw = execFileSync(\"claude\", [\"auth\", \"status\"], {\n encoding: \"utf8\",\n timeout: 15_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n\n const parsed = parseClaudeCliStatus(raw);\n logClaudeAuth(\n parsed\n ? `cli auth status parsed successfully (loggedIn=${parsed.loggedIn}, authMethod=${\n parsed.authMethod ?? \"unknown\"\n })`\n : \"cli auth status returned output that could not be parsed\"\n );\n return parsed;\n } catch (err) {\n const stdout =\n err instanceof Error && \"stdout\" in err && typeof err.stdout === \"string\"\n ? err.stdout.trim()\n : \"\";\n if (stdout) {\n const parsed = parseClaudeCliStatus(stdout);\n logClaudeAuth(\n parsed\n ? `cli auth status errored but stdout parsed successfully (loggedIn=${parsed.loggedIn}, authMethod=${\n parsed.authMethod ?? \"unknown\"\n })`\n : \"cli auth status errored and stdout could not be parsed\"\n );\n return parsed;\n }\n\n logClaudeAuth(\n `cli auth status command failed without parseable stdout: ${\n err instanceof Error ? err.message : String(err)\n }`\n );\n return null;\n }\n}\n\nexport function getClaudeAuthStatus(): ClaudeAuthStatus {\n if (!commandExists(\"claude\")) {\n logClaudeAuth(\"claude binary not found; reporting installed=false\");\n return { installed: false, loggedIn: false, email: null, orgName: null, authMethod: null };\n }\n\n logClaudeAuth(\"claude binary found; checking credentials first\");\n const credentialStatus = getClaudeAuthStatusFromCredentials();\n if (credentialStatus?.loggedIn) {\n logClaudeAuth(\"returning logged-in status from credentials file\");\n return credentialStatus;\n }\n\n logClaudeAuth(\"credentials did not establish login; falling back to `claude auth status`\");\n const cliStatus = getClaudeAuthStatusFromCli();\n if (cliStatus) {\n logClaudeAuth(`returning status from cli auth check (loggedIn=${cliStatus.loggedIn})`);\n return cliStatus;\n }\n\n logClaudeAuth(\"cli auth check returned no status; falling back to loggedOut default\");\n return {\n installed: true,\n loggedIn: false,\n email: null,\n orgName: null,\n authMethod: null,\n };\n}\n\n// \u2500\u2500\u2500 Codex \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface CodexAuthStatus {\n installed: boolean;\n loggedIn: boolean;\n detail: string | null;\n}\n\ninterface CodexAuthFile {\n auth_mode?: string;\n OPENAI_API_KEY?: string | null;\n tokens?: {\n id_token?: string;\n access_token?: string;\n refresh_token?: string;\n account_id?: string;\n };\n last_refresh?: string;\n}\n\nfunction parseCodexLoggedInStatus(detail: string | null): boolean {\n const normalized = detail?.trim().toLowerCase();\n if (!normalized) return false;\n if (/\\bnot logged in\\b/.test(normalized) || /\\blogged out\\b/.test(normalized)) {\n return false;\n }\n return /\\blogged in\\b/.test(normalized);\n}\n\nfunction getTokenExpiryMs(token?: string): number | null {\n if (!token) return null;\n const payload = decodeJwtPayload(token);\n const exp = payload?.exp;\n return typeof exp === \"number\" && Number.isFinite(exp) ? exp * 1000 : null;\n}\n\nfunction getCodexAuthStatusFromFile(): CodexAuthStatus | null {\n let bestStatus: CodexAuthStatus | null = null;\n let bestScore = -Infinity;\n\n for (const home of getCredentialHomes()) {\n const authPath = path.join(home, \".codex\", \"auth.json\");\n if (!fs.existsSync(authPath)) continue;\n\n try {\n const raw = fs.readFileSync(authPath, \"utf8\");\n const data = JSON.parse(raw) as CodexAuthFile;\n const apiKey = data.OPENAI_API_KEY?.trim();\n const tokens = data.tokens;\n const accessExp = getTokenExpiryMs(tokens?.access_token);\n const idExp = getTokenExpiryMs(tokens?.id_token);\n const bestExp = Math.max(accessExp ?? -Infinity, idExp ?? -Infinity);\n const hasRefreshToken = Boolean(tokens?.refresh_token);\n const hasCurrentJwt = bestExp > Date.now();\n const loggedIn = Boolean(apiKey) || hasRefreshToken || hasCurrentJwt;\n\n if (!loggedIn) continue;\n\n const idPayload = tokens?.id_token ? decodeJwtPayload(tokens.id_token) : null;\n const email = typeof idPayload?.email === \"string\" ? idPayload.email : null;\n const mode = data.auth_mode?.trim() || (apiKey ? \"api_key\" : \"chatgpt\");\n const detail = email\n ? `Logged in via ${mode} (${email})`\n : `Logged in via ${mode}`;\n const score = Math.max(bestExp, hasRefreshToken ? Number.MAX_SAFE_INTEGER : -Infinity);\n\n if (score > bestScore) {\n bestScore = score;\n bestStatus = {\n installed: true,\n loggedIn: true,\n detail,\n };\n }\n } catch {\n // Ignore malformed auth files and continue checking other homes.\n }\n }\n\n return bestStatus;\n}\n\nfunction getCodexAuthStatusFromCli(): CodexAuthStatus | null {\n try {\n const raw = execFileSync(\"codex\", [\"login\", \"status\"], {\n encoding: \"utf8\",\n timeout: 15_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n\n const loggedIn = parseCodexLoggedInStatus(raw);\n return { installed: true, loggedIn, detail: raw || null };\n } catch (err) {\n const stdout =\n err instanceof Error && \"stdout\" in err && typeof err.stdout === \"string\"\n ? err.stdout.trim()\n : \"\";\n const stderr =\n err instanceof Error && \"stderr\" in err && typeof err.stderr === \"string\"\n ? err.stderr.trim()\n : \"\";\n const detail = stdout || stderr || null;\n const loggedIn = parseCodexLoggedInStatus(detail);\n return { installed: true, loggedIn, detail };\n }\n}\n\nexport function getCodexAuthStatus(): CodexAuthStatus {\n if (!commandExists(\"codex\")) {\n return { installed: false, loggedIn: false, detail: null };\n }\n\n const fileStatus = getCodexAuthStatusFromFile();\n if (fileStatus?.loggedIn) {\n return fileStatus;\n }\n\n return getCodexAuthStatusFromCli() ?? { installed: true, loggedIn: false, detail: null };\n}\n\nexport interface DeviceAuthResult {\n code: string;\n url: string;\n}\n\nlet activeCodexPty: pty.IPty | null = null;\n\nexport function startCodexDeviceAuth(): Promise<DeviceAuthResult> {\n if (activeCodexPty) {\n activeCodexPty.kill();\n activeCodexPty = null;\n }\n\n return new Promise((resolve, reject) => {\n const proc = pty.spawn(\"codex\", [\"login\", \"--device-auth\"], {\n name: \"xterm-256color\",\n cols: 120,\n rows: 30,\n env: process.env as Record<string, string>,\n });\n\n activeCodexPty = proc;\n let output = \"\";\n let resolved = false;\n\n proc.onData((data) => {\n output += data;\n const clean = stripAnsi(output);\n\n const urlMatch = clean.match(/(https:\\/\\/[^\\s\"'<>]+)/);\n const codeMatch = clean.match(/one-time code[^\\n]*\\n\\s+([A-Z0-9]+-[A-Z0-9]+)/i);\n\n if (codeMatch && urlMatch && !resolved) {\n resolved = true;\n resolve({ code: codeMatch[1], url: urlMatch[1] });\n }\n });\n\n proc.onExit(({ exitCode }) => {\n if (activeCodexPty === proc) activeCodexPty = null;\n if (!resolved) {\n reject(new Error(stripAnsi(output) || `codex login exited with code ${exitCode}`));\n }\n });\n\n setTimeout(() => {\n if (!resolved) {\n proc.kill();\n if (activeCodexPty === proc) activeCodexPty = null;\n reject(new Error(\"Codex device auth timed out\"));\n }\n }, 5 * 60 * 1000);\n });\n}\n\nexport function connectCodexWithApiKey(apiKey: string): CodexAuthStatus {\n if (!commandExists(\"codex\")) {\n throw new Error(\"Codex CLI is not installed\");\n }\n\n try {\n execFileSync(\"codex\", [\"login\", \"--with-api-key\"], {\n encoding: \"utf8\",\n timeout: 15_000,\n input: apiKey.trim(),\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n } catch (err) {\n const stderr =\n err instanceof Error && \"stderr\" in err && typeof err.stderr === \"string\"\n ? err.stderr.trim()\n : \"\";\n throw new Error(stderr || \"Failed to authenticate with API key\");\n }\n\n return getCodexAuthStatus();\n}\n", "import * as fs from \"fs\";\nimport * as path from \"path\";\nimport { execFileSync } from \"node:child_process\";\nimport { ensureDataDir, nowIso, readJsonFile, writeJsonFile } from \"../state/files.js\";\n\nconst GITHUB_CONNECTION_PATH = path.join(ensureDataDir(), \"github-connection.json\");\n\ninterface StoredGitHubConnectionRecord {\n token: string;\n login: string;\n name: string | null;\n avatarUrl: string | null;\n scopes: string[];\n connectedAt: string;\n verifiedAt: string;\n}\n\nexport interface GitHubConnectionStatus {\n connected: boolean;\n source: \"stored\" | \"env\" | null;\n canDisconnect: boolean;\n login: string | null;\n name: string | null;\n avatarUrl: string | null;\n scopes: string[];\n connectedAt: string | null;\n verifiedAt: string | null;\n}\n\nexport interface GitHubRepoSuggestion {\n id: number;\n name: string;\n fullName: string;\n owner: string;\n private: boolean;\n defaultBranch: string;\n cloneUrl: string;\n htmlUrl: string;\n}\n\nexport interface ResolvedGitHubToken {\n token: string | null;\n source: \"stored\" | \"env\" | null;\n}\n\ninterface GhRequestOptions {\n method?: \"GET\" | \"POST\" | \"PATCH\" | \"PUT\" | \"DELETE\";\n input?: unknown;\n token?: string | null;\n}\n\nfunction readStoredGitHubConnection(): StoredGitHubConnectionRecord | null {\n const record = readJsonFile<StoredGitHubConnectionRecord | null>(\n GITHUB_CONNECTION_PATH,\n null\n );\n if (!record?.token || !record.login) {\n return null;\n }\n return record;\n}\n\nfunction toConnectionStatus(\n record: StoredGitHubConnectionRecord | null,\n source: \"stored\" | \"env\" | null\n): GitHubConnectionStatus {\n return {\n connected: Boolean(source),\n source,\n canDisconnect: source === \"stored\",\n login: record?.login ?? null,\n name: record?.name ?? null,\n avatarUrl: record?.avatarUrl ?? null,\n scopes: record?.scopes ?? [],\n connectedAt: record?.connectedAt ?? null,\n verifiedAt: record?.verifiedAt ?? null,\n };\n}\n\nfunction getEnvGitHubToken(): string | null {\n return process.env.GITHUB_TOKEN || process.env.GH_TOKEN || null;\n}\n\nfunction getGhEnv(token?: string | null): NodeJS.ProcessEnv {\n const env = { ...process.env };\n const resolved = token ?? resolveGitHubToken().token;\n if (resolved) {\n env.GH_TOKEN = resolved;\n env.GITHUB_TOKEN = resolved;\n }\n return env;\n}\n\nexport function runGhCommand(\n args: string[],\n options?: { token?: string | null; input?: string; cwd?: string }\n): string {\n try {\n return execFileSync(\"gh\", args, {\n encoding: \"utf8\",\n env: getGhEnv(options?.token),\n cwd: options?.cwd,\n input: options?.input,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n } catch (error) {\n const stderr =\n error instanceof Error && \"stderr\" in error && typeof error.stderr === \"string\"\n ? error.stderr.trim()\n : \"\";\n throw new Error(stderr || `gh ${args.join(\" \")} failed`);\n }\n}\n\nfunction parseHeaderBlock(raw: string): Record<string, string> {\n const lines = raw.split(/\\r?\\n/).slice(1);\n const headers: Record<string, string> = {};\n for (const line of lines) {\n const idx = line.indexOf(\":\");\n if (idx === -1) continue;\n headers[line.slice(0, idx).trim().toLowerCase()] = line.slice(idx + 1).trim();\n }\n return headers;\n}\n\nfunction runGhApiWithHeaders<T>(\n endpoint: string,\n options?: GhRequestOptions\n): { data: T; headers: Record<string, string> } {\n const args = [\"api\", \"-i\"];\n if (options?.method && options.method !== \"GET\") {\n args.push(\"-X\", options.method);\n }\n if (options?.input != null) {\n args.push(\"--input\", \"-\");\n }\n args.push(endpoint.replace(/^\\//, \"\"));\n const raw = runGhCommand(args, {\n token: options?.token,\n input: options?.input == null ? undefined : JSON.stringify(options.input),\n });\n const parts = raw.split(/\\r?\\n\\r?\\n/);\n if (parts.length < 2) {\n throw new Error(\"Unexpected gh api response\");\n }\n\n const body = parts[parts.length - 1];\n const headerBlock = parts\n .slice(0, -1)\n .reverse()\n .find((part) => /^HTTP\\/\\d/i.test(part.trim()));\n\n return {\n data: JSON.parse(body) as T,\n headers: parseHeaderBlock(headerBlock ?? \"\"),\n };\n}\n\nexport function runGitHubApi<T>(endpoint: string, options?: GhRequestOptions): T {\n return runGhApiWithHeaders<T>(endpoint, options).data;\n}\n\nasync function fetchViewer(token: string): Promise<StoredGitHubConnectionRecord> {\n const { data, headers } = runGhApiWithHeaders<{\n login: string;\n name: string | null;\n avatar_url: string | null;\n }>(\"user\", { token });\n\n const now = nowIso();\n const current = readStoredGitHubConnection();\n\n return {\n token,\n login: data.login,\n name: data.name,\n avatarUrl: data.avatar_url,\n scopes: headers[\"x-oauth-scopes\"]\n ? headers[\"x-oauth-scopes\"]\n .split(\",\")\n .map((scope) => scope.trim())\n .filter(Boolean)\n : [],\n connectedAt: current?.token === token ? current.connectedAt : now,\n verifiedAt: now,\n };\n}\n\nexport function resolveGitHubToken(): ResolvedGitHubToken {\n const stored = readStoredGitHubConnection();\n if (stored?.token) {\n return {\n token: stored.token,\n source: \"stored\",\n };\n }\n\n const envToken = getEnvGitHubToken();\n if (envToken) {\n return {\n token: envToken,\n source: \"env\",\n };\n }\n\n return {\n token: null,\n source: null,\n };\n}\n\nexport function getGitHubChildEnvVars(): Record<string, string> {\n const resolved = resolveGitHubToken();\n if (!resolved.token) {\n return {};\n }\n\n return {\n GITHUB_TOKEN: resolved.token,\n GH_TOKEN: resolved.token,\n };\n}\n\nexport async function connectGitHubToken(token: string): Promise<GitHubConnectionStatus> {\n const normalized = token.trim();\n if (!normalized) {\n throw new Error(\"GitHub token is required\");\n }\n\n const record = await fetchViewer(normalized);\n writeJsonFile(GITHUB_CONNECTION_PATH, record, { mode: 0o600 });\n return toConnectionStatus(record, \"stored\");\n}\n\nexport function disconnectGitHubToken(): GitHubConnectionStatus {\n if (fs.existsSync(GITHUB_CONNECTION_PATH)) {\n fs.unlinkSync(GITHUB_CONNECTION_PATH);\n }\n return toConnectionStatus(null, getEnvGitHubToken() ? \"env\" : null);\n}\n\nexport async function getGitHubConnectionStatus(): Promise<GitHubConnectionStatus> {\n const stored = readStoredGitHubConnection();\n if (stored?.token) {\n return toConnectionStatus(stored, \"stored\");\n }\n\n const envToken = getEnvGitHubToken();\n if (!envToken) {\n return toConnectionStatus(null, null);\n }\n\n try {\n const record = await fetchViewer(envToken);\n return toConnectionStatus(record, \"env\");\n } catch {\n return toConnectionStatus(null, \"env\");\n }\n}\n\nexport async function searchGitHubRepositories(\n query: string\n): Promise<GitHubRepoSuggestion[]> {\n const resolved = resolveGitHubToken();\n if (!resolved.token) {\n throw new Error(\"GitHub is not connected\");\n }\n\n const data = runGitHubApi<\n Array<{\n id: number;\n name: string;\n full_name: string;\n private: boolean;\n default_branch: string;\n clone_url: string;\n html_url: string;\n owner: { login: string };\n }>\n >(\n \"user/repos?sort=updated&per_page=100&affiliation=owner,collaborator,organization_member\",\n { token: resolved.token }\n );\n\n const normalized = query.trim().toLowerCase();\n return data\n .filter((repo) => {\n if (!normalized) return true;\n return (\n repo.full_name.toLowerCase().includes(normalized) ||\n repo.name.toLowerCase().includes(normalized) ||\n repo.owner.login.toLowerCase().includes(normalized)\n );\n })\n .slice(0, 20)\n .map((repo) => ({\n id: repo.id,\n name: repo.name,\n fullName: repo.full_name,\n owner: repo.owner.login,\n private: repo.private,\n defaultBranch: repo.default_branch,\n cloneUrl: repo.clone_url,\n htmlUrl: repo.html_url,\n }));\n}\n", "import {\n getClaudeAuthStatus,\n getCodexAuthStatus,\n type ClaudeAuthStatus,\n type CodexAuthStatus,\n} from \"../integrations/cli-auth.js\";\nimport {\n getGitHubConnectionStatus,\n type GitHubConnectionStatus,\n} from \"../integrations/github.js\";\n\nconst INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours\nconst INITIAL_DELAY_MS = 5_000; // 5 seconds after startup\n\nlet timer: ReturnType<typeof setInterval> | null = null;\nlet lastCheckAt: string | null = null;\n\nlet cachedClaude: ClaudeAuthStatus | null = null;\nlet cachedCodex: CodexAuthStatus | null = null;\nlet cachedGitHub: GitHubConnectionStatus | null = null;\n\nexport async function refreshAuthStatus(): Promise<void> {\n console.log(\"[auth-status] Checking CLI auth status...\");\n try {\n cachedClaude = getClaudeAuthStatus();\n } catch {\n cachedClaude = null;\n }\n try {\n cachedCodex = getCodexAuthStatus();\n } catch {\n cachedCodex = null;\n }\n try {\n cachedGitHub = await getGitHubConnectionStatus();\n } catch {\n cachedGitHub = null;\n }\n lastCheckAt = new Date().toISOString();\n console.log(\"[auth-status] Check complete.\");\n}\n\nexport function getCachedClaudeAuthStatus(): ClaudeAuthStatus | null {\n return cachedClaude;\n}\n\nexport function getCachedCodexAuthStatus(): CodexAuthStatus | null {\n return cachedCodex;\n}\n\nexport function getCachedGitHubConnectionStatus(): GitHubConnectionStatus | null {\n return cachedGitHub;\n}\n\nexport function getAuthStatusLastCheckAt(): string | null {\n return lastCheckAt;\n}\n\nexport function startAuthStatusChecker(): void {\n setTimeout(() => void refreshAuthStatus(), INITIAL_DELAY_MS);\n timer = setInterval(() => void refreshAuthStatus(), INTERVAL_MS);\n console.log(\"[auth-status] Started (interval: 24h)\");\n}\n\nexport function stopAuthStatusChecker(): void {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n}\n", "import * as path from \"path\";\nimport { randomUUID } from \"crypto\";\nimport { DatabaseSync } from \"node:sqlite\";\nimport { ensureDataDir, nowIso } from \"./files.js\";\nimport type {\n AutomationRecord,\n AutomationRunRecord,\n ScheduledTaskRecord,\n} from \"./types.js\";\n\nconst dbPath = path.join(ensureDataDir(), \"state.sqlite\");\nconst db = new DatabaseSync(dbPath);\n\ndb.exec(`\n CREATE TABLE IF NOT EXISTS scheduled_tasks (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n prompt TEXT NOT NULL,\n schedule TEXT NOT NULL,\n project_id TEXT,\n project_path TEXT NOT NULL,\n provider TEXT NOT NULL,\n model TEXT,\n custom_display_name TEXT,\n custom_command_template TEXT,\n custom_env_json TEXT,\n skip_permissions INTEGER NOT NULL,\n enabled INTEGER NOT NULL,\n last_run_at TEXT,\n next_run_at TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS automations (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n description TEXT,\n enabled INTEGER NOT NULL,\n source_type TEXT NOT NULL,\n source_config_json TEXT NOT NULL,\n trigger_type TEXT NOT NULL,\n agent_project_id TEXT,\n agent_project_path TEXT NOT NULL,\n agent_prompt_template TEXT NOT NULL,\n agent_provider TEXT NOT NULL,\n agent_model TEXT,\n agent_custom_display_name TEXT,\n agent_custom_command_template TEXT,\n agent_custom_env_json TEXT,\n agent_skip_permissions INTEGER NOT NULL,\n poll_interval_minutes INTEGER NOT NULL,\n last_poll_at TEXT,\n processed_hashes_json TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS automation_runs (\n id TEXT PRIMARY KEY,\n automation_id TEXT NOT NULL,\n status TEXT NOT NULL,\n items_found INTEGER NOT NULL,\n items_processed INTEGER NOT NULL,\n error TEXT,\n agent_id TEXT,\n started_at TEXT NOT NULL,\n completed_at TEXT,\n FOREIGN KEY (automation_id) REFERENCES automations(id) ON DELETE CASCADE\n );\n\n CREATE TABLE IF NOT EXISTS settings (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n`);\n\nfunction parseJson<T>(value: string | null | undefined, fallback: T): T {\n if (!value) return fallback;\n try {\n return JSON.parse(value) as T;\n } catch {\n return fallback;\n }\n}\n\nfunction toScheduledTask(row: Record<string, unknown>): ScheduledTaskRecord {\n return {\n id: String(row.id),\n name: String(row.name),\n prompt: String(row.prompt),\n schedule: String(row.schedule),\n projectId: row.project_id ? String(row.project_id) : null,\n projectPath: String(row.project_path),\n provider: String(row.provider),\n customDisplayName: row.custom_display_name ? String(row.custom_display_name) : null,\n customCommandTemplate: row.custom_command_template\n ? String(row.custom_command_template)\n : null,\n customEnv: parseJson<Record<string, string> | null>(\n row.custom_env_json as string | null,\n null\n ),\n skipPermissions: Boolean(row.skip_permissions),\n enabled: Boolean(row.enabled),\n lastRunAt: row.last_run_at ? String(row.last_run_at) : null,\n nextRunAt: row.next_run_at ? String(row.next_run_at) : null,\n createdAt: String(row.created_at),\n updatedAt: String(row.updated_at),\n };\n}\n\nfunction toAutomation(row: Record<string, unknown>): AutomationRecord {\n return {\n id: String(row.id),\n name: String(row.name),\n description: row.description ? String(row.description) : null,\n enabled: Boolean(row.enabled),\n sourceType: String(row.source_type),\n sourceConfig: parseJson<Record<string, string>>(String(row.source_config_json), {}),\n triggerType: String(row.trigger_type),\n agentProjectId: row.agent_project_id ? String(row.agent_project_id) : null,\n agentProjectPath: String(row.agent_project_path),\n agentPromptTemplate: String(row.agent_prompt_template),\n agentProvider: String(row.agent_provider),\n agentCustomDisplayName: row.agent_custom_display_name\n ? String(row.agent_custom_display_name)\n : null,\n agentCustomCommandTemplate: row.agent_custom_command_template\n ? String(row.agent_custom_command_template)\n : null,\n agentCustomEnv: parseJson<Record<string, string> | null>(\n row.agent_custom_env_json as string | null,\n null\n ),\n agentSkipPermissions: Boolean(row.agent_skip_permissions),\n pollIntervalMinutes: Number(row.poll_interval_minutes),\n lastPollAt: row.last_poll_at ? String(row.last_poll_at) : null,\n processedHashes: parseJson<string[]>(String(row.processed_hashes_json), []),\n createdAt: String(row.created_at),\n updatedAt: String(row.updated_at),\n };\n}\n\nfunction toAutomationRun(row: Record<string, unknown>): AutomationRunRecord {\n return {\n id: String(row.id),\n automationId: String(row.automation_id),\n status: String(row.status),\n itemsFound: Number(row.items_found),\n itemsProcessed: Number(row.items_processed),\n error: row.error ? String(row.error) : null,\n agentId: row.agent_id ? String(row.agent_id) : null,\n startedAt: String(row.started_at),\n completedAt: row.completed_at ? String(row.completed_at) : null,\n };\n}\n\nexport function listScheduledTaskRecords(): ScheduledTaskRecord[] {\n const rows = db\n .prepare(\"SELECT * FROM scheduled_tasks ORDER BY created_at DESC\")\n .all() as Record<string, unknown>[];\n return rows.map(toScheduledTask);\n}\n\nexport function getScheduledTaskRecord(id: string): ScheduledTaskRecord | null {\n const row = db\n .prepare(\"SELECT * FROM scheduled_tasks WHERE id = ?\")\n .get(id) as Record<string, unknown> | undefined;\n return row ? toScheduledTask(row) : null;\n}\n\nexport function createScheduledTaskRecord(\n input: Omit<ScheduledTaskRecord, \"id\" | \"createdAt\" | \"updatedAt\">\n): ScheduledTaskRecord {\n const task: ScheduledTaskRecord = {\n id: randomUUID(),\n ...input,\n createdAt: nowIso(),\n updatedAt: nowIso(),\n };\n\n db.prepare(`\n INSERT INTO scheduled_tasks (\n id, name, prompt, schedule, project_id, project_path, provider,\n custom_display_name, custom_command_template, custom_env_json,\n skip_permissions, enabled, last_run_at, next_run_at, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).run(\n task.id,\n task.name,\n task.prompt,\n task.schedule,\n task.projectId,\n task.projectPath,\n task.provider,\n task.customDisplayName,\n task.customCommandTemplate,\n JSON.stringify(task.customEnv),\n task.skipPermissions ? 1 : 0,\n task.enabled ? 1 : 0,\n task.lastRunAt,\n task.nextRunAt,\n task.createdAt,\n task.updatedAt\n );\n\n return task;\n}\n\nexport function updateScheduledTaskRecord(\n id: string,\n patch: Partial<Omit<ScheduledTaskRecord, \"id\" | \"createdAt\">>\n): ScheduledTaskRecord {\n const current = getScheduledTaskRecord(id);\n if (!current) {\n throw new Error(\"Task not found\");\n }\n\n const next: ScheduledTaskRecord = {\n ...current,\n ...patch,\n updatedAt: nowIso(),\n };\n\n db.prepare(`\n UPDATE scheduled_tasks SET\n name = ?, prompt = ?, schedule = ?, project_id = ?, project_path = ?,\n provider = ?, custom_display_name = ?, custom_command_template = ?,\n custom_env_json = ?, skip_permissions = ?, enabled = ?, last_run_at = ?,\n next_run_at = ?, updated_at = ?\n WHERE id = ?\n `).run(\n next.name,\n next.prompt,\n next.schedule,\n next.projectId,\n next.projectPath,\n next.provider,\n next.customDisplayName,\n next.customCommandTemplate,\n JSON.stringify(next.customEnv),\n next.skipPermissions ? 1 : 0,\n next.enabled ? 1 : 0,\n next.lastRunAt,\n next.nextRunAt,\n next.updatedAt,\n id\n );\n\n return next;\n}\n\nexport function deleteScheduledTaskRecord(id: string): void {\n db.prepare(\"DELETE FROM scheduled_tasks WHERE id = ?\").run(id);\n}\n\nexport function listAutomationRecords(): AutomationRecord[] {\n const rows = db\n .prepare(\"SELECT * FROM automations ORDER BY created_at DESC\")\n .all() as Record<string, unknown>[];\n return rows.map(toAutomation);\n}\n\nexport function getAutomationRecord(id: string): AutomationRecord | null {\n const row = db\n .prepare(\"SELECT * FROM automations WHERE id = ?\")\n .get(id) as Record<string, unknown> | undefined;\n return row ? toAutomation(row) : null;\n}\n\nexport function createAutomationRecord(\n input: Omit<AutomationRecord, \"id\" | \"createdAt\" | \"updatedAt\">\n): AutomationRecord {\n const automation: AutomationRecord = {\n id: randomUUID(),\n ...input,\n createdAt: nowIso(),\n updatedAt: nowIso(),\n };\n\n db.prepare(`\n INSERT INTO automations (\n id, name, description, enabled, source_type, source_config_json,\n trigger_type, agent_project_id, agent_project_path, agent_prompt_template,\n agent_provider, agent_custom_display_name,\n agent_custom_command_template, agent_custom_env_json,\n agent_skip_permissions, poll_interval_minutes, last_poll_at,\n processed_hashes_json, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).run(\n automation.id,\n automation.name,\n automation.description,\n automation.enabled ? 1 : 0,\n automation.sourceType,\n JSON.stringify(automation.sourceConfig),\n automation.triggerType,\n automation.agentProjectId,\n automation.agentProjectPath,\n automation.agentPromptTemplate,\n automation.agentProvider,\n automation.agentCustomDisplayName,\n automation.agentCustomCommandTemplate,\n JSON.stringify(automation.agentCustomEnv),\n automation.agentSkipPermissions ? 1 : 0,\n automation.pollIntervalMinutes,\n automation.lastPollAt,\n JSON.stringify(automation.processedHashes),\n automation.createdAt,\n automation.updatedAt\n );\n\n return automation;\n}\n\nexport function updateAutomationRecord(\n id: string,\n patch: Partial<Omit<AutomationRecord, \"id\" | \"createdAt\">>\n): AutomationRecord {\n const current = getAutomationRecord(id);\n if (!current) {\n throw new Error(\"Automation not found\");\n }\n\n const next: AutomationRecord = {\n ...current,\n ...patch,\n updatedAt: nowIso(),\n };\n\n db.prepare(`\n UPDATE automations SET\n name = ?, description = ?, enabled = ?, source_type = ?, source_config_json = ?,\n trigger_type = ?, agent_project_id = ?, agent_project_path = ?,\n agent_prompt_template = ?, agent_provider = ?,\n agent_custom_display_name = ?, agent_custom_command_template = ?,\n agent_custom_env_json = ?, agent_skip_permissions = ?,\n poll_interval_minutes = ?, last_poll_at = ?, processed_hashes_json = ?,\n updated_at = ?\n WHERE id = ?\n `).run(\n next.name,\n next.description,\n next.enabled ? 1 : 0,\n next.sourceType,\n JSON.stringify(next.sourceConfig),\n next.triggerType,\n next.agentProjectId,\n next.agentProjectPath,\n next.agentPromptTemplate,\n next.agentProvider,\n next.agentCustomDisplayName,\n next.agentCustomCommandTemplate,\n JSON.stringify(next.agentCustomEnv),\n next.agentSkipPermissions ? 1 : 0,\n next.pollIntervalMinutes,\n next.lastPollAt,\n JSON.stringify(next.processedHashes),\n next.updatedAt,\n id\n );\n\n return next;\n}\n\nexport function deleteAutomationRecord(id: string): void {\n db.prepare(\"DELETE FROM automation_runs WHERE automation_id = ?\").run(id);\n db.prepare(\"DELETE FROM automations WHERE id = ?\").run(id);\n}\n\nexport function listAutomationRunRecords(\n automationId: string,\n limit = 20\n): AutomationRunRecord[] {\n const rows = db\n .prepare(`\n SELECT * FROM automation_runs\n WHERE automation_id = ?\n ORDER BY started_at DESC\n LIMIT ?\n `)\n .all(automationId, limit) as Record<string, unknown>[];\n return rows.map(toAutomationRun);\n}\n\nexport function createAutomationRunRecord(\n input: Omit<AutomationRunRecord, \"id\">\n): AutomationRunRecord {\n const run: AutomationRunRecord = {\n id: randomUUID(),\n ...input,\n };\n\n db.prepare(`\n INSERT INTO automation_runs (\n id, automation_id, status, items_found, items_processed, error,\n agent_id, started_at, completed_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).run(\n run.id,\n run.automationId,\n run.status,\n run.itemsFound,\n run.itemsProcessed,\n run.error,\n run.agentId,\n run.startedAt,\n run.completedAt\n );\n\n return run;\n}\n\n// \u2500\u2500 Settings \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function getSetting(key: string): string | null {\n const row = db\n .prepare(\"SELECT value FROM settings WHERE key = ?\")\n .get(key) as { value: string } | undefined;\n return row?.value ?? null;\n}\n\nexport function setSetting(key: string, value: string): void {\n db.prepare(`\n INSERT INTO settings (key, value, updated_at) VALUES (?, ?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = excluded.updated_at\n `).run(key, value, nowIso());\n}\n\nexport function getAllSettings(): Record<string, string> {\n const rows = db\n .prepare(\"SELECT key, value FROM settings\")\n .all() as Array<{ key: string; value: string }>;\n const result: Record<string, string> = {};\n for (const row of rows) {\n result[row.key] = row.value;\n }\n return result;\n}\n\nexport function updateAutomationRunRecord(\n id: string,\n patch: Partial<Omit<AutomationRunRecord, \"id\" | \"automationId\" | \"startedAt\">>\n): AutomationRunRecord {\n const row = db\n .prepare(\"SELECT * FROM automation_runs WHERE id = ?\")\n .get(id) as Record<string, unknown> | undefined;\n if (!row) {\n throw new Error(\"Automation run not found\");\n }\n\n const current = toAutomationRun(row);\n const next: AutomationRunRecord = {\n ...current,\n ...patch,\n };\n\n db.prepare(`\n UPDATE automation_runs SET\n status = ?, items_found = ?, items_processed = ?, error = ?, agent_id = ?, completed_at = ?\n WHERE id = ?\n `).run(\n next.status,\n next.itemsFound,\n next.itemsProcessed,\n next.error,\n next.agentId,\n next.completedAt,\n id\n );\n\n return next;\n}\n", "import type { Settings, SettingsUpdate } from \"@maestro/wire\";\nimport { normalizeSandboxProvider } from \"../agents/sandbox.js\";\nimport { getSetting, setSetting } from \"./sqlite.js\";\n\nconst DEFAULTS: Settings = {\n autoUpdateEnabled: false,\n autoUpdateIntervalHours: 24,\n piOllamaModel: \"\",\n telegramBotToken: \"\",\n sandboxEnabled: false,\n sandboxProvider: \"none\",\n deepgramApiKey: \"\",\n agentDefaultProvider: \"claude\",\n agentDefaultDisableSandbox: false,\n agentDefaultSkipPermissions: true,\n agentDefaultWorktreeMode: \"none\",\n};\n\nexport function getSettings(): Settings {\n const enabled = getSetting(\"autoUpdateEnabled\");\n const interval = getSetting(\"autoUpdateIntervalHours\");\n const piModel = getSetting(\"piOllamaModel\");\n\n const telegramToken = getSetting(\"telegramBotToken\");\n const sandbox = getSetting(\"sandboxEnabled\");\n const sandboxProvider = getSetting(\"sandboxProvider\");\n const deepgramKey = getSetting(\"deepgramApiKey\");\n const agentDefaultProvider = getSetting(\"agentDefaultProvider\");\n const agentDefaultDisableSandbox = getSetting(\"agentDefaultDisableSandbox\");\n const agentDefaultSkipPermissions = getSetting(\"agentDefaultSkipPermissions\");\n const agentDefaultWorktreeMode = getSetting(\"agentDefaultWorktreeMode\");\n const storedSandboxProvider = normalizeSandboxProvider(\n sandboxProvider,\n sandbox === \"true\"\n );\n const resolvedSandboxProvider =\n storedSandboxProvider === \"nsjail\" ? \"docker\" : storedSandboxProvider;\n\n return {\n autoUpdateEnabled: enabled !== null ? enabled === \"true\" : DEFAULTS.autoUpdateEnabled,\n autoUpdateIntervalHours: interval !== null ? Number(interval) : DEFAULTS.autoUpdateIntervalHours,\n piOllamaModel: piModel !== null ? piModel : DEFAULTS.piOllamaModel,\n telegramBotToken: telegramToken !== null ? telegramToken : DEFAULTS.telegramBotToken,\n sandboxEnabled: resolvedSandboxProvider !== \"none\",\n sandboxProvider: resolvedSandboxProvider,\n deepgramApiKey: deepgramKey !== null ? deepgramKey : DEFAULTS.deepgramApiKey,\n agentDefaultProvider:\n agentDefaultProvider === \"codex\" ? \"codex\" : DEFAULTS.agentDefaultProvider,\n agentDefaultDisableSandbox:\n agentDefaultDisableSandbox !== null\n ? agentDefaultDisableSandbox === \"true\"\n : DEFAULTS.agentDefaultDisableSandbox,\n agentDefaultSkipPermissions:\n agentDefaultSkipPermissions !== null\n ? agentDefaultSkipPermissions === \"true\"\n : DEFAULTS.agentDefaultSkipPermissions,\n agentDefaultWorktreeMode:\n agentDefaultWorktreeMode === \"new\" ? \"new\" : DEFAULTS.agentDefaultWorktreeMode,\n };\n}\n\nexport function updateSettings(patch: SettingsUpdate): Settings {\n if (patch.autoUpdateEnabled !== undefined) {\n setSetting(\"autoUpdateEnabled\", String(patch.autoUpdateEnabled));\n }\n if (patch.autoUpdateIntervalHours !== undefined) {\n setSetting(\"autoUpdateIntervalHours\", String(patch.autoUpdateIntervalHours));\n }\n if (patch.piOllamaModel !== undefined) {\n setSetting(\"piOllamaModel\", patch.piOllamaModel);\n }\n if (patch.telegramBotToken !== undefined) {\n setSetting(\"telegramBotToken\", patch.telegramBotToken);\n }\n if (patch.sandboxEnabled !== undefined) {\n setSetting(\"sandboxEnabled\", String(patch.sandboxEnabled));\n if (patch.sandboxProvider === undefined) {\n setSetting(\"sandboxProvider\", patch.sandboxEnabled ? \"docker\" : \"none\");\n }\n }\n if (patch.sandboxProvider !== undefined) {\n const provider = patch.sandboxProvider === \"nsjail\" ? \"docker\" : patch.sandboxProvider;\n setSetting(\"sandboxProvider\", provider);\n setSetting(\"sandboxEnabled\", String(provider !== \"none\"));\n }\n if (patch.deepgramApiKey !== undefined) {\n setSetting(\"deepgramApiKey\", patch.deepgramApiKey);\n }\n if (patch.agentDefaultProvider !== undefined) {\n setSetting(\"agentDefaultProvider\", patch.agentDefaultProvider);\n }\n if (patch.agentDefaultDisableSandbox !== undefined) {\n setSetting(\"agentDefaultDisableSandbox\", String(patch.agentDefaultDisableSandbox));\n }\n if (patch.agentDefaultSkipPermissions !== undefined) {\n setSetting(\"agentDefaultSkipPermissions\", String(patch.agentDefaultSkipPermissions));\n }\n if (patch.agentDefaultWorktreeMode !== undefined) {\n setSetting(\"agentDefaultWorktreeMode\", patch.agentDefaultWorktreeMode);\n }\n return getSettings();\n}\n", "import type { AgentProvider } from \"@maestro/wire\";\nimport { getClaudeAuthStatus, getCodexAuthStatus } from \"../integrations/cli-auth.js\";\nimport { getCachedClaudeAuthStatus, getCachedCodexAuthStatus } from \"../services/auth-status-checker.js\";\nimport { getSettings } from \"../state/settings.js\";\n\nfunction getProviderLabel(provider: AgentProvider): string {\n return provider === \"codex\" ? \"Codex\" : \"Claude Code\";\n}\n\nexport function assertAutoSpawnProviderReady(): AgentProvider {\n const provider = getSettings().agentDefaultProvider;\n const status =\n provider === \"codex\"\n ? (getCachedCodexAuthStatus() ?? getCodexAuthStatus())\n : (getCachedClaudeAuthStatus() ?? getClaudeAuthStatus());\n\n if (!status.installed) {\n throw new Error(\n `${getProviderLabel(provider)} is selected in Settings, but it is not installed.`\n );\n }\n\n if (!status.loggedIn) {\n throw new Error(\n `${getProviderLabel(provider)} is selected in Settings, but it is not logged in.`\n );\n }\n\n return provider;\n}\n", "import * as fs from \"fs\";\nimport * as path from \"path\";\nimport { randomUUID } from \"crypto\";\nimport { ensureDataDir, ensureDir, nowIso, readJsonFile, writeJsonFile } from \"./files.js\";\nimport type { TerminalRecord } from \"./types.js\";\n\n// Keep the legacy on-disk filenames so existing installs do not need data migration.\nconst TERMINALS_PATH = path.join(ensureDataDir(), \"agents.json\");\nconst TERMINAL_HISTORY_DIR = path.join(ensureDataDir(), \"agents\");\n\nfunction readTerminals(): TerminalRecord[] {\n return readJsonFile<TerminalRecord[]>(TERMINALS_PATH, []);\n}\n\nfunction writeTerminals(terminals: TerminalRecord[]): void {\n writeJsonFile(TERMINALS_PATH, terminals);\n}\n\nfunction terminalDir(terminalId: string): string {\n return ensureDir(path.join(TERMINAL_HISTORY_DIR, terminalId));\n}\n\nfunction terminalSnapshotPath(terminalId: string): string {\n return path.join(terminalDir(terminalId), \"snapshot.json\");\n}\n\nfunction syncTerminalMeta(terminal: TerminalRecord): void {\n writeJsonFile(path.join(terminalDir(terminal.id), \"meta.json\"), terminal);\n}\n\nexport function listTerminalRecords(): TerminalRecord[] {\n return readTerminals().sort((a, b) => b.createdAt.localeCompare(a.createdAt));\n}\n\nexport function getTerminalRecord(terminalId: string): TerminalRecord | null {\n return readTerminals().find((terminal) => terminal.id === terminalId) ?? null;\n}\n\nexport function findTerminalRecords(\n predicate: (terminal: TerminalRecord) => boolean\n): TerminalRecord[] {\n return listTerminalRecords().filter(predicate);\n}\n\nexport function createTerminalRecord(\n data: Omit<TerminalRecord, \"id\" | \"createdAt\" | \"updatedAt\">\n): TerminalRecord {\n const timestamp = nowIso();\n const terminal: TerminalRecord = {\n id: randomUUID(),\n ...data,\n createdAt: timestamp,\n updatedAt: timestamp,\n };\n\n const terminals = readTerminals();\n terminals.push(terminal);\n writeTerminals(terminals);\n syncTerminalMeta(terminal);\n return terminal;\n}\n\nexport function updateTerminalRecord(\n terminalId: string,\n patch: Partial<Omit<TerminalRecord, \"id\" | \"createdAt\">>\n): TerminalRecord {\n const terminals = readTerminals();\n const index = terminals.findIndex((terminal) => terminal.id === terminalId);\n if (index === -1) {\n throw new Error(\"Terminal not found\");\n }\n\n const next: TerminalRecord = {\n ...terminals[index],\n ...patch,\n updatedAt: nowIso(),\n };\n terminals[index] = next;\n writeTerminals(terminals);\n syncTerminalMeta(next);\n return next;\n}\n\nexport function deleteTerminalRecord(terminalId: string): void {\n writeTerminals(readTerminals().filter((terminal) => terminal.id !== terminalId));\n}\n\nexport function deleteTerminalState(terminalId: string): void {\n fs.rmSync(terminalDir(terminalId), { recursive: true, force: true });\n}\n\nexport function appendTerminalHistory(terminalId: string, data: string): void {\n const historyPath = path.join(terminalDir(terminalId), \"transcript.log\");\n fs.appendFileSync(historyPath, data);\n}\n\nexport async function appendTerminalHistoryBatch(\n terminalId: string,\n data: string\n): Promise<void> {\n const historyPath = path.join(terminalDir(terminalId), \"transcript.log\");\n await fs.promises.appendFile(historyPath, data);\n}\n\nexport interface PersistedTerminalSnapshot {\n cursor: number;\n data: string;\n savedAt: number;\n cols?: number;\n rows?: number;\n}\n\nexport function readTerminalSnapshot(terminalId: string): PersistedTerminalSnapshot | null {\n const snapshot = readJsonFile<Partial<PersistedTerminalSnapshot> | null>(\n terminalSnapshotPath(terminalId),\n null\n );\n if (\n snapshot == null ||\n typeof snapshot.cursor !== \"number\" ||\n typeof snapshot.data !== \"string\" ||\n typeof snapshot.savedAt !== \"number\" ||\n (snapshot.cols !== undefined && typeof snapshot.cols !== \"number\") ||\n (snapshot.rows !== undefined && typeof snapshot.rows !== \"number\")\n ) {\n return null;\n }\n return snapshot as PersistedTerminalSnapshot;\n}\n\nexport function writeTerminalSnapshot(\n terminalId: string,\n snapshot: PersistedTerminalSnapshot\n): void {\n writeJsonFile(terminalSnapshotPath(terminalId), snapshot);\n}\n\nfunction trimPartialTerminalTail(content: string): string {\n if (!content) return content;\n\n const firstNewline = content.indexOf(\"\\n\");\n if (firstNewline === -1 || firstNewline === content.length - 1) {\n return content;\n }\n\n return content.slice(firstNewline + 1);\n}\n\n/**\n * Read the transcript log for a terminal.\n * Returns the raw content (up to `maxBytes` from the tail) or an empty string.\n */\nexport function readTerminalHistory(\n terminalId: string,\n maxBytes = 2 * 1024 * 1024\n): string {\n const historyPath = path.join(terminalDir(terminalId), \"transcript.log\");\n if (!fs.existsSync(historyPath)) return \"\";\n\n const stat = fs.statSync(historyPath);\n if (stat.size === 0) return \"\";\n\n if (stat.size <= maxBytes) {\n return fs.readFileSync(historyPath, \"utf-8\");\n }\n\n // Read only the tail\n const fd = fs.openSync(historyPath, \"r\");\n const buffer = Buffer.alloc(maxBytes);\n fs.readSync(fd, buffer, 0, maxBytes, stat.size - maxBytes);\n fs.closeSync(fd);\n return trimPartialTerminalTail(buffer.toString(\"utf-8\"));\n}\n", "import * as path from \"path\";\nimport { randomUUID } from \"crypto\";\nimport { ensureDataDir, nowIso, readJsonFile, writeJsonFile } from \"./files.js\";\nimport type { ProjectRecord } from \"./types.js\";\n\nconst PROJECTS_PATH = path.join(ensureDataDir(), \"projects.json\");\n\nfunction readProjects(): ProjectRecord[] {\n return readJsonFile<ProjectRecord[]>(PROJECTS_PATH, []);\n}\n\nfunction writeProjects(projects: ProjectRecord[]): void {\n writeJsonFile(PROJECTS_PATH, projects);\n}\n\nexport function listProjectRecords(): ProjectRecord[] {\n return readProjects().sort((a, b) => b.createdAt.localeCompare(a.createdAt));\n}\n\nexport function getProjectRecordById(projectId: string): ProjectRecord | null {\n return readProjects().find((project) => project.id === projectId) ?? null;\n}\n\nexport function getProjectRecordBySlug(slug: string): ProjectRecord | null {\n return readProjects().find((project) => project.slug === slug) ?? null;\n}\n\nexport function findProjectRecordByPath(projectPath: string): ProjectRecord | null {\n return readProjects().find((project) => project.localPath === projectPath) ?? null;\n}\n\nexport function findProjectRecordByGitHubRepo(\n githubOwner: string,\n githubRepo: string\n): ProjectRecord | null {\n const owner = githubOwner.trim().toLowerCase();\n const repo = githubRepo.trim().toLowerCase();\n\n return (\n readProjects().find(\n (project) =>\n project.githubOwner?.toLowerCase() === owner &&\n project.githubRepo?.toLowerCase() === repo\n ) ?? null\n );\n}\n\nexport function createProjectRecord(\n data: Omit<ProjectRecord, \"id\" | \"createdAt\" | \"updatedAt\">\n): ProjectRecord {\n const timestamp = nowIso();\n const project: ProjectRecord = {\n id: randomUUID(),\n ...data,\n createdAt: timestamp,\n updatedAt: timestamp,\n };\n\n const projects = readProjects();\n projects.push(project);\n writeProjects(projects);\n return project;\n}\n\nexport function updateProjectRecord(\n projectId: string,\n patch: Partial<Omit<ProjectRecord, \"id\" | \"createdAt\">>\n): ProjectRecord {\n const projects = readProjects();\n const index = projects.findIndex((project) => project.id === projectId);\n if (index === -1) {\n throw new Error(\"Project not found\");\n }\n\n const next: ProjectRecord = {\n ...projects[index],\n ...patch,\n updatedAt: nowIso(),\n };\n projects[index] = next;\n writeProjects(projects);\n return next;\n}\n\nexport function removeProjectRecord(projectId: string): void {\n writeProjects(readProjects().filter((project) => project.id !== projectId));\n}\n", "import { randomUUID } from \"crypto\";\nimport { execFileSync } from \"node:child_process\";\nimport * as path from \"path\";\nimport { ensureDataDir, nowIso, readJsonFile, writeJsonFile } from \"./files.js\";\nimport {\n findProjectRecordByPath,\n getProjectRecordById,\n listProjectRecords,\n updateProjectRecord,\n} from \"./projects.js\";\nimport { runGhCommand, runGitHubApi } from \"../integrations/github.js\";\nimport { findTerminalRecords, getTerminalRecord, readTerminalHistory } from \"./terminals.js\";\nimport type {\n KanbanOverlayRecord,\n KanbanTaskRecord,\n LocalKanbanTaskRecord,\n ProjectRecord,\n} from \"./types.js\";\n\nconst TASK_OVERLAYS_PATH = path.join(ensureDataDir(), \"kanban-overlays.json\");\nconst LOCAL_TASKS_PATH = path.join(ensureDataDir(), \"local-kanban-tasks.json\");\n\nconst STATUS_LABELS = {\n planned: \"maestro:planned\",\n ongoing: \"maestro:ongoing\",\n review: \"maestro:review\",\n} as const;\n\nconst STATUS_LABEL_SET = new Set<string>(Object.values(STATUS_LABELS));\n\nconst STATUS_LABEL_META: Record<\n (typeof STATUS_LABELS)[keyof typeof STATUS_LABELS],\n { color: string; description: string }\n> = {\n [STATUS_LABELS.planned]: {\n color: \"c2e0c6\",\n description: \"Queued in Maestro for planned work.\",\n },\n [STATUS_LABELS.ongoing]: {\n color: \"d4c5f9\",\n description: \"Currently being worked on by Maestro.\",\n },\n [STATUS_LABELS.review]: {\n color: \"fbca04\",\n description: \"Waiting for review in Maestro.\",\n },\n};\n\ninterface GitHubIssue {\n number: number;\n title: string;\n body: string | null;\n state: \"open\" | \"closed\";\n labels: Array<{ name: string }>;\n created_at: string;\n updated_at: string;\n html_url: string;\n pull_request?: unknown;\n}\n\ninterface GitHubPullRequest {\n number: number;\n html_url: string;\n}\n\ninterface GitHubPullRequestListItem {\n number: number;\n url: string;\n}\n\ninterface PullRequestResolution {\n pullRequest: GitHubPullRequest | null;\n status: \"none\" | \"existing\" | \"created\";\n}\n\nconst MAX_TERMINAL_COMMENT_LINES = 80;\nconst MAX_TERMINAL_COMMENT_CHARS = 6000;\n\nfunction readOverlays(): Record<string, KanbanOverlayRecord> {\n return readJsonFile<Record<string, KanbanOverlayRecord>>(TASK_OVERLAYS_PATH, {});\n}\n\nfunction writeOverlays(overlays: Record<string, KanbanOverlayRecord>): void {\n writeJsonFile(TASK_OVERLAYS_PATH, overlays);\n}\n\nfunction readLocalTasks(): LocalKanbanTaskRecord[] {\n return readJsonFile<LocalKanbanTaskRecord[]>(LOCAL_TASKS_PATH, []);\n}\n\nfunction writeLocalTasks(tasks: LocalKanbanTaskRecord[]): void {\n writeJsonFile(LOCAL_TASKS_PATH, tasks);\n}\n\nfunction overlayKey(projectId: string, issueNumber: number): string {\n return `${projectId}#${issueNumber}`;\n}\n\nfunction buildGitHubTaskId(projectId: string, issueNumber: number): string {\n return `github:${projectId}:${issueNumber}`;\n}\n\nfunction parseGitHubTaskId(taskId: string): { projectId: string; issueNumber: number } | null {\n const [prefix, projectId, issue] = taskId.split(\":\");\n if (prefix !== \"github\" || !projectId || !issue) {\n return null;\n }\n\n const issueNumber = Number(issue);\n if (!Number.isFinite(issueNumber)) {\n return null;\n }\n\n return { projectId, issueNumber };\n}\n\nfunction getOverlay(\n projectId: string,\n issueNumber: number\n): KanbanOverlayRecord | undefined {\n return readOverlays()[overlayKey(projectId, issueNumber)];\n}\n\nfunction slugifyBranchPart(input: string): string {\n return (\n input\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 48) || \"task\"\n );\n}\n\nfunction runGit(projectPath: string, args: string[]): string {\n try {\n return execFileSync(\"git\", args, {\n cwd: projectPath,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n }).trim();\n } catch (error) {\n const stderr =\n error instanceof Error && \"stderr\" in error && typeof error.stderr === \"string\"\n ? error.stderr.trim()\n : \"\";\n throw new Error(stderr || `git ${args.join(\" \")} failed`);\n }\n}\n\nfunction getPreferredBaseRef(projectPath: string, defaultBranch: string): string {\n try {\n runGit(projectPath, [\"rev-parse\", \"--verify\", `origin/${defaultBranch}`]);\n return `origin/${defaultBranch}`;\n } catch {\n return defaultBranch;\n }\n}\n\nfunction countCommitsAhead(projectPath: string, baseRef: string): number {\n const raw = runGit(projectPath, [\"rev-list\", \"--count\", `${baseRef}..HEAD`]);\n const count = Number(raw);\n return Number.isFinite(count) ? count : 0;\n}\n\nfunction stripAnsiSequences(input: string): string {\n return input\n .replace(/\\u001b\\][^\\u0007]*(?:\\u0007|\\u001b\\\\)/g, \"\")\n .replace(/\\u001b\\[[0-9;?]*[ -/]*[@-~]/g, \"\")\n .replace(/\\r/g, \"\")\n .replace(/\\0/g, \"\");\n}\n\nexport function extractTerminalTailForComment(\n transcript: string,\n maxLines = MAX_TERMINAL_COMMENT_LINES,\n maxChars = MAX_TERMINAL_COMMENT_CHARS\n): string {\n const cleaned = stripAnsiSequences(transcript).trim();\n if (!cleaned) {\n return \"\";\n }\n\n const tailLines = cleaned.split(\"\\n\").slice(-maxLines);\n let tail = tailLines.join(\"\\n\").trim();\n if (tail.length > maxChars) {\n tail = tail.slice(-maxChars).trim();\n const newlineIndex = tail.indexOf(\"\\n\");\n if (newlineIndex !== -1 && newlineIndex < tail.length - 1) {\n tail = tail.slice(newlineIndex + 1).trim();\n }\n }\n\n return tail;\n}\n\nexport function buildKanbanIssueCompletionComment(input: {\n successful: boolean;\n completionSummary: string;\n pullRequest?: GitHubPullRequest | null;\n terminalTail?: string;\n}): string {\n const lines = [\n `Maestro ${input.successful ? \"finished\" : \"stopped\"} work on this task.`,\n \"\",\n `Status: ${input.completionSummary}`,\n ];\n\n if (input.pullRequest?.html_url) {\n lines.push(`Pull request: ${input.pullRequest.html_url}`);\n }\n\n const terminalTail = input.terminalTail?.trim();\n if (terminalTail) {\n lines.push(\"\", \"Last terminal output:\", \"\", \"```text\");\n lines.push(terminalTail.replace(/```/g, \"'''\"));\n lines.push(\"```\");\n }\n\n return lines.join(\"\\n\").trim();\n}\n\nfunction getColumnForIssue(issue: GitHubIssue): KanbanTaskRecord[\"column\"] {\n if (issue.state === \"closed\") {\n return \"done\";\n }\n\n const labels = new Set(issue.labels.map((label) => label.name));\n if (labels.has(STATUS_LABELS.review)) {\n return \"review\";\n }\n if (labels.has(STATUS_LABELS.ongoing)) {\n return \"ongoing\";\n }\n if (labels.has(STATUS_LABELS.planned)) {\n return \"planned\";\n }\n return \"backlog\";\n}\n\nfunction withTaskRelations(task: KanbanTaskRecord): KanbanTaskRecord {\n const project = task.projectId ? getProjectRecordById(task.projectId) : null;\n const terminals = findTerminalRecords(\n (terminal) =>\n terminal.kanbanTaskId === task.id || terminal.id === task.assignedTerminalId\n ).map((terminal) => ({\n id: terminal.id,\n name: terminal.name,\n status: terminal.status,\n }));\n\n return {\n ...task,\n project: project ? { id: project.id, name: project.name } : null,\n terminals,\n };\n}\n\nasync function githubRequest<T>(\n project: ProjectRecord,\n route: string,\n init?: {\n method?: \"GET\" | \"POST\" | \"PATCH\" | \"PUT\" | \"DELETE\";\n body?: Record<string, unknown>;\n }\n): Promise<T> {\n if (!project.githubOwner || !project.githubRepo) {\n throw new Error(\"Project is not linked to a GitHub repository\");\n }\n\n return runGitHubApi<T>(\n `repos/${project.githubOwner}/${project.githubRepo}${route}`,\n {\n method: init?.method,\n input: init?.body,\n }\n );\n}\n\nasync function listGitHubIssues(project: ProjectRecord): Promise<GitHubIssue[]> {\n const issues = await githubRequest<GitHubIssue[]>(\n project,\n \"/issues?state=all&per_page=100\"\n );\n return issues.filter((issue) => !issue.pull_request);\n}\n\nasync function getGitHubIssue(\n project: ProjectRecord,\n issueNumber: number\n): Promise<GitHubIssue> {\n return githubRequest<GitHubIssue>(project, `/issues/${issueNumber}`);\n}\n\nasync function patchGitHubIssue(\n project: ProjectRecord,\n issueNumber: number,\n body: Record<string, unknown>\n): Promise<GitHubIssue> {\n return githubRequest<GitHubIssue>(project, `/issues/${issueNumber}`, {\n method: \"PATCH\",\n body,\n });\n}\n\nasync function postGitHubIssueComment(\n project: ProjectRecord,\n issueNumber: number,\n body: string\n): Promise<void> {\n await githubRequest(project, `/issues/${issueNumber}/comments`, {\n method: \"POST\",\n body: { body },\n });\n}\n\nasync function ensureGitHubLabels(\n project: ProjectRecord,\n labelNames: string[]\n): Promise<void> {\n const needed = [...new Set(labelNames)].filter(Boolean);\n if (needed.length === 0) {\n return;\n }\n\n const labels = await githubRequest<Array<{ name: string }>>(\n project,\n \"/labels?per_page=100\"\n );\n const existing = new Set(labels.map((label) => label.name));\n\n for (const name of needed) {\n if (existing.has(name)) {\n continue;\n }\n\n const meta = STATUS_LABEL_META[name as keyof typeof STATUS_LABEL_META] ?? {\n color: \"ededed\",\n description: \"Managed by Maestro.\",\n };\n await githubRequest(project, \"/labels\", {\n method: \"POST\",\n body: {\n name,\n color: meta.color,\n description: meta.description,\n },\n });\n existing.add(name);\n }\n}\n\nfunction mapGitHubIssueToTask(\n project: ProjectRecord,\n issue: GitHubIssue,\n overlay: KanbanOverlayRecord | undefined\n): KanbanTaskRecord {\n const visibleLabels = issue.labels\n .map((label) => label.name)\n .filter((name) => !STATUS_LABEL_SET.has(name));\n const issueColumn = getColumnForIssue(issue);\n const column =\n issue.state === \"open\" && overlay?.pullRequestUrl\n ? \"review\"\n : overlay?.assignedTerminalId && issue.state === \"open\"\n ? overlay.progress === 100\n ? \"done\"\n : issueColumn\n : issueColumn;\n\n return withTaskRelations({\n id: buildGitHubTaskId(project.id, issue.number),\n title: issue.title,\n description: issue.body ?? \"\",\n column,\n projectId: project.id,\n projectPath: project.localPath,\n blockedBy: overlay?.blockedBy ?? [],\n priority: overlay?.priority ?? \"medium\",\n progress:\n issue.state === \"closed\" ? 100 : Math.max(0, Math.min(100, overlay?.progress ?? 0)),\n orderIndex: overlay?.orderIndex ?? issue.number,\n labels: visibleLabels,\n completionSummary: overlay?.completionSummary ?? null,\n assignedTerminalId: overlay?.assignedTerminalId ?? null,\n pullRequestNumber: overlay?.pullRequestNumber ?? null,\n pullRequestUrl: overlay?.pullRequestUrl ?? null,\n createdAt: issue.created_at,\n updatedAt: issue.updated_at,\n sourceType: \"github_issue\",\n sourceId: String(issue.number),\n });\n}\n\nfunction listLocalTasks(projectId?: string): KanbanTaskRecord[] {\n return readLocalTasks()\n .filter((task) => !projectId || task.projectId === projectId)\n .map((task) => withTaskRelations({ ...task, blockedBy: task.blockedBy ?? [], sourceType: \"local\", sourceId: task.id }));\n}\n\nasync function listGitHubTasks(projectId?: string): Promise<KanbanTaskRecord[]> {\n const overlays = readOverlays();\n const projects = listProjectRecords().filter(\n (project) =>\n (!projectId || project.id === projectId) &&\n Boolean(project.githubOwner && project.githubRepo)\n );\n\n const taskGroups = await Promise.all(\n projects.map(async (project) => {\n try {\n const issues = await listGitHubIssues(project);\n return issues.map((issue) =>\n mapGitHubIssueToTask(project, issue, overlays[overlayKey(project.id, issue.number)])\n );\n } catch (error) {\n updateProjectRecord(project.id, {\n lastSyncError: error instanceof Error ? error.message : \"GitHub sync failed\",\n });\n return [];\n }\n })\n );\n\n return taskGroups.flat();\n}\n\nexport async function listKanbanTasks(filters?: {\n projectId?: string;\n column?: string;\n}): Promise<KanbanTaskRecord[]> {\n const [githubTasks, localTasks] = await Promise.all([\n listGitHubTasks(filters?.projectId),\n Promise.resolve(listLocalTasks(filters?.projectId)),\n ]);\n\n return [...githubTasks, ...localTasks]\n .filter((task) => !filters?.column || task.column === filters.column)\n .sort((a, b) => a.orderIndex - b.orderIndex || a.createdAt.localeCompare(b.createdAt));\n}\n\nexport async function getKanbanTask(taskId: string): Promise<KanbanTaskRecord | null> {\n if (taskId.startsWith(\"local:\")) {\n const local = readLocalTasks().find((task) => `local:${task.id}` === taskId);\n return local ? withTaskRelations({ ...local, sourceType: \"local\", sourceId: local.id }) : null;\n }\n\n const parsed = parseGitHubTaskId(taskId);\n if (!parsed) {\n return null;\n }\n\n const project = getProjectRecordById(parsed.projectId);\n if (!project) {\n return null;\n }\n\n const issue = await getGitHubIssue(project, parsed.issueNumber);\n const overlays = readOverlays();\n return mapGitHubIssueToTask(project, issue, overlays[overlayKey(project.id, parsed.issueNumber)]);\n}\n\nexport async function probeGitHubMirror(projectId: string): Promise<{ syncedCount: number }> {\n const project = getProjectRecordById(projectId);\n if (!project) {\n throw new Error(\"Project not found\");\n }\n\n try {\n const issues = await listGitHubIssues(project);\n updateProjectRecord(project.id, {\n lastSyncedAt: nowIso(),\n lastSyncError: null,\n });\n return { syncedCount: issues.length };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"GitHub sync failed\";\n updateProjectRecord(project.id, {\n lastSyncError: message,\n });\n throw new Error(message);\n }\n}\n\nexport async function createKanbanTask(input: {\n title: string;\n description: string;\n projectId?: string;\n projectPath?: string;\n blockedBy?: string[];\n priority?: \"low\" | \"medium\" | \"high\";\n labels?: string[];\n}): Promise<KanbanTaskRecord> {\n const project =\n (input.projectId ? getProjectRecordById(input.projectId) : null) ||\n (input.projectPath ? findProjectRecordByPath(input.projectPath) : null);\n\n if (!project && !input.projectPath) {\n throw new Error(\"projectId or projectPath is required\");\n }\n\n if (project?.githubOwner && project.githubRepo) {\n const issue = await githubRequest<GitHubIssue>(project, \"/issues\", {\n method: \"POST\",\n body: {\n title: input.title,\n body: input.description,\n labels: input.labels ?? [],\n },\n });\n\n const overlays = readOverlays();\n overlays[overlayKey(project.id, issue.number)] = {\n blockedBy: input.blockedBy ?? [],\n priority: input.priority ?? \"medium\",\n progress: 0,\n assignedTerminalId: null,\n completionSummary: null,\n orderIndex: issue.number,\n };\n writeOverlays(overlays);\n\n return mapGitHubIssueToTask(project, issue, overlays[overlayKey(project.id, issue.number)]);\n }\n\n const timestamp = nowIso();\n const localTask: LocalKanbanTaskRecord = {\n id: randomUUID(),\n title: input.title,\n description: input.description,\n column: \"backlog\",\n projectId: project?.id ?? null,\n projectPath: project?.localPath ?? input.projectPath ?? \"\",\n blockedBy: input.blockedBy ?? [],\n priority: input.priority ?? \"medium\",\n progress: 0,\n orderIndex: Date.now(),\n labels: input.labels ?? [],\n completionSummary: null,\n assignedTerminalId: null,\n createdAt: timestamp,\n updatedAt: timestamp,\n };\n\n const tasks = readLocalTasks();\n tasks.push(localTask);\n writeLocalTasks(tasks);\n return withTaskRelations({ ...localTask, id: `local:${localTask.id}`, sourceType: \"local\", sourceId: localTask.id });\n}\n\nfunction setOverlay(\n projectId: string,\n issueNumber: number,\n patch: Partial<KanbanOverlayRecord>\n): KanbanOverlayRecord {\n const overlays = readOverlays();\n const key = overlayKey(projectId, issueNumber);\n const next = {\n ...overlays[key],\n ...patch,\n };\n overlays[key] = next;\n writeOverlays(overlays);\n return next;\n}\n\nfunction deleteOverlay(projectId: string, issueNumber: number): void {\n const overlays = readOverlays();\n const key = overlayKey(projectId, issueNumber);\n if (!(key in overlays)) {\n return;\n }\n\n delete overlays[key];\n writeOverlays(overlays);\n}\n\nexport function handleGitHubIssueWebhookEvent(\n projectId: string,\n action: string,\n issueNumber: number\n): { taskId: string } {\n updateProjectRecord(projectId, {\n lastSyncedAt: nowIso(),\n lastSyncError: null,\n });\n\n if (action === \"deleted\") {\n deleteOverlay(projectId, issueNumber);\n }\n\n return {\n taskId: buildGitHubTaskId(projectId, issueNumber),\n };\n}\n\nfunction extractLinkedIssueNumber(text: string | null | undefined): number | null {\n if (!text) {\n return null;\n }\n\n const match = text.match(/(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?)\\s+#(\\d+)/i);\n if (!match) {\n return null;\n }\n\n const issueNumber = Number(match[1]);\n return Number.isFinite(issueNumber) ? issueNumber : null;\n}\n\nexport function handleGitHubPullRequestWebhookEvent(\n projectId: string,\n action: string,\n pullRequest: {\n number: number;\n htmlUrl: string;\n body?: string | null;\n merged?: boolean;\n }\n): { taskId: string | null } {\n updateProjectRecord(projectId, {\n lastSyncedAt: nowIso(),\n lastSyncError: null,\n });\n\n const issueNumber = extractLinkedIssueNumber(pullRequest.body);\n if (!issueNumber) {\n return { taskId: null };\n }\n\n if (\n action === \"opened\" ||\n action === \"reopened\" ||\n action === \"synchronize\" ||\n action === \"ready_for_review\"\n ) {\n setOverlay(projectId, issueNumber, {\n pullRequestNumber: pullRequest.number,\n pullRequestUrl: pullRequest.htmlUrl,\n });\n } else if (action === \"closed\" && pullRequest.merged) {\n setOverlay(projectId, issueNumber, {\n pullRequestNumber: pullRequest.number,\n pullRequestUrl: pullRequest.htmlUrl,\n assignedTerminalId: null,\n progress: 100,\n completionSummary: `PR #${pullRequest.number} merged.`,\n });\n } else if (action === \"closed\" && !pullRequest.merged) {\n setOverlay(projectId, issueNumber, {\n pullRequestNumber: null,\n pullRequestUrl: null,\n });\n }\n\n return {\n taskId: buildGitHubTaskId(projectId, issueNumber),\n };\n}\n\nexport async function handleGitHubPullRequestReviewWebhookEvent(\n projectId: string,\n action: string,\n review: {\n state?: string | null;\n },\n pullRequest: {\n body?: string | null;\n }\n): Promise<{ taskId: string | null }> {\n updateProjectRecord(projectId, {\n lastSyncedAt: nowIso(),\n lastSyncError: null,\n });\n\n if (\n action !== \"submitted\" ||\n (review.state !== \"changes_requested\" && review.state !== \"commented\")\n ) {\n return { taskId: null };\n }\n\n const issueNumber = extractLinkedIssueNumber(pullRequest.body);\n if (!issueNumber) {\n return { taskId: null };\n }\n\n const taskId = buildGitHubTaskId(projectId, issueNumber);\n const task = await getKanbanTask(taskId);\n if (!task || task.column !== \"review\") {\n return { taskId: null };\n }\n\n await updateKanbanTaskRecord(taskId, {\n column: \"planned\",\n assignedTerminalId: null,\n completionSummary:\n review.state === \"changes_requested\"\n ? \"GitHub review requested changes. Task moved back to planned.\"\n : \"GitHub review feedback received. Task moved back to planned.\",\n });\n\n return { taskId };\n}\n\nexport async function handleGitHubPullRequestReviewCommentWebhookEvent(\n projectId: string,\n action: string,\n pullRequest: {\n body?: string | null;\n }\n): Promise<{ taskId: string | null }> {\n updateProjectRecord(projectId, {\n lastSyncedAt: nowIso(),\n lastSyncError: null,\n });\n\n if (action !== \"created\") {\n return { taskId: null };\n }\n\n const issueNumber = extractLinkedIssueNumber(pullRequest.body);\n if (!issueNumber) {\n return { taskId: null };\n }\n\n const taskId = buildGitHubTaskId(projectId, issueNumber);\n const task = await getKanbanTask(taskId);\n if (!task || task.column !== \"review\") {\n return { taskId: null };\n }\n\n await updateKanbanTaskRecord(taskId, {\n column: \"planned\",\n assignedTerminalId: null,\n completionSummary: \"GitHub review comment received. Task moved back to planned.\",\n });\n\n return { taskId };\n}\n\nasync function createOrUpdatePullRequestForTask(\n task: KanbanTaskRecord,\n project: ProjectRecord,\n issueNumber: number,\n gitPath: string\n): Promise<PullRequestResolution> {\n if (!project.githubOwner || !project.githubRepo) {\n return { pullRequest: null, status: \"none\" };\n }\n\n const existingOverlay = getOverlay(project.id, issueNumber);\n if (existingOverlay?.pullRequestNumber && existingOverlay.pullRequestUrl) {\n return {\n pullRequest: {\n number: existingOverlay.pullRequestNumber,\n html_url: existingOverlay.pullRequestUrl,\n },\n status: \"existing\",\n };\n }\n\n runGit(gitPath, [\"rev-parse\", \"--is-inside-work-tree\"]);\n\n const currentBranch = runGit(gitPath, [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n const defaultBranch = project.defaultBranch || \"main\";\n const baseRef = getPreferredBaseRef(gitPath, defaultBranch);\n const branchName =\n existingOverlay?.branchName ||\n (currentBranch !== \"HEAD\" && currentBranch !== defaultBranch\n ? currentBranch\n : `maestro/issue-${issueNumber}-${slugifyBranchPart(task.title)}`);\n if (currentBranch !== branchName) {\n const localBranch = runGit(gitPath, [\"branch\", \"--list\", branchName]);\n if (localBranch) {\n runGit(gitPath, [\"checkout\", branchName]);\n } else {\n runGit(gitPath, [\"checkout\", \"-b\", branchName]);\n }\n }\n\n setOverlay(project.id, issueNumber, {\n branchName,\n });\n\n const findPullRequest = (): GitHubPullRequest | null => {\n const raw = runGhCommand(\n [\n \"pr\",\n \"list\",\n \"--state\",\n \"open\",\n \"--head\",\n branchName,\n \"--json\",\n \"number,url\",\n \"--limit\",\n \"1\",\n ],\n { cwd: gitPath }\n );\n const pulls = JSON.parse(raw) as GitHubPullRequestListItem[];\n const pull = pulls[0];\n return pull\n ? {\n number: pull.number,\n html_url: pull.url,\n }\n : null;\n };\n\n let pullRequest = findPullRequest();\n if (pullRequest) {\n setOverlay(project.id, issueNumber, {\n branchName,\n pullRequestNumber: pullRequest.number,\n pullRequestUrl: pullRequest.html_url,\n });\n return { pullRequest, status: \"existing\" };\n }\n\n const hasUncommittedChanges = Boolean(runGit(gitPath, [\"status\", \"--porcelain\"]));\n if (hasUncommittedChanges) {\n runGit(gitPath, [\"add\", \"-A\"]);\n if (!runGit(gitPath, [\"diff\", \"--cached\", \"--name-only\"])) {\n return { pullRequest: null, status: \"none\" };\n }\n\n runGit(gitPath, [\"commit\", \"-m\", `Resolve #${issueNumber}: ${task.title}`]);\n }\n\n if (!hasUncommittedChanges) {\n if (branchName === defaultBranch || countCommitsAhead(gitPath, baseRef) === 0) {\n return { pullRequest: null, status: \"none\" };\n }\n }\n\n runGit(gitPath, [\"push\", \"-u\", \"origin\", branchName]);\n\n pullRequest = findPullRequest();\n let status: PullRequestResolution[\"status\"] = \"existing\";\n if (!pullRequest) {\n runGhCommand(\n [\n \"pr\",\n \"create\",\n \"--base\",\n project.defaultBranch || \"main\",\n \"--head\",\n branchName,\n \"--title\",\n `Resolve #${issueNumber}: ${task.title}`,\n \"--body\",\n `Fixes #${issueNumber}\\n\\nAutomated by Maestro.`,\n ],\n { cwd: gitPath }\n );\n pullRequest = findPullRequest();\n status = \"created\";\n }\n\n if (!pullRequest) {\n throw new Error(`Failed to create or locate PR for branch ${branchName}`);\n }\n\n setOverlay(project.id, issueNumber, {\n branchName,\n pullRequestNumber: pullRequest.number,\n pullRequestUrl: pullRequest.html_url,\n });\n\n return { pullRequest, status };\n}\n\nexport async function finalizeKanbanTaskAfterTerminalExit(\n terminalId: string,\n taskId: string,\n successful: boolean\n): Promise<{ taskId: string; column: KanbanTaskRecord[\"column\"] }> {\n const task = await getKanbanTask(taskId);\n if (!task) {\n throw new Error(\"Task not found\");\n }\n\n const terminalTail = extractTerminalTailForComment(readTerminalHistory(terminalId));\n\n if (!successful) {\n const resetTask = await updateKanbanTaskRecord(task.id, {\n column: \"planned\",\n assignedTerminalId: null,\n completionSummary: \"Terminal run failed. Task moved back to planned.\",\n });\n\n const parsedFailureTask = parseGitHubTaskId(task.id);\n if (parsedFailureTask) {\n const failureProject = getProjectRecordById(parsedFailureTask.projectId);\n if (failureProject) {\n try {\n await postGitHubIssueComment(\n failureProject,\n parsedFailureTask.issueNumber,\n buildKanbanIssueCompletionComment({\n successful: false,\n completionSummary: \"Terminal run failed. Task moved back to planned.\",\n terminalTail,\n })\n );\n } catch (error) {\n console.warn(\n `Failed to post kanban completion comment for issue ${parsedFailureTask.issueNumber}:`,\n error\n );\n }\n }\n }\n\n return { taskId: resetTask.id, column: resetTask.column };\n }\n\n if (task.sourceType === \"local\") {\n const completedTask = await updateKanbanTaskRecord(task.id, {\n column: \"done\",\n progress: 100,\n assignedTerminalId: terminalId,\n });\n return { taskId: completedTask.id, column: completedTask.column };\n }\n\n const parsed = parseGitHubTaskId(task.id);\n if (!parsed) {\n throw new Error(\"Task is not linked to a GitHub issue\");\n }\n\n const project = getProjectRecordById(parsed.projectId);\n if (!project) {\n throw new Error(\"Project not found\");\n }\n\n const terminal = getTerminalRecord(terminalId);\n const gitPath = terminal?.worktreePath || terminal?.projectPath || project.localPath;\n\n const pullRequestResult = await createOrUpdatePullRequestForTask(\n task,\n project,\n parsed.issueNumber,\n gitPath\n );\n const pullRequest = pullRequestResult.pullRequest;\n const completionSummary = pullRequest\n ? `PR #${pullRequest.number} ready for review.`\n : \"Completed without code changes.\";\n const nextTask = await updateKanbanTaskRecord(task.id, {\n column: pullRequest ? \"review\" : \"done\",\n progress: 100,\n assignedTerminalId: terminalId,\n completionSummary,\n });\n\n try {\n await postGitHubIssueComment(\n project,\n parsed.issueNumber,\n buildKanbanIssueCompletionComment({\n successful: true,\n completionSummary,\n pullRequest,\n terminalTail,\n })\n );\n } catch (error) {\n console.warn(\n `Failed to post kanban completion comment for issue ${parsed.issueNumber}:`,\n error\n );\n }\n\n return { taskId: nextTask.id, column: nextTask.column };\n}\n\nfunction updateLocalTask(\n taskId: string,\n patch: Partial<LocalKanbanTaskRecord>\n): LocalKanbanTaskRecord {\n const tasks = readLocalTasks();\n const index = tasks.findIndex((task) => task.id === taskId);\n if (index === -1) {\n throw new Error(\"Task not found\");\n }\n\n const next: LocalKanbanTaskRecord = {\n ...tasks[index],\n ...patch,\n updatedAt: nowIso(),\n };\n tasks[index] = next;\n writeLocalTasks(tasks);\n return next;\n}\n\nexport async function updateKanbanTaskRecord(\n taskId: string,\n patch: {\n title?: string;\n description?: string;\n column?: \"backlog\" | \"planned\" | \"ongoing\" | \"review\" | \"done\";\n priority?: \"low\" | \"medium\" | \"high\";\n progress?: number;\n labels?: string[];\n blockedBy?: string[];\n completionSummary?: string;\n assignedTerminalId?: string | null;\n }\n): Promise<KanbanTaskRecord> {\n if (taskId.startsWith(\"local:\")) {\n const task = updateLocalTask(taskId.replace(/^local:/, \"\"), {\n ...(patch.title !== undefined ? { title: patch.title } : {}),\n ...(patch.description !== undefined ? { description: patch.description } : {}),\n ...(patch.column !== undefined ? { column: patch.column } : {}),\n ...(patch.priority !== undefined ? { priority: patch.priority } : {}),\n ...(patch.progress !== undefined ? { progress: patch.progress } : {}),\n ...(patch.labels !== undefined ? { labels: patch.labels } : {}),\n ...(patch.blockedBy !== undefined ? { blockedBy: patch.blockedBy } : {}),\n ...(patch.completionSummary !== undefined\n ? { completionSummary: patch.completionSummary }\n : {}),\n ...(patch.assignedTerminalId !== undefined\n ? { assignedTerminalId: patch.assignedTerminalId }\n : {}),\n });\n return withTaskRelations({\n ...task,\n id: `local:${task.id}`,\n blockedBy: task.blockedBy ?? [],\n sourceType: \"local\",\n sourceId: task.id,\n pullRequestNumber: task.pullRequestNumber ?? null,\n pullRequestUrl: task.pullRequestUrl ?? null,\n });\n }\n\n const parsed = parseGitHubTaskId(taskId);\n if (!parsed) {\n throw new Error(\"Task not found\");\n }\n\n const project = getProjectRecordById(parsed.projectId);\n if (!project) {\n throw new Error(\"Project not found\");\n }\n\n const current = await getGitHubIssue(project, parsed.issueNumber);\n const existingLabels = current.labels\n .map((label) => label.name)\n .filter((name) => !STATUS_LABEL_SET.has(name));\n\n const nextColumn = patch.column ?? getColumnForIssue(current);\n const nextLabels = patch.labels ?? existingLabels;\n const statusLabels =\n nextColumn === \"planned\"\n ? [STATUS_LABELS.planned]\n : nextColumn === \"ongoing\"\n ? [STATUS_LABELS.ongoing]\n : nextColumn === \"review\"\n ? [STATUS_LABELS.review]\n : [];\n\n await ensureGitHubLabels(project, statusLabels);\n\n const issue = await patchGitHubIssue(project, parsed.issueNumber, {\n ...(patch.title !== undefined ? { title: patch.title } : {}),\n ...(patch.description !== undefined ? { body: patch.description } : {}),\n labels: [...nextLabels, ...statusLabels],\n state: nextColumn === \"done\" ? \"closed\" : \"open\",\n });\n\n const overlay = setOverlay(project.id, parsed.issueNumber, {\n ...(patch.priority !== undefined ? { priority: patch.priority } : {}),\n ...(patch.progress !== undefined ? { progress: patch.progress } : {}),\n ...(patch.blockedBy !== undefined ? { blockedBy: patch.blockedBy } : {}),\n ...(patch.completionSummary !== undefined\n ? { completionSummary: patch.completionSummary }\n : {}),\n ...(patch.assignedTerminalId !== undefined\n ? { assignedTerminalId: patch.assignedTerminalId }\n : {}),\n });\n\n return mapGitHubIssueToTask(project, issue, overlay);\n}\n\nexport async function moveKanbanTaskRecord(\n taskId: string,\n column: \"backlog\" | \"planned\" | \"ongoing\" | \"review\" | \"done\"\n): Promise<KanbanTaskRecord> {\n return updateKanbanTaskRecord(taskId, {\n column,\n ...(column === \"done\" ? { progress: 100 } : {}),\n ...(column === \"backlog\" || column === \"planned\"\n ? { assignedTerminalId: null }\n : {}),\n });\n}\n\nexport async function deleteKanbanTaskRecord(taskId: string): Promise<void> {\n if (taskId.startsWith(\"local:\")) {\n writeLocalTasks(\n readLocalTasks().filter((task) => `local:${task.id}` !== taskId)\n );\n return;\n }\n\n const parsed = parseGitHubTaskId(taskId);\n if (!parsed) {\n throw new Error(\"Task not found\");\n }\n\n const project = getProjectRecordById(parsed.projectId);\n if (!project) {\n throw new Error(\"Project not found\");\n }\n\n await patchGitHubIssue(project, parsed.issueNumber, {\n state: \"closed\",\n });\n}\n\nexport function deleteKanbanStateForProject(\n projectId: string,\n projectPath?: string\n): void {\n const overlays = readOverlays();\n const nextOverlays = Object.fromEntries(\n Object.entries(overlays).filter(([key]) => !key.startsWith(`${projectId}#`))\n );\n writeOverlays(nextOverlays);\n writeLocalTasks(\n readLocalTasks().filter(\n (task) => task.projectId !== projectId && (!projectPath || task.projectPath !== projectPath)\n )\n );\n}\n", "import { execFileSync } from \"node:child_process\";\nimport {\n findProjectRecordByPath,\n getProjectRecordById,\n updateProjectRecord,\n} from \"../state/projects.js\";\nimport type { ProjectRecord } from \"../state/types.js\";\n\nexport interface RepoSyncDecisionInput {\n currentBranch: string;\n upstreamRef: string | null;\n isDirty: boolean;\n localHead: string | null;\n upstreamHead: string | null;\n mergeBase: string | null;\n}\n\nexport interface RepoSyncDecision {\n action: \"skip\" | \"noop\" | \"fast-forward\";\n reason: string;\n}\n\nexport interface AutoWorktreeStartPointInput {\n currentBranch: string;\n upstreamRef: string | null;\n preferredBranch: string | null;\n preferredBranchExists: boolean;\n}\n\nexport interface AutoWorktreeStartPoint {\n ref: string;\n usedRemote: boolean;\n reason: string;\n}\n\nfunction readCommandError(error: unknown, fallback: string): string {\n if (error instanceof Error && \"stderr\" in error && typeof error.stderr === \"string\") {\n const stderr = error.stderr.trim();\n if (stderr) {\n return stderr;\n }\n }\n\n return error instanceof Error && error.message ? error.message : fallback;\n}\n\nfunction runGit(path: string, args: string[]): string {\n return execFileSync(\"git\", args, {\n cwd: path,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n }).trim();\n}\n\nfunction tryRunGit(path: string, args: string[]): { ok: true; output: string } | {\n ok: false;\n error: string;\n} {\n try {\n return { ok: true, output: runGit(path, args) };\n } catch (error) {\n return {\n ok: false,\n error: readCommandError(error, `git ${args.join(\" \")} failed`),\n };\n }\n}\n\nfunction resolveProjectRecord(input: {\n projectId?: string | null;\n projectPath: string;\n}): ProjectRecord | null {\n if (input.projectId) {\n return getProjectRecordById(input.projectId);\n }\n\n return findProjectRecordByPath(input.projectPath);\n}\n\nfunction shouldPersistSyncStatus(project: ProjectRecord | null): boolean {\n return Boolean(project && (project.repoUrl || (project.githubOwner && project.githubRepo)));\n}\n\nfunction persistSyncSuccess(project: ProjectRecord | null) {\n if (!project || !shouldPersistSyncStatus(project)) {\n return;\n }\n\n updateProjectRecord(project.id, {\n lastSyncedAt: new Date().toISOString(),\n lastSyncError: null,\n });\n}\n\nfunction persistSyncError(project: ProjectRecord | null, message: string) {\n if (!project || !shouldPersistSyncStatus(project)) {\n return;\n }\n\n updateProjectRecord(project.id, {\n lastSyncError: message,\n });\n}\n\nexport function decideRepoSyncAction(input: RepoSyncDecisionInput): RepoSyncDecision {\n if (input.currentBranch === \"HEAD\") {\n return {\n action: \"skip\",\n reason: \"Skipped pre-spawn sync because the repository is in detached HEAD state.\",\n };\n }\n\n if (!input.upstreamRef) {\n return {\n action: \"skip\",\n reason: \"Skipped pre-spawn sync because the current branch has no upstream branch.\",\n };\n }\n\n if (input.isDirty) {\n return {\n action: \"skip\",\n reason: \"Skipped pre-spawn sync because the repository has uncommitted changes.\",\n };\n }\n\n if (!input.localHead || !input.upstreamHead || !input.mergeBase) {\n return {\n action: \"skip\",\n reason: \"Skipped pre-spawn sync because the repository state could not be resolved.\",\n };\n }\n\n if (input.localHead === input.upstreamHead) {\n return {\n action: \"noop\",\n reason: \"Repository is already up to date with its upstream branch.\",\n };\n }\n\n if (input.mergeBase === input.localHead) {\n return {\n action: \"fast-forward\",\n reason: `Fast-forwarded ${input.currentBranch} to ${input.upstreamRef}.`,\n };\n }\n\n if (input.mergeBase === input.upstreamHead) {\n return {\n action: \"noop\",\n reason: \"Repository is ahead of its upstream branch; no fast-forward was needed.\",\n };\n }\n\n return {\n action: \"skip\",\n reason: \"Skipped pre-spawn sync because the local branch has diverged from upstream.\",\n };\n}\n\nexport function decideAutoWorktreeStartPoint(\n input: AutoWorktreeStartPointInput\n): AutoWorktreeStartPoint {\n const preferredBranch = input.preferredBranch?.trim() || null;\n if (preferredBranch && input.preferredBranchExists) {\n return {\n ref: `origin/${preferredBranch}`,\n usedRemote: true,\n reason: `Using latest origin/${preferredBranch} in a fresh worktree.`,\n };\n }\n\n if (input.upstreamRef) {\n return {\n ref: input.upstreamRef,\n usedRemote: true,\n reason: `Using latest ${input.upstreamRef} in a fresh worktree.`,\n };\n }\n\n if (input.currentBranch !== \"HEAD\") {\n return {\n ref: input.currentBranch,\n usedRemote: false,\n reason: `Using local ${input.currentBranch} in a fresh worktree because no remote tracking branch was available.`,\n };\n }\n\n return {\n ref: \"HEAD\",\n usedRemote: false,\n reason: \"Using local HEAD in a fresh worktree because no remote tracking branch was available.\",\n };\n}\n\nfunction resolveUpstreamRef(path: string, currentBranch: string): string | null {\n const upstream = tryRunGit(path, [\"rev-parse\", \"--abbrev-ref\", \"@{upstream}\"]);\n if (upstream.ok && upstream.output) {\n return upstream.output;\n }\n\n const originBranch = `refs/remotes/origin/${currentBranch}`;\n const remoteBranch = tryRunGit(path, [\"show-ref\", \"--verify\", \"--quiet\", originBranch]);\n if (remoteBranch.ok) {\n return `origin/${currentBranch}`;\n }\n\n return null;\n}\n\nfunction hasGitRef(path: string, ref: string): boolean {\n return tryRunGit(path, [\"show-ref\", \"--verify\", \"--quiet\", ref]).ok;\n}\n\nexport async function resolveAutoWorktreeStartPoint(input: {\n projectId?: string | null;\n projectPath: string;\n preferredBranch?: string | null;\n}): Promise<AutoWorktreeStartPoint> {\n const project = resolveProjectRecord(input);\n const insideWorkTree = tryRunGit(input.projectPath, [\"rev-parse\", \"--is-inside-work-tree\"]);\n if (!insideWorkTree.ok) {\n const reason = \"Auto-worktree requires the project path to be a git repository.\";\n persistSyncError(project, reason);\n throw new Error(reason);\n }\n\n const currentBranch = tryRunGit(input.projectPath, [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n if (!currentBranch.ok) {\n const reason = `Pre-spawn sync failed while resolving the current branch: ${currentBranch.error}`;\n persistSyncError(project, reason);\n throw new Error(reason);\n }\n\n const origin = tryRunGit(input.projectPath, [\"remote\", \"get-url\", \"origin\"]);\n if (origin.ok && origin.output) {\n const fetch = tryRunGit(input.projectPath, [\"fetch\", \"--prune\", \"origin\"]);\n if (!fetch.ok) {\n const reason = `Pre-spawn sync failed during fetch: ${fetch.error}`;\n persistSyncError(project, reason);\n throw new Error(reason);\n }\n }\n\n const preferredBranch = input.preferredBranch?.trim() || project?.defaultBranch?.trim() || null;\n const preferredBranchExists = Boolean(\n preferredBranch && hasGitRef(input.projectPath, `refs/remotes/origin/${preferredBranch}`)\n );\n const upstreamRef = resolveUpstreamRef(input.projectPath, currentBranch.output);\n const decision = decideAutoWorktreeStartPoint({\n currentBranch: currentBranch.output,\n upstreamRef,\n preferredBranch,\n preferredBranchExists,\n });\n\n if (decision.usedRemote) {\n persistSyncSuccess(project);\n } else {\n persistSyncError(project, decision.reason);\n }\n\n return decision;\n}\n\nexport async function syncProjectRepoBeforeSpawn(input: {\n projectId?: string | null;\n projectPath: string;\n}): Promise<RepoSyncDecision> {\n const project = resolveProjectRecord(input);\n const insideWorkTree = tryRunGit(input.projectPath, [\"rev-parse\", \"--is-inside-work-tree\"]);\n if (!insideWorkTree.ok) {\n const reason = \"Skipped pre-spawn sync because the project path is not a git repository.\";\n persistSyncError(project, reason);\n return { action: \"skip\", reason };\n }\n\n const origin = tryRunGit(input.projectPath, [\"remote\", \"get-url\", \"origin\"]);\n if (!origin.ok || !origin.output) {\n const reason = \"Skipped pre-spawn sync because the repository has no origin remote.\";\n persistSyncError(project, reason);\n return { action: \"skip\", reason };\n }\n\n const fetch = tryRunGit(input.projectPath, [\"fetch\", \"--prune\", \"origin\"]);\n if (!fetch.ok) {\n const reason = `Pre-spawn sync failed during fetch: ${fetch.error}`;\n persistSyncError(project, reason);\n return { action: \"skip\", reason };\n }\n\n const currentBranch = tryRunGit(input.projectPath, [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n if (!currentBranch.ok) {\n const reason = `Pre-spawn sync failed while resolving the current branch: ${currentBranch.error}`;\n persistSyncError(project, reason);\n return { action: \"skip\", reason };\n }\n\n const upstreamRef = resolveUpstreamRef(input.projectPath, currentBranch.output);\n const isDirty = Boolean(runGit(input.projectPath, [\"status\", \"--porcelain\"]));\n const localHead = tryRunGit(input.projectPath, [\"rev-parse\", \"HEAD\"]);\n const upstreamHead = upstreamRef\n ? tryRunGit(input.projectPath, [\"rev-parse\", upstreamRef])\n : null;\n const mergeBase =\n upstreamRef && localHead.ok && upstreamHead?.ok\n ? tryRunGit(input.projectPath, [\"merge-base\", \"HEAD\", upstreamRef])\n : null;\n\n const decision = decideRepoSyncAction({\n currentBranch: currentBranch.output,\n upstreamRef,\n isDirty,\n localHead: localHead.ok ? localHead.output : null,\n upstreamHead: upstreamHead?.ok ? upstreamHead.output : null,\n mergeBase: mergeBase?.ok ? mergeBase.output : null,\n });\n\n if (decision.action === \"fast-forward\") {\n const fastForward = tryRunGit(input.projectPath, [\"merge\", \"--ff-only\", upstreamRef!]);\n if (!fastForward.ok) {\n const reason = `Pre-spawn sync failed during fast-forward: ${fastForward.error}`;\n persistSyncError(project, reason);\n return { action: \"skip\", reason };\n }\n }\n\n if (decision.action === \"skip\") {\n persistSyncError(project, decision.reason);\n } else {\n persistSyncSuccess(project);\n }\n\n return decision;\n}\n", "import * as fs from \"fs\";\nimport type { Server as SocketServer } from \"socket.io\";\nimport type { AgentStatus, AgentProvider, SandboxProvider } from \"@maestro/wire\";\nimport {\n spawnPty,\n writeToPty,\n writeCommandToPty,\n killPty,\n resizePty,\n} from \"./pty-manager.js\";\nimport { getProvider } from \"./providers.js\";\nimport {\n buildTerminalSnapshotOutput,\n buildTerminalAttachResponse,\n type TerminalAttachResponse,\n} from \"./terminal-attach.js\";\nimport {\n appendRecentTerminalInputs,\n applyTerminalInputChunk,\n} from \"./terminal-input-history.js\";\nimport { createTerminalReplica, type TerminalReplica } from \"./terminal-replica.js\";\nimport {\n createTerminalWorktree,\n isGitRepo,\n removeTerminalWorktree,\n} from \"./worktree.js\";\nimport {\n ensureTerminalIsolationHome,\n removeTerminalIsolationState,\n} from \"./terminal-isolation.js\";\nimport {\n cleanupTerminalDockerRuntime,\n ensureTerminalDockerRuntime,\n} from \"./dind.js\";\nimport { assertAutoSpawnProviderReady } from \"./auto-spawn-provider.js\";\nimport {\n appendTerminalHistoryBatch,\n readTerminalHistory,\n readTerminalSnapshot,\n createTerminalRecord,\n deleteTerminalRecord,\n deleteTerminalState,\n getTerminalRecord,\n listTerminalRecords,\n updateTerminalRecord,\n writeTerminalSnapshot,\n} from \"../state/terminals.js\";\nimport { finalizeKanbanTaskAfterTerminalExit } from \"../state/kanban.js\";\nimport { getProjectRecordById } from \"../state/projects.js\";\nimport { getGitHubChildEnvVars } from \"../integrations/github.js\";\nimport {\n resolveAutoWorktreeStartPoint,\n syncProjectRepoBeforeSpawn,\n} from \"../projects/repo-sync.js\";\nimport { getSettings } from \"../state/settings.js\";\nimport type { TerminalRecord } from \"../state/types.js\";\n\nexport interface TerminalRuntime {\n ptyId: string | null;\n replica: TerminalReplica;\n outputBuffer: Array<{ seq: number; data: string } | undefined>;\n outputBufferHead: number;\n outputBufferSize: number;\n nextOutputSeq: number;\n lastStartedAt: number | null;\n intentionalStop: boolean;\n deleting: boolean;\n deleted: boolean;\n restartTimer: ReturnType<typeof setTimeout> | null;\n pendingHistory: string[];\n historyFlushTimer: ReturnType<typeof setTimeout> | null;\n historyWritePromise: Promise<void>;\n snapshotPersistTimer: ReturnType<typeof setTimeout> | null;\n snapshotWritePromise: Promise<void>;\n exitPromise: Promise<void>;\n resolveExit: (() => void) | null;\n pendingInputLine: string;\n}\n\nexport interface StartTerminalOptions {\n mcpConfigPath?: string;\n /** Override the sandbox provider for this start */\n sandboxProvider?: SandboxProvider;\n syncRepo?: boolean;\n}\n\nconst agentRuntimes = new Map<string, TerminalRuntime>();\nconst MAX_OUTPUT_LINES = 10000;\nconst RESTORE_CONCURRENCY = 2;\nconst HISTORY_FLUSH_DELAY_MS = 64;\nconst SNAPSHOT_PERSIST_DELAY_MS = 400;\n\nexport interface TerminalManagerDeps {\n io: SocketServer;\n}\n\nlet deps: TerminalManagerDeps;\n\nexport function initTerminalManager(d: TerminalManagerDeps) {\n deps = d;\n}\n\nfunction normalizeTerminalName(name?: string): string | null {\n const trimmed = name?.trim();\n if (!trimmed) {\n return null;\n }\n\n const legacyGeneratedName = /^terminal ([0-9a-f]{6})$/i.exec(trimmed);\n if (legacyGeneratedName) {\n return legacyGeneratedName[1].toLowerCase();\n }\n\n return trimmed;\n}\n\nexport function prepareShellCommand(\n command: string,\n kind: TerminalRecord[\"kind\"]\n): string {\n const trimmed = command.trim();\n if (!trimmed) {\n return trimmed;\n }\n\n if (kind === \"kanban\" || kind === \"automation\" || kind === \"scheduler\") {\n return `${trimmed}; exit $?`;\n }\n\n return trimmed;\n}\n\nexport function shouldDeleteTerminalDuringRestore(terminal: TerminalRecord): boolean {\n return Boolean(\n terminal.autoWorktree && terminal.worktreePath && !fs.existsSync(terminal.worktreePath)\n );\n}\n\nfunction createExitWaiter(): {\n promise: Promise<void>;\n resolve: () => void;\n} {\n let resolve: () => void = () => undefined;\n const promise = new Promise<void>((innerResolve) => {\n resolve = innerResolve;\n });\n return { promise, resolve };\n}\n\nfunction getRuntime(terminalId: string): TerminalRuntime {\n let rt = agentRuntimes.get(terminalId);\n if (!rt) {\n const persistedSnapshot = readTerminalSnapshot(terminalId);\n rt = {\n ptyId: null,\n replica: createTerminalReplica({\n cols: persistedSnapshot?.cols,\n rows: persistedSnapshot?.rows,\n scrollback: MAX_OUTPUT_LINES,\n snapshot: persistedSnapshot\n ? {\n data: persistedSnapshot.data,\n cols: persistedSnapshot.cols ?? 120,\n rows: persistedSnapshot.rows ?? 30,\n }\n : null,\n }),\n outputBuffer: new Array(MAX_OUTPUT_LINES),\n outputBufferHead: 0,\n outputBufferSize: 0,\n nextOutputSeq: persistedSnapshot ? persistedSnapshot.cursor + 1 : 1,\n lastStartedAt: null,\n intentionalStop: false,\n deleting: false,\n deleted: false,\n restartTimer: null,\n pendingHistory: [],\n historyFlushTimer: null,\n historyWritePromise: Promise.resolve(),\n snapshotPersistTimer: null,\n snapshotWritePromise: Promise.resolve(),\n exitPromise: Promise.resolve(),\n resolveExit: null,\n pendingInputLine: \"\",\n };\n agentRuntimes.set(terminalId, rt);\n }\n return rt;\n}\n\nfunction terminalCanUseRuntime(terminalId: string, rt: TerminalRuntime): boolean {\n return !rt.deleting && !rt.deleted && getTerminalRecord(terminalId) != null;\n}\n\nfunction resetOutputBuffer(rt: TerminalRuntime) {\n rt.outputBufferHead = 0;\n rt.outputBufferSize = 0;\n rt.outputBuffer.fill(undefined);\n}\n\nfunction appendOutputChunk(\n rt: TerminalRuntime,\n chunk: { seq: number; data: string }\n) {\n if (rt.outputBufferSize < MAX_OUTPUT_LINES) {\n const index = (rt.outputBufferHead + rt.outputBufferSize) % MAX_OUTPUT_LINES;\n rt.outputBuffer[index] = chunk;\n rt.outputBufferSize += 1;\n return;\n }\n\n rt.outputBuffer[rt.outputBufferHead] = chunk;\n rt.outputBufferHead = (rt.outputBufferHead + 1) % MAX_OUTPUT_LINES;\n}\n\nfunction getOutputBufferChunks(\n rt: TerminalRuntime\n): Array<{ seq: number; data: string }> {\n const chunks: Array<{ seq: number; data: string }> = [];\n for (let index = 0; index < rt.outputBufferSize; index += 1) {\n const chunk = rt.outputBuffer[(rt.outputBufferHead + index) % MAX_OUTPUT_LINES];\n if (chunk) {\n chunks.push(chunk);\n }\n }\n return chunks;\n}\n\nfunction clearRuntimeTimers(rt: TerminalRuntime) {\n if (rt.restartTimer) {\n clearTimeout(rt.restartTimer);\n rt.restartTimer = null;\n }\n if (rt.historyFlushTimer) {\n clearTimeout(rt.historyFlushTimer);\n rt.historyFlushTimer = null;\n }\n if (rt.snapshotPersistTimer) {\n clearTimeout(rt.snapshotPersistTimer);\n rt.snapshotPersistTimer = null;\n }\n}\n\nfunction prepareExitWaiter(rt: TerminalRuntime) {\n const waiter = createExitWaiter();\n rt.exitPromise = waiter.promise;\n rt.resolveExit = waiter.resolve;\n}\n\nfunction resolveExitWaiter(rt: TerminalRuntime) {\n const resolve = rt.resolveExit;\n rt.resolveExit = null;\n resolve?.();\n}\n\nfunction scheduleHistoryFlush(terminalId: string, rt: TerminalRuntime) {\n if (rt.historyFlushTimer || !terminalCanUseRuntime(terminalId, rt)) {\n return;\n }\n\n rt.historyFlushTimer = setTimeout(() => {\n rt.historyFlushTimer = null;\n void flushBufferedHistory(terminalId, rt);\n }, HISTORY_FLUSH_DELAY_MS);\n}\n\nasync function flushBufferedHistory(terminalId: string, rt: TerminalRuntime) {\n if (rt.pendingHistory.length === 0 || !terminalCanUseRuntime(terminalId, rt)) {\n rt.pendingHistory = [];\n return;\n }\n\n const batch = rt.pendingHistory.join(\"\");\n rt.pendingHistory = [];\n rt.historyWritePromise = rt.historyWritePromise\n .catch(() => undefined)\n .then(() => appendTerminalHistoryBatch(terminalId, batch))\n .catch((error) => {\n console.error(`Failed to append history for terminal ${terminalId}:`, error);\n });\n\n await rt.historyWritePromise;\n}\n\nfunction scheduleSnapshotPersist(terminalId: string, rt: TerminalRuntime) {\n if (rt.snapshotPersistTimer || !terminalCanUseRuntime(terminalId, rt)) {\n return;\n }\n\n rt.snapshotPersistTimer = setTimeout(() => {\n rt.snapshotPersistTimer = null;\n void persistRuntimeSnapshot(terminalId, rt);\n }, SNAPSHOT_PERSIST_DELAY_MS);\n}\n\nasync function persistRuntimeSnapshot(terminalId: string, rt: TerminalRuntime) {\n if (!terminalCanUseRuntime(terminalId, rt)) {\n return;\n }\n\n rt.snapshotWritePromise = rt.snapshotWritePromise\n .catch(() => undefined)\n .then(async () => {\n if (!terminalCanUseRuntime(terminalId, rt)) {\n return;\n }\n const snapshot = await rt.replica.snapshot();\n if (!terminalCanUseRuntime(terminalId, rt)) {\n return;\n }\n writeTerminalSnapshot(terminalId, snapshot);\n })\n .catch((error) => {\n console.error(`Failed to persist snapshot for terminal ${terminalId}:`, error);\n });\n\n await rt.snapshotWritePromise;\n}\n\nasync function flushRuntimePersistence(terminalId: string, rt: TerminalRuntime) {\n clearRuntimeTimers(rt);\n\n await flushBufferedHistory(terminalId, rt);\n await persistRuntimeSnapshot(terminalId, rt);\n}\n\nasync function waitForRuntimeWritesToSettle(rt: TerminalRuntime) {\n await Promise.all([\n rt.historyWritePromise.catch(() => undefined),\n rt.snapshotWritePromise.catch(() => undefined),\n ]);\n}\n\ntype TerminalWithProject = TerminalRecord & {\n project: { id: string; name: string } | null;\n};\n\nfunction getRecentInputs(terminal: TerminalRecord): string[] {\n const recentInputs = (terminal as { recentInputs?: unknown }).recentInputs;\n if (!Array.isArray(recentInputs)) {\n return [];\n }\n\n return recentInputs.filter((input): input is string => typeof input === \"string\").slice(-10);\n}\n\nfunction emitTerminalStatus(\n terminalId: string,\n status: AgentStatus,\n error: string | null\n) {\n const terminal = getTerminalRecord(terminalId);\n deps.io.emit(\"terminal:status\", {\n terminalId,\n status,\n error,\n recentInputs: terminal ? getRecentInputs(terminal) : [],\n });\n}\n\nfunction hydrateTerminal(terminal: TerminalRecord | null): TerminalWithProject | null {\n if (!terminal) {\n return null;\n }\n\n const project = terminal.projectId ? getProjectRecordById(terminal.projectId) : null;\n return {\n ...terminal,\n recentInputs: getRecentInputs(terminal),\n project: project ? { id: project.id, name: project.name } : null,\n };\n}\n\nexport async function createTerminal(options: {\n name?: string;\n kind?: TerminalRecord[\"kind\"];\n provider?: AgentProvider;\n projectId?: string;\n projectPath: string;\n worktreePath?: string | null;\n autoWorktree?: boolean;\n customDisplayName?: string;\n customCommandTemplate?: string;\n customEnv?: Record<string, string>;\n sandboxProvider?: SandboxProvider | null;\n secondaryProjectPaths?: string[];\n skills?: string[];\n skipPermissions?: boolean;\n disableSandbox?: boolean;\n}) {\n const agent = createTerminalRecord({\n name: normalizeTerminalName(options.name),\n kind: options.kind ?? \"terminal\",\n provider: options.provider ?? \"claude\",\n projectId: options.projectId ?? null,\n projectPath: options.projectPath,\n worktreePath: options.worktreePath ?? null,\n autoWorktree: options.autoWorktree ?? false,\n customDisplayName: options.customDisplayName ?? null,\n customCommandTemplate: options.customCommandTemplate ?? null,\n customEnv: options.customEnv ?? null,\n sandboxProvider: options.sandboxProvider ?? null,\n secondaryProjectPaths: options.secondaryProjectPaths ?? [],\n skills: options.skills ?? [],\n status: \"idle\",\n currentTask: null,\n error: null,\n recentInputs: [],\n lastActivity: null,\n skipPermissions: options.skipPermissions ?? false,\n disableSandbox: options.disableSandbox ?? false,\n kanbanTaskId: null,\n });\n\n emitTerminalStatus(agent.id, agent.status, null);\n\n return agent;\n}\n\nexport async function createAutoSpawnTerminal(options: {\n name?: string;\n kind?: TerminalRecord[\"kind\"];\n projectId?: string;\n projectPath: string;\n}) {\n const settings = getSettings();\n const provider = assertAutoSpawnProviderReady();\n return createTerminal({\n name: options.name,\n kind: options.kind ?? \"kanban\",\n provider,\n projectId: options.projectId,\n projectPath: options.projectPath,\n skipPermissions: settings.agentDefaultSkipPermissions,\n disableSandbox: settings.agentDefaultDisableSandbox,\n autoWorktree: settings.agentDefaultWorktreeMode === \"new\",\n });\n}\n\nexport async function startTerminal(\n terminalId: string,\n prompt: string,\n options?: StartTerminalOptions\n) {\n const agent = getTerminalRecord(terminalId);\n if (!agent) throw new Error(`Agent ${terminalId} not found`);\n const rt = getRuntime(terminalId);\n if (rt.ptyId) {\n throw new Error(`Agent ${terminalId} is already running`);\n }\n\n let cwd = agent.worktreePath || agent.projectPath;\n if (agent.autoWorktree && !agent.worktreePath) {\n if (!isGitRepo(agent.projectPath)) {\n throw new Error(\"Auto-worktree requires the project to be a git repository\");\n }\n\n const project = agent.projectId ? getProjectRecordById(agent.projectId) : null;\n const startPoint =\n options?.syncRepo === false\n ? \"HEAD\"\n : (\n await resolveAutoWorktreeStartPoint({\n projectId: agent.projectId,\n projectPath: agent.projectPath,\n preferredBranch: project?.defaultBranch ?? null,\n })\n ).ref;\n const worktreePath = createTerminalWorktree(agent.projectPath, terminalId, startPoint);\n updateTerminalRecord(terminalId, {\n worktreePath,\n lastActivity: new Date().toISOString(),\n });\n cwd = worktreePath;\n } else if (options?.syncRepo !== false) {\n await syncProjectRepoBeforeSpawn({\n projectId: agent.projectId,\n projectPath: cwd,\n });\n }\n\n if (!fs.existsSync(cwd)) {\n throw new Error(`Agent working directory does not exist: ${cwd}`);\n }\n\n const provider = getProvider(agent.provider as AgentProvider, {\n displayName: agent.customDisplayName,\n commandTemplate: agent.customCommandTemplate,\n env: agent.customEnv,\n });\n const binaryPath = provider.resolveBinaryPath();\n const envVars = provider.getPtyEnvVars(agent.id, cwd, agent.skills);\n const githubEnvVars = getGitHubChildEnvVars();\n const childEnv = {\n ...envVars,\n ...githubEnvVars,\n };\n\n const settings = getSettings();\n const sandboxProvider =\n agent.disableSandbox\n ? \"none\"\n : (options?.sandboxProvider ?? agent.sandboxProvider ?? settings.sandboxProvider);\n const sandboxEnabled = sandboxProvider !== \"none\";\n const isolatedHome =\n sandboxProvider === \"docker\" ? ensureTerminalIsolationHome(terminalId) : null;\n const dockerRuntime =\n sandboxProvider === \"docker\" ? ensureTerminalDockerRuntime(terminalId) : null;\n const runtimeEnv = dockerRuntime\n ? {\n DOCKER_HOST: dockerRuntime.dockerHost,\n DOCKER_BUILDKIT: \"1\",\n COMPOSE_DOCKER_CLI_BUILD: \"1\",\n COMPOSE_PROJECT_NAME: dockerRuntime.composeProjectName,\n }\n : {};\n Object.assign(childEnv, runtimeEnv);\n\n const command = provider.buildInteractiveCommand({\n binaryPath,\n prompt,\n projectPath: cwd,\n skipPermissions: agent.skipPermissions,\n sandbox: sandboxEnabled,\n mcpConfigPath: options?.mcpConfigPath,\n secondaryProjectPaths: agent.secondaryProjectPaths,\n skills: agent.skills,\n });\n\n clearRuntimeTimers(rt);\n const persistedSnapshot = readTerminalSnapshot(terminalId);\n if (persistedSnapshot && rt.nextOutputSeq <= persistedSnapshot.cursor) {\n rt.nextOutputSeq = persistedSnapshot.cursor + 1;\n }\n rt.deleting = false;\n rt.deleted = false;\n rt.intentionalStop = false;\n rt.lastStartedAt = Date.now();\n rt.pendingInputLine = \"\";\n resetOutputBuffer(rt);\n prepareExitWaiter(rt);\n\n const ptyInstance = spawnPty({\n terminalId,\n cwd,\n env: childEnv,\n homeDir: isolatedHome?.homeDir,\n sandboxProvider,\n readonlyMounts: agent.secondaryProjectPaths,\n dockerExtraMounts: dockerRuntime ? [dockerRuntime.socketMount] : undefined,\n onData: (data) => {\n if (!terminalCanUseRuntime(terminalId, rt)) {\n return;\n }\n\n const seq = rt.nextOutputSeq++;\n appendOutputChunk(rt, { seq, data });\n\n deps.io.to(`terminal:${terminalId}`).emit(\"terminal:output\", {\n terminalId,\n data,\n seq,\n });\n\n void rt.replica.write(data, seq);\n scheduleSnapshotPersist(terminalId, rt);\n rt.pendingHistory.push(data);\n scheduleHistoryFlush(terminalId, rt);\n },\n onExit: async (exitCode) => {\n const newStatus: AgentStatus = exitCode === 0 ? \"completed\" : \"error\";\n rt.ptyId = null;\n const agent = getTerminalRecord(terminalId);\n const ranForMs = rt.lastStartedAt ? Date.now() - rt.lastStartedAt : null;\n const intentionalStop = rt.intentionalStop;\n rt.lastStartedAt = null;\n\n try {\n if (rt.deleting || rt.deleted) {\n return;\n }\n\n await flushRuntimePersistence(terminalId, rt);\n\n if (!agent) {\n return;\n }\n\n if (intentionalStop) {\n updateTerminalRecord(terminalId, {\n status: \"idle\",\n currentTask: null,\n error: null,\n lastActivity: new Date().toISOString(),\n });\n\n emitTerminalStatus(terminalId, \"idle\" as AgentStatus, null);\n } else {\n updateTerminalRecord(terminalId, {\n status: newStatus,\n currentTask: null,\n error: exitCode !== 0 ? `Exited with code ${exitCode}` : null,\n lastActivity: new Date().toISOString(),\n });\n\n emitTerminalStatus(\n terminalId,\n newStatus,\n exitCode !== 0 ? `Exited with code ${exitCode}` : null\n );\n }\n\n const shouldAutoRestart =\n !isShuttingDown &&\n agent.kind !== \"kanban\" &&\n agent.kind !== \"automation\" &&\n agent.kind !== \"scheduler\" &&\n !intentionalStop &&\n (exitCode === 0 || ranForMs === null || ranForMs >= 5_000);\n\n rt.intentionalStop = false;\n\n if (agent.kanbanTaskId) {\n try {\n const taskResult = await finalizeKanbanTaskAfterTerminalExit(\n terminalId,\n agent.kanbanTaskId,\n exitCode === 0\n );\n\n updateTerminalRecord(terminalId, {\n status: exitCode === 0 ? \"idle\" : newStatus,\n currentTask: null,\n error: exitCode === 0 ? null : `Exited with code ${exitCode}`,\n kanbanTaskId: null,\n lastActivity: new Date().toISOString(),\n });\n\n emitTerminalStatus(\n terminalId,\n exitCode === 0 ? \"idle\" : newStatus,\n exitCode === 0 ? null : `Exited with code ${exitCode}`\n );\n deps.io.emit(\"kanban:updated\", {\n taskId: taskResult.taskId,\n column: taskResult.column,\n assignedTerminalId: terminalId,\n });\n } catch (error) {\n console.error(`Failed to finalize kanban task for terminal ${terminalId}:`, error);\n updateTerminalRecord(terminalId, {\n kanbanTaskId: null,\n lastActivity: new Date().toISOString(),\n });\n }\n }\n\n if (shouldAutoRestart && getTerminalRecord(terminalId)) {\n updateTerminalRecord(terminalId, {\n status: \"idle\",\n currentTask: null,\n error: null,\n lastActivity: new Date().toISOString(),\n });\n emitTerminalStatus(terminalId, \"idle\" as AgentStatus, null);\n\n rt.restartTimer = setTimeout(() => {\n rt.restartTimer = null;\n void startTerminal(terminalId, \"\", { syncRepo: false }).catch((error) => {\n console.error(`Failed to auto-restart terminal ${terminalId}:`, error);\n if (!getTerminalRecord(terminalId)) {\n return;\n }\n updateTerminalRecord(terminalId, {\n status: \"error\",\n error:\n error instanceof Error ? error.message : \"Failed to auto-restart terminal\",\n lastActivity: new Date().toISOString(),\n });\n emitTerminalStatus(\n terminalId,\n \"error\" as AgentStatus,\n error instanceof Error ? error.message : \"Failed to auto-restart terminal\"\n );\n });\n }, 250);\n }\n } finally {\n resolveExitWaiter(rt);\n }\n },\n });\n\n rt.ptyId = ptyInstance.id;\n\n updateTerminalRecord(terminalId, {\n status: \"running\",\n currentTask: prompt.trim() ? prompt.slice(0, 200) : null,\n error: null,\n lastActivity: new Date().toISOString(),\n });\n\n emitTerminalStatus(terminalId, \"running\" as AgentStatus, null);\n\n const shellCommand = prepareShellCommand(command, agent.kind);\n if (shellCommand) {\n writeCommandToPty(ptyInstance.id, shellCommand);\n }\n return { ptyId: ptyInstance.id };\n}\n\nexport async function stopTerminal(terminalId: string) {\n const agent = getTerminalRecord(terminalId);\n const rt = agentRuntimes.get(terminalId);\n if (!agent && !rt) {\n return;\n }\n\n if (rt?.ptyId) {\n rt.intentionalStop = true;\n const exitPromise = rt.exitPromise;\n killPty(rt.ptyId);\n rt.ptyId = null;\n await exitPromise;\n return;\n }\n\n if (rt && agent) {\n await flushRuntimePersistence(terminalId, rt);\n }\n\n if (!agent) {\n return;\n }\n\n updateTerminalRecord(terminalId, {\n status: \"idle\",\n currentTask: null,\n error: null,\n lastActivity: new Date().toISOString(),\n });\n\n emitTerminalStatus(terminalId, \"idle\" as AgentStatus, null);\n}\n\nexport async function deleteTerminal(terminalId: string) {\n const agent = getTerminalRecord(terminalId);\n const rt = agentRuntimes.get(terminalId);\n if (!agent && !rt) {\n return;\n }\n\n if (agent?.kanbanTaskId) {\n updateTerminalRecord(terminalId, {\n kanbanTaskId: null,\n currentTask: null,\n lastActivity: new Date().toISOString(),\n });\n }\n if (rt) {\n clearRuntimeTimers(rt);\n rt.intentionalStop = true;\n rt.deleting = true;\n rt.pendingHistory = [];\n }\n if (rt?.ptyId) {\n const exitPromise = rt.exitPromise;\n killPty(rt.ptyId);\n rt.ptyId = null;\n await exitPromise;\n }\n if (rt) {\n await waitForRuntimeWritesToSettle(rt);\n rt.deleted = true;\n rt.replica.dispose();\n }\n agentRuntimes.delete(terminalId);\n\n // Clean up auto-created worktree\n if (agent?.autoWorktree && agent.worktreePath) {\n try {\n removeTerminalWorktree(agent.projectPath, terminalId);\n } catch (err) {\n console.warn(`Failed to remove worktree for terminal ${terminalId}:`, err);\n }\n }\n\n try {\n cleanupTerminalDockerRuntime(terminalId);\n } catch (err) {\n console.warn(`Failed to clean up Docker runtime for terminal ${terminalId}:`, err);\n }\n\n try {\n removeTerminalIsolationState(terminalId);\n } catch (err) {\n console.warn(`Failed to remove isolated home for terminal ${terminalId}:`, err);\n }\n\n deleteTerminalRecord(terminalId);\n deleteTerminalState(terminalId);\n\n emitTerminalStatus(terminalId, \"idle\" as AgentStatus, null);\n}\n\nexport function sendTerminalInput(terminalId: string, data: string): boolean {\n if (!getTerminalRecord(terminalId)) return false;\n const rt = agentRuntimes.get(terminalId);\n if (!rt?.ptyId) return false;\n\n const { currentLine, committedInputs } = applyTerminalInputChunk(\n rt.pendingInputLine,\n data\n );\n const ok = writeToPty(rt.ptyId, data);\n if (!ok) {\n return false;\n }\n\n rt.pendingInputLine = currentLine;\n if (committedInputs.length > 0) {\n const terminal = getTerminalRecord(terminalId);\n if (terminal) {\n const nextRecentInputs = appendRecentTerminalInputs(\n getRecentInputs(terminal),\n committedInputs\n );\n updateTerminalRecord(terminalId, {\n recentInputs: nextRecentInputs,\n lastActivity: new Date().toISOString(),\n });\n emitTerminalStatus(terminalId, terminal.status, terminal.error);\n }\n }\n\n return true;\n}\n\nexport function hasTerminal(terminalId: string): boolean {\n return getTerminalRecord(terminalId) != null;\n}\n\nexport function resizeTerminal(\n terminalId: string,\n cols: number,\n rows: number\n): boolean {\n if (!getTerminalRecord(terminalId)) {\n return false;\n }\n\n const rt = getRuntime(terminalId);\n if (rt.deleting || rt.deleted) {\n return false;\n }\n void rt.replica.resize(cols, rows, rt.nextOutputSeq - 1);\n scheduleSnapshotPersist(terminalId, rt);\n if (!rt.ptyId) return false;\n return resizePty(rt.ptyId, cols, rows);\n}\n\nexport async function restorePersistentTerminals() {\n const terminals = listTerminalRecords().filter(\n (agent) =>\n agent.kind !== \"kanban\" &&\n agent.kind !== \"automation\" &&\n agent.kind !== \"scheduler\"\n );\n\n let nextIndex = 0;\n const workerCount = Math.min(RESTORE_CONCURRENCY, terminals.length);\n\n const restoreNext = async () => {\n while (nextIndex < terminals.length) {\n const terminal = terminals[nextIndex++];\n\n try {\n if (shouldDeleteTerminalDuringRestore(terminal)) {\n console.warn(\n `Deleting terminal ${terminal.id} during restore because its auto-worktree path is missing: ${terminal.worktreePath}`\n );\n await deleteTerminal(terminal.id);\n continue;\n }\n\n await startTerminal(terminal.id, \"\", { syncRepo: false });\n } catch (error) {\n console.error(`Failed to restore terminal ${terminal.id}:`, error);\n updateTerminalRecord(terminal.id, {\n status: \"error\",\n error:\n error instanceof Error ? error.message : \"Failed to restore terminal session\",\n lastActivity: new Date().toISOString(),\n });\n emitTerminalStatus(\n terminal.id,\n \"error\" as AgentStatus,\n error instanceof Error ? error.message : \"Failed to restore terminal session\"\n );\n }\n }\n };\n\n await Promise.all(Array.from({ length: workerCount }, () => restoreNext()));\n}\n\nexport async function getTerminalOutput(terminalId: string): Promise<string[]> {\n return (await getTerminalOutputSnapshot(terminalId)).output;\n}\n\nexport async function getTerminalOutputSnapshot(\n terminalId: string\n): Promise<{ output: string[]; cursor: number }> {\n if (!getTerminalRecord(terminalId)) {\n throw new Error(\"Terminal not found\");\n }\n\n const rt = getRuntime(terminalId);\n const persistedSnapshot = await rt.replica.snapshot();\n const history = readTerminalHistory(terminalId);\n\n return buildTerminalSnapshotOutput({\n outputBuffer: getOutputBufferChunks(rt),\n persistedSnapshot,\n history,\n });\n}\n\nexport function getBufferedTerminalOutputSince(\n terminalId: string,\n sinceSeq: number\n): Array<{ seq: number; data: string }> {\n if (!getTerminalRecord(terminalId)) {\n return [];\n }\n\n const rt = getRuntime(terminalId);\n return getOutputBufferChunks(rt).filter((chunk) => chunk.seq >= sinceSeq);\n}\n\nexport async function getTerminalAttachment(\n terminalId: string,\n cursor?: number\n): Promise<TerminalAttachResponse> {\n if (!getTerminalRecord(terminalId)) {\n throw new Error(\"Terminal not found\");\n }\n\n const rt = getRuntime(terminalId);\n const snapshot = await getTerminalOutputSnapshot(terminalId);\n\n return buildTerminalAttachResponse({\n terminalId,\n requestedCursor: cursor,\n outputBuffer: getOutputBufferChunks(rt),\n snapshotOutput: snapshot.output,\n snapshotCursor: snapshot.cursor,\n });\n}\n\nlet isShuttingDown = false;\n\nexport async function shutdownTerminalManager() {\n isShuttingDown = true;\n\n const activeExitPromises: Promise<void>[] = [];\n const idleFlushes: Promise<void>[] = [];\n\n for (const [terminalId, rt] of agentRuntimes) {\n clearRuntimeTimers(rt);\n if (rt.deleting || rt.deleted) {\n continue;\n }\n\n if (rt.ptyId) {\n rt.intentionalStop = true;\n const exitPromise = rt.exitPromise;\n killPty(rt.ptyId);\n rt.ptyId = null;\n activeExitPromises.push(exitPromise);\n continue;\n }\n\n if (getTerminalRecord(terminalId)) {\n idleFlushes.push(flushRuntimePersistence(terminalId, rt));\n }\n }\n\n await Promise.all(activeExitPromises);\n await Promise.all(idleFlushes);\n}\n\nexport async function listTerminals() {\n return listTerminalRecords().map((terminal) => hydrateTerminal(terminal));\n}\n\nexport async function getTerminal(terminalId: string) {\n return hydrateTerminal(getTerminalRecord(terminalId));\n}\n", "import Fastify from \"fastify\";\nimport cors from \"@fastify/cors\";\nimport { Server as SocketServer } from \"socket.io\";\nimport {\n initTerminalManager,\n restorePersistentTerminals,\n shutdownTerminalManager,\n} from \"./agents/terminal-manager.js\";\nimport { registerTerminalRoutes } from \"./routes/terminal-routes.js\";\nimport { registerProjectRoutes } from \"./routes/project-routes.js\";\nimport { registerKanbanRoutes } from \"./routes/kanban-routes.js\";\nimport { registerSocketHandlers } from \"./socket/handlers.js\";\nimport { startKanbanAssigner, stopKanbanAssigner } from \"./agents/kanban-assigner.js\";\nimport { registerSchedulerRoutes } from \"./routes/scheduler-routes.js\";\nimport { registerAutomationRoutes } from \"./routes/automation-routes.js\";\nimport { startScheduler, stopScheduler } from \"./scheduler/scheduler.js\";\nimport { startAutomationRunner, stopAutomationRunner } from \"./scheduler/automation-runner.js\";\nimport { initAuth, registerAuthHook, registerAuthRoutes, verifySessionToken } from \"./auth/auth.js\";\nimport { registerSystemRoutes } from \"./routes/system-routes.js\";\nimport { registerCliAuthRoutes } from \"./routes/cli-auth-routes.js\";\nimport { registerGitHubIntegrationRoutes } from \"./routes/github-integration-routes.js\";\nimport { registerWebhookRoutes } from \"./routes/webhook-routes.js\";\nimport { registerSettingsRoutes } from \"./routes/settings-routes.js\";\nimport { registerDeploymentRoutes } from \"./routes/deployment-routes.js\";\nimport { getRuntimeStatus } from \"./runtime/runtime-status.js\";\nimport { startAutoUpdater, stopAutoUpdater } from \"./services/auto-updater.js\";\nimport { startAuthStatusChecker, stopAuthStatusChecker } from \"./services/auth-status-checker.js\";\nimport { registerSetupRoutes } from \"./routes/setup-routes.js\";\nimport { registerOllamaRoutes } from \"./routes/ollama-routes.js\";\nimport { registerWhatsAppRoutes, startWhatsApp, stopWhatsApp, startWhatsAppQueue, stopWhatsAppQueue } from \"@maestro/pi\";\nimport { registerTelegramRoutes, startTelegram, stopTelegram, startTelegramQueue, stopTelegramQueue } from \"@maestro/pi\";\nimport { getSettings as getSettingsState } from \"./state/settings.js\";\nimport { writePiModelsConfig } from \"./services/ollama.js\";\n\nconst PORT = parseInt(process.env.PORT || \"4800\", 10);\nconst HOST = process.env.HOST || \"0.0.0.0\";\n\nasync function main() {\n console.log(\"Starting Maestro server...\");\n\n // 2. Initialize auth\n const { apiToken } = initAuth();\n console.log(`API token: ${apiToken}`);\n\n // 3. Create Fastify app\n const app = Fastify({ logger: false });\n app.removeContentTypeParser(\"application/json\");\n app.addContentTypeParser(\"application/json\", { parseAs: \"buffer\" }, (req, body, done) => {\n const rawBody = Buffer.isBuffer(body) ? body : Buffer.from(body);\n req.rawBody = rawBody;\n\n try {\n const text = rawBody.length > 0 ? rawBody.toString(\"utf8\") : \"\";\n done(null, text ? JSON.parse(text) : {});\n } catch (error) {\n done(error as Error, undefined);\n }\n });\n await app.register(cors, { origin: true });\n\n // 4. Register auth hook and routes\n registerAuthHook(app);\n await registerAuthRoutes(app);\n\n // 5. Create Socket.io server attached to Fastify's underlying HTTP server\n const io = new SocketServer(app.server, {\n cors: { origin: \"*\" },\n transports: [\"websocket\", \"polling\"],\n });\n\n // Socket.io auth middleware\n io.use((socket, next) => {\n if (process.env.AUTH_DISABLED === \"1\") return next();\n const token = socket.handshake.auth?.token as string | undefined;\n if (!token) return next(new Error(\"Missing auth token\"));\n if (token === apiToken) return next();\n const payload = verifySessionToken(token);\n if (payload) return next();\n return next(new Error(\"Invalid auth token\"));\n });\n\n // 6. Initialize terminal manager with dependencies\n initTerminalManager({ io });\n\n // 7. Register routes\n await registerProjectRoutes(app);\n await registerTerminalRoutes(app);\n await registerKanbanRoutes(app, io);\n\n await registerSchedulerRoutes(app);\n await registerAutomationRoutes(app);\n await registerSystemRoutes(app);\n await registerCliAuthRoutes(app);\n await registerGitHubIntegrationRoutes(app);\n await registerWebhookRoutes(app, io);\n await registerSettingsRoutes(app);\n await registerDeploymentRoutes(app);\n await registerSetupRoutes(app);\n await registerWhatsAppRoutes(app, io);\n await registerTelegramRoutes(app, io, () => getSettingsState().telegramBotToken);\n await registerOllamaRoutes(app);\n\n // 8. Register socket handlers\n registerSocketHandlers(io);\n\n // 9. Start background services\n startKanbanAssigner(io);\n await startScheduler();\n startAutomationRunner();\n startAutoUpdater();\n startAuthStatusChecker();\n\n // Ensure Pi models.json is written if a model is configured\n const savedPiModel = getSettingsState().piOllamaModel;\n if (savedPiModel) {\n writePiModelsConfig(savedPiModel);\n console.log(`[startup] Pi models.json written for model: ${savedPiModel}`);\n }\n\n // Start WhatsApp if enabled\n if (process.env.WHATSAPP_ENABLED === \"1\") {\n await startWhatsApp(io);\n startWhatsAppQueue();\n console.log(\"[startup] WhatsApp integration enabled\");\n }\n\n // Start Telegram if enabled (via env var or saved token in settings)\n const savedTelegramToken = getSettingsState().telegramBotToken;\n if (process.env.TELEGRAM_ENABLED === \"1\" || savedTelegramToken) {\n await startTelegram(io, savedTelegramToken || undefined);\n startTelegramQueue();\n console.log(\"[startup] Telegram integration enabled\");\n }\n\n // 10. Health check\n app.get(\"/health\", async () => ({ status: \"ok\", timestamp: new Date().toISOString() }));\n\n const runtimeStatus = getRuntimeStatus();\n if (runtimeStatus.github.needsAuthWarning) {\n console.warn(\n \"[startup] GitHub-backed features are configured, but GITHUB_TOKEN/GH_TOKEN is missing.\"\n );\n }\n\n // 11. Start server\n await app.listen({ port: PORT, host: HOST });\n console.log(`Maestro server listening on http://${HOST}:${PORT}`);\n void restorePersistentTerminals().catch((error) => {\n console.error(\"Failed to restore persistent terminals:\", error);\n });\n\n // Graceful shutdown\n const shutdown = async (signal: string) => {\n console.log(`\\nReceived ${signal}, shutting down...`);\n stopKanbanAssigner();\n stopScheduler();\n stopAutomationRunner();\n stopAutoUpdater();\n stopAuthStatusChecker();\n stopWhatsAppQueue();\n await stopWhatsApp();\n stopTelegramQueue();\n await stopTelegram();\n await shutdownTerminalManager();\n io.close();\n await app.close();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", () => shutdown(\"SIGINT\"));\n process.on(\"SIGTERM\", () => shutdown(\"SIGTERM\"));\n}\n\nmain().catch((err) => {\n console.error(\"Failed to start Maestro:\", err);\n process.exit(1);\n});\n", "import * as fs from \"fs\";\nimport type { FastifyInstance } from \"fastify\";\nimport {\n AgentSpawnOptions,\n AgentStartInput,\n AgentSendInput,\n} from \"@maestro/wire\";\nimport {\n createTerminal,\n deleteTerminal,\n getTerminal,\n getTerminalOutputSnapshot,\n listTerminals,\n sendTerminalInput,\n startTerminal,\n stopTerminal,\n} from \"../agents/terminal-manager.js\";\nimport { getProjectRecordById } from \"../state/projects.js\";\nimport { updateTerminalRecord } from \"../state/terminals.js\";\nimport { isGitRepo } from \"../agents/worktree.js\";\n\nexport async function registerTerminalRoutes(app: FastifyInstance) {\n // List all terminals\n app.get(\"/api/terminals\", async () => {\n const terminals = await listTerminals();\n return { terminals };\n });\n\n // Get single terminal\n app.get<{ Params: { id: string } }>(\"/api/terminals/:id\", async (req, reply) => {\n const terminal = await getTerminal(req.params.id);\n if (!terminal) return reply.status(404).send({ error: \"Terminal not found\" });\n return { terminal };\n });\n\n // Get terminal output buffer\n app.get<{ Params: { id: string } }>(\n \"/api/terminals/:id/output\",\n async (req, reply) => {\n const terminal = await getTerminal(req.params.id);\n if (!terminal) return reply.status(404).send({ error: \"Terminal not found\" });\n return await getTerminalOutputSnapshot(req.params.id);\n }\n );\n\n // Create terminal\n app.post(\"/api/terminals\", async (req, reply) => {\n try {\n const options = AgentSpawnOptions.parse(req.body);\n let projectPath = options.projectPath;\n\n if (options.projectId) {\n const project = getProjectRecordById(options.projectId);\n if (!project) {\n return reply.status(404).send({ error: \"Project not found\" });\n }\n projectPath = project.localPath;\n }\n\n if (!projectPath) {\n return reply.status(400).send({ error: \"projectPath is required\" });\n }\n\n const wantsWorktree = options.useWorktree ?? options.worktree ?? false;\n const wantsAutoWorktree = options.autoWorktree ?? false;\n let worktreePath = options.worktreePath?.trim() || null;\n\n if (wantsWorktree && !worktreePath) {\n return reply.status(400).send({\n error: \"worktreePath is required when useWorktree is enabled\",\n });\n }\n\n if (worktreePath && !fs.existsSync(worktreePath)) {\n return reply.status(400).send({ error: \"worktreePath does not exist\" });\n }\n\n // Validate auto-worktree precondition (git repo check)\n if (wantsAutoWorktree && !worktreePath) {\n if (!isGitRepo(projectPath)) {\n return reply.status(400).send({\n error: \"Auto-worktree requires the project to be a git repository\",\n });\n }\n }\n\n const createdAgent = await createTerminal({\n name: options.name,\n kind: \"terminal\",\n provider: options.provider,\n projectId: options.projectId,\n projectPath,\n worktreePath,\n autoWorktree: wantsAutoWorktree,\n customDisplayName: options.customDisplayName,\n customCommandTemplate: options.customCommandTemplate,\n customEnv: options.customEnv,\n sandboxProvider: options.sandboxProvider ?? null,\n secondaryProjectPaths: options.secondaryProjectPaths,\n skills: options.skills,\n skipPermissions: options.skipPermissions,\n disableSandbox: options.disableSandbox,\n });\n\n try {\n await startTerminal(createdAgent.id, options.prompt ?? \"\");\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Failed to start terminal session\";\n updateTerminalRecord(createdAgent.id, {\n status: \"error\",\n error: message,\n lastActivity: new Date().toISOString(),\n });\n }\n\n const terminal = await getTerminal(createdAgent.id);\n return reply.status(201).send({ terminal: terminal ?? createdAgent });\n } catch (err) {\n return reply\n .status(400)\n .send({ error: err instanceof Error ? err.message : \"Invalid input\" });\n }\n });\n\n // Start terminal with prompt\n app.post<{ Params: { id: string } }>(\n \"/api/terminals/:id/start\",\n async (req, reply) => {\n try {\n const input = AgentStartInput.parse(req.body);\n const result = await startTerminal(\n req.params.id,\n input.prompt\n );\n return { ok: true, ...result };\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to start terminal\",\n });\n }\n }\n );\n\n // Stop terminal\n app.post<{ Params: { id: string } }>(\n \"/api/terminals/:id/stop\",\n async (req, reply) => {\n try {\n await stopTerminal(req.params.id);\n return { ok: true };\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to stop terminal\",\n });\n }\n }\n );\n\n // Send input to terminal\n app.post<{ Params: { id: string } }>(\n \"/api/terminals/:id/input\",\n async (req, reply) => {\n try {\n const input = AgentSendInput.parse(req.body);\n const ok = sendTerminalInput(req.params.id, input.text);\n if (!ok) return reply.status(400).send({ error: \"Terminal has no active PTY\" });\n return { ok: true };\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to send input\",\n });\n }\n }\n );\n\n // Delete terminal\n app.delete<{ Params: { id: string } }>(\n \"/api/terminals/:id\",\n async (req, reply) => {\n try {\n await deleteTerminal(req.params.id);\n return { ok: true };\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to delete terminal\",\n });\n }\n }\n );\n}\n", "import { z } from \"zod\";\nimport { SandboxProviderSchema } from \"./settings\";\n\nexport const AgentProvider = z.enum([\"none\", \"claude\", \"codex\", \"custom\"]);\nexport type AgentProvider = z.infer<typeof AgentProvider>;\n\nexport const AgentStatus = z.enum([\n \"idle\",\n \"running\",\n \"waiting\",\n \"completed\",\n \"error\",\n]);\nexport type AgentStatus = z.infer<typeof AgentStatus>;\n\nexport const AgentSpawnOptions = z\n .object({\n name: z.string().optional(),\n provider: AgentProvider.default(\"claude\"),\n projectId: z.string().optional(),\n projectPath: z.string().optional(),\n customDisplayName: z.string().optional(),\n customCommandTemplate: z.string().optional(),\n customEnv: z.record(z.string()).optional(),\n secondaryProjectPaths: z.array(z.string()).optional(),\n skills: z.array(z.string()).optional(),\n skipPermissions: z.boolean().default(false),\n disableSandbox: z.boolean().default(false),\n sandboxProvider: SandboxProviderSchema.optional(),\n useWorktree: z.boolean().optional(),\n worktree: z.boolean().optional(),\n worktreePath: z.string().optional(),\n autoWorktree: z.boolean().optional(),\n prompt: z.string().optional(),\n })\n .refine((data) => Boolean(data.projectId || data.projectPath), {\n message: \"projectId or projectPath is required\",\n path: [\"projectPath\"],\n })\n .refine(\n (data) =>\n data.provider !== \"custom\" ||\n Boolean(data.customCommandTemplate?.trim()),\n {\n message: \"customCommandTemplate is required for custom providers\",\n path: [\"customCommandTemplate\"],\n }\n );\nexport type AgentSpawnOptions = z.infer<typeof AgentSpawnOptions>;\n\nexport const AgentInfo = z.object({\n id: z.string(),\n name: z.string().nullable(),\n provider: AgentProvider,\n projectId: z.string().nullable().optional(),\n projectName: z.string().nullable().optional(),\n projectPath: z.string(),\n customDisplayName: z.string().nullable().optional(),\n customCommandTemplate: z.string().nullable().optional(),\n customEnv: z.record(z.string()).nullable().optional(),\n sandboxProvider: SandboxProviderSchema.nullable().optional(),\n status: AgentStatus,\n currentTask: z.string().nullable(),\n error: z.string().nullable(),\n recentInputs: z.array(z.string()).default([]),\n lastActivity: z.string().nullable(),\n skills: z.array(z.string()),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\nexport type AgentInfo = z.infer<typeof AgentInfo>;\n\nexport const AgentStartInput = z.object({\n prompt: z.string().optional().default(\"\"),\n});\nexport type AgentStartInput = z.infer<typeof AgentStartInput>;\n\nexport const AgentSendInput = z.object({\n text: z.string(),\n});\nexport type AgentSendInput = z.infer<typeof AgentSendInput>;\n", "import { z } from \"zod\";\n\nexport const AutoSpawnAgentProviderSchema = z.enum([\"claude\", \"codex\"]);\nexport type AutoSpawnAgentProvider = z.infer<typeof AutoSpawnAgentProviderSchema>;\n\nexport const AutoSpawnAgentWorktreeModeSchema = z.enum([\"none\", \"new\"]);\nexport type AutoSpawnAgentWorktreeMode = z.infer<typeof AutoSpawnAgentWorktreeModeSchema>;\n\nexport const SandboxProviderSchema = z.enum([\"none\", \"nsjail\", \"docker\"]);\nexport type SandboxProvider = z.infer<typeof SandboxProviderSchema>;\n\nexport const SettingsSchema = z.object({\n autoUpdateEnabled: z.boolean().default(false),\n autoUpdateIntervalHours: z.number().min(1).max(168).default(24),\n piOllamaModel: z.string().default(\"\"),\n telegramBotToken: z.string().default(\"\"),\n /** Legacy boolean retained for backwards compatibility with older clients */\n sandboxEnabled: z.boolean().default(false),\n /** Sandbox runtime used when a terminal/agent enables sandboxing */\n sandboxProvider: SandboxProviderSchema.default(\"none\"),\n /** Deepgram API key for voice-to-text on mobile */\n deepgramApiKey: z.string().default(\"\"),\n /** Default coding agent provider used for automatic spawns */\n agentDefaultProvider: AutoSpawnAgentProviderSchema.default(\"claude\"),\n /** Disable sandbox for automatically spawned agents */\n agentDefaultDisableSandbox: z.boolean().default(false),\n /** Run automatically spawned agents without approval prompts */\n agentDefaultSkipPermissions: z.boolean().default(true),\n /** Worktree mode for automatically spawned agents */\n agentDefaultWorktreeMode: AutoSpawnAgentWorktreeModeSchema.default(\"none\"),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n\nexport const SettingsUpdateSchema = SettingsSchema.partial();\nexport type SettingsUpdate = z.infer<typeof SettingsUpdateSchema>;\n\n// Ollama types for Pi agent configuration\nexport const OllamaModelInfo = z.object({\n name: z.string(),\n size: z.number(),\n digest: z.string(),\n modifiedAt: z.string(),\n});\nexport type OllamaModelInfo = z.infer<typeof OllamaModelInfo>;\n\nexport const OllamaPullProgress = z.object({\n status: z.string(),\n digest: z.string().optional(),\n total: z.number().optional(),\n completed: z.number().optional(),\n});\nexport type OllamaPullProgress = z.infer<typeof OllamaPullProgress>;\n\nexport const UpdateStatus = z.object({\n lastCheckAt: z.string().nullable(),\n lastUpdateAt: z.string().nullable(),\n claudeCode: z.object({\n currentVersion: z.string().nullable(),\n latestVersion: z.string().nullable(),\n updateAvailable: z.boolean(),\n }),\n codex: z.object({\n currentVersion: z.string().nullable(),\n latestVersion: z.string().nullable(),\n updateAvailable: z.boolean(),\n }),\n gh: z.object({\n currentVersion: z.string().nullable(),\n latestVersion: z.string().nullable(),\n updateAvailable: z.boolean(),\n }),\n updating: z.boolean(),\n lastError: z.string().nullable(),\n});\n\nexport type UpdateStatus = z.infer<typeof UpdateStatus>;\n\nexport const DeploymentReleaseInfo = z.object({\n tag: z.string(),\n name: z.string().nullable(),\n url: z.string().nullable(),\n publishedAt: z.string().nullable(),\n notes: z.string().nullable(),\n});\nexport type DeploymentReleaseInfo = z.infer<typeof DeploymentReleaseInfo>;\n\nexport const DeploymentUpdateStatus = z.object({\n configured: z.boolean(),\n currentVersion: z.string().nullable(),\n latestVersion: z.string().nullable(),\n updateAvailable: z.boolean(),\n updating: z.boolean(),\n lastCheckedAt: z.string().nullable(),\n lastUpdatedAt: z.string().nullable(),\n lastError: z.string().nullable(),\n latestRelease: DeploymentReleaseInfo.nullable(),\n});\nexport type DeploymentUpdateStatus = z.infer<typeof DeploymentUpdateStatus>;\n\nexport const DeploymentRedeployResponse = z.object({\n accepted: z.boolean(),\n targetVersion: z.string().nullable(),\n message: z.string(),\n});\nexport type DeploymentRedeployResponse = z.infer<typeof DeploymentRedeployResponse>;\n", "import { z } from \"zod\";\n\nexport const KanbanColumn = z.enum([\"backlog\", \"planned\", \"ongoing\", \"review\", \"done\"]);\nexport type KanbanColumn = z.infer<typeof KanbanColumn>;\n\nexport const KanbanPriority = z.enum([\"low\", \"medium\", \"high\"]);\nexport type KanbanPriority = z.infer<typeof KanbanPriority>;\n\nexport const KanbanTask = z.object({\n id: z.string(),\n title: z.string(),\n description: z.string(),\n column: KanbanColumn,\n projectId: z.string().nullable().optional(),\n projectPath: z.string(),\n blockedBy: z.array(z.string()),\n priority: KanbanPriority,\n progress: z.number().min(0).max(100),\n order: z.number(),\n labels: z.array(z.string()),\n completionSummary: z.string().nullable(),\n assignedTerminalId: z.string().nullable(),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\nexport type KanbanTask = z.infer<typeof KanbanTask>;\n\nexport const KanbanTaskCreate = z.object({\n title: z.string(),\n description: z.string(),\n projectId: z.string().optional(),\n projectPath: z.string().optional(),\n blockedBy: z.array(z.string()).optional(),\n priority: KanbanPriority.default(\"medium\"),\n labels: z.array(z.string()).optional(),\n}).refine((data) => Boolean(data.projectId || data.projectPath), {\n message: \"projectId or projectPath is required\",\n path: [\"projectPath\"],\n});\nexport type KanbanTaskCreate = z.infer<typeof KanbanTaskCreate>;\n\nexport const KanbanTaskUpdate = z.object({\n title: z.string().optional(),\n description: z.string().optional(),\n column: KanbanColumn.optional(),\n priority: KanbanPriority.optional(),\n progress: z.number().min(0).max(100).optional(),\n labels: z.array(z.string()).optional(),\n blockedBy: z.array(z.string()).optional(),\n completionSummary: z.string().optional(),\n});\nexport type KanbanTaskUpdate = z.infer<typeof KanbanTaskUpdate>;\n", "import { z } from \"zod\";\nimport { AgentStatus } from \"./agent\";\nimport { KanbanColumn } from \"./kanban\";\n\nexport const TerminalOutputChunk = z.object({\n seq: z.number().int().nonnegative(),\n data: z.string(),\n});\n\nexport const TerminalAttachResponse = z.discriminatedUnion(\"mode\", [\n z.object({\n mode: z.literal(\"snapshot\"),\n terminalId: z.string(),\n output: z.array(z.string()),\n cursor: z.number().int().nonnegative(),\n }),\n z.object({\n mode: z.literal(\"replay\"),\n terminalId: z.string(),\n chunks: z.array(TerminalOutputChunk),\n cursor: z.number().int().nonnegative(),\n }),\n]);\n\n// Server -> Client events\nexport const ServerEvents = {\n \"terminal:output\": z.object({\n terminalId: z.string(),\n ...TerminalOutputChunk.shape,\n }),\n \"terminal:status\": z.object({\n terminalId: z.string(),\n status: AgentStatus,\n error: z.string().nullable().optional(),\n recentInputs: z.array(z.string()).optional(),\n }),\n \"kanban:updated\": z.object({\n taskId: z.string(),\n column: KanbanColumn.optional(),\n assignedTerminalId: z.string().nullable().optional(),\n }),\n \"setup:output\": z.object({\n data: z.string(),\n }),\n \"setup:complete\": z.object({}),\n \"setup:url\": z.object({\n url: z.string(),\n }),\n \"setup:clear-url\": z.object({}),\n \"whatsapp:message\": z.object({\n message: z.object({\n id: z.string(),\n chatJid: z.string(),\n messageId: z.string(),\n direction: z.enum([\"incoming\", \"outgoing\"]),\n senderName: z.string().nullable(),\n body: z.string(),\n status: z.enum([\"queued\", \"processing\", \"completed\", \"failed\"]),\n responseText: z.string().nullable(),\n error: z.string().nullable(),\n createdAt: z.string(),\n processedAt: z.string().nullable(),\n }),\n }),\n \"whatsapp:status\": z.object({\n status: z.enum([\"disconnected\", \"connecting\", \"qr_pending\", \"connected\"]),\n }),\n \"whatsapp:qr\": z.object({\n qrCode: z.string(),\n }),\n \"telegram:message\": z.object({\n message: z.object({\n id: z.string(),\n chatId: z.string(),\n messageId: z.string(),\n direction: z.enum([\"incoming\", \"outgoing\"]),\n senderName: z.string().nullable(),\n body: z.string(),\n status: z.enum([\"queued\", \"processing\", \"completed\", \"failed\"]),\n responseText: z.string().nullable(),\n error: z.string().nullable(),\n createdAt: z.string(),\n processedAt: z.string().nullable(),\n }),\n }),\n \"telegram:status\": z.object({\n status: z.enum([\"disconnected\", \"connecting\", \"connected\", \"error\"]),\n }),\n} as const;\n\n// Client -> Server events\nexport const ClientEvents = {\n \"terminal:input\": z.object({\n terminalId: z.string(),\n data: z.string(),\n }),\n \"terminal:resize\": z.object({\n terminalId: z.string(),\n cols: z.number(),\n rows: z.number(),\n }),\n \"terminal:attach\": z.object({\n terminalId: z.string(),\n cursor: z.number().int().nonnegative().optional(),\n }),\n \"terminal:subscribe\": z.object({\n terminalId: z.string(),\n sinceSeq: z.number().int().nonnegative().optional(),\n }),\n \"terminal:unsubscribe\": z.object({\n terminalId: z.string(),\n }),\n \"setup:input\": z.object({\n data: z.string(),\n }),\n \"setup:resize\": z.object({\n cols: z.number(),\n rows: z.number(),\n }),\n \"setup:subscribe\": z.object({\n cols: z.number().optional(),\n rows: z.number().optional(),\n }),\n \"setup:unsubscribe\": z.object({}),\n \"setup:restart\": z.object({\n cols: z.number().optional(),\n rows: z.number().optional(),\n }),\n \"whatsapp:subscribe\": z.object({}),\n \"whatsapp:unsubscribe\": z.object({}),\n \"telegram:subscribe\": z.object({}),\n \"telegram:unsubscribe\": z.object({}),\n} as const;\n\nexport type ServerEventMap = {\n [K in keyof typeof ServerEvents]: z.infer<(typeof ServerEvents)[K]>;\n};\n\nexport type ClientEventMap = {\n [K in keyof typeof ClientEvents]: z.infer<(typeof ClientEvents)[K]>;\n};\n\nexport type TerminalAttachResponse = z.infer<typeof TerminalAttachResponse>;\n", "import { z } from \"zod\";\nimport { AgentProvider } from \"./agent\";\n\nexport const ProjectStatus = z.enum([\"ready\", \"error\"]);\nexport type ProjectStatus = z.infer<typeof ProjectStatus>;\n\nexport const ProjectCreateInput = z.object({\n name: z.string().min(1),\n repoUrl: z.string().optional(),\n githubOwner: z.string().optional(),\n githubRepo: z.string().optional(),\n defaultBranch: z.string().optional(),\n localPath: z.string().optional(),\n\n syncIssues: z.boolean().default(false),\n provider: AgentProvider.default(\"claude\"),\n});\nexport type ProjectCreateInput = z.infer<typeof ProjectCreateInput>;\n\nexport const ProjectInfo = z.object({\n id: z.string(),\n name: z.string(),\n slug: z.string(),\n repoUrl: z.string().nullable(),\n githubOwner: z.string().nullable(),\n githubRepo: z.string().nullable(),\n defaultBranch: z.string().nullable(),\n localPath: z.string(),\n status: ProjectStatus,\n\n lastSyncedAt: z.string().nullable(),\n lastSyncError: z.string().nullable(),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\nexport type ProjectInfo = z.infer<typeof ProjectInfo>;\n", "import { z } from \"zod\";\n\nexport const WhatsAppConnectionStatus = z.enum([\n \"disconnected\",\n \"connecting\",\n \"qr_pending\",\n \"connected\",\n]);\nexport type WhatsAppConnectionStatus = z.infer<typeof WhatsAppConnectionStatus>;\n\nexport const WhatsAppStatusResponse = z.object({\n status: WhatsAppConnectionStatus,\n qrCode: z.string().nullable().optional(),\n phoneNumber: z.string().nullable().optional(),\n});\nexport type WhatsAppStatusResponse = z.infer<typeof WhatsAppStatusResponse>;\n\nexport const WhatsAppMessageDirection = z.enum([\"incoming\", \"outgoing\"]);\nexport type WhatsAppMessageDirection = z.infer<typeof WhatsAppMessageDirection>;\n\nexport const WhatsAppMessageStatus = z.enum([\n \"queued\",\n \"processing\",\n \"completed\",\n \"failed\",\n]);\nexport type WhatsAppMessageStatus = z.infer<typeof WhatsAppMessageStatus>;\n\nexport const WhatsAppMessage = z.object({\n id: z.string(),\n chatJid: z.string(),\n messageId: z.string(),\n direction: WhatsAppMessageDirection,\n senderName: z.string().nullable(),\n body: z.string(),\n status: WhatsAppMessageStatus,\n responseText: z.string().nullable(),\n error: z.string().nullable(),\n createdAt: z.string(),\n processedAt: z.string().nullable(),\n});\nexport type WhatsAppMessage = z.infer<typeof WhatsAppMessage>;\n", "import { z } from \"zod\";\n\nexport const TelegramConnectionStatus = z.enum([\n \"disconnected\",\n \"connecting\",\n \"connected\",\n \"error\",\n]);\nexport type TelegramConnectionStatus = z.infer<typeof TelegramConnectionStatus>;\n\nexport const TelegramStatusResponse = z.object({\n status: TelegramConnectionStatus,\n botUsername: z.string().nullable().optional(),\n});\nexport type TelegramStatusResponse = z.infer<typeof TelegramStatusResponse>;\n\nexport const TelegramMessageDirection = z.enum([\"incoming\", \"outgoing\"]);\nexport type TelegramMessageDirection = z.infer<typeof TelegramMessageDirection>;\n\nexport const TelegramMessageStatus = z.enum([\n \"queued\",\n \"processing\",\n \"completed\",\n \"failed\",\n]);\nexport type TelegramMessageStatus = z.infer<typeof TelegramMessageStatus>;\n\nexport const TelegramMessage = z.object({\n id: z.string(),\n chatId: z.string(),\n messageId: z.string(),\n direction: TelegramMessageDirection,\n senderName: z.string().nullable(),\n body: z.string(),\n status: TelegramMessageStatus,\n responseText: z.string().nullable(),\n error: z.string().nullable(),\n createdAt: z.string(),\n processedAt: z.string().nullable(),\n});\nexport type TelegramMessage = z.infer<typeof TelegramMessage>;\n", "import * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport { execFileSync } from \"node:child_process\";\nimport type { ProjectCreateInput } from \"@maestro/wire\";\nimport {\n deleteTerminal,\n} from \"../agents/terminal-manager.js\";\nimport { resolveGitHubToken, runGhCommand } from \"../integrations/github.js\";\nimport { unregisterJob } from \"../scheduler/scheduler.js\";\nimport { listTerminalRecords } from \"../state/terminals.js\";\nimport { deleteKanbanStateForProject, probeGitHubMirror } from \"../state/kanban.js\";\nimport {\n createProjectRecord,\n findProjectRecordByGitHubRepo,\n findProjectRecordByPath,\n getProjectRecordById,\n getProjectRecordBySlug,\n listProjectRecords,\n removeProjectRecord,\n updateProjectRecord,\n} from \"../state/projects.js\";\nimport {\n deleteAutomationRecord,\n deleteScheduledTaskRecord,\n listAutomationRecords,\n listScheduledTaskRecords,\n} from \"../state/sqlite.js\";\nimport { MAESTRO_PROJECTS_DIR } from \"../state/files.js\";\nimport type { ProjectRecord } from \"../state/types.js\";\n\nconst LEGACY_MANAGED_PROJECTS_DIR = path.join(os.homedir(), \"maestro-projects\");\nconst MANAGED_PROJECTS_DIR = MAESTRO_PROJECTS_DIR;\n\ninterface GitHubRepoParts {\n repoUrl: string | null;\n githubOwner: string | null;\n githubRepo: string | null;\n}\n\nfunction slugify(input: string): string {\n return (\n input\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\") || \"project\"\n );\n}\n\nfunction stripGitSuffix(value: string): string {\n return value.endsWith(\".git\") ? value.slice(0, -4) : value;\n}\n\nfunction parseGitHubRepo(\n repoUrl?: string,\n githubOwner?: string,\n githubRepo?: string\n): GitHubRepoParts {\n if (githubOwner && githubRepo) {\n return {\n repoUrl: repoUrl ?? `https://github.com/${githubOwner}/${githubRepo}.git`,\n githubOwner,\n githubRepo: stripGitSuffix(githubRepo),\n };\n }\n\n const raw = repoUrl?.trim();\n if (!raw) {\n return {\n repoUrl: null,\n githubOwner: null,\n githubRepo: null,\n };\n }\n\n const normalized = stripGitSuffix(\n raw.replace(/^git@github\\.com:/, \"https://github.com/\")\n );\n const match = normalized.match(\n /^https?:\\/\\/github\\.com\\/(?<owner>[^/]+)\\/(?<repo>[^/]+)$|^(?<shortOwner>[^/\\s]+)\\/(?<shortRepo>[^/\\s]+)$/\n );\n\n const owner = match?.groups?.owner ?? match?.groups?.shortOwner ?? null;\n const repo = match?.groups?.repo ?? match?.groups?.shortRepo ?? null;\n\n return {\n repoUrl: owner && repo ? `https://github.com/${owner}/${repo}.git` : raw,\n githubOwner: owner,\n githubRepo: repo,\n };\n}\n\nfunction getUniqueSlug(name: string): string {\n const base = slugify(name);\n let slug = base;\n let counter = 2;\n\n while (getProjectRecordBySlug(slug)) {\n slug = `${base}-${counter}`;\n counter += 1;\n }\n\n return slug;\n}\n\nfunction ensureManagedProjectsDir(): string {\n if (fs.existsSync(MANAGED_PROJECTS_DIR)) {\n return MANAGED_PROJECTS_DIR;\n }\n\n if (fs.existsSync(LEGACY_MANAGED_PROJECTS_DIR)) {\n fs.mkdirSync(path.dirname(MANAGED_PROJECTS_DIR), { recursive: true });\n fs.renameSync(LEGACY_MANAGED_PROJECTS_DIR, MANAGED_PROJECTS_DIR);\n console.log(\n `Migrated managed projects directory from ${LEGACY_MANAGED_PROJECTS_DIR} to ${MANAGED_PROJECTS_DIR}`\n );\n return MANAGED_PROJECTS_DIR;\n }\n\n fs.mkdirSync(MANAGED_PROJECTS_DIR, { recursive: true });\n return MANAGED_PROJECTS_DIR;\n}\n\nfunction deriveLocalPath(\n localPath: string | undefined,\n name: string\n): string {\n if (localPath?.trim()) {\n return path.resolve(localPath.trim());\n }\n\n return path.join(ensureManagedProjectsDir(), slugify(name));\n}\n\nfunction runGitCommand(args: string[]): void {\n try {\n execFileSync(\"git\", args, {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n } catch (error) {\n const stderr =\n error instanceof Error && \"stderr\" in error && typeof error.stderr === \"string\"\n ? error.stderr.trim()\n : \"\";\n throw new Error(stderr || `git ${args.join(\" \")} failed`);\n }\n}\n\nfunction ensureProjectPathAvailable(localPath: string): void {\n const existingProject = findProjectRecordByPath(localPath);\n if (existingProject) {\n throw new Error(`A project already uses ${localPath}`);\n }\n\n if (!fs.existsSync(localPath)) {\n return;\n }\n\n const stat = fs.statSync(localPath);\n if (!stat.isDirectory()) {\n throw new Error(`Local path already exists and is not a directory: ${localPath}`);\n }\n\n if (fs.readdirSync(localPath).length > 0) {\n throw new Error(`Local path already exists and is not empty: ${localPath}`);\n }\n}\n\nfunction cloneRepository(\n repo: GitHubRepoParts,\n localPath: string,\n defaultBranch?: string\n): void {\n if (!repo.repoUrl) {\n return;\n }\n\n const parentDir = path.dirname(localPath);\n fs.mkdirSync(parentDir, { recursive: true });\n ensureProjectPathAvailable(localPath);\n\n const branch = defaultBranch?.trim();\n const hasGitHubToken = Boolean(resolveGitHubToken().token);\n let ghCloneError: string | null = null;\n\n if (repo.githubOwner && repo.githubRepo && hasGitHubToken) {\n const ghArgs = [\"repo\", \"clone\", `${repo.githubOwner}/${repo.githubRepo}`, localPath];\n if (branch) {\n ghArgs.push(\"--\", \"--branch\", branch);\n }\n\n try {\n runGhCommand(ghArgs);\n return;\n } catch (error) {\n if (fs.existsSync(localPath) && fs.readdirSync(localPath).length === 0) {\n fs.rmdirSync(localPath);\n }\n\n ghCloneError =\n error instanceof Error ? error.message : \"gh repo clone failed\";\n }\n }\n\n const gitArgs = [\"clone\"];\n if (branch) {\n gitArgs.push(\"--branch\", branch);\n }\n gitArgs.push(repo.repoUrl, localPath);\n\n try {\n runGitCommand(gitArgs);\n } catch (error) {\n if (fs.existsSync(localPath) && fs.readdirSync(localPath).length === 0) {\n fs.rmdirSync(localPath);\n }\n\n const message = error instanceof Error ? error.message : \"git clone failed\";\n throw new Error(\n ghCloneError\n ? `Failed to clone repository. gh: ${ghCloneError}. git: ${message}`\n : `Failed to clone repository: ${message}`\n );\n }\n}\n\nexport async function listProjects(): Promise<ProjectRecord[]> {\n return listProjectRecords();\n}\n\nexport async function getProjectById(projectId: string): Promise<ProjectRecord | null> {\n return getProjectRecordById(projectId);\n}\n\nexport async function resolveProjectContext(input: {\n projectId?: string | null;\n projectPath?: string | null;\n}): Promise<{\n project: ProjectRecord | null;\n projectId: string | null;\n projectPath: string;\n}> {\n let project: ProjectRecord | null = null;\n\n if (input.projectId) {\n project = getProjectRecordById(input.projectId);\n if (!project) {\n throw new Error(\"Project not found\");\n }\n } else if (input.projectPath) {\n project = findProjectRecordByPath(input.projectPath);\n }\n\n const projectPath = project?.localPath || input.projectPath?.trim();\n if (!projectPath) {\n throw new Error(\"projectId or projectPath is required\");\n }\n\n return {\n project,\n projectId: project?.id ?? input.projectId ?? null,\n projectPath,\n };\n}\n\nexport async function syncGitHubIssues(\n projectId: string\n): Promise<{ syncedCount: number }> {\n return probeGitHubMirror(projectId);\n}\n\nexport async function deleteProject(projectId: string): Promise<void> {\n const project = getProjectRecordById(projectId);\n if (!project) {\n throw new Error(\"Project not found\");\n }\n\n const agents = listTerminalRecords().filter(\n (agent) => agent.projectId === projectId || agent.projectPath === project.localPath\n );\n for (const agent of agents) {\n await deleteTerminal(agent.id);\n }\n\n for (const task of listScheduledTaskRecords().filter(\n (task) => task.projectId === projectId || task.projectPath === project.localPath\n )) {\n unregisterJob(task.id);\n deleteScheduledTaskRecord(task.id);\n }\n\n for (const automation of listAutomationRecords().filter(\n (record) =>\n record.agentProjectId === projectId ||\n record.agentProjectPath === project.localPath\n )) {\n deleteAutomationRecord(automation.id);\n }\n\n deleteKanbanStateForProject(projectId, project.localPath);\n removeProjectRecord(projectId);\n}\n\nexport async function createProject(\n input: ProjectCreateInput\n): Promise<ProjectRecord> {\n const repo = parseGitHubRepo(input.repoUrl, input.githubOwner, input.githubRepo);\n if (repo.githubOwner && repo.githubRepo) {\n const existingProject = findProjectRecordByGitHubRepo(\n repo.githubOwner,\n repo.githubRepo\n );\n if (existingProject) {\n throw new Error(\n `GitHub repository ${repo.githubOwner}/${repo.githubRepo} is already linked to ${existingProject.name}`\n );\n }\n }\n\n const slug = getUniqueSlug(input.name);\n const localPath = deriveLocalPath(input.localPath, input.name);\n\n if (repo.repoUrl) {\n cloneRepository(repo, localPath, input.defaultBranch);\n } else {\n fs.mkdirSync(localPath, { recursive: true });\n }\n\n const project = createProjectRecord({\n name: input.name.trim(),\n slug,\n repoUrl: repo.repoUrl,\n githubOwner: repo.githubOwner,\n githubRepo: repo.githubRepo,\n defaultBranch: input.defaultBranch?.trim() || null,\n localPath,\n status: \"ready\",\n lastSyncedAt: null,\n lastSyncError: null,\n });\n\n if (input.syncIssues && project.githubOwner && project.githubRepo) {\n try {\n await syncGitHubIssues(project.id);\n } catch {\n // Preserve the project and surface sync errors through lastSyncError.\n }\n }\n\n return (await getProjectById(project.id)) ?? project;\n}\n", "import cron from \"node-cron\";\nimport {\n createTerminal,\n createAutoSpawnTerminal,\n startTerminal,\n} from \"../agents/terminal-manager.js\";\nimport type { AgentProvider } from \"@maestro/wire\";\nimport {\n listScheduledTaskRecords,\n updateScheduledTaskRecord,\n} from \"../state/sqlite.js\";\nimport type { ScheduledTaskRecord } from \"../state/types.js\";\n\ninterface ScheduledJob {\n taskId: string;\n cronTask: ReturnType<typeof cron.schedule>;\n}\n\nconst activeJobs = new Map<string, ScheduledJob>();\n\nexport async function startScheduler() {\n const tasks = listScheduledTaskRecords().filter((task) => task.enabled);\n for (const task of tasks) {\n registerJob(task);\n }\n\n console.log(`Scheduler started with ${tasks.length} task(s)`);\n}\n\nexport function stopScheduler() {\n for (const [, job] of activeJobs) {\n job.cronTask.stop();\n }\n activeJobs.clear();\n console.log(\"Scheduler stopped\");\n}\n\nexport function registerJob(task: ScheduledTaskRecord) {\n unregisterJob(task.id);\n\n if (!cron.validate(task.schedule)) {\n console.error(`Invalid cron expression for task \"${task.name}\": ${task.schedule}`);\n return;\n }\n\n const cronTask = cron.schedule(task.schedule, async () => {\n console.log(`Scheduler: running task \"${task.name}\"`);\n await executeScheduledTask(task);\n });\n\n activeJobs.set(task.id, { taskId: task.id, cronTask });\n console.log(`Scheduler: registered task \"${task.name}\" with schedule \"${task.schedule}\"`);\n}\n\nexport function unregisterJob(taskId: string) {\n const existing = activeJobs.get(taskId);\n if (existing) {\n existing.cronTask.stop();\n activeJobs.delete(taskId);\n }\n}\n\nasync function executeScheduledTask(task: ScheduledTaskRecord) {\n try {\n const name = `scheduled-${task.name}-${Date.now()}`;\n const agent = task.provider === \"custom\"\n ? await createTerminal({\n name,\n kind: \"scheduler\",\n provider: task.provider as AgentProvider,\n projectId: task.projectId || undefined,\n projectPath: task.projectPath,\n customDisplayName: task.customDisplayName || undefined,\n customCommandTemplate: task.customCommandTemplate || undefined,\n customEnv: task.customEnv || undefined,\n skipPermissions: task.skipPermissions,\n })\n : await createAutoSpawnTerminal({\n name,\n kind: \"scheduler\",\n projectId: task.projectId || undefined,\n projectPath: task.projectPath,\n });\n\n await startTerminal(agent.id, task.prompt);\n updateScheduledTaskRecord(task.id, {\n lastRunAt: new Date().toISOString(),\n });\n\n console.log(`Scheduler: task \"${task.name}\" started agent ${agent.id}`);\n } catch (err) {\n console.error(`Scheduler: failed to run task \"${task.name}\":`, err);\n }\n}\n\nexport function cronToHuman(expression: string): string {\n const parts = expression.split(\" \");\n if (parts.length !== 5) return expression;\n\n const [min, hour, dom, month, dow] = parts;\n\n if (min === \"*\" && hour === \"*\") return \"Every minute\";\n if (hour === \"*\" && min !== \"*\") return `Every hour at :${min.padStart(2, \"0\")}`;\n if (dom === \"*\" && month === \"*\" && dow === \"*\") {\n if (min !== \"*\" && hour !== \"*\") {\n return `Daily at ${hour.padStart(2, \"0\")}:${min.padStart(2, \"0\")}`;\n }\n }\n\n return expression;\n}\n", "import type { FastifyInstance } from \"fastify\";\nimport { ProjectCreateInput } from \"@maestro/wire\";\nimport {\n createProject,\n deleteProject,\n getProjectById,\n listProjects,\n syncGitHubIssues,\n} from \"../projects/project-service.js\";\n\nexport async function registerProjectRoutes(app: FastifyInstance) {\n app.get(\"/api/projects\", async () => {\n const projects = await listProjects();\n return { projects };\n });\n\n app.get<{ Params: { id: string } }>(\"/api/projects/:id\", async (req, reply) => {\n const project = await getProjectById(req.params.id);\n if (!project) {\n return reply.status(404).send({ error: \"Project not found\" });\n }\n return { project };\n });\n\n app.post(\"/api/projects\", async (req, reply) => {\n try {\n const input = ProjectCreateInput.parse(req.body);\n const project = await createProject(input);\n return reply.status(201).send({ project });\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to create project\",\n });\n }\n });\n\n app.delete<{ Params: { id: string } }>(\"/api/projects/:id\", async (req, reply) => {\n try {\n await deleteProject(req.params.id);\n return { ok: true };\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Failed to delete project\";\n return reply.status(message === \"Project not found\" ? 404 : 400).send({\n error: message,\n });\n }\n });\n\n app.post<{ Params: { id: string } }>(\n \"/api/projects/:id/sync/github-issues\",\n async (req, reply) => {\n try {\n const result = await syncGitHubIssues(req.params.id);\n const project = await getProjectById(req.params.id);\n return { ok: true, ...result, project };\n } catch (err) {\n return reply.status(400).send({\n error:\n err instanceof Error ? err.message : \"Failed to sync GitHub issues\",\n });\n }\n }\n );\n}\n", "import type { FastifyInstance } from \"fastify\";\nimport type { Server as SocketServer } from \"socket.io\";\nimport { KanbanTaskCreate, KanbanTaskUpdate, KanbanColumn } from \"@maestro/wire\";\nimport {\n createKanbanTask,\n deleteKanbanTaskRecord,\n getKanbanTask,\n listKanbanTasks,\n moveKanbanTaskRecord,\n updateKanbanTaskRecord,\n} from \"../state/kanban.js\";\nimport { deleteTerminal } from \"../agents/terminal-manager.js\";\nimport { assertAutoSpawnProviderReady } from \"../agents/auto-spawn-provider.js\";\n\nexport async function registerKanbanRoutes(\n app: FastifyInstance,\n io: SocketServer\n) {\n app.get<{ Querystring: { column?: string; projectId?: string } }>(\n \"/api/kanban/tasks\",\n async (req) => {\n const tasks = await listKanbanTasks({\n column: req.query.column,\n projectId: req.query.projectId,\n });\n return { tasks };\n }\n );\n\n app.get<{ Params: { id: string } }>(\n \"/api/kanban/tasks/:id\",\n async (req, reply) => {\n const task = await getKanbanTask(req.params.id);\n if (!task) return reply.status(404).send({ error: \"Task not found\" });\n return { task };\n }\n );\n\n app.post(\"/api/kanban/tasks\", async (req, reply) => {\n try {\n const input = KanbanTaskCreate.parse(req.body);\n const task = await createKanbanTask(input);\n io.emit(\"kanban:updated\", { taskId: task.id, column: task.column });\n return reply.status(201).send({ task });\n } catch (err) {\n return reply\n .status(400)\n .send({ error: err instanceof Error ? err.message : \"Invalid input\" });\n }\n });\n\n app.patch<{ Params: { id: string } }>(\n \"/api/kanban/tasks/:id\",\n async (req, reply) => {\n try {\n const input = KanbanTaskUpdate.parse(req.body);\n const task = await updateKanbanTaskRecord(req.params.id, input);\n io.emit(\"kanban:updated\", {\n taskId: task.id,\n column: task.column,\n assignedTerminalId: task.assignedTerminalId,\n });\n return { task };\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to update task\",\n });\n }\n }\n );\n\n app.post<{ Params: { id: string }; Body: { column: string } }>(\n \"/api/kanban/tasks/:id/move\",\n async (req, reply) => {\n try {\n const column = KanbanColumn.parse((req.body as { column: string }).column);\n const currentTask = await getKanbanTask(req.params.id);\n if (!currentTask) {\n return reply.status(404).send({ error: \"Task not found\" });\n }\n\n if (currentTask.column === \"backlog\" && column === \"planned\") {\n assertAutoSpawnProviderReady();\n }\n\n if (currentTask.column === \"ongoing\" && column === \"planned\") {\n const terminalIds = Array.from(\n new Set(\n [\n currentTask.assignedTerminalId,\n ...(currentTask.terminals?.map((terminal) => terminal.id) ?? []),\n ].filter((terminalId): terminalId is string => Boolean(terminalId))\n )\n );\n\n for (const terminalId of terminalIds) {\n await deleteTerminal(terminalId);\n }\n }\n\n const task = await moveKanbanTaskRecord(req.params.id, column);\n io.emit(\"kanban:updated\", {\n taskId: task.id,\n column: task.column,\n assignedTerminalId: task.assignedTerminalId,\n });\n return { task };\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to move task\",\n });\n }\n }\n );\n\n app.delete<{ Params: { id: string } }>(\n \"/api/kanban/tasks/:id\",\n async (req, reply) => {\n try {\n await deleteKanbanTaskRecord(req.params.id);\n io.emit(\"kanban:updated\", { taskId: req.params.id });\n return { ok: true };\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to delete task\",\n });\n }\n }\n );\n}\n", "import type { Server as SocketServer, Socket } from \"socket.io\";\nimport { ClientEvents, TerminalAttachResponse } from \"@maestro/wire\";\nimport {\n getTerminalAttachment,\n getBufferedTerminalOutputSince,\n hasTerminal,\n sendTerminalInput,\n resizeTerminal,\n} from \"../agents/terminal-manager.js\";\nimport { sendSetupInput, resizeSetupPty, getSetupOutputBuffer, isSetupDone, startSetupPty, isSetupRunning, resetSetup } from \"../setup/setup-manager.js\";\n\nexport function registerSocketHandlers(io: SocketServer) {\n io.on(\"connection\", (socket: Socket) => {\n console.log(`Client connected: ${socket.id}`);\n\n socket.on(\"terminal:attach\", async (data, respond?: (payload: TerminalAttachResponse) => void) => {\n try {\n const { terminalId, cursor } = ClientEvents[\"terminal:attach\"].parse(data);\n if (!hasTerminal(terminalId)) {\n socket.emit(\"error\", { message: \"Terminal not found\" });\n return;\n }\n socket.join(`terminal:${terminalId}`);\n respond?.(TerminalAttachResponse.parse(await getTerminalAttachment(terminalId, cursor)));\n console.log(`Client ${socket.id} attached to terminal ${terminalId}`);\n } catch {\n socket.emit(\"error\", { message: \"Invalid attach payload\" });\n }\n });\n\n // Subscribe to terminal output stream\n socket.on(\"terminal:subscribe\", (data) => {\n try {\n const { terminalId, sinceSeq } = ClientEvents[\"terminal:subscribe\"].parse(data);\n if (!hasTerminal(terminalId)) {\n socket.emit(\"error\", { message: \"Terminal not found\" });\n return;\n }\n socket.join(`terminal:${terminalId}`);\n\n if (sinceSeq !== undefined) {\n for (const chunk of getBufferedTerminalOutputSince(terminalId, sinceSeq)) {\n socket.emit(\"terminal:output\", {\n terminalId,\n data: chunk.data,\n seq: chunk.seq,\n });\n }\n }\n\n console.log(`Client ${socket.id} subscribed to terminal ${terminalId}`);\n } catch {\n socket.emit(\"error\", { message: \"Invalid subscribe payload\" });\n }\n });\n\n // Unsubscribe from terminal output stream\n socket.on(\"terminal:unsubscribe\", (data) => {\n try {\n const { terminalId } = ClientEvents[\"terminal:unsubscribe\"].parse(data);\n socket.leave(`terminal:${terminalId}`);\n } catch {\n socket.emit(\"error\", { message: \"Invalid unsubscribe payload\" });\n }\n });\n\n // Forward keyboard input to terminal PTY\n socket.on(\"terminal:input\", (data) => {\n try {\n const { terminalId, data: inputData } =\n ClientEvents[\"terminal:input\"].parse(data);\n if (!hasTerminal(terminalId)) {\n socket.emit(\"error\", { message: \"Terminal not found\" });\n return;\n }\n sendTerminalInput(terminalId, inputData);\n } catch {\n socket.emit(\"error\", { message: \"Invalid input payload\" });\n }\n });\n\n // Resize terminal viewport\n socket.on(\"terminal:resize\", (data) => {\n try {\n const { terminalId, cols, rows } =\n ClientEvents[\"terminal:resize\"].parse(data);\n if (!hasTerminal(terminalId)) {\n socket.emit(\"error\", { message: \"Terminal not found\" });\n return;\n }\n resizeTerminal(terminalId, cols, rows);\n } catch {\n socket.emit(\"error\", { message: \"Invalid resize payload\" });\n }\n });\n\n // Setup terminal handlers\n socket.on(\"setup:subscribe\", (data) => {\n socket.join(\"setup\");\n console.log(`Client ${socket.id} subscribed to setup`);\n\n // If PTY is already running or done, replay buffered output\n const buffer = getSetupOutputBuffer();\n if (buffer.length > 0) {\n for (const chunk of buffer) {\n socket.emit(\"setup:output\", { data: chunk });\n }\n }\n if (isSetupDone()) {\n socket.emit(\"setup:complete\", {});\n }\n\n // Auto-start PTY if not already running/done, using client dimensions\n if (!isSetupRunning() && !isSetupDone()) {\n const cols = (data as { cols?: number })?.cols;\n const rows = (data as { rows?: number })?.rows;\n startSetupPty(io, cols, rows);\n }\n });\n\n socket.on(\"setup:unsubscribe\", () => {\n socket.leave(\"setup\");\n });\n\n socket.on(\"setup:input\", (data) => {\n try {\n const { data: inputData } = ClientEvents[\"setup:input\"].parse(data);\n sendSetupInput(inputData);\n } catch {\n socket.emit(\"error\", { message: \"Invalid setup input payload\" });\n }\n });\n\n socket.on(\"setup:resize\", (data) => {\n try {\n const { cols, rows } = ClientEvents[\"setup:resize\"].parse(data);\n resizeSetupPty(cols, rows);\n } catch {\n socket.emit(\"error\", { message: \"Invalid setup resize payload\" });\n }\n });\n\n socket.on(\"setup:restart\", (data) => {\n try {\n const { cols, rows } = ClientEvents[\"setup:restart\"].parse(data);\n console.log(`[setup] Restart requested by ${socket.id}`);\n resetSetup();\n startSetupPty(io, cols, rows);\n } catch {\n socket.emit(\"error\", { message: \"Invalid setup restart payload\" });\n }\n });\n\n // WhatsApp handlers\n socket.on(\"whatsapp:subscribe\", () => {\n socket.join(\"whatsapp\");\n console.log(`Client ${socket.id} subscribed to whatsapp`);\n });\n\n socket.on(\"whatsapp:unsubscribe\", () => {\n socket.leave(\"whatsapp\");\n });\n\n socket.on(\"disconnect\", () => {\n console.log(`Client disconnected: ${socket.id}`);\n });\n });\n}\n", "import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport * as pty from \"node-pty\";\nimport type { Server as SocketServer } from \"socket.io\";\n\nconst FLAG_DIR = path.join(os.homedir(), \".maestro\");\nconst FLAG_FILE = path.join(FLAG_DIR, \"setup-complete\");\nconst SENTINEL = \"__MAESTRO_SETUP_DONE__\";\n// Match URLs in PTY output. PTY data may contain ANSI escape codes interleaved\n// with the URL text, so we first strip all escape sequences before matching.\nconst URL_RE = /https?:\\/\\/[^\\s\"'<>]+/g;\nconst ANSI_RE = /\\x1b(?:\\][^\\x07\\x1b]*(?:\\x07|\\x1b\\\\)?|\\[[0-9;]*[A-Za-z])/g;\n// Detect prompts like \"Do you want to use Claude Code? (y/n)\" or \"Running:\"\n// which indicate a new step has started and any previous URL is stale.\nconst STEP_BOUNDARY_RE = /(?:Running:|Checking|Do you want|Enter|Paste|Token)/i;\nconst INSTALL_ROOT = process.env.MAESTRO_INSTALL_ROOT?.trim();\nconst SCRIPT_PATH = INSTALL_ROOT\n ? path.resolve(INSTALL_ROOT, \"assets/setup.sh\")\n : path.resolve(\n import.meta.dirname ?? __dirname,\n \"../../scripts/setup.sh\"\n );\n\nlet activePty: pty.IPty | null = null;\nlet running = false;\nlet outputBuffer: string[] = [];\nlet setupComplete = false;\n\nexport function isSetupComplete(): boolean {\n return fs.existsSync(FLAG_FILE);\n}\n\nexport function markSetupComplete(): void {\n fs.mkdirSync(FLAG_DIR, { recursive: true });\n fs.writeFileSync(FLAG_FILE, new Date().toISOString(), \"utf-8\");\n}\n\nexport function resetSetup(): void {\n if (fs.existsSync(FLAG_FILE)) {\n fs.unlinkSync(FLAG_FILE);\n }\n cleanup();\n resetOutputBuffer();\n}\n\nexport function isSetupRunning(): boolean {\n return running;\n}\n\nexport function startSetupPty(io: SocketServer, cols?: number, rows?: number): void {\n // Kill any stale PTY from a previous session\n if (activePty) {\n console.log(\"[setup] Killing stale PTY before starting new one\");\n cleanup();\n }\n\n // Clear buffer from any previous run\n outputBuffer = [];\n setupComplete = false;\n\n console.log(`[setup] Starting setup PTY, script: ${SCRIPT_PATH}`);\n console.log(`[setup] Script exists: ${fs.existsSync(SCRIPT_PATH)}`);\n console.log(`[setup] Requested dimensions: cols=${cols}, rows=${rows}`);\n\n running = true;\n\n // Ensure script is executable\n try {\n fs.chmodSync(SCRIPT_PATH, 0o755);\n } catch {\n // ignore if already executable\n }\n\n activePty = pty.spawn(\"bash\", [SCRIPT_PATH], {\n name: \"xterm-256color\",\n cols: cols ?? 120,\n rows: rows ?? 30,\n cwd: os.homedir(),\n env: process.env as Record<string, string>,\n });\n\n console.log(`[setup] PTY spawned, pid: ${activePty.pid}`);\n\n activePty.onData((data) => {\n const roomSize = io.sockets.adapter.rooms.get(\"setup\")?.size ?? 0;\n console.log(`[setup] PTY output (${data.length} bytes, ${roomSize} subscribers)`);\n outputBuffer.push(data);\n io.to(\"setup\").emit(\"setup:output\", { data });\n\n // Strip ANSI escape sequences before URL/boundary detection\n const clean = data.replace(ANSI_RE, \"\");\n\n // When a new step boundary is detected, clear any stale URL banner\n const hasUrl = URL_RE.test(clean);\n URL_RE.lastIndex = 0; // reset regex state\n if (!hasUrl && STEP_BOUNDARY_RE.test(clean)) {\n io.to(\"setup\").emit(\"setup:clear-url\", {});\n }\n\n // Detect URLs and emit them separately for the UI to show as clickable links\n const urls = clean.match(URL_RE);\n if (urls) {\n for (const url of urls) {\n io.to(\"setup\").emit(\"setup:url\", { url });\n }\n }\n\n if (data.includes(SENTINEL)) {\n setupComplete = true;\n markSetupComplete();\n io.to(\"setup\").emit(\"setup:complete\", {});\n cleanup();\n }\n });\n\n activePty.onExit(({ exitCode }) => {\n console.log(`[setup] PTY exited with code ${exitCode}`);\n cleanup();\n });\n}\n\nexport function getSetupOutputBuffer(): string[] {\n return outputBuffer;\n}\n\nexport function isSetupDone(): boolean {\n return setupComplete;\n}\n\nexport function sendSetupInput(data: string): void {\n activePty?.write(data);\n}\n\nexport function resizeSetupPty(cols: number, rows: number): void {\n activePty?.resize(cols, rows);\n}\n\nfunction cleanup(): void {\n if (activePty) {\n try {\n activePty.kill();\n } catch {\n // already dead\n }\n activePty = null;\n }\n running = false;\n}\n\nexport function resetOutputBuffer(): void {\n outputBuffer = [];\n setupComplete = false;\n}\n", "import type { Server as SocketServer } from \"socket.io\";\nimport { createAutoSpawnTerminal, startTerminal, deleteTerminal } from \"./terminal-manager.js\";\nimport { listKanbanTasks, updateKanbanTaskRecord } from \"../state/kanban.js\";\nimport { updateTerminalRecord } from \"../state/terminals.js\";\n\nconst POLL_INTERVAL = 10_000;\n\nlet timer: ReturnType<typeof setInterval> | null = null;\n\nexport function startKanbanAssigner(io: SocketServer) {\n console.log(\"Kanban assigner started (polling every 10s)\");\n timer = setInterval(() => tick(io), POLL_INTERVAL);\n void tick(io);\n}\n\nexport function stopKanbanAssigner() {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n}\n\nasync function tick(io: SocketServer) {\n try {\n const allTasks = await listKanbanTasks();\n const doneTaskIds = new Set(\n allTasks.filter((t) => t.column === \"done\").map((t) => t.id)\n );\n const plannedTasks = allTasks.filter((t) => t.column === \"planned\");\n const assignableTasks = plannedTasks.filter(\n (task) =>\n !task.assignedTerminalId &&\n task.blockedBy.every((id) => doneTaskIds.has(id))\n );\n if (assignableTasks.length === 0) return;\n\n for (const task of assignableTasks) {\n await assignTaskToTerminal(io, task);\n }\n } catch (err) {\n console.error(\"Kanban assigner error:\", err);\n }\n}\n\ninterface TaskLike {\n id: string;\n title: string;\n description: string;\n projectId?: string | null;\n projectPath: string;\n}\n\nasync function assignTaskToTerminal(\n io: SocketServer,\n task: TaskLike\n) {\n let terminalId: string | null = null;\n try {\n const terminal = await createAutoSpawnTerminal({\n kind: \"kanban\",\n projectId: task.projectId ?? undefined,\n projectPath: task.projectPath,\n });\n terminalId = terminal.id;\n\n await updateKanbanTaskRecord(task.id, {\n column: \"ongoing\",\n assignedTerminalId: terminalId,\n });\n\n updateTerminalRecord(terminalId, {\n kanbanTaskId: task.id,\n });\n\n const prompt = `Task: ${task.title}\\n\\n${task.description}`;\n await startTerminal(terminalId, prompt);\n\n io.emit(\"kanban:updated\", {\n taskId: task.id,\n column: \"ongoing\",\n assignedTerminalId: terminalId,\n });\n\n console.log(`Kanban: assigned task \"${task.title}\" to terminal ${terminalId}`);\n } catch (err) {\n if (terminalId) {\n try {\n await deleteTerminal(terminalId);\n } catch {\n // Best effort cleanup for partially created terminals.\n }\n }\n await updateKanbanTaskRecord(task.id, {\n column: \"planned\",\n assignedTerminalId: null,\n });\n io.emit(\"kanban:updated\", {\n taskId: task.id,\n column: \"planned\",\n assignedTerminalId: null,\n });\n console.error(`Failed to assign task ${task.id} to an auto-spawned terminal:`, err);\n }\n}\n", "import type { FastifyInstance } from \"fastify\";\nimport { registerJob, unregisterJob, cronToHuman } from \"../scheduler/scheduler.js\";\nimport { resolveProjectContext } from \"../projects/project-service.js\";\nimport {\n createScheduledTaskRecord,\n deleteScheduledTaskRecord,\n getScheduledTaskRecord,\n listScheduledTaskRecords,\n updateScheduledTaskRecord,\n} from \"../state/sqlite.js\";\nimport { getProjectRecordById } from \"../state/projects.js\";\n\nfunction withProject(task: ReturnType<typeof getScheduledTaskRecord>) {\n if (!task) return null;\n const project = task.projectId ? getProjectRecordById(task.projectId) : null;\n return {\n ...task,\n project: project ? { id: project.id, name: project.name } : null,\n };\n}\n\nexport async function registerSchedulerRoutes(app: FastifyInstance) {\n app.get(\"/api/scheduler/tasks\", async () => {\n const tasks = listScheduledTaskRecords().map((task) => ({\n ...withProject(task),\n scheduleHuman: cronToHuman(task.schedule),\n }));\n return { tasks };\n });\n\n app.get<{ Params: { id: string } }>(\n \"/api/scheduler/tasks/:id\",\n async (req, reply) => {\n const task = getScheduledTaskRecord(req.params.id);\n if (!task) return reply.status(404).send({ error: \"Task not found\" });\n return {\n task: {\n ...withProject(task),\n scheduleHuman: cronToHuman(task.schedule),\n },\n };\n }\n );\n\n app.post(\"/api/scheduler/tasks\", async (req, reply) => {\n try {\n const body = req.body as {\n name: string;\n prompt: string;\n schedule: string;\n projectId?: string;\n projectPath?: string;\n provider?: string;\n customDisplayName?: string;\n customCommandTemplate?: string;\n customEnv?: Record<string, string>;\n skipPermissions?: boolean;\n enabled?: boolean;\n };\n\n if (!body.name || !body.prompt || !body.schedule) {\n return reply\n .status(400)\n .send({ error: \"name, prompt, schedule, and projectId/projectPath are required\" });\n }\n\n const projectContext = await resolveProjectContext({\n projectId: body.projectId,\n projectPath: body.projectPath,\n });\n\n const task = createScheduledTaskRecord({\n name: body.name,\n prompt: body.prompt,\n schedule: body.schedule,\n projectId: projectContext.projectId,\n projectPath: projectContext.projectPath,\n provider: body.provider || \"claude\",\n customDisplayName: body.customDisplayName || null,\n customCommandTemplate: body.customCommandTemplate || null,\n customEnv: body.customEnv || null,\n skipPermissions: body.skipPermissions ?? true,\n enabled: body.enabled ?? true,\n lastRunAt: null,\n nextRunAt: null,\n });\n\n if (task.enabled) {\n registerJob(task);\n }\n\n return reply.status(201).send({ task: withProject(task) });\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to create task\",\n });\n }\n });\n\n app.patch<{ Params: { id: string } }>(\n \"/api/scheduler/tasks/:id\",\n async (req, reply) => {\n try {\n const body = req.body as Partial<{\n name: string;\n prompt: string;\n schedule: string;\n projectId: string;\n projectPath: string;\n provider: string;\n customDisplayName: string;\n customCommandTemplate: string;\n customEnv: Record<string, string>;\n skipPermissions: boolean;\n enabled: boolean;\n }>;\n\n const projectContext =\n body.projectId || body.projectPath\n ? await resolveProjectContext({\n projectId: body.projectId,\n projectPath: body.projectPath,\n })\n : null;\n\n const task = updateScheduledTaskRecord(req.params.id, {\n ...body,\n ...(projectContext\n ? {\n projectId: projectContext.projectId,\n projectPath: projectContext.projectPath,\n }\n : {}),\n });\n\n if (task.enabled) {\n registerJob(task);\n } else {\n unregisterJob(task.id);\n }\n\n return { task: withProject(task) };\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to update task\",\n });\n }\n }\n );\n\n app.delete<{ Params: { id: string } }>(\n \"/api/scheduler/tasks/:id\",\n async (req, reply) => {\n try {\n unregisterJob(req.params.id);\n deleteScheduledTaskRecord(req.params.id);\n return { ok: true };\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to delete task\",\n });\n }\n }\n );\n\n app.post<{ Params: { id: string } }>(\n \"/api/scheduler/tasks/:id/run\",\n async (req, reply) => {\n try {\n const task = getScheduledTaskRecord(req.params.id);\n if (!task) return reply.status(404).send({ error: \"Task not found\" });\n\n const { createTerminal, createAutoSpawnTerminal, startTerminal } = await import(\"../agents/terminal-manager.js\");\n\n const name = `manual-${task.name}-${Date.now()}`;\n const agent = task.provider === \"custom\"\n ? await createTerminal({\n name,\n kind: \"scheduler\",\n provider: task.provider as \"custom\",\n projectId: task.projectId || undefined,\n projectPath: task.projectPath,\n customDisplayName: task.customDisplayName || undefined,\n customCommandTemplate: task.customCommandTemplate || undefined,\n customEnv: task.customEnv || undefined,\n skipPermissions: task.skipPermissions,\n })\n : await createAutoSpawnTerminal({\n name,\n kind: \"scheduler\",\n projectId: task.projectId || undefined,\n projectPath: task.projectPath,\n });\n\n await startTerminal(agent.id, task.prompt);\n updateScheduledTaskRecord(task.id, {\n lastRunAt: new Date().toISOString(),\n });\n\n return { ok: true, terminalId: agent.id };\n } catch (err) {\n return reply.status(500).send({\n error: err instanceof Error ? err.message : \"Failed to run task\",\n });\n }\n }\n );\n}\n", "import type { FastifyInstance } from \"fastify\";\nimport { resolveProjectContext } from \"../projects/project-service.js\";\nimport {\n createAutomationRecord,\n deleteAutomationRecord,\n getAutomationRecord,\n listAutomationRecords,\n listAutomationRunRecords,\n updateAutomationRecord,\n} from \"../state/sqlite.js\";\nimport { getProjectRecordById } from \"../state/projects.js\";\n\nfunction withProject(automation: ReturnType<typeof getAutomationRecord>) {\n if (!automation) return null;\n const project = automation.agentProjectId\n ? getProjectRecordById(automation.agentProjectId)\n : null;\n return {\n ...automation,\n project: project ? { id: project.id, name: project.name } : null,\n runs: listAutomationRunRecords(automation.id, 5),\n };\n}\n\nexport async function registerAutomationRoutes(app: FastifyInstance) {\n app.get(\"/api/automations\", async () => {\n const automations = listAutomationRecords().map((automation) => withProject(automation));\n return { automations };\n });\n\n app.get<{ Params: { id: string } }>(\n \"/api/automations/:id\",\n async (req, reply) => {\n const auto = getAutomationRecord(req.params.id);\n if (!auto) return reply.status(404).send({ error: \"Automation not found\" });\n return {\n automation: {\n ...withProject(auto),\n runs: listAutomationRunRecords(auto.id, 20),\n },\n };\n }\n );\n\n app.post(\"/api/automations\", async (req, reply) => {\n try {\n const body = req.body as {\n name: string;\n description?: string;\n sourceType: string;\n sourceConfig: Record<string, string>;\n triggerType?: string;\n agentProjectId?: string;\n agentProjectPath?: string;\n agentPromptTemplate: string;\n agentProvider?: string;\n agentCustomDisplayName?: string;\n agentCustomCommandTemplate?: string;\n agentCustomEnv?: Record<string, string>;\n agentSkipPermissions?: boolean;\n pollIntervalMinutes?: number;\n };\n\n if (\n !body.name ||\n !body.sourceType ||\n !body.sourceConfig ||\n !body.agentPromptTemplate\n ) {\n return reply.status(400).send({\n error:\n \"name, sourceType, sourceConfig, agentProjectId/agentProjectPath, and agentPromptTemplate are required\",\n });\n }\n\n const projectContext = await resolveProjectContext({\n projectId: body.agentProjectId,\n projectPath: body.agentProjectPath,\n });\n\n const automation = createAutomationRecord({\n name: body.name,\n description: body.description || null,\n enabled: true,\n sourceType: body.sourceType,\n sourceConfig: body.sourceConfig,\n triggerType: body.triggerType || \"on_new\",\n agentProjectId: projectContext.projectId,\n agentProjectPath: projectContext.projectPath,\n agentPromptTemplate: body.agentPromptTemplate,\n agentProvider: body.agentProvider || \"claude\",\n agentCustomDisplayName: body.agentCustomDisplayName || null,\n agentCustomCommandTemplate: body.agentCustomCommandTemplate || null,\n agentCustomEnv: body.agentCustomEnv || null,\n agentSkipPermissions: body.agentSkipPermissions ?? true,\n pollIntervalMinutes: body.pollIntervalMinutes || 5,\n lastPollAt: null,\n processedHashes: [],\n });\n\n return reply.status(201).send({ automation: withProject(automation) });\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to create automation\",\n });\n }\n });\n\n app.patch<{ Params: { id: string } }>(\n \"/api/automations/:id\",\n async (req, reply) => {\n try {\n const body = req.body as Record<string, unknown> & {\n agentProjectId?: string;\n agentProjectPath?: string;\n };\n const projectContext =\n body.agentProjectId || body.agentProjectPath\n ? await resolveProjectContext({\n projectId: body.agentProjectId,\n projectPath: body.agentProjectPath,\n })\n : null;\n\n const automation = updateAutomationRecord(req.params.id, {\n ...body,\n ...(projectContext\n ? {\n agentProjectId: projectContext.projectId,\n agentProjectPath: projectContext.projectPath,\n }\n : {}),\n });\n\n return { automation: withProject(automation) };\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to update automation\",\n });\n }\n }\n );\n\n app.delete<{ Params: { id: string } }>(\n \"/api/automations/:id\",\n async (req, reply) => {\n try {\n deleteAutomationRecord(req.params.id);\n return { ok: true };\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to delete automation\",\n });\n }\n }\n );\n\n app.get<{ Params: { id: string }; Querystring: { limit?: string } }>(\n \"/api/automations/:id/runs\",\n async (req) => {\n const limit = parseInt(req.query.limit || \"20\", 10);\n return { runs: listAutomationRunRecords(req.params.id, limit) };\n }\n );\n\n app.post<{ Params: { id: string } }>(\n \"/api/automations/:id/reset\",\n async (req, reply) => {\n try {\n updateAutomationRecord(req.params.id, {\n processedHashes: [],\n lastPollAt: null,\n });\n return { ok: true };\n } catch (err) {\n return reply.status(400).send({\n error: err instanceof Error ? err.message : \"Failed to reset\",\n });\n }\n }\n );\n}\n", "import crypto from \"crypto\";\nimport { createTerminal, startTerminal } from \"../agents/terminal-manager.js\";\nimport type { AgentProvider } from \"@maestro/wire\";\nimport {\n createAutomationRunRecord,\n listAutomationRecords,\n updateAutomationRecord,\n updateAutomationRunRecord,\n} from \"../state/sqlite.js\";\nimport { runGitHubApi } from \"../integrations/github.js\";\nimport type { AutomationRecord } from \"../state/types.js\";\n\nlet timer: ReturnType<typeof setInterval> | null = null;\n\nexport function startAutomationRunner() {\n timer = setInterval(tick, 60_000);\n console.log(\"Automation runner started (checking every 60s)\");\n}\n\nexport function stopAutomationRunner() {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n}\n\nasync function tick() {\n try {\n const automations = listAutomationRecords().filter((automation) => automation.enabled);\n const now = new Date();\n\n for (const auto of automations) {\n if (auto.lastPollAt) {\n const elapsed =\n (now.getTime() - new Date(auto.lastPollAt).getTime()) / 60_000;\n if (elapsed < auto.pollIntervalMinutes) continue;\n }\n\n await runAutomation(auto);\n }\n } catch (err) {\n console.error(\"Automation runner tick error:\", err);\n }\n}\n\nasync function runAutomation(auto: AutomationRecord) {\n const run = createAutomationRunRecord({\n automationId: auto.id,\n status: \"running\",\n itemsFound: 0,\n itemsProcessed: 0,\n error: null,\n agentId: null,\n startedAt: new Date().toISOString(),\n completedAt: null,\n });\n\n try {\n const items = await fetchItems(auto.sourceType, auto.sourceConfig);\n\n updateAutomationRunRecord(run.id, { itemsFound: items.length });\n\n let processed = 0;\n let processedHashes = [...auto.processedHashes];\n\n for (const item of items) {\n const hash = hashItem(item);\n if (processedHashes.includes(hash)) continue;\n\n const prompt = renderTemplate(auto.agentPromptTemplate, item);\n const agent = await createTerminal({\n name: `auto-${auto.name}-${Date.now()}`,\n kind: \"automation\",\n provider: auto.agentProvider as AgentProvider,\n projectId: auto.agentProjectId || undefined,\n projectPath: auto.agentProjectPath,\n customDisplayName: auto.agentCustomDisplayName || undefined,\n customCommandTemplate: auto.agentCustomCommandTemplate || undefined,\n customEnv: auto.agentCustomEnv || undefined,\n skipPermissions: auto.agentSkipPermissions,\n });\n\n await startTerminal(agent.id, prompt);\n\n processedHashes = [...processedHashes, hash];\n updateAutomationRecord(auto.id, {\n processedHashes,\n });\n\n processed += 1;\n updateAutomationRunRecord(run.id, {\n itemsProcessed: processed,\n agentId: agent.id,\n });\n }\n\n updateAutomationRecord(auto.id, {\n lastPollAt: new Date().toISOString(),\n processedHashes,\n });\n\n updateAutomationRunRecord(run.id, {\n status: \"completed\",\n completedAt: new Date().toISOString(),\n });\n\n if (processed > 0) {\n console.log(`Automation \"${auto.name}\": processed ${processed}/${items.length} items`);\n }\n } catch (err) {\n console.error(`Automation \"${auto.name}\" error:`, err);\n updateAutomationRunRecord(run.id, {\n status: \"error\",\n error: err instanceof Error ? err.message : String(err),\n completedAt: new Date().toISOString(),\n });\n }\n}\n\ninterface SourceItem {\n id: string;\n title: string;\n body: string;\n url: string;\n author?: string;\n labels?: string[];\n [key: string]: unknown;\n}\n\nasync function fetchItems(\n sourceType: string,\n config: Record<string, string>\n): Promise<SourceItem[]> {\n switch (sourceType) {\n case \"github_issues\":\n return fetchGitHubIssues(config);\n case \"github_prs\":\n return fetchGitHubPRs(config);\n case \"webhook\":\n return [];\n case \"rss\":\n return fetchRSS(config);\n default:\n console.warn(`Unknown source type: ${sourceType}`);\n return [];\n }\n}\n\nasync function fetchGitHubIssues(\n config: Record<string, string>\n): Promise<SourceItem[]> {\n const { owner, repo, token, state = \"open\", labels } = config;\n if (!owner || !repo) return [];\n\n const params = new URLSearchParams({ state, per_page: \"20\" });\n if (labels) params.set(\"labels\", labels);\n\n const data = runGitHubApi<\n Array<{\n number: number;\n title: string;\n body: string;\n html_url: string;\n user: { login: string };\n labels: Array<{ name: string }>;\n pull_request?: unknown;\n }>\n >(`repos/${owner}/${repo}/issues?${params.toString()}`, { token });\n\n return data\n .filter((item) => !item.pull_request)\n .map((item) => ({\n id: String(item.number),\n title: item.title,\n body: item.body || \"\",\n url: item.html_url,\n author: item.user.login,\n labels: item.labels.map((label) => label.name),\n }));\n}\n\nasync function fetchGitHubPRs(\n config: Record<string, string>\n): Promise<SourceItem[]> {\n const { owner, repo, token, state = \"open\" } = config;\n if (!owner || !repo) return [];\n\n const data = runGitHubApi<\n Array<{\n number: number;\n title: string;\n body: string;\n html_url: string;\n user: { login: string };\n labels: Array<{ name: string }>;\n }>\n >(`repos/${owner}/${repo}/pulls?state=${state}&per_page=20`, { token });\n\n return data.map((item) => ({\n id: String(item.number),\n title: item.title,\n body: item.body || \"\",\n url: item.html_url,\n author: item.user.login,\n labels: item.labels.map((label) => label.name),\n }));\n}\n\nasync function fetchRSS(\n config: Record<string, string>\n): Promise<SourceItem[]> {\n const { url } = config;\n if (!url) return [];\n\n const res = await fetch(url);\n if (!res.ok) return [];\n\n const xml = await res.text();\n const items: SourceItem[] = [];\n const itemRegex = /<item>([\\s\\S]*?)<\\/item>/g;\n let match: RegExpExecArray | null;\n\n while ((match = itemRegex.exec(xml)) !== null) {\n const content = match[1];\n const title = content.match(/<title>([\\s\\S]*?)<\\/title>/)?.[1] || \"\";\n const link = content.match(/<link>([\\s\\S]*?)<\\/link>/)?.[1] || \"\";\n const desc =\n content.match(/<description>([\\s\\S]*?)<\\/description>/)?.[1] || \"\";\n\n items.push({\n id: link || title,\n title: title.replace(/<!\\[CDATA\\[(.*?)\\]\\]>/, \"$1\"),\n body: desc.replace(/<!\\[CDATA\\[(.*?)\\]\\]>/, \"$1\"),\n url: link,\n });\n }\n\n return items;\n}\n\nfunction hashItem(item: SourceItem): string {\n return crypto\n .createHash(\"sha256\")\n .update(`${item.id}:${item.title}`)\n .digest(\"hex\")\n .slice(0, 16);\n}\n\nfunction renderTemplate(template: string, item: SourceItem): string {\n return template.replace(/\\{\\{\\s*item\\.(\\w+)\\s*\\}\\}/g, (_, key: string) => {\n const val = item[key];\n if (val == null) return \"\";\n if (Array.isArray(val)) return val.join(\", \");\n return String(val);\n });\n}\n", "import * as crypto from \"crypto\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport jwt from \"jsonwebtoken\";\nimport type { FastifyInstance, FastifyRequest, FastifyReply } from \"fastify\";\nimport { MAESTRO_DATA_DIR, ensureDataDir } from \"../state/files.js\";\n\nconst MAESTRO_DIR = MAESTRO_DATA_DIR;\nconst SECRET_PATH = path.join(MAESTRO_DIR, \"jwt-secret\");\nconst TOKEN_PATH = path.join(MAESTRO_DIR, \"token\");\nconst LEGACY_TOKEN_PATH = path.join(MAESTRO_DIR, \"api-token\");\n\nlet jwtSecret: string;\n\nfunction resolveTokenPath(): string {\n if (fs.existsSync(TOKEN_PATH)) {\n return TOKEN_PATH;\n }\n\n if (fs.existsSync(LEGACY_TOKEN_PATH)) {\n fs.renameSync(LEGACY_TOKEN_PATH, TOKEN_PATH);\n console.log(`Migrated API token path from ${LEGACY_TOKEN_PATH} to ${TOKEN_PATH}`);\n return TOKEN_PATH;\n }\n\n return TOKEN_PATH;\n}\n\n/**\n * Initialize auth \u2014 generate or load JWT secret and initial API token.\n * Returns the API token for display on first run.\n */\nexport function initAuth(): { apiToken: string } {\n ensureDataDir();\n\n // JWT secret\n if (fs.existsSync(SECRET_PATH)) {\n jwtSecret = fs.readFileSync(SECRET_PATH, \"utf-8\").trim();\n } else {\n jwtSecret = crypto.randomBytes(48).toString(\"base64\");\n fs.writeFileSync(SECRET_PATH, jwtSecret, { mode: 0o600 });\n }\n\n // API token (static bearer token for simple auth)\n let apiToken: string;\n const tokenPath = resolveTokenPath();\n if (fs.existsSync(tokenPath)) {\n apiToken = fs.readFileSync(tokenPath, \"utf-8\").trim();\n } else {\n apiToken = `sym_${crypto.randomBytes(32).toString(\"hex\")}`;\n fs.writeFileSync(tokenPath, apiToken, { mode: 0o600 });\n console.log(`\\nAPI token generated: ${apiToken}`);\n console.log(`Stored at: ${tokenPath}\\n`);\n }\n\n return { apiToken };\n}\n\n/**\n * Create a short-lived JWT for WebSocket auth.\n */\nexport function createSessionToken(payload: {\n sub?: string;\n scope?: string;\n}): string {\n return jwt.sign(payload, jwtSecret, { expiresIn: \"24h\" });\n}\n\n/**\n * Verify a JWT token.\n */\nexport function verifySessionToken(\n token: string\n): { sub?: string; scope?: string } | null {\n try {\n return jwt.verify(token, jwtSecret) as { sub?: string; scope?: string };\n } catch {\n return null;\n }\n}\n\n/**\n * Get the stored API token.\n */\nexport function getApiToken(): string {\n const tokenPath = resolveTokenPath();\n if (fs.existsSync(tokenPath)) {\n return fs.readFileSync(tokenPath, \"utf-8\").trim();\n }\n return \"\";\n}\n\n/**\n * Fastify auth middleware \u2014 checks Bearer token or skips for health endpoint.\n */\nexport function registerAuthHook(app: FastifyInstance) {\n const apiToken = getApiToken();\n\n // Skip auth if no token exists (dev mode) or AUTH_DISABLED=1\n if (!apiToken || process.env.AUTH_DISABLED === \"1\") {\n console.log(\"Auth: disabled (no token or AUTH_DISABLED=1)\");\n return;\n }\n\n app.addHook(\n \"onRequest\",\n async (request: FastifyRequest, reply: FastifyReply) => {\n // Skip auth for health and token exchange endpoints\n const url = request.url;\n if (url === \"/health\" || url === \"/api/auth/token\" || url === \"/api/webhooks/github\") {\n return;\n }\n\n const authHeader = request.headers.authorization;\n if (!authHeader) {\n return reply.status(401).send({ error: \"Missing authorization header\" });\n }\n\n const [scheme, token] = authHeader.split(\" \");\n\n if (scheme === \"Bearer\" && token === apiToken) {\n return; // Valid API token\n }\n\n if (scheme === \"Bearer\" && token) {\n // Try JWT\n const payload = verifySessionToken(token);\n if (payload) return;\n }\n\n return reply.status(401).send({ error: \"Invalid token\" });\n }\n );\n\n console.log(\"Auth: enabled (Bearer token required)\");\n}\n\n/**\n * Auth routes \u2014 exchange API token for session JWT, get token info.\n */\nexport async function registerAuthRoutes(app: FastifyInstance) {\n // Exchange API token for a session JWT (useful for WebSocket auth)\n app.post(\"/api/auth/token\", async (req, reply) => {\n const body = req.body as { apiToken?: string };\n const storedToken = getApiToken();\n\n if (!body.apiToken || body.apiToken !== storedToken) {\n return reply.status(401).send({ error: \"Invalid API token\" });\n }\n\n const sessionToken = createSessionToken({ scope: \"full\" });\n return { token: sessionToken, expiresIn: \"24h\" };\n });\n}\n", "import { listAutomationRecords } from \"../state/sqlite.js\";\nimport { listProjectRecords } from \"../state/projects.js\";\nimport { resolveGitHubToken } from \"../integrations/github.js\";\n\nexport interface RuntimeStatus {\n github: {\n tokenConfigured: boolean;\n githubProjectCount: number;\n githubAutomationCount: number;\n featuresEnabled: boolean;\n needsAuthWarning: boolean;\n warningMessage: string | null;\n };\n}\n\nexport function getRuntimeStatus(): RuntimeStatus {\n const githubProjectCount = listProjectRecords().filter(\n (project) => Boolean(project.githubOwner && project.githubRepo)\n ).length;\n const githubAutomationCount = listAutomationRecords().filter((automation) =>\n automation.sourceType === \"github_issues\" || automation.sourceType === \"github_prs\"\n ).length;\n const tokenConfigured = Boolean(resolveGitHubToken().token);\n const featuresEnabled = githubProjectCount > 0 || githubAutomationCount > 0;\n const needsAuthWarning = featuresEnabled && !tokenConfigured;\n\n return {\n github: {\n tokenConfigured,\n githubProjectCount,\n githubAutomationCount,\n featuresEnabled,\n needsAuthWarning,\n warningMessage: needsAuthWarning\n ? \"GitHub-backed projects or automations are configured, but GITHUB_TOKEN/GH_TOKEN is missing.\"\n : null,\n },\n };\n}\n", "import type { FastifyInstance } from \"fastify\";\nimport { getRuntimeStatus } from \"../runtime/runtime-status.js\";\n\nexport async function registerSystemRoutes(app: FastifyInstance) {\n app.get(\"/api/system/status\", async () => {\n return getRuntimeStatus();\n });\n}\n", "import type { FastifyInstance } from \"fastify\";\nimport {\n getClaudeAuthStatus,\n getCodexAuthStatus,\n startCodexDeviceAuth,\n connectCodexWithApiKey,\n} from \"../integrations/cli-auth.js\";\nimport {\n getCachedClaudeAuthStatus,\n getCachedCodexAuthStatus,\n refreshAuthStatus,\n} from \"../services/auth-status-checker.js\";\n\nexport async function registerCliAuthRoutes(app: FastifyInstance) {\n // \u2500\u2500\u2500 Claude Code \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n app.get(\"/api/integrations/claude/status\", async (req) => {\n const fresh = (req.query as Record<string, string>).fresh === \"1\";\n if (fresh) return getClaudeAuthStatus();\n return getCachedClaudeAuthStatus() ?? getClaudeAuthStatus();\n });\n\n // \u2500\u2500\u2500 Codex \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n app.get(\"/api/integrations/codex/status\", async (req) => {\n const fresh = (req.query as Record<string, string>).fresh === \"1\";\n if (fresh) return getCodexAuthStatus();\n return getCachedCodexAuthStatus() ?? getCodexAuthStatus();\n });\n\n // \u2500\u2500\u2500 Refresh all auth status \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n app.post(\"/api/integrations/auth/refresh\", async () => {\n await refreshAuthStatus();\n return { ok: true };\n });\n\n app.post(\"/api/integrations/codex/device-auth/start\", async (_req, reply) => {\n try {\n const result = await startCodexDeviceAuth();\n return result;\n } catch (error) {\n return reply.status(400).send({\n error: error instanceof Error ? error.message : \"Failed to start codex device auth\",\n });\n }\n });\n\n app.post(\"/api/integrations/codex/connect-api-key\", async (req, reply) => {\n try {\n const body = req.body as { apiKey?: string };\n if (!body.apiKey?.trim()) {\n return reply.status(400).send({ error: \"API key is required\" });\n }\n const status = connectCodexWithApiKey(body.apiKey.trim());\n return status;\n } catch (error) {\n return reply.status(400).send({\n error: error instanceof Error ? error.message : \"Failed to connect with API key\",\n });\n }\n });\n}\n", "import type { FastifyInstance } from \"fastify\";\nimport {\n connectGitHubToken,\n disconnectGitHubToken,\n getGitHubConnectionStatus,\n searchGitHubRepositories,\n} from \"../integrations/github.js\";\nimport { getCachedGitHubConnectionStatus } from \"../services/auth-status-checker.js\";\n\nexport async function registerGitHubIntegrationRoutes(app: FastifyInstance) {\n app.get(\"/api/integrations/github\", async (req) => {\n const fresh = (req.query as Record<string, string>).fresh === \"1\";\n if (fresh) {\n const github = await getGitHubConnectionStatus();\n return { github };\n }\n const cached = getCachedGitHubConnectionStatus();\n const github = cached ?? await getGitHubConnectionStatus();\n return { github };\n });\n\n app.post(\"/api/integrations/github/connect\", async (req, reply) => {\n try {\n const body = req.body as { token?: string };\n const github = await connectGitHubToken(body.token ?? \"\");\n return { github };\n } catch (error) {\n return reply.status(400).send({\n error: error instanceof Error ? error.message : \"Failed to connect GitHub\",\n });\n }\n });\n\n app.delete(\"/api/integrations/github/connect\", async () => {\n const github = disconnectGitHubToken();\n return { ok: true, github };\n });\n\n app.get<{ Querystring: { q?: string } }>(\n \"/api/integrations/github/repos\",\n async (req, reply) => {\n try {\n const repos = await searchGitHubRepositories(req.query.q ?? \"\");\n return { repos };\n } catch (error) {\n return reply.status(400).send({\n error: error instanceof Error ? error.message : \"Failed to load repositories\",\n });\n }\n }\n );\n}\n", "import crypto from \"crypto\";\nimport type { FastifyInstance } from \"fastify\";\nimport type { Server as SocketServer } from \"socket.io\";\nimport {\n handleGitHubIssueWebhookEvent,\n handleGitHubPullRequestWebhookEvent,\n handleGitHubPullRequestReviewCommentWebhookEvent,\n handleGitHubPullRequestReviewWebhookEvent,\n} from \"../state/kanban.js\";\nimport { findProjectRecordByGitHubRepo } from \"../state/projects.js\";\n\ninterface GitHubWebhookBody {\n action?: string;\n repository?: {\n name?: string;\n owner?: {\n login?: string;\n };\n };\n issue?: {\n number: number;\n pull_request?: unknown;\n };\n pull_request?: {\n number: number;\n html_url: string;\n body?: string | null;\n merged?: boolean;\n };\n review?: {\n state?: string | null;\n body?: string | null;\n };\n}\n\nfunction verifySignature(rawBody: Buffer, signature: string, secret: string): boolean {\n const expected = `sha256=${crypto\n .createHmac(\"sha256\", secret)\n .update(rawBody)\n .digest(\"hex\")}`;\n\n const expectedBuffer = Buffer.from(expected);\n const providedBuffer = Buffer.from(signature);\n if (expectedBuffer.length !== providedBuffer.length) {\n return false;\n }\n\n return crypto.timingSafeEqual(expectedBuffer, providedBuffer);\n}\n\nexport async function registerWebhookRoutes(app: FastifyInstance, io: SocketServer) {\n app.post(\"/api/webhooks/github\", async (req, reply) => {\n const secret = process.env.GITHUB_WEBHOOK_SECRET?.trim();\n if (!secret) {\n return reply.status(503).send({\n error: \"GITHUB_WEBHOOK_SECRET is not configured\",\n });\n }\n\n const signature = req.headers[\"x-hub-signature-256\"];\n if (typeof signature !== \"string\" || !req.rawBody) {\n return reply.status(401).send({ error: \"Missing GitHub signature\" });\n }\n\n if (!verifySignature(req.rawBody, signature, secret)) {\n return reply.status(401).send({ error: \"Invalid GitHub signature\" });\n }\n\n const event = req.headers[\"x-github-event\"];\n if (event === \"ping\") {\n return { ok: true, event: \"ping\" };\n }\n\n const body = req.body as GitHubWebhookBody;\n const owner = body.repository?.owner?.login;\n const repo = body.repository?.name;\n if (!owner || !repo) {\n return { ok: true, ignored: true, reason: \"Repository payload missing\" };\n }\n\n const project = findProjectRecordByGitHubRepo(owner, repo);\n if (!project) {\n return { ok: true, ignored: true, reason: \"No matching project\" };\n }\n\n if (event === \"issues\" && body.issue && !body.issue.pull_request) {\n const result = handleGitHubIssueWebhookEvent(\n project.id,\n body.action ?? \"\",\n body.issue.number\n );\n io.emit(\"kanban:updated\", { taskId: result.taskId });\n return { ok: true, handled: true, projectId: project.id, taskId: result.taskId };\n }\n\n if (event === \"pull_request\" && body.pull_request) {\n const result = handleGitHubPullRequestWebhookEvent(project.id, body.action ?? \"\", {\n number: body.pull_request.number,\n htmlUrl: body.pull_request.html_url,\n body: body.pull_request.body,\n merged: body.pull_request.merged,\n });\n\n if (result.taskId) {\n io.emit(\"kanban:updated\", { taskId: result.taskId });\n }\n\n return {\n ok: true,\n handled: Boolean(result.taskId),\n projectId: project.id,\n taskId: result.taskId,\n };\n }\n\n if (event === \"pull_request_review\" && body.pull_request) {\n const result = await handleGitHubPullRequestReviewWebhookEvent(\n project.id,\n body.action ?? \"\",\n {\n state: body.review?.state,\n },\n {\n body: body.pull_request.body,\n }\n );\n\n if (result.taskId) {\n io.emit(\"kanban:updated\", { taskId: result.taskId });\n }\n\n return {\n ok: true,\n handled: Boolean(result.taskId),\n projectId: project.id,\n taskId: result.taskId,\n };\n }\n\n if (event === \"pull_request_review_comment\" && body.pull_request) {\n const result = await handleGitHubPullRequestReviewCommentWebhookEvent(\n project.id,\n body.action ?? \"\",\n {\n body: body.pull_request.body,\n }\n );\n\n if (result.taskId) {\n io.emit(\"kanban:updated\", { taskId: result.taskId });\n }\n\n return {\n ok: true,\n handled: Boolean(result.taskId),\n projectId: project.id,\n taskId: result.taskId,\n };\n }\n\n return { ok: true, ignored: true, reason: `Unhandled event: ${String(event ?? \"unknown\")}` };\n });\n}\n", "import type { FastifyInstance } from \"fastify\";\nimport { SettingsUpdateSchema } from \"@maestro/wire\";\nimport { getSettings, updateSettings } from \"../state/settings.js\";\nimport {\n getUpdateStatus,\n checkForUpdates,\n performUpdate,\n restartAutoUpdater,\n} from \"../services/auto-updater.js\";\nimport { writePiModelsConfig } from \"../services/ollama.js\";\n\nexport async function registerSettingsRoutes(app: FastifyInstance) {\n // Get current settings\n app.get(\"/api/settings\", async () => {\n return getSettings();\n });\n\n // Update settings\n app.patch(\"/api/settings\", async (req, reply) => {\n const parsed = SettingsUpdateSchema.safeParse(req.body);\n if (!parsed.success) {\n return reply.status(400).send({ error: parsed.error.flatten() });\n }\n\n const settings = updateSettings(parsed.data);\n\n // Restart the auto-updater timer if settings changed\n restartAutoUpdater();\n\n // Write Pi's models.json when Ollama model is configured\n if (parsed.data.piOllamaModel) {\n writePiModelsConfig(parsed.data.piOllamaModel);\n }\n\n return settings;\n });\n\n // Get Deepgram API key for client-side voice input\n app.get(\"/api/settings/deepgram-key\", async (_req, reply) => {\n const settings = getSettings();\n if (!settings.deepgramApiKey) {\n return reply.status(404).send({ error: \"Deepgram API key not configured\" });\n }\n return { apiKey: settings.deepgramApiKey };\n });\n\n // Get update status (installed versions, available updates)\n app.get(\"/api/settings/update-status\", async () => {\n return getUpdateStatus();\n });\n\n // Manually check for updates (does not install)\n app.post(\"/api/settings/check-updates\", async () => {\n await checkForUpdates();\n return getUpdateStatus();\n });\n\n // Manually trigger update now\n app.post(\"/api/settings/update-now\", async () => {\n const result = await performUpdate();\n return {\n ...result,\n status: getUpdateStatus(),\n };\n });\n}\n", "import { execSync } from \"child_process\";\nimport { getSettings } from \"../state/settings.js\";\nimport type { UpdateStatus } from \"@maestro/wire\";\n\nlet checkTimer: ReturnType<typeof setInterval> | null = null;\nlet updating = false;\nlet lastCheckAt: string | null = null;\nlet lastUpdateAt: string | null = null;\nlet lastError: string | null = null;\n\nlet cachedStatus: {\n claude: { current: string | null; latest: string | null };\n codex: { current: string | null; latest: string | null };\n gh: { current: string | null; latest: string | null };\n} = {\n claude: { current: null, latest: null },\n codex: { current: null, latest: null },\n gh: { current: null, latest: null },\n};\n\nfunction run(cmd: string): string {\n try {\n return execSync(cmd, { encoding: \"utf8\", timeout: 60_000 }).trim();\n } catch {\n return \"\";\n }\n}\n\nfunction getInstalledVersionViaCli(binary: string): string | null {\n const output = run(`${binary} --version 2>/dev/null`);\n if (!output) return null;\n // Extract version number from output like \"2.1.72 (Claude Code)\" or \"codex-cli 0.114.0\"\n const match = output.match(/(\\d+\\.\\d+\\.\\d+(?:-[\\w.]+)?)/);\n return match?.[1] ?? null;\n}\n\nfunction getInstalledVersion(pkg: string, binary: string): string | null {\n // First try the CLI binary directly \u2014 works regardless of install method\n const cliVersion = getInstalledVersionViaCli(binary);\n if (cliVersion) return cliVersion;\n\n // Fallback to npm list for npm-global installs\n const output = run(`npm list -g ${pkg} --depth=0 --json 2>/dev/null`);\n if (!output) return null;\n try {\n const data = JSON.parse(output);\n return data.dependencies?.[pkg]?.version ?? null;\n } catch {\n return null;\n }\n}\n\nfunction getLatestVersion(pkg: string): string | null {\n const output = run(`npm view ${pkg} version 2>/dev/null`);\n return output || null;\n}\n\nfunction getGhLatestVersion(): string | null {\n const output = run(`gh api repos/cli/cli/releases/latest --jq '.tag_name' 2>/dev/null`);\n if (!output) return null;\n const match = output.match(/(\\d+\\.\\d+\\.\\d+(?:-[\\w.]+)?)/);\n return match?.[1] ?? null;\n}\n\nfunction updatePackage(pkg: string, binary: string): { success: boolean; version: string | null; error: string | null } {\n try {\n execSync(`npm install -g ${pkg}@latest`, {\n encoding: \"utf8\",\n timeout: 120_000,\n stdio: \"pipe\",\n });\n const newVersion = getInstalledVersion(pkg, binary);\n return { success: true, version: newVersion, error: null };\n } catch (err) {\n return {\n success: false,\n version: null,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\nexport async function checkForUpdates(): Promise<void> {\n if (updating) return;\n\n try {\n const claudeCurrent = getInstalledVersion(\"@anthropic-ai/claude-code\", \"claude\");\n const claudeLatest = getLatestVersion(\"@anthropic-ai/claude-code\");\n const codexCurrent = getInstalledVersion(\"@openai/codex\", \"codex\");\n const codexLatest = getLatestVersion(\"@openai/codex\");\n const ghCurrent = getInstalledVersionViaCli(\"gh\");\n const ghLatest = getGhLatestVersion();\n\n cachedStatus = {\n claude: { current: claudeCurrent, latest: claudeLatest },\n codex: { current: codexCurrent, latest: codexLatest },\n gh: { current: ghCurrent, latest: ghLatest },\n };\n\n lastCheckAt = new Date().toISOString();\n lastError = null;\n } catch (err) {\n lastError = err instanceof Error ? err.message : String(err);\n }\n}\n\nexport async function performUpdate(): Promise<{ claude: string | null; codex: string | null; errors: string[] }> {\n if (updating) {\n return { claude: null, codex: null, errors: [\"Update already in progress\"] };\n }\n\n updating = true;\n const errors: string[] = [];\n let claudeVersion: string | null = null;\n let codexVersion: string | null = null;\n\n try {\n // Update Claude Code\n const claudeResult = updatePackage(\"@anthropic-ai/claude-code\", \"claude\");\n if (claudeResult.success) {\n claudeVersion = claudeResult.version;\n console.log(`[auto-updater] Claude Code updated to ${claudeVersion}`);\n } else if (claudeResult.error) {\n errors.push(`Claude Code: ${claudeResult.error}`);\n console.error(`[auto-updater] Failed to update Claude Code: ${claudeResult.error}`);\n }\n\n // Update Codex\n const codexResult = updatePackage(\"@openai/codex\", \"codex\");\n if (codexResult.success) {\n codexVersion = codexResult.version;\n console.log(`[auto-updater] Codex updated to ${codexVersion}`);\n } else if (codexResult.error) {\n errors.push(`Codex: ${codexResult.error}`);\n console.error(`[auto-updater] Failed to update Codex: ${codexResult.error}`);\n }\n\n lastUpdateAt = new Date().toISOString();\n lastError = errors.length > 0 ? errors.join(\"; \") : null;\n\n // Refresh cached versions\n await checkForUpdates();\n } finally {\n updating = false;\n }\n\n return { claude: claudeVersion, codex: codexVersion, errors };\n}\n\nasync function tick(): Promise<void> {\n const settings = getSettings();\n if (!settings.autoUpdateEnabled) return;\n\n console.log(\"[auto-updater] Checking for updates...\");\n await checkForUpdates();\n\n const claudeNeedsUpdate =\n cachedStatus.claude.current &&\n cachedStatus.claude.latest &&\n cachedStatus.claude.current !== cachedStatus.claude.latest;\n\n const codexNeedsUpdate =\n cachedStatus.codex.current &&\n cachedStatus.codex.latest &&\n cachedStatus.codex.current !== cachedStatus.codex.latest;\n\n if (claudeNeedsUpdate || codexNeedsUpdate) {\n console.log(\"[auto-updater] Updates available, installing...\");\n await performUpdate();\n } else {\n console.log(\"[auto-updater] All packages are up to date.\");\n }\n}\n\nexport function getUpdateStatus(): UpdateStatus {\n const claudeUpdateAvailable =\n cachedStatus.claude.current !== null &&\n cachedStatus.claude.latest !== null &&\n cachedStatus.claude.current !== cachedStatus.claude.latest;\n\n const codexUpdateAvailable =\n cachedStatus.codex.current !== null &&\n cachedStatus.codex.latest !== null &&\n cachedStatus.codex.current !== cachedStatus.codex.latest;\n\n const ghUpdateAvailable =\n cachedStatus.gh.current !== null &&\n cachedStatus.gh.latest !== null &&\n cachedStatus.gh.current !== cachedStatus.gh.latest;\n\n return {\n lastCheckAt,\n lastUpdateAt,\n claudeCode: {\n currentVersion: cachedStatus.claude.current,\n latestVersion: cachedStatus.claude.latest,\n updateAvailable: claudeUpdateAvailable,\n },\n codex: {\n currentVersion: cachedStatus.codex.current,\n latestVersion: cachedStatus.codex.latest,\n updateAvailable: codexUpdateAvailable,\n },\n gh: {\n currentVersion: cachedStatus.gh.current,\n latestVersion: cachedStatus.gh.latest,\n updateAvailable: ghUpdateAvailable,\n },\n updating,\n lastError,\n };\n}\n\nexport function startAutoUpdater(): void {\n const settings = getSettings();\n const intervalMs = settings.autoUpdateIntervalHours * 60 * 60 * 1000;\n\n // Do an initial check shortly after startup\n setTimeout(() => tick(), 10_000);\n\n // Schedule recurring checks\n checkTimer = setInterval(() => tick(), intervalMs);\n\n console.log(\n `[auto-updater] Started (enabled: ${settings.autoUpdateEnabled}, interval: ${settings.autoUpdateIntervalHours}h)`\n );\n}\n\nexport function restartAutoUpdater(): void {\n stopAutoUpdater();\n startAutoUpdater();\n}\n\nexport function stopAutoUpdater(): void {\n if (checkTimer) {\n clearInterval(checkTimer);\n checkTimer = null;\n }\n}\n", "import { mkdirSync, writeFileSync, readFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { OllamaModelInfo } from \"@maestro/wire\";\n\nconst OLLAMA_HOST = process.env.OLLAMA_HOST || \"http://localhost:11434\";\nconst PI_MODELS_PATH = join(homedir(), \".pi\", \"agent\", \"models.json\");\n\nexport async function getOllamaStatus(): Promise<{ running: boolean; host: string }> {\n try {\n const res = await fetch(`${OLLAMA_HOST}/api/version`);\n return { running: res.ok, host: OLLAMA_HOST };\n } catch {\n return { running: false, host: OLLAMA_HOST };\n }\n}\n\nexport async function listOllamaModels(): Promise<OllamaModelInfo[]> {\n const res = await fetch(`${OLLAMA_HOST}/api/tags`);\n if (!res.ok) throw new Error(`Ollama returned ${res.status}`);\n const data = (await res.json()) as { models: Array<{ name: string; size: number; digest: string; modified_at: string }> };\n return (data.models || []).map((m) => ({\n name: m.name,\n size: m.size,\n digest: m.digest,\n modifiedAt: m.modified_at,\n }));\n}\n\n// Available models to offer for download\nexport const RECOMMENDED_MODELS = [\n \"qwen3:4b\",\n \"qwen3:2b\",\n \"qwen3:9b-q4_K_M\",\n \"llama3.1:8b-q4_K_M\",\n \"llama3.2:3b\",\n];\n\n// Pull state tracking\ninterface PullState {\n model: string;\n status: string;\n progress: number; // 0-100\n error: string | null;\n done: boolean;\n}\n\nlet activePull: PullState | null = null;\n\nexport function getPullStatus(): PullState | null {\n return activePull;\n}\n\nexport async function pullOllamaModel(modelName: string): Promise<void> {\n if (activePull && !activePull.done) {\n throw new Error(`Already pulling model: ${activePull.model}`);\n }\n\n activePull = { model: modelName, status: \"starting\", progress: 0, error: null, done: false };\n\n try {\n const res = await fetch(`${OLLAMA_HOST}/api/pull`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ name: modelName, stream: true }),\n });\n\n if (!res.ok) {\n const body = await res.text();\n throw new Error(`Ollama pull failed: ${res.status} ${body}`);\n }\n\n const reader = res.body?.getReader();\n if (!reader) throw new Error(\"No response body\");\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const msg = JSON.parse(line) as {\n status: string;\n digest?: string;\n total?: number;\n completed?: number;\n error?: string;\n };\n\n if (msg.error) {\n activePull!.error = msg.error;\n activePull!.status = \"error\";\n activePull!.done = true;\n return;\n }\n\n activePull!.status = msg.status;\n if (msg.total && msg.completed) {\n activePull!.progress = Math.round((msg.completed / msg.total) * 100);\n }\n if (msg.status === \"success\") {\n activePull!.progress = 100;\n activePull!.done = true;\n }\n } catch {\n // ignore parse errors on partial lines\n }\n }\n }\n\n // If we didn't get a success message, mark as done anyway\n if (!activePull!.done) {\n activePull!.done = true;\n activePull!.progress = 100;\n activePull!.status = \"success\";\n }\n } catch (err) {\n activePull!.error = err instanceof Error ? err.message : String(err);\n activePull!.status = \"error\";\n activePull!.done = true;\n }\n}\n\n/**\n * Write/update ~/.pi/agent/models.json so Pi knows about the selected Ollama model.\n * Preserves any existing non-ollama providers in the config.\n */\nexport function writePiModelsConfig(modelId: string): void {\n const dir = join(homedir(), \".pi\", \"agent\");\n mkdirSync(dir, { recursive: true });\n\n // Read existing config to preserve other providers\n let existing: Record<string, unknown> = {};\n if (existsSync(PI_MODELS_PATH)) {\n try {\n existing = JSON.parse(readFileSync(PI_MODELS_PATH, \"utf-8\"));\n } catch {\n // Corrupted file, start fresh\n }\n }\n\n const providers = (existing.providers ?? {}) as Record<string, unknown>;\n\n // Set/overwrite the ollama provider with the selected model\n providers.ollama = {\n baseUrl: `${OLLAMA_HOST}/v1`,\n api: \"openai-completions\",\n apiKey: \"ollama\",\n compat: {\n supportsDeveloperRole: false,\n supportsReasoningEffort: false,\n },\n models: [{ id: modelId }],\n };\n\n const config = { ...existing, providers };\n writeFileSync(PI_MODELS_PATH, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n}\n", "import type {\n DeploymentRedeployResponse,\n DeploymentUpdateStatus,\n} from \"@maestro/wire\";\n\nfunction getUpdaterConfig():\n | {\n url: string;\n token: string | null;\n }\n | null {\n const url = process.env.UPDATER_URL?.trim();\n const token = process.env.UPDATER_TOKEN?.trim();\n if (!url) {\n return null;\n }\n\n return {\n url: url.replace(/\\/+$/g, \"\"),\n token: token || null,\n };\n}\n\nfunction getDisabledStatus(message?: string): DeploymentUpdateStatus {\n return {\n configured: false,\n currentVersion: null,\n latestVersion: null,\n updateAvailable: false,\n updating: false,\n lastCheckedAt: null,\n lastUpdatedAt: null,\n lastError: message ?? null,\n latestRelease: null,\n };\n}\n\nasync function requestUpdater<T>(\n path: string,\n init?: RequestInit & { timeoutMs?: number }\n): Promise<T> {\n const config = getUpdaterConfig();\n if (!config) {\n throw new Error(\"Deployment updater is not configured\");\n }\n\n const res = await fetch(`${config.url}${path}`, {\n ...init,\n headers: {\n ...(config.token ? { Authorization: `Bearer ${config.token}` } : {}),\n ...(init?.body != null ? { \"Content-Type\": \"application/json\" } : {}),\n ...init?.headers,\n },\n signal: AbortSignal.timeout(init?.timeoutMs ?? 15_000),\n });\n\n const body = (await res.json().catch(() => ({}))) as Record<string, unknown>;\n if (!res.ok) {\n throw new Error(\n typeof body.error === \"string\" ? body.error : `Updater request failed (${res.status})`\n );\n }\n\n return body as T;\n}\n\nexport async function getDeploymentUpdateStatus(): Promise<DeploymentUpdateStatus> {\n const config = getUpdaterConfig();\n if (!config) {\n return getDisabledStatus(\n \"Set UPDATER_URL on the Maestro server to enable release redeploys. UPDATER_TOKEN is optional on the internal network.\"\n );\n }\n\n try {\n return await requestUpdater<DeploymentUpdateStatus>(\"/status\");\n } catch (error) {\n return {\n configured: true,\n currentVersion: null,\n latestVersion: null,\n updateAvailable: false,\n updating: false,\n lastCheckedAt: null,\n lastUpdatedAt: null,\n lastError:\n error instanceof Error ? error.message : \"Failed to reach the deployment updater\",\n latestRelease: null,\n };\n }\n}\n\nexport async function checkDeploymentUpdateStatus(): Promise<DeploymentUpdateStatus> {\n const config = getUpdaterConfig();\n if (!config) {\n return getDisabledStatus(\n \"Set UPDATER_URL on the Maestro server to enable release redeploys. UPDATER_TOKEN is optional on the internal network.\"\n );\n }\n\n return requestUpdater<DeploymentUpdateStatus>(\"/check\", {\n method: \"POST\",\n });\n}\n\nexport async function triggerDeploymentRedeploy(\n tag?: string\n): Promise<DeploymentRedeployResponse> {\n return requestUpdater<DeploymentRedeployResponse>(\"/redeploy\", {\n method: \"POST\",\n body: JSON.stringify(tag ? { tag } : {}),\n timeoutMs: 30_000,\n });\n}\n", "import type { FastifyInstance } from \"fastify\";\nimport {\n checkDeploymentUpdateStatus,\n getDeploymentUpdateStatus,\n triggerDeploymentRedeploy,\n} from \"../services/deployment-updater.js\";\n\nexport async function registerDeploymentRoutes(app: FastifyInstance) {\n app.get(\"/api/deployment/update-status\", async () => {\n return getDeploymentUpdateStatus();\n });\n\n app.post(\"/api/deployment/check\", async () => {\n return checkDeploymentUpdateStatus();\n });\n\n app.post(\"/api/deployment/redeploy\", async (req, reply) => {\n try {\n const body = req.body as { tag?: string } | undefined;\n return await triggerDeploymentRedeploy(body?.tag);\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Failed to trigger redeploy\";\n const status =\n /not configured/i.test(message) || /missing/i.test(message) ? 400 : 502;\n return reply.status(status).send({ error: message });\n }\n });\n}\n", "import type { FastifyInstance } from \"fastify\";\n\nexport async function registerSetupRoutes(app: FastifyInstance) {\n // Setup flow is currently disabled \u2014 always report setup as complete.\n app.get(\"/api/setup/status\", async () => ({\n needsSetup: false,\n running: false,\n }));\n\n app.post(\"/api/setup/reset\", async () => {\n return { ok: true };\n });\n}\n", "import type { FastifyInstance } from \"fastify\";\nimport {\n getOllamaStatus,\n listOllamaModels,\n pullOllamaModel,\n getPullStatus,\n RECOMMENDED_MODELS,\n} from \"../services/ollama.js\";\n\nexport async function registerOllamaRoutes(app: FastifyInstance) {\n // Ollama connection status\n app.get(\"/api/ollama/status\", async () => {\n return getOllamaStatus();\n });\n\n // List locally available models\n app.get(\"/api/ollama/models\", async (_req, reply) => {\n try {\n const models = await listOllamaModels();\n return { models };\n } catch (err) {\n return reply.status(502).send({\n error: err instanceof Error ? err.message : \"Cannot reach Ollama\",\n });\n }\n });\n\n // List recommended models for download\n app.get(\"/api/ollama/recommended\", async () => {\n return { models: RECOMMENDED_MODELS };\n });\n\n // Pull (download) a model \u2014 async, returns immediately\n app.post(\"/api/ollama/pull\", async (req, reply) => {\n const { model } = req.body as { model?: string };\n if (!model || typeof model !== \"string\") {\n return reply.status(400).send({ error: \"model is required\" });\n }\n try {\n // Fire and forget \u2014 client polls /api/ollama/pull/status\n void pullOllamaModel(model);\n return { ok: true, model };\n } catch (err) {\n return reply.status(409).send({\n error: err instanceof Error ? err.message : \"Pull failed\",\n });\n }\n });\n\n // Poll pull progress\n app.get(\"/api/ollama/pull/status\", async () => {\n return getPullStatus() ?? { model: null, status: \"idle\", progress: 0, error: null, done: true };\n });\n}\n", "/**\n * Shared system prompt extensions for Pi agent across all channels (Telegram, WhatsApp, etc.)\n * Channel-independent \u2014 appended to the default Pi SDK prompt to preserve tool/skill sections.\n *\n * Uses appendSystemPromptOverride (Option 2) so the default Pi prompt with tool descriptions,\n * guidelines, context files, and skills is kept intact.\n */\n\n/**\n * Returns additional prompt sections to append to the default Pi system prompt.\n * The `base` parameter contains any existing append sections (e.g. from APPEND_SYSTEM.md).\n * We prepend our personality/behavior instructions so they appear right after the default prompt.\n */\nexport function buildAppendSections(base: string[]): string[] {\n return [\n `## Personality & Behavior\n\nYou are a friendly, conversational AI assistant. You communicate via messaging (Telegram, WhatsApp, etc.).\n\n### Conversation style\n- Be warm, natural, and concise. Write like a helpful friend, not a manual.\n- Greet users back naturally when they greet you.\n- Use short paragraphs. Avoid walls of text \u2014 this is chat, not a document.\n- If you don't know something, say so honestly.\n- Ask for clarification when the request is ambiguous.\n\n### When to use tools\n- For casual chat (greetings, questions, advice), just respond with text. No tool calls needed.\n- For coding, technical, or file-related requests, use your tools to explore and help.\n- State your intent before making tool calls, but never predict or claim results before receiving them.\n- Before modifying a file, always read it first. Do not assume files or directories exist.\n- If a tool call fails, analyze the error before retrying with a different approach.`,\n ...base,\n ];\n}\n", "import * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport type { Server as SocketServer } from \"socket.io\";\nimport makeWASocket, {\n useMultiFileAuthState,\n DisconnectReason,\n fetchLatestBaileysVersion,\n makeCacheableSignalKeyStore,\n} from \"@whiskeysockets/baileys\";\nimport type { WASocket } from \"@whiskeysockets/baileys\";\nimport { Boom } from \"@hapi/boom\";\nimport * as QRCode from \"qrcode\";\nimport type { WhatsAppConnectionStatus } from \"@maestro/wire\";\n\nconst DATA_DIR = path.join(os.homedir(), \".maestro\");\nconst AUTH_DIR = path.join(DATA_DIR, \"whatsapp-auth\");\n\nlet sock: WASocket | null = null;\nlet io: SocketServer | null = null;\nlet connectionStatus: WhatsAppConnectionStatus = \"disconnected\";\nlet currentQrCode: string | null = null;\nlet currentQrRaw: string | null = null;\nlet reconnectAttempts = 0;\nlet reconnectTimer: ReturnType<typeof setTimeout> | null = null;\nlet messageCallback: ((chatJid: string, messageId: string, body: string, senderName: string) => void) | null = null;\n\nfunction getAllowedJids(): string[] {\n const raw = process.env.WHATSAPP_ALLOWED_JIDS || \"\";\n return raw.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n\nfunction isJidAllowed(jid: string): boolean {\n const allowed = getAllowedJids();\n if (allowed.length === 0) return true;\n return allowed.some((a) => jid.includes(a));\n}\n\nfunction setStatus(status: WhatsAppConnectionStatus) {\n connectionStatus = status;\n io?.emit(\"whatsapp:status\", { status });\n}\n\nexport function onWhatsAppMessage(\n cb: (chatJid: string, messageId: string, body: string, senderName: string) => void\n) {\n messageCallback = cb;\n}\n\nexport async function startWhatsApp(socketIo: SocketServer): Promise<void> {\n io = socketIo;\n\n if (sock) {\n console.log(\"[whatsapp] Already connected, skipping start\");\n return;\n }\n\n setStatus(\"connecting\");\n reconnectAttempts = 0;\n\n await connectBaileys();\n}\n\nasync function connectBaileys(): Promise<void> {\n try {\n const { state, saveCreds } = await useMultiFileAuthState(AUTH_DIR);\n const { version } = await fetchLatestBaileysVersion();\n\n sock = makeWASocket({\n version,\n auth: {\n creds: state.creds,\n keys: makeCacheableSignalKeyStore(state.keys, undefined as any),\n },\n generateHighQualityLinkPreview: false,\n });\n\n sock.ev.on(\"creds.update\", saveCreds);\n\n sock.ev.on(\"connection.update\", (update) => {\n const { connection, lastDisconnect, qr } = update;\n\n if (qr) {\n setStatus(\"qr_pending\");\n currentQrRaw = qr;\n QRCode.toDataURL(qr)\n .then((url: string) => {\n currentQrCode = url;\n io?.emit(\"whatsapp:qr\", { qrCode: url });\n })\n .catch((err: unknown) => {\n console.error(\"[whatsapp] Failed to generate QR code:\", err);\n });\n QRCode.toString(qr, { type: \"terminal\", small: true, margin: 1 })\n .then((ascii: string) => {\n console.log(\"[whatsapp] Scan this QR code with WhatsApp:\\n\" + ascii);\n console.log(\"[whatsapp] If the QR code above doesn't work, use this code manually:\\n\" + qr);\n })\n .catch(() => {});\n }\n\n if (connection === \"close\") {\n sock = null;\n currentQrCode = null;\n currentQrRaw = null;\n\n const statusCode = (lastDisconnect?.error as Boom)?.output?.statusCode;\n const loggedOut = statusCode === DisconnectReason.loggedOut;\n\n if (loggedOut) {\n console.log(\"[whatsapp] Logged out \u2014 clearing auth state\");\n setStatus(\"disconnected\");\n reconnectAttempts = 0;\n return;\n }\n\n const isQrTimeout = statusCode === DisconnectReason.timedOut || statusCode === 515;\n if (isQrTimeout) {\n console.log(\"[whatsapp] QR expired, reconnecting immediately for a fresh code...\");\n setStatus(\"connecting\");\n reconnectTimer = setTimeout(() => connectBaileys(), 1000);\n return;\n }\n\n reconnectAttempts++;\n const delay = Math.min(1000 * Math.pow(2, reconnectAttempts), 60000);\n console.log(`[whatsapp] Connection closed (code=${statusCode}), reconnecting in ${delay}ms...`);\n setStatus(\"connecting\");\n reconnectTimer = setTimeout(() => connectBaileys(), delay);\n }\n\n if (connection === \"open\") {\n console.log(\"[whatsapp] Connected successfully\");\n setStatus(\"connected\");\n currentQrCode = null;\n currentQrRaw = null;\n reconnectAttempts = 0;\n }\n });\n\n sock.ev.on(\"messages.upsert\", (m) => {\n if (m.type !== \"notify\") return;\n\n for (const msg of m.messages) {\n const text =\n msg.message?.conversation ||\n msg.message?.extendedTextMessage?.text;\n if (!text) continue;\n\n const chatJid = msg.key.remoteJid;\n if (!chatJid) continue;\n\n if (!isJidAllowed(chatJid)) {\n console.log(`[whatsapp] Ignoring message from non-allowed JID: ${chatJid}`);\n continue;\n }\n\n const messageId = msg.key.id || \"\";\n const senderName = msg.pushName || chatJid.split(\"@\")[0];\n\n console.log(`[whatsapp] Incoming message from ${senderName} (${chatJid}): ${text.slice(0, 80)}`);\n messageCallback?.(chatJid, messageId, text, senderName);\n }\n });\n } catch (error) {\n console.error(\"[whatsapp] Failed to connect:\", error);\n setStatus(\"disconnected\");\n }\n}\n\nexport async function stopWhatsApp(): Promise<void> {\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n if (sock) {\n sock.end(undefined);\n sock = null;\n }\n currentQrCode = null;\n currentQrRaw = null;\n setStatus(\"disconnected\");\n}\n\nexport function getWhatsAppStatus(): {\n status: WhatsAppConnectionStatus;\n qrCode: string | null;\n qrRaw: string | null;\n} {\n return { status: connectionStatus, qrCode: currentQrCode, qrRaw: currentQrRaw };\n}\n\nexport async function sendWhatsAppMessage(\n jid: string,\n text: string\n): Promise<void> {\n if (!sock) {\n throw new Error(\"WhatsApp is not connected\");\n }\n await sock.sendMessage(jid, { text });\n}\n", "import {\n AuthStorage,\n createAgentSession,\n createCodingTools,\n DefaultResourceLoader,\n ModelRegistry,\n SessionManager,\n type AgentSession,\n} from \"@mariozechner/pi-coding-agent\";\nimport {\n insertWhatsAppMessage,\n getNextQueuedMessage,\n updateWhatsAppMessage,\n whatsAppMessageExists,\n} from \"./store.js\";\nimport {\n onWhatsAppMessage,\n sendWhatsAppMessage,\n} from \"./whatsapp.js\";\nimport { buildAppendSections } from \"../../system-prompt.js\";\n\nlet session: AgentSession | null = null;\nlet isProcessing = false;\n\nconst PI_PROJECT_PATH = process.env.PI_PROJECT_PATH || \"/tmp/maestro-whatsapp\";\nconst PI_TIMEOUT_MS = parseInt(process.env.PI_TIMEOUT_MS || \"300000\", 10);\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\n// \u2500\u2500 Pi SDK Session \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function ensureSession(): Promise<AgentSession> {\n if (session) return session;\n\n const authStorage = AuthStorage.create();\n const modelRegistry = new ModelRegistry(authStorage);\n\n const available = await modelRegistry.getAvailable();\n const model = available[0];\n if (!model) {\n throw new Error(\n \"No model available. Configure an Ollama model in Settings > Pi Agent.\"\n );\n }\n console.log(`[whatsapp-queue] Using model: ${model.id} (provider: ${model.provider})`);\n\n const resourceLoader = new DefaultResourceLoader({\n cwd: PI_PROJECT_PATH,\n appendSystemPromptOverride: (base) => buildAppendSections(base),\n });\n await resourceLoader.reload();\n\n const { session: s } = await createAgentSession({\n cwd: PI_PROJECT_PATH,\n tools: createCodingTools(PI_PROJECT_PATH),\n sessionManager: SessionManager.continueRecent(PI_PROJECT_PATH),\n resourceLoader,\n authStorage,\n modelRegistry,\n model,\n });\n\n session = s;\n console.log(\"[whatsapp-queue] Pi agent session created\");\n return s;\n}\n\nfunction sendPrompt(s: AgentSession, message: string): Promise<string> {\n return new Promise((resolve, reject) => {\n let responseText = \"\";\n let done = false;\n\n const timer = setTimeout(() => {\n if (!done) {\n done = true;\n unsubscribe();\n reject(new Error(\"Pi agent timed out\"));\n }\n }, PI_TIMEOUT_MS);\n\n const unsubscribe = s.subscribe((event: any) => {\n if (event.type === \"message_update\" && event.assistantMessageEvent?.type === \"text_delta\") {\n responseText += event.assistantMessageEvent.delta;\n }\n\n if (event.type === \"agent_end\") {\n done = true;\n clearTimeout(timer);\n unsubscribe();\n\n const messages = event.messages || [];\n const lastAssistant = messages.findLast((m: any) => m.role === \"assistant\");\n if (lastAssistant?.stopReason === \"error\" && lastAssistant?.errorMessage) {\n reject(new Error(lastAssistant.errorMessage));\n return;\n }\n\n resolve(responseText.trim() || \"Agent completed without text output.\");\n }\n });\n\n s.prompt(message).catch((err) => {\n if (!done) {\n done = true;\n clearTimeout(timer);\n unsubscribe();\n reject(err);\n }\n });\n });\n}\n\n// \u2500\u2500 Queue Processor \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function startWhatsAppQueue(): void {\n onWhatsAppMessage((chatJid, messageId, body, senderName) => {\n onMessage(chatJid, messageId, body, senderName);\n });\n\n console.log(\"[whatsapp-queue] Queue processor started\");\n}\n\nexport function stopWhatsAppQueue(): void {\n session = null;\n console.log(\"[whatsapp-queue] Queue processor stopped\");\n}\n\nfunction onMessage(\n chatJid: string,\n messageId: string,\n body: string,\n senderName: string\n): void {\n if (whatsAppMessageExists(messageId)) {\n console.log(`[whatsapp-queue] Duplicate message ${messageId}, skipping`);\n return;\n }\n\n insertWhatsAppMessage({\n chatJid,\n messageId,\n direction: \"incoming\",\n senderName,\n body,\n status: \"queued\",\n });\n\n console.log(`[whatsapp-queue] Queued message from ${senderName}`);\n processNext();\n}\n\nasync function processNext(): Promise<void> {\n if (isProcessing) return;\n\n const msg = getNextQueuedMessage();\n if (!msg) return;\n\n isProcessing = true;\n\n try {\n updateWhatsAppMessage(msg.id, { status: \"processing\" });\n\n const s = await ensureSession();\n\n if (msg.body.trim().toLowerCase() === \"reset\") {\n await s.newSession();\n await sendWhatsAppMessage(msg.chatJid, \"Session reset.\");\n updateWhatsAppMessage(msg.id, { status: \"completed\", responseText: \"Session reset.\", processedAt: nowIso() });\n console.log(\"[whatsapp-queue] Session reset by user\");\n return;\n }\n\n const responseText = await sendPrompt(s, msg.body);\n\n await sendWhatsAppMessage(msg.chatJid, responseText);\n\n insertWhatsAppMessage({\n chatJid: msg.chatJid,\n messageId: `out_${msg.id}`,\n direction: \"outgoing\",\n senderName: null,\n body: responseText,\n status: \"completed\",\n });\n\n updateWhatsAppMessage(msg.id, {\n status: \"completed\",\n responseText,\n processedAt: nowIso(),\n });\n\n console.log(`[whatsapp-queue] Completed message ${msg.id}`);\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error);\n console.error(`[whatsapp-queue] Failed to process message ${msg.id}:`, errMsg);\n\n updateWhatsAppMessage(msg.id, {\n status: \"failed\",\n error: errMsg,\n processedAt: nowIso(),\n });\n } finally {\n isProcessing = false;\n processNext();\n }\n}\n", "import * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport { randomUUID } from \"crypto\";\nimport { DatabaseSync } from \"node:sqlite\";\n\nconst DATA_DIR = path.join(os.homedir(), \".maestro\");\nfs.mkdirSync(DATA_DIR, { recursive: true });\n\nconst dbPath = path.join(DATA_DIR, \"pi.sqlite\");\nconst db = new DatabaseSync(dbPath);\n\ndb.exec(`\n CREATE TABLE IF NOT EXISTS whatsapp_messages (\n id TEXT PRIMARY KEY,\n chat_jid TEXT NOT NULL,\n message_id TEXT NOT NULL UNIQUE,\n direction TEXT NOT NULL,\n sender_name TEXT,\n body TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'queued',\n response_text TEXT,\n error TEXT,\n created_at TEXT NOT NULL,\n processed_at TEXT\n );\n CREATE INDEX IF NOT EXISTS idx_wa_status ON whatsapp_messages(status);\n CREATE INDEX IF NOT EXISTS idx_wa_chat ON whatsapp_messages(chat_jid, created_at);\n`);\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nexport interface WhatsAppMessageRow {\n id: string;\n chatJid: string;\n messageId: string;\n direction: \"incoming\" | \"outgoing\";\n senderName: string | null;\n body: string;\n status: \"queued\" | \"processing\" | \"completed\" | \"failed\";\n responseText: string | null;\n error: string | null;\n createdAt: string;\n processedAt: string | null;\n}\n\nfunction toWhatsAppMessage(row: Record<string, unknown>): WhatsAppMessageRow {\n return {\n id: String(row.id),\n chatJid: String(row.chat_jid),\n messageId: String(row.message_id),\n direction: String(row.direction) as \"incoming\" | \"outgoing\",\n senderName: row.sender_name ? String(row.sender_name) : null,\n body: String(row.body),\n status: String(row.status) as WhatsAppMessageRow[\"status\"],\n responseText: row.response_text ? String(row.response_text) : null,\n error: row.error ? String(row.error) : null,\n createdAt: String(row.created_at),\n processedAt: row.processed_at ? String(row.processed_at) : null,\n };\n}\n\nexport function insertWhatsAppMessage(input: {\n chatJid: string;\n messageId: string;\n direction: \"incoming\" | \"outgoing\";\n senderName: string | null;\n body: string;\n status?: string;\n}): WhatsAppMessageRow {\n const id = randomUUID();\n const now = nowIso();\n const status = input.status ?? \"queued\";\n\n db.prepare(`\n INSERT INTO whatsapp_messages (id, chat_jid, message_id, direction, sender_name, body, status, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `).run(id, input.chatJid, input.messageId, input.direction, input.senderName, input.body, status, now);\n\n return {\n id,\n chatJid: input.chatJid,\n messageId: input.messageId,\n direction: input.direction,\n senderName: input.senderName,\n body: input.body,\n status: status as WhatsAppMessageRow[\"status\"],\n responseText: null,\n error: null,\n createdAt: now,\n processedAt: null,\n };\n}\n\nexport function getNextQueuedMessage(): WhatsAppMessageRow | null {\n const row = db\n .prepare(\"SELECT * FROM whatsapp_messages WHERE status = 'queued' AND direction = 'incoming' ORDER BY created_at ASC LIMIT 1\")\n .get() as Record<string, unknown> | undefined;\n return row ? toWhatsAppMessage(row) : null;\n}\n\nexport function updateWhatsAppMessage(\n id: string,\n patch: Partial<Pick<WhatsAppMessageRow, \"status\" | \"responseText\" | \"error\" | \"processedAt\">>\n): void {\n const sets: string[] = [];\n const values: (string | null)[] = [];\n\n if (patch.status !== undefined) { sets.push(\"status = ?\"); values.push(patch.status ?? null); }\n if (patch.responseText !== undefined) { sets.push(\"response_text = ?\"); values.push(patch.responseText ?? null); }\n if (patch.error !== undefined) { sets.push(\"error = ?\"); values.push(patch.error ?? null); }\n if (patch.processedAt !== undefined) { sets.push(\"processed_at = ?\"); values.push(patch.processedAt ?? null); }\n\n if (sets.length === 0) return;\n values.push(id);\n db.prepare(`UPDATE whatsapp_messages SET ${sets.join(\", \")} WHERE id = ?`).run(...(values as string[]));\n}\n\nexport function getWhatsAppMessageHistory(chatJid: string, limit = 20): WhatsAppMessageRow[] {\n const rows = db\n .prepare(\"SELECT * FROM whatsapp_messages WHERE chat_jid = ? ORDER BY created_at DESC LIMIT ?\")\n .all(chatJid, limit) as Record<string, unknown>[];\n return rows.map(toWhatsAppMessage).reverse();\n}\n\nexport function listWhatsAppMessages(chatJid?: string, limit = 50): WhatsAppMessageRow[] {\n if (chatJid) {\n const rows = db\n .prepare(\"SELECT * FROM whatsapp_messages WHERE chat_jid = ? ORDER BY created_at DESC LIMIT ?\")\n .all(chatJid, limit) as Record<string, unknown>[];\n return rows.map(toWhatsAppMessage);\n }\n const rows = db\n .prepare(\"SELECT * FROM whatsapp_messages ORDER BY created_at DESC LIMIT ?\")\n .all(limit) as Record<string, unknown>[];\n return rows.map(toWhatsAppMessage);\n}\n\nexport function whatsAppMessageExists(messageId: string): boolean {\n const row = db\n .prepare(\"SELECT 1 FROM whatsapp_messages WHERE message_id = ?\")\n .get(messageId);\n return !!row;\n}\n", "import type { FastifyInstance } from \"fastify\";\nimport {\n startWhatsApp,\n stopWhatsApp,\n getWhatsAppStatus,\n sendWhatsAppMessage,\n} from \"./whatsapp.js\";\nimport { listWhatsAppMessages } from \"./store.js\";\nimport type { Server as SocketServer } from \"socket.io\";\n\nexport async function registerWhatsAppRoutes(\n app: FastifyInstance,\n io: SocketServer\n) {\n app.get(\"/api/integrations/whatsapp\", async () => {\n return getWhatsAppStatus();\n });\n\n app.post(\"/api/integrations/whatsapp/connect\", async (_req, reply) => {\n try {\n await startWhatsApp(io);\n return getWhatsAppStatus();\n } catch (error) {\n return reply.status(500).send({\n error:\n error instanceof Error\n ? error.message\n : \"Failed to start WhatsApp\",\n });\n }\n });\n\n app.delete(\"/api/integrations/whatsapp/connect\", async () => {\n await stopWhatsApp();\n return { ok: true };\n });\n\n app.get(\"/api/integrations/whatsapp/messages\", async (req) => {\n const query = req.query as { chatJid?: string; limit?: string };\n const chatJid = query.chatJid || undefined;\n const limit = query.limit ? parseInt(query.limit, 10) : 50;\n return listWhatsAppMessages(chatJid, limit);\n });\n\n app.post(\"/api/integrations/whatsapp/send\", async (req, reply) => {\n try {\n const body = req.body as { jid: string; text: string };\n if (!body.jid || !body.text) {\n return reply\n .status(400)\n .send({ error: \"jid and text are required\" });\n }\n await sendWhatsAppMessage(body.jid, body.text);\n return { ok: true };\n } catch (error) {\n return reply.status(500).send({\n error:\n error instanceof Error ? error.message : \"Failed to send message\",\n });\n }\n });\n}\n", "import type { Server as SocketServer } from \"socket.io\";\nimport type { TelegramConnectionStatus } from \"@maestro/wire\";\n\ninterface TelegramUpdate {\n update_id: number;\n message?: {\n message_id: number;\n from?: { id: number; first_name?: string; last_name?: string; username?: string };\n chat: { id: number; type: string };\n text?: string;\n };\n}\n\nlet io: SocketServer | null = null;\nlet connectionStatus: TelegramConnectionStatus = \"disconnected\";\nlet botToken: string | null = null;\nlet botUsername: string | null = null;\nlet pollTimer: ReturnType<typeof setTimeout> | null = null;\nlet lastUpdateId = 0;\nlet messageCallback: ((chatId: string, messageId: string, body: string, senderName: string) => void) | null = null;\n\nfunction getAllowedChatIds(): string[] {\n const raw = process.env.TELEGRAM_ALLOWED_CHAT_IDS || \"\";\n return raw.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n\nfunction isChatAllowed(chatId: string): boolean {\n const allowed = getAllowedChatIds();\n if (allowed.length === 0) return true;\n return allowed.includes(chatId);\n}\n\nfunction setStatus(status: TelegramConnectionStatus) {\n connectionStatus = status;\n io?.emit(\"telegram:status\", { status });\n}\n\nasync function telegramApi(method: string, body?: Record<string, unknown>): Promise<any> {\n const url = `https://api.telegram.org/bot${botToken}/${method}`;\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: body ? JSON.stringify(body) : undefined,\n });\n const json = await res.json() as { ok: boolean; description?: string; result?: any };\n if (!json.ok) {\n throw new Error(`Telegram API error: ${json.description || \"unknown error\"}`);\n }\n return json.result;\n}\n\nexport function onTelegramMessage(\n cb: (chatId: string, messageId: string, body: string, senderName: string) => void\n) {\n messageCallback = cb;\n}\n\nexport async function startTelegram(socketIo: SocketServer, token?: string): Promise<void> {\n io = socketIo;\n const resolvedToken = token || process.env.TELEGRAM_BOT_TOKEN;\n\n if (!resolvedToken) {\n console.error(\"[telegram] No bot token provided\");\n setStatus(\"error\");\n return;\n }\n\n botToken = resolvedToken;\n setStatus(\"connecting\");\n\n try {\n const me = await telegramApi(\"getMe\");\n botUsername = me.username || null;\n console.log(`[telegram] Connected as @${botUsername}`);\n setStatus(\"connected\");\n lastUpdateId = 0;\n pollUpdates();\n } catch (error) {\n console.error(\"[telegram] Failed to connect:\", error);\n setStatus(\"error\");\n }\n}\n\nasync function pollUpdates(): Promise<void> {\n if (connectionStatus !== \"connected\" || !botToken) return;\n\n try {\n const updates: TelegramUpdate[] = await telegramApi(\"getUpdates\", {\n offset: lastUpdateId + 1,\n timeout: 30,\n });\n\n for (const update of updates) {\n lastUpdateId = update.update_id;\n\n if (!update.message?.text) continue;\n\n const chatId = String(update.message.chat.id);\n if (!isChatAllowed(chatId)) {\n console.log(`[telegram] Ignoring message from non-allowed chat: ${chatId}`);\n continue;\n }\n\n const messageId = String(update.message.message_id);\n const from = update.message.from;\n const senderName = from\n ? [from.first_name, from.last_name].filter(Boolean).join(\" \") || from.username || chatId\n : chatId;\n\n console.log(`[telegram] Incoming message from ${senderName} (${chatId}): ${update.message.text.slice(0, 80)}`);\n messageCallback?.(chatId, messageId, update.message.text, senderName);\n }\n } catch (error) {\n console.error(\"[telegram] Polling error:\", error);\n }\n\n // Schedule next poll\n pollTimer = setTimeout(() => pollUpdates(), 500);\n}\n\nexport async function stopTelegram(): Promise<void> {\n if (pollTimer) {\n clearTimeout(pollTimer);\n pollTimer = null;\n }\n botToken = null;\n botUsername = null;\n lastUpdateId = 0;\n setStatus(\"disconnected\");\n}\n\nexport function getTelegramStatus(): {\n status: TelegramConnectionStatus;\n botUsername: string | null;\n} {\n return { status: connectionStatus, botUsername };\n}\n\nexport async function sendTelegramMessage(\n chatId: string,\n text: string\n): Promise<void> {\n if (!botToken) {\n throw new Error(\"Telegram bot is not connected\");\n }\n\n // Telegram messages have a 4096 character limit\n if (text.length <= 4096) {\n await telegramApi(\"sendMessage\", { chat_id: chatId, text });\n return;\n }\n\n // Split long messages\n const chunks: string[] = [];\n let remaining = text;\n while (remaining.length > 0) {\n chunks.push(remaining.slice(0, 4096));\n remaining = remaining.slice(4096);\n }\n for (const chunk of chunks) {\n await telegramApi(\"sendMessage\", { chat_id: chatId, text: chunk });\n }\n}\n", "import {\n AuthStorage,\n createAgentSession,\n createCodingTools,\n DefaultResourceLoader,\n ModelRegistry,\n SessionManager,\n type AgentSession,\n} from \"@mariozechner/pi-coding-agent\";\nimport {\n insertTelegramMessage,\n getNextQueuedTelegramMessage,\n updateTelegramMessage,\n telegramMessageExists,\n} from \"./store.js\";\nimport {\n onTelegramMessage,\n sendTelegramMessage,\n} from \"./telegram.js\";\nimport { buildAppendSections } from \"../../system-prompt.js\";\n\nlet session: AgentSession | null = null;\nlet isProcessing = false;\n\nconst PI_PROJECT_PATH = process.env.PI_PROJECT_PATH || \"/tmp/maestro-telegram\";\nconst PI_TIMEOUT_MS = parseInt(process.env.PI_TIMEOUT_MS || \"300000\", 10);\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\n// \u2500\u2500 Pi SDK Session \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function ensureSession(): Promise<AgentSession> {\n if (session) return session;\n\n const authStorage = AuthStorage.create();\n const modelRegistry = new ModelRegistry(authStorage);\n\n const available = await modelRegistry.getAvailable();\n const model = available[0];\n if (!model) {\n throw new Error(\n \"No model available. Configure an Ollama model in Settings > Pi Agent.\"\n );\n }\n console.log(`[telegram-queue] Using model: ${model.id} (provider: ${model.provider})`);\n\n const resourceLoader = new DefaultResourceLoader({\n cwd: PI_PROJECT_PATH,\n appendSystemPromptOverride: (base) => buildAppendSections(base),\n });\n await resourceLoader.reload();\n\n const { session: s } = await createAgentSession({\n cwd: PI_PROJECT_PATH,\n tools: createCodingTools(PI_PROJECT_PATH),\n sessionManager: SessionManager.continueRecent(PI_PROJECT_PATH),\n resourceLoader,\n authStorage,\n modelRegistry,\n model,\n });\n\n session = s;\n console.log(\"[telegram-queue] Pi agent session created\");\n return s;\n}\n\nfunction sendPrompt(s: AgentSession, message: string): Promise<string> {\n return new Promise((resolve, reject) => {\n let responseText = \"\";\n let done = false;\n\n const timer = setTimeout(() => {\n if (!done) {\n done = true;\n unsubscribe();\n reject(new Error(\"Pi agent timed out\"));\n }\n }, PI_TIMEOUT_MS);\n\n const unsubscribe = s.subscribe((event: any) => {\n if (event.type === \"message_update\" && event.assistantMessageEvent?.type === \"text_delta\") {\n responseText += event.assistantMessageEvent.delta;\n }\n\n if (event.type === \"agent_end\") {\n done = true;\n clearTimeout(timer);\n unsubscribe();\n\n const messages = event.messages || [];\n const lastAssistant = messages.findLast((m: any) => m.role === \"assistant\");\n if (lastAssistant?.stopReason === \"error\" && lastAssistant?.errorMessage) {\n reject(new Error(lastAssistant.errorMessage));\n return;\n }\n\n resolve(responseText.trim() || \"Agent completed without text output.\");\n }\n });\n\n s.prompt(message).catch((err) => {\n if (!done) {\n done = true;\n clearTimeout(timer);\n unsubscribe();\n reject(err);\n }\n });\n });\n}\n\n// \u2500\u2500 Queue Processor \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function startTelegramQueue(): void {\n onTelegramMessage((chatId, messageId, body, senderName) => {\n onMessage(chatId, messageId, body, senderName);\n });\n\n console.log(\"[telegram-queue] Queue processor started\");\n}\n\nexport function stopTelegramQueue(): void {\n session = null;\n console.log(\"[telegram-queue] Queue processor stopped\");\n}\n\nfunction onMessage(\n chatId: string,\n messageId: string,\n body: string,\n senderName: string\n): void {\n if (telegramMessageExists(messageId)) {\n console.log(`[telegram-queue] Duplicate message ${messageId}, skipping`);\n return;\n }\n\n insertTelegramMessage({\n chatId,\n messageId,\n direction: \"incoming\",\n senderName,\n body,\n status: \"queued\",\n });\n\n console.log(`[telegram-queue] Queued message from ${senderName}`);\n processNext();\n}\n\nasync function processNext(): Promise<void> {\n if (isProcessing) return;\n\n const msg = getNextQueuedTelegramMessage();\n if (!msg) return;\n\n isProcessing = true;\n\n try {\n updateTelegramMessage(msg.id, { status: \"processing\" });\n\n const s = await ensureSession();\n\n if (msg.body.trim().toLowerCase() === \"reset\") {\n await s.newSession();\n await sendTelegramMessage(msg.chatId, \"Session reset.\");\n updateTelegramMessage(msg.id, { status: \"completed\", responseText: \"Session reset.\", processedAt: nowIso() });\n console.log(\"[telegram-queue] Session reset by user\");\n return;\n }\n\n const responseText = await sendPrompt(s, msg.body);\n\n await sendTelegramMessage(msg.chatId, responseText);\n\n insertTelegramMessage({\n chatId: msg.chatId,\n messageId: `out_${msg.id}`,\n direction: \"outgoing\",\n senderName: null,\n body: responseText,\n status: \"completed\",\n });\n\n updateTelegramMessage(msg.id, {\n status: \"completed\",\n responseText,\n processedAt: nowIso(),\n });\n\n console.log(`[telegram-queue] Completed message ${msg.id}`);\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error);\n console.error(`[telegram-queue] Failed to process message ${msg.id}:`, errMsg);\n\n updateTelegramMessage(msg.id, {\n status: \"failed\",\n error: errMsg,\n processedAt: nowIso(),\n });\n } finally {\n isProcessing = false;\n processNext();\n }\n}\n", "import * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport { randomUUID } from \"crypto\";\nimport { DatabaseSync } from \"node:sqlite\";\n\nconst DATA_DIR = path.join(os.homedir(), \".maestro\");\nfs.mkdirSync(DATA_DIR, { recursive: true });\n\nconst dbPath = path.join(DATA_DIR, \"pi.sqlite\");\nconst db = new DatabaseSync(dbPath);\n\ndb.exec(`\n CREATE TABLE IF NOT EXISTS telegram_messages (\n id TEXT PRIMARY KEY,\n chat_id TEXT NOT NULL,\n message_id TEXT NOT NULL UNIQUE,\n direction TEXT NOT NULL,\n sender_name TEXT,\n body TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'queued',\n response_text TEXT,\n error TEXT,\n created_at TEXT NOT NULL,\n processed_at TEXT\n );\n CREATE INDEX IF NOT EXISTS idx_tg_status ON telegram_messages(status);\n CREATE INDEX IF NOT EXISTS idx_tg_chat ON telegram_messages(chat_id, created_at);\n`);\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nexport interface TelegramMessageRow {\n id: string;\n chatId: string;\n messageId: string;\n direction: \"incoming\" | \"outgoing\";\n senderName: string | null;\n body: string;\n status: \"queued\" | \"processing\" | \"completed\" | \"failed\";\n responseText: string | null;\n error: string | null;\n createdAt: string;\n processedAt: string | null;\n}\n\nfunction toTelegramMessage(row: Record<string, unknown>): TelegramMessageRow {\n return {\n id: String(row.id),\n chatId: String(row.chat_id),\n messageId: String(row.message_id),\n direction: String(row.direction) as \"incoming\" | \"outgoing\",\n senderName: row.sender_name ? String(row.sender_name) : null,\n body: String(row.body),\n status: String(row.status) as TelegramMessageRow[\"status\"],\n responseText: row.response_text ? String(row.response_text) : null,\n error: row.error ? String(row.error) : null,\n createdAt: String(row.created_at),\n processedAt: row.processed_at ? String(row.processed_at) : null,\n };\n}\n\nexport function insertTelegramMessage(input: {\n chatId: string;\n messageId: string;\n direction: \"incoming\" | \"outgoing\";\n senderName: string | null;\n body: string;\n status?: string;\n}): TelegramMessageRow {\n const id = randomUUID();\n const now = nowIso();\n const status = input.status ?? \"queued\";\n\n db.prepare(`\n INSERT INTO telegram_messages (id, chat_id, message_id, direction, sender_name, body, status, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `).run(id, input.chatId, input.messageId, input.direction, input.senderName, input.body, status, now);\n\n return {\n id,\n chatId: input.chatId,\n messageId: input.messageId,\n direction: input.direction,\n senderName: input.senderName,\n body: input.body,\n status: status as TelegramMessageRow[\"status\"],\n responseText: null,\n error: null,\n createdAt: now,\n processedAt: null,\n };\n}\n\nexport function getNextQueuedTelegramMessage(): TelegramMessageRow | null {\n const row = db\n .prepare(\"SELECT * FROM telegram_messages WHERE status = 'queued' AND direction = 'incoming' ORDER BY created_at ASC LIMIT 1\")\n .get() as Record<string, unknown> | undefined;\n return row ? toTelegramMessage(row) : null;\n}\n\nexport function updateTelegramMessage(\n id: string,\n patch: Partial<Pick<TelegramMessageRow, \"status\" | \"responseText\" | \"error\" | \"processedAt\">>\n): void {\n const sets: string[] = [];\n const values: (string | null)[] = [];\n\n if (patch.status !== undefined) { sets.push(\"status = ?\"); values.push(patch.status ?? null); }\n if (patch.responseText !== undefined) { sets.push(\"response_text = ?\"); values.push(patch.responseText ?? null); }\n if (patch.error !== undefined) { sets.push(\"error = ?\"); values.push(patch.error ?? null); }\n if (patch.processedAt !== undefined) { sets.push(\"processed_at = ?\"); values.push(patch.processedAt ?? null); }\n\n if (sets.length === 0) return;\n values.push(id);\n db.prepare(`UPDATE telegram_messages SET ${sets.join(\", \")} WHERE id = ?`).run(...(values as string[]));\n}\n\nexport function listTelegramMessages(chatId?: string, limit = 50): TelegramMessageRow[] {\n if (chatId) {\n const rows = db\n .prepare(\"SELECT * FROM telegram_messages WHERE chat_id = ? ORDER BY created_at DESC LIMIT ?\")\n .all(chatId, limit) as Record<string, unknown>[];\n return rows.map(toTelegramMessage);\n }\n const rows = db\n .prepare(\"SELECT * FROM telegram_messages ORDER BY created_at DESC LIMIT ?\")\n .all(limit) as Record<string, unknown>[];\n return rows.map(toTelegramMessage);\n}\n\nexport function telegramMessageExists(messageId: string): boolean {\n const row = db\n .prepare(\"SELECT 1 FROM telegram_messages WHERE message_id = ?\")\n .get(messageId);\n return !!row;\n}\n", "import type { FastifyInstance } from \"fastify\";\nimport {\n startTelegram,\n stopTelegram,\n getTelegramStatus,\n sendTelegramMessage,\n} from \"./telegram.js\";\nimport { startTelegramQueue } from \"./queue.js\";\nimport { listTelegramMessages } from \"./store.js\";\nimport type { Server as SocketServer } from \"socket.io\";\n\nexport async function registerTelegramRoutes(\n app: FastifyInstance,\n io: SocketServer,\n getToken?: () => string\n) {\n app.get(\"/api/integrations/telegram\", async () => {\n return getTelegramStatus();\n });\n\n app.post(\"/api/integrations/telegram/connect\", async (_req, reply) => {\n try {\n const token = getToken?.() || undefined;\n await startTelegram(io, token);\n startTelegramQueue();\n return getTelegramStatus();\n } catch (error) {\n return reply.status(500).send({\n error:\n error instanceof Error\n ? error.message\n : \"Failed to start Telegram bot\",\n });\n }\n });\n\n app.delete(\"/api/integrations/telegram/connect\", async () => {\n await stopTelegram();\n return { ok: true };\n });\n\n app.get(\"/api/integrations/telegram/messages\", async (req) => {\n const query = req.query as { chatId?: string; limit?: string };\n const chatId = query.chatId || undefined;\n const limit = query.limit ? parseInt(query.limit, 10) : 50;\n return listTelegramMessages(chatId, limit);\n });\n\n app.post(\"/api/integrations/telegram/send\", async (req, reply) => {\n try {\n const body = req.body as { chatId: string; text: string };\n if (!body.chatId || !body.text) {\n return reply\n .status(400)\n .send({ error: \"chatId and text are required\" });\n }\n await sendTelegramMessage(body.chatId, body.text);\n return { ok: true };\n } catch (error) {\n return reply.status(500).send({\n error:\n error instanceof Error ? error.message : \"Failed to send message\",\n });\n }\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["os", "fs", "path", "require", "os", "path", "fs", "outputBuffer", "resolve", "fs", "os", "path", "fs", "path", "execSync", "fs", "path", "os", "execFileSync", "lastError", "running", "fs", "os", "path", "execFileSync", "pty", "resolve", "fs", "path", "execFileSync", "path", "run", "fs", "path", "randomUUID", "path", "randomUUID", "randomUUID", "execFileSync", "path", "execFileSync", "runGit", "path", "fetch", "fs", "resolve", "agent", "fs", "z", "z", "z", "z", "z", "z", "z", "z", "z", "fs", "os", "path", "execFileSync", "execFileSync", "task", "io", "fs", "path", "os", "pty", "ANSI_RE", "resetOutputBuffer", "io", "ANSI_RE", "io", "timer", "io", "createTerminal", "createAutoSpawnTerminal", "startTerminal", "withProject", "timer", "tick", "run", "crypto", "fs", "path", "github", "crypto", "io", "execSync", "lastCheckAt", "tick", "mkdirSync", "writeFileSync", "readFileSync", "existsSync", "join", "homedir", "providers", "path", "os", "path", "fs", "os", "path", "randomUUID", "DatabaseSync", "DATA_DIR", "dbPath", "db", "nowIso", "rows", "db", "nowIso", "resolve", "timer", "io", "io", "connectionStatus", "messageCallback", "setStatus", "AuthStorage", "createAgentSession", "createCodingTools", "DefaultResourceLoader", "ModelRegistry", "SessionManager", "fs", "os", "path", "randomUUID", "DatabaseSync", "DATA_DIR", "dbPath", "db", "nowIso", "rows", "session", "isProcessing", "PI_PROJECT_PATH", "PI_TIMEOUT_MS", "nowIso", "ensureSession", "AuthStorage", "ModelRegistry", "DefaultResourceLoader", "createAgentSession", "createCodingTools", "SessionManager", "sendPrompt", "resolve", "timer", "onMessage", "processNext", "io", "io"]
|
|
7
7
|
}
|